@productbrain/mcp 0.0.1-beta.47 → 0.0.1-beta.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-FYFF4QKF.js → chunk-4ZJEIAA6.js} +69 -10
- package/dist/chunk-4ZJEIAA6.js.map +1 -0
- package/dist/{chunk-FMEZXUP5.js → chunk-RPESSNTC.js} +4 -4
- package/dist/http.js +2 -2
- package/dist/index.js +2 -2
- package/dist/{smart-capture-XLBFE252.js → smart-capture-YIBXUP2H.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-FYFF4QKF.js.map +0 -1
- /package/dist/{chunk-FMEZXUP5.js.map → chunk-RPESSNTC.js.map} +0 -0
- /package/dist/{smart-capture-XLBFE252.js.map → smart-capture-YIBXUP2H.js.map} +0 -0
|
@@ -1497,6 +1497,7 @@ var batchCaptureSchema = z2.object({
|
|
|
1497
1497
|
var captureClassifierSchema = z2.object({
|
|
1498
1498
|
enabled: z2.boolean(),
|
|
1499
1499
|
autoRouted: z2.boolean(),
|
|
1500
|
+
agrees: z2.boolean(),
|
|
1500
1501
|
topConfidence: z2.number(),
|
|
1501
1502
|
// Backward-compatible alias for topConfidence.
|
|
1502
1503
|
confidence: z2.number(),
|
|
@@ -1508,7 +1509,9 @@ var captureClassifierSchema = z2.object({
|
|
|
1508
1509
|
// Backward-compatible alias for signalScore.
|
|
1509
1510
|
confidence: z2.number()
|
|
1510
1511
|
})
|
|
1511
|
-
)
|
|
1512
|
+
),
|
|
1513
|
+
agentProvidedCollection: z2.string().optional(),
|
|
1514
|
+
overrideCommand: z2.string().optional()
|
|
1512
1515
|
});
|
|
1513
1516
|
function trackClassifierTelemetry(params) {
|
|
1514
1517
|
const telemetry = {
|
|
@@ -1550,7 +1553,7 @@ function buildClassifierUnknownResult() {
|
|
|
1550
1553
|
"Could not infer collection from input.",
|
|
1551
1554
|
"Provide collection explicitly, or rewrite with clearer intent.",
|
|
1552
1555
|
[{ tool: "collections", description: "List available collections", parameters: { action: "list" } }],
|
|
1553
|
-
{ classifier: { enabled: true, autoRouted: false, topConfidence: 0, confidence: 0, candidates: [] } }
|
|
1556
|
+
{ classifier: { enabled: true, autoRouted: false, agrees: true, topConfidence: 0, confidence: 0, reasons: [], candidates: [] } }
|
|
1554
1557
|
)
|
|
1555
1558
|
};
|
|
1556
1559
|
}
|
|
@@ -1579,6 +1582,7 @@ Correction path: rerun with explicit \`collection\`.`;
|
|
|
1579
1582
|
classifier: {
|
|
1580
1583
|
enabled: true,
|
|
1581
1584
|
autoRouted: false,
|
|
1585
|
+
agrees: false,
|
|
1582
1586
|
topConfidence: classified.topConfidence,
|
|
1583
1587
|
confidence: classified.confidence,
|
|
1584
1588
|
reasons: classified.reasons,
|
|
@@ -1635,7 +1639,48 @@ async function resolveCaptureCollection(params) {
|
|
|
1635
1639
|
explicitCollectionProvided
|
|
1636
1640
|
} = params;
|
|
1637
1641
|
if (collection) {
|
|
1638
|
-
|
|
1642
|
+
const classified2 = classifyStarterCollection(name, description);
|
|
1643
|
+
if (classified2) {
|
|
1644
|
+
const agrees = classified2.collection === collection;
|
|
1645
|
+
const classifierMeta2 = {
|
|
1646
|
+
enabled: true,
|
|
1647
|
+
autoRouted: false,
|
|
1648
|
+
agrees,
|
|
1649
|
+
topConfidence: classified2.topConfidence,
|
|
1650
|
+
confidence: classified2.confidence,
|
|
1651
|
+
reasons: classified2.reasons,
|
|
1652
|
+
candidates: classified2.candidates.slice(0, 3),
|
|
1653
|
+
agentProvidedCollection: collection,
|
|
1654
|
+
...!agrees && {
|
|
1655
|
+
overrideCommand: `capture collection="${classified2.collection}"`
|
|
1656
|
+
}
|
|
1657
|
+
};
|
|
1658
|
+
if (!agrees) {
|
|
1659
|
+
trackClassifierTelemetry({
|
|
1660
|
+
workspaceId,
|
|
1661
|
+
predictedCollection: classified2.collection,
|
|
1662
|
+
confidence: classified2.confidence,
|
|
1663
|
+
autoRouted: false,
|
|
1664
|
+
reasonCategory: "low-confidence",
|
|
1665
|
+
explicitCollectionProvided: true,
|
|
1666
|
+
outcome: "fallback"
|
|
1667
|
+
});
|
|
1668
|
+
}
|
|
1669
|
+
return { resolvedCollection: collection, classifierMeta: classifierMeta2 };
|
|
1670
|
+
}
|
|
1671
|
+
return {
|
|
1672
|
+
resolvedCollection: collection,
|
|
1673
|
+
classifierMeta: {
|
|
1674
|
+
enabled: true,
|
|
1675
|
+
autoRouted: false,
|
|
1676
|
+
agrees: true,
|
|
1677
|
+
topConfidence: 0,
|
|
1678
|
+
confidence: 0,
|
|
1679
|
+
reasons: [],
|
|
1680
|
+
candidates: [],
|
|
1681
|
+
agentProvidedCollection: collection
|
|
1682
|
+
}
|
|
1683
|
+
};
|
|
1639
1684
|
}
|
|
1640
1685
|
if (!classifierFlagOn) {
|
|
1641
1686
|
return { earlyResult: buildCollectionRequiredResult() };
|
|
@@ -1673,6 +1718,7 @@ async function resolveCaptureCollection(params) {
|
|
|
1673
1718
|
const classifierMeta = {
|
|
1674
1719
|
enabled: true,
|
|
1675
1720
|
autoRouted: autoRoute,
|
|
1721
|
+
agrees: true,
|
|
1676
1722
|
topConfidence: classified.topConfidence,
|
|
1677
1723
|
confidence: classified.confidence,
|
|
1678
1724
|
reasons: classified.reasons,
|
|
@@ -2048,14 +2094,27 @@ Use \`entries action=get\` to inspect the existing entry, or \`update-entry\` to
|
|
|
2048
2094
|
`**${name}** added to \`${resolvedCollection}\` as \`${finalStatus}\``,
|
|
2049
2095
|
`**Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})`
|
|
2050
2096
|
];
|
|
2051
|
-
if (classifierMeta
|
|
2097
|
+
if (classifierMeta && classifierMeta.topConfidence > 0) {
|
|
2052
2098
|
lines.push("");
|
|
2053
|
-
lines.push("##
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2099
|
+
lines.push("## Classification");
|
|
2100
|
+
if (classifierMeta.autoRouted) {
|
|
2101
|
+
lines.push(`Auto-routed to \`${resolvedCollection}\` (${classifierMeta.topConfidence}% confidence).`);
|
|
2102
|
+
if (classifierMeta.reasons.length > 0) {
|
|
2103
|
+
lines.push(`Reason: ${classifierMeta.reasons.join("; ")}.`);
|
|
2104
|
+
}
|
|
2105
|
+
lines.push(`Override: rerun with explicit \`collection\` if wrong.`);
|
|
2106
|
+
} else if (classifierMeta.agrees) {
|
|
2107
|
+
lines.push(`Classifier confirms \`${resolvedCollection}\` (${classifierMeta.topConfidence}% confidence).`);
|
|
2108
|
+
} else {
|
|
2109
|
+
const suggested = classifierMeta.candidates[0]?.collection ?? "unknown";
|
|
2110
|
+
lines.push(`Agent chose \`${resolvedCollection}\`, classifier suggests \`${suggested}\` (${classifierMeta.topConfidence}% confidence).`);
|
|
2111
|
+
if (classifierMeta.reasons.length > 0) {
|
|
2112
|
+
lines.push(`Reason: ${classifierMeta.reasons.join("; ")}.`);
|
|
2113
|
+
}
|
|
2114
|
+
if (classifierMeta.overrideCommand) {
|
|
2115
|
+
lines.push(`Override: \`${classifierMeta.overrideCommand}\``);
|
|
2116
|
+
}
|
|
2057
2117
|
}
|
|
2058
|
-
lines.push("Correction path: rerun capture with explicit `collection` if this routing is wrong.");
|
|
2059
2118
|
}
|
|
2060
2119
|
const appUrl = process.env.PRODUCTBRAIN_APP_URL ?? "https://productbrain.io";
|
|
2061
2120
|
const studioUrl = resolvedCollection === "bets" ? `${appUrl.replace(/\/$/, "")}/w/${wsCtx.workspaceSlug}/studio/${internalId}` : void 0;
|
|
@@ -2643,4 +2702,4 @@ export {
|
|
|
2643
2702
|
formatRubricCoaching,
|
|
2644
2703
|
formatRubricVerdictSection
|
|
2645
2704
|
};
|
|
2646
|
-
//# sourceMappingURL=chunk-
|
|
2705
|
+
//# sourceMappingURL=chunk-4ZJEIAA6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/smart-capture.ts","../src/client.ts","../src/auth.ts","../src/tools/knowledge-helpers.ts","../src/tool-surface.ts","../src/featureFlags.ts","../src/tools/smart-capture-routing.ts","../src/envelope.ts","../src/errors.ts"],"sourcesContent":["/**\n * Smart capture — ARCH-node-mcp (Core layer)\n * Chain: FEAT-MCP-001 (MCP Server), ARCH-flow-smart-capture\n * Rules: SOS-016 (governed draft-first), SOS-015 (unique IDs within scope)\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation, getWorkspaceContext, requireWriteAccess, recordSessionActivity, getAgentSessionId } from \"../client.js\";\nimport {\n trackCaptureClassifierAutoRouted,\n trackCaptureClassifierEvaluated,\n trackCaptureClassifierFallback,\n trackQualityVerdict,\n trackQualityCheck,\n type ClassifierReasonCategory,\n} from \"../analytics.js\";\nimport { extractPreview } from \"./knowledge-helpers.js\";\nimport { trackWriteTool } from \"../tool-surface.js\";\nimport { isFeatureEnabled } from \"../featureFlags.js\";\nimport {\n STARTER_COLLECTIONS,\n classifyStarterCollection,\n isClassificationAmbiguous,\n shouldAutoRouteClassification,\n type StarterCollectionSlug,\n type ClassificationResult,\n} from \"./smart-capture-routing.js\";\nimport { withEnvelope, success, failure, type NextAction } from \"../envelope.js\";\n\nexport {\n CLASSIFIER_AUTO_ROUTE_THRESHOLD,\n STARTER_COLLECTIONS,\n classifyStarterCollection,\n isClassificationAmbiguous,\n type StarterCollectionSlug,\n type ClassificationResult,\n} from \"./smart-capture-routing.js\";\n\n// ── Collection Workflow Profiles ────────────────────────────────────────────\n\ninterface FieldDefault {\n key: string;\n value: unknown | \"today\" | \"infer\";\n}\n\ninterface QualityCheck {\n id: string;\n label: string;\n check: (ctx: CaptureContext) => boolean;\n suggestion?: (ctx: CaptureContext) => string;\n}\n\ninterface CollectionProfile {\n governedDraft: boolean;\n defaults: FieldDefault[];\n descriptionField: string;\n recommendedRelationTypes: string[];\n qualityChecks: QualityCheck[];\n inferField?: (ctx: CaptureContext) => Record<string, unknown>;\n}\n\ninterface CaptureContext {\n collection: string;\n name: string;\n description: string;\n context?: string;\n data: Record<string, unknown>;\n entryId: string;\n canonicalKey?: string;\n linksCreated: LinkResult[];\n linksSuggested: LinkSuggestion[];\n collectionFields: Array<{ key: string; type: string; required?: boolean }>;\n}\n\ninterface LinkResult {\n targetEntryId: string;\n targetName: string;\n targetCollection: string;\n relationType: string;\n linkReason?: string;\n}\n\ninterface LinkSuggestion {\n entryId?: string;\n name: string;\n collection: string;\n reason: string;\n preview: string;\n}\n\nconst AREA_KEYWORDS: Record<string, string[]> = {\n \"Architecture\": [\"convex\", \"schema\", \"database\", \"migration\", \"api\", \"backend\", \"infrastructure\", \"scaling\", \"performance\"],\n \"Chain\": [\"knowledge\", \"glossary\", \"entry\", \"collection\", \"terminology\", \"drift\", \"graph\", \"chain\", \"commit\"],\n \"AI & MCP Integration\": [\"mcp\", \"ai\", \"cursor\", \"agent\", \"tool\", \"llm\", \"prompt\", \"context\"],\n \"Developer Experience\": [\"dx\", \"developer\", \"ide\", \"workflow\", \"friction\", \"ceremony\"],\n \"Governance & Decision-Making\": [\"governance\", \"decision\", \"rule\", \"policy\", \"compliance\", \"approval\"],\n \"Analytics & Tracking\": [\"analytics\", \"posthog\", \"tracking\", \"event\", \"metric\", \"funnel\"],\n \"Security\": [\"security\", \"auth\", \"api key\", \"permission\", \"access\", \"token\"],\n};\n\nfunction inferArea(text: string): string {\n const lower = text.toLowerCase();\n let bestArea = \"\";\n let bestScore = 0;\n for (const [area, keywords] of Object.entries(AREA_KEYWORDS)) {\n const score = keywords.filter((kw) => lower.includes(kw)).length;\n if (score > bestScore) {\n bestScore = score;\n bestArea = area;\n }\n }\n return bestArea;\n}\n\nfunction inferDomain(text: string): string {\n return inferArea(text) || \"\";\n}\n\nconst COMMON_CHECKS: Record<string, QualityCheck> = {\n clearName: {\n id: \"clear-name\",\n label: \"Clear, specific name (not vague)\",\n check: (ctx) => ctx.name.length > 10 && ![\"new tension\", \"new entry\", \"untitled\", \"test\"].includes(ctx.name.toLowerCase()),\n suggestion: () => \"Rename to something specific — describe the actual problem or concept.\",\n },\n hasDescription: {\n id: \"has-description\",\n label: \"Description provided (>50 chars)\",\n check: (ctx) => ctx.description.length > 50,\n suggestion: () => \"Add a fuller description explaining context and impact.\",\n },\n hasRelations: {\n id: \"has-relations\",\n label: \"At least 1 relation created\",\n check: (ctx) => ctx.linksCreated.length >= 1,\n suggestion: () => \"Use `graph action=suggest` and `relations action=create` to add more connections.\",\n },\n diverseRelations: {\n id: \"diverse-relations\",\n label: \"Relations span multiple collections\",\n check: (ctx) => {\n const colls = new Set(ctx.linksCreated.map((l) => l.targetCollection));\n return colls.size >= 2;\n },\n suggestion: () => \"Try linking to entries in different collections (glossary, business-rules, strategy).\",\n },\n hasType: {\n id: \"has-type\",\n label: \"Has canonical type\",\n check: (ctx) => !!ctx.data?.canonicalKey || !!ctx.canonicalKey,\n suggestion: () => \"Classify this entry with a canonical type for better context assembly. Use update-entry to set canonicalKey.\",\n },\n};\n\nconst PROFILES: Map<string, CollectionProfile> = new Map([\n [\"tensions\", {\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [\n { key: \"priority\", value: \"medium\" },\n { key: \"date\", value: \"today\" },\n { key: \"raised\", value: \"infer\" },\n { key: \"severity\", value: \"infer\" },\n ],\n recommendedRelationTypes: [\"surfaces_tension_in\", \"references\", \"belongs_to\", \"related_to\"],\n inferField: (ctx: CaptureContext) => {\n const fields: Record<string, unknown> = {};\n const text = `${ctx.name} ${ctx.description}`;\n const area = inferArea(text);\n if (area) fields.raised = area;\n if (text.toLowerCase().includes(\"critical\") || text.toLowerCase().includes(\"blocker\")) {\n fields.severity = \"critical\";\n } else if (text.toLowerCase().includes(\"bottleneck\") || text.toLowerCase().includes(\"scaling\") || text.toLowerCase().includes(\"breaking\")) {\n fields.severity = \"high\";\n } else {\n fields.severity = \"medium\";\n }\n if (area) fields.affectedArea = area;\n return fields;\n },\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n {\n id: \"has-severity\",\n label: \"Severity specified\",\n check: (ctx) => !!ctx.data.severity && ctx.data.severity !== \"\",\n suggestion: (ctx) => {\n const text = `${ctx.name} ${ctx.description}`.toLowerCase();\n const inferred = text.includes(\"critical\") ? \"critical\" : text.includes(\"bottleneck\") ? \"high\" : \"medium\";\n return `Set severity — suggest: ${inferred} (based on description keywords).`;\n },\n },\n {\n id: \"has-affected-area\",\n label: \"Affected area identified\",\n check: (ctx) => !!ctx.data.affectedArea && ctx.data.affectedArea !== \"\",\n suggestion: (ctx) => {\n const area = inferArea(`${ctx.name} ${ctx.description}`);\n return area\n ? `Set affectedArea — suggest: \"${area}\" (inferred from content).`\n : \"Specify which product area or domain this tension impacts.\";\n },\n },\n ],\n }],\n\n [\"business-rules\", {\n governedDraft: true,\n descriptionField: \"description\",\n defaults: [\n { key: \"severity\", value: \"medium\" },\n { key: \"domain\", value: \"infer\" },\n ],\n recommendedRelationTypes: [\"governs\", \"references\", \"conflicts_with\", \"related_to\"],\n inferField: (ctx: CaptureContext) => {\n const fields: Record<string, unknown> = {};\n const domain = inferDomain(`${ctx.name} ${ctx.description}`);\n if (domain) fields.domain = domain;\n return fields;\n },\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n {\n id: \"has-rationale\",\n label: \"Rationale provided\",\n check: (ctx) => typeof ctx.data.rationale === \"string\" && ctx.data.rationale.length > 10,\n suggestion: () => \"Add a rationale explaining why this rule exists via `update-entry`.\",\n },\n {\n id: \"has-domain\",\n label: \"Domain specified\",\n check: (ctx) => !!ctx.data.domain && ctx.data.domain !== \"\",\n suggestion: (ctx) => {\n const domain = inferDomain(`${ctx.name} ${ctx.description}`);\n return domain\n ? `Set domain — suggest: \"${domain}\" (inferred from content).`\n : \"Specify the business domain this rule belongs to.\";\n },\n },\n ],\n }],\n\n [\"glossary\", {\n governedDraft: true,\n descriptionField: \"canonical\",\n defaults: [\n { key: \"category\", value: \"infer\" },\n ],\n recommendedRelationTypes: [\"defines_term_for\", \"confused_with\", \"related_to\", \"references\"],\n inferField: (ctx: CaptureContext) => {\n const fields: Record<string, unknown> = {};\n const area = inferArea(`${ctx.name} ${ctx.description}`);\n if (area) {\n const categoryMap: Record<string, string> = {\n \"Architecture\": \"Platform & Architecture\",\n \"Chain\": \"Knowledge Management\",\n \"AI & MCP Integration\": \"AI & Developer Tools\",\n \"Developer Experience\": \"AI & Developer Tools\",\n \"Governance & Decision-Making\": \"Governance & Process\",\n \"Analytics & Tracking\": \"Platform & Architecture\",\n \"Security\": \"Platform & Architecture\",\n };\n fields.category = categoryMap[area] ?? \"\";\n }\n return fields;\n },\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasType,\n {\n id: \"has-canonical\",\n label: \"Canonical definition provided (>20 chars)\",\n check: (ctx) => {\n const canonical = ctx.data.canonical;\n return typeof canonical === \"string\" && canonical.length > 20;\n },\n suggestion: () => \"Add a clear canonical definition — this is the single source of truth for this term.\",\n },\n COMMON_CHECKS.hasRelations,\n {\n id: \"has-category\",\n label: \"Category assigned\",\n check: (ctx) => !!ctx.data.category && ctx.data.category !== \"\",\n suggestion: () => \"Assign a category (e.g., 'Platform & Architecture', 'Governance & Process').\",\n },\n ],\n }],\n\n [\"decisions\", {\n governedDraft: false,\n descriptionField: \"rationale\",\n defaults: [\n { key: \"date\", value: \"today\" },\n { key: \"decidedBy\", value: \"infer\" },\n ],\n recommendedRelationTypes: [\"informs\", \"references\", \"replaces\", \"related_to\"],\n inferField: (ctx: CaptureContext) => {\n const fields: Record<string, unknown> = {};\n const area = inferArea(`${ctx.name} ${ctx.description}`);\n if (area) fields.decidedBy = area;\n return fields;\n },\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasType,\n {\n id: \"has-rationale\",\n label: \"Rationale provided (>30 chars)\",\n check: (ctx) => {\n const rationale = ctx.data.rationale;\n return typeof rationale === \"string\" && rationale.length > 30;\n },\n suggestion: () => \"Explain why this decision was made — what was considered and rejected?\",\n },\n COMMON_CHECKS.hasRelations,\n {\n id: \"has-date\",\n label: \"Decision date recorded\",\n check: (ctx) => !!ctx.data.date && ctx.data.date !== \"\",\n suggestion: () => \"Record when this decision was made.\",\n },\n ],\n }],\n\n [\"features\", {\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [] as FieldDefault[],\n recommendedRelationTypes: [\"belongs_to\", \"depends_on\", \"surfaces_tension_in\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n {\n id: \"has-owner\",\n label: \"Owner assigned\",\n check: (ctx: CaptureContext) => !!ctx.data.owner && ctx.data.owner !== \"\",\n suggestion: () => \"Assign an owner team or product area.\",\n },\n {\n id: \"has-rationale\",\n label: \"Rationale documented\",\n check: (ctx: CaptureContext) => !!ctx.data.rationale && String(ctx.data.rationale).length > 20,\n suggestion: () => \"Explain why this feature matters — what problem does it solve?\",\n },\n ],\n } satisfies CollectionProfile],\n\n [\"audiences\", {\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [],\n recommendedRelationTypes: [\"fills_slot\", \"informs\", \"related_to\", \"references\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n {\n id: \"has-behaviors\",\n label: \"Behaviors described\",\n check: (ctx) => typeof ctx.data.behaviors === \"string\" && ctx.data.behaviors.length > 20,\n suggestion: () => \"Describe how this audience segment behaves — what do they do, what tools do they use?\",\n },\n ],\n }],\n\n [\"strategy\", {\n governedDraft: true,\n descriptionField: \"description\",\n defaults: [],\n recommendedRelationTypes: [\"informs\", \"governs\", \"belongs_to\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n COMMON_CHECKS.diverseRelations,\n ],\n }],\n\n [\"bets\", { // BET-chain-native-constellation, DEC-70 (structuredContent), STA-1 (constellation pattern)\n governedDraft: false,\n descriptionField: \"problem\",\n defaults: [],\n recommendedRelationTypes: [\"part_of\", \"constrains\", \"informs\", \"depends_on\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n ],\n }],\n\n [\"maps\", {\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [],\n recommendedRelationTypes: [\"fills_slot\", \"references\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n ],\n }],\n\n [\"chains\", {\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [],\n recommendedRelationTypes: [\"informs\", \"references\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n ],\n }],\n\n [\"principles\", {\n governedDraft: true,\n descriptionField: \"description\",\n defaults: [\n { key: \"severity\", value: \"high\" },\n { key: \"category\", value: \"infer\" },\n ],\n recommendedRelationTypes: [\"governs\", \"informs\", \"references\", \"related_to\"],\n inferField: (ctx: CaptureContext) => {\n const fields: Record<string, unknown> = {};\n const area = inferArea(`${ctx.name} ${ctx.description}`);\n if (area) {\n const categoryMap: Record<string, string> = {\n \"Architecture\": \"Engineering\",\n \"Chain\": \"Product\",\n \"AI & MCP Integration\": \"Engineering\",\n \"Developer Experience\": \"Engineering\",\n \"Governance & Decision-Making\": \"Business\",\n \"Analytics & Tracking\": \"Product\",\n \"Security\": \"Engineering\",\n };\n fields.category = categoryMap[area] ?? \"Product\";\n }\n return fields;\n },\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n {\n id: \"has-rationale\",\n label: \"Rationale provided — why this principle matters\",\n check: (ctx) => typeof ctx.data.rationale === \"string\" && ctx.data.rationale.length > 20,\n suggestion: () => \"Explain why this principle exists and what goes wrong without it.\",\n },\n ],\n }],\n\n [\"standards\", {\n governedDraft: true,\n descriptionField: \"description\",\n defaults: [],\n recommendedRelationTypes: [\"governs\", \"defines_term_for\", \"references\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n ],\n }],\n\n [\"tracking-events\", {\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [],\n recommendedRelationTypes: [\"references\", \"belongs_to\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n ],\n }],\n\n [\"insights\", {\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [\n { key: \"evidenceStrength\", value: \"anecdotal\" },\n ],\n recommendedRelationTypes: [\"validates\", \"invalidates\", \"informs\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n {\n id: \"has-evidence-link\",\n label: \"Evidence link exists (validates or invalidates)\",\n check: (ctx) => ctx.linksCreated.some((l) => l.relationType === \"validates\" || l.relationType === \"invalidates\"),\n suggestion: () => \"Link this insight to the assumption or claim it validates/invalidates using `relations action=create type=validates`.\",\n },\n {\n id: \"has-source\",\n label: \"Source documented\",\n check: (ctx) => !!ctx.data?.source && String(ctx.data.source).length > 0,\n suggestion: () => \"Document where this insight came from (research, data, user interview, etc.).\",\n },\n ],\n }],\n\n [\"assumptions\", {\n governedDraft: false,\n descriptionField: \"belief\",\n defaults: [\n { key: \"risk\", value: \"medium\" },\n { key: \"evidenceStrength\", value: \"unvalidated\" },\n ],\n recommendedRelationTypes: [\"depends_on\", \"informs\", \"related_to\", \"validates\", \"invalidates\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n {\n id: \"has-belief\",\n label: \"Belief statement provided (>30 chars)\",\n check: (ctx) => !!ctx.data?.belief && String(ctx.data.belief).length > 30,\n suggestion: () => \"Write the assumption as a clear, testable belief statement.\",\n },\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n {\n id: \"has-test-method\",\n label: \"Test method described\",\n check: (ctx) => !!ctx.data?.testMethod && String(ctx.data.testMethod).length > 0,\n suggestion: () => \"Describe how this assumption could be tested or validated.\",\n },\n ],\n }],\n]);\n\nconst FALLBACK_PROFILE: CollectionProfile = {\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [],\n recommendedRelationTypes: [\"related_to\", \"references\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n ],\n};\n\n// ── Auto-Linking Logic ──────────────────────────────────────────────────────\n\nfunction extractSearchTerms(name: string, description: string): string {\n const text = `${name} ${description}`;\n return text\n .replace(/[^\\w\\s]/g, \" \")\n .split(/\\s+/)\n .filter((w) => w.length > 3)\n .slice(0, 8)\n .join(\" \");\n}\n\ninterface LinkConfidenceResult {\n score: number;\n reason: string;\n}\n\nfunction computeLinkConfidence(\n candidate: { name: string; data?: any; entryId?: string },\n sourceName: string,\n sourceDescription: string,\n sourceCollection: string,\n candidateCollection: string,\n): LinkConfidenceResult {\n const text = `${sourceName} ${sourceDescription}`.toLowerCase();\n const candidateName = candidate.name.toLowerCase();\n let score = 0;\n const reasons: string[] = [];\n\n if (text.includes(candidateName) && candidateName.length > 3) {\n score += 40;\n reasons.push(\"name match\");\n }\n\n const candidateWords = candidateName.split(/\\s+/).filter((w) => w.length > 3);\n const matchingWords = candidateWords.filter((w) => text.includes(w));\n const wordScore = (matchingWords.length / Math.max(candidateWords.length, 1)) * 30;\n score += wordScore;\n if (matchingWords.length > 0) {\n reasons.push(`word overlap (${matchingWords.slice(0, 3).join(\", \")})`);\n }\n\n const HUB_COLLECTIONS = new Set([\"strategy\", \"features\"]);\n if (HUB_COLLECTIONS.has(candidateCollection)) {\n score += 15;\n reasons.push(\"hub collection\");\n }\n\n if (candidateCollection !== sourceCollection) {\n score += 10;\n reasons.push(\"cross-collection\");\n }\n\n const finalScore = Math.min(score, 100);\n const reason = reasons.length > 0 ? reasons.join(\" + \") : \"low relevance\";\n return { score: finalScore, reason };\n}\n\ninterface RelationTypeResult {\n type: string;\n reason: string;\n}\n\nfunction inferRelationType(\n sourceCollection: string,\n targetCollection: string,\n profile: CollectionProfile,\n): RelationTypeResult {\n const typeMap: Record<string, Record<string, string>> = {\n tensions: {\n glossary: \"surfaces_tension_in\",\n \"business-rules\": \"references\",\n strategy: \"belongs_to\",\n features: \"surfaces_tension_in\",\n decisions: \"references\",\n },\n \"business-rules\": {\n glossary: \"references\",\n features: \"governs\",\n strategy: \"belongs_to\",\n tensions: \"references\",\n },\n glossary: {\n features: \"defines_term_for\",\n \"business-rules\": \"references\",\n strategy: \"references\",\n },\n decisions: {\n features: \"informs\",\n \"business-rules\": \"references\",\n strategy: \"references\",\n tensions: \"references\",\n },\n };\n\n const mapped = typeMap[sourceCollection]?.[targetCollection];\n const type = mapped ?? profile.recommendedRelationTypes[0] ?? \"related_to\";\n const reason = mapped\n ? `collection pair (${sourceCollection} → ${targetCollection})`\n : `profile default (${profile.recommendedRelationTypes[0] ?? \"related_to\"})`;\n return { type, reason };\n}\n\n// ── Quality Scoring ─────────────────────────────────────────────────────────\n\ninterface QualityResult {\n score: number;\n maxScore: number;\n checks: Array<{ id: string; label: string; passed: boolean; suggestion?: string }>;\n}\n\nfunction scoreQuality(ctx: CaptureContext, profile: CollectionProfile): QualityResult {\n const checks = profile.qualityChecks.map((qc) => {\n const passed = qc.check(ctx);\n return {\n id: qc.id,\n label: qc.label,\n passed,\n suggestion: passed ? undefined : qc.suggestion?.(ctx),\n };\n });\n\n const passed = checks.filter((c) => c.passed).length;\n const total = checks.length;\n const score = total > 0 ? Math.round((passed / total) * 10) : 10;\n\n return { score, maxScore: 10, checks };\n}\n\nexport function formatQualityReport(result: QualityResult): string {\n const failed = result.checks.filter((c) => !c.passed);\n const reason = failed.length > 0\n ? ` because ${failed.map((c) => c.suggestion ?? c.label.toLowerCase()).join(\"; \")}`\n : \"\";\n const lines: string[] = [`## Quality: ${result.score}/${result.maxScore}${reason}`];\n for (const check of result.checks) {\n const icon = check.passed ? \"[x]\" : \"[ ]\";\n const suggestion = check.passed ? \"\" : ` — ${check.suggestion ?? check.label}`;\n lines.push(`${icon} ${check.label}${suggestion}`);\n }\n return lines.join(\"\\n\");\n}\n\n// ── Exported: quality check for existing entries ─────────────────────────────\n\nexport async function checkEntryQuality(entryId: string): Promise<{ text: string; quality: QualityResult }> {\n const entry = await mcpQuery<any>(\"chain.getEntry\", { entryId });\n if (!entry) {\n return {\n text: `Entry \\`${entryId}\\` not found. Try search to find the right ID.`,\n quality: { score: 0, maxScore: 10, checks: [] },\n };\n }\n\n const collections = await mcpQuery<any[]>(\"chain.listCollections\");\n const collMap = new Map<string, string>();\n for (const c of collections) collMap.set(c._id, c.slug);\n const collectionSlug = collMap.get(entry.collectionId) ?? \"unknown\";\n\n const profile = PROFILES.get(collectionSlug) ?? FALLBACK_PROFILE;\n\n const relations = await mcpQuery<any[]>(\"chain.listEntryRelations\", { entryId });\n const linksCreated: LinkResult[] = [];\n for (const r of relations) {\n const otherId = r.fromId === entry._id ? r.toId : r.fromId;\n linksCreated.push({\n targetEntryId: otherId,\n targetName: \"\",\n targetCollection: \"\",\n relationType: r.type,\n });\n }\n\n const descField = profile.descriptionField;\n const description = typeof entry.data?.[descField] === \"string\" ? entry.data[descField] : \"\";\n\n const ctx: CaptureContext = {\n collection: collectionSlug,\n name: entry.name,\n description,\n data: entry.data ?? {},\n entryId: entry.entryId ?? \"\",\n canonicalKey: entry.canonicalKey,\n linksCreated,\n linksSuggested: [],\n collectionFields: [],\n };\n\n const quality = scoreQuality(ctx, profile);\n\n const lines: string[] = [\n `# Quality Check: ${entry.entryId ?? entry.name}`,\n `**${entry.name}** in \\`${collectionSlug}\\` [${entry.status}]`,\n \"\",\n formatQualityReport(quality),\n ];\n\n if (quality.score < 10) {\n const failedChecks = quality.checks.filter((c) => !c.passed && c.suggestion);\n if (failedChecks.length > 0) {\n lines.push(\"\");\n lines.push(`_To improve: use \\`update-entry\\` to fill missing fields, or \\`relations action=create\\` to add connections._`);\n }\n }\n\n return { text: lines.join(\"\\n\"), quality };\n}\n\n// ── Tool Registration ───────────────────────────────────────────────────────\n\nconst GOVERNED_COLLECTIONS = new Set([\n \"glossary\", \"business-rules\", \"principles\", \"standards\", \"strategy\", \"features\",\n]);\n\nconst AUTO_LINK_CONFIDENCE_THRESHOLD = 35;\nconst MAX_AUTO_LINKS = 5;\nconst MAX_SUGGESTIONS = 5;\nconst CAPTURE_WITHOUT_THINKING_FLAG = \"capture-without-thinking\";\n\nexport const captureSchema = z.object({\n collection: z.string().optional().describe(\"Collection slug, e.g. 'tensions', 'business-rules', 'glossary', 'decisions'. Optional when `capture-without-thinking` is enabled.\"),\n name: z.string().describe(\"Display name — be specific (e.g. 'Convex adjacency list won't scale for graph traversal')\"),\n description: z.string().describe(\"Full context — what's happening, why it matters, what you observed\"),\n context: z.string().optional().describe(\"Optional additional context (e.g. 'Observed during context gather calls taking 700ms+')\"),\n entryId: z.string().optional().describe(\"Optional custom entry ID (e.g. 'TEN-my-id'). Auto-generated if omitted.\"),\n canonicalKey: z.string().optional().describe(\"Semantic type (e.g. 'decision', 'tension', 'vision'). Auto-assigned from collection if omitted.\"),\n data: z.record(z.unknown()).optional().describe(\"Explicit field values when you know the schema (e.g. canonical_key, cardinality_rule, required_fields). Merged with inferred values; user-provided wins.\"),\n links: z.array(z.object({\n to: z.string().describe(\"Target entry ID (e.g. 'BR-64', 'ARCH-8')\"),\n type: z.string().describe(\"Relation type (e.g. 'governs', 'related_to', 'informs')\"),\n })).optional().describe(\"Relations to create after capture. Skips auto-link discovery when provided.\"),\n autoCommit: z.boolean().optional().describe(\"If true, commits the entry immediately after capture + linking. Use for ungoverned collections or when you're certain.\"),\n});\n\nexport const batchCaptureSchema = z.object({\n entries: z.array(z.object({\n collection: z.string().describe(\"Collection slug\"),\n name: z.string().describe(\"Display name\"),\n description: z.string().describe(\"Full context / definition\"),\n entryId: z.string().optional().describe(\"Optional custom entry ID\"),\n })).min(1).max(50).describe(\"Array of entries to capture\"),\n});\n\nexport const captureClassifierSchema = z.object({\n enabled: z.boolean(),\n autoRouted: z.boolean(),\n agrees: z.boolean(),\n topConfidence: z.number(),\n // Backward-compatible alias for topConfidence.\n confidence: z.number(),\n reasons: z.array(z.string()),\n candidates: z.array(\n z.object({\n collection: z.enum(STARTER_COLLECTIONS),\n signalScore: z.number(),\n // Backward-compatible alias for signalScore.\n confidence: z.number(),\n }),\n ),\n agentProvidedCollection: z.string().optional(),\n overrideCommand: z.string().optional(),\n});\n\nexport type CaptureClassifierMetadata = z.infer<typeof captureClassifierSchema>;\n\ntype CaptureToolResult = {\n content: Array<{ type: \"text\"; text: string }>;\n structuredContent?: z.infer<typeof captureOutputSchema>;\n};\n\ntype CollectionResolution = {\n resolvedCollection?: string;\n classifierMeta?: CaptureClassifierMetadata;\n earlyResult?: CaptureToolResult;\n};\n\nfunction trackClassifierTelemetry(params: {\n workspaceId: string;\n predictedCollection: string;\n confidence: number;\n autoRouted: boolean;\n reasonCategory: ClassifierReasonCategory;\n explicitCollectionProvided: boolean;\n outcome: \"auto-routed\" | \"fallback\";\n}): void {\n const telemetry = {\n predicted_collection: params.predictedCollection,\n confidence: params.confidence,\n auto_routed: params.autoRouted,\n reason_category: params.reasonCategory,\n explicit_collection_provided: params.explicitCollectionProvided,\n };\n\n trackCaptureClassifierEvaluated(params.workspaceId, telemetry);\n if (params.outcome === \"auto-routed\") {\n trackCaptureClassifierAutoRouted(params.workspaceId, telemetry);\n return;\n }\n trackCaptureClassifierFallback(params.workspaceId, telemetry);\n}\n\nfunction buildCollectionRequiredResult(): CaptureToolResult {\n return {\n content: [{\n type: \"text\" as const,\n text:\n \"Collection is required unless `capture-without-thinking` is enabled.\\n\\n\" +\n \"Provide `collection` explicitly, or enable the feature flag for this workspace.\",\n }],\n structuredContent: failure(\n \"VALIDATION_ERROR\",\n \"Collection is required unless capture-without-thinking is enabled.\",\n \"Provide collection explicitly, or enable the feature flag.\",\n [{ tool: \"collections\", description: \"List available collections\", parameters: { action: \"list\" } }],\n ),\n };\n}\n\nfunction buildClassifierUnknownResult(): CaptureToolResult {\n return {\n content: [{\n type: \"text\" as const,\n text:\n \"I could not infer a collection confidently from this input.\\n\\n\" +\n \"Please provide `collection`, or rewrite with clearer intent (decision/problem/definition/insight/bet).\",\n }],\n structuredContent: failure(\n \"VALIDATION_ERROR\",\n \"Could not infer collection from input.\",\n \"Provide collection explicitly, or rewrite with clearer intent.\",\n [{ tool: \"collections\", description: \"List available collections\", parameters: { action: \"list\" } }],\n { classifier: { enabled: true, autoRouted: false, agrees: true, topConfidence: 0, confidence: 0, reasons: [], candidates: [] } },\n ),\n };\n}\n\nfunction buildProvisionedCollectionSuggestions(\n candidates: Array<{ collection: StarterCollectionSlug; signalScore: number; confidence: number }>,\n): string {\n return candidates.length\n ? candidates\n .map((c) => `- \\`${c.collection}\\` (${c.signalScore}% signal score)`)\n .join(\"\\n\")\n : \"- No provisioned starter collection candidates were inferred confidently.\";\n}\n\nfunction buildUnsupportedProvisioningResult(\n classified: ClassificationResult,\n provisionedCandidates: Array<{ collection: StarterCollectionSlug; signalScore: number; confidence: number }>,\n): CaptureToolResult {\n const suggestions = buildProvisionedCollectionSuggestions(provisionedCandidates);\n const textBody =\n `Collection inference is not safe to auto-route yet.\\n\\n` +\n `Predicted collection \\`${classified.collection}\\` is not provisioned/supported for auto-routing in this workspace.\\n` +\n `Reason: ${classified.reasons.join(\"; \") || \"low signal\"}\\n\\n` +\n \"Choose one of these provisioned starter collections and retry with `collection`:\\n\" +\n `${suggestions}\\n\\n` +\n \"Correction path: rerun with explicit `collection`.\";\n return {\n content: [{ type: \"text\" as const, text: textBody }],\n structuredContent: failure(\n \"VALIDATION_ERROR\",\n `Collection '${classified.collection}' is not provisioned for auto-routing.`,\n \"Rerun with explicit collection.\",\n [{ tool: \"collections\", description: \"List available collections\", parameters: { action: \"list\" } }],\n {\n classifier: {\n enabled: true,\n autoRouted: false,\n agrees: false,\n topConfidence: classified.topConfidence,\n confidence: classified.confidence,\n reasons: classified.reasons,\n candidates: provisionedCandidates.map((c) => ({ collection: c.collection, signalScore: c.signalScore, confidence: c.confidence })),\n },\n },\n ),\n };\n}\n\nfunction buildAmbiguousRouteResult(\n classified: ClassificationResult,\n classifierMeta: CaptureClassifierMetadata,\n ambiguousRoute: boolean,\n): CaptureToolResult {\n const suggestions = buildProvisionedCollectionSuggestions(classifierMeta.candidates);\n const textBody =\n \"Collection inference is not safe to auto-route yet.\\n\\n\" +\n (ambiguousRoute ? \"Routing held because intent is ambiguous across top candidates.\\n\\n\" : \"\") +\n `Predicted: \\`${classified.collection}\\` (${classified.topConfidence}% top confidence)\\n` +\n `Reason: ${classified.reasons.join(\"; \") || \"low signal\"}\\n\\n` +\n \"Choose one of these and retry with `collection`:\\n\" +\n `${suggestions}\\n\\n` +\n \"Correction path: if this was close, rerun with your chosen `collection`.\";\n return {\n content: [{ type: \"text\" as const, text: textBody }],\n structuredContent: failure(\n \"VALIDATION_ERROR\",\n ambiguousRoute\n ? `Ambiguous routing — top candidates too close (${classified.topConfidence}% confidence).`\n : `Low confidence routing to '${classified.collection}' (${classified.topConfidence}%).`,\n \"Rerun with explicit collection.\",\n classifierMeta.candidates.map((c) => ({\n tool: \"capture\",\n description: `Capture to ${c.collection}`,\n parameters: { collection: c.collection },\n })),\n { classifier: classifierMeta },\n ),\n };\n}\n\nasync function getProvisionedStarterCollectionCandidates(\n classified: ClassificationResult,\n supportedStarterCollections: Set<StarterCollectionSlug>,\n): Promise<{\n provisionedStarterCollections: Set<StarterCollectionSlug>;\n provisionedCandidates: Array<{ collection: StarterCollectionSlug; signalScore: number; confidence: number }>;\n}> {\n const allCollections = await mcpQuery<any[]>(\"chain.listCollections\");\n const provisionedStarterCollections = new Set<StarterCollectionSlug>(\n (allCollections ?? [])\n .map((collection) => collection.slug)\n .filter(\n (slug): slug is StarterCollectionSlug =>\n supportedStarterCollections.has(slug as StarterCollectionSlug),\n ),\n );\n const provisionedCandidates = classified.candidates.filter((candidate) =>\n provisionedStarterCollections.has(candidate.collection),\n );\n return { provisionedStarterCollections, provisionedCandidates };\n}\n\nasync function resolveCaptureCollection(params: {\n collection?: string;\n name: string;\n description: string;\n classifierFlagOn: boolean;\n supportedStarterCollections: Set<StarterCollectionSlug>;\n workspaceId: string;\n explicitCollectionProvided: boolean;\n}): Promise<CollectionResolution> {\n const {\n collection,\n name,\n description,\n classifierFlagOn,\n supportedStarterCollections,\n workspaceId,\n explicitCollectionProvided,\n } = params;\n if (collection) {\n // FEAT-126: Run classifier as advisory validation even when collection is explicit.\n // Never changes routing — only populates receipt metadata.\n const classified = classifyStarterCollection(name, description);\n if (classified) {\n const agrees = classified.collection === collection;\n const classifierMeta: CaptureClassifierMetadata = {\n enabled: true,\n autoRouted: false,\n agrees,\n topConfidence: classified.topConfidence,\n confidence: classified.confidence,\n reasons: classified.reasons,\n candidates: classified.candidates.slice(0, 3),\n agentProvidedCollection: collection,\n ...(!agrees && {\n overrideCommand: `capture collection=\"${classified.collection}\"`,\n }),\n };\n if (!agrees) {\n trackClassifierTelemetry({\n workspaceId,\n predictedCollection: classified.collection,\n confidence: classified.confidence,\n autoRouted: false,\n reasonCategory: \"low-confidence\",\n explicitCollectionProvided: true,\n outcome: \"fallback\",\n });\n }\n return { resolvedCollection: collection, classifierMeta };\n }\n // Classifier abstained — no opinion for this content\n return {\n resolvedCollection: collection,\n classifierMeta: {\n enabled: true,\n autoRouted: false,\n agrees: true,\n topConfidence: 0,\n confidence: 0,\n reasons: [],\n candidates: [],\n agentProvidedCollection: collection,\n },\n };\n }\n if (!classifierFlagOn) {\n return { earlyResult: buildCollectionRequiredResult() };\n }\n\n const classified = classifyStarterCollection(name, description);\n if (!classified) {\n trackClassifierTelemetry({\n workspaceId,\n predictedCollection: \"unknown\",\n confidence: 0,\n autoRouted: false,\n reasonCategory: \"low-confidence\",\n explicitCollectionProvided,\n outcome: \"fallback\",\n });\n return { earlyResult: buildClassifierUnknownResult() };\n }\n\n const { provisionedStarterCollections, provisionedCandidates } =\n await getProvisionedStarterCollectionCandidates(classified, supportedStarterCollections);\n\n if (!provisionedStarterCollections.has(classified.collection)) {\n trackClassifierTelemetry({\n workspaceId,\n predictedCollection: classified.collection,\n confidence: classified.confidence,\n autoRouted: false,\n reasonCategory: \"non-provisioned\",\n explicitCollectionProvided,\n outcome: \"fallback\",\n });\n return {\n earlyResult: buildUnsupportedProvisioningResult(classified, provisionedCandidates),\n };\n }\n\n const autoRoute = shouldAutoRouteClassification(classified);\n const ambiguousRoute = isClassificationAmbiguous(classified);\n const classifierMeta: CaptureClassifierMetadata = {\n enabled: true,\n autoRouted: autoRoute,\n agrees: true,\n topConfidence: classified.topConfidence,\n confidence: classified.confidence,\n reasons: classified.reasons,\n candidates: provisionedCandidates,\n };\n\n if (!autoRoute) {\n trackClassifierTelemetry({\n workspaceId,\n predictedCollection: classified.collection,\n confidence: classified.confidence,\n autoRouted: false,\n reasonCategory: ambiguousRoute ? \"ambiguous\" : \"low-confidence\",\n explicitCollectionProvided,\n outcome: \"fallback\",\n });\n return {\n classifierMeta,\n earlyResult: buildAmbiguousRouteResult(classified, classifierMeta, ambiguousRoute),\n };\n }\n\n trackClassifierTelemetry({\n workspaceId,\n predictedCollection: classified.collection,\n confidence: classified.confidence,\n autoRouted: true,\n reasonCategory: \"auto-routed\",\n explicitCollectionProvided,\n outcome: \"auto-routed\",\n });\n\n return {\n resolvedCollection: classified.collection,\n classifierMeta,\n };\n}\n\nconst captureSuccessOutputSchema = z.object({\n entryId: z.string(),\n collection: z.string(),\n name: z.string(),\n status: z.enum([\"draft\", \"committed\"]),\n qualityScore: z.number(),\n qualityVerdict: z.record(z.unknown()).optional(),\n classifier: captureClassifierSchema.optional(),\n studioUrl: z.string().optional(),\n}).strict();\n\nconst captureClassifierOnlyOutputSchema = z.object({\n classifier: captureClassifierSchema,\n}).strict();\n\nexport const captureOutputSchema = z.union([\n captureSuccessOutputSchema,\n captureClassifierOnlyOutputSchema,\n]);\n\nexport const batchCaptureOutputSchema = z.object({\n captured: z.array(z.object({\n entryId: z.string(),\n collection: z.string(),\n name: z.string(),\n })),\n total: z.number(),\n failed: z.number(),\n failedEntries: z.array(z.object({\n index: z.number(),\n collection: z.string(),\n name: z.string(),\n error: z.string(),\n })).optional(),\n});\n\nexport function registerSmartCaptureTools(server: McpServer) {\n const supportedStarterCollections = new Set<StarterCollectionSlug>(\n STARTER_COLLECTIONS.filter((slug) => PROFILES.has(slug)),\n );\n\n const captureTool = server.registerTool(\n \"capture\",\n {\n title: \"Capture\",\n description:\n \"The single tool for creating knowledge entries. Creates an entry, auto-links related entries, \" +\n \"and returns a quality scorecard — all in one call. \" +\n \"Provide a name and description; `collection` is optional when `capture-without-thinking` is enabled.\\n\\n\" +\n \"Supported collections with smart profiles: tensions, business-rules, glossary, decisions, features, \" +\n \"audiences, strategy, standards, maps, bets, insights, assumptions, principles, tracking-events.\\n\" +\n \"All other collections get an ENT-{random} ID and sensible defaults.\\n\\n\" +\n \"**Explicit data:** When you know the schema, pass `data: { field: value }` to set fields directly. \" +\n \"Top-level `name` and `description` always win for those fields. `data` wins over inference for all other fields.\\n\\n\" +\n \"**Compound capture:** Pass `links` to create relations in the same call (skips auto-link discovery). \" +\n \"Pass `autoCommit: true` to promote the entry from draft to SSOT immediately after linking. \" +\n \"Governed collections (glossary, business-rules, principles, standards, strategy, features) \" +\n \"will warn but still commit — use only when you're certain.\\n\\n\" +\n \"Always creates as 'draft' unless `autoCommit` is true. Use `update-entry` for post-creation adjustments.\",\n inputSchema: captureSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n },\n withEnvelope(async ({ collection, name, description, context, entryId, canonicalKey, data: userData, links, autoCommit }) => {\n requireWriteAccess();\n\n const wsCtx = await getWorkspaceContext();\n const explicitCollectionProvided = typeof collection === \"string\" && collection.trim().length > 0;\n const classifierFlagOn = await isFeatureEnabled(\n CAPTURE_WITHOUT_THINKING_FLAG,\n wsCtx.workspaceId,\n wsCtx.workspaceSlug,\n );\n\n const resolution = await resolveCaptureCollection({\n collection,\n name,\n description,\n classifierFlagOn,\n supportedStarterCollections,\n workspaceId: wsCtx.workspaceId,\n explicitCollectionProvided,\n });\n if (resolution.earlyResult) {\n return resolution.earlyResult;\n }\n const resolvedCollection = resolution.resolvedCollection;\n const classifierMeta = resolution.classifierMeta;\n if (!resolvedCollection) {\n return buildCollectionRequiredResult();\n }\n\n const profile = PROFILES.get(resolvedCollection) ?? FALLBACK_PROFILE;\n\n const col = await mcpQuery<any>(\"chain.getCollection\", { slug: resolvedCollection });\n if (!col) {\n const displayName = resolvedCollection.split(\"-\").map((w: string) => w.charAt(0).toUpperCase() + w.slice(1)).join(\" \");\n return {\n content: [{\n type: \"text\" as const,\n text:\n `Collection \\`${resolvedCollection}\\` not found.\\n\\n` +\n `**To create it**, run:\\n` +\n `\\`\\`\\`\\ncollections action=create slug=\"${resolvedCollection}\" name=\"${displayName}\" description=\"...\"\\n\\`\\`\\`\\n\\n` +\n `Or use \\`collections action=list\\` to see available collections.`,\n }],\n structuredContent: failure(\n \"NOT_FOUND\",\n `Collection '${resolvedCollection}' not found.`,\n \"Create the collection first, or use collections action=list to see available ones.\",\n [\n { tool: \"collections\", description: \"Create collection\", parameters: { action: \"create\", slug: resolvedCollection, name: displayName } },\n { tool: \"collections\", description: \"List collections\", parameters: { action: \"list\" } },\n ],\n ),\n };\n }\n\n // 2. Build data with profile defaults + inference\n const data: Record<string, unknown> = {};\n const today = new Date().toISOString().split(\"T\")[0];\n\n for (const field of col.fields ?? []) {\n const key = field.key as string;\n if (key === profile.descriptionField) {\n data[key] = description;\n } else if (field.type === \"array\" || field.type === \"multi-select\") {\n data[key] = [];\n } else if (field.type === \"select\") {\n // Skip — empty string is not a valid option for select fields\n } else {\n data[key] = \"\";\n }\n }\n\n for (const def of profile.defaults) {\n if (def.value === \"today\") {\n data[def.key] = today;\n } else if (def.value !== \"infer\") {\n data[def.key] = def.value;\n }\n }\n\n if (profile.inferField) {\n const inferred = profile.inferField({\n collection: resolvedCollection, name, description, context, data, entryId: \"\",\n linksCreated: [], linksSuggested: [], collectionFields: col.fields ?? [],\n });\n for (const [key, val] of Object.entries(inferred)) {\n if (val !== undefined && val !== \"\") {\n data[key] = val;\n }\n }\n }\n\n // Merge user-provided data (wins over inference for those fields)\n if (userData && typeof userData === \"object\") {\n for (const [key, val] of Object.entries(userData)) {\n if (key !== \"name\") data[key] = val;\n }\n }\n\n // Top-level description always wins\n data[profile.descriptionField || \"description\"] = description;\n\n // 3. Determine status\n const status = \"draft\";\n\n // 4. Create entry (Convex generates sequential ID when entryId not provided)\n let finalEntryId: string;\n let internalId: string;\n try {\n const agentId = getAgentSessionId();\n const result = await mcpMutation<{ docId: string; entryId: string }>(\"chain.createEntry\", {\n collectionSlug: resolvedCollection,\n entryId: entryId ?? undefined,\n name,\n status,\n data,\n canonicalKey,\n createdBy: agentId ? `agent:${agentId}` : \"capture\",\n sessionId: agentId ?? undefined,\n });\n internalId = result.docId;\n finalEntryId = result.entryId;\n\n await recordSessionActivity({ entryCreated: internalId });\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes(\"Duplicate\") || msg.includes(\"already exists\")) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# Cannot Capture — Duplicate Detected\\n\\n${msg}\\n\\nUse \\`entries action=get\\` to inspect the existing entry, or \\`update-entry\\` to modify it.`,\n }],\n structuredContent: failure(\n \"DUPLICATE\",\n msg,\n \"Use entries action=get to inspect the existing entry.\",\n [\n { tool: \"entries\", description: \"Get existing entry\", parameters: { action: \"get\", entryId: entryId ?? name } },\n { tool: \"update-entry\", description: \"Update existing entry\", parameters: { entryId: entryId ?? \"\" } },\n ],\n ),\n };\n }\n throw error;\n }\n\n // 6. Discover and auto-link related entries\n const linksCreated: LinkResult[] = [];\n const linksSuggested: LinkSuggestion[] = [];\n const userLinkResults: Array<{ label: string; ok: boolean }> = [];\n\n const skipAutoDiscovery = links && links.length > 0;\n const searchQuery = extractSearchTerms(name, description);\n if (searchQuery && !skipAutoDiscovery) {\n const [searchResults, allCollections] = await Promise.all([\n mcpQuery<any[]>(\"chain.searchEntries\", { query: searchQuery }),\n mcpQuery<any[]>(\"chain.listCollections\"),\n ]);\n\n const collMap = new Map<string, string>();\n for (const c of allCollections) collMap.set(c._id, c.slug);\n\n const candidates = (searchResults ?? [])\n .filter((r) => r.entryId !== finalEntryId && r._id !== internalId)\n .map((r) => {\n const conf = computeLinkConfidence(r, name, description, resolvedCollection, collMap.get(r.collectionId) ?? \"unknown\");\n return {\n ...r,\n collSlug: collMap.get(r.collectionId) ?? \"unknown\",\n confidence: conf.score,\n confidenceReason: conf.reason,\n };\n })\n .sort((a, b) => b.confidence - a.confidence);\n\n // Auto-link high-confidence matches\n for (const c of candidates) {\n if (linksCreated.length >= MAX_AUTO_LINKS) break;\n if (c.confidence < AUTO_LINK_CONFIDENCE_THRESHOLD) break;\n if (!c.entryId || !finalEntryId) continue;\n\n const { type: relationType, reason: relationReason } = inferRelationType(resolvedCollection, c.collSlug, profile);\n try {\n await mcpMutation(\"chain.createEntryRelation\", {\n fromEntryId: finalEntryId,\n toEntryId: c.entryId,\n type: relationType,\n });\n linksCreated.push({\n targetEntryId: c.entryId,\n targetName: c.name,\n targetCollection: c.collSlug,\n relationType,\n linkReason: `confidence ${c.confidence} (${(c as any).confidenceReason}) + ${relationReason}`,\n });\n } catch {\n // Relation creation failed (e.g. entry not found) — skip silently\n }\n }\n\n // Collect suggestions for remaining candidates\n const linkedIds = new Set(linksCreated.map((l) => l.targetEntryId));\n for (const c of candidates) {\n if (linksSuggested.length >= MAX_SUGGESTIONS) break;\n if (linkedIds.has(c.entryId)) continue;\n if (c.confidence < 10) continue;\n\n const preview = extractPreview(c.data, 80);\n const reason = c.confidence >= AUTO_LINK_CONFIDENCE_THRESHOLD\n ? \"high relevance (already linked)\"\n : `\"${c.name.toLowerCase().split(/\\s+/).filter((w: string) => `${name} ${description}`.toLowerCase().includes(w) && w.length > 3).slice(0, 2).join('\", \"')}\" appears in content`;\n\n linksSuggested.push({\n entryId: c.entryId,\n name: c.name,\n collection: c.collSlug,\n reason,\n preview,\n });\n }\n }\n\n // 6b. Create user-specified links\n if (links && links.length > 0 && finalEntryId) {\n for (const link of links) {\n try {\n await mcpMutation(\"chain.createEntryRelation\", {\n fromEntryId: finalEntryId,\n toEntryId: link.to,\n type: link.type,\n });\n userLinkResults.push({ label: `✓ ${link.type} → ${link.to}`, ok: true });\n linksCreated.push({\n targetEntryId: link.to,\n targetName: link.to,\n targetCollection: \"unknown\",\n relationType: link.type,\n });\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : \"failed\";\n userLinkResults.push({ label: `✗ ${link.type} → ${link.to}: ${msg}`, ok: false });\n }\n }\n }\n\n // 7. Score quality\n const captureCtx: CaptureContext = {\n collection: resolvedCollection,\n name,\n description,\n context,\n data,\n entryId: finalEntryId,\n canonicalKey,\n linksCreated,\n linksSuggested,\n collectionFields: col.fields ?? [],\n };\n const quality = scoreQuality(captureCtx, profile);\n\n // 8. Cardinality check for singleton types\n let cardinalityWarning: string | null = null;\n const resolvedCK = canonicalKey ?? (captureCtx as any).canonicalKey;\n if (resolvedCK) {\n try {\n const check = await mcpQuery<any>(\"chain.checkCardinalityWarning\", {\n canonicalKey: resolvedCK,\n });\n if (check?.warning) {\n cardinalityWarning = check.warning;\n }\n } catch {\n // Advisory — capture succeeds without cardinality check\n }\n }\n\n // 9. Keyword contradiction check against governance entries\n const contradictionWarnings = await runContradictionCheck(name, description);\n if (contradictionWarnings.length > 0) {\n await recordSessionActivity({ contradictionWarning: true });\n }\n\n // 10. Quality coaching (heuristic instant, LLM scheduled in background)\n let coachingSection = \"\";\n let verdictResult: any = null;\n try {\n verdictResult = await mcpMutation<any>(\"quality.evaluateHeuristicAndSchedule\", {\n entryId: finalEntryId,\n context: \"capture\",\n });\n if (verdictResult?.verdict && verdictResult.verdict.tier !== \"passive\" && verdictResult.verdict.criteria.length > 0) {\n coachingSection = formatRubricCoaching(verdictResult);\n }\n } catch {\n // Quality coaching is advisory — capture succeeds without it\n }\n\n // 11. Track quality verdict\n if (verdictResult?.verdict) {\n try {\n const wsForTracking = await getWorkspaceContext();\n const v = verdictResult.verdict;\n const failedCount = (v.criteria ?? []).filter((c: any) => !c.passed).length;\n trackQualityVerdict(wsForTracking.workspaceId, {\n entry_id: finalEntryId,\n entry_type: v.canonicalKey ?? resolvedCollection,\n tier: v.tier,\n context: \"capture\",\n passed: v.passed,\n source: verdictResult.source ?? \"heuristic\",\n criteria_total: v.criteria?.length ?? 0,\n criteria_failed: failedCount,\n llm_scheduled: v.tier !== \"passive\",\n });\n } catch { /* tracking is advisory */ }\n }\n\n // 12. Auto-commit if requested (or defaulted via Open governance mode).\n // BET-76 FEAT-111: When autoCommit is not explicitly set, default to true for\n // Open mode workspaces. Consensus/role modes retain draft-first behavior.\n // Agent-inferred entries (e.g. project scan) should pass autoCommit=false explicitly.\n const shouldAutoCommit =\n autoCommit === true ||\n (autoCommit === undefined && wsCtx.governanceMode === \"open\");\n\n let finalStatus: \"draft\" | \"committed\" = \"draft\";\n let commitError: string | null = null;\n if (shouldAutoCommit && finalEntryId) {\n try {\n await mcpMutation(\"chain.commitEntry\", { entryId: finalEntryId });\n finalStatus = \"committed\";\n await recordSessionActivity({ entryModified: internalId });\n } catch (e: unknown) {\n commitError = e instanceof Error ? e.message : \"unknown error\";\n // Store as draft with error flag — do not throw silently (BET-76 RH4)\n }\n }\n\n // 13. Format response\n const lines: string[] = [\n `# Captured: ${finalEntryId || name}`,\n `**${name}** added to \\`${resolvedCollection}\\` as \\`${finalStatus}\\``,\n `**Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})`,\n ];\n\n if (classifierMeta && classifierMeta.topConfidence > 0) {\n lines.push(\"\");\n lines.push(\"## Classification\");\n if (classifierMeta.autoRouted) {\n lines.push(`Auto-routed to \\`${resolvedCollection}\\` (${classifierMeta.topConfidence}% confidence).`);\n if (classifierMeta.reasons.length > 0) {\n lines.push(`Reason: ${classifierMeta.reasons.join(\"; \")}.`);\n }\n lines.push(`Override: rerun with explicit \\`collection\\` if wrong.`);\n } else if (classifierMeta.agrees) {\n lines.push(`Classifier confirms \\`${resolvedCollection}\\` (${classifierMeta.topConfidence}% confidence).`);\n } else {\n const suggested = classifierMeta.candidates[0]?.collection ?? \"unknown\";\n lines.push(`Agent chose \\`${resolvedCollection}\\`, classifier suggests \\`${suggested}\\` (${classifierMeta.topConfidence}% confidence).`);\n if (classifierMeta.reasons.length > 0) {\n lines.push(`Reason: ${classifierMeta.reasons.join(\"; \")}.`);\n }\n if (classifierMeta.overrideCommand) {\n lines.push(`Override: \\`${classifierMeta.overrideCommand}\\``);\n }\n }\n }\n\n // BET-chain-native-constellation: Studio link for bets — DEC-70 (structuredContent studioUrl)\n const appUrl = process.env.PRODUCTBRAIN_APP_URL ?? \"https://productbrain.io\";\n const studioUrl =\n resolvedCollection === \"bets\"\n ? `${appUrl.replace(/\\/$/, \"\")}/w/${wsCtx.workspaceSlug}/studio/${internalId}`\n : undefined;\n if (studioUrl) {\n lines.push(\"\");\n lines.push(`**View in Studio:** ${studioUrl}`);\n }\n\n if (linksCreated.length > 0) {\n lines.push(\"\");\n lines.push(`## Auto-linked (${linksCreated.length})`);\n for (const link of linksCreated) {\n const reason = (link as any).linkReason ? ` — because ${(link as any).linkReason}` : \"\";\n lines.push(`- -> **${link.relationType}** ${link.targetEntryId}: ${link.targetName} [${link.targetCollection}]${reason}`);\n }\n }\n\n if (userLinkResults.length > 0) {\n lines.push(\"\");\n lines.push(\"## Requested links\");\n for (const r of userLinkResults) lines.push(`- ${r.label}`);\n }\n\n if (finalStatus === \"committed\") {\n const wasAutoCommitted = autoCommit === undefined && wsCtx.governanceMode === \"open\";\n lines.push(\"\");\n lines.push(`## Committed: ${finalEntryId}`);\n if (wasAutoCommitted) {\n lines.push(`**${name}** added to your knowledge base.`);\n } else {\n lines.push(`**${name}** promoted to SSOT on the Chain.`);\n }\n if (GOVERNED_COLLECTIONS.has(resolvedCollection)) {\n lines.push(`_Note: \\`${resolvedCollection}\\` is a governed collection — ensure this entry has been reviewed._`);\n }\n } else if (commitError) {\n lines.push(\"\");\n lines.push(\"## Commit failed\");\n lines.push(`Error: ${commitError}. Entry saved as draft — use \\`commit-entry entryId=\"${finalEntryId}\"\\` to promote when ready.`);\n }\n\n if (linksSuggested.length > 0) {\n lines.push(\"\");\n lines.push(\"## Suggested links (review and use `relations action=create`)\");\n for (let i = 0; i < linksSuggested.length; i++) {\n const s = linksSuggested[i];\n const preview = s.preview ? ` — ${s.preview}` : \"\";\n lines.push(`${i + 1}. **${s.entryId ?? \"(no ID)\"}**: ${s.name} [${s.collection}]${preview}`);\n }\n }\n\n lines.push(\"\");\n lines.push(formatQualityReport(quality));\n\n const failedChecks = quality.checks.filter((c) => !c.passed);\n if (failedChecks.length > 0) {\n lines.push(\"\");\n lines.push(`_To improve: \\`update-entry entryId=\"${finalEntryId}\"\\` to fill missing fields._`);\n }\n\n // Strategy-link warning for bet/goal (ENT-ldomlr: Intelligence Surface)\n const isBetOrGoal =\n resolvedCollection === \"bets\" ||\n resolvedCK === \"bet\" ||\n resolvedCK === \"goal\";\n const hasStrategyLink = linksCreated.some((l) => l.targetCollection === \"strategy\");\n if (isBetOrGoal && !hasStrategyLink) {\n lines.push(\"\");\n lines.push(\n `**Strategy link:** This ${resolvedCollection === \"bets\" ? \"bet\" : \"goal\"} doesn't connect to any strategy entry. Consider linking before commit. Use \\`graph action=suggest entryId=\"${finalEntryId}\"\\` to find strategy entries to connect to.`\n );\n await recordSessionActivity({ strategyLinkWarnedForEntryId: internalId });\n }\n\n // Cardinality warning for singleton types (DEC-zcuhvb)\n if (cardinalityWarning) {\n lines.push(\"\");\n lines.push(`**Cardinality warning:** ${cardinalityWarning}`);\n }\n\n // Contradiction warnings — exact format per spec\n if (contradictionWarnings.length > 0) {\n lines.push(\"\");\n lines.push(\"⚠ Contradiction check: proposed entry matched existing governance entries:\");\n for (const w of contradictionWarnings) {\n lines.push(`- ${w.name} (${w.collection}, ${w.entryId}) — has 'governs' relation to ${w.governsCount} entries`);\n }\n lines.push(\"Run `context action=gather` on these entries before committing.\");\n }\n\n // Rubric coaching (assertive/nudge only)\n if (coachingSection) {\n lines.push(\"\");\n lines.push(coachingSection);\n }\n\n // Next steps: adapt based on what was already done\n lines.push(\"\");\n lines.push(\"## Next Steps\");\n const eid = finalEntryId || \"(check entry ID)\";\n if (finalStatus === \"committed\") {\n lines.push(`1. **Connect it:** \\`graph action=suggest entryId=\"${eid}\"\\` — discover additional links`);\n if (failedChecks.length > 0) {\n lines.push(`2. **Improve quality:** \\`update-entry entryId=\"${eid}\"\\` — fill missing fields`);\n }\n } else {\n if (userLinkResults.length === 0) {\n lines.push(`1. **Connect it:** \\`graph action=suggest entryId=\"${eid}\"\\` — discover what this should link to`);\n }\n lines.push(`${userLinkResults.length === 0 ? \"2\" : \"1\"}. **Commit it:** \\`commit-entry entryId=\"${eid}\"\\` — promote from draft to SSOT on the Chain`);\n if (failedChecks.length > 0) {\n lines.push(`${userLinkResults.length === 0 ? \"3\" : \"2\"}. **Improve quality:** \\`update-entry entryId=\"${eid}\"\\` — fill missing fields`);\n }\n }\n\n // Advisory: workspace readiness hints (never blocking)\n try {\n const readiness = await mcpQuery<any>(\"chain.workspaceReadiness\");\n if (readiness && readiness.gaps && readiness.gaps.length > 0) {\n const topGaps = readiness.gaps.slice(0, 2);\n lines.push(\"\");\n lines.push(`## Workspace Readiness: ${readiness.score}%`);\n for (const gap of topGaps) {\n lines.push(`- _${gap.label}:_ ${gap.guidance}`);\n }\n }\n } catch {\n // Readiness check is advisory — capture works without it\n }\n\n // Context-sensitive next: adapt based on what was already done\n const next: NextAction[] = [];\n if (finalStatus === \"committed\") {\n next.push({ tool: \"graph\", description: \"Discover connections\", parameters: { action: \"suggest\", entryId: finalEntryId } });\n } else {\n if (userLinkResults.length === 0) {\n next.push({ tool: \"graph\", description: \"Discover links\", parameters: { action: \"suggest\", entryId: finalEntryId } });\n }\n next.push({ tool: \"commit-entry\", description: \"Commit to Chain\", parameters: { entryId: finalEntryId } });\n }\n\n const summary = finalStatus === \"committed\"\n ? `Captured and committed ${finalEntryId} (${name}) to ${resolvedCollection}. Quality ${quality.score}/10.`\n : `Captured ${finalEntryId} (${name}) as draft in ${resolvedCollection}. Quality ${quality.score}/10.`;\n\n const toolResult = {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: success(\n summary,\n {\n entryId: finalEntryId,\n collection: resolvedCollection,\n name,\n status: finalStatus,\n qualityScore: quality.score,\n qualityVerdict: verdictResult?.verdict\n ? { ...verdictResult.verdict, source: verdictResult.source ?? \"heuristic\" }\n : undefined,\n ...(classifierMeta && { classifier: classifierMeta }),\n ...(studioUrl && { studioUrl }),\n },\n next,\n ),\n };\n\n return toolResult;\n })\n );\n trackWriteTool(captureTool);\n\n // ── Batch Capture Tool ─────────────────────────────────────────────────\n\n const batchCaptureTool = server.registerTool(\n \"batch-capture\",\n {\n title: \"Batch Capture\",\n description:\n \"Create multiple knowledge entries in one call. Ideal for workspace setup, document ingestion, \" +\n \"or any scenario where you need to capture many entries at once.\\n\\n\" +\n \"Each entry is created independently — if one fails, the others still succeed. \" +\n \"Returns a compact summary instead of per-entry quality scorecards.\\n\\n\" +\n \"Auto-linking runs per entry but contradiction checks and readiness hints are skipped for speed. \" +\n \"Use `quality action=check` on individual entries afterward if needed.\",\n inputSchema: batchCaptureSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n },\n withEnvelope(async ({ entries }) => {\n requireWriteAccess();\n\n const agentId = getAgentSessionId();\n const createdBy = agentId ? `agent:${agentId}` : \"capture\";\n\n const results: Array<{\n name: string;\n collection: string;\n entryId: string;\n ok: boolean;\n autoLinks: number;\n error?: string;\n }> = [];\n\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Batch capturing ${entries.length} entries...`,\n logger: \"product-brain\",\n });\n\n const allCollections = await mcpQuery<any[]>(\"chain.listCollections\");\n const collCache = new Map<string, any>();\n for (const c of allCollections) collCache.set(c.slug, c);\n const collIdToSlug = new Map<string, string>();\n for (const c of allCollections) collIdToSlug.set(c._id, c.slug);\n\n for (let entryIdx = 0; entryIdx < entries.length; entryIdx++) {\n const entry = entries[entryIdx];\n\n if (entryIdx > 0 && entryIdx % 5 === 0) {\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Captured ${entryIdx}/${entries.length} entries...`,\n logger: \"product-brain\",\n });\n }\n const profile = PROFILES.get(entry.collection) ?? FALLBACK_PROFILE;\n const col = collCache.get(entry.collection);\n\n if (!col) {\n results.push({ name: entry.name, collection: entry.collection, entryId: \"\", ok: false, autoLinks: 0, error: `Collection \"${entry.collection}\" not found` });\n continue;\n }\n\n const data: Record<string, unknown> = {};\n const today = new Date().toISOString().split(\"T\")[0];\n\n for (const field of col.fields ?? []) {\n const key = field.key as string;\n if (key === profile.descriptionField) {\n data[key] = entry.description;\n } else if (field.type === \"array\" || field.type === \"multi-select\") {\n data[key] = [];\n } else if (field.type === \"select\") {\n // Skip — empty string is not a valid option for select fields\n } else {\n data[key] = \"\";\n }\n }\n\n for (const def of profile.defaults) {\n if (def.value === \"today\") data[def.key] = today;\n else if (def.value !== \"infer\") data[def.key] = def.value;\n }\n\n if (profile.inferField) {\n const inferred = profile.inferField({\n collection: entry.collection, name: entry.name, description: entry.description,\n data, entryId: \"\", linksCreated: [], linksSuggested: [], collectionFields: col.fields ?? [],\n });\n for (const [key, val] of Object.entries(inferred)) {\n if (val !== undefined && val !== \"\") data[key] = val;\n }\n }\n\n if (!data[profile.descriptionField] && !data.description && !data.canonical) {\n data[profile.descriptionField || \"description\"] = entry.description;\n }\n\n try {\n const result = await mcpMutation<{ docId: string; entryId: string }>(\"chain.createEntry\", {\n collectionSlug: entry.collection,\n entryId: entry.entryId ?? undefined,\n name: entry.name,\n status: \"draft\",\n data,\n createdBy,\n sessionId: agentId ?? undefined,\n });\n const internalId = result.docId;\n const finalEntryId = result.entryId;\n\n let autoLinkCount = 0;\n const searchQuery = extractSearchTerms(entry.name, entry.description);\n if (searchQuery) {\n try {\n const searchResults = await mcpQuery<any[]>(\"chain.searchEntries\", { query: searchQuery });\n const candidates = (searchResults ?? [])\n .filter((r) => r.entryId !== finalEntryId)\n .map((r) => {\n const conf = computeLinkConfidence(r, entry.name, entry.description, entry.collection, collIdToSlug.get(r.collectionId) ?? \"unknown\");\n return {\n ...r,\n collSlug: collIdToSlug.get(r.collectionId) ?? \"unknown\",\n confidence: conf.score,\n };\n })\n .sort((a, b) => b.confidence - a.confidence);\n\n for (const c of candidates) {\n if (autoLinkCount >= MAX_AUTO_LINKS) break;\n if (c.confidence < AUTO_LINK_CONFIDENCE_THRESHOLD) break;\n if (!c.entryId) continue;\n const { type: relationType } = inferRelationType(entry.collection, c.collSlug, profile);\n try {\n await mcpMutation(\"chain.createEntryRelation\", {\n fromEntryId: finalEntryId,\n toEntryId: c.entryId,\n type: relationType,\n });\n autoLinkCount++;\n } catch { /* skip failed link */ }\n }\n } catch { /* search failed; entry still created */ }\n }\n\n results.push({ name: entry.name, collection: entry.collection, entryId: finalEntryId, ok: true, autoLinks: autoLinkCount });\n await recordSessionActivity({ entryCreated: internalId });\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n results.push({ name: entry.name, collection: entry.collection, entryId: \"\", ok: false, autoLinks: 0, error: msg });\n }\n }\n\n const created = results.filter((r) => r.ok);\n const failed = results.filter((r) => !r.ok);\n\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Batch complete. ${created.length} succeeded, ${failed.length} failed.`,\n logger: \"product-brain\",\n });\n\n const totalAutoLinks = created.reduce((sum, r) => sum + r.autoLinks, 0);\n\n const byCollection = new Map<string, number>();\n for (const r of created) {\n byCollection.set(r.collection, (byCollection.get(r.collection) ?? 0) + 1);\n }\n\n const lines: string[] = [\n `# Batch Capture Complete`,\n `**${created.length}** created, **${failed.length}** failed out of ${entries.length} total.`,\n `**Auto-links created:** ${totalAutoLinks}`,\n \"\",\n ];\n\n if (byCollection.size > 0) {\n lines.push(\"## By Collection\");\n for (const [col, count] of byCollection) {\n lines.push(`- \\`${col}\\`: ${count} entries`);\n }\n lines.push(\"\");\n }\n\n if (created.length > 0) {\n lines.push(\"## Created\");\n for (const r of created) {\n const linkNote = r.autoLinks > 0 ? ` (${r.autoLinks} auto-links)` : \"\";\n lines.push(`- **${r.entryId}**: ${r.name} [${r.collection}]${linkNote}`);\n }\n }\n\n if (failed.length > 0) {\n lines.push(\"\");\n lines.push(\"## Failed\");\n for (const r of failed) {\n lines.push(`- ${r.name} [${r.collection}]: _${r.error}_`);\n }\n lines.push(\"\");\n lines.push(`_If failed > 0, inspect \\`failedEntries\\` in the structured response and retry individually._`);\n }\n\n const entryIds = created.map((r) => r.entryId);\n if (entryIds.length > 0) {\n lines.push(\"\");\n lines.push(\"## Next Steps\");\n lines.push(`- **Connect:** Run \\`graph action=suggest\\` on key entries to build the knowledge graph`);\n lines.push(`- **Commit:** Use \\`commit-entry\\` to promote drafts to SSOT`);\n lines.push(`- **Quality:** Run \\`quality action=check\\` on individual entries to assess completeness`);\n }\n\n const summary = failed.length > 0\n ? `Batch captured ${created.length}/${entries.length} entries (${failed.length} failed).`\n : `Batch captured ${created.length} entries successfully.`;\n\n const next: NextAction[] = created.length > 0\n ? [\n { tool: \"graph\", description: \"Discover connections\", parameters: { action: \"suggest\", entryId: created[0].entryId } },\n { tool: \"commit-entry\", description: \"Commit first entry\", parameters: { entryId: created[0].entryId } },\n ]\n : [];\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: success(\n summary,\n {\n captured: created.map((r) => ({ entryId: r.entryId, collection: r.collection, name: r.name })),\n total: created.length,\n failed: failed.length,\n ...(failed.length > 0 && {\n failedEntries: failed.map((r) => ({\n index: results.indexOf(r),\n collection: r.collection,\n name: r.name,\n error: r.error ?? \"unknown error\",\n })),\n }),\n },\n next,\n ),\n };\n })\n );\n trackWriteTool(batchCaptureTool);\n\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\n\n// Stop words excluded from noun phrase extraction\nconst STOP_WORDS = new Set([\n \"the\", \"and\", \"for\", \"are\", \"but\", \"not\", \"you\", \"all\", \"can\", \"has\", \"her\",\n \"was\", \"one\", \"our\", \"out\", \"day\", \"had\", \"hot\", \"how\", \"its\", \"may\", \"new\",\n \"now\", \"old\", \"see\", \"way\", \"who\", \"did\", \"get\", \"let\", \"say\", \"she\", \"too\",\n \"use\", \"from\", \"have\", \"been\", \"each\", \"that\", \"this\", \"with\", \"will\", \"they\",\n \"what\", \"when\", \"make\", \"like\", \"long\", \"look\", \"many\", \"some\", \"them\", \"than\",\n \"most\", \"only\", \"over\", \"such\", \"into\", \"also\", \"back\", \"just\", \"much\", \"must\",\n \"name\", \"very\", \"your\", \"after\", \"which\", \"their\", \"about\", \"would\", \"there\",\n \"should\", \"could\", \"other\", \"these\", \"first\", \"being\", \"those\", \"still\", \"where\",\n]);\n\nfunction tokenizeText(input: string): string[] {\n return input\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]+/gu, \" \")\n .split(/\\s+/)\n .filter(Boolean);\n}\n\n/**\n * Keyword contradiction check against governance entries.\n * Extracts terms 4+ chars, searches architecture and business-rules,\n * checks for 'governs' relations, returns formatted warnings.\n * Non-blocking — never throws, never prevents the operation.\n */\nexport interface ContradictionWarning {\n entryId: string;\n name: string;\n collection: string;\n governsCount: number;\n}\n\nexport async function runContradictionCheck(\n name: string,\n description: string,\n): Promise<ContradictionWarning[]> {\n const warnings: ContradictionWarning[] = [];\n try {\n const keyTerms = tokenizeText(`${name} ${description}`)\n .filter((w) => w.length >= 4 && !STOP_WORDS.has(w))\n .slice(0, 8);\n\n if (keyTerms.length === 0) return warnings;\n\n const searchQuery = keyTerms.slice(0, 5).join(\" \");\n const [govResults, archResults] = await Promise.all([\n mcpQuery<any[]>(\"chain.searchEntries\", { query: searchQuery, collectionSlug: \"business-rules\" }),\n mcpQuery<any[]>(\"chain.searchEntries\", { query: searchQuery, collectionSlug: \"architecture\" }),\n ]);\n\n const allGov = [...(govResults ?? []), ...(archResults ?? [])].slice(0, 5);\n\n for (const entry of allGov) {\n const entryTokens = new Set(tokenizeText(`${entry.name} ${entry.data?.description ?? \"\"}`));\n const matched = keyTerms.filter((t) => entryTokens.has(t));\n if (matched.length < 3) continue;\n\n // Check for 'governs' relations\n let governsCount = 0;\n try {\n const relations = await mcpQuery<any[]>(\"chain.listEntryRelations\", {\n entryId: entry.entryId,\n });\n governsCount = (relations ?? []).filter((r: any) => r.type === \"governs\").length;\n } catch { /* non-critical */ }\n\n warnings.push({\n entryId: entry.entryId ?? \"\",\n name: entry.name,\n collection: entry.collectionSlug ?? \"\",\n governsCount,\n });\n }\n } catch {\n // Contradiction check is advisory — never blocks the operation\n }\n return warnings;\n}\n\n// ── Quality Coaching Helpers ──────────────────────────────────────────────\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n setTimeout(() => reject(new Error(\"quality coaching timeout\")), ms),\n ),\n ]);\n}\n\n/**\n * Format a full quality coaching result (from evaluateAtCapture / evaluateAtCommit)\n * for inclusion in MCP capture/commit responses.\n */\nexport function formatRubricCoaching(result: any): string {\n const { verdict, rogerMartin } = result;\n if (!verdict || verdict.criteria.length === 0) return \"\";\n\n const lines: string[] = [\"## Semantic Quality\"];\n const failed = (verdict.criteria ?? []).filter((c: any) => !c.passed);\n const total = verdict.criteria?.length ?? 0;\n const passedCount = total - failed.length;\n\n if (verdict.passed) {\n lines.push(`All ${total} rubric criteria pass for \\`${verdict.canonicalKey}\\` (${verdict.tier} tier).`);\n } else {\n lines.push(`${passedCount}/${total} criteria pass for \\`${verdict.canonicalKey}\\` (${verdict.tier} tier)`);\n lines.push(\"\");\n for (const c of verdict.criteria) {\n const icon = c.passed ? \"[x]\" : \"[ ]\";\n const extra = c.passed ? \"\" : ` — ${c.hint}`;\n lines.push(`${icon} ${c.id}${extra}`);\n }\n\n if (verdict.weakest) {\n lines.push(\"\");\n lines.push(`**Coaching hint:** ${verdict.weakest.hint}`);\n lines.push(`_Question to consider:_ ${verdict.weakest.questionTemplate}`);\n }\n }\n\n if (rogerMartin) {\n lines.push(\"\");\n lines.push(\"### Roger Martin Test\");\n if (rogerMartin.isStrategicChoice) {\n lines.push(\"This principle passes — the opposite is a reasonable strategic choice.\");\n } else {\n lines.push(`This principle may not be a strategic choice. ${rogerMartin.reasoning}`);\n if (rogerMartin.suggestion) {\n lines.push(`_Suggestion:_ ${rogerMartin.suggestion}`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a cached rubric verdict section for quality check responses.\n * SOS-e4r5cn: capability and visibility must ship together.\n */\nexport function formatRubricVerdictSection(verdict: any): string {\n if (!verdict || !verdict.criteria || verdict.criteria.length === 0) return \"\";\n\n const lines: string[] = [\"## Semantic Quality\"];\n const failed = verdict.criteria.filter((c: any) => !c.passed);\n const total = verdict.criteria.length;\n const passedCount = total - failed.length;\n\n const durationSuffix = verdict.llmDurationMs ? ` in ${(verdict.llmDurationMs / 1000).toFixed(1)}s` : '';\n const statusNote = verdict.llmStatus === 'pending'\n ? ' — LLM evaluation in progress...'\n : verdict.llmStatus === 'failed'\n ? ` — LLM evaluation failed${verdict.llmError ? `: ${verdict.llmError}` : ''}, showing heuristic results`\n : verdict.source === 'llm' && durationSuffix\n ? ` — evaluated${durationSuffix}`\n : '';\n\n if (failed.length === 0) {\n lines.push(`All ${total} rubric criteria pass for \\`${verdict.canonicalKey}\\` (${verdict.tier} tier, ${verdict.source} evaluation).${statusNote}`);\n } else {\n lines.push(`${passedCount}/${total} criteria pass for \\`${verdict.canonicalKey}\\` (${verdict.tier} tier, ${verdict.source} evaluation)${statusNote}`);\n lines.push(\"\");\n for (const c of verdict.criteria) {\n const icon = c.passed ? \"[x]\" : \"[ ]\";\n const extra = c.passed ? \"\" : ` — ${c.hint}`;\n lines.push(`${icon} ${c.id}${extra}`);\n }\n\n if (verdict.weakest) {\n lines.push(\"\");\n lines.push(`**Top improvement:** ${verdict.weakest.hint}`);\n }\n }\n\n if (verdict.rogerMartin) {\n const rm = verdict.rogerMartin;\n lines.push(\"\");\n lines.push(\"### Roger Martin Test\");\n if (rm.isStrategicChoice) {\n lines.push(`This is a real strategic choice — the opposite is reasonable. ${rm.reasoning}`);\n } else {\n lines.push(`This may not be a strategic choice. ${rm.reasoning}`);\n if (rm.suggestion) {\n lines.push(`_Suggestion:_ ${rm.suggestion}`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * MCP client — communicates with the Convex HTTP Action gateway.\n *\n * Dual mode:\n * stdio — single user, API key from env, module-level state\n * http — multi-user, API key from AsyncLocalStorage, per-key state\n *\n * Configuration:\n * PRODUCTBRAIN_API_KEY — pb_sk_* key (stdio mode; http mode gets it per-request)\n * CONVEX_SITE_URL — (optional) Convex deployment URL, defaults to cloud\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { trackToolCall } from \"./analytics.js\";\nimport { getRequestApiKey, getKeyState, type KeyState } from \"./auth.js\";\nimport { MCP_NPX_PACKAGE } from \"./cli/config-writer.js\";\n\n// ─── Tool Context (for audit action logging) ─────────────────────────────\n\nconst toolContextStore = new AsyncLocalStorage<{ tool: string; action?: string }>();\n\n/**\n * Run a callback with tool context for audit logging.\n * Compound tools should wrap their handler with this so health action=audit can distinguish\n * e.g. entries action=get from entries action=search.\n */\nexport function runWithToolContext<T>(\n ctx: { tool: string; action?: string },\n fn: () => T | Promise<T>,\n): T | Promise<T> {\n return toolContextStore.run(ctx, fn);\n}\n\nfunction getToolContext(): { tool: string; action?: string } | null {\n return toolContextStore.getStore() ?? null;\n}\n\nconst DEFAULT_CLOUD_URL = \"https://trustworthy-kangaroo-277.convex.site\";\n\n// ─── Read Cache (Batch A: sub-200ms repeat calls) ─────────────────────\n\nconst CACHE_TTL_MS = 60_000; // 60s per plan\nconst CACHEABLE_FNS = [\n \"chain.getOrientEntries\",\n \"chain.gatherContext\",\n \"chain.graphGatherContext\",\n \"chain.taskAwareGatherContext\",\n \"chain.journeyAwareGatherContext\",\n \"chain.assembleBuildContext\",\n] as const;\n\nfunction isCacheable(fn: string): boolean {\n return (CACHEABLE_FNS as readonly string[]).includes(fn);\n}\n\nconst READ_PATTERN =\n /^(chain\\.(get|list|search|batchGet|gather|graph|task|journey|assemble|workspace|score|absence)|maps\\.(get|list)|gitchain\\.(get|list|diff|history|runGate))/i;\n\nfunction isWrite(fn: string): boolean {\n if (fn.startsWith(\"agent.\")) return false;\n return !READ_PATTERN.test(fn);\n}\n\ninterface CacheEntry<T> {\n data: T;\n expiresAt: number;\n}\n\nconst readCache = new Map<string, CacheEntry<unknown>>();\n\nfunction cacheKey(fn: string, args: Record<string, unknown>): string {\n return `${fn}:${JSON.stringify(args)}`;\n}\n\nfunction getCached<T>(fn: string, args: Record<string, unknown>): T | undefined {\n if (!isCacheable(fn)) return undefined;\n const key = cacheKey(fn, args);\n const entry = readCache.get(key) as CacheEntry<T> | undefined;\n if (!entry || Date.now() > entry.expiresAt) {\n if (entry) readCache.delete(key);\n return undefined;\n }\n return entry.data;\n}\n\nfunction setCached<T>(fn: string, args: Record<string, unknown>, data: T): void {\n if (!isCacheable(fn)) return;\n const key = cacheKey(fn, args);\n readCache.set(key, { data, expiresAt: Date.now() + CACHE_TTL_MS });\n}\n\nfunction invalidateReadCache(): void {\n readCache.clear();\n}\n\n// ─── State Management ─────────────────────────────────────────────────\n\nconst _stdioState: KeyState = {\n workspaceId: null,\n workspaceSlug: null,\n workspaceName: null,\n workspaceCreatedAt: null,\n workspaceGovernanceMode: null,\n agentSessionId: null,\n apiKeyId: null,\n apiKeyScope: \"readwrite\",\n sessionOriented: false,\n sessionClosed: false,\n lastAccess: 0,\n};\n\n/**\n * Returns the active client state.\n * stdio: module-level singleton. http: per-API-key state from AsyncLocalStorage.\n */\nfunction state(): KeyState {\n const reqKey = getRequestApiKey();\n if (reqKey) return getKeyState(reqKey);\n return _stdioState;\n}\n\n/**\n * Returns the active API key (request-scoped in HTTP mode, env in stdio mode).\n */\nfunction getActiveApiKey(): string {\n const fromRequest = getRequestApiKey();\n if (fromRequest) return fromRequest;\n const fromEnv = process.env.PRODUCTBRAIN_API_KEY;\n if (!fromEnv) throw new Error(\"No API key available — set PRODUCTBRAIN_API_KEY or provide Bearer token\");\n return fromEnv;\n}\n\n// ─── Agent Session State ──────────────────────────────────────────────\n\nexport function getAgentSessionId(): string | null {\n return state().agentSessionId;\n}\n\nexport function isSessionOriented(): boolean {\n return state().sessionOriented;\n}\n\nexport function setSessionOriented(value: boolean): void {\n state().sessionOriented = value;\n}\n\nexport function getApiKeyScope(): \"read\" | \"readwrite\" {\n return state().apiKeyScope;\n}\n\nexport function isSessionClosed(): boolean {\n return state().sessionClosed;\n}\n\nexport interface AgentSessionStartResult {\n sessionId: string;\n initiatedBy: string;\n toolsScope: \"read\" | \"readwrite\";\n workspaceName: string;\n superseded: {\n previousSessionId: string;\n startedAt: string;\n initiatedBy: string;\n } | null;\n}\n\n/**\n * Start an agent session. Creates a session record in Convex.\n * toolsScope is derived server-side from the API key — not passed as a parameter.\n * If an active session exists, it gets superseded.\n */\nexport async function startAgentSession(): Promise<AgentSessionStartResult> {\n const workspaceId = await getWorkspaceId();\n const s = state();\n if (!s.apiKeyId) {\n throw new Error(\"Cannot start session: API key ID not resolved. Ensure workspace resolution completed.\");\n }\n\n const result = await mcpCall<AgentSessionStartResult>(\"agent.startSession\", {\n workspaceId,\n apiKeyId: s.apiKeyId,\n });\n\n s.agentSessionId = result.sessionId;\n s.apiKeyScope = result.toolsScope;\n s.sessionOriented = false;\n s.sessionClosed = false;\n resetTouchThrottle();\n\n return result;\n}\n\n/**\n * Close the current agent session. After this, write tools are blocked\n * even if the MCP connection stays open.\n */\nexport async function closeAgentSession(): Promise<void> {\n const s = state();\n if (!s.agentSessionId) return;\n try {\n await mcpCall(\"agent.closeSession\", {\n sessionId: s.agentSessionId,\n status: \"closed\",\n });\n } finally {\n s.sessionClosed = true;\n s.agentSessionId = null;\n s.sessionOriented = false;\n }\n}\n\n/**\n * Mark current session as orphaned (used on disconnect/crash).\n */\nexport async function orphanAgentSession(): Promise<void> {\n const s = state();\n if (!s.agentSessionId) return;\n try {\n await mcpCall(\"agent.closeSession\", {\n sessionId: s.agentSessionId,\n status: \"orphaned\",\n });\n } catch {\n // Best-effort on disconnect\n } finally {\n s.agentSessionId = null;\n s.sessionOriented = false;\n }\n}\n\n/**\n * Touch the session to update lastToolCallAt. Fire-and-forget.\n * Throttled to at most once per 5s to prevent OCC conflicts when\n * multiple tool calls complete in parallel.\n */\nlet _lastTouchAt = 0;\nconst TOUCH_THROTTLE_MS = 5_000;\n\nexport function touchSessionActivity(): void {\n const s = state();\n if (!s.agentSessionId) return;\n\n const now = Date.now();\n if (now - _lastTouchAt < TOUCH_THROTTLE_MS) return;\n _lastTouchAt = now;\n\n mcpCall(\"agent.touchSession\", {\n sessionId: s.agentSessionId,\n }).catch(() => {});\n}\n\nexport function resetTouchThrottle(): void {\n _lastTouchAt = 0;\n}\n\n/**\n * Record structured activity on the current session.\n */\nexport async function recordSessionActivity(activity: {\n entryCreated?: string;\n entryModified?: string;\n relationCreated?: boolean;\n gateFailure?: boolean;\n contradictionWarning?: boolean;\n strategyLinkWarnedForEntryId?: string;\n}): Promise<void> {\n const s = state();\n if (!s.agentSessionId) return;\n try {\n await mcpCall(\"agent.recordActivity\", {\n sessionId: s.agentSessionId,\n ...activity,\n });\n } catch {\n // Non-critical — don't fail the tool call over activity tracking\n }\n}\n\n// ─── Audit ────────────────────────────────────────────────────────────\n\nexport interface AuditEntry {\n ts: string;\n fn: string;\n workspace: string;\n status: \"ok\" | \"error\";\n durationMs: number;\n error?: string;\n /** For compound tools: tool name and action for audit display */\n toolContext?: { tool: string; action?: string };\n}\n\nconst AUDIT_BUFFER_SIZE = 50;\nconst auditBuffer: AuditEntry[] = [];\n\n/**\n * Bootstrap for stdio mode: set CONVEX_SITE_URL default and warn on missing key.\n * API key is validated lazily on first mcpCall so the server can start and handle\n * signals (SIGTERM) even before credentials are provided (e.g. in tests).\n */\nexport function bootstrap(): void {\n process.env.CONVEX_SITE_URL ??= process.env.PRODUCTBRAIN_URL ?? DEFAULT_CLOUD_URL;\n const pbKey = process.env.PRODUCTBRAIN_API_KEY;\n if (!pbKey?.startsWith(\"pb_sk_\")) {\n process.stderr.write(\n \"[MCP] Warning: PRODUCTBRAIN_API_KEY is not set or invalid. \" +\n \"Tool calls will fail until a valid key is provided.\\n\"\n );\n }\n}\n\n/**\n * Bootstrap for HTTP mode: only set CONVEX_SITE_URL.\n * API key validation happens per-request via Bearer token.\n */\nexport function bootstrapHttp(): void {\n process.env.CONVEX_SITE_URL ??= process.env.PRODUCTBRAIN_URL ?? DEFAULT_CLOUD_URL;\n}\n\n/** @deprecated Use bootstrap() instead. Alias kept for callers in transition. */\nexport const bootstrapCloudMode = bootstrap;\n\nfunction getEnv(key: string): string {\n const value = process.env[key];\n if (!value) throw new Error(`${key} environment variable is required`);\n return value;\n}\n\nfunction shouldLogAudit(status: \"ok\" | \"error\"): boolean {\n return status === \"error\" || process.env.MCP_DEBUG === \"1\";\n}\n\nfunction audit(fn: string, status: \"ok\" | \"error\", durationMs: number, errorMsg?: string): void {\n const ts = new Date().toISOString();\n const workspace = state().workspaceId ?? \"unresolved\";\n const toolCtx = getToolContext();\n\n const entry: AuditEntry = { ts, fn, workspace, status, durationMs };\n if (errorMsg) entry.error = errorMsg;\n if (toolCtx) entry.toolContext = toolCtx;\n auditBuffer.push(entry);\n if (auditBuffer.length > AUDIT_BUFFER_SIZE) auditBuffer.shift();\n\n trackToolCall(fn, status, durationMs, workspace, errorMsg);\n\n if (!shouldLogAudit(status)) return;\n\n const base = `[MCP-AUDIT] ${ts} fn=${fn} workspace=${workspace} status=${status} duration=${durationMs}ms`;\n if (status === \"error\" && errorMsg) {\n process.stderr.write(`${base} error=${JSON.stringify(errorMsg)}\\n`);\n } else {\n process.stderr.write(`${base}\\n`);\n }\n}\n\nexport function getAuditLog(): readonly AuditEntry[] {\n return auditBuffer;\n}\n\n// ─── HTTP Client ──────────────────────────────────────────────────────\n\n/**\n * Low-level call to the HTTP Action gateway.\n * Workspace scoping is enforced server-side from the API key — callers\n * don't need to (and can't) override the workspace.\n *\n * Read cache: orient and context-gather responses are cached for 60s.\n * Cache is invalidated on any write (safe-by-default: everything not\n * matching a known read pattern is treated as a write).\n */\nexport async function mcpCall<T>(fn: string, args: Record<string, unknown> = {}): Promise<T> {\n const cached = getCached<T>(fn, args);\n if (cached !== undefined) {\n return cached;\n }\n\n const siteUrl = getEnv(\"CONVEX_SITE_URL\").replace(/\\/$/, \"\");\n const apiKey = getActiveApiKey();\n\n const start = Date.now();\n\n let res: Response;\n try {\n res = await fetch(`${siteUrl}/api/mcp`, {\n method: \"POST\",\n signal: AbortSignal.timeout(10_000),\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ fn, args }),\n });\n } catch (err: any) {\n audit(fn, \"error\", Date.now() - start, err.message);\n throw new Error(`MCP call \"${fn}\" network error: ${err.message}`);\n }\n\n const json = (await res.json()) as { data?: T; error?: string };\n\n if (!res.ok || json.error) {\n audit(fn, \"error\", Date.now() - start, json.error);\n throw new Error(`MCP call \"${fn}\" failed (${res.status}): ${json.error ?? \"unknown error\"}`);\n }\n\n audit(fn, \"ok\", Date.now() - start);\n\n const data = json.data as T;\n if (isWrite(fn)) {\n invalidateReadCache();\n } else {\n setCached(fn, args, data);\n }\n\n const s = state();\n // Exclude session lifecycle calls from the heartbeat touch — they are setup/teardown,\n // not user-initiated tool calls. markOriented is excluded to prevent a concurrent\n // touchSession race on the same document (the Convex-side idempotency guard handles\n // it safely, but excluding here is cleaner and semantically correct).\n const TOUCH_EXCLUDED = new Set([\"agent.touchSession\", \"agent.startSession\", \"agent.markOriented\"]);\n if (s.agentSessionId && !TOUCH_EXCLUDED.has(fn)) {\n touchSessionActivity();\n }\n\n return data;\n}\n\n// ─── Workspace Resolution ─────────────────────────────────────────────\n\nconst resolveInFlightMap = new Map<string, Promise<string>>();\n\nexport async function getWorkspaceId(): Promise<string> {\n const s = state();\n if (s.workspaceId) return s.workspaceId;\n\n const apiKey = getActiveApiKey();\n const existing = resolveInFlightMap.get(apiKey);\n if (existing) return existing;\n\n const promise = resolveWorkspaceWithRetry().finally(() => resolveInFlightMap.delete(apiKey));\n resolveInFlightMap.set(apiKey, promise);\n return promise;\n}\n\nasync function resolveWorkspaceWithRetry(maxRetries = 2): Promise<string> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const workspace = await mcpCall<{\n _id: string;\n name: string;\n slug: string;\n createdAt?: number;\n keyScope?: string;\n keyId?: string;\n governanceMode?: \"open\" | \"consensus\" | \"role\";\n } | null>(\"resolveWorkspace\", {});\n\n if (!workspace) {\n throw new Error(\n \"API key is valid but no workspace is associated. \" +\n `Run \\`npx ${MCP_NPX_PACKAGE} setup\\` or regenerate your key.`\n );\n }\n\n const s = state();\n s.workspaceId = workspace._id;\n s.workspaceSlug = workspace.slug;\n s.workspaceName = workspace.name;\n s.workspaceCreatedAt = workspace.createdAt ?? null;\n s.workspaceGovernanceMode = workspace.governanceMode ?? \"open\";\n if (workspace.keyScope) s.apiKeyScope = workspace.keyScope as \"read\" | \"readwrite\";\n if (workspace.keyId) s.apiKeyId = workspace.keyId;\n return s.workspaceId;\n } catch (err: any) {\n lastError = err;\n const isTransient = /network error|fetch failed|ECONNREFUSED|ETIMEDOUT/i.test(err.message);\n if (!isTransient || attempt === maxRetries) break;\n const delay = 1000 * (attempt + 1);\n process.stderr.write(\n `[MCP] Workspace resolution failed (attempt ${attempt + 1}/${maxRetries + 1}), retrying in ${delay}ms...\\n`\n );\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n\n throw lastError!;\n}\n\nexport interface WorkspaceContext {\n workspaceId: string;\n workspaceSlug: string;\n workspaceName: string;\n createdAt: number | null;\n /** BET-76 FEAT-111: Cached from workspace resolution. Defaults to 'open'. */\n governanceMode: \"open\" | \"consensus\" | \"role\";\n}\n\nexport async function getWorkspaceContext(): Promise<WorkspaceContext> {\n const workspaceId = await getWorkspaceId();\n const s = state();\n return {\n workspaceId,\n workspaceSlug: s.workspaceSlug ?? \"unknown\",\n workspaceName: s.workspaceName ?? \"unknown\",\n createdAt: s.workspaceCreatedAt,\n governanceMode: s.workspaceGovernanceMode ?? \"open\",\n };\n}\n\nexport async function mcpQuery<T>(fn: string, args: Record<string, unknown> = {}): Promise<T> {\n const workspaceId = await getWorkspaceId();\n return mcpCall<T>(fn, { ...args, workspaceId });\n}\n\nexport async function mcpMutation<T>(fn: string, args: Record<string, unknown> = {}): Promise<T> {\n const workspaceId = await getWorkspaceId();\n return mcpCall<T>(fn, { ...args, workspaceId });\n}\n\n/**\n * Gate check: throws if no active, oriented session exists.\n *\n * Used for read tools that require session context per SOS-iszqu7:\n * structured Chain data for agent consumption requires an active session.\n * Lighter than requireWriteAccess — does not check key scope.\n */\nexport function requireActiveSession(): void {\n const s = state();\n\n if (!s.agentSessionId) {\n throw new Error(\n \"Active session required (SOS-iszqu7). Call `session action=start` then `orient` first.\"\n );\n }\n\n if (s.sessionClosed) {\n throw new Error(\n \"Session has been closed (SOS-iszqu7). Start a new session with `session action=start`.\"\n );\n }\n\n if (!s.sessionOriented) {\n throw new Error(\n \"Orientation required before accessing build context (SOS-iszqu7). Call `orient` first.\"\n );\n }\n}\n\n/**\n * Gate check: throws if the agent is not allowed to write.\n *\n * Enforces:\n * 1. Session must exist (always required — no REQUIRE_AGENT_SESSION flag)\n * 2. Session must not be closed\n * 3. Session must be oriented\n * 4. Key scope must be readwrite\n */\nexport function requireWriteAccess(): void {\n const s = state();\n\n if (!s.agentSessionId) {\n throw new Error(\n \"Agent session required for write operations. Call `session action=start` first.\"\n );\n }\n\n if (s.sessionClosed) {\n throw new Error(\n \"Agent session has been closed. Write tools are no longer available.\"\n );\n }\n\n if (!s.sessionOriented) {\n throw new Error(\n \"Orientation required before writing to the Chain. Call 'orient' first.\"\n );\n }\n\n if (s.apiKeyScope === \"read\") {\n throw new Error(\n \"This API key has read-only scope. Write tools are not available.\"\n );\n }\n}\n\n/**\n * Recover session orientation state from Convex on restart.\n * If the session is active and oriented in Convex, restore local state.\n */\nexport async function recoverSessionState(): Promise<void> {\n const s = state();\n if (!s.workspaceId) return;\n try {\n const session = await mcpCall<{\n _id: string;\n status: string;\n oriented: boolean;\n toolsScope: string;\n } | null>(\"agent.getActiveSession\", { workspaceId: s.workspaceId });\n\n if (session && session.status === \"active\") {\n s.agentSessionId = session._id;\n s.sessionOriented = session.oriented;\n s.apiKeyScope = session.toolsScope as \"read\" | \"readwrite\";\n s.sessionClosed = false;\n }\n } catch {\n // Recovery is best-effort\n }\n}\n","/**\n * Request-scoped auth for HTTP transport mode.\n *\n * stdio: API key from PRODUCTBRAIN_API_KEY env, one user per process.\n * http: API key from Bearer header per request, many users per process.\n *\n * AsyncLocalStorage propagates the token through the async call chain\n * so client.ts resolves the correct API key and state per request.\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\n// ── Request Context ─────────────────────────────────────────────────────\n\ninterface RequestAuth {\n apiKey: string;\n}\n\nconst requestStore = new AsyncLocalStorage<RequestAuth>();\n\nexport function runWithAuth<T>(auth: RequestAuth, fn: () => T | Promise<T>): T | Promise<T> {\n return requestStore.run(auth, fn);\n}\n\nexport function getRequestApiKey(): string | undefined {\n return requestStore.getStore()?.apiKey;\n}\n\n// ── Per-Key State (HTTP mode) ───────────────────────────────────────────\n\nexport interface KeyState {\n workspaceId: string | null;\n workspaceSlug: string | null;\n workspaceName: string | null;\n workspaceCreatedAt: number | null;\n /** BET-76 FEAT-111: Cached at workspace resolution time. Defaults to 'open'. */\n workspaceGovernanceMode: \"open\" | \"consensus\" | \"role\" | null;\n agentSessionId: string | null;\n apiKeyId: string | null;\n apiKeyScope: \"read\" | \"readwrite\";\n sessionOriented: boolean;\n sessionClosed: boolean;\n lastAccess: number;\n}\n\nconst SESSION_TTL_MS = 30 * 60 * 1000;\nconst MAX_KEYS = 100;\nconst keyStateMap = new Map<string, KeyState>();\n\nfunction newKeyState(): KeyState {\n return {\n workspaceId: null,\n workspaceSlug: null,\n workspaceName: null,\n workspaceCreatedAt: null,\n workspaceGovernanceMode: null,\n agentSessionId: null,\n apiKeyId: null,\n apiKeyScope: \"readwrite\",\n sessionOriented: false,\n sessionClosed: false,\n lastAccess: Date.now(),\n };\n}\n\nexport function getKeyState(apiKey: string): KeyState {\n let s = keyStateMap.get(apiKey);\n if (!s) {\n s = newKeyState();\n keyStateMap.set(apiKey, s);\n evictStale();\n }\n s.lastAccess = Date.now();\n return s;\n}\n\nfunction evictStale(): void {\n if (keyStateMap.size <= MAX_KEYS) return;\n const now = Date.now();\n for (const [key, s] of keyStateMap) {\n if (now - s.lastAccess > SESSION_TTL_MS) keyStateMap.delete(key);\n }\n if (keyStateMap.size > MAX_KEYS) {\n const sorted = [...keyStateMap.entries()].sort((a, b) => a[1].lastAccess - b[1].lastAccess);\n for (let i = 0; i < sorted.length - MAX_KEYS; i++) {\n keyStateMap.delete(sorted[i][0]);\n }\n }\n}\n","/**\n * Shared helpers for knowledge tools. Extracted from knowledge.ts for reuse\n * across entries, relations, graph, context, and collections compound tools.\n */\n\nexport function extractPreview(data: unknown, maxLen: number): string {\n if (!data || typeof data !== \"object\") return \"\";\n const d = data as Record<string, unknown>;\n const raw = d.description ?? d.canonical ?? d.detail ?? d.rule ?? \"\";\n if (typeof raw !== \"string\" || !raw) return \"\";\n return raw.length > maxLen ? raw.substring(0, maxLen) + \"...\" : raw;\n}\n\n/**\n * Canonical tool-name translation map.\n * Maps deprecated atomic tool names to their consolidated compound equivalents.\n * Used by context/orient to annotate stale references in historical content\n * (plans, docs, prototypes) without bulk-editing those files.\n */\nexport const TOOL_NAME_MIGRATIONS: ReadonlyMap<string, string> = new Map([\n [\"list-entries\", 'entries action=\"list\"'],\n [\"get-entry\", 'entries action=\"get\"'],\n [\"batch-get\", 'entries action=\"batch\"'],\n [\"search\", 'entries action=\"search\"'],\n [\"relate-entries\", 'relations action=\"create\"'],\n [\"batch-relate\", 'relations action=\"batch-create\"'],\n [\"find-related\", 'graph action=\"find\"'],\n [\"suggest-links\", 'graph action=\"suggest\"'],\n [\"gather-context\", 'context action=\"gather\"'],\n [\"get-build-context\", 'context action=\"build\"'],\n [\"list-collections\", 'collections action=\"list\"'],\n [\"create-collection\", 'collections action=\"create\"'],\n [\"update-collection\", 'collections action=\"update\"'],\n [\"agent-start\", 'session action=\"start\"'],\n [\"agent-close\", 'session action=\"close\"'],\n [\"agent-status\", 'session action=\"status\"'],\n [\"workspace-status\", 'health action=\"status\"'],\n [\"mcp-audit\", 'health action=\"audit\"'],\n [\"quality-check\", 'quality action=\"check\"'],\n [\"re-evaluate\", 'quality action=\"re-evaluate\"'],\n [\"list-workflows\", 'workflows action=\"list\"'],\n [\"workflow-checkpoint\", 'workflows action=\"checkpoint\"'],\n [\"wrapup\", \"session-wrapup\"],\n [\"finish\", \"session-wrapup\"],\n]);\n\n/**\n * Translates any deprecated tool names found in text to their current equivalents.\n * Returns null if no translations were needed, or a footnote string listing them.\n */\nexport function translateStaleToolNames(text: string): string | null {\n const found: string[] = [];\n for (const [old, current] of TOOL_NAME_MIGRATIONS) {\n const pattern = new RegExp(`\\\\b${old.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\b`, \"g\");\n if (pattern.test(text)) {\n found.push(`\\`${old}\\` → \\`${current}\\``);\n }\n }\n if (found.length === 0) return null;\n return `\\n\\n---\\n_Tool name translations (these references use deprecated names):_\\n${found.map(f => `- ${f}`).join(\"\\n\")}`;\n}\n","/**\n * Tool surface module — originally controlled write-tool visibility.\n *\n * Write tools are now always visible (all 31 from connection). Handler-level\n * guards (requireWriteAccess) enforce session + orient + key scope.\n *\n * Hiding tools via disable() broke Claude's lazy tool indexing — it never\n * re-indexed after list_changed notifications. The MCP spec says clients\n * SHOULD handle list_changed, but not all do.\n *\n * trackWriteTool() is kept as a no-op so existing registrations don't need\n * import changes. The module can be fully removed in a future cleanup pass.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nexport function initToolSurface(_server: McpServer): void {\n // Retained for call-site compatibility; no longer manages state.\n}\n\nexport function trackWriteTool(_tool: unknown): void {\n // No-op — tools stay enabled. Handler guards do the real protection.\n}\n","/**\n * Feature flag resolution — STD-feature-flag-hierarchy\n * Three-tier check: env kill switch > local dev override > PostHog remote.\n * Fail-closed: returns false when PostHog is unavailable or flag is unknown.\n */\nimport { PostHog } from \"posthog-node\";\n\nlet client: PostHog | null = null;\n\nconst LOCAL_OVERRIDES: Record<string, boolean> = {\n // Uncomment for local dev without PostHog:\n // \"workspace-full-surface\": false,\n // \"chainwork-enabled\": true,\n // \"active-intelligence-shaping\": true, // ENT-59: Opus-powered investigation during shaping\n // \"capture-without-thinking\": true, // BET-73: collection-optional capture classifier\n};\n\nexport function initFeatureFlags(posthogClient: PostHog | null): void {\n if (posthogClient) {\n client = posthogClient;\n return;\n }\n\n // Fallback: allow feature flags even when analytics tracking key is absent.\n const apiKey = process.env.POSTHOG_MCP_KEY || process.env.PUBLIC_POSTHOG_KEY;\n if (!apiKey) {\n client = null;\n return;\n }\n\n client = new PostHog(apiKey, {\n host: process.env.PUBLIC_POSTHOG_HOST || \"https://eu.i.posthog.com\",\n flushAt: 1,\n flushInterval: 5000,\n featureFlagsPollingInterval: 30_000,\n });\n}\n\nexport async function isFeatureEnabled(\n flag: string,\n workspaceId: string,\n workspaceSlug?: string,\n): Promise<boolean> {\n if (process.env.FEATURE_KILL_SWITCH === \"true\") return false;\n if (flag in LOCAL_OVERRIDES) return LOCAL_OVERRIDES[flag];\n if (!client) return false;\n try {\n const primary = await client.isFeatureEnabled(flag, workspaceId, {\n groups: { workspace: workspaceId },\n groupProperties: {\n workspace: {\n workspace_id: workspaceId,\n slug: workspaceSlug ?? \"\",\n },\n },\n });\n if (primary) return true;\n\n // Support slug-keyed group targeting used in dogfood rollout conditions.\n if (workspaceSlug && workspaceSlug !== workspaceId) {\n const secondary = await client.isFeatureEnabled(flag, workspaceSlug, {\n groups: { workspace: workspaceSlug },\n groupProperties: {\n workspace: {\n workspace_id: workspaceId,\n slug: workspaceSlug,\n },\n },\n });\n return secondary ?? false;\n }\n\n return primary ?? false;\n } catch {\n return false;\n }\n}\n","export const CLASSIFIER_AUTO_ROUTE_THRESHOLD = 70;\nexport const CLASSIFIER_AMBIGUITY_MARGIN = 15;\nexport const STARTER_COLLECTIONS = [\"decisions\", \"tensions\", \"glossary\", \"insights\", \"bets\"] as const;\n\nconst SIGNAL_WEIGHT = 10;\nconst MAX_MATCHES_PER_SIGNAL = 2;\nconst MAX_REASON_COUNT = 3;\n\nexport type StarterCollectionSlug = (typeof STARTER_COLLECTIONS)[number];\n\nexport type ClassificationResult = {\n collection: StarterCollectionSlug;\n topConfidence: number;\n // Backward-compatible alias for topConfidence.\n confidence: number;\n reasons: string[];\n candidates: Array<{\n collection: StarterCollectionSlug;\n // Backward-compatible alias for signalScore.\n confidence: number;\n signalScore: number;\n }>;\n scoreMargin: number;\n};\n\nconst STARTER_COLLECTION_SIGNALS: Record<StarterCollectionSlug, string[]> = {\n decisions: [\n \"decide\", \"decision\", \"chose\", \"chosen\", \"choice\", \"resolved\", \"we will\", \"we should\", \"approved\",\n ],\n tensions: [\n \"problem\", \"issue\", \"blocked\", \"blocker\", \"friction\", \"pain\", \"risk\", \"constraint\", \"bottleneck\", \"struggle\",\n ],\n glossary: [\n \"definition\", \"define\", \"term\", \"means\", \"refers to\", \"is called\", \"vocabulary\", \"terminology\",\n ],\n insights: [\n \"insight\", \"learned\", \"observed\", \"pattern\", \"trend\", \"signal\", \"found that\", \"evidence\",\n ],\n bets: [\n \"bet\", \"appetite\", \"scope\", \"elements\", \"rabbit hole\", \"no-go\", \"shape\", \"shaping\", \"done when\",\n ],\n};\n\nfunction escapeRegExp(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction countSignalMatches(text: string, signal: string): number {\n const trimmed = signal.trim().toLowerCase();\n if (!trimmed) return 0;\n\n const words = trimmed.split(/\\s+/).map(escapeRegExp);\n const pattern = `\\\\b${words.join(\"\\\\s+\")}\\\\b`;\n const regex = new RegExp(pattern, \"g\");\n const matches = text.match(regex);\n return matches?.length ?? 0;\n}\n\nexport function classifyStarterCollection(name: string, description: string): ClassificationResult | null {\n const text = `${name} ${description}`.toLowerCase();\n const rawScores: Array<{ collection: StarterCollectionSlug; score: number; reasons: string[] }> = [];\n\n for (const collection of STARTER_COLLECTIONS) {\n const signals = STARTER_COLLECTION_SIGNALS[collection];\n const reasons: string[] = [];\n let score = 0;\n\n for (const signal of signals) {\n const matches = countSignalMatches(text, signal);\n if (matches <= 0) continue;\n\n const cappedMatches = Math.min(matches, MAX_MATCHES_PER_SIGNAL);\n score += cappedMatches * SIGNAL_WEIGHT;\n\n if (reasons.length < MAX_REASON_COUNT) {\n const capNote = matches > cappedMatches ? ` (capped at ${cappedMatches})` : \"\";\n reasons.push(`matched \"${signal}\" x${matches}${capNote}`);\n }\n }\n\n rawScores.push({ collection, score, reasons });\n }\n\n rawScores.sort((a, b) => b.score - a.score);\n const top = rawScores[0];\n const second = rawScores[1];\n\n if (!top || top.score <= 0) return null;\n\n const margin = Math.max(0, top.score - (second?.score ?? 0));\n const baseConfidence = Math.min(90, top.score);\n const confidence = Math.min(99, baseConfidence + Math.min(20, margin));\n\n return {\n collection: top.collection,\n topConfidence: confidence,\n confidence,\n reasons: top.reasons,\n scoreMargin: margin,\n candidates: rawScores\n .filter((candidate) => candidate.score > 0)\n .slice(0, 3)\n .map((candidate) => ({\n collection: candidate.collection,\n signalScore: Math.min(99, candidate.score),\n confidence: Math.min(99, candidate.score),\n })),\n };\n}\n\nexport function shouldAutoRouteClassification(result: ClassificationResult): boolean {\n if (result.confidence < CLASSIFIER_AUTO_ROUTE_THRESHOLD) return false;\n if (result.scoreMargin < CLASSIFIER_AMBIGUITY_MARGIN) return false;\n return true;\n}\n\nexport function isClassificationAmbiguous(result: ClassificationResult): boolean {\n return result.scoreMargin < CLASSIFIER_AMBIGUITY_MARGIN;\n}\n","/**\n * Response Envelope — Agent-Native MCP Contract (BET-78)\n *\n * Universal response shape for all MCP tool responses.\n * Lives in structuredContent — zero breaking changes to content[0].text.\n *\n * Design: envelope IS structuredContent, not nested inside it.\n * Discriminated on `ok` for O(1) agent parsing.\n */\n\nimport { z, type ZodTypeAny } from \"zod\";\nimport { classifyError } from \"./errors.js\";\n\n// ─── Types ───────────────────────────────────────────────────────────────\n\nexport interface NextAction {\n tool: string;\n description: string;\n parameters: Record<string, unknown>;\n}\n\nexport interface EnvelopeMeta {\n durationMs?: number;\n}\n\nexport interface EnvelopeSuccess<T = Record<string, unknown>> {\n ok: true;\n summary: string;\n data: T;\n next?: NextAction[];\n _meta?: EnvelopeMeta;\n}\n\nexport interface EnvelopeError {\n ok: false;\n code: string;\n message: string;\n recovery?: string;\n availableActions?: NextAction[];\n diagnostics?: Record<string, unknown>;\n _meta?: EnvelopeMeta;\n}\n\nexport type Envelope<T = Record<string, unknown>> =\n | EnvelopeSuccess<T>\n | EnvelopeError;\n\n// ─── Builders ────────────────────────────────────────────────────────────\n\nexport function success<T>(\n summary: string,\n data: T,\n next?: NextAction[],\n): EnvelopeSuccess<T> {\n return {\n ok: true,\n summary: summary || \"Operation completed.\",\n data,\n ...(next?.length ? { next } : {}),\n };\n}\n\nexport function failure(\n code: string,\n message: string,\n recovery?: string,\n availableActions?: NextAction[],\n diagnostics?: Record<string, unknown>,\n): EnvelopeError {\n return {\n ok: false,\n code,\n message,\n ...(recovery ? { recovery } : {}),\n ...(availableActions?.length ? { availableActions } : {}),\n ...(diagnostics ? { diagnostics } : {}),\n };\n}\n\n/** Shorthand for NOT_FOUND failures — the most common soft-failure pattern. */\nexport function notFound(id: string, hint?: string): EnvelopeError {\n return failure(\n \"NOT_FOUND\",\n `Entry '${id}' not found.`,\n hint ?? \"Use entries action=search to find the correct ID.\",\n [{ tool: \"entries\", description: \"Search entries\", parameters: { action: \"search\", query: id } }],\n );\n}\n\n/** Shorthand for VALIDATION_ERROR failures. */\nexport function validationError(message: string): EnvelopeError {\n return failure(\"VALIDATION_ERROR\", message);\n}\n\n// ─── Tool Response Helpers ───────────────────────────────────────────────\n\ntype TextContent = { type: \"text\"; text: string };\ntype ToolResult = {\n content: TextContent[];\n structuredContent?: Record<string, unknown>;\n isError?: boolean;\n};\n\n/** Build a `content` array from a single text string. */\nexport function textContent(text: string): TextContent[] {\n return [{ type: \"text\" as const, text }];\n}\n\n/**\n * Parse args against a Zod schema and return a typed result or a ready-to-return\n * validation error ToolResult. Eliminates the 5-line parse+check+format boilerplate.\n */\nexport function parseOrFail<T extends z.ZodTypeAny>(\n schema: T,\n args: unknown,\n): { ok: true; data: z.infer<T> } | { ok: false; result: ToolResult } {\n const parsed = schema.safeParse(args);\n if (parsed.success) return { ok: true, data: parsed.data };\n const issues = parsed.error.issues\n .map((i: z.ZodIssue) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \");\n const msg = `Invalid arguments: ${issues}`;\n return {\n ok: false,\n result: { content: textContent(msg), structuredContent: validationError(msg) },\n };\n}\n\n/** Standard response for unknown compound-tool actions. */\nexport function unknownAction(action: string, valid: readonly string[]): ToolResult {\n const msg = `Unknown action '${action}'. Valid actions: ${valid.join(\", \")}.`;\n return { content: textContent(msg), structuredContent: validationError(msg) };\n}\n\n// ─── Compound Result Builders ─────────────────────────────────────────\n// Eliminate the { content: [...], structuredContent: ... } boilerplate.\n\n/** Success result with human-readable text + structured envelope in one call. */\nexport function successResult<T>(\n text: string,\n summary: string,\n data: T,\n next?: NextAction[],\n): ToolResult {\n return { content: textContent(text), structuredContent: success(summary, data, next) };\n}\n\n/** Failure result with human-readable text + structured error envelope. */\nexport function failureResult(\n text: string,\n code: string,\n message: string,\n recovery?: string,\n availableActions?: NextAction[],\n diagnostics?: Record<string, unknown>,\n): ToolResult {\n return { content: textContent(text), structuredContent: failure(code, message, recovery, availableActions, diagnostics) };\n}\n\n/** Not-found result — the most common soft failure pattern. */\nexport function notFoundResult(id: string, text?: string, hint?: string): ToolResult {\n return { content: textContent(text ?? `Entry '${id}' not found.`), structuredContent: notFound(id, hint) };\n}\n\n/** Validation error result where the text and error message are the same. */\nexport function validationResult(message: string): ToolResult {\n return { content: textContent(message), structuredContent: validationError(message) };\n}\n\n// ─── Zod Schema Helper ──────────────────────────────────────────────────\n\nconst nextActionSchema = z.object({\n tool: z.string(),\n description: z.string(),\n parameters: z.record(z.unknown()),\n});\n\nconst metaSchema = z.object({\n durationMs: z.number().optional(),\n}).optional();\n\n/**\n * Wraps any data schema into a discriminated-union envelope schema.\n * Use for contract tests: `envelopeSchema(captureOutputSchema).safeParse(result)`.\n */\nexport function envelopeSchema<T extends ZodTypeAny>(dataSchema: T) {\n return z.discriminatedUnion(\"ok\", [\n z.object({\n ok: z.literal(true),\n summary: z.string().min(1),\n data: dataSchema,\n next: z.array(nextActionSchema).optional(),\n _meta: metaSchema,\n }),\n z.object({\n ok: z.literal(false),\n code: z.string().min(1),\n message: z.string().min(1),\n recovery: z.string().optional(),\n availableActions: z.array(nextActionSchema).optional(),\n diagnostics: z.record(z.unknown()).optional(),\n _meta: metaSchema,\n }),\n ]);\n}\n\n// ─── withEnvelope HOF ───────────────────────────────────────────────────\n\n/**\n * Wraps a tool handler to guarantee an Envelope in structuredContent.\n *\n * - Catches thrown errors (gates, backend) and classifies them.\n * - If the handler already returns an envelope (ok field present), passes through.\n * - Adds _meta.durationMs to every response.\n * - Owns isError: sets true iff ok===false (RH1 mitigation — TEN-206).\n */\nexport function withEnvelope<Args>(\n handler: (args: Args) => Promise<ToolResult>,\n): (args: Args) => Promise<ToolResult> {\n return async (args: Args): Promise<ToolResult> => {\n const start = Date.now();\n try {\n const result = await handler(args);\n const durationMs = Date.now() - start;\n\n const sc = result.structuredContent as Envelope | undefined;\n if (sc && typeof sc === \"object\" && \"ok\" in sc) {\n sc._meta = { ...sc._meta, durationMs };\n return {\n content: result.content ?? [],\n structuredContent: sc,\n ...(sc.ok === false ? { isError: true } : {}),\n };\n }\n\n // Safety net: all tools should be migrated. If this executes, a handler\n // is returning without an envelope — log so it surfaces during development.\n console.warn(`[withEnvelope] Handler returned without envelope shape. Wrapping automatically. Content preview: \"${result.content?.[0]?.text?.slice(0, 60) ?? \"(empty)\"}\"`);\n return {\n content: result.content ?? [],\n structuredContent: {\n ...success(\n result.content?.[0]?.text?.slice(0, 100) ?? \"\",\n sc ?? {},\n ),\n _meta: { durationMs },\n },\n };\n } catch (err) {\n const durationMs = Date.now() - start;\n const classified = classifyError(err);\n const envelope: EnvelopeError = {\n ...failure(\n classified.code,\n classified.message,\n classified.recovery,\n classified.availableActions,\n ),\n _meta: { durationMs },\n };\n return {\n content: [{ type: \"text\" as const, text: classified.message }],\n structuredContent: envelope,\n isError: true,\n };\n }\n };\n}\n","/**\n * Structured error classification for the Response Envelope (BET-78, FEAT-121).\n *\n * Typed error classes + classifyError pattern-matching.\n * classifyError handles both typed classes (new code) and plain Error\n * messages from client.ts gates (existing code — no modifications needed).\n */\n\nimport type { NextAction } from \"./envelope.js\";\n\n// ─── Typed Error Classes ─────────────────────────────────────────────────\n\nexport class GateError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GateError\";\n }\n}\n\nexport class BackendError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BackendError\";\n }\n}\n\nexport class ValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ValidationError\";\n }\n}\n\n// ─── Classification Result ───────────────────────────────────────────────\n\nexport interface ClassifiedError {\n code: string;\n message: string;\n recovery?: string;\n availableActions?: NextAction[];\n}\n\n// ─── Gate Patterns (from client.ts requireWriteAccess / requireActiveSession) ─\n\ninterface GatePattern {\n pattern: RegExp;\n code: string;\n recovery: string;\n action: NextAction;\n}\n\nconst GATE_PATTERNS: GatePattern[] = [\n {\n pattern: /session required|no active.*session|call.*session.*start/i,\n code: \"SESSION_REQUIRED\",\n recovery: \"Start an agent session first.\",\n action: { tool: \"session\", description: \"Start session\", parameters: { action: \"start\" } },\n },\n {\n pattern: /session.*closed/i,\n code: \"SESSION_CLOSED\",\n recovery: \"Start a new session.\",\n action: { tool: \"session\", description: \"Start new session\", parameters: { action: \"start\" } },\n },\n {\n pattern: /orientation required|call.*orient/i,\n code: \"ORIENTATION_REQUIRED\",\n recovery: \"Orient before writing.\",\n action: { tool: \"orient\", description: \"Orient session\", parameters: {} },\n },\n {\n pattern: /read.?only.*scope/i,\n code: \"READONLY_SCOPE\",\n recovery: \"This API key cannot write. Use a readwrite key.\",\n action: { tool: \"health\", description: \"Check key scope\", parameters: { action: \"whoami\" } },\n },\n];\n\n// ─── Classification ──────────────────────────────────────────────────────\n\n/**\n * Classify an error into a structured code + recovery path.\n * Handles:\n * 1. Gate errors (from requireWriteAccess / requireActiveSession)\n * 2. Backend errors (network/connectivity)\n * 3. Not-found errors\n * 4. Validation errors\n * 5. Duplicate/conflict errors\n * 6. Fallback to INTERNAL_ERROR\n */\nexport function classifyError(err: unknown): ClassifiedError {\n const message = err instanceof Error ? err.message : String(err);\n\n if (err instanceof GateError) {\n return {\n code: \"PERMISSION_DENIED\",\n message,\n recovery: \"Check permissions or use a readwrite API key.\",\n availableActions: [{ tool: \"health\", description: \"Check key scope\", parameters: { action: \"whoami\" } }],\n };\n }\n\n if (err instanceof BackendError) {\n return { code: \"BACKEND_ERROR\", message, recovery: \"Retry the operation or check backend health.\" };\n }\n\n if (err instanceof ValidationError) {\n return { code: \"VALIDATION_ERROR\", message };\n }\n\n for (const { pattern, code, recovery, action } of GATE_PATTERNS) {\n if (pattern.test(message)) {\n return { code, message, recovery, availableActions: [action] };\n }\n }\n\n if (/network error|fetch failed|ECONNREFUSED|ETIMEDOUT/i.test(message)) {\n return { code: \"BACKEND_UNAVAILABLE\", message, recovery: \"Retry in a few seconds.\" };\n }\n\n if (/not found/i.test(message)) {\n return {\n code: \"NOT_FOUND\",\n message,\n recovery: \"Use entries action=search to find the correct ID.\",\n availableActions: [{ tool: \"entries\", description: \"Search entries\", parameters: { action: \"search\" } }],\n };\n }\n\n if (/duplicate|already exists/i.test(message)) {\n return {\n code: \"DUPLICATE\",\n message,\n recovery: \"Use entries action=get to inspect the existing entry.\",\n availableActions: [{ tool: \"entries\", description: \"Get entry\", parameters: { action: \"get\" } }],\n };\n }\n\n if (/invalid|validation|required field/i.test(message)) {\n return { code: \"VALIDATION_ERROR\", message };\n }\n\n return { code: \"INTERNAL_ERROR\", message: message || \"An unexpected error occurred.\" };\n}\n"],"mappings":"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","names":["z","AsyncLocalStorage","AsyncLocalStorage","passed","z","classified","classifierMeta"]}
|
|
@@ -34,7 +34,7 @@ import {
|
|
|
34
34
|
unknownAction,
|
|
35
35
|
validationResult,
|
|
36
36
|
withEnvelope
|
|
37
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-4ZJEIAA6.js";
|
|
38
38
|
import {
|
|
39
39
|
trackQualityCheck,
|
|
40
40
|
trackQualityVerdict
|
|
@@ -228,7 +228,7 @@ ${formatted}` }],
|
|
|
228
228
|
},
|
|
229
229
|
withEnvelope(async ({ entryId }) => {
|
|
230
230
|
requireWriteAccess();
|
|
231
|
-
const { runContradictionCheck } = await import("./smart-capture-
|
|
231
|
+
const { runContradictionCheck } = await import("./smart-capture-YIBXUP2H.js");
|
|
232
232
|
const entry = await mcpQuery("chain.getEntry", { entryId });
|
|
233
233
|
if (!entry) {
|
|
234
234
|
return notFoundResult(entryId, `Entry '${entryId}' not found. Try search to find the right ID.`);
|
|
@@ -5207,7 +5207,7 @@ async function handleCommitConstellation(args) {
|
|
|
5207
5207
|
}
|
|
5208
5208
|
let contradictionWarnings = [];
|
|
5209
5209
|
try {
|
|
5210
|
-
const { runContradictionCheck } = await import("./smart-capture-
|
|
5210
|
+
const { runContradictionCheck } = await import("./smart-capture-YIBXUP2H.js");
|
|
5211
5211
|
const descField = betData.problem ?? betData.description ?? "";
|
|
5212
5212
|
contradictionWarnings = await runContradictionCheck(
|
|
5213
5213
|
betEntry.name ?? betId,
|
|
@@ -10516,4 +10516,4 @@ export {
|
|
|
10516
10516
|
SERVER_VERSION,
|
|
10517
10517
|
createProductBrainServer
|
|
10518
10518
|
};
|
|
10519
|
-
//# sourceMappingURL=chunk-
|
|
10519
|
+
//# sourceMappingURL=chunk-RPESSNTC.js.map
|
package/dist/http.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SERVER_VERSION,
|
|
3
3
|
createProductBrainServer
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-RPESSNTC.js";
|
|
5
5
|
import {
|
|
6
6
|
bootstrapHttp,
|
|
7
7
|
initFeatureFlags,
|
|
8
8
|
runWithAuth
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-4ZJEIAA6.js";
|
|
10
10
|
import {
|
|
11
11
|
getPostHogClient,
|
|
12
12
|
initAnalytics,
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
SERVER_VERSION,
|
|
4
4
|
createProductBrainServer
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-RPESSNTC.js";
|
|
6
6
|
import {
|
|
7
7
|
bootstrap,
|
|
8
8
|
getAgentSessionId,
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
orphanAgentSession,
|
|
12
12
|
recoverSessionState,
|
|
13
13
|
startAgentSession
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-4ZJEIAA6.js";
|
|
15
15
|
import {
|
|
16
16
|
getPostHogClient,
|
|
17
17
|
initAnalytics,
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
isClassificationAmbiguous,
|
|
15
15
|
registerSmartCaptureTools,
|
|
16
16
|
runContradictionCheck
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-4ZJEIAA6.js";
|
|
18
18
|
import "./chunk-MRIO53BY.js";
|
|
19
19
|
export {
|
|
20
20
|
CLASSIFIER_AUTO_ROUTE_THRESHOLD,
|
|
@@ -33,4 +33,4 @@ export {
|
|
|
33
33
|
registerSmartCaptureTools,
|
|
34
34
|
runContradictionCheck
|
|
35
35
|
};
|
|
36
|
-
//# sourceMappingURL=smart-capture-
|
|
36
|
+
//# sourceMappingURL=smart-capture-YIBXUP2H.js.map
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/smart-capture.ts","../src/client.ts","../src/auth.ts","../src/tools/knowledge-helpers.ts","../src/tool-surface.ts","../src/featureFlags.ts","../src/tools/smart-capture-routing.ts","../src/envelope.ts","../src/errors.ts"],"sourcesContent":["/**\n * Smart capture — ARCH-node-mcp (Core layer)\n * Chain: FEAT-MCP-001 (MCP Server), ARCH-flow-smart-capture\n * Rules: SOS-016 (governed draft-first), SOS-015 (unique IDs within scope)\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation, getWorkspaceContext, requireWriteAccess, recordSessionActivity, getAgentSessionId } from \"../client.js\";\nimport {\n trackCaptureClassifierAutoRouted,\n trackCaptureClassifierEvaluated,\n trackCaptureClassifierFallback,\n trackQualityVerdict,\n trackQualityCheck,\n type ClassifierReasonCategory,\n} from \"../analytics.js\";\nimport { extractPreview } from \"./knowledge-helpers.js\";\nimport { trackWriteTool } from \"../tool-surface.js\";\nimport { isFeatureEnabled } from \"../featureFlags.js\";\nimport {\n STARTER_COLLECTIONS,\n classifyStarterCollection,\n isClassificationAmbiguous,\n shouldAutoRouteClassification,\n type StarterCollectionSlug,\n type ClassificationResult,\n} from \"./smart-capture-routing.js\";\nimport { withEnvelope, success, failure, type NextAction } from \"../envelope.js\";\n\nexport {\n CLASSIFIER_AUTO_ROUTE_THRESHOLD,\n STARTER_COLLECTIONS,\n classifyStarterCollection,\n isClassificationAmbiguous,\n type StarterCollectionSlug,\n type ClassificationResult,\n} from \"./smart-capture-routing.js\";\n\n// ── Collection Workflow Profiles ────────────────────────────────────────────\n\ninterface FieldDefault {\n key: string;\n value: unknown | \"today\" | \"infer\";\n}\n\ninterface QualityCheck {\n id: string;\n label: string;\n check: (ctx: CaptureContext) => boolean;\n suggestion?: (ctx: CaptureContext) => string;\n}\n\ninterface CollectionProfile {\n governedDraft: boolean;\n defaults: FieldDefault[];\n descriptionField: string;\n recommendedRelationTypes: string[];\n qualityChecks: QualityCheck[];\n inferField?: (ctx: CaptureContext) => Record<string, unknown>;\n}\n\ninterface CaptureContext {\n collection: string;\n name: string;\n description: string;\n context?: string;\n data: Record<string, unknown>;\n entryId: string;\n canonicalKey?: string;\n linksCreated: LinkResult[];\n linksSuggested: LinkSuggestion[];\n collectionFields: Array<{ key: string; type: string; required?: boolean }>;\n}\n\ninterface LinkResult {\n targetEntryId: string;\n targetName: string;\n targetCollection: string;\n relationType: string;\n linkReason?: string;\n}\n\ninterface LinkSuggestion {\n entryId?: string;\n name: string;\n collection: string;\n reason: string;\n preview: string;\n}\n\nconst AREA_KEYWORDS: Record<string, string[]> = {\n \"Architecture\": [\"convex\", \"schema\", \"database\", \"migration\", \"api\", \"backend\", \"infrastructure\", \"scaling\", \"performance\"],\n \"Chain\": [\"knowledge\", \"glossary\", \"entry\", \"collection\", \"terminology\", \"drift\", \"graph\", \"chain\", \"commit\"],\n \"AI & MCP Integration\": [\"mcp\", \"ai\", \"cursor\", \"agent\", \"tool\", \"llm\", \"prompt\", \"context\"],\n \"Developer Experience\": [\"dx\", \"developer\", \"ide\", \"workflow\", \"friction\", \"ceremony\"],\n \"Governance & Decision-Making\": [\"governance\", \"decision\", \"rule\", \"policy\", \"compliance\", \"approval\"],\n \"Analytics & Tracking\": [\"analytics\", \"posthog\", \"tracking\", \"event\", \"metric\", \"funnel\"],\n \"Security\": [\"security\", \"auth\", \"api key\", \"permission\", \"access\", \"token\"],\n};\n\nfunction inferArea(text: string): string {\n const lower = text.toLowerCase();\n let bestArea = \"\";\n let bestScore = 0;\n for (const [area, keywords] of Object.entries(AREA_KEYWORDS)) {\n const score = keywords.filter((kw) => lower.includes(kw)).length;\n if (score > bestScore) {\n bestScore = score;\n bestArea = area;\n }\n }\n return bestArea;\n}\n\nfunction inferDomain(text: string): string {\n return inferArea(text) || \"\";\n}\n\nconst COMMON_CHECKS: Record<string, QualityCheck> = {\n clearName: {\n id: \"clear-name\",\n label: \"Clear, specific name (not vague)\",\n check: (ctx) => ctx.name.length > 10 && ![\"new tension\", \"new entry\", \"untitled\", \"test\"].includes(ctx.name.toLowerCase()),\n suggestion: () => \"Rename to something specific — describe the actual problem or concept.\",\n },\n hasDescription: {\n id: \"has-description\",\n label: \"Description provided (>50 chars)\",\n check: (ctx) => ctx.description.length > 50,\n suggestion: () => \"Add a fuller description explaining context and impact.\",\n },\n hasRelations: {\n id: \"has-relations\",\n label: \"At least 1 relation created\",\n check: (ctx) => ctx.linksCreated.length >= 1,\n suggestion: () => \"Use `graph action=suggest` and `relations action=create` to add more connections.\",\n },\n diverseRelations: {\n id: \"diverse-relations\",\n label: \"Relations span multiple collections\",\n check: (ctx) => {\n const colls = new Set(ctx.linksCreated.map((l) => l.targetCollection));\n return colls.size >= 2;\n },\n suggestion: () => \"Try linking to entries in different collections (glossary, business-rules, strategy).\",\n },\n hasType: {\n id: \"has-type\",\n label: \"Has canonical type\",\n check: (ctx) => !!ctx.data?.canonicalKey || !!ctx.canonicalKey,\n suggestion: () => \"Classify this entry with a canonical type for better context assembly. Use update-entry to set canonicalKey.\",\n },\n};\n\nconst PROFILES: Map<string, CollectionProfile> = new Map([\n [\"tensions\", {\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [\n { key: \"priority\", value: \"medium\" },\n { key: \"date\", value: \"today\" },\n { key: \"raised\", value: \"infer\" },\n { key: \"severity\", value: \"infer\" },\n ],\n recommendedRelationTypes: [\"surfaces_tension_in\", \"references\", \"belongs_to\", \"related_to\"],\n inferField: (ctx: CaptureContext) => {\n const fields: Record<string, unknown> = {};\n const text = `${ctx.name} ${ctx.description}`;\n const area = inferArea(text);\n if (area) fields.raised = area;\n if (text.toLowerCase().includes(\"critical\") || text.toLowerCase().includes(\"blocker\")) {\n fields.severity = \"critical\";\n } else if (text.toLowerCase().includes(\"bottleneck\") || text.toLowerCase().includes(\"scaling\") || text.toLowerCase().includes(\"breaking\")) {\n fields.severity = \"high\";\n } else {\n fields.severity = \"medium\";\n }\n if (area) fields.affectedArea = area;\n return fields;\n },\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n {\n id: \"has-severity\",\n label: \"Severity specified\",\n check: (ctx) => !!ctx.data.severity && ctx.data.severity !== \"\",\n suggestion: (ctx) => {\n const text = `${ctx.name} ${ctx.description}`.toLowerCase();\n const inferred = text.includes(\"critical\") ? \"critical\" : text.includes(\"bottleneck\") ? \"high\" : \"medium\";\n return `Set severity — suggest: ${inferred} (based on description keywords).`;\n },\n },\n {\n id: \"has-affected-area\",\n label: \"Affected area identified\",\n check: (ctx) => !!ctx.data.affectedArea && ctx.data.affectedArea !== \"\",\n suggestion: (ctx) => {\n const area = inferArea(`${ctx.name} ${ctx.description}`);\n return area\n ? `Set affectedArea — suggest: \"${area}\" (inferred from content).`\n : \"Specify which product area or domain this tension impacts.\";\n },\n },\n ],\n }],\n\n [\"business-rules\", {\n governedDraft: true,\n descriptionField: \"description\",\n defaults: [\n { key: \"severity\", value: \"medium\" },\n { key: \"domain\", value: \"infer\" },\n ],\n recommendedRelationTypes: [\"governs\", \"references\", \"conflicts_with\", \"related_to\"],\n inferField: (ctx: CaptureContext) => {\n const fields: Record<string, unknown> = {};\n const domain = inferDomain(`${ctx.name} ${ctx.description}`);\n if (domain) fields.domain = domain;\n return fields;\n },\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n {\n id: \"has-rationale\",\n label: \"Rationale provided\",\n check: (ctx) => typeof ctx.data.rationale === \"string\" && ctx.data.rationale.length > 10,\n suggestion: () => \"Add a rationale explaining why this rule exists via `update-entry`.\",\n },\n {\n id: \"has-domain\",\n label: \"Domain specified\",\n check: (ctx) => !!ctx.data.domain && ctx.data.domain !== \"\",\n suggestion: (ctx) => {\n const domain = inferDomain(`${ctx.name} ${ctx.description}`);\n return domain\n ? `Set domain — suggest: \"${domain}\" (inferred from content).`\n : \"Specify the business domain this rule belongs to.\";\n },\n },\n ],\n }],\n\n [\"glossary\", {\n governedDraft: true,\n descriptionField: \"canonical\",\n defaults: [\n { key: \"category\", value: \"infer\" },\n ],\n recommendedRelationTypes: [\"defines_term_for\", \"confused_with\", \"related_to\", \"references\"],\n inferField: (ctx: CaptureContext) => {\n const fields: Record<string, unknown> = {};\n const area = inferArea(`${ctx.name} ${ctx.description}`);\n if (area) {\n const categoryMap: Record<string, string> = {\n \"Architecture\": \"Platform & Architecture\",\n \"Chain\": \"Knowledge Management\",\n \"AI & MCP Integration\": \"AI & Developer Tools\",\n \"Developer Experience\": \"AI & Developer Tools\",\n \"Governance & Decision-Making\": \"Governance & Process\",\n \"Analytics & Tracking\": \"Platform & Architecture\",\n \"Security\": \"Platform & Architecture\",\n };\n fields.category = categoryMap[area] ?? \"\";\n }\n return fields;\n },\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasType,\n {\n id: \"has-canonical\",\n label: \"Canonical definition provided (>20 chars)\",\n check: (ctx) => {\n const canonical = ctx.data.canonical;\n return typeof canonical === \"string\" && canonical.length > 20;\n },\n suggestion: () => \"Add a clear canonical definition — this is the single source of truth for this term.\",\n },\n COMMON_CHECKS.hasRelations,\n {\n id: \"has-category\",\n label: \"Category assigned\",\n check: (ctx) => !!ctx.data.category && ctx.data.category !== \"\",\n suggestion: () => \"Assign a category (e.g., 'Platform & Architecture', 'Governance & Process').\",\n },\n ],\n }],\n\n [\"decisions\", {\n governedDraft: false,\n descriptionField: \"rationale\",\n defaults: [\n { key: \"date\", value: \"today\" },\n { key: \"decidedBy\", value: \"infer\" },\n ],\n recommendedRelationTypes: [\"informs\", \"references\", \"replaces\", \"related_to\"],\n inferField: (ctx: CaptureContext) => {\n const fields: Record<string, unknown> = {};\n const area = inferArea(`${ctx.name} ${ctx.description}`);\n if (area) fields.decidedBy = area;\n return fields;\n },\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasType,\n {\n id: \"has-rationale\",\n label: \"Rationale provided (>30 chars)\",\n check: (ctx) => {\n const rationale = ctx.data.rationale;\n return typeof rationale === \"string\" && rationale.length > 30;\n },\n suggestion: () => \"Explain why this decision was made — what was considered and rejected?\",\n },\n COMMON_CHECKS.hasRelations,\n {\n id: \"has-date\",\n label: \"Decision date recorded\",\n check: (ctx) => !!ctx.data.date && ctx.data.date !== \"\",\n suggestion: () => \"Record when this decision was made.\",\n },\n ],\n }],\n\n [\"features\", {\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [] as FieldDefault[],\n recommendedRelationTypes: [\"belongs_to\", \"depends_on\", \"surfaces_tension_in\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n {\n id: \"has-owner\",\n label: \"Owner assigned\",\n check: (ctx: CaptureContext) => !!ctx.data.owner && ctx.data.owner !== \"\",\n suggestion: () => \"Assign an owner team or product area.\",\n },\n {\n id: \"has-rationale\",\n label: \"Rationale documented\",\n check: (ctx: CaptureContext) => !!ctx.data.rationale && String(ctx.data.rationale).length > 20,\n suggestion: () => \"Explain why this feature matters — what problem does it solve?\",\n },\n ],\n } satisfies CollectionProfile],\n\n [\"audiences\", {\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [],\n recommendedRelationTypes: [\"fills_slot\", \"informs\", \"related_to\", \"references\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n {\n id: \"has-behaviors\",\n label: \"Behaviors described\",\n check: (ctx) => typeof ctx.data.behaviors === \"string\" && ctx.data.behaviors.length > 20,\n suggestion: () => \"Describe how this audience segment behaves — what do they do, what tools do they use?\",\n },\n ],\n }],\n\n [\"strategy\", {\n governedDraft: true,\n descriptionField: \"description\",\n defaults: [],\n recommendedRelationTypes: [\"informs\", \"governs\", \"belongs_to\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n COMMON_CHECKS.diverseRelations,\n ],\n }],\n\n [\"bets\", { // BET-chain-native-constellation, DEC-70 (structuredContent), STA-1 (constellation pattern)\n governedDraft: false,\n descriptionField: \"problem\",\n defaults: [],\n recommendedRelationTypes: [\"part_of\", \"constrains\", \"informs\", \"depends_on\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n ],\n }],\n\n [\"maps\", {\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [],\n recommendedRelationTypes: [\"fills_slot\", \"references\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n ],\n }],\n\n [\"chains\", {\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [],\n recommendedRelationTypes: [\"informs\", \"references\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n ],\n }],\n\n [\"principles\", {\n governedDraft: true,\n descriptionField: \"description\",\n defaults: [\n { key: \"severity\", value: \"high\" },\n { key: \"category\", value: \"infer\" },\n ],\n recommendedRelationTypes: [\"governs\", \"informs\", \"references\", \"related_to\"],\n inferField: (ctx: CaptureContext) => {\n const fields: Record<string, unknown> = {};\n const area = inferArea(`${ctx.name} ${ctx.description}`);\n if (area) {\n const categoryMap: Record<string, string> = {\n \"Architecture\": \"Engineering\",\n \"Chain\": \"Product\",\n \"AI & MCP Integration\": \"Engineering\",\n \"Developer Experience\": \"Engineering\",\n \"Governance & Decision-Making\": \"Business\",\n \"Analytics & Tracking\": \"Product\",\n \"Security\": \"Engineering\",\n };\n fields.category = categoryMap[area] ?? \"Product\";\n }\n return fields;\n },\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n {\n id: \"has-rationale\",\n label: \"Rationale provided — why this principle matters\",\n check: (ctx) => typeof ctx.data.rationale === \"string\" && ctx.data.rationale.length > 20,\n suggestion: () => \"Explain why this principle exists and what goes wrong without it.\",\n },\n ],\n }],\n\n [\"standards\", {\n governedDraft: true,\n descriptionField: \"description\",\n defaults: [],\n recommendedRelationTypes: [\"governs\", \"defines_term_for\", \"references\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n ],\n }],\n\n [\"tracking-events\", {\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [],\n recommendedRelationTypes: [\"references\", \"belongs_to\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n ],\n }],\n\n [\"insights\", {\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [\n { key: \"evidenceStrength\", value: \"anecdotal\" },\n ],\n recommendedRelationTypes: [\"validates\", \"invalidates\", \"informs\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n {\n id: \"has-evidence-link\",\n label: \"Evidence link exists (validates or invalidates)\",\n check: (ctx) => ctx.linksCreated.some((l) => l.relationType === \"validates\" || l.relationType === \"invalidates\"),\n suggestion: () => \"Link this insight to the assumption or claim it validates/invalidates using `relations action=create type=validates`.\",\n },\n {\n id: \"has-source\",\n label: \"Source documented\",\n check: (ctx) => !!ctx.data?.source && String(ctx.data.source).length > 0,\n suggestion: () => \"Document where this insight came from (research, data, user interview, etc.).\",\n },\n ],\n }],\n\n [\"assumptions\", {\n governedDraft: false,\n descriptionField: \"belief\",\n defaults: [\n { key: \"risk\", value: \"medium\" },\n { key: \"evidenceStrength\", value: \"unvalidated\" },\n ],\n recommendedRelationTypes: [\"depends_on\", \"informs\", \"related_to\", \"validates\", \"invalidates\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n {\n id: \"has-belief\",\n label: \"Belief statement provided (>30 chars)\",\n check: (ctx) => !!ctx.data?.belief && String(ctx.data.belief).length > 30,\n suggestion: () => \"Write the assumption as a clear, testable belief statement.\",\n },\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n {\n id: \"has-test-method\",\n label: \"Test method described\",\n check: (ctx) => !!ctx.data?.testMethod && String(ctx.data.testMethod).length > 0,\n suggestion: () => \"Describe how this assumption could be tested or validated.\",\n },\n ],\n }],\n]);\n\nconst FALLBACK_PROFILE: CollectionProfile = {\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [],\n recommendedRelationTypes: [\"related_to\", \"references\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n COMMON_CHECKS.hasType,\n ],\n};\n\n// ── Auto-Linking Logic ──────────────────────────────────────────────────────\n\nfunction extractSearchTerms(name: string, description: string): string {\n const text = `${name} ${description}`;\n return text\n .replace(/[^\\w\\s]/g, \" \")\n .split(/\\s+/)\n .filter((w) => w.length > 3)\n .slice(0, 8)\n .join(\" \");\n}\n\ninterface LinkConfidenceResult {\n score: number;\n reason: string;\n}\n\nfunction computeLinkConfidence(\n candidate: { name: string; data?: any; entryId?: string },\n sourceName: string,\n sourceDescription: string,\n sourceCollection: string,\n candidateCollection: string,\n): LinkConfidenceResult {\n const text = `${sourceName} ${sourceDescription}`.toLowerCase();\n const candidateName = candidate.name.toLowerCase();\n let score = 0;\n const reasons: string[] = [];\n\n if (text.includes(candidateName) && candidateName.length > 3) {\n score += 40;\n reasons.push(\"name match\");\n }\n\n const candidateWords = candidateName.split(/\\s+/).filter((w) => w.length > 3);\n const matchingWords = candidateWords.filter((w) => text.includes(w));\n const wordScore = (matchingWords.length / Math.max(candidateWords.length, 1)) * 30;\n score += wordScore;\n if (matchingWords.length > 0) {\n reasons.push(`word overlap (${matchingWords.slice(0, 3).join(\", \")})`);\n }\n\n const HUB_COLLECTIONS = new Set([\"strategy\", \"features\"]);\n if (HUB_COLLECTIONS.has(candidateCollection)) {\n score += 15;\n reasons.push(\"hub collection\");\n }\n\n if (candidateCollection !== sourceCollection) {\n score += 10;\n reasons.push(\"cross-collection\");\n }\n\n const finalScore = Math.min(score, 100);\n const reason = reasons.length > 0 ? reasons.join(\" + \") : \"low relevance\";\n return { score: finalScore, reason };\n}\n\ninterface RelationTypeResult {\n type: string;\n reason: string;\n}\n\nfunction inferRelationType(\n sourceCollection: string,\n targetCollection: string,\n profile: CollectionProfile,\n): RelationTypeResult {\n const typeMap: Record<string, Record<string, string>> = {\n tensions: {\n glossary: \"surfaces_tension_in\",\n \"business-rules\": \"references\",\n strategy: \"belongs_to\",\n features: \"surfaces_tension_in\",\n decisions: \"references\",\n },\n \"business-rules\": {\n glossary: \"references\",\n features: \"governs\",\n strategy: \"belongs_to\",\n tensions: \"references\",\n },\n glossary: {\n features: \"defines_term_for\",\n \"business-rules\": \"references\",\n strategy: \"references\",\n },\n decisions: {\n features: \"informs\",\n \"business-rules\": \"references\",\n strategy: \"references\",\n tensions: \"references\",\n },\n };\n\n const mapped = typeMap[sourceCollection]?.[targetCollection];\n const type = mapped ?? profile.recommendedRelationTypes[0] ?? \"related_to\";\n const reason = mapped\n ? `collection pair (${sourceCollection} → ${targetCollection})`\n : `profile default (${profile.recommendedRelationTypes[0] ?? \"related_to\"})`;\n return { type, reason };\n}\n\n// ── Quality Scoring ─────────────────────────────────────────────────────────\n\ninterface QualityResult {\n score: number;\n maxScore: number;\n checks: Array<{ id: string; label: string; passed: boolean; suggestion?: string }>;\n}\n\nfunction scoreQuality(ctx: CaptureContext, profile: CollectionProfile): QualityResult {\n const checks = profile.qualityChecks.map((qc) => {\n const passed = qc.check(ctx);\n return {\n id: qc.id,\n label: qc.label,\n passed,\n suggestion: passed ? undefined : qc.suggestion?.(ctx),\n };\n });\n\n const passed = checks.filter((c) => c.passed).length;\n const total = checks.length;\n const score = total > 0 ? Math.round((passed / total) * 10) : 10;\n\n return { score, maxScore: 10, checks };\n}\n\nexport function formatQualityReport(result: QualityResult): string {\n const failed = result.checks.filter((c) => !c.passed);\n const reason = failed.length > 0\n ? ` because ${failed.map((c) => c.suggestion ?? c.label.toLowerCase()).join(\"; \")}`\n : \"\";\n const lines: string[] = [`## Quality: ${result.score}/${result.maxScore}${reason}`];\n for (const check of result.checks) {\n const icon = check.passed ? \"[x]\" : \"[ ]\";\n const suggestion = check.passed ? \"\" : ` — ${check.suggestion ?? check.label}`;\n lines.push(`${icon} ${check.label}${suggestion}`);\n }\n return lines.join(\"\\n\");\n}\n\n// ── Exported: quality check for existing entries ─────────────────────────────\n\nexport async function checkEntryQuality(entryId: string): Promise<{ text: string; quality: QualityResult }> {\n const entry = await mcpQuery<any>(\"chain.getEntry\", { entryId });\n if (!entry) {\n return {\n text: `Entry \\`${entryId}\\` not found. Try search to find the right ID.`,\n quality: { score: 0, maxScore: 10, checks: [] },\n };\n }\n\n const collections = await mcpQuery<any[]>(\"chain.listCollections\");\n const collMap = new Map<string, string>();\n for (const c of collections) collMap.set(c._id, c.slug);\n const collectionSlug = collMap.get(entry.collectionId) ?? \"unknown\";\n\n const profile = PROFILES.get(collectionSlug) ?? FALLBACK_PROFILE;\n\n const relations = await mcpQuery<any[]>(\"chain.listEntryRelations\", { entryId });\n const linksCreated: LinkResult[] = [];\n for (const r of relations) {\n const otherId = r.fromId === entry._id ? r.toId : r.fromId;\n linksCreated.push({\n targetEntryId: otherId,\n targetName: \"\",\n targetCollection: \"\",\n relationType: r.type,\n });\n }\n\n const descField = profile.descriptionField;\n const description = typeof entry.data?.[descField] === \"string\" ? entry.data[descField] : \"\";\n\n const ctx: CaptureContext = {\n collection: collectionSlug,\n name: entry.name,\n description,\n data: entry.data ?? {},\n entryId: entry.entryId ?? \"\",\n canonicalKey: entry.canonicalKey,\n linksCreated,\n linksSuggested: [],\n collectionFields: [],\n };\n\n const quality = scoreQuality(ctx, profile);\n\n const lines: string[] = [\n `# Quality Check: ${entry.entryId ?? entry.name}`,\n `**${entry.name}** in \\`${collectionSlug}\\` [${entry.status}]`,\n \"\",\n formatQualityReport(quality),\n ];\n\n if (quality.score < 10) {\n const failedChecks = quality.checks.filter((c) => !c.passed && c.suggestion);\n if (failedChecks.length > 0) {\n lines.push(\"\");\n lines.push(`_To improve: use \\`update-entry\\` to fill missing fields, or \\`relations action=create\\` to add connections._`);\n }\n }\n\n return { text: lines.join(\"\\n\"), quality };\n}\n\n// ── Tool Registration ───────────────────────────────────────────────────────\n\nconst GOVERNED_COLLECTIONS = new Set([\n \"glossary\", \"business-rules\", \"principles\", \"standards\", \"strategy\", \"features\",\n]);\n\nconst AUTO_LINK_CONFIDENCE_THRESHOLD = 35;\nconst MAX_AUTO_LINKS = 5;\nconst MAX_SUGGESTIONS = 5;\nconst CAPTURE_WITHOUT_THINKING_FLAG = \"capture-without-thinking\";\n\nexport const captureSchema = z.object({\n collection: z.string().optional().describe(\"Collection slug, e.g. 'tensions', 'business-rules', 'glossary', 'decisions'. Optional when `capture-without-thinking` is enabled.\"),\n name: z.string().describe(\"Display name — be specific (e.g. 'Convex adjacency list won't scale for graph traversal')\"),\n description: z.string().describe(\"Full context — what's happening, why it matters, what you observed\"),\n context: z.string().optional().describe(\"Optional additional context (e.g. 'Observed during context gather calls taking 700ms+')\"),\n entryId: z.string().optional().describe(\"Optional custom entry ID (e.g. 'TEN-my-id'). Auto-generated if omitted.\"),\n canonicalKey: z.string().optional().describe(\"Semantic type (e.g. 'decision', 'tension', 'vision'). Auto-assigned from collection if omitted.\"),\n data: z.record(z.unknown()).optional().describe(\"Explicit field values when you know the schema (e.g. canonical_key, cardinality_rule, required_fields). Merged with inferred values; user-provided wins.\"),\n links: z.array(z.object({\n to: z.string().describe(\"Target entry ID (e.g. 'BR-64', 'ARCH-8')\"),\n type: z.string().describe(\"Relation type (e.g. 'governs', 'related_to', 'informs')\"),\n })).optional().describe(\"Relations to create after capture. Skips auto-link discovery when provided.\"),\n autoCommit: z.boolean().optional().describe(\"If true, commits the entry immediately after capture + linking. Use for ungoverned collections or when you're certain.\"),\n});\n\nexport const batchCaptureSchema = z.object({\n entries: z.array(z.object({\n collection: z.string().describe(\"Collection slug\"),\n name: z.string().describe(\"Display name\"),\n description: z.string().describe(\"Full context / definition\"),\n entryId: z.string().optional().describe(\"Optional custom entry ID\"),\n })).min(1).max(50).describe(\"Array of entries to capture\"),\n});\n\nexport const captureClassifierSchema = z.object({\n enabled: z.boolean(),\n autoRouted: z.boolean(),\n topConfidence: z.number(),\n // Backward-compatible alias for topConfidence.\n confidence: z.number(),\n reasons: z.array(z.string()),\n candidates: z.array(\n z.object({\n collection: z.enum(STARTER_COLLECTIONS),\n signalScore: z.number(),\n // Backward-compatible alias for signalScore.\n confidence: z.number(),\n }),\n ),\n});\n\nexport type CaptureClassifierMetadata = z.infer<typeof captureClassifierSchema>;\n\ntype CaptureToolResult = {\n content: Array<{ type: \"text\"; text: string }>;\n structuredContent?: z.infer<typeof captureOutputSchema>;\n};\n\ntype CollectionResolution = {\n resolvedCollection?: string;\n classifierMeta?: CaptureClassifierMetadata;\n earlyResult?: CaptureToolResult;\n};\n\nfunction trackClassifierTelemetry(params: {\n workspaceId: string;\n predictedCollection: string;\n confidence: number;\n autoRouted: boolean;\n reasonCategory: ClassifierReasonCategory;\n explicitCollectionProvided: boolean;\n outcome: \"auto-routed\" | \"fallback\";\n}): void {\n const telemetry = {\n predicted_collection: params.predictedCollection,\n confidence: params.confidence,\n auto_routed: params.autoRouted,\n reason_category: params.reasonCategory,\n explicit_collection_provided: params.explicitCollectionProvided,\n };\n\n trackCaptureClassifierEvaluated(params.workspaceId, telemetry);\n if (params.outcome === \"auto-routed\") {\n trackCaptureClassifierAutoRouted(params.workspaceId, telemetry);\n return;\n }\n trackCaptureClassifierFallback(params.workspaceId, telemetry);\n}\n\nfunction buildCollectionRequiredResult(): CaptureToolResult {\n return {\n content: [{\n type: \"text\" as const,\n text:\n \"Collection is required unless `capture-without-thinking` is enabled.\\n\\n\" +\n \"Provide `collection` explicitly, or enable the feature flag for this workspace.\",\n }],\n structuredContent: failure(\n \"VALIDATION_ERROR\",\n \"Collection is required unless capture-without-thinking is enabled.\",\n \"Provide collection explicitly, or enable the feature flag.\",\n [{ tool: \"collections\", description: \"List available collections\", parameters: { action: \"list\" } }],\n ),\n };\n}\n\nfunction buildClassifierUnknownResult(): CaptureToolResult {\n return {\n content: [{\n type: \"text\" as const,\n text:\n \"I could not infer a collection confidently from this input.\\n\\n\" +\n \"Please provide `collection`, or rewrite with clearer intent (decision/problem/definition/insight/bet).\",\n }],\n structuredContent: failure(\n \"VALIDATION_ERROR\",\n \"Could not infer collection from input.\",\n \"Provide collection explicitly, or rewrite with clearer intent.\",\n [{ tool: \"collections\", description: \"List available collections\", parameters: { action: \"list\" } }],\n { classifier: { enabled: true, autoRouted: false, topConfidence: 0, confidence: 0, candidates: [] } },\n ),\n };\n}\n\nfunction buildProvisionedCollectionSuggestions(\n candidates: Array<{ collection: StarterCollectionSlug; signalScore: number; confidence: number }>,\n): string {\n return candidates.length\n ? candidates\n .map((c) => `- \\`${c.collection}\\` (${c.signalScore}% signal score)`)\n .join(\"\\n\")\n : \"- No provisioned starter collection candidates were inferred confidently.\";\n}\n\nfunction buildUnsupportedProvisioningResult(\n classified: ClassificationResult,\n provisionedCandidates: Array<{ collection: StarterCollectionSlug; signalScore: number; confidence: number }>,\n): CaptureToolResult {\n const suggestions = buildProvisionedCollectionSuggestions(provisionedCandidates);\n const textBody =\n `Collection inference is not safe to auto-route yet.\\n\\n` +\n `Predicted collection \\`${classified.collection}\\` is not provisioned/supported for auto-routing in this workspace.\\n` +\n `Reason: ${classified.reasons.join(\"; \") || \"low signal\"}\\n\\n` +\n \"Choose one of these provisioned starter collections and retry with `collection`:\\n\" +\n `${suggestions}\\n\\n` +\n \"Correction path: rerun with explicit `collection`.\";\n return {\n content: [{ type: \"text\" as const, text: textBody }],\n structuredContent: failure(\n \"VALIDATION_ERROR\",\n `Collection '${classified.collection}' is not provisioned for auto-routing.`,\n \"Rerun with explicit collection.\",\n [{ tool: \"collections\", description: \"List available collections\", parameters: { action: \"list\" } }],\n {\n classifier: {\n enabled: true,\n autoRouted: false,\n topConfidence: classified.topConfidence,\n confidence: classified.confidence,\n reasons: classified.reasons,\n candidates: provisionedCandidates.map((c) => ({ collection: c.collection, signalScore: c.signalScore, confidence: c.confidence })),\n },\n },\n ),\n };\n}\n\nfunction buildAmbiguousRouteResult(\n classified: ClassificationResult,\n classifierMeta: CaptureClassifierMetadata,\n ambiguousRoute: boolean,\n): CaptureToolResult {\n const suggestions = buildProvisionedCollectionSuggestions(classifierMeta.candidates);\n const textBody =\n \"Collection inference is not safe to auto-route yet.\\n\\n\" +\n (ambiguousRoute ? \"Routing held because intent is ambiguous across top candidates.\\n\\n\" : \"\") +\n `Predicted: \\`${classified.collection}\\` (${classified.topConfidence}% top confidence)\\n` +\n `Reason: ${classified.reasons.join(\"; \") || \"low signal\"}\\n\\n` +\n \"Choose one of these and retry with `collection`:\\n\" +\n `${suggestions}\\n\\n` +\n \"Correction path: if this was close, rerun with your chosen `collection`.\";\n return {\n content: [{ type: \"text\" as const, text: textBody }],\n structuredContent: failure(\n \"VALIDATION_ERROR\",\n ambiguousRoute\n ? `Ambiguous routing — top candidates too close (${classified.topConfidence}% confidence).`\n : `Low confidence routing to '${classified.collection}' (${classified.topConfidence}%).`,\n \"Rerun with explicit collection.\",\n classifierMeta.candidates.map((c) => ({\n tool: \"capture\",\n description: `Capture to ${c.collection}`,\n parameters: { collection: c.collection },\n })),\n { classifier: classifierMeta },\n ),\n };\n}\n\nasync function getProvisionedStarterCollectionCandidates(\n classified: ClassificationResult,\n supportedStarterCollections: Set<StarterCollectionSlug>,\n): Promise<{\n provisionedStarterCollections: Set<StarterCollectionSlug>;\n provisionedCandidates: Array<{ collection: StarterCollectionSlug; signalScore: number; confidence: number }>;\n}> {\n const allCollections = await mcpQuery<any[]>(\"chain.listCollections\");\n const provisionedStarterCollections = new Set<StarterCollectionSlug>(\n (allCollections ?? [])\n .map((collection) => collection.slug)\n .filter(\n (slug): slug is StarterCollectionSlug =>\n supportedStarterCollections.has(slug as StarterCollectionSlug),\n ),\n );\n const provisionedCandidates = classified.candidates.filter((candidate) =>\n provisionedStarterCollections.has(candidate.collection),\n );\n return { provisionedStarterCollections, provisionedCandidates };\n}\n\nasync function resolveCaptureCollection(params: {\n collection?: string;\n name: string;\n description: string;\n classifierFlagOn: boolean;\n supportedStarterCollections: Set<StarterCollectionSlug>;\n workspaceId: string;\n explicitCollectionProvided: boolean;\n}): Promise<CollectionResolution> {\n const {\n collection,\n name,\n description,\n classifierFlagOn,\n supportedStarterCollections,\n workspaceId,\n explicitCollectionProvided,\n } = params;\n if (collection) {\n return { resolvedCollection: collection };\n }\n if (!classifierFlagOn) {\n return { earlyResult: buildCollectionRequiredResult() };\n }\n\n const classified = classifyStarterCollection(name, description);\n if (!classified) {\n trackClassifierTelemetry({\n workspaceId,\n predictedCollection: \"unknown\",\n confidence: 0,\n autoRouted: false,\n reasonCategory: \"low-confidence\",\n explicitCollectionProvided,\n outcome: \"fallback\",\n });\n return { earlyResult: buildClassifierUnknownResult() };\n }\n\n const { provisionedStarterCollections, provisionedCandidates } =\n await getProvisionedStarterCollectionCandidates(classified, supportedStarterCollections);\n\n if (!provisionedStarterCollections.has(classified.collection)) {\n trackClassifierTelemetry({\n workspaceId,\n predictedCollection: classified.collection,\n confidence: classified.confidence,\n autoRouted: false,\n reasonCategory: \"non-provisioned\",\n explicitCollectionProvided,\n outcome: \"fallback\",\n });\n return {\n earlyResult: buildUnsupportedProvisioningResult(classified, provisionedCandidates),\n };\n }\n\n const autoRoute = shouldAutoRouteClassification(classified);\n const ambiguousRoute = isClassificationAmbiguous(classified);\n const classifierMeta: CaptureClassifierMetadata = {\n enabled: true,\n autoRouted: autoRoute,\n topConfidence: classified.topConfidence,\n confidence: classified.confidence,\n reasons: classified.reasons,\n candidates: provisionedCandidates,\n };\n\n if (!autoRoute) {\n trackClassifierTelemetry({\n workspaceId,\n predictedCollection: classified.collection,\n confidence: classified.confidence,\n autoRouted: false,\n reasonCategory: ambiguousRoute ? \"ambiguous\" : \"low-confidence\",\n explicitCollectionProvided,\n outcome: \"fallback\",\n });\n return {\n classifierMeta,\n earlyResult: buildAmbiguousRouteResult(classified, classifierMeta, ambiguousRoute),\n };\n }\n\n trackClassifierTelemetry({\n workspaceId,\n predictedCollection: classified.collection,\n confidence: classified.confidence,\n autoRouted: true,\n reasonCategory: \"auto-routed\",\n explicitCollectionProvided,\n outcome: \"auto-routed\",\n });\n\n return {\n resolvedCollection: classified.collection,\n classifierMeta,\n };\n}\n\nconst captureSuccessOutputSchema = z.object({\n entryId: z.string(),\n collection: z.string(),\n name: z.string(),\n status: z.enum([\"draft\", \"committed\"]),\n qualityScore: z.number(),\n qualityVerdict: z.record(z.unknown()).optional(),\n classifier: captureClassifierSchema.optional(),\n studioUrl: z.string().optional(),\n}).strict();\n\nconst captureClassifierOnlyOutputSchema = z.object({\n classifier: captureClassifierSchema,\n}).strict();\n\nexport const captureOutputSchema = z.union([\n captureSuccessOutputSchema,\n captureClassifierOnlyOutputSchema,\n]);\n\nexport const batchCaptureOutputSchema = z.object({\n captured: z.array(z.object({\n entryId: z.string(),\n collection: z.string(),\n name: z.string(),\n })),\n total: z.number(),\n failed: z.number(),\n failedEntries: z.array(z.object({\n index: z.number(),\n collection: z.string(),\n name: z.string(),\n error: z.string(),\n })).optional(),\n});\n\nexport function registerSmartCaptureTools(server: McpServer) {\n const supportedStarterCollections = new Set<StarterCollectionSlug>(\n STARTER_COLLECTIONS.filter((slug) => PROFILES.has(slug)),\n );\n\n const captureTool = server.registerTool(\n \"capture\",\n {\n title: \"Capture\",\n description:\n \"The single tool for creating knowledge entries. Creates an entry, auto-links related entries, \" +\n \"and returns a quality scorecard — all in one call. \" +\n \"Provide a name and description; `collection` is optional when `capture-without-thinking` is enabled.\\n\\n\" +\n \"Supported collections with smart profiles: tensions, business-rules, glossary, decisions, features, \" +\n \"audiences, strategy, standards, maps, bets, insights, assumptions, principles, tracking-events.\\n\" +\n \"All other collections get an ENT-{random} ID and sensible defaults.\\n\\n\" +\n \"**Explicit data:** When you know the schema, pass `data: { field: value }` to set fields directly. \" +\n \"Top-level `name` and `description` always win for those fields. `data` wins over inference for all other fields.\\n\\n\" +\n \"**Compound capture:** Pass `links` to create relations in the same call (skips auto-link discovery). \" +\n \"Pass `autoCommit: true` to promote the entry from draft to SSOT immediately after linking. \" +\n \"Governed collections (glossary, business-rules, principles, standards, strategy, features) \" +\n \"will warn but still commit — use only when you're certain.\\n\\n\" +\n \"Always creates as 'draft' unless `autoCommit` is true. Use `update-entry` for post-creation adjustments.\",\n inputSchema: captureSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n },\n withEnvelope(async ({ collection, name, description, context, entryId, canonicalKey, data: userData, links, autoCommit }) => {\n requireWriteAccess();\n\n const wsCtx = await getWorkspaceContext();\n const explicitCollectionProvided = typeof collection === \"string\" && collection.trim().length > 0;\n const classifierFlagOn = await isFeatureEnabled(\n CAPTURE_WITHOUT_THINKING_FLAG,\n wsCtx.workspaceId,\n wsCtx.workspaceSlug,\n );\n\n const resolution = await resolveCaptureCollection({\n collection,\n name,\n description,\n classifierFlagOn,\n supportedStarterCollections,\n workspaceId: wsCtx.workspaceId,\n explicitCollectionProvided,\n });\n if (resolution.earlyResult) {\n return resolution.earlyResult;\n }\n const resolvedCollection = resolution.resolvedCollection;\n const classifierMeta = resolution.classifierMeta;\n if (!resolvedCollection) {\n return buildCollectionRequiredResult();\n }\n\n const profile = PROFILES.get(resolvedCollection) ?? FALLBACK_PROFILE;\n\n const col = await mcpQuery<any>(\"chain.getCollection\", { slug: resolvedCollection });\n if (!col) {\n const displayName = resolvedCollection.split(\"-\").map((w: string) => w.charAt(0).toUpperCase() + w.slice(1)).join(\" \");\n return {\n content: [{\n type: \"text\" as const,\n text:\n `Collection \\`${resolvedCollection}\\` not found.\\n\\n` +\n `**To create it**, run:\\n` +\n `\\`\\`\\`\\ncollections action=create slug=\"${resolvedCollection}\" name=\"${displayName}\" description=\"...\"\\n\\`\\`\\`\\n\\n` +\n `Or use \\`collections action=list\\` to see available collections.`,\n }],\n structuredContent: failure(\n \"NOT_FOUND\",\n `Collection '${resolvedCollection}' not found.`,\n \"Create the collection first, or use collections action=list to see available ones.\",\n [\n { tool: \"collections\", description: \"Create collection\", parameters: { action: \"create\", slug: resolvedCollection, name: displayName } },\n { tool: \"collections\", description: \"List collections\", parameters: { action: \"list\" } },\n ],\n ),\n };\n }\n\n // 2. Build data with profile defaults + inference\n const data: Record<string, unknown> = {};\n const today = new Date().toISOString().split(\"T\")[0];\n\n for (const field of col.fields ?? []) {\n const key = field.key as string;\n if (key === profile.descriptionField) {\n data[key] = description;\n } else if (field.type === \"array\" || field.type === \"multi-select\") {\n data[key] = [];\n } else if (field.type === \"select\") {\n // Skip — empty string is not a valid option for select fields\n } else {\n data[key] = \"\";\n }\n }\n\n for (const def of profile.defaults) {\n if (def.value === \"today\") {\n data[def.key] = today;\n } else if (def.value !== \"infer\") {\n data[def.key] = def.value;\n }\n }\n\n if (profile.inferField) {\n const inferred = profile.inferField({\n collection: resolvedCollection, name, description, context, data, entryId: \"\",\n linksCreated: [], linksSuggested: [], collectionFields: col.fields ?? [],\n });\n for (const [key, val] of Object.entries(inferred)) {\n if (val !== undefined && val !== \"\") {\n data[key] = val;\n }\n }\n }\n\n // Merge user-provided data (wins over inference for those fields)\n if (userData && typeof userData === \"object\") {\n for (const [key, val] of Object.entries(userData)) {\n if (key !== \"name\") data[key] = val;\n }\n }\n\n // Top-level description always wins\n data[profile.descriptionField || \"description\"] = description;\n\n // 3. Determine status\n const status = \"draft\";\n\n // 4. Create entry (Convex generates sequential ID when entryId not provided)\n let finalEntryId: string;\n let internalId: string;\n try {\n const agentId = getAgentSessionId();\n const result = await mcpMutation<{ docId: string; entryId: string }>(\"chain.createEntry\", {\n collectionSlug: resolvedCollection,\n entryId: entryId ?? undefined,\n name,\n status,\n data,\n canonicalKey,\n createdBy: agentId ? `agent:${agentId}` : \"capture\",\n sessionId: agentId ?? undefined,\n });\n internalId = result.docId;\n finalEntryId = result.entryId;\n\n await recordSessionActivity({ entryCreated: internalId });\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes(\"Duplicate\") || msg.includes(\"already exists\")) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# Cannot Capture — Duplicate Detected\\n\\n${msg}\\n\\nUse \\`entries action=get\\` to inspect the existing entry, or \\`update-entry\\` to modify it.`,\n }],\n structuredContent: failure(\n \"DUPLICATE\",\n msg,\n \"Use entries action=get to inspect the existing entry.\",\n [\n { tool: \"entries\", description: \"Get existing entry\", parameters: { action: \"get\", entryId: entryId ?? name } },\n { tool: \"update-entry\", description: \"Update existing entry\", parameters: { entryId: entryId ?? \"\" } },\n ],\n ),\n };\n }\n throw error;\n }\n\n // 6. Discover and auto-link related entries\n const linksCreated: LinkResult[] = [];\n const linksSuggested: LinkSuggestion[] = [];\n const userLinkResults: Array<{ label: string; ok: boolean }> = [];\n\n const skipAutoDiscovery = links && links.length > 0;\n const searchQuery = extractSearchTerms(name, description);\n if (searchQuery && !skipAutoDiscovery) {\n const [searchResults, allCollections] = await Promise.all([\n mcpQuery<any[]>(\"chain.searchEntries\", { query: searchQuery }),\n mcpQuery<any[]>(\"chain.listCollections\"),\n ]);\n\n const collMap = new Map<string, string>();\n for (const c of allCollections) collMap.set(c._id, c.slug);\n\n const candidates = (searchResults ?? [])\n .filter((r) => r.entryId !== finalEntryId && r._id !== internalId)\n .map((r) => {\n const conf = computeLinkConfidence(r, name, description, resolvedCollection, collMap.get(r.collectionId) ?? \"unknown\");\n return {\n ...r,\n collSlug: collMap.get(r.collectionId) ?? \"unknown\",\n confidence: conf.score,\n confidenceReason: conf.reason,\n };\n })\n .sort((a, b) => b.confidence - a.confidence);\n\n // Auto-link high-confidence matches\n for (const c of candidates) {\n if (linksCreated.length >= MAX_AUTO_LINKS) break;\n if (c.confidence < AUTO_LINK_CONFIDENCE_THRESHOLD) break;\n if (!c.entryId || !finalEntryId) continue;\n\n const { type: relationType, reason: relationReason } = inferRelationType(resolvedCollection, c.collSlug, profile);\n try {\n await mcpMutation(\"chain.createEntryRelation\", {\n fromEntryId: finalEntryId,\n toEntryId: c.entryId,\n type: relationType,\n });\n linksCreated.push({\n targetEntryId: c.entryId,\n targetName: c.name,\n targetCollection: c.collSlug,\n relationType,\n linkReason: `confidence ${c.confidence} (${(c as any).confidenceReason}) + ${relationReason}`,\n });\n } catch {\n // Relation creation failed (e.g. entry not found) — skip silently\n }\n }\n\n // Collect suggestions for remaining candidates\n const linkedIds = new Set(linksCreated.map((l) => l.targetEntryId));\n for (const c of candidates) {\n if (linksSuggested.length >= MAX_SUGGESTIONS) break;\n if (linkedIds.has(c.entryId)) continue;\n if (c.confidence < 10) continue;\n\n const preview = extractPreview(c.data, 80);\n const reason = c.confidence >= AUTO_LINK_CONFIDENCE_THRESHOLD\n ? \"high relevance (already linked)\"\n : `\"${c.name.toLowerCase().split(/\\s+/).filter((w: string) => `${name} ${description}`.toLowerCase().includes(w) && w.length > 3).slice(0, 2).join('\", \"')}\" appears in content`;\n\n linksSuggested.push({\n entryId: c.entryId,\n name: c.name,\n collection: c.collSlug,\n reason,\n preview,\n });\n }\n }\n\n // 6b. Create user-specified links\n if (links && links.length > 0 && finalEntryId) {\n for (const link of links) {\n try {\n await mcpMutation(\"chain.createEntryRelation\", {\n fromEntryId: finalEntryId,\n toEntryId: link.to,\n type: link.type,\n });\n userLinkResults.push({ label: `✓ ${link.type} → ${link.to}`, ok: true });\n linksCreated.push({\n targetEntryId: link.to,\n targetName: link.to,\n targetCollection: \"unknown\",\n relationType: link.type,\n });\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : \"failed\";\n userLinkResults.push({ label: `✗ ${link.type} → ${link.to}: ${msg}`, ok: false });\n }\n }\n }\n\n // 7. Score quality\n const captureCtx: CaptureContext = {\n collection: resolvedCollection,\n name,\n description,\n context,\n data,\n entryId: finalEntryId,\n canonicalKey,\n linksCreated,\n linksSuggested,\n collectionFields: col.fields ?? [],\n };\n const quality = scoreQuality(captureCtx, profile);\n\n // 8. Cardinality check for singleton types\n let cardinalityWarning: string | null = null;\n const resolvedCK = canonicalKey ?? (captureCtx as any).canonicalKey;\n if (resolvedCK) {\n try {\n const check = await mcpQuery<any>(\"chain.checkCardinalityWarning\", {\n canonicalKey: resolvedCK,\n });\n if (check?.warning) {\n cardinalityWarning = check.warning;\n }\n } catch {\n // Advisory — capture succeeds without cardinality check\n }\n }\n\n // 9. Keyword contradiction check against governance entries\n const contradictionWarnings = await runContradictionCheck(name, description);\n if (contradictionWarnings.length > 0) {\n await recordSessionActivity({ contradictionWarning: true });\n }\n\n // 10. Quality coaching (heuristic instant, LLM scheduled in background)\n let coachingSection = \"\";\n let verdictResult: any = null;\n try {\n verdictResult = await mcpMutation<any>(\"quality.evaluateHeuristicAndSchedule\", {\n entryId: finalEntryId,\n context: \"capture\",\n });\n if (verdictResult?.verdict && verdictResult.verdict.tier !== \"passive\" && verdictResult.verdict.criteria.length > 0) {\n coachingSection = formatRubricCoaching(verdictResult);\n }\n } catch {\n // Quality coaching is advisory — capture succeeds without it\n }\n\n // 11. Track quality verdict\n if (verdictResult?.verdict) {\n try {\n const wsForTracking = await getWorkspaceContext();\n const v = verdictResult.verdict;\n const failedCount = (v.criteria ?? []).filter((c: any) => !c.passed).length;\n trackQualityVerdict(wsForTracking.workspaceId, {\n entry_id: finalEntryId,\n entry_type: v.canonicalKey ?? resolvedCollection,\n tier: v.tier,\n context: \"capture\",\n passed: v.passed,\n source: verdictResult.source ?? \"heuristic\",\n criteria_total: v.criteria?.length ?? 0,\n criteria_failed: failedCount,\n llm_scheduled: v.tier !== \"passive\",\n });\n } catch { /* tracking is advisory */ }\n }\n\n // 12. Auto-commit if requested (or defaulted via Open governance mode).\n // BET-76 FEAT-111: When autoCommit is not explicitly set, default to true for\n // Open mode workspaces. Consensus/role modes retain draft-first behavior.\n // Agent-inferred entries (e.g. project scan) should pass autoCommit=false explicitly.\n const shouldAutoCommit =\n autoCommit === true ||\n (autoCommit === undefined && wsCtx.governanceMode === \"open\");\n\n let finalStatus: \"draft\" | \"committed\" = \"draft\";\n let commitError: string | null = null;\n if (shouldAutoCommit && finalEntryId) {\n try {\n await mcpMutation(\"chain.commitEntry\", { entryId: finalEntryId });\n finalStatus = \"committed\";\n await recordSessionActivity({ entryModified: internalId });\n } catch (e: unknown) {\n commitError = e instanceof Error ? e.message : \"unknown error\";\n // Store as draft with error flag — do not throw silently (BET-76 RH4)\n }\n }\n\n // 13. Format response\n const lines: string[] = [\n `# Captured: ${finalEntryId || name}`,\n `**${name}** added to \\`${resolvedCollection}\\` as \\`${finalStatus}\\``,\n `**Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})`,\n ];\n\n if (classifierMeta?.autoRouted) {\n lines.push(\"\");\n lines.push(\"## Collection routing\");\n lines.push(`Auto-routed to \\`${resolvedCollection}\\` (${classifierMeta.topConfidence}% top confidence).`);\n if (classifierMeta.reasons.length > 0) {\n lines.push(`Reason: ${classifierMeta.reasons.join(\"; \")}.`);\n }\n lines.push(\"Correction path: rerun capture with explicit `collection` if this routing is wrong.\");\n }\n\n // BET-chain-native-constellation: Studio link for bets — DEC-70 (structuredContent studioUrl)\n const appUrl = process.env.PRODUCTBRAIN_APP_URL ?? \"https://productbrain.io\";\n const studioUrl =\n resolvedCollection === \"bets\"\n ? `${appUrl.replace(/\\/$/, \"\")}/w/${wsCtx.workspaceSlug}/studio/${internalId}`\n : undefined;\n if (studioUrl) {\n lines.push(\"\");\n lines.push(`**View in Studio:** ${studioUrl}`);\n }\n\n if (linksCreated.length > 0) {\n lines.push(\"\");\n lines.push(`## Auto-linked (${linksCreated.length})`);\n for (const link of linksCreated) {\n const reason = (link as any).linkReason ? ` — because ${(link as any).linkReason}` : \"\";\n lines.push(`- -> **${link.relationType}** ${link.targetEntryId}: ${link.targetName} [${link.targetCollection}]${reason}`);\n }\n }\n\n if (userLinkResults.length > 0) {\n lines.push(\"\");\n lines.push(\"## Requested links\");\n for (const r of userLinkResults) lines.push(`- ${r.label}`);\n }\n\n if (finalStatus === \"committed\") {\n const wasAutoCommitted = autoCommit === undefined && wsCtx.governanceMode === \"open\";\n lines.push(\"\");\n lines.push(`## Committed: ${finalEntryId}`);\n if (wasAutoCommitted) {\n lines.push(`**${name}** added to your knowledge base.`);\n } else {\n lines.push(`**${name}** promoted to SSOT on the Chain.`);\n }\n if (GOVERNED_COLLECTIONS.has(resolvedCollection)) {\n lines.push(`_Note: \\`${resolvedCollection}\\` is a governed collection — ensure this entry has been reviewed._`);\n }\n } else if (commitError) {\n lines.push(\"\");\n lines.push(\"## Commit failed\");\n lines.push(`Error: ${commitError}. Entry saved as draft — use \\`commit-entry entryId=\"${finalEntryId}\"\\` to promote when ready.`);\n }\n\n if (linksSuggested.length > 0) {\n lines.push(\"\");\n lines.push(\"## Suggested links (review and use `relations action=create`)\");\n for (let i = 0; i < linksSuggested.length; i++) {\n const s = linksSuggested[i];\n const preview = s.preview ? ` — ${s.preview}` : \"\";\n lines.push(`${i + 1}. **${s.entryId ?? \"(no ID)\"}**: ${s.name} [${s.collection}]${preview}`);\n }\n }\n\n lines.push(\"\");\n lines.push(formatQualityReport(quality));\n\n const failedChecks = quality.checks.filter((c) => !c.passed);\n if (failedChecks.length > 0) {\n lines.push(\"\");\n lines.push(`_To improve: \\`update-entry entryId=\"${finalEntryId}\"\\` to fill missing fields._`);\n }\n\n // Strategy-link warning for bet/goal (ENT-ldomlr: Intelligence Surface)\n const isBetOrGoal =\n resolvedCollection === \"bets\" ||\n resolvedCK === \"bet\" ||\n resolvedCK === \"goal\";\n const hasStrategyLink = linksCreated.some((l) => l.targetCollection === \"strategy\");\n if (isBetOrGoal && !hasStrategyLink) {\n lines.push(\"\");\n lines.push(\n `**Strategy link:** This ${resolvedCollection === \"bets\" ? \"bet\" : \"goal\"} doesn't connect to any strategy entry. Consider linking before commit. Use \\`graph action=suggest entryId=\"${finalEntryId}\"\\` to find strategy entries to connect to.`\n );\n await recordSessionActivity({ strategyLinkWarnedForEntryId: internalId });\n }\n\n // Cardinality warning for singleton types (DEC-zcuhvb)\n if (cardinalityWarning) {\n lines.push(\"\");\n lines.push(`**Cardinality warning:** ${cardinalityWarning}`);\n }\n\n // Contradiction warnings — exact format per spec\n if (contradictionWarnings.length > 0) {\n lines.push(\"\");\n lines.push(\"⚠ Contradiction check: proposed entry matched existing governance entries:\");\n for (const w of contradictionWarnings) {\n lines.push(`- ${w.name} (${w.collection}, ${w.entryId}) — has 'governs' relation to ${w.governsCount} entries`);\n }\n lines.push(\"Run `context action=gather` on these entries before committing.\");\n }\n\n // Rubric coaching (assertive/nudge only)\n if (coachingSection) {\n lines.push(\"\");\n lines.push(coachingSection);\n }\n\n // Next steps: adapt based on what was already done\n lines.push(\"\");\n lines.push(\"## Next Steps\");\n const eid = finalEntryId || \"(check entry ID)\";\n if (finalStatus === \"committed\") {\n lines.push(`1. **Connect it:** \\`graph action=suggest entryId=\"${eid}\"\\` — discover additional links`);\n if (failedChecks.length > 0) {\n lines.push(`2. **Improve quality:** \\`update-entry entryId=\"${eid}\"\\` — fill missing fields`);\n }\n } else {\n if (userLinkResults.length === 0) {\n lines.push(`1. **Connect it:** \\`graph action=suggest entryId=\"${eid}\"\\` — discover what this should link to`);\n }\n lines.push(`${userLinkResults.length === 0 ? \"2\" : \"1\"}. **Commit it:** \\`commit-entry entryId=\"${eid}\"\\` — promote from draft to SSOT on the Chain`);\n if (failedChecks.length > 0) {\n lines.push(`${userLinkResults.length === 0 ? \"3\" : \"2\"}. **Improve quality:** \\`update-entry entryId=\"${eid}\"\\` — fill missing fields`);\n }\n }\n\n // Advisory: workspace readiness hints (never blocking)\n try {\n const readiness = await mcpQuery<any>(\"chain.workspaceReadiness\");\n if (readiness && readiness.gaps && readiness.gaps.length > 0) {\n const topGaps = readiness.gaps.slice(0, 2);\n lines.push(\"\");\n lines.push(`## Workspace Readiness: ${readiness.score}%`);\n for (const gap of topGaps) {\n lines.push(`- _${gap.label}:_ ${gap.guidance}`);\n }\n }\n } catch {\n // Readiness check is advisory — capture works without it\n }\n\n // Context-sensitive next: adapt based on what was already done\n const next: NextAction[] = [];\n if (finalStatus === \"committed\") {\n next.push({ tool: \"graph\", description: \"Discover connections\", parameters: { action: \"suggest\", entryId: finalEntryId } });\n } else {\n if (userLinkResults.length === 0) {\n next.push({ tool: \"graph\", description: \"Discover links\", parameters: { action: \"suggest\", entryId: finalEntryId } });\n }\n next.push({ tool: \"commit-entry\", description: \"Commit to Chain\", parameters: { entryId: finalEntryId } });\n }\n\n const summary = finalStatus === \"committed\"\n ? `Captured and committed ${finalEntryId} (${name}) to ${resolvedCollection}. Quality ${quality.score}/10.`\n : `Captured ${finalEntryId} (${name}) as draft in ${resolvedCollection}. Quality ${quality.score}/10.`;\n\n const toolResult = {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: success(\n summary,\n {\n entryId: finalEntryId,\n collection: resolvedCollection,\n name,\n status: finalStatus,\n qualityScore: quality.score,\n qualityVerdict: verdictResult?.verdict\n ? { ...verdictResult.verdict, source: verdictResult.source ?? \"heuristic\" }\n : undefined,\n ...(classifierMeta && { classifier: classifierMeta }),\n ...(studioUrl && { studioUrl }),\n },\n next,\n ),\n };\n\n return toolResult;\n })\n );\n trackWriteTool(captureTool);\n\n // ── Batch Capture Tool ─────────────────────────────────────────────────\n\n const batchCaptureTool = server.registerTool(\n \"batch-capture\",\n {\n title: \"Batch Capture\",\n description:\n \"Create multiple knowledge entries in one call. Ideal for workspace setup, document ingestion, \" +\n \"or any scenario where you need to capture many entries at once.\\n\\n\" +\n \"Each entry is created independently — if one fails, the others still succeed. \" +\n \"Returns a compact summary instead of per-entry quality scorecards.\\n\\n\" +\n \"Auto-linking runs per entry but contradiction checks and readiness hints are skipped for speed. \" +\n \"Use `quality action=check` on individual entries afterward if needed.\",\n inputSchema: batchCaptureSchema.shape,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n },\n withEnvelope(async ({ entries }) => {\n requireWriteAccess();\n\n const agentId = getAgentSessionId();\n const createdBy = agentId ? `agent:${agentId}` : \"capture\";\n\n const results: Array<{\n name: string;\n collection: string;\n entryId: string;\n ok: boolean;\n autoLinks: number;\n error?: string;\n }> = [];\n\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Batch capturing ${entries.length} entries...`,\n logger: \"product-brain\",\n });\n\n const allCollections = await mcpQuery<any[]>(\"chain.listCollections\");\n const collCache = new Map<string, any>();\n for (const c of allCollections) collCache.set(c.slug, c);\n const collIdToSlug = new Map<string, string>();\n for (const c of allCollections) collIdToSlug.set(c._id, c.slug);\n\n for (let entryIdx = 0; entryIdx < entries.length; entryIdx++) {\n const entry = entries[entryIdx];\n\n if (entryIdx > 0 && entryIdx % 5 === 0) {\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Captured ${entryIdx}/${entries.length} entries...`,\n logger: \"product-brain\",\n });\n }\n const profile = PROFILES.get(entry.collection) ?? FALLBACK_PROFILE;\n const col = collCache.get(entry.collection);\n\n if (!col) {\n results.push({ name: entry.name, collection: entry.collection, entryId: \"\", ok: false, autoLinks: 0, error: `Collection \"${entry.collection}\" not found` });\n continue;\n }\n\n const data: Record<string, unknown> = {};\n const today = new Date().toISOString().split(\"T\")[0];\n\n for (const field of col.fields ?? []) {\n const key = field.key as string;\n if (key === profile.descriptionField) {\n data[key] = entry.description;\n } else if (field.type === \"array\" || field.type === \"multi-select\") {\n data[key] = [];\n } else if (field.type === \"select\") {\n // Skip — empty string is not a valid option for select fields\n } else {\n data[key] = \"\";\n }\n }\n\n for (const def of profile.defaults) {\n if (def.value === \"today\") data[def.key] = today;\n else if (def.value !== \"infer\") data[def.key] = def.value;\n }\n\n if (profile.inferField) {\n const inferred = profile.inferField({\n collection: entry.collection, name: entry.name, description: entry.description,\n data, entryId: \"\", linksCreated: [], linksSuggested: [], collectionFields: col.fields ?? [],\n });\n for (const [key, val] of Object.entries(inferred)) {\n if (val !== undefined && val !== \"\") data[key] = val;\n }\n }\n\n if (!data[profile.descriptionField] && !data.description && !data.canonical) {\n data[profile.descriptionField || \"description\"] = entry.description;\n }\n\n try {\n const result = await mcpMutation<{ docId: string; entryId: string }>(\"chain.createEntry\", {\n collectionSlug: entry.collection,\n entryId: entry.entryId ?? undefined,\n name: entry.name,\n status: \"draft\",\n data,\n createdBy,\n sessionId: agentId ?? undefined,\n });\n const internalId = result.docId;\n const finalEntryId = result.entryId;\n\n let autoLinkCount = 0;\n const searchQuery = extractSearchTerms(entry.name, entry.description);\n if (searchQuery) {\n try {\n const searchResults = await mcpQuery<any[]>(\"chain.searchEntries\", { query: searchQuery });\n const candidates = (searchResults ?? [])\n .filter((r) => r.entryId !== finalEntryId)\n .map((r) => {\n const conf = computeLinkConfidence(r, entry.name, entry.description, entry.collection, collIdToSlug.get(r.collectionId) ?? \"unknown\");\n return {\n ...r,\n collSlug: collIdToSlug.get(r.collectionId) ?? \"unknown\",\n confidence: conf.score,\n };\n })\n .sort((a, b) => b.confidence - a.confidence);\n\n for (const c of candidates) {\n if (autoLinkCount >= MAX_AUTO_LINKS) break;\n if (c.confidence < AUTO_LINK_CONFIDENCE_THRESHOLD) break;\n if (!c.entryId) continue;\n const { type: relationType } = inferRelationType(entry.collection, c.collSlug, profile);\n try {\n await mcpMutation(\"chain.createEntryRelation\", {\n fromEntryId: finalEntryId,\n toEntryId: c.entryId,\n type: relationType,\n });\n autoLinkCount++;\n } catch { /* skip failed link */ }\n }\n } catch { /* search failed; entry still created */ }\n }\n\n results.push({ name: entry.name, collection: entry.collection, entryId: finalEntryId, ok: true, autoLinks: autoLinkCount });\n await recordSessionActivity({ entryCreated: internalId });\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n results.push({ name: entry.name, collection: entry.collection, entryId: \"\", ok: false, autoLinks: 0, error: msg });\n }\n }\n\n const created = results.filter((r) => r.ok);\n const failed = results.filter((r) => !r.ok);\n\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Batch complete. ${created.length} succeeded, ${failed.length} failed.`,\n logger: \"product-brain\",\n });\n\n const totalAutoLinks = created.reduce((sum, r) => sum + r.autoLinks, 0);\n\n const byCollection = new Map<string, number>();\n for (const r of created) {\n byCollection.set(r.collection, (byCollection.get(r.collection) ?? 0) + 1);\n }\n\n const lines: string[] = [\n `# Batch Capture Complete`,\n `**${created.length}** created, **${failed.length}** failed out of ${entries.length} total.`,\n `**Auto-links created:** ${totalAutoLinks}`,\n \"\",\n ];\n\n if (byCollection.size > 0) {\n lines.push(\"## By Collection\");\n for (const [col, count] of byCollection) {\n lines.push(`- \\`${col}\\`: ${count} entries`);\n }\n lines.push(\"\");\n }\n\n if (created.length > 0) {\n lines.push(\"## Created\");\n for (const r of created) {\n const linkNote = r.autoLinks > 0 ? ` (${r.autoLinks} auto-links)` : \"\";\n lines.push(`- **${r.entryId}**: ${r.name} [${r.collection}]${linkNote}`);\n }\n }\n\n if (failed.length > 0) {\n lines.push(\"\");\n lines.push(\"## Failed\");\n for (const r of failed) {\n lines.push(`- ${r.name} [${r.collection}]: _${r.error}_`);\n }\n lines.push(\"\");\n lines.push(`_If failed > 0, inspect \\`failedEntries\\` in the structured response and retry individually._`);\n }\n\n const entryIds = created.map((r) => r.entryId);\n if (entryIds.length > 0) {\n lines.push(\"\");\n lines.push(\"## Next Steps\");\n lines.push(`- **Connect:** Run \\`graph action=suggest\\` on key entries to build the knowledge graph`);\n lines.push(`- **Commit:** Use \\`commit-entry\\` to promote drafts to SSOT`);\n lines.push(`- **Quality:** Run \\`quality action=check\\` on individual entries to assess completeness`);\n }\n\n const summary = failed.length > 0\n ? `Batch captured ${created.length}/${entries.length} entries (${failed.length} failed).`\n : `Batch captured ${created.length} entries successfully.`;\n\n const next: NextAction[] = created.length > 0\n ? [\n { tool: \"graph\", description: \"Discover connections\", parameters: { action: \"suggest\", entryId: created[0].entryId } },\n { tool: \"commit-entry\", description: \"Commit first entry\", parameters: { entryId: created[0].entryId } },\n ]\n : [];\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: success(\n summary,\n {\n captured: created.map((r) => ({ entryId: r.entryId, collection: r.collection, name: r.name })),\n total: created.length,\n failed: failed.length,\n ...(failed.length > 0 && {\n failedEntries: failed.map((r) => ({\n index: results.indexOf(r),\n collection: r.collection,\n name: r.name,\n error: r.error ?? \"unknown error\",\n })),\n }),\n },\n next,\n ),\n };\n })\n );\n trackWriteTool(batchCaptureTool);\n\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\n\n// Stop words excluded from noun phrase extraction\nconst STOP_WORDS = new Set([\n \"the\", \"and\", \"for\", \"are\", \"but\", \"not\", \"you\", \"all\", \"can\", \"has\", \"her\",\n \"was\", \"one\", \"our\", \"out\", \"day\", \"had\", \"hot\", \"how\", \"its\", \"may\", \"new\",\n \"now\", \"old\", \"see\", \"way\", \"who\", \"did\", \"get\", \"let\", \"say\", \"she\", \"too\",\n \"use\", \"from\", \"have\", \"been\", \"each\", \"that\", \"this\", \"with\", \"will\", \"they\",\n \"what\", \"when\", \"make\", \"like\", \"long\", \"look\", \"many\", \"some\", \"them\", \"than\",\n \"most\", \"only\", \"over\", \"such\", \"into\", \"also\", \"back\", \"just\", \"much\", \"must\",\n \"name\", \"very\", \"your\", \"after\", \"which\", \"their\", \"about\", \"would\", \"there\",\n \"should\", \"could\", \"other\", \"these\", \"first\", \"being\", \"those\", \"still\", \"where\",\n]);\n\nfunction tokenizeText(input: string): string[] {\n return input\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]+/gu, \" \")\n .split(/\\s+/)\n .filter(Boolean);\n}\n\n/**\n * Keyword contradiction check against governance entries.\n * Extracts terms 4+ chars, searches architecture and business-rules,\n * checks for 'governs' relations, returns formatted warnings.\n * Non-blocking — never throws, never prevents the operation.\n */\nexport interface ContradictionWarning {\n entryId: string;\n name: string;\n collection: string;\n governsCount: number;\n}\n\nexport async function runContradictionCheck(\n name: string,\n description: string,\n): Promise<ContradictionWarning[]> {\n const warnings: ContradictionWarning[] = [];\n try {\n const keyTerms = tokenizeText(`${name} ${description}`)\n .filter((w) => w.length >= 4 && !STOP_WORDS.has(w))\n .slice(0, 8);\n\n if (keyTerms.length === 0) return warnings;\n\n const searchQuery = keyTerms.slice(0, 5).join(\" \");\n const [govResults, archResults] = await Promise.all([\n mcpQuery<any[]>(\"chain.searchEntries\", { query: searchQuery, collectionSlug: \"business-rules\" }),\n mcpQuery<any[]>(\"chain.searchEntries\", { query: searchQuery, collectionSlug: \"architecture\" }),\n ]);\n\n const allGov = [...(govResults ?? []), ...(archResults ?? [])].slice(0, 5);\n\n for (const entry of allGov) {\n const entryTokens = new Set(tokenizeText(`${entry.name} ${entry.data?.description ?? \"\"}`));\n const matched = keyTerms.filter((t) => entryTokens.has(t));\n if (matched.length < 3) continue;\n\n // Check for 'governs' relations\n let governsCount = 0;\n try {\n const relations = await mcpQuery<any[]>(\"chain.listEntryRelations\", {\n entryId: entry.entryId,\n });\n governsCount = (relations ?? []).filter((r: any) => r.type === \"governs\").length;\n } catch { /* non-critical */ }\n\n warnings.push({\n entryId: entry.entryId ?? \"\",\n name: entry.name,\n collection: entry.collectionSlug ?? \"\",\n governsCount,\n });\n }\n } catch {\n // Contradiction check is advisory — never blocks the operation\n }\n return warnings;\n}\n\n// ── Quality Coaching Helpers ──────────────────────────────────────────────\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n setTimeout(() => reject(new Error(\"quality coaching timeout\")), ms),\n ),\n ]);\n}\n\n/**\n * Format a full quality coaching result (from evaluateAtCapture / evaluateAtCommit)\n * for inclusion in MCP capture/commit responses.\n */\nexport function formatRubricCoaching(result: any): string {\n const { verdict, rogerMartin } = result;\n if (!verdict || verdict.criteria.length === 0) return \"\";\n\n const lines: string[] = [\"## Semantic Quality\"];\n const failed = (verdict.criteria ?? []).filter((c: any) => !c.passed);\n const total = verdict.criteria?.length ?? 0;\n const passedCount = total - failed.length;\n\n if (verdict.passed) {\n lines.push(`All ${total} rubric criteria pass for \\`${verdict.canonicalKey}\\` (${verdict.tier} tier).`);\n } else {\n lines.push(`${passedCount}/${total} criteria pass for \\`${verdict.canonicalKey}\\` (${verdict.tier} tier)`);\n lines.push(\"\");\n for (const c of verdict.criteria) {\n const icon = c.passed ? \"[x]\" : \"[ ]\";\n const extra = c.passed ? \"\" : ` — ${c.hint}`;\n lines.push(`${icon} ${c.id}${extra}`);\n }\n\n if (verdict.weakest) {\n lines.push(\"\");\n lines.push(`**Coaching hint:** ${verdict.weakest.hint}`);\n lines.push(`_Question to consider:_ ${verdict.weakest.questionTemplate}`);\n }\n }\n\n if (rogerMartin) {\n lines.push(\"\");\n lines.push(\"### Roger Martin Test\");\n if (rogerMartin.isStrategicChoice) {\n lines.push(\"This principle passes — the opposite is a reasonable strategic choice.\");\n } else {\n lines.push(`This principle may not be a strategic choice. ${rogerMartin.reasoning}`);\n if (rogerMartin.suggestion) {\n lines.push(`_Suggestion:_ ${rogerMartin.suggestion}`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a cached rubric verdict section for quality check responses.\n * SOS-e4r5cn: capability and visibility must ship together.\n */\nexport function formatRubricVerdictSection(verdict: any): string {\n if (!verdict || !verdict.criteria || verdict.criteria.length === 0) return \"\";\n\n const lines: string[] = [\"## Semantic Quality\"];\n const failed = verdict.criteria.filter((c: any) => !c.passed);\n const total = verdict.criteria.length;\n const passedCount = total - failed.length;\n\n const durationSuffix = verdict.llmDurationMs ? ` in ${(verdict.llmDurationMs / 1000).toFixed(1)}s` : '';\n const statusNote = verdict.llmStatus === 'pending'\n ? ' — LLM evaluation in progress...'\n : verdict.llmStatus === 'failed'\n ? ` — LLM evaluation failed${verdict.llmError ? `: ${verdict.llmError}` : ''}, showing heuristic results`\n : verdict.source === 'llm' && durationSuffix\n ? ` — evaluated${durationSuffix}`\n : '';\n\n if (failed.length === 0) {\n lines.push(`All ${total} rubric criteria pass for \\`${verdict.canonicalKey}\\` (${verdict.tier} tier, ${verdict.source} evaluation).${statusNote}`);\n } else {\n lines.push(`${passedCount}/${total} criteria pass for \\`${verdict.canonicalKey}\\` (${verdict.tier} tier, ${verdict.source} evaluation)${statusNote}`);\n lines.push(\"\");\n for (const c of verdict.criteria) {\n const icon = c.passed ? \"[x]\" : \"[ ]\";\n const extra = c.passed ? \"\" : ` — ${c.hint}`;\n lines.push(`${icon} ${c.id}${extra}`);\n }\n\n if (verdict.weakest) {\n lines.push(\"\");\n lines.push(`**Top improvement:** ${verdict.weakest.hint}`);\n }\n }\n\n if (verdict.rogerMartin) {\n const rm = verdict.rogerMartin;\n lines.push(\"\");\n lines.push(\"### Roger Martin Test\");\n if (rm.isStrategicChoice) {\n lines.push(`This is a real strategic choice — the opposite is reasonable. ${rm.reasoning}`);\n } else {\n lines.push(`This may not be a strategic choice. ${rm.reasoning}`);\n if (rm.suggestion) {\n lines.push(`_Suggestion:_ ${rm.suggestion}`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * MCP client — communicates with the Convex HTTP Action gateway.\n *\n * Dual mode:\n * stdio — single user, API key from env, module-level state\n * http — multi-user, API key from AsyncLocalStorage, per-key state\n *\n * Configuration:\n * PRODUCTBRAIN_API_KEY — pb_sk_* key (stdio mode; http mode gets it per-request)\n * CONVEX_SITE_URL — (optional) Convex deployment URL, defaults to cloud\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { trackToolCall } from \"./analytics.js\";\nimport { getRequestApiKey, getKeyState, type KeyState } from \"./auth.js\";\nimport { MCP_NPX_PACKAGE } from \"./cli/config-writer.js\";\n\n// ─── Tool Context (for audit action logging) ─────────────────────────────\n\nconst toolContextStore = new AsyncLocalStorage<{ tool: string; action?: string }>();\n\n/**\n * Run a callback with tool context for audit logging.\n * Compound tools should wrap their handler with this so health action=audit can distinguish\n * e.g. entries action=get from entries action=search.\n */\nexport function runWithToolContext<T>(\n ctx: { tool: string; action?: string },\n fn: () => T | Promise<T>,\n): T | Promise<T> {\n return toolContextStore.run(ctx, fn);\n}\n\nfunction getToolContext(): { tool: string; action?: string } | null {\n return toolContextStore.getStore() ?? null;\n}\n\nconst DEFAULT_CLOUD_URL = \"https://trustworthy-kangaroo-277.convex.site\";\n\n// ─── Read Cache (Batch A: sub-200ms repeat calls) ─────────────────────\n\nconst CACHE_TTL_MS = 60_000; // 60s per plan\nconst CACHEABLE_FNS = [\n \"chain.getOrientEntries\",\n \"chain.gatherContext\",\n \"chain.graphGatherContext\",\n \"chain.taskAwareGatherContext\",\n \"chain.journeyAwareGatherContext\",\n \"chain.assembleBuildContext\",\n] as const;\n\nfunction isCacheable(fn: string): boolean {\n return (CACHEABLE_FNS as readonly string[]).includes(fn);\n}\n\nconst READ_PATTERN =\n /^(chain\\.(get|list|search|batchGet|gather|graph|task|journey|assemble|workspace|score|absence)|maps\\.(get|list)|gitchain\\.(get|list|diff|history|runGate))/i;\n\nfunction isWrite(fn: string): boolean {\n if (fn.startsWith(\"agent.\")) return false;\n return !READ_PATTERN.test(fn);\n}\n\ninterface CacheEntry<T> {\n data: T;\n expiresAt: number;\n}\n\nconst readCache = new Map<string, CacheEntry<unknown>>();\n\nfunction cacheKey(fn: string, args: Record<string, unknown>): string {\n return `${fn}:${JSON.stringify(args)}`;\n}\n\nfunction getCached<T>(fn: string, args: Record<string, unknown>): T | undefined {\n if (!isCacheable(fn)) return undefined;\n const key = cacheKey(fn, args);\n const entry = readCache.get(key) as CacheEntry<T> | undefined;\n if (!entry || Date.now() > entry.expiresAt) {\n if (entry) readCache.delete(key);\n return undefined;\n }\n return entry.data;\n}\n\nfunction setCached<T>(fn: string, args: Record<string, unknown>, data: T): void {\n if (!isCacheable(fn)) return;\n const key = cacheKey(fn, args);\n readCache.set(key, { data, expiresAt: Date.now() + CACHE_TTL_MS });\n}\n\nfunction invalidateReadCache(): void {\n readCache.clear();\n}\n\n// ─── State Management ─────────────────────────────────────────────────\n\nconst _stdioState: KeyState = {\n workspaceId: null,\n workspaceSlug: null,\n workspaceName: null,\n workspaceCreatedAt: null,\n workspaceGovernanceMode: null,\n agentSessionId: null,\n apiKeyId: null,\n apiKeyScope: \"readwrite\",\n sessionOriented: false,\n sessionClosed: false,\n lastAccess: 0,\n};\n\n/**\n * Returns the active client state.\n * stdio: module-level singleton. http: per-API-key state from AsyncLocalStorage.\n */\nfunction state(): KeyState {\n const reqKey = getRequestApiKey();\n if (reqKey) return getKeyState(reqKey);\n return _stdioState;\n}\n\n/**\n * Returns the active API key (request-scoped in HTTP mode, env in stdio mode).\n */\nfunction getActiveApiKey(): string {\n const fromRequest = getRequestApiKey();\n if (fromRequest) return fromRequest;\n const fromEnv = process.env.PRODUCTBRAIN_API_KEY;\n if (!fromEnv) throw new Error(\"No API key available — set PRODUCTBRAIN_API_KEY or provide Bearer token\");\n return fromEnv;\n}\n\n// ─── Agent Session State ──────────────────────────────────────────────\n\nexport function getAgentSessionId(): string | null {\n return state().agentSessionId;\n}\n\nexport function isSessionOriented(): boolean {\n return state().sessionOriented;\n}\n\nexport function setSessionOriented(value: boolean): void {\n state().sessionOriented = value;\n}\n\nexport function getApiKeyScope(): \"read\" | \"readwrite\" {\n return state().apiKeyScope;\n}\n\nexport function isSessionClosed(): boolean {\n return state().sessionClosed;\n}\n\nexport interface AgentSessionStartResult {\n sessionId: string;\n initiatedBy: string;\n toolsScope: \"read\" | \"readwrite\";\n workspaceName: string;\n superseded: {\n previousSessionId: string;\n startedAt: string;\n initiatedBy: string;\n } | null;\n}\n\n/**\n * Start an agent session. Creates a session record in Convex.\n * toolsScope is derived server-side from the API key — not passed as a parameter.\n * If an active session exists, it gets superseded.\n */\nexport async function startAgentSession(): Promise<AgentSessionStartResult> {\n const workspaceId = await getWorkspaceId();\n const s = state();\n if (!s.apiKeyId) {\n throw new Error(\"Cannot start session: API key ID not resolved. Ensure workspace resolution completed.\");\n }\n\n const result = await mcpCall<AgentSessionStartResult>(\"agent.startSession\", {\n workspaceId,\n apiKeyId: s.apiKeyId,\n });\n\n s.agentSessionId = result.sessionId;\n s.apiKeyScope = result.toolsScope;\n s.sessionOriented = false;\n s.sessionClosed = false;\n resetTouchThrottle();\n\n return result;\n}\n\n/**\n * Close the current agent session. After this, write tools are blocked\n * even if the MCP connection stays open.\n */\nexport async function closeAgentSession(): Promise<void> {\n const s = state();\n if (!s.agentSessionId) return;\n try {\n await mcpCall(\"agent.closeSession\", {\n sessionId: s.agentSessionId,\n status: \"closed\",\n });\n } finally {\n s.sessionClosed = true;\n s.agentSessionId = null;\n s.sessionOriented = false;\n }\n}\n\n/**\n * Mark current session as orphaned (used on disconnect/crash).\n */\nexport async function orphanAgentSession(): Promise<void> {\n const s = state();\n if (!s.agentSessionId) return;\n try {\n await mcpCall(\"agent.closeSession\", {\n sessionId: s.agentSessionId,\n status: \"orphaned\",\n });\n } catch {\n // Best-effort on disconnect\n } finally {\n s.agentSessionId = null;\n s.sessionOriented = false;\n }\n}\n\n/**\n * Touch the session to update lastToolCallAt. Fire-and-forget.\n * Throttled to at most once per 5s to prevent OCC conflicts when\n * multiple tool calls complete in parallel.\n */\nlet _lastTouchAt = 0;\nconst TOUCH_THROTTLE_MS = 5_000;\n\nexport function touchSessionActivity(): void {\n const s = state();\n if (!s.agentSessionId) return;\n\n const now = Date.now();\n if (now - _lastTouchAt < TOUCH_THROTTLE_MS) return;\n _lastTouchAt = now;\n\n mcpCall(\"agent.touchSession\", {\n sessionId: s.agentSessionId,\n }).catch(() => {});\n}\n\nexport function resetTouchThrottle(): void {\n _lastTouchAt = 0;\n}\n\n/**\n * Record structured activity on the current session.\n */\nexport async function recordSessionActivity(activity: {\n entryCreated?: string;\n entryModified?: string;\n relationCreated?: boolean;\n gateFailure?: boolean;\n contradictionWarning?: boolean;\n strategyLinkWarnedForEntryId?: string;\n}): Promise<void> {\n const s = state();\n if (!s.agentSessionId) return;\n try {\n await mcpCall(\"agent.recordActivity\", {\n sessionId: s.agentSessionId,\n ...activity,\n });\n } catch {\n // Non-critical — don't fail the tool call over activity tracking\n }\n}\n\n// ─── Audit ────────────────────────────────────────────────────────────\n\nexport interface AuditEntry {\n ts: string;\n fn: string;\n workspace: string;\n status: \"ok\" | \"error\";\n durationMs: number;\n error?: string;\n /** For compound tools: tool name and action for audit display */\n toolContext?: { tool: string; action?: string };\n}\n\nconst AUDIT_BUFFER_SIZE = 50;\nconst auditBuffer: AuditEntry[] = [];\n\n/**\n * Bootstrap for stdio mode: set CONVEX_SITE_URL default and warn on missing key.\n * API key is validated lazily on first mcpCall so the server can start and handle\n * signals (SIGTERM) even before credentials are provided (e.g. in tests).\n */\nexport function bootstrap(): void {\n process.env.CONVEX_SITE_URL ??= process.env.PRODUCTBRAIN_URL ?? DEFAULT_CLOUD_URL;\n const pbKey = process.env.PRODUCTBRAIN_API_KEY;\n if (!pbKey?.startsWith(\"pb_sk_\")) {\n process.stderr.write(\n \"[MCP] Warning: PRODUCTBRAIN_API_KEY is not set or invalid. \" +\n \"Tool calls will fail until a valid key is provided.\\n\"\n );\n }\n}\n\n/**\n * Bootstrap for HTTP mode: only set CONVEX_SITE_URL.\n * API key validation happens per-request via Bearer token.\n */\nexport function bootstrapHttp(): void {\n process.env.CONVEX_SITE_URL ??= process.env.PRODUCTBRAIN_URL ?? DEFAULT_CLOUD_URL;\n}\n\n/** @deprecated Use bootstrap() instead. Alias kept for callers in transition. */\nexport const bootstrapCloudMode = bootstrap;\n\nfunction getEnv(key: string): string {\n const value = process.env[key];\n if (!value) throw new Error(`${key} environment variable is required`);\n return value;\n}\n\nfunction shouldLogAudit(status: \"ok\" | \"error\"): boolean {\n return status === \"error\" || process.env.MCP_DEBUG === \"1\";\n}\n\nfunction audit(fn: string, status: \"ok\" | \"error\", durationMs: number, errorMsg?: string): void {\n const ts = new Date().toISOString();\n const workspace = state().workspaceId ?? \"unresolved\";\n const toolCtx = getToolContext();\n\n const entry: AuditEntry = { ts, fn, workspace, status, durationMs };\n if (errorMsg) entry.error = errorMsg;\n if (toolCtx) entry.toolContext = toolCtx;\n auditBuffer.push(entry);\n if (auditBuffer.length > AUDIT_BUFFER_SIZE) auditBuffer.shift();\n\n trackToolCall(fn, status, durationMs, workspace, errorMsg);\n\n if (!shouldLogAudit(status)) return;\n\n const base = `[MCP-AUDIT] ${ts} fn=${fn} workspace=${workspace} status=${status} duration=${durationMs}ms`;\n if (status === \"error\" && errorMsg) {\n process.stderr.write(`${base} error=${JSON.stringify(errorMsg)}\\n`);\n } else {\n process.stderr.write(`${base}\\n`);\n }\n}\n\nexport function getAuditLog(): readonly AuditEntry[] {\n return auditBuffer;\n}\n\n// ─── HTTP Client ──────────────────────────────────────────────────────\n\n/**\n * Low-level call to the HTTP Action gateway.\n * Workspace scoping is enforced server-side from the API key — callers\n * don't need to (and can't) override the workspace.\n *\n * Read cache: orient and context-gather responses are cached for 60s.\n * Cache is invalidated on any write (safe-by-default: everything not\n * matching a known read pattern is treated as a write).\n */\nexport async function mcpCall<T>(fn: string, args: Record<string, unknown> = {}): Promise<T> {\n const cached = getCached<T>(fn, args);\n if (cached !== undefined) {\n return cached;\n }\n\n const siteUrl = getEnv(\"CONVEX_SITE_URL\").replace(/\\/$/, \"\");\n const apiKey = getActiveApiKey();\n\n const start = Date.now();\n\n let res: Response;\n try {\n res = await fetch(`${siteUrl}/api/mcp`, {\n method: \"POST\",\n signal: AbortSignal.timeout(10_000),\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ fn, args }),\n });\n } catch (err: any) {\n audit(fn, \"error\", Date.now() - start, err.message);\n throw new Error(`MCP call \"${fn}\" network error: ${err.message}`);\n }\n\n const json = (await res.json()) as { data?: T; error?: string };\n\n if (!res.ok || json.error) {\n audit(fn, \"error\", Date.now() - start, json.error);\n throw new Error(`MCP call \"${fn}\" failed (${res.status}): ${json.error ?? \"unknown error\"}`);\n }\n\n audit(fn, \"ok\", Date.now() - start);\n\n const data = json.data as T;\n if (isWrite(fn)) {\n invalidateReadCache();\n } else {\n setCached(fn, args, data);\n }\n\n const s = state();\n // Exclude session lifecycle calls from the heartbeat touch — they are setup/teardown,\n // not user-initiated tool calls. markOriented is excluded to prevent a concurrent\n // touchSession race on the same document (the Convex-side idempotency guard handles\n // it safely, but excluding here is cleaner and semantically correct).\n const TOUCH_EXCLUDED = new Set([\"agent.touchSession\", \"agent.startSession\", \"agent.markOriented\"]);\n if (s.agentSessionId && !TOUCH_EXCLUDED.has(fn)) {\n touchSessionActivity();\n }\n\n return data;\n}\n\n// ─── Workspace Resolution ─────────────────────────────────────────────\n\nconst resolveInFlightMap = new Map<string, Promise<string>>();\n\nexport async function getWorkspaceId(): Promise<string> {\n const s = state();\n if (s.workspaceId) return s.workspaceId;\n\n const apiKey = getActiveApiKey();\n const existing = resolveInFlightMap.get(apiKey);\n if (existing) return existing;\n\n const promise = resolveWorkspaceWithRetry().finally(() => resolveInFlightMap.delete(apiKey));\n resolveInFlightMap.set(apiKey, promise);\n return promise;\n}\n\nasync function resolveWorkspaceWithRetry(maxRetries = 2): Promise<string> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const workspace = await mcpCall<{\n _id: string;\n name: string;\n slug: string;\n createdAt?: number;\n keyScope?: string;\n keyId?: string;\n governanceMode?: \"open\" | \"consensus\" | \"role\";\n } | null>(\"resolveWorkspace\", {});\n\n if (!workspace) {\n throw new Error(\n \"API key is valid but no workspace is associated. \" +\n `Run \\`npx ${MCP_NPX_PACKAGE} setup\\` or regenerate your key.`\n );\n }\n\n const s = state();\n s.workspaceId = workspace._id;\n s.workspaceSlug = workspace.slug;\n s.workspaceName = workspace.name;\n s.workspaceCreatedAt = workspace.createdAt ?? null;\n s.workspaceGovernanceMode = workspace.governanceMode ?? \"open\";\n if (workspace.keyScope) s.apiKeyScope = workspace.keyScope as \"read\" | \"readwrite\";\n if (workspace.keyId) s.apiKeyId = workspace.keyId;\n return s.workspaceId;\n } catch (err: any) {\n lastError = err;\n const isTransient = /network error|fetch failed|ECONNREFUSED|ETIMEDOUT/i.test(err.message);\n if (!isTransient || attempt === maxRetries) break;\n const delay = 1000 * (attempt + 1);\n process.stderr.write(\n `[MCP] Workspace resolution failed (attempt ${attempt + 1}/${maxRetries + 1}), retrying in ${delay}ms...\\n`\n );\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n\n throw lastError!;\n}\n\nexport interface WorkspaceContext {\n workspaceId: string;\n workspaceSlug: string;\n workspaceName: string;\n createdAt: number | null;\n /** BET-76 FEAT-111: Cached from workspace resolution. Defaults to 'open'. */\n governanceMode: \"open\" | \"consensus\" | \"role\";\n}\n\nexport async function getWorkspaceContext(): Promise<WorkspaceContext> {\n const workspaceId = await getWorkspaceId();\n const s = state();\n return {\n workspaceId,\n workspaceSlug: s.workspaceSlug ?? \"unknown\",\n workspaceName: s.workspaceName ?? \"unknown\",\n createdAt: s.workspaceCreatedAt,\n governanceMode: s.workspaceGovernanceMode ?? \"open\",\n };\n}\n\nexport async function mcpQuery<T>(fn: string, args: Record<string, unknown> = {}): Promise<T> {\n const workspaceId = await getWorkspaceId();\n return mcpCall<T>(fn, { ...args, workspaceId });\n}\n\nexport async function mcpMutation<T>(fn: string, args: Record<string, unknown> = {}): Promise<T> {\n const workspaceId = await getWorkspaceId();\n return mcpCall<T>(fn, { ...args, workspaceId });\n}\n\n/**\n * Gate check: throws if no active, oriented session exists.\n *\n * Used for read tools that require session context per SOS-iszqu7:\n * structured Chain data for agent consumption requires an active session.\n * Lighter than requireWriteAccess — does not check key scope.\n */\nexport function requireActiveSession(): void {\n const s = state();\n\n if (!s.agentSessionId) {\n throw new Error(\n \"Active session required (SOS-iszqu7). Call `session action=start` then `orient` first.\"\n );\n }\n\n if (s.sessionClosed) {\n throw new Error(\n \"Session has been closed (SOS-iszqu7). Start a new session with `session action=start`.\"\n );\n }\n\n if (!s.sessionOriented) {\n throw new Error(\n \"Orientation required before accessing build context (SOS-iszqu7). Call `orient` first.\"\n );\n }\n}\n\n/**\n * Gate check: throws if the agent is not allowed to write.\n *\n * Enforces:\n * 1. Session must exist (always required — no REQUIRE_AGENT_SESSION flag)\n * 2. Session must not be closed\n * 3. Session must be oriented\n * 4. Key scope must be readwrite\n */\nexport function requireWriteAccess(): void {\n const s = state();\n\n if (!s.agentSessionId) {\n throw new Error(\n \"Agent session required for write operations. Call `session action=start` first.\"\n );\n }\n\n if (s.sessionClosed) {\n throw new Error(\n \"Agent session has been closed. Write tools are no longer available.\"\n );\n }\n\n if (!s.sessionOriented) {\n throw new Error(\n \"Orientation required before writing to the Chain. Call 'orient' first.\"\n );\n }\n\n if (s.apiKeyScope === \"read\") {\n throw new Error(\n \"This API key has read-only scope. Write tools are not available.\"\n );\n }\n}\n\n/**\n * Recover session orientation state from Convex on restart.\n * If the session is active and oriented in Convex, restore local state.\n */\nexport async function recoverSessionState(): Promise<void> {\n const s = state();\n if (!s.workspaceId) return;\n try {\n const session = await mcpCall<{\n _id: string;\n status: string;\n oriented: boolean;\n toolsScope: string;\n } | null>(\"agent.getActiveSession\", { workspaceId: s.workspaceId });\n\n if (session && session.status === \"active\") {\n s.agentSessionId = session._id;\n s.sessionOriented = session.oriented;\n s.apiKeyScope = session.toolsScope as \"read\" | \"readwrite\";\n s.sessionClosed = false;\n }\n } catch {\n // Recovery is best-effort\n }\n}\n","/**\n * Request-scoped auth for HTTP transport mode.\n *\n * stdio: API key from PRODUCTBRAIN_API_KEY env, one user per process.\n * http: API key from Bearer header per request, many users per process.\n *\n * AsyncLocalStorage propagates the token through the async call chain\n * so client.ts resolves the correct API key and state per request.\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\n// ── Request Context ─────────────────────────────────────────────────────\n\ninterface RequestAuth {\n apiKey: string;\n}\n\nconst requestStore = new AsyncLocalStorage<RequestAuth>();\n\nexport function runWithAuth<T>(auth: RequestAuth, fn: () => T | Promise<T>): T | Promise<T> {\n return requestStore.run(auth, fn);\n}\n\nexport function getRequestApiKey(): string | undefined {\n return requestStore.getStore()?.apiKey;\n}\n\n// ── Per-Key State (HTTP mode) ───────────────────────────────────────────\n\nexport interface KeyState {\n workspaceId: string | null;\n workspaceSlug: string | null;\n workspaceName: string | null;\n workspaceCreatedAt: number | null;\n /** BET-76 FEAT-111: Cached at workspace resolution time. Defaults to 'open'. */\n workspaceGovernanceMode: \"open\" | \"consensus\" | \"role\" | null;\n agentSessionId: string | null;\n apiKeyId: string | null;\n apiKeyScope: \"read\" | \"readwrite\";\n sessionOriented: boolean;\n sessionClosed: boolean;\n lastAccess: number;\n}\n\nconst SESSION_TTL_MS = 30 * 60 * 1000;\nconst MAX_KEYS = 100;\nconst keyStateMap = new Map<string, KeyState>();\n\nfunction newKeyState(): KeyState {\n return {\n workspaceId: null,\n workspaceSlug: null,\n workspaceName: null,\n workspaceCreatedAt: null,\n workspaceGovernanceMode: null,\n agentSessionId: null,\n apiKeyId: null,\n apiKeyScope: \"readwrite\",\n sessionOriented: false,\n sessionClosed: false,\n lastAccess: Date.now(),\n };\n}\n\nexport function getKeyState(apiKey: string): KeyState {\n let s = keyStateMap.get(apiKey);\n if (!s) {\n s = newKeyState();\n keyStateMap.set(apiKey, s);\n evictStale();\n }\n s.lastAccess = Date.now();\n return s;\n}\n\nfunction evictStale(): void {\n if (keyStateMap.size <= MAX_KEYS) return;\n const now = Date.now();\n for (const [key, s] of keyStateMap) {\n if (now - s.lastAccess > SESSION_TTL_MS) keyStateMap.delete(key);\n }\n if (keyStateMap.size > MAX_KEYS) {\n const sorted = [...keyStateMap.entries()].sort((a, b) => a[1].lastAccess - b[1].lastAccess);\n for (let i = 0; i < sorted.length - MAX_KEYS; i++) {\n keyStateMap.delete(sorted[i][0]);\n }\n }\n}\n","/**\n * Shared helpers for knowledge tools. Extracted from knowledge.ts for reuse\n * across entries, relations, graph, context, and collections compound tools.\n */\n\nexport function extractPreview(data: unknown, maxLen: number): string {\n if (!data || typeof data !== \"object\") return \"\";\n const d = data as Record<string, unknown>;\n const raw = d.description ?? d.canonical ?? d.detail ?? d.rule ?? \"\";\n if (typeof raw !== \"string\" || !raw) return \"\";\n return raw.length > maxLen ? raw.substring(0, maxLen) + \"...\" : raw;\n}\n\n/**\n * Canonical tool-name translation map.\n * Maps deprecated atomic tool names to their consolidated compound equivalents.\n * Used by context/orient to annotate stale references in historical content\n * (plans, docs, prototypes) without bulk-editing those files.\n */\nexport const TOOL_NAME_MIGRATIONS: ReadonlyMap<string, string> = new Map([\n [\"list-entries\", 'entries action=\"list\"'],\n [\"get-entry\", 'entries action=\"get\"'],\n [\"batch-get\", 'entries action=\"batch\"'],\n [\"search\", 'entries action=\"search\"'],\n [\"relate-entries\", 'relations action=\"create\"'],\n [\"batch-relate\", 'relations action=\"batch-create\"'],\n [\"find-related\", 'graph action=\"find\"'],\n [\"suggest-links\", 'graph action=\"suggest\"'],\n [\"gather-context\", 'context action=\"gather\"'],\n [\"get-build-context\", 'context action=\"build\"'],\n [\"list-collections\", 'collections action=\"list\"'],\n [\"create-collection\", 'collections action=\"create\"'],\n [\"update-collection\", 'collections action=\"update\"'],\n [\"agent-start\", 'session action=\"start\"'],\n [\"agent-close\", 'session action=\"close\"'],\n [\"agent-status\", 'session action=\"status\"'],\n [\"workspace-status\", 'health action=\"status\"'],\n [\"mcp-audit\", 'health action=\"audit\"'],\n [\"quality-check\", 'quality action=\"check\"'],\n [\"re-evaluate\", 'quality action=\"re-evaluate\"'],\n [\"list-workflows\", 'workflows action=\"list\"'],\n [\"workflow-checkpoint\", 'workflows action=\"checkpoint\"'],\n [\"wrapup\", \"session-wrapup\"],\n [\"finish\", \"session-wrapup\"],\n]);\n\n/**\n * Translates any deprecated tool names found in text to their current equivalents.\n * Returns null if no translations were needed, or a footnote string listing them.\n */\nexport function translateStaleToolNames(text: string): string | null {\n const found: string[] = [];\n for (const [old, current] of TOOL_NAME_MIGRATIONS) {\n const pattern = new RegExp(`\\\\b${old.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\b`, \"g\");\n if (pattern.test(text)) {\n found.push(`\\`${old}\\` → \\`${current}\\``);\n }\n }\n if (found.length === 0) return null;\n return `\\n\\n---\\n_Tool name translations (these references use deprecated names):_\\n${found.map(f => `- ${f}`).join(\"\\n\")}`;\n}\n","/**\n * Tool surface module — originally controlled write-tool visibility.\n *\n * Write tools are now always visible (all 31 from connection). Handler-level\n * guards (requireWriteAccess) enforce session + orient + key scope.\n *\n * Hiding tools via disable() broke Claude's lazy tool indexing — it never\n * re-indexed after list_changed notifications. The MCP spec says clients\n * SHOULD handle list_changed, but not all do.\n *\n * trackWriteTool() is kept as a no-op so existing registrations don't need\n * import changes. The module can be fully removed in a future cleanup pass.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nexport function initToolSurface(_server: McpServer): void {\n // Retained for call-site compatibility; no longer manages state.\n}\n\nexport function trackWriteTool(_tool: unknown): void {\n // No-op — tools stay enabled. Handler guards do the real protection.\n}\n","/**\n * Feature flag resolution — STD-feature-flag-hierarchy\n * Three-tier check: env kill switch > local dev override > PostHog remote.\n * Fail-closed: returns false when PostHog is unavailable or flag is unknown.\n */\nimport { PostHog } from \"posthog-node\";\n\nlet client: PostHog | null = null;\n\nconst LOCAL_OVERRIDES: Record<string, boolean> = {\n // Uncomment for local dev without PostHog:\n // \"workspace-full-surface\": false,\n // \"chainwork-enabled\": true,\n // \"active-intelligence-shaping\": true, // ENT-59: Opus-powered investigation during shaping\n // \"capture-without-thinking\": true, // BET-73: collection-optional capture classifier\n};\n\nexport function initFeatureFlags(posthogClient: PostHog | null): void {\n if (posthogClient) {\n client = posthogClient;\n return;\n }\n\n // Fallback: allow feature flags even when analytics tracking key is absent.\n const apiKey = process.env.POSTHOG_MCP_KEY || process.env.PUBLIC_POSTHOG_KEY;\n if (!apiKey) {\n client = null;\n return;\n }\n\n client = new PostHog(apiKey, {\n host: process.env.PUBLIC_POSTHOG_HOST || \"https://eu.i.posthog.com\",\n flushAt: 1,\n flushInterval: 5000,\n featureFlagsPollingInterval: 30_000,\n });\n}\n\nexport async function isFeatureEnabled(\n flag: string,\n workspaceId: string,\n workspaceSlug?: string,\n): Promise<boolean> {\n if (process.env.FEATURE_KILL_SWITCH === \"true\") return false;\n if (flag in LOCAL_OVERRIDES) return LOCAL_OVERRIDES[flag];\n if (!client) return false;\n try {\n const primary = await client.isFeatureEnabled(flag, workspaceId, {\n groups: { workspace: workspaceId },\n groupProperties: {\n workspace: {\n workspace_id: workspaceId,\n slug: workspaceSlug ?? \"\",\n },\n },\n });\n if (primary) return true;\n\n // Support slug-keyed group targeting used in dogfood rollout conditions.\n if (workspaceSlug && workspaceSlug !== workspaceId) {\n const secondary = await client.isFeatureEnabled(flag, workspaceSlug, {\n groups: { workspace: workspaceSlug },\n groupProperties: {\n workspace: {\n workspace_id: workspaceId,\n slug: workspaceSlug,\n },\n },\n });\n return secondary ?? false;\n }\n\n return primary ?? false;\n } catch {\n return false;\n }\n}\n","export const CLASSIFIER_AUTO_ROUTE_THRESHOLD = 70;\nexport const CLASSIFIER_AMBIGUITY_MARGIN = 15;\nexport const STARTER_COLLECTIONS = [\"decisions\", \"tensions\", \"glossary\", \"insights\", \"bets\"] as const;\n\nconst SIGNAL_WEIGHT = 10;\nconst MAX_MATCHES_PER_SIGNAL = 2;\nconst MAX_REASON_COUNT = 3;\n\nexport type StarterCollectionSlug = (typeof STARTER_COLLECTIONS)[number];\n\nexport type ClassificationResult = {\n collection: StarterCollectionSlug;\n topConfidence: number;\n // Backward-compatible alias for topConfidence.\n confidence: number;\n reasons: string[];\n candidates: Array<{\n collection: StarterCollectionSlug;\n // Backward-compatible alias for signalScore.\n confidence: number;\n signalScore: number;\n }>;\n scoreMargin: number;\n};\n\nconst STARTER_COLLECTION_SIGNALS: Record<StarterCollectionSlug, string[]> = {\n decisions: [\n \"decide\", \"decision\", \"chose\", \"chosen\", \"choice\", \"resolved\", \"we will\", \"we should\", \"approved\",\n ],\n tensions: [\n \"problem\", \"issue\", \"blocked\", \"blocker\", \"friction\", \"pain\", \"risk\", \"constraint\", \"bottleneck\", \"struggle\",\n ],\n glossary: [\n \"definition\", \"define\", \"term\", \"means\", \"refers to\", \"is called\", \"vocabulary\", \"terminology\",\n ],\n insights: [\n \"insight\", \"learned\", \"observed\", \"pattern\", \"trend\", \"signal\", \"found that\", \"evidence\",\n ],\n bets: [\n \"bet\", \"appetite\", \"scope\", \"elements\", \"rabbit hole\", \"no-go\", \"shape\", \"shaping\", \"done when\",\n ],\n};\n\nfunction escapeRegExp(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction countSignalMatches(text: string, signal: string): number {\n const trimmed = signal.trim().toLowerCase();\n if (!trimmed) return 0;\n\n const words = trimmed.split(/\\s+/).map(escapeRegExp);\n const pattern = `\\\\b${words.join(\"\\\\s+\")}\\\\b`;\n const regex = new RegExp(pattern, \"g\");\n const matches = text.match(regex);\n return matches?.length ?? 0;\n}\n\nexport function classifyStarterCollection(name: string, description: string): ClassificationResult | null {\n const text = `${name} ${description}`.toLowerCase();\n const rawScores: Array<{ collection: StarterCollectionSlug; score: number; reasons: string[] }> = [];\n\n for (const collection of STARTER_COLLECTIONS) {\n const signals = STARTER_COLLECTION_SIGNALS[collection];\n const reasons: string[] = [];\n let score = 0;\n\n for (const signal of signals) {\n const matches = countSignalMatches(text, signal);\n if (matches <= 0) continue;\n\n const cappedMatches = Math.min(matches, MAX_MATCHES_PER_SIGNAL);\n score += cappedMatches * SIGNAL_WEIGHT;\n\n if (reasons.length < MAX_REASON_COUNT) {\n const capNote = matches > cappedMatches ? ` (capped at ${cappedMatches})` : \"\";\n reasons.push(`matched \"${signal}\" x${matches}${capNote}`);\n }\n }\n\n rawScores.push({ collection, score, reasons });\n }\n\n rawScores.sort((a, b) => b.score - a.score);\n const top = rawScores[0];\n const second = rawScores[1];\n\n if (!top || top.score <= 0) return null;\n\n const margin = Math.max(0, top.score - (second?.score ?? 0));\n const baseConfidence = Math.min(90, top.score);\n const confidence = Math.min(99, baseConfidence + Math.min(20, margin));\n\n return {\n collection: top.collection,\n topConfidence: confidence,\n confidence,\n reasons: top.reasons,\n scoreMargin: margin,\n candidates: rawScores\n .filter((candidate) => candidate.score > 0)\n .slice(0, 3)\n .map((candidate) => ({\n collection: candidate.collection,\n signalScore: Math.min(99, candidate.score),\n confidence: Math.min(99, candidate.score),\n })),\n };\n}\n\nexport function shouldAutoRouteClassification(result: ClassificationResult): boolean {\n if (result.confidence < CLASSIFIER_AUTO_ROUTE_THRESHOLD) return false;\n if (result.scoreMargin < CLASSIFIER_AMBIGUITY_MARGIN) return false;\n return true;\n}\n\nexport function isClassificationAmbiguous(result: ClassificationResult): boolean {\n return result.scoreMargin < CLASSIFIER_AMBIGUITY_MARGIN;\n}\n","/**\n * Response Envelope — Agent-Native MCP Contract (BET-78)\n *\n * Universal response shape for all MCP tool responses.\n * Lives in structuredContent — zero breaking changes to content[0].text.\n *\n * Design: envelope IS structuredContent, not nested inside it.\n * Discriminated on `ok` for O(1) agent parsing.\n */\n\nimport { z, type ZodTypeAny } from \"zod\";\nimport { classifyError } from \"./errors.js\";\n\n// ─── Types ───────────────────────────────────────────────────────────────\n\nexport interface NextAction {\n tool: string;\n description: string;\n parameters: Record<string, unknown>;\n}\n\nexport interface EnvelopeMeta {\n durationMs?: number;\n}\n\nexport interface EnvelopeSuccess<T = Record<string, unknown>> {\n ok: true;\n summary: string;\n data: T;\n next?: NextAction[];\n _meta?: EnvelopeMeta;\n}\n\nexport interface EnvelopeError {\n ok: false;\n code: string;\n message: string;\n recovery?: string;\n availableActions?: NextAction[];\n diagnostics?: Record<string, unknown>;\n _meta?: EnvelopeMeta;\n}\n\nexport type Envelope<T = Record<string, unknown>> =\n | EnvelopeSuccess<T>\n | EnvelopeError;\n\n// ─── Builders ────────────────────────────────────────────────────────────\n\nexport function success<T>(\n summary: string,\n data: T,\n next?: NextAction[],\n): EnvelopeSuccess<T> {\n return {\n ok: true,\n summary: summary || \"Operation completed.\",\n data,\n ...(next?.length ? { next } : {}),\n };\n}\n\nexport function failure(\n code: string,\n message: string,\n recovery?: string,\n availableActions?: NextAction[],\n diagnostics?: Record<string, unknown>,\n): EnvelopeError {\n return {\n ok: false,\n code,\n message,\n ...(recovery ? { recovery } : {}),\n ...(availableActions?.length ? { availableActions } : {}),\n ...(diagnostics ? { diagnostics } : {}),\n };\n}\n\n/** Shorthand for NOT_FOUND failures — the most common soft-failure pattern. */\nexport function notFound(id: string, hint?: string): EnvelopeError {\n return failure(\n \"NOT_FOUND\",\n `Entry '${id}' not found.`,\n hint ?? \"Use entries action=search to find the correct ID.\",\n [{ tool: \"entries\", description: \"Search entries\", parameters: { action: \"search\", query: id } }],\n );\n}\n\n/** Shorthand for VALIDATION_ERROR failures. */\nexport function validationError(message: string): EnvelopeError {\n return failure(\"VALIDATION_ERROR\", message);\n}\n\n// ─── Tool Response Helpers ───────────────────────────────────────────────\n\ntype TextContent = { type: \"text\"; text: string };\ntype ToolResult = {\n content: TextContent[];\n structuredContent?: Record<string, unknown>;\n isError?: boolean;\n};\n\n/** Build a `content` array from a single text string. */\nexport function textContent(text: string): TextContent[] {\n return [{ type: \"text\" as const, text }];\n}\n\n/**\n * Parse args against a Zod schema and return a typed result or a ready-to-return\n * validation error ToolResult. Eliminates the 5-line parse+check+format boilerplate.\n */\nexport function parseOrFail<T extends z.ZodTypeAny>(\n schema: T,\n args: unknown,\n): { ok: true; data: z.infer<T> } | { ok: false; result: ToolResult } {\n const parsed = schema.safeParse(args);\n if (parsed.success) return { ok: true, data: parsed.data };\n const issues = parsed.error.issues\n .map((i: z.ZodIssue) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \");\n const msg = `Invalid arguments: ${issues}`;\n return {\n ok: false,\n result: { content: textContent(msg), structuredContent: validationError(msg) },\n };\n}\n\n/** Standard response for unknown compound-tool actions. */\nexport function unknownAction(action: string, valid: readonly string[]): ToolResult {\n const msg = `Unknown action '${action}'. Valid actions: ${valid.join(\", \")}.`;\n return { content: textContent(msg), structuredContent: validationError(msg) };\n}\n\n// ─── Compound Result Builders ─────────────────────────────────────────\n// Eliminate the { content: [...], structuredContent: ... } boilerplate.\n\n/** Success result with human-readable text + structured envelope in one call. */\nexport function successResult<T>(\n text: string,\n summary: string,\n data: T,\n next?: NextAction[],\n): ToolResult {\n return { content: textContent(text), structuredContent: success(summary, data, next) };\n}\n\n/** Failure result with human-readable text + structured error envelope. */\nexport function failureResult(\n text: string,\n code: string,\n message: string,\n recovery?: string,\n availableActions?: NextAction[],\n diagnostics?: Record<string, unknown>,\n): ToolResult {\n return { content: textContent(text), structuredContent: failure(code, message, recovery, availableActions, diagnostics) };\n}\n\n/** Not-found result — the most common soft failure pattern. */\nexport function notFoundResult(id: string, text?: string, hint?: string): ToolResult {\n return { content: textContent(text ?? `Entry '${id}' not found.`), structuredContent: notFound(id, hint) };\n}\n\n/** Validation error result where the text and error message are the same. */\nexport function validationResult(message: string): ToolResult {\n return { content: textContent(message), structuredContent: validationError(message) };\n}\n\n// ─── Zod Schema Helper ──────────────────────────────────────────────────\n\nconst nextActionSchema = z.object({\n tool: z.string(),\n description: z.string(),\n parameters: z.record(z.unknown()),\n});\n\nconst metaSchema = z.object({\n durationMs: z.number().optional(),\n}).optional();\n\n/**\n * Wraps any data schema into a discriminated-union envelope schema.\n * Use for contract tests: `envelopeSchema(captureOutputSchema).safeParse(result)`.\n */\nexport function envelopeSchema<T extends ZodTypeAny>(dataSchema: T) {\n return z.discriminatedUnion(\"ok\", [\n z.object({\n ok: z.literal(true),\n summary: z.string().min(1),\n data: dataSchema,\n next: z.array(nextActionSchema).optional(),\n _meta: metaSchema,\n }),\n z.object({\n ok: z.literal(false),\n code: z.string().min(1),\n message: z.string().min(1),\n recovery: z.string().optional(),\n availableActions: z.array(nextActionSchema).optional(),\n diagnostics: z.record(z.unknown()).optional(),\n _meta: metaSchema,\n }),\n ]);\n}\n\n// ─── withEnvelope HOF ───────────────────────────────────────────────────\n\n/**\n * Wraps a tool handler to guarantee an Envelope in structuredContent.\n *\n * - Catches thrown errors (gates, backend) and classifies them.\n * - If the handler already returns an envelope (ok field present), passes through.\n * - Adds _meta.durationMs to every response.\n * - Owns isError: sets true iff ok===false (RH1 mitigation — TEN-206).\n */\nexport function withEnvelope<Args>(\n handler: (args: Args) => Promise<ToolResult>,\n): (args: Args) => Promise<ToolResult> {\n return async (args: Args): Promise<ToolResult> => {\n const start = Date.now();\n try {\n const result = await handler(args);\n const durationMs = Date.now() - start;\n\n const sc = result.structuredContent as Envelope | undefined;\n if (sc && typeof sc === \"object\" && \"ok\" in sc) {\n sc._meta = { ...sc._meta, durationMs };\n return {\n content: result.content ?? [],\n structuredContent: sc,\n ...(sc.ok === false ? { isError: true } : {}),\n };\n }\n\n // Safety net: all tools should be migrated. If this executes, a handler\n // is returning without an envelope — log so it surfaces during development.\n console.warn(`[withEnvelope] Handler returned without envelope shape. Wrapping automatically. Content preview: \"${result.content?.[0]?.text?.slice(0, 60) ?? \"(empty)\"}\"`);\n return {\n content: result.content ?? [],\n structuredContent: {\n ...success(\n result.content?.[0]?.text?.slice(0, 100) ?? \"\",\n sc ?? {},\n ),\n _meta: { durationMs },\n },\n };\n } catch (err) {\n const durationMs = Date.now() - start;\n const classified = classifyError(err);\n const envelope: EnvelopeError = {\n ...failure(\n classified.code,\n classified.message,\n classified.recovery,\n classified.availableActions,\n ),\n _meta: { durationMs },\n };\n return {\n content: [{ type: \"text\" as const, text: classified.message }],\n structuredContent: envelope,\n isError: true,\n };\n }\n };\n}\n","/**\n * Structured error classification for the Response Envelope (BET-78, FEAT-121).\n *\n * Typed error classes + classifyError pattern-matching.\n * classifyError handles both typed classes (new code) and plain Error\n * messages from client.ts gates (existing code — no modifications needed).\n */\n\nimport type { NextAction } from \"./envelope.js\";\n\n// ─── Typed Error Classes ─────────────────────────────────────────────────\n\nexport class GateError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GateError\";\n }\n}\n\nexport class BackendError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BackendError\";\n }\n}\n\nexport class ValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ValidationError\";\n }\n}\n\n// ─── Classification Result ───────────────────────────────────────────────\n\nexport interface ClassifiedError {\n code: string;\n message: string;\n recovery?: string;\n availableActions?: NextAction[];\n}\n\n// ─── Gate Patterns (from client.ts requireWriteAccess / requireActiveSession) ─\n\ninterface GatePattern {\n pattern: RegExp;\n code: string;\n recovery: string;\n action: NextAction;\n}\n\nconst GATE_PATTERNS: GatePattern[] = [\n {\n pattern: /session required|no active.*session|call.*session.*start/i,\n code: \"SESSION_REQUIRED\",\n recovery: \"Start an agent session first.\",\n action: { tool: \"session\", description: \"Start session\", parameters: { action: \"start\" } },\n },\n {\n pattern: /session.*closed/i,\n code: \"SESSION_CLOSED\",\n recovery: \"Start a new session.\",\n action: { tool: \"session\", description: \"Start new session\", parameters: { action: \"start\" } },\n },\n {\n pattern: /orientation required|call.*orient/i,\n code: \"ORIENTATION_REQUIRED\",\n recovery: \"Orient before writing.\",\n action: { tool: \"orient\", description: \"Orient session\", parameters: {} },\n },\n {\n pattern: /read.?only.*scope/i,\n code: \"READONLY_SCOPE\",\n recovery: \"This API key cannot write. Use a readwrite key.\",\n action: { tool: \"health\", description: \"Check key scope\", parameters: { action: \"whoami\" } },\n },\n];\n\n// ─── Classification ──────────────────────────────────────────────────────\n\n/**\n * Classify an error into a structured code + recovery path.\n * Handles:\n * 1. Gate errors (from requireWriteAccess / requireActiveSession)\n * 2. Backend errors (network/connectivity)\n * 3. Not-found errors\n * 4. Validation errors\n * 5. Duplicate/conflict errors\n * 6. Fallback to INTERNAL_ERROR\n */\nexport function classifyError(err: unknown): ClassifiedError {\n const message = err instanceof Error ? err.message : String(err);\n\n if (err instanceof GateError) {\n return {\n code: \"PERMISSION_DENIED\",\n message,\n recovery: \"Check permissions or use a readwrite API key.\",\n availableActions: [{ tool: \"health\", description: \"Check key scope\", parameters: { action: \"whoami\" } }],\n };\n }\n\n if (err instanceof BackendError) {\n return { code: \"BACKEND_ERROR\", message, recovery: \"Retry the operation or check backend health.\" };\n }\n\n if (err instanceof ValidationError) {\n return { code: \"VALIDATION_ERROR\", message };\n }\n\n for (const { pattern, code, recovery, action } of GATE_PATTERNS) {\n if (pattern.test(message)) {\n return { code, message, recovery, availableActions: [action] };\n }\n }\n\n if (/network error|fetch failed|ECONNREFUSED|ETIMEDOUT/i.test(message)) {\n return { code: \"BACKEND_UNAVAILABLE\", message, recovery: \"Retry in a few seconds.\" };\n }\n\n if (/not found/i.test(message)) {\n return {\n code: \"NOT_FOUND\",\n message,\n recovery: \"Use entries action=search to find the correct ID.\",\n availableActions: [{ tool: \"entries\", description: \"Search entries\", parameters: { action: \"search\" } }],\n };\n }\n\n if (/duplicate|already exists/i.test(message)) {\n return {\n code: \"DUPLICATE\",\n message,\n recovery: \"Use entries action=get to inspect the existing entry.\",\n availableActions: [{ tool: \"entries\", description: \"Get entry\", parameters: { action: \"get\" } }],\n };\n }\n\n if (/invalid|validation|required field/i.test(message)) {\n return { code: \"VALIDATION_ERROR\", message };\n }\n\n return { code: \"INTERNAL_ERROR\", message: message || \"An unexpected error occurred.\" };\n}\n"],"mappings":";;;;;;;;;;AAOA,SAAS,KAAAA,UAAS;;;ACKlB,SAAS,qBAAAC,0BAAyB;;;ACFlC,SAAS,yBAAyB;AAQlC,IAAM,eAAe,IAAI,kBAA+B;AAEjD,SAAS,YAAe,MAAmB,IAA0C;AAC1F,SAAO,aAAa,IAAI,MAAM,EAAE;AAClC;AAEO,SAAS,mBAAuC;AACrD,SAAO,aAAa,SAAS,GAAG;AAClC;AAmBA,IAAM,iBAAiB,KAAK,KAAK;AACjC,IAAM,WAAW;AACjB,IAAM,cAAc,oBAAI,IAAsB;AAE9C,SAAS,cAAwB;AAC/B,SAAO;AAAA,IACL,aAAa;AAAA,IACb,eAAe;AAAA,IACf,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,yBAAyB;AAAA,IACzB,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,YAAY,KAAK,IAAI;AAAA,EACvB;AACF;AAEO,SAAS,YAAY,QAA0B;AACpD,MAAI,IAAI,YAAY,IAAI,MAAM;AAC9B,MAAI,CAAC,GAAG;AACN,QAAI,YAAY;AAChB,gBAAY,IAAI,QAAQ,CAAC;AACzB,eAAW;AAAA,EACb;AACA,IAAE,aAAa,KAAK,IAAI;AACxB,SAAO;AACT;AAEA,SAAS,aAAmB;AAC1B,MAAI,YAAY,QAAQ,SAAU;AAClC,QAAM,MAAM,KAAK,IAAI;AACrB,aAAW,CAAC,KAAK,CAAC,KAAK,aAAa;AAClC,QAAI,MAAM,EAAE,aAAa,eAAgB,aAAY,OAAO,GAAG;AAAA,EACjE;AACA,MAAI,YAAY,OAAO,UAAU;AAC/B,UAAM,SAAS,CAAC,GAAG,YAAY,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,UAAU;AAC1F,aAAS,IAAI,GAAG,IAAI,OAAO,SAAS,UAAU,KAAK;AACjD,kBAAY,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC;AAAA,IACjC;AAAA,EACF;AACF;;;ADrEA,IAAM,mBAAmB,IAAIC,mBAAqD;AAO3E,SAAS,mBACd,KACA,IACgB;AAChB,SAAO,iBAAiB,IAAI,KAAK,EAAE;AACrC;AAEA,SAAS,iBAA2D;AAClE,SAAO,iBAAiB,SAAS,KAAK;AACxC;AAEA,IAAM,oBAAoB;AAI1B,IAAM,eAAe;AACrB,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,YAAY,IAAqB;AACxC,SAAQ,cAAoC,SAAS,EAAE;AACzD;AAEA,IAAM,eACJ;AAEF,SAAS,QAAQ,IAAqB;AACpC,MAAI,GAAG,WAAW,QAAQ,EAAG,QAAO;AACpC,SAAO,CAAC,aAAa,KAAK,EAAE;AAC9B;AAOA,IAAM,YAAY,oBAAI,IAAiC;AAEvD,SAAS,SAAS,IAAY,MAAuC;AACnE,SAAO,GAAG,EAAE,IAAI,KAAK,UAAU,IAAI,CAAC;AACtC;AAEA,SAAS,UAAa,IAAY,MAA8C;AAC9E,MAAI,CAAC,YAAY,EAAE,EAAG,QAAO;AAC7B,QAAM,MAAM,SAAS,IAAI,IAAI;AAC7B,QAAM,QAAQ,UAAU,IAAI,GAAG;AAC/B,MAAI,CAAC,SAAS,KAAK,IAAI,IAAI,MAAM,WAAW;AAC1C,QAAI,MAAO,WAAU,OAAO,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,SAAO,MAAM;AACf;AAEA,SAAS,UAAa,IAAY,MAA+B,MAAe;AAC9E,MAAI,CAAC,YAAY,EAAE,EAAG;AACtB,QAAM,MAAM,SAAS,IAAI,IAAI;AAC7B,YAAU,IAAI,KAAK,EAAE,MAAM,WAAW,KAAK,IAAI,IAAI,aAAa,CAAC;AACnE;AAEA,SAAS,sBAA4B;AACnC,YAAU,MAAM;AAClB;AAIA,IAAM,cAAwB;AAAA,EAC5B,aAAa;AAAA,EACb,eAAe;AAAA,EACf,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,YAAY;AACd;AAMA,SAAS,QAAkB;AACzB,QAAM,SAAS,iBAAiB;AAChC,MAAI,OAAQ,QAAO,YAAY,MAAM;AACrC,SAAO;AACT;AAKA,SAAS,kBAA0B;AACjC,QAAM,cAAc,iBAAiB;AACrC,MAAI,YAAa,QAAO;AACxB,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,8EAAyE;AACvG,SAAO;AACT;AAIO,SAAS,oBAAmC;AACjD,SAAO,MAAM,EAAE;AACjB;AAEO,SAAS,oBAA6B;AAC3C,SAAO,MAAM,EAAE;AACjB;AAEO,SAAS,mBAAmB,OAAsB;AACvD,QAAM,EAAE,kBAAkB;AAC5B;AAEO,SAAS,iBAAuC;AACrD,SAAO,MAAM,EAAE;AACjB;AAuBA,eAAsB,oBAAsD;AAC1E,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,IAAI,MAAM;AAChB,MAAI,CAAC,EAAE,UAAU;AACf,UAAM,IAAI,MAAM,uFAAuF;AAAA,EACzG;AAEA,QAAM,SAAS,MAAM,QAAiC,sBAAsB;AAAA,IAC1E;AAAA,IACA,UAAU,EAAE;AAAA,EACd,CAAC;AAED,IAAE,iBAAiB,OAAO;AAC1B,IAAE,cAAc,OAAO;AACvB,IAAE,kBAAkB;AACpB,IAAE,gBAAgB;AAClB,qBAAmB;AAEnB,SAAO;AACT;AAMA,eAAsB,oBAAmC;AACvD,QAAM,IAAI,MAAM;AAChB,MAAI,CAAC,EAAE,eAAgB;AACvB,MAAI;AACF,UAAM,QAAQ,sBAAsB;AAAA,MAClC,WAAW,EAAE;AAAA,MACb,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,UAAE;AACA,MAAE,gBAAgB;AAClB,MAAE,iBAAiB;AACnB,MAAE,kBAAkB;AAAA,EACtB;AACF;AAKA,eAAsB,qBAAoC;AACxD,QAAM,IAAI,MAAM;AAChB,MAAI,CAAC,EAAE,eAAgB;AACvB,MAAI;AACF,UAAM,QAAQ,sBAAsB;AAAA,MAClC,WAAW,EAAE;AAAA,MACb,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,QAAQ;AAAA,EAER,UAAE;AACA,MAAE,iBAAiB;AACnB,MAAE,kBAAkB;AAAA,EACtB;AACF;AAOA,IAAI,eAAe;AACnB,IAAM,oBAAoB;AAEnB,SAAS,uBAA6B;AAC3C,QAAM,IAAI,MAAM;AAChB,MAAI,CAAC,EAAE,eAAgB;AAEvB,QAAM,MAAM,KAAK,IAAI;AACrB,MAAI,MAAM,eAAe,kBAAmB;AAC5C,iBAAe;AAEf,UAAQ,sBAAsB;AAAA,IAC5B,WAAW,EAAE;AAAA,EACf,CAAC,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACnB;AAEO,SAAS,qBAA2B;AACzC,iBAAe;AACjB;AAKA,eAAsB,sBAAsB,UAO1B;AAChB,QAAM,IAAI,MAAM;AAChB,MAAI,CAAC,EAAE,eAAgB;AACvB,MAAI;AACF,UAAM,QAAQ,wBAAwB;AAAA,MACpC,WAAW,EAAE;AAAA,MACb,GAAG;AAAA,IACL,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;AAeA,IAAM,oBAAoB;AAC1B,IAAM,cAA4B,CAAC;AAO5B,SAAS,YAAkB;AAChC,UAAQ,IAAI,oBAAoB,QAAQ,IAAI,oBAAoB;AAChE,QAAM,QAAQ,QAAQ,IAAI;AAC1B,MAAI,CAAC,OAAO,WAAW,QAAQ,GAAG;AAChC,YAAQ,OAAO;AAAA,MACb;AAAA,IAEF;AAAA,EACF;AACF;AAMO,SAAS,gBAAsB;AACpC,UAAQ,IAAI,oBAAoB,QAAQ,IAAI,oBAAoB;AAClE;AAKA,SAAS,OAAO,KAAqB;AACnC,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,GAAG,GAAG,mCAAmC;AACrE,SAAO;AACT;AAEA,SAAS,eAAe,QAAiC;AACvD,SAAO,WAAW,WAAW,QAAQ,IAAI,cAAc;AACzD;AAEA,SAAS,MAAM,IAAY,QAAwB,YAAoB,UAAyB;AAC9F,QAAM,MAAK,oBAAI,KAAK,GAAE,YAAY;AAClC,QAAM,YAAY,MAAM,EAAE,eAAe;AACzC,QAAM,UAAU,eAAe;AAE/B,QAAM,QAAoB,EAAE,IAAI,IAAI,WAAW,QAAQ,WAAW;AAClE,MAAI,SAAU,OAAM,QAAQ;AAC5B,MAAI,QAAS,OAAM,cAAc;AACjC,cAAY,KAAK,KAAK;AACtB,MAAI,YAAY,SAAS,kBAAmB,aAAY,MAAM;AAE9D,gBAAc,IAAI,QAAQ,YAAY,WAAW,QAAQ;AAEzD,MAAI,CAAC,eAAe,MAAM,EAAG;AAE7B,QAAM,OAAO,eAAe,EAAE,OAAO,EAAE,cAAc,SAAS,WAAW,MAAM,aAAa,UAAU;AACtG,MAAI,WAAW,WAAW,UAAU;AAClC,YAAQ,OAAO,MAAM,GAAG,IAAI,UAAU,KAAK,UAAU,QAAQ,CAAC;AAAA,CAAI;AAAA,EACpE,OAAO;AACL,YAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,EAClC;AACF;AAEO,SAAS,cAAqC;AACnD,SAAO;AACT;AAaA,eAAsB,QAAW,IAAY,OAAgC,CAAC,GAAe;AAC3F,QAAM,SAAS,UAAa,IAAI,IAAI;AACpC,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,iBAAiB,EAAE,QAAQ,OAAO,EAAE;AAC3D,QAAM,SAAS,gBAAgB;AAE/B,QAAM,QAAQ,KAAK,IAAI;AAEvB,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM,GAAG,OAAO,YAAY;AAAA,MACtC,QAAQ;AAAA,MACR,QAAQ,YAAY,QAAQ,GAAM;AAAA,MAClC,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,MAAM;AAAA,MACjC;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,IAAI,KAAK,CAAC;AAAA,IACnC,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,UAAM,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,IAAI,OAAO;AAClD,UAAM,IAAI,MAAM,aAAa,EAAE,oBAAoB,IAAI,OAAO,EAAE;AAAA,EAClE;AAEA,QAAM,OAAQ,MAAM,IAAI,KAAK;AAE7B,MAAI,CAAC,IAAI,MAAM,KAAK,OAAO;AACzB,UAAM,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK;AACjD,UAAM,IAAI,MAAM,aAAa,EAAE,aAAa,IAAI,MAAM,MAAM,KAAK,SAAS,eAAe,EAAE;AAAA,EAC7F;AAEA,QAAM,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK;AAElC,QAAM,OAAO,KAAK;AAClB,MAAI,QAAQ,EAAE,GAAG;AACf,wBAAoB;AAAA,EACtB,OAAO;AACL,cAAU,IAAI,MAAM,IAAI;AAAA,EAC1B;AAEA,QAAM,IAAI,MAAM;AAKhB,QAAM,iBAAiB,oBAAI,IAAI,CAAC,sBAAsB,sBAAsB,oBAAoB,CAAC;AACjG,MAAI,EAAE,kBAAkB,CAAC,eAAe,IAAI,EAAE,GAAG;AAC/C,yBAAqB;AAAA,EACvB;AAEA,SAAO;AACT;AAIA,IAAM,qBAAqB,oBAAI,IAA6B;AAE5D,eAAsB,iBAAkC;AACtD,QAAM,IAAI,MAAM;AAChB,MAAI,EAAE,YAAa,QAAO,EAAE;AAE5B,QAAM,SAAS,gBAAgB;AAC/B,QAAM,WAAW,mBAAmB,IAAI,MAAM;AAC9C,MAAI,SAAU,QAAO;AAErB,QAAM,UAAU,0BAA0B,EAAE,QAAQ,MAAM,mBAAmB,OAAO,MAAM,CAAC;AAC3F,qBAAmB,IAAI,QAAQ,OAAO;AACtC,SAAO;AACT;AAEA,eAAe,0BAA0B,aAAa,GAAoB;AACxE,MAAI,YAA0B;AAE9B,WAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AACtD,QAAI;AACF,YAAM,YAAY,MAAM,QAQd,oBAAoB,CAAC,CAAC;AAEhC,UAAI,CAAC,WAAW;AACd,cAAM,IAAI;AAAA,UACR,8DACa,eAAe;AAAA,QAC9B;AAAA,MACF;AAEA,YAAM,IAAI,MAAM;AAChB,QAAE,cAAc,UAAU;AAC1B,QAAE,gBAAgB,UAAU;AAC5B,QAAE,gBAAgB,UAAU;AAC5B,QAAE,qBAAqB,UAAU,aAAa;AAC9C,QAAE,0BAA0B,UAAU,kBAAkB;AACxD,UAAI,UAAU,SAAU,GAAE,cAAc,UAAU;AAClD,UAAI,UAAU,MAAO,GAAE,WAAW,UAAU;AAC5C,aAAO,EAAE;AAAA,IACX,SAAS,KAAU;AACjB,kBAAY;AACZ,YAAM,cAAc,qDAAqD,KAAK,IAAI,OAAO;AACzF,UAAI,CAAC,eAAe,YAAY,WAAY;AAC5C,YAAM,QAAQ,OAAQ,UAAU;AAChC,cAAQ,OAAO;AAAA,QACb,8CAA8C,UAAU,CAAC,IAAI,aAAa,CAAC,kBAAkB,KAAK;AAAA;AAAA,MACpG;AACA,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AAAA,IAC/C;AAAA,EACF;AAEA,QAAM;AACR;AAWA,eAAsB,sBAAiD;AACrE,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,IAAI,MAAM;AAChB,SAAO;AAAA,IACL;AAAA,IACA,eAAe,EAAE,iBAAiB;AAAA,IAClC,eAAe,EAAE,iBAAiB;AAAA,IAClC,WAAW,EAAE;AAAA,IACb,gBAAgB,EAAE,2BAA2B;AAAA,EAC/C;AACF;AAEA,eAAsB,SAAY,IAAY,OAAgC,CAAC,GAAe;AAC5F,QAAM,cAAc,MAAM,eAAe;AACzC,SAAO,QAAW,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;AAChD;AAEA,eAAsB,YAAe,IAAY,OAAgC,CAAC,GAAe;AAC/F,QAAM,cAAc,MAAM,eAAe;AACzC,SAAO,QAAW,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;AAChD;AASO,SAAS,uBAA6B;AAC3C,QAAM,IAAI,MAAM;AAEhB,MAAI,CAAC,EAAE,gBAAgB;AACrB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,EAAE,eAAe;AACnB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,EAAE,iBAAiB;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAWO,SAAS,qBAA2B;AACzC,QAAM,IAAI,MAAM;AAEhB,MAAI,CAAC,EAAE,gBAAgB;AACrB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,EAAE,eAAe;AACnB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,EAAE,iBAAiB;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,EAAE,gBAAgB,QAAQ;AAC5B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAMA,eAAsB,sBAAqC;AACzD,QAAM,IAAI,MAAM;AAChB,MAAI,CAAC,EAAE,YAAa;AACpB,MAAI;AACF,UAAM,UAAU,MAAM,QAKZ,0BAA0B,EAAE,aAAa,EAAE,YAAY,CAAC;AAElE,QAAI,WAAW,QAAQ,WAAW,UAAU;AAC1C,QAAE,iBAAiB,QAAQ;AAC3B,QAAE,kBAAkB,QAAQ;AAC5B,QAAE,cAAc,QAAQ;AACxB,QAAE,gBAAgB;AAAA,IACpB;AAAA,EACF,QAAQ;AAAA,EAER;AACF;;;AE5lBO,SAAS,eAAe,MAAe,QAAwB;AACpE,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,IAAI;AACV,QAAM,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ;AAClE,MAAI,OAAO,QAAQ,YAAY,CAAC,IAAK,QAAO;AAC5C,SAAO,IAAI,SAAS,SAAS,IAAI,UAAU,GAAG,MAAM,IAAI,QAAQ;AAClE;AAQO,IAAM,uBAAoD,oBAAI,IAAI;AAAA,EACvE,CAAC,gBAAgB,uBAAuB;AAAA,EACxC,CAAC,aAAa,sBAAsB;AAAA,EACpC,CAAC,aAAa,wBAAwB;AAAA,EACtC,CAAC,UAAU,yBAAyB;AAAA,EACpC,CAAC,kBAAkB,2BAA2B;AAAA,EAC9C,CAAC,gBAAgB,iCAAiC;AAAA,EAClD,CAAC,gBAAgB,qBAAqB;AAAA,EACtC,CAAC,iBAAiB,wBAAwB;AAAA,EAC1C,CAAC,kBAAkB,yBAAyB;AAAA,EAC5C,CAAC,qBAAqB,wBAAwB;AAAA,EAC9C,CAAC,oBAAoB,2BAA2B;AAAA,EAChD,CAAC,qBAAqB,6BAA6B;AAAA,EACnD,CAAC,qBAAqB,6BAA6B;AAAA,EACnD,CAAC,eAAe,wBAAwB;AAAA,EACxC,CAAC,eAAe,wBAAwB;AAAA,EACxC,CAAC,gBAAgB,yBAAyB;AAAA,EAC1C,CAAC,oBAAoB,wBAAwB;AAAA,EAC7C,CAAC,aAAa,uBAAuB;AAAA,EACrC,CAAC,iBAAiB,wBAAwB;AAAA,EAC1C,CAAC,eAAe,8BAA8B;AAAA,EAC9C,CAAC,kBAAkB,yBAAyB;AAAA,EAC5C,CAAC,uBAAuB,+BAA+B;AAAA,EACvD,CAAC,UAAU,gBAAgB;AAAA,EAC3B,CAAC,UAAU,gBAAgB;AAC7B,CAAC;AAMM,SAAS,wBAAwB,MAA6B;AACnE,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,KAAK,OAAO,KAAK,sBAAsB;AACjD,UAAM,UAAU,IAAI,OAAO,MAAM,IAAI,QAAQ,uBAAuB,MAAM,CAAC,OAAO,GAAG;AACrF,QAAI,QAAQ,KAAK,IAAI,GAAG;AACtB,YAAM,KAAK,KAAK,GAAG,eAAU,OAAO,IAAI;AAAA,IAC1C;AAAA,EACF;AACA,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO;AAAA;AAAA;AAAA;AAAA,EAA+E,MAAM,IAAI,OAAK,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAC3H;;;AC5CO,SAAS,gBAAgB,SAA0B;AAE1D;AAEO,SAAS,eAAe,OAAsB;AAErD;;;ACjBA,SAAS,eAAe;AAExB,IAAI,SAAyB;AAE7B,IAAM,kBAA2C;AAAA;AAAA;AAAA;AAAA;AAAA;AAMjD;AAEO,SAAS,iBAAiB,eAAqC;AACpE,MAAI,eAAe;AACjB,aAAS;AACT;AAAA,EACF;AAGA,QAAM,SAAS,QAAQ,IAAI,mBAAmB,QAAQ,IAAI;AAC1D,MAAI,CAAC,QAAQ;AACX,aAAS;AACT;AAAA,EACF;AAEA,WAAS,IAAI,QAAQ,QAAQ;AAAA,IAC3B,MAAM,QAAQ,IAAI,uBAAuB;AAAA,IACzC,SAAS;AAAA,IACT,eAAe;AAAA,IACf,6BAA6B;AAAA,EAC/B,CAAC;AACH;AAEA,eAAsB,iBACpB,MACA,aACA,eACkB;AAClB,MAAI,QAAQ,IAAI,wBAAwB,OAAQ,QAAO;AACvD,MAAI,QAAQ,gBAAiB,QAAO,gBAAgB,IAAI;AACxD,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI;AACF,UAAM,UAAU,MAAM,OAAO,iBAAiB,MAAM,aAAa;AAAA,MAC/D,QAAQ,EAAE,WAAW,YAAY;AAAA,MACjC,iBAAiB;AAAA,QACf,WAAW;AAAA,UACT,cAAc;AAAA,UACd,MAAM,iBAAiB;AAAA,QACzB;AAAA,MACF;AAAA,IACF,CAAC;AACD,QAAI,QAAS,QAAO;AAGpB,QAAI,iBAAiB,kBAAkB,aAAa;AAClD,YAAM,YAAY,MAAM,OAAO,iBAAiB,MAAM,eAAe;AAAA,QACnE,QAAQ,EAAE,WAAW,cAAc;AAAA,QACnC,iBAAiB;AAAA,UACf,WAAW;AAAA,YACT,cAAc;AAAA,YACd,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF,CAAC;AACD,aAAO,aAAa;AAAA,IACtB;AAEA,WAAO,WAAW;AAAA,EACpB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC5EO,IAAM,kCAAkC;AACxC,IAAM,8BAA8B;AACpC,IAAM,sBAAsB,CAAC,aAAa,YAAY,YAAY,YAAY,MAAM;AAE3F,IAAM,gBAAgB;AACtB,IAAM,yBAAyB;AAC/B,IAAM,mBAAmB;AAmBzB,IAAM,6BAAsE;AAAA,EAC1E,WAAW;AAAA,IACT;AAAA,IAAU;AAAA,IAAY;AAAA,IAAS;AAAA,IAAU;AAAA,IAAU;AAAA,IAAY;AAAA,IAAW;AAAA,IAAa;AAAA,EACzF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IAAW;AAAA,IAAS;AAAA,IAAW;AAAA,IAAW;AAAA,IAAY;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAc;AAAA,IAAc;AAAA,EACpG;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IAAc;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAa;AAAA,IAAa;AAAA,IAAc;AAAA,EACnF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IAAW;AAAA,IAAW;AAAA,IAAY;AAAA,IAAW;AAAA,IAAS;AAAA,IAAU;AAAA,IAAc;AAAA,EAChF;AAAA,EACA,MAAM;AAAA,IACJ;AAAA,IAAO;AAAA,IAAY;AAAA,IAAS;AAAA,IAAY;AAAA,IAAe;AAAA,IAAS;AAAA,IAAS;AAAA,IAAW;AAAA,EACtF;AACF;AAEA,SAAS,aAAa,MAAsB;AAC1C,SAAO,KAAK,QAAQ,uBAAuB,MAAM;AACnD;AAEA,SAAS,mBAAmB,MAAc,QAAwB;AAChE,QAAM,UAAU,OAAO,KAAK,EAAE,YAAY;AAC1C,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,QAAQ,QAAQ,MAAM,KAAK,EAAE,IAAI,YAAY;AACnD,QAAM,UAAU,MAAM,MAAM,KAAK,MAAM,CAAC;AACxC,QAAM,QAAQ,IAAI,OAAO,SAAS,GAAG;AACrC,QAAM,UAAU,KAAK,MAAM,KAAK;AAChC,SAAO,SAAS,UAAU;AAC5B;AAEO,SAAS,0BAA0B,MAAc,aAAkD;AACxG,QAAM,OAAO,GAAG,IAAI,IAAI,WAAW,GAAG,YAAY;AAClD,QAAM,YAA4F,CAAC;AAEnG,aAAW,cAAc,qBAAqB;AAC5C,UAAM,UAAU,2BAA2B,UAAU;AACrD,UAAM,UAAoB,CAAC;AAC3B,QAAI,QAAQ;AAEZ,eAAW,UAAU,SAAS;AAC5B,YAAM,UAAU,mBAAmB,MAAM,MAAM;AAC/C,UAAI,WAAW,EAAG;AAElB,YAAM,gBAAgB,KAAK,IAAI,SAAS,sBAAsB;AAC9D,eAAS,gBAAgB;AAEzB,UAAI,QAAQ,SAAS,kBAAkB;AACrC,cAAM,UAAU,UAAU,gBAAgB,eAAe,aAAa,MAAM;AAC5E,gBAAQ,KAAK,YAAY,MAAM,MAAM,OAAO,GAAG,OAAO,EAAE;AAAA,MAC1D;AAAA,IACF;AAEA,cAAU,KAAK,EAAE,YAAY,OAAO,QAAQ,CAAC;AAAA,EAC/C;AAEA,YAAU,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAC1C,QAAM,MAAM,UAAU,CAAC;AACvB,QAAM,SAAS,UAAU,CAAC;AAE1B,MAAI,CAAC,OAAO,IAAI,SAAS,EAAG,QAAO;AAEnC,QAAM,SAAS,KAAK,IAAI,GAAG,IAAI,SAAS,QAAQ,SAAS,EAAE;AAC3D,QAAM,iBAAiB,KAAK,IAAI,IAAI,IAAI,KAAK;AAC7C,QAAM,aAAa,KAAK,IAAI,IAAI,iBAAiB,KAAK,IAAI,IAAI,MAAM,CAAC;AAErE,SAAO;AAAA,IACL,YAAY,IAAI;AAAA,IAChB,eAAe;AAAA,IACf;AAAA,IACA,SAAS,IAAI;AAAA,IACb,aAAa;AAAA,IACb,YAAY,UACT,OAAO,CAAC,cAAc,UAAU,QAAQ,CAAC,EACzC,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,eAAe;AAAA,MACnB,YAAY,UAAU;AAAA,MACtB,aAAa,KAAK,IAAI,IAAI,UAAU,KAAK;AAAA,MACzC,YAAY,KAAK,IAAI,IAAI,UAAU,KAAK;AAAA,IAC1C,EAAE;AAAA,EACN;AACF;AAEO,SAAS,8BAA8B,QAAuC;AACnF,MAAI,OAAO,aAAa,gCAAiC,QAAO;AAChE,MAAI,OAAO,cAAc,4BAA6B,QAAO;AAC7D,SAAO;AACT;AAEO,SAAS,0BAA0B,QAAuC;AAC/E,SAAO,OAAO,cAAc;AAC9B;;;AC5GA,SAAS,SAA0B;;;ACE5B,IAAM,YAAN,cAAwB,MAAM;AAAA,EACnC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAoBA,IAAM,gBAA+B;AAAA,EACnC;AAAA,IACE,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ,EAAE,MAAM,WAAW,aAAa,iBAAiB,YAAY,EAAE,QAAQ,QAAQ,EAAE;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ,EAAE,MAAM,WAAW,aAAa,qBAAqB,YAAY,EAAE,QAAQ,QAAQ,EAAE;AAAA,EAC/F;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ,EAAE,MAAM,UAAU,aAAa,kBAAkB,YAAY,CAAC,EAAE;AAAA,EAC1E;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ,EAAE,MAAM,UAAU,aAAa,mBAAmB,YAAY,EAAE,QAAQ,SAAS,EAAE;AAAA,EAC7F;AACF;AAcO,SAAS,cAAc,KAA+B;AAC3D,QAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAE/D,MAAI,eAAe,WAAW;AAC5B,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,MACV,kBAAkB,CAAC,EAAE,MAAM,UAAU,aAAa,mBAAmB,YAAY,EAAE,QAAQ,SAAS,EAAE,CAAC;AAAA,IACzG;AAAA,EACF;AAEA,MAAI,eAAe,cAAc;AAC/B,WAAO,EAAE,MAAM,iBAAiB,SAAS,UAAU,+CAA+C;AAAA,EACpG;AAEA,MAAI,eAAe,iBAAiB;AAClC,WAAO,EAAE,MAAM,oBAAoB,QAAQ;AAAA,EAC7C;AAEA,aAAW,EAAE,SAAS,MAAM,UAAU,OAAO,KAAK,eAAe;AAC/D,QAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,aAAO,EAAE,MAAM,SAAS,UAAU,kBAAkB,CAAC,MAAM,EAAE;AAAA,IAC/D;AAAA,EACF;AAEA,MAAI,qDAAqD,KAAK,OAAO,GAAG;AACtE,WAAO,EAAE,MAAM,uBAAuB,SAAS,UAAU,0BAA0B;AAAA,EACrF;AAEA,MAAI,aAAa,KAAK,OAAO,GAAG;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,MACV,kBAAkB,CAAC,EAAE,MAAM,WAAW,aAAa,kBAAkB,YAAY,EAAE,QAAQ,SAAS,EAAE,CAAC;AAAA,IACzG;AAAA,EACF;AAEA,MAAI,4BAA4B,KAAK,OAAO,GAAG;AAC7C,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,MACV,kBAAkB,CAAC,EAAE,MAAM,WAAW,aAAa,aAAa,YAAY,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,IACjG;AAAA,EACF;AAEA,MAAI,qCAAqC,KAAK,OAAO,GAAG;AACtD,WAAO,EAAE,MAAM,oBAAoB,QAAQ;AAAA,EAC7C;AAEA,SAAO,EAAE,MAAM,kBAAkB,SAAS,WAAW,gCAAgC;AACvF;;;AD9FO,SAAS,QACd,SACA,MACA,MACoB;AACpB,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS,WAAW;AAAA,IACpB;AAAA,IACA,GAAI,MAAM,SAAS,EAAE,KAAK,IAAI,CAAC;AAAA,EACjC;AACF;AAEO,SAAS,QACd,MACA,SACA,UACA,kBACA,aACe;AACf,SAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IAC/B,GAAI,kBAAkB,SAAS,EAAE,iBAAiB,IAAI,CAAC;AAAA,IACvD,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,EACvC;AACF;AAGO,SAAS,SAAS,IAAY,MAA8B;AACjE,SAAO;AAAA,IACL;AAAA,IACA,UAAU,EAAE;AAAA,IACZ,QAAQ;AAAA,IACR,CAAC,EAAE,MAAM,WAAW,aAAa,kBAAkB,YAAY,EAAE,QAAQ,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,EAClG;AACF;AAGO,SAAS,gBAAgB,SAAgC;AAC9D,SAAO,QAAQ,oBAAoB,OAAO;AAC5C;AAYO,SAAS,YAAY,MAA6B;AACvD,SAAO,CAAC,EAAE,MAAM,QAAiB,KAAK,CAAC;AACzC;AAMO,SAAS,YACd,QACA,MACoE;AACpE,QAAM,SAAS,OAAO,UAAU,IAAI;AACpC,MAAI,OAAO,QAAS,QAAO,EAAE,IAAI,MAAM,MAAM,OAAO,KAAK;AACzD,QAAM,SAAS,OAAO,MAAM,OACzB,IAAI,CAAC,MAAkB,GAAG,EAAE,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAC1D,KAAK,IAAI;AACZ,QAAM,MAAM,sBAAsB,MAAM;AACxC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ,EAAE,SAAS,YAAY,GAAG,GAAG,mBAAmB,gBAAgB,GAAG,EAAE;AAAA,EAC/E;AACF;AAGO,SAAS,cAAc,QAAgB,OAAsC;AAClF,QAAM,MAAM,mBAAmB,MAAM,qBAAqB,MAAM,KAAK,IAAI,CAAC;AAC1E,SAAO,EAAE,SAAS,YAAY,GAAG,GAAG,mBAAmB,gBAAgB,GAAG,EAAE;AAC9E;AAMO,SAAS,cACd,MACA,SACA,MACA,MACY;AACZ,SAAO,EAAE,SAAS,YAAY,IAAI,GAAG,mBAAmB,QAAQ,SAAS,MAAM,IAAI,EAAE;AACvF;AAGO,SAAS,cACd,MACA,MACA,SACA,UACA,kBACA,aACY;AACZ,SAAO,EAAE,SAAS,YAAY,IAAI,GAAG,mBAAmB,QAAQ,MAAM,SAAS,UAAU,kBAAkB,WAAW,EAAE;AAC1H;AAGO,SAAS,eAAe,IAAY,MAAe,MAA2B;AACnF,SAAO,EAAE,SAAS,YAAY,QAAQ,UAAU,EAAE,cAAc,GAAG,mBAAmB,SAAS,IAAI,IAAI,EAAE;AAC3G;AAGO,SAAS,iBAAiB,SAA6B;AAC5D,SAAO,EAAE,SAAS,YAAY,OAAO,GAAG,mBAAmB,gBAAgB,OAAO,EAAE;AACtF;AAIA,IAAM,mBAAmB,EAAE,OAAO;AAAA,EAChC,MAAM,EAAE,OAAO;AAAA,EACf,aAAa,EAAE,OAAO;AAAA,EACtB,YAAY,EAAE,OAAO,EAAE,QAAQ,CAAC;AAClC,CAAC;AAED,IAAM,aAAa,EAAE,OAAO;AAAA,EAC1B,YAAY,EAAE,OAAO,EAAE,SAAS;AAClC,CAAC,EAAE,SAAS;AAqCL,SAAS,aACd,SACqC;AACrC,SAAO,OAAO,SAAoC;AAChD,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,IAAI;AACjC,YAAM,aAAa,KAAK,IAAI,IAAI;AAEhC,YAAM,KAAK,OAAO;AAClB,UAAI,MAAM,OAAO,OAAO,YAAY,QAAQ,IAAI;AAC9C,WAAG,QAAQ,EAAE,GAAG,GAAG,OAAO,WAAW;AACrC,eAAO;AAAA,UACL,SAAS,OAAO,WAAW,CAAC;AAAA,UAC5B,mBAAmB;AAAA,UACnB,GAAI,GAAG,OAAO,QAAQ,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,QAC7C;AAAA,MACF;AAIA,cAAQ,KAAK,qGAAqG,OAAO,UAAU,CAAC,GAAG,MAAM,MAAM,GAAG,EAAE,KAAK,SAAS,GAAG;AACzK,aAAO;AAAA,QACL,SAAS,OAAO,WAAW,CAAC;AAAA,QAC5B,mBAAmB;AAAA,UACjB,GAAG;AAAA,YACD,OAAO,UAAU,CAAC,GAAG,MAAM,MAAM,GAAG,GAAG,KAAK;AAAA,YAC5C,MAAM,CAAC;AAAA,UACT;AAAA,UACA,OAAO,EAAE,WAAW;AAAA,QACtB;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,aAAa,KAAK,IAAI,IAAI;AAChC,YAAM,aAAa,cAAc,GAAG;AACpC,YAAM,WAA0B;AAAA,QAC9B,GAAG;AAAA,UACD,WAAW;AAAA,UACX,WAAW;AAAA,UACX,WAAW;AAAA,UACX,WAAW;AAAA,QACb;AAAA,QACA,OAAO,EAAE,WAAW;AAAA,MACtB;AACA,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,QAAQ,CAAC;AAAA,QAC7D,mBAAmB;AAAA,QACnB,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;;;APhLA,IAAM,gBAA0C;AAAA,EAC9C,gBAAgB,CAAC,UAAU,UAAU,YAAY,aAAa,OAAO,WAAW,kBAAkB,WAAW,aAAa;AAAA,EAC1H,SAAS,CAAC,aAAa,YAAY,SAAS,cAAc,eAAe,SAAS,SAAS,SAAS,QAAQ;AAAA,EAC5G,wBAAwB,CAAC,OAAO,MAAM,UAAU,SAAS,QAAQ,OAAO,UAAU,SAAS;AAAA,EAC3F,wBAAwB,CAAC,MAAM,aAAa,OAAO,YAAY,YAAY,UAAU;AAAA,EACrF,gCAAgC,CAAC,cAAc,YAAY,QAAQ,UAAU,cAAc,UAAU;AAAA,EACrG,wBAAwB,CAAC,aAAa,WAAW,YAAY,SAAS,UAAU,QAAQ;AAAA,EACxF,YAAY,CAAC,YAAY,QAAQ,WAAW,cAAc,UAAU,OAAO;AAC7E;AAEA,SAAS,UAAU,MAAsB;AACvC,QAAM,QAAQ,KAAK,YAAY;AAC/B,MAAI,WAAW;AACf,MAAI,YAAY;AAChB,aAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,aAAa,GAAG;AAC5D,UAAM,QAAQ,SAAS,OAAO,CAAC,OAAO,MAAM,SAAS,EAAE,CAAC,EAAE;AAC1D,QAAI,QAAQ,WAAW;AACrB,kBAAY;AACZ,iBAAW;AAAA,IACb;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAAsB;AACzC,SAAO,UAAU,IAAI,KAAK;AAC5B;AAEA,IAAM,gBAA8C;AAAA,EAClD,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,CAAC,QAAQ,IAAI,KAAK,SAAS,MAAM,CAAC,CAAC,eAAe,aAAa,YAAY,MAAM,EAAE,SAAS,IAAI,KAAK,YAAY,CAAC;AAAA,IACzH,YAAY,MAAM;AAAA,EACpB;AAAA,EACA,gBAAgB;AAAA,IACd,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,CAAC,QAAQ,IAAI,YAAY,SAAS;AAAA,IACzC,YAAY,MAAM;AAAA,EACpB;AAAA,EACA,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,CAAC,QAAQ,IAAI,aAAa,UAAU;AAAA,IAC3C,YAAY,MAAM;AAAA,EACpB;AAAA,EACA,kBAAkB;AAAA,IAChB,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,CAAC,QAAQ;AACd,YAAM,QAAQ,IAAI,IAAI,IAAI,aAAa,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC;AACrE,aAAO,MAAM,QAAQ;AAAA,IACvB;AAAA,IACA,YAAY,MAAM;AAAA,EACpB;AAAA,EACA,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,MAAM,gBAAgB,CAAC,CAAC,IAAI;AAAA,IAClD,YAAY,MAAM;AAAA,EACpB;AACF;AAEA,IAAM,WAA2C,oBAAI,IAAI;AAAA,EACvD,CAAC,YAAY;AAAA,IACX,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU;AAAA,MACR,EAAE,KAAK,YAAY,OAAO,SAAS;AAAA,MACnC,EAAE,KAAK,QAAQ,OAAO,QAAQ;AAAA,MAC9B,EAAE,KAAK,UAAU,OAAO,QAAQ;AAAA,MAChC,EAAE,KAAK,YAAY,OAAO,QAAQ;AAAA,IACpC;AAAA,IACA,0BAA0B,CAAC,uBAAuB,cAAc,cAAc,YAAY;AAAA,IAC1F,YAAY,CAAC,QAAwB;AACnC,YAAM,SAAkC,CAAC;AACzC,YAAM,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW;AAC3C,YAAM,OAAO,UAAU,IAAI;AAC3B,UAAI,KAAM,QAAO,SAAS;AAC1B,UAAI,KAAK,YAAY,EAAE,SAAS,UAAU,KAAK,KAAK,YAAY,EAAE,SAAS,SAAS,GAAG;AACrF,eAAO,WAAW;AAAA,MACpB,WAAW,KAAK,YAAY,EAAE,SAAS,YAAY,KAAK,KAAK,YAAY,EAAE,SAAS,SAAS,KAAK,KAAK,YAAY,EAAE,SAAS,UAAU,GAAG;AACzI,eAAO,WAAW;AAAA,MACpB,OAAO;AACL,eAAO,WAAW;AAAA,MACpB;AACA,UAAI,KAAM,QAAO,eAAe;AAChC,aAAO;AAAA,IACT;AAAA,IACA,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,aAAa;AAAA,QAC7D,YAAY,CAAC,QAAQ;AACnB,gBAAM,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW,GAAG,YAAY;AAC1D,gBAAM,WAAW,KAAK,SAAS,UAAU,IAAI,aAAa,KAAK,SAAS,YAAY,IAAI,SAAS;AACjG,iBAAO,gCAA2B,QAAQ;AAAA,QAC5C;AAAA,MACF;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,iBAAiB;AAAA,QACrE,YAAY,CAAC,QAAQ;AACnB,gBAAM,OAAO,UAAU,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW,EAAE;AACvD,iBAAO,OACH,qCAAgC,IAAI,+BACpC;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EAED,CAAC,kBAAkB;AAAA,IACjB,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU;AAAA,MACR,EAAE,KAAK,YAAY,OAAO,SAAS;AAAA,MACnC,EAAE,KAAK,UAAU,OAAO,QAAQ;AAAA,IAClC;AAAA,IACA,0BAA0B,CAAC,WAAW,cAAc,kBAAkB,YAAY;AAAA,IAClF,YAAY,CAAC,QAAwB;AACnC,YAAM,SAAkC,CAAC;AACzC,YAAM,SAAS,YAAY,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW,EAAE;AAC3D,UAAI,OAAQ,QAAO,SAAS;AAC5B,aAAO;AAAA,IACT;AAAA,IACA,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,OAAO,IAAI,KAAK,cAAc,YAAY,IAAI,KAAK,UAAU,SAAS;AAAA,QACtF,YAAY,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,WAAW;AAAA,QACzD,YAAY,CAAC,QAAQ;AACnB,gBAAM,SAAS,YAAY,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW,EAAE;AAC3D,iBAAO,SACH,+BAA0B,MAAM,+BAChC;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EAED,CAAC,YAAY;AAAA,IACX,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU;AAAA,MACR,EAAE,KAAK,YAAY,OAAO,QAAQ;AAAA,IACpC;AAAA,IACA,0BAA0B,CAAC,oBAAoB,iBAAiB,cAAc,YAAY;AAAA,IAC1F,YAAY,CAAC,QAAwB;AACnC,YAAM,SAAkC,CAAC;AACzC,YAAM,OAAO,UAAU,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW,EAAE;AACvD,UAAI,MAAM;AACR,cAAM,cAAsC;AAAA,UAC1C,gBAAgB;AAAA,UAChB,SAAS;AAAA,UACT,wBAAwB;AAAA,UACxB,wBAAwB;AAAA,UACxB,gCAAgC;AAAA,UAChC,wBAAwB;AAAA,UACxB,YAAY;AAAA,QACd;AACA,eAAO,WAAW,YAAY,IAAI,KAAK;AAAA,MACzC;AACA,aAAO;AAAA,IACT;AAAA,IACA,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ;AACd,gBAAM,YAAY,IAAI,KAAK;AAC3B,iBAAO,OAAO,cAAc,YAAY,UAAU,SAAS;AAAA,QAC7D;AAAA,QACA,YAAY,MAAM;AAAA,MACpB;AAAA,MACA,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,aAAa;AAAA,QAC7D,YAAY,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EAED,CAAC,aAAa;AAAA,IACZ,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU;AAAA,MACR,EAAE,KAAK,QAAQ,OAAO,QAAQ;AAAA,MAC9B,EAAE,KAAK,aAAa,OAAO,QAAQ;AAAA,IACrC;AAAA,IACA,0BAA0B,CAAC,WAAW,cAAc,YAAY,YAAY;AAAA,IAC5E,YAAY,CAAC,QAAwB;AACnC,YAAM,SAAkC,CAAC;AACzC,YAAM,OAAO,UAAU,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW,EAAE;AACvD,UAAI,KAAM,QAAO,YAAY;AAC7B,aAAO;AAAA,IACT;AAAA,IACA,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ;AACd,gBAAM,YAAY,IAAI,KAAK;AAC3B,iBAAO,OAAO,cAAc,YAAY,UAAU,SAAS;AAAA,QAC7D;AAAA,QACA,YAAY,MAAM;AAAA,MACpB;AAAA,MACA,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,SAAS;AAAA,QACrD,YAAY,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EAED,CAAC,YAAY;AAAA,IACX,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU,CAAC;AAAA,IACX,0BAA0B,CAAC,cAAc,cAAc,uBAAuB,YAAY;AAAA,IAC1F,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAwB,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,UAAU;AAAA,QACvE,YAAY,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAwB,CAAC,CAAC,IAAI,KAAK,aAAa,OAAO,IAAI,KAAK,SAAS,EAAE,SAAS;AAAA,QAC5F,YAAY,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAA6B;AAAA,EAE7B,CAAC,aAAa;AAAA,IACZ,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU,CAAC;AAAA,IACX,0BAA0B,CAAC,cAAc,WAAW,cAAc,YAAY;AAAA,IAC9E,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,OAAO,IAAI,KAAK,cAAc,YAAY,IAAI,KAAK,UAAU,SAAS;AAAA,QACtF,YAAY,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EAED,CAAC,YAAY;AAAA,IACX,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU,CAAC;AAAA,IACX,0BAA0B,CAAC,WAAW,WAAW,cAAc,YAAY;AAAA,IAC3E,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,IAChB;AAAA,EACF,CAAC;AAAA,EAED,CAAC,QAAQ;AAAA;AAAA,IACP,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU,CAAC;AAAA,IACX,0BAA0B,CAAC,WAAW,cAAc,WAAW,cAAc,YAAY;AAAA,IACzF,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,IAChB;AAAA,EACF,CAAC;AAAA,EAED,CAAC,QAAQ;AAAA,IACP,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU,CAAC;AAAA,IACX,0BAA0B,CAAC,cAAc,cAAc,YAAY;AAAA,IACnE,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,IAChB;AAAA,EACF,CAAC;AAAA,EAED,CAAC,UAAU;AAAA,IACT,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU,CAAC;AAAA,IACX,0BAA0B,CAAC,WAAW,cAAc,YAAY;AAAA,IAChE,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,IAChB;AAAA,EACF,CAAC;AAAA,EAED,CAAC,cAAc;AAAA,IACb,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU;AAAA,MACR,EAAE,KAAK,YAAY,OAAO,OAAO;AAAA,MACjC,EAAE,KAAK,YAAY,OAAO,QAAQ;AAAA,IACpC;AAAA,IACA,0BAA0B,CAAC,WAAW,WAAW,cAAc,YAAY;AAAA,IAC3E,YAAY,CAAC,QAAwB;AACnC,YAAM,SAAkC,CAAC;AACzC,YAAM,OAAO,UAAU,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW,EAAE;AACvD,UAAI,MAAM;AACR,cAAM,cAAsC;AAAA,UAC1C,gBAAgB;AAAA,UAChB,SAAS;AAAA,UACT,wBAAwB;AAAA,UACxB,wBAAwB;AAAA,UACxB,gCAAgC;AAAA,UAChC,wBAAwB;AAAA,UACxB,YAAY;AAAA,QACd;AACA,eAAO,WAAW,YAAY,IAAI,KAAK;AAAA,MACzC;AACA,aAAO;AAAA,IACT;AAAA,IACA,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,OAAO,IAAI,KAAK,cAAc,YAAY,IAAI,KAAK,UAAU,SAAS;AAAA,QACtF,YAAY,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EAED,CAAC,aAAa;AAAA,IACZ,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU,CAAC;AAAA,IACX,0BAA0B,CAAC,WAAW,oBAAoB,cAAc,YAAY;AAAA,IACpF,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,IAChB;AAAA,EACF,CAAC;AAAA,EAED,CAAC,mBAAmB;AAAA,IAClB,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU,CAAC;AAAA,IACX,0BAA0B,CAAC,cAAc,cAAc,YAAY;AAAA,IACnE,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,IAChB;AAAA,EACF,CAAC;AAAA,EAED,CAAC,YAAY;AAAA,IACX,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU;AAAA,MACR,EAAE,KAAK,oBAAoB,OAAO,YAAY;AAAA,IAChD;AAAA,IACA,0BAA0B,CAAC,aAAa,eAAe,WAAW,YAAY;AAAA,IAC9E,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,IAAI,aAAa,KAAK,CAAC,MAAM,EAAE,iBAAiB,eAAe,EAAE,iBAAiB,aAAa;AAAA,QAC/G,YAAY,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,MAAM,UAAU,OAAO,IAAI,KAAK,MAAM,EAAE,SAAS;AAAA,QACvE,YAAY,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EAED,CAAC,eAAe;AAAA,IACd,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU;AAAA,MACR,EAAE,KAAK,QAAQ,OAAO,SAAS;AAAA,MAC/B,EAAE,KAAK,oBAAoB,OAAO,cAAc;AAAA,IAClD;AAAA,IACA,0BAA0B,CAAC,cAAc,WAAW,cAAc,aAAa,aAAa;AAAA,IAC5F,eAAe;AAAA,MACb,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,MAAM,UAAU,OAAO,IAAI,KAAK,MAAM,EAAE,SAAS;AAAA,QACvE,YAAY,MAAM;AAAA,MACpB;AAAA,MACA,cAAc;AAAA,MACd,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,MAAM,cAAc,OAAO,IAAI,KAAK,UAAU,EAAE,SAAS;AAAA,QAC/E,YAAY,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC;AAED,IAAM,mBAAsC;AAAA,EAC1C,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,UAAU,CAAC;AAAA,EACX,0BAA0B,CAAC,cAAc,YAAY;AAAA,EACrD,eAAe;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AACF;AAIA,SAAS,mBAAmB,MAAc,aAA6B;AACrE,QAAM,OAAO,GAAG,IAAI,IAAI,WAAW;AACnC,SAAO,KACJ,QAAQ,YAAY,GAAG,EACvB,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,KAAK,GAAG;AACb;AAOA,SAAS,sBACP,WACA,YACA,mBACA,kBACA,qBACsB;AACtB,QAAM,OAAO,GAAG,UAAU,IAAI,iBAAiB,GAAG,YAAY;AAC9D,QAAM,gBAAgB,UAAU,KAAK,YAAY;AACjD,MAAI,QAAQ;AACZ,QAAM,UAAoB,CAAC;AAE3B,MAAI,KAAK,SAAS,aAAa,KAAK,cAAc,SAAS,GAAG;AAC5D,aAAS;AACT,YAAQ,KAAK,YAAY;AAAA,EAC3B;AAEA,QAAM,iBAAiB,cAAc,MAAM,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC5E,QAAM,gBAAgB,eAAe,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AACnE,QAAM,YAAa,cAAc,SAAS,KAAK,IAAI,eAAe,QAAQ,CAAC,IAAK;AAChF,WAAS;AACT,MAAI,cAAc,SAAS,GAAG;AAC5B,YAAQ,KAAK,iBAAiB,cAAc,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,EACvE;AAEA,QAAM,kBAAkB,oBAAI,IAAI,CAAC,YAAY,UAAU,CAAC;AACxD,MAAI,gBAAgB,IAAI,mBAAmB,GAAG;AAC5C,aAAS;AACT,YAAQ,KAAK,gBAAgB;AAAA,EAC/B;AAEA,MAAI,wBAAwB,kBAAkB;AAC5C,aAAS;AACT,YAAQ,KAAK,kBAAkB;AAAA,EACjC;AAEA,QAAM,aAAa,KAAK,IAAI,OAAO,GAAG;AACtC,QAAM,SAAS,QAAQ,SAAS,IAAI,QAAQ,KAAK,KAAK,IAAI;AAC1D,SAAO,EAAE,OAAO,YAAY,OAAO;AACrC;AAOA,SAAS,kBACP,kBACA,kBACA,SACoB;AACpB,QAAM,UAAkD;AAAA,IACtD,UAAU;AAAA,MACR,UAAU;AAAA,MACV,kBAAkB;AAAA,MAClB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA,kBAAkB;AAAA,MAChB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,UAAU;AAAA,MACV,kBAAkB;AAAA,MAClB,UAAU;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,MACT,UAAU;AAAA,MACV,kBAAkB;AAAA,MAClB,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,gBAAgB,IAAI,gBAAgB;AAC3D,QAAM,OAAO,UAAU,QAAQ,yBAAyB,CAAC,KAAK;AAC9D,QAAM,SAAS,SACX,oBAAoB,gBAAgB,WAAM,gBAAgB,MAC1D,oBAAoB,QAAQ,yBAAyB,CAAC,KAAK,YAAY;AAC3E,SAAO,EAAE,MAAM,OAAO;AACxB;AAUA,SAAS,aAAa,KAAqB,SAA2C;AACpF,QAAM,SAAS,QAAQ,cAAc,IAAI,CAAC,OAAO;AAC/C,UAAMC,UAAS,GAAG,MAAM,GAAG;AAC3B,WAAO;AAAA,MACL,IAAI,GAAG;AAAA,MACP,OAAO,GAAG;AAAA,MACV,QAAAA;AAAA,MACA,YAAYA,UAAS,SAAY,GAAG,aAAa,GAAG;AAAA,IACtD;AAAA,EACF,CAAC;AAED,QAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;AAC9C,QAAM,QAAQ,OAAO;AACrB,QAAM,QAAQ,QAAQ,IAAI,KAAK,MAAO,SAAS,QAAS,EAAE,IAAI;AAE9D,SAAO,EAAE,OAAO,UAAU,IAAI,OAAO;AACvC;AAEO,SAAS,oBAAoB,QAA+B;AACjE,QAAM,SAAS,OAAO,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM;AACpD,QAAM,SAAS,OAAO,SAAS,IAC3B,YAAY,OAAO,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC,EAAE,KAAK,IAAI,CAAC,KAC/E;AACJ,QAAM,QAAkB,CAAC,eAAe,OAAO,KAAK,IAAI,OAAO,QAAQ,GAAG,MAAM,EAAE;AAClF,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,OAAO,MAAM,SAAS,QAAQ;AACpC,UAAM,aAAa,MAAM,SAAS,KAAK,WAAM,MAAM,cAAc,MAAM,KAAK;AAC5E,UAAM,KAAK,GAAG,IAAI,IAAI,MAAM,KAAK,GAAG,UAAU,EAAE;AAAA,EAClD;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAIA,eAAsB,kBAAkB,SAAoE;AAC1G,QAAM,QAAQ,MAAM,SAAc,kBAAkB,EAAE,QAAQ,CAAC;AAC/D,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,MAAM,WAAW,OAAO;AAAA,MACxB,SAAS,EAAE,OAAO,GAAG,UAAU,IAAI,QAAQ,CAAC,EAAE;AAAA,IAChD;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,SAAgB,uBAAuB;AACjE,QAAM,UAAU,oBAAI,IAAoB;AACxC,aAAW,KAAK,YAAa,SAAQ,IAAI,EAAE,KAAK,EAAE,IAAI;AACtD,QAAM,iBAAiB,QAAQ,IAAI,MAAM,YAAY,KAAK;AAE1D,QAAM,UAAU,SAAS,IAAI,cAAc,KAAK;AAEhD,QAAM,YAAY,MAAM,SAAgB,4BAA4B,EAAE,QAAQ,CAAC;AAC/E,QAAM,eAA6B,CAAC;AACpC,aAAW,KAAK,WAAW;AACzB,UAAM,UAAU,EAAE,WAAW,MAAM,MAAM,EAAE,OAAO,EAAE;AACpD,iBAAa,KAAK;AAAA,MAChB,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,cAAc,EAAE;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,QAAQ;AAC1B,QAAM,cAAc,OAAO,MAAM,OAAO,SAAS,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI;AAE1F,QAAM,MAAsB;AAAA,IAC1B,YAAY;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ;AAAA,IACA,MAAM,MAAM,QAAQ,CAAC;AAAA,IACrB,SAAS,MAAM,WAAW;AAAA,IAC1B,cAAc,MAAM;AAAA,IACpB;AAAA,IACA,gBAAgB,CAAC;AAAA,IACjB,kBAAkB,CAAC;AAAA,EACrB;AAEA,QAAM,UAAU,aAAa,KAAK,OAAO;AAEzC,QAAM,QAAkB;AAAA,IACtB,oBAAoB,MAAM,WAAW,MAAM,IAAI;AAAA,IAC/C,KAAK,MAAM,IAAI,WAAW,cAAc,OAAO,MAAM,MAAM;AAAA,IAC3D;AAAA,IACA,oBAAoB,OAAO;AAAA,EAC7B;AAEA,MAAI,QAAQ,QAAQ,IAAI;AACtB,UAAM,eAAe,QAAQ,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU;AAC3E,QAAI,aAAa,SAAS,GAAG;AAC3B,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,+GAA+G;AAAA,IAC5H;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,MAAM,KAAK,IAAI,GAAG,QAAQ;AAC3C;AAIA,IAAM,uBAAuB,oBAAI,IAAI;AAAA,EACnC;AAAA,EAAY;AAAA,EAAkB;AAAA,EAAc;AAAA,EAAa;AAAA,EAAY;AACvE,CAAC;AAED,IAAM,iCAAiC;AACvC,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AACxB,IAAM,gCAAgC;AAE/B,IAAM,gBAAgBC,GAAE,OAAO;AAAA,EACpC,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mIAAmI;AAAA,EAC9K,MAAMA,GAAE,OAAO,EAAE,SAAS,gGAA2F;AAAA,EACrH,aAAaA,GAAE,OAAO,EAAE,SAAS,yEAAoE;AAAA,EACrG,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,yFAAyF;AAAA,EACjI,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,yEAAyE;AAAA,EACjH,cAAcA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iGAAiG;AAAA,EAC9I,MAAMA,GAAE,OAAOA,GAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,0JAA0J;AAAA,EAC1M,OAAOA,GAAE,MAAMA,GAAE,OAAO;AAAA,IACtB,IAAIA,GAAE,OAAO,EAAE,SAAS,0CAA0C;AAAA,IAClE,MAAMA,GAAE,OAAO,EAAE,SAAS,yDAAyD;AAAA,EACrF,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,6EAA6E;AAAA,EACrG,YAAYA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,wHAAwH;AACtK,CAAC;AAEM,IAAM,qBAAqBA,GAAE,OAAO;AAAA,EACzC,SAASA,GAAE,MAAMA,GAAE,OAAO;AAAA,IACxB,YAAYA,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,IACjD,MAAMA,GAAE,OAAO,EAAE,SAAS,cAAc;AAAA,IACxC,aAAaA,GAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA,IAC5D,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,EACpE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,6BAA6B;AAC3D,CAAC;AAEM,IAAM,0BAA0BA,GAAE,OAAO;AAAA,EAC9C,SAASA,GAAE,QAAQ;AAAA,EACnB,YAAYA,GAAE,QAAQ;AAAA,EACtB,eAAeA,GAAE,OAAO;AAAA;AAAA,EAExB,YAAYA,GAAE,OAAO;AAAA,EACrB,SAASA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EAC3B,YAAYA,GAAE;AAAA,IACZA,GAAE,OAAO;AAAA,MACP,YAAYA,GAAE,KAAK,mBAAmB;AAAA,MACtC,aAAaA,GAAE,OAAO;AAAA;AAAA,MAEtB,YAAYA,GAAE,OAAO;AAAA,IACvB,CAAC;AAAA,EACH;AACF,CAAC;AAeD,SAAS,yBAAyB,QAQzB;AACP,QAAM,YAAY;AAAA,IAChB,sBAAsB,OAAO;AAAA,IAC7B,YAAY,OAAO;AAAA,IACnB,aAAa,OAAO;AAAA,IACpB,iBAAiB,OAAO;AAAA,IACxB,8BAA8B,OAAO;AAAA,EACvC;AAEA,kCAAgC,OAAO,aAAa,SAAS;AAC7D,MAAI,OAAO,YAAY,eAAe;AACpC,qCAAiC,OAAO,aAAa,SAAS;AAC9D;AAAA,EACF;AACA,iCAA+B,OAAO,aAAa,SAAS;AAC9D;AAEA,SAAS,gCAAmD;AAC1D,SAAO;AAAA,IACL,SAAS,CAAC;AAAA,MACR,MAAM;AAAA,MACN,MACE;AAAA,IAEJ,CAAC;AAAA,IACD,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,EAAE,MAAM,eAAe,aAAa,8BAA8B,YAAY,EAAE,QAAQ,OAAO,EAAE,CAAC;AAAA,IACrG;AAAA,EACF;AACF;AAEA,SAAS,+BAAkD;AACzD,SAAO;AAAA,IACL,SAAS,CAAC;AAAA,MACR,MAAM;AAAA,MACN,MACE;AAAA,IAEJ,CAAC;AAAA,IACD,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,EAAE,MAAM,eAAe,aAAa,8BAA8B,YAAY,EAAE,QAAQ,OAAO,EAAE,CAAC;AAAA,MACnG,EAAE,YAAY,EAAE,SAAS,MAAM,YAAY,OAAO,eAAe,GAAG,YAAY,GAAG,YAAY,CAAC,EAAE,EAAE;AAAA,IACtG;AAAA,EACF;AACF;AAEA,SAAS,sCACP,YACQ;AACR,SAAO,WAAW,SACd,WACC,IAAI,CAAC,MAAM,OAAO,EAAE,UAAU,OAAO,EAAE,WAAW,iBAAiB,EACnE,KAAK,IAAI,IACV;AACN;AAEA,SAAS,mCACP,YACA,uBACmB;AACnB,QAAM,cAAc,sCAAsC,qBAAqB;AAC/E,QAAM,WACJ;AAAA;AAAA,yBAC0B,WAAW,UAAU;AAAA,UACpC,WAAW,QAAQ,KAAK,IAAI,KAAK,YAAY;AAAA;AAAA;AAAA,EAErD,WAAW;AAAA;AAAA;AAEhB,SAAO;AAAA,IACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,SAAS,CAAC;AAAA,IACnD,mBAAmB;AAAA,MACjB;AAAA,MACA,eAAe,WAAW,UAAU;AAAA,MACpC;AAAA,MACA,CAAC,EAAE,MAAM,eAAe,aAAa,8BAA8B,YAAY,EAAE,QAAQ,OAAO,EAAE,CAAC;AAAA,MACnG;AAAA,QACE,YAAY;AAAA,UACV,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,eAAe,WAAW;AAAA,UAC1B,YAAY,WAAW;AAAA,UACvB,SAAS,WAAW;AAAA,UACpB,YAAY,sBAAsB,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,aAAa,EAAE,aAAa,YAAY,EAAE,WAAW,EAAE;AAAA,QACnI;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,0BACP,YACA,gBACA,gBACmB;AACnB,QAAM,cAAc,sCAAsC,eAAe,UAAU;AACnF,QAAM,WACJ,6DACC,iBAAiB,wEAAwE,MAC1F,gBAAgB,WAAW,UAAU,OAAO,WAAW,aAAa;AAAA,UACzD,WAAW,QAAQ,KAAK,IAAI,KAAK,YAAY;AAAA;AAAA;AAAA,EAErD,WAAW;AAAA;AAAA;AAEhB,SAAO;AAAA,IACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,SAAS,CAAC;AAAA,IACnD,mBAAmB;AAAA,MACjB;AAAA,MACA,iBACI,sDAAiD,WAAW,aAAa,mBACzE,8BAA8B,WAAW,UAAU,MAAM,WAAW,aAAa;AAAA,MACrF;AAAA,MACA,eAAe,WAAW,IAAI,CAAC,OAAO;AAAA,QACpC,MAAM;AAAA,QACN,aAAa,cAAc,EAAE,UAAU;AAAA,QACvC,YAAY,EAAE,YAAY,EAAE,WAAW;AAAA,MACzC,EAAE;AAAA,MACF,EAAE,YAAY,eAAe;AAAA,IAC/B;AAAA,EACF;AACF;AAEA,eAAe,0CACb,YACA,6BAIC;AACD,QAAM,iBAAiB,MAAM,SAAgB,uBAAuB;AACpE,QAAM,gCAAgC,IAAI;AAAA,KACvC,kBAAkB,CAAC,GACjB,IAAI,CAAC,eAAe,WAAW,IAAI,EACnC;AAAA,MACC,CAAC,SACC,4BAA4B,IAAI,IAA6B;AAAA,IACjE;AAAA,EACJ;AACA,QAAM,wBAAwB,WAAW,WAAW;AAAA,IAAO,CAAC,cAC1D,8BAA8B,IAAI,UAAU,UAAU;AAAA,EACxD;AACA,SAAO,EAAE,+BAA+B,sBAAsB;AAChE;AAEA,eAAe,yBAAyB,QAQN;AAChC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,MAAI,YAAY;AACd,WAAO,EAAE,oBAAoB,WAAW;AAAA,EAC1C;AACA,MAAI,CAAC,kBAAkB;AACrB,WAAO,EAAE,aAAa,8BAA8B,EAAE;AAAA,EACxD;AAEA,QAAM,aAAa,0BAA0B,MAAM,WAAW;AAC9D,MAAI,CAAC,YAAY;AACf,6BAAyB;AAAA,MACvB;AAAA,MACA,qBAAqB;AAAA,MACrB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AACD,WAAO,EAAE,aAAa,6BAA6B,EAAE;AAAA,EACvD;AAEA,QAAM,EAAE,+BAA+B,sBAAsB,IAC3D,MAAM,0CAA0C,YAAY,2BAA2B;AAEzF,MAAI,CAAC,8BAA8B,IAAI,WAAW,UAAU,GAAG;AAC7D,6BAAyB;AAAA,MACvB;AAAA,MACA,qBAAqB,WAAW;AAAA,MAChC,YAAY,WAAW;AAAA,MACvB,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AACD,WAAO;AAAA,MACL,aAAa,mCAAmC,YAAY,qBAAqB;AAAA,IACnF;AAAA,EACF;AAEA,QAAM,YAAY,8BAA8B,UAAU;AAC1D,QAAM,iBAAiB,0BAA0B,UAAU;AAC3D,QAAM,iBAA4C;AAAA,IAChD,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,eAAe,WAAW;AAAA,IAC1B,YAAY,WAAW;AAAA,IACvB,SAAS,WAAW;AAAA,IACpB,YAAY;AAAA,EACd;AAEA,MAAI,CAAC,WAAW;AACd,6BAAyB;AAAA,MACvB;AAAA,MACA,qBAAqB,WAAW;AAAA,MAChC,YAAY,WAAW;AAAA,MACvB,YAAY;AAAA,MACZ,gBAAgB,iBAAiB,cAAc;AAAA,MAC/C;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AACD,WAAO;AAAA,MACL;AAAA,MACA,aAAa,0BAA0B,YAAY,gBAAgB,cAAc;AAAA,IACnF;AAAA,EACF;AAEA,2BAAyB;AAAA,IACvB;AAAA,IACA,qBAAqB,WAAW;AAAA,IAChC,YAAY,WAAW;AAAA,IACvB,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AAED,SAAO;AAAA,IACL,oBAAoB,WAAW;AAAA,IAC/B;AAAA,EACF;AACF;AAEA,IAAM,6BAA6BA,GAAE,OAAO;AAAA,EAC1C,SAASA,GAAE,OAAO;AAAA,EAClB,YAAYA,GAAE,OAAO;AAAA,EACrB,MAAMA,GAAE,OAAO;AAAA,EACf,QAAQA,GAAE,KAAK,CAAC,SAAS,WAAW,CAAC;AAAA,EACrC,cAAcA,GAAE,OAAO;AAAA,EACvB,gBAAgBA,GAAE,OAAOA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EAC/C,YAAY,wBAAwB,SAAS;AAAA,EAC7C,WAAWA,GAAE,OAAO,EAAE,SAAS;AACjC,CAAC,EAAE,OAAO;AAEV,IAAM,oCAAoCA,GAAE,OAAO;AAAA,EACjD,YAAY;AACd,CAAC,EAAE,OAAO;AAEH,IAAM,sBAAsBA,GAAE,MAAM;AAAA,EACzC;AAAA,EACA;AACF,CAAC;AAEM,IAAM,2BAA2BA,GAAE,OAAO;AAAA,EAC/C,UAAUA,GAAE,MAAMA,GAAE,OAAO;AAAA,IACzB,SAASA,GAAE,OAAO;AAAA,IAClB,YAAYA,GAAE,OAAO;AAAA,IACrB,MAAMA,GAAE,OAAO;AAAA,EACjB,CAAC,CAAC;AAAA,EACF,OAAOA,GAAE,OAAO;AAAA,EAChB,QAAQA,GAAE,OAAO;AAAA,EACjB,eAAeA,GAAE,MAAMA,GAAE,OAAO;AAAA,IAC9B,OAAOA,GAAE,OAAO;AAAA,IAChB,YAAYA,GAAE,OAAO;AAAA,IACrB,MAAMA,GAAE,OAAO;AAAA,IACf,OAAOA,GAAE,OAAO;AAAA,EAClB,CAAC,CAAC,EAAE,SAAS;AACf,CAAC;AAEM,SAAS,0BAA0B,QAAmB;AAC3D,QAAM,8BAA8B,IAAI;AAAA,IACtC,oBAAoB,OAAO,CAAC,SAAS,SAAS,IAAI,IAAI,CAAC;AAAA,EACzD;AAEA,QAAM,cAAc,OAAO;AAAA,IACzB;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAaF,aAAa,cAAc;AAAA,MAC3B,aAAa,EAAE,cAAc,OAAO,iBAAiB,OAAO,eAAe,MAAM;AAAA,IACnF;AAAA,IACA,aAAa,OAAO,EAAE,YAAY,MAAM,aAAa,SAAS,SAAS,cAAc,MAAM,UAAU,OAAO,WAAW,MAAM;AAC3H,yBAAmB;AAEnB,YAAM,QAAQ,MAAM,oBAAoB;AACxC,YAAM,6BAA6B,OAAO,eAAe,YAAY,WAAW,KAAK,EAAE,SAAS;AAChG,YAAM,mBAAmB,MAAM;AAAA,QAC7B;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAEA,YAAM,aAAa,MAAM,yBAAyB;AAAA,QAChD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,MAAM;AAAA,QACnB;AAAA,MACF,CAAC;AACD,UAAI,WAAW,aAAa;AAC1B,eAAO,WAAW;AAAA,MACpB;AACA,YAAM,qBAAqB,WAAW;AACtC,YAAM,iBAAiB,WAAW;AAClC,UAAI,CAAC,oBAAoB;AACvB,eAAO,8BAA8B;AAAA,MACvC;AAEA,YAAM,UAAU,SAAS,IAAI,kBAAkB,KAAK;AAEpD,YAAM,MAAM,MAAM,SAAc,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACnF,UAAI,CAAC,KAAK;AACR,cAAM,cAAc,mBAAmB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG;AACrH,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MACE,gBAAgB,kBAAkB;AAAA;AAAA;AAAA;AAAA,kCAES,kBAAkB,WAAW,WAAW;AAAA;AAAA;AAAA;AAAA,UAEvF,CAAC;AAAA,UACD,mBAAmB;AAAA,YACjB;AAAA,YACA,eAAe,kBAAkB;AAAA,YACjC;AAAA,YACA;AAAA,cACE,EAAE,MAAM,eAAe,aAAa,qBAAqB,YAAY,EAAE,QAAQ,UAAU,MAAM,oBAAoB,MAAM,YAAY,EAAE;AAAA,cACvI,EAAE,MAAM,eAAe,aAAa,oBAAoB,YAAY,EAAE,QAAQ,OAAO,EAAE;AAAA,YACzF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,YAAM,OAAgC,CAAC;AACvC,YAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAEnD,iBAAW,SAAS,IAAI,UAAU,CAAC,GAAG;AACpC,cAAM,MAAM,MAAM;AAClB,YAAI,QAAQ,QAAQ,kBAAkB;AACpC,eAAK,GAAG,IAAI;AAAA,QACd,WAAW,MAAM,SAAS,WAAW,MAAM,SAAS,gBAAgB;AAClE,eAAK,GAAG,IAAI,CAAC;AAAA,QACf,WAAW,MAAM,SAAS,UAAU;AAAA,QAEpC,OAAO;AACL,eAAK,GAAG,IAAI;AAAA,QACd;AAAA,MACF;AAEA,iBAAW,OAAO,QAAQ,UAAU;AAClC,YAAI,IAAI,UAAU,SAAS;AACzB,eAAK,IAAI,GAAG,IAAI;AAAA,QAClB,WAAW,IAAI,UAAU,SAAS;AAChC,eAAK,IAAI,GAAG,IAAI,IAAI;AAAA,QACtB;AAAA,MACF;AAEA,UAAI,QAAQ,YAAY;AACtB,cAAM,WAAW,QAAQ,WAAW;AAAA,UAClC,YAAY;AAAA,UAAoB;AAAA,UAAM;AAAA,UAAa;AAAA,UAAS;AAAA,UAAM,SAAS;AAAA,UAC3E,cAAc,CAAC;AAAA,UAAG,gBAAgB,CAAC;AAAA,UAAG,kBAAkB,IAAI,UAAU,CAAC;AAAA,QACzE,CAAC;AACD,mBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACjD,cAAI,QAAQ,UAAa,QAAQ,IAAI;AACnC,iBAAK,GAAG,IAAI;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAGA,UAAI,YAAY,OAAO,aAAa,UAAU;AAC5C,mBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACjD,cAAI,QAAQ,OAAQ,MAAK,GAAG,IAAI;AAAA,QAClC;AAAA,MACF;AAGA,WAAK,QAAQ,oBAAoB,aAAa,IAAI;AAGlD,YAAM,SAAS;AAGf,UAAI;AACJ,UAAI;AACJ,UAAI;AACF,cAAM,UAAU,kBAAkB;AAClC,cAAM,SAAS,MAAM,YAAgD,qBAAqB;AAAA,UACxF,gBAAgB;AAAA,UAChB,SAAS,WAAW;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,UAAU,SAAS,OAAO,KAAK;AAAA,UAC1C,WAAW,WAAW;AAAA,QACxB,CAAC;AACD,qBAAa,OAAO;AACpB,uBAAe,OAAO;AAEtB,cAAM,sBAAsB,EAAE,cAAc,WAAW,CAAC;AAAA,MAC1D,SAAS,OAAgB;AACvB,cAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,YAAI,IAAI,SAAS,WAAW,KAAK,IAAI,SAAS,gBAAgB,GAAG;AAC/D,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM;AAAA;AAAA,EAA4C,GAAG;AAAA;AAAA;AAAA,YACvD,CAAC;AAAA,YACD,mBAAmB;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,gBACE,EAAE,MAAM,WAAW,aAAa,sBAAsB,YAAY,EAAE,QAAQ,OAAO,SAAS,WAAW,KAAK,EAAE;AAAA,gBAC9G,EAAE,MAAM,gBAAgB,aAAa,yBAAyB,YAAY,EAAE,SAAS,WAAW,GAAG,EAAE;AAAA,cACvG;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAGA,YAAM,eAA6B,CAAC;AACpC,YAAM,iBAAmC,CAAC;AAC1C,YAAM,kBAAyD,CAAC;AAEhE,YAAM,oBAAoB,SAAS,MAAM,SAAS;AAClD,YAAM,cAAc,mBAAmB,MAAM,WAAW;AACxD,UAAI,eAAe,CAAC,mBAAmB;AACrC,cAAM,CAAC,eAAe,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,UACxD,SAAgB,uBAAuB,EAAE,OAAO,YAAY,CAAC;AAAA,UAC7D,SAAgB,uBAAuB;AAAA,QACzC,CAAC;AAED,cAAM,UAAU,oBAAI,IAAoB;AACxC,mBAAW,KAAK,eAAgB,SAAQ,IAAI,EAAE,KAAK,EAAE,IAAI;AAEzD,cAAM,cAAc,iBAAiB,CAAC,GACnC,OAAO,CAAC,MAAM,EAAE,YAAY,gBAAgB,EAAE,QAAQ,UAAU,EAChE,IAAI,CAAC,MAAM;AACV,gBAAM,OAAO,sBAAsB,GAAG,MAAM,aAAa,oBAAoB,QAAQ,IAAI,EAAE,YAAY,KAAK,SAAS;AACrH,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,UAAU,QAAQ,IAAI,EAAE,YAAY,KAAK;AAAA,YACzC,YAAY,KAAK;AAAA,YACjB,kBAAkB,KAAK;AAAA,UACzB;AAAA,QACF,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAG7C,mBAAW,KAAK,YAAY;AAC1B,cAAI,aAAa,UAAU,eAAgB;AAC3C,cAAI,EAAE,aAAa,+BAAgC;AACnD,cAAI,CAAC,EAAE,WAAW,CAAC,aAAc;AAEjC,gBAAM,EAAE,MAAM,cAAc,QAAQ,eAAe,IAAI,kBAAkB,oBAAoB,EAAE,UAAU,OAAO;AAChH,cAAI;AACF,kBAAM,YAAY,6BAA6B;AAAA,cAC7C,aAAa;AAAA,cACb,WAAW,EAAE;AAAA,cACb,MAAM;AAAA,YACR,CAAC;AACD,yBAAa,KAAK;AAAA,cAChB,eAAe,EAAE;AAAA,cACjB,YAAY,EAAE;AAAA,cACd,kBAAkB,EAAE;AAAA,cACpB;AAAA,cACA,YAAY,cAAc,EAAE,UAAU,KAAM,EAAU,gBAAgB,OAAO,cAAc;AAAA,YAC7F,CAAC;AAAA,UACH,QAAQ;AAAA,UAER;AAAA,QACF;AAGA,cAAM,YAAY,IAAI,IAAI,aAAa,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC;AAClE,mBAAW,KAAK,YAAY;AAC1B,cAAI,eAAe,UAAU,gBAAiB;AAC9C,cAAI,UAAU,IAAI,EAAE,OAAO,EAAG;AAC9B,cAAI,EAAE,aAAa,GAAI;AAEvB,gBAAM,UAAU,eAAe,EAAE,MAAM,EAAE;AACzC,gBAAM,SAAS,EAAE,cAAc,iCAC3B,oCACA,IAAI,EAAE,KAAK,YAAY,EAAE,MAAM,KAAK,EAAE,OAAO,CAAC,MAAc,GAAG,IAAI,IAAI,WAAW,GAAG,YAAY,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,MAAM,CAAC;AAE5J,yBAAe,KAAK;AAAA,YAClB,SAAS,EAAE;AAAA,YACX,MAAM,EAAE;AAAA,YACR,YAAY,EAAE;AAAA,YACd;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAGA,UAAI,SAAS,MAAM,SAAS,KAAK,cAAc;AAC7C,mBAAW,QAAQ,OAAO;AACxB,cAAI;AACF,kBAAM,YAAY,6BAA6B;AAAA,cAC7C,aAAa;AAAA,cACb,WAAW,KAAK;AAAA,cAChB,MAAM,KAAK;AAAA,YACb,CAAC;AACD,4BAAgB,KAAK,EAAE,OAAO,UAAK,KAAK,IAAI,WAAM,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC;AACvE,yBAAa,KAAK;AAAA,cAChB,eAAe,KAAK;AAAA,cACpB,YAAY,KAAK;AAAA,cACjB,kBAAkB;AAAA,cAClB,cAAc,KAAK;AAAA,YACrB,CAAC;AAAA,UACH,SAAS,GAAY;AACnB,kBAAM,MAAM,aAAa,QAAQ,EAAE,UAAU;AAC7C,4BAAgB,KAAK,EAAE,OAAO,UAAK,KAAK,IAAI,WAAM,KAAK,EAAE,KAAK,GAAG,IAAI,IAAI,MAAM,CAAC;AAAA,UAClF;AAAA,QACF;AAAA,MACF;AAGA,YAAM,aAA6B;AAAA,QACjC,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA,kBAAkB,IAAI,UAAU,CAAC;AAAA,MACnC;AACA,YAAM,UAAU,aAAa,YAAY,OAAO;AAGhD,UAAI,qBAAoC;AACxC,YAAM,aAAa,gBAAiB,WAAmB;AACvD,UAAI,YAAY;AACd,YAAI;AACF,gBAAM,QAAQ,MAAM,SAAc,iCAAiC;AAAA,YACjE,cAAc;AAAA,UAChB,CAAC;AACD,cAAI,OAAO,SAAS;AAClB,iCAAqB,MAAM;AAAA,UAC7B;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAGA,YAAM,wBAAwB,MAAM,sBAAsB,MAAM,WAAW;AAC3E,UAAI,sBAAsB,SAAS,GAAG;AACpC,cAAM,sBAAsB,EAAE,sBAAsB,KAAK,CAAC;AAAA,MAC5D;AAGA,UAAI,kBAAkB;AACtB,UAAI,gBAAqB;AACzB,UAAI;AACF,wBAAgB,MAAM,YAAiB,wCAAwC;AAAA,UAC7E,SAAS;AAAA,UACT,SAAS;AAAA,QACX,CAAC;AACD,YAAI,eAAe,WAAW,cAAc,QAAQ,SAAS,aAAa,cAAc,QAAQ,SAAS,SAAS,GAAG;AACnH,4BAAkB,qBAAqB,aAAa;AAAA,QACtD;AAAA,MACF,QAAQ;AAAA,MAER;AAGA,UAAI,eAAe,SAAS;AAC1B,YAAI;AACF,gBAAM,gBAAgB,MAAM,oBAAoB;AAChD,gBAAM,IAAI,cAAc;AACxB,gBAAM,eAAe,EAAE,YAAY,CAAC,GAAG,OAAO,CAAC,MAAW,CAAC,EAAE,MAAM,EAAE;AACrE,8BAAoB,cAAc,aAAa;AAAA,YAC7C,UAAU;AAAA,YACV,YAAY,EAAE,gBAAgB;AAAA,YAC9B,MAAM,EAAE;AAAA,YACR,SAAS;AAAA,YACT,QAAQ,EAAE;AAAA,YACV,QAAQ,cAAc,UAAU;AAAA,YAChC,gBAAgB,EAAE,UAAU,UAAU;AAAA,YACtC,iBAAiB;AAAA,YACjB,eAAe,EAAE,SAAS;AAAA,UAC5B,CAAC;AAAA,QACH,QAAQ;AAAA,QAA6B;AAAA,MACvC;AAMA,YAAM,mBACJ,eAAe,QACd,eAAe,UAAa,MAAM,mBAAmB;AAExD,UAAI,cAAqC;AACzC,UAAI,cAA6B;AACjC,UAAI,oBAAoB,cAAc;AACpC,YAAI;AACF,gBAAM,YAAY,qBAAqB,EAAE,SAAS,aAAa,CAAC;AAChE,wBAAc;AACd,gBAAM,sBAAsB,EAAE,eAAe,WAAW,CAAC;AAAA,QAC3D,SAAS,GAAY;AACnB,wBAAc,aAAa,QAAQ,EAAE,UAAU;AAAA,QAEjD;AAAA,MACF;AAGA,YAAM,QAAkB;AAAA,QACtB,eAAe,gBAAgB,IAAI;AAAA,QACnC,KAAK,IAAI,iBAAiB,kBAAkB,WAAW,WAAW;AAAA,QAClE,kBAAkB,MAAM,aAAa,KAAK,MAAM,WAAW;AAAA,MAC7D;AAEA,UAAI,gBAAgB,YAAY;AAC9B,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,uBAAuB;AAClC,cAAM,KAAK,oBAAoB,kBAAkB,OAAO,eAAe,aAAa,oBAAoB;AACxG,YAAI,eAAe,QAAQ,SAAS,GAAG;AACrC,gBAAM,KAAK,WAAW,eAAe,QAAQ,KAAK,IAAI,CAAC,GAAG;AAAA,QAC5D;AACA,cAAM,KAAK,qFAAqF;AAAA,MAClG;AAGA,YAAM,SAAS,QAAQ,IAAI,wBAAwB;AACnD,YAAM,YACJ,uBAAuB,SACnB,GAAG,OAAO,QAAQ,OAAO,EAAE,CAAC,MAAM,MAAM,aAAa,WAAW,UAAU,KAC1E;AACN,UAAI,WAAW;AACb,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,uBAAuB,SAAS,EAAE;AAAA,MAC/C;AAEA,UAAI,aAAa,SAAS,GAAG;AAC3B,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,mBAAmB,aAAa,MAAM,GAAG;AACpD,mBAAW,QAAQ,cAAc;AAC/B,gBAAM,SAAU,KAAa,aAAa,mBAAe,KAAa,UAAU,KAAK;AACrF,gBAAM,KAAK,UAAU,KAAK,YAAY,MAAM,KAAK,aAAa,KAAK,KAAK,UAAU,KAAK,KAAK,gBAAgB,IAAI,MAAM,EAAE;AAAA,QAC1H;AAAA,MACF;AAEA,UAAI,gBAAgB,SAAS,GAAG;AAC9B,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,oBAAoB;AAC/B,mBAAW,KAAK,gBAAiB,OAAM,KAAK,KAAK,EAAE,KAAK,EAAE;AAAA,MAC5D;AAEA,UAAI,gBAAgB,aAAa;AAC/B,cAAM,mBAAmB,eAAe,UAAa,MAAM,mBAAmB;AAC9E,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,iBAAiB,YAAY,EAAE;AAC1C,YAAI,kBAAkB;AACpB,gBAAM,KAAK,KAAK,IAAI,kCAAkC;AAAA,QACxD,OAAO;AACL,gBAAM,KAAK,KAAK,IAAI,mCAAmC;AAAA,QACzD;AACA,YAAI,qBAAqB,IAAI,kBAAkB,GAAG;AAChD,gBAAM,KAAK,YAAY,kBAAkB,0EAAqE;AAAA,QAChH;AAAA,MACF,WAAW,aAAa;AACtB,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,kBAAkB;AAC7B,cAAM,KAAK,UAAU,WAAW,6DAAwD,YAAY,4BAA4B;AAAA,MAClI;AAEA,UAAI,eAAe,SAAS,GAAG;AAC7B,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,+DAA+D;AAC1E,iBAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,gBAAM,IAAI,eAAe,CAAC;AAC1B,gBAAM,UAAU,EAAE,UAAU,WAAM,EAAE,OAAO,KAAK;AAChD,gBAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,SAAS,OAAO,EAAE,IAAI,KAAK,EAAE,UAAU,IAAI,OAAO,EAAE;AAAA,QAC7F;AAAA,MACF;AAEA,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,oBAAoB,OAAO,CAAC;AAEvC,YAAM,eAAe,QAAQ,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM;AAC3D,UAAI,aAAa,SAAS,GAAG;AAC3B,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,wCAAwC,YAAY,8BAA8B;AAAA,MAC/F;AAGA,YAAM,cACJ,uBAAuB,UACvB,eAAe,SACf,eAAe;AACjB,YAAM,kBAAkB,aAAa,KAAK,CAAC,MAAM,EAAE,qBAAqB,UAAU;AAClF,UAAI,eAAe,CAAC,iBAAiB;AACnC,cAAM,KAAK,EAAE;AACb,cAAM;AAAA,UACJ,2BAA2B,uBAAuB,SAAS,QAAQ,MAAM,+GAA+G,YAAY;AAAA,QACtM;AACA,cAAM,sBAAsB,EAAE,8BAA8B,WAAW,CAAC;AAAA,MAC1E;AAGA,UAAI,oBAAoB;AACtB,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,4BAA4B,kBAAkB,EAAE;AAAA,MAC7D;AAGA,UAAI,sBAAsB,SAAS,GAAG;AACpC,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,iFAA4E;AACvF,mBAAW,KAAK,uBAAuB;AACrC,gBAAM,KAAK,KAAK,EAAE,IAAI,KAAK,EAAE,UAAU,KAAK,EAAE,OAAO,sCAAiC,EAAE,YAAY,UAAU;AAAA,QAChH;AACA,cAAM,KAAK,iEAAiE;AAAA,MAC9E;AAGA,UAAI,iBAAiB;AACnB,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,eAAe;AAAA,MAC5B;AAGA,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,eAAe;AAC1B,YAAM,MAAM,gBAAgB;AAC5B,UAAI,gBAAgB,aAAa;AAC/B,cAAM,KAAK,sDAAsD,GAAG,sCAAiC;AACrG,YAAI,aAAa,SAAS,GAAG;AAC3B,gBAAM,KAAK,mDAAmD,GAAG,gCAA2B;AAAA,QAC9F;AAAA,MACF,OAAO;AACL,YAAI,gBAAgB,WAAW,GAAG;AAChC,gBAAM,KAAK,sDAAsD,GAAG,8CAAyC;AAAA,QAC/G;AACA,cAAM,KAAK,GAAG,gBAAgB,WAAW,IAAI,MAAM,GAAG,4CAA4C,GAAG,oDAA+C;AACpJ,YAAI,aAAa,SAAS,GAAG;AAC3B,gBAAM,KAAK,GAAG,gBAAgB,WAAW,IAAI,MAAM,GAAG,kDAAkD,GAAG,gCAA2B;AAAA,QACxI;AAAA,MACF;AAGA,UAAI;AACF,cAAM,YAAY,MAAM,SAAc,0BAA0B;AAChE,YAAI,aAAa,UAAU,QAAQ,UAAU,KAAK,SAAS,GAAG;AAC5D,gBAAM,UAAU,UAAU,KAAK,MAAM,GAAG,CAAC;AACzC,gBAAM,KAAK,EAAE;AACb,gBAAM,KAAK,2BAA2B,UAAU,KAAK,GAAG;AACxD,qBAAW,OAAO,SAAS;AACzB,kBAAM,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,QAAQ,EAAE;AAAA,UAChD;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAGA,YAAM,OAAqB,CAAC;AAC5B,UAAI,gBAAgB,aAAa;AAC/B,aAAK,KAAK,EAAE,MAAM,SAAS,aAAa,wBAAwB,YAAY,EAAE,QAAQ,WAAW,SAAS,aAAa,EAAE,CAAC;AAAA,MAC5H,OAAO;AACL,YAAI,gBAAgB,WAAW,GAAG;AAChC,eAAK,KAAK,EAAE,MAAM,SAAS,aAAa,kBAAkB,YAAY,EAAE,QAAQ,WAAW,SAAS,aAAa,EAAE,CAAC;AAAA,QACtH;AACA,aAAK,KAAK,EAAE,MAAM,gBAAgB,aAAa,mBAAmB,YAAY,EAAE,SAAS,aAAa,EAAE,CAAC;AAAA,MAC3G;AAEA,YAAM,UAAU,gBAAgB,cAC5B,0BAA0B,YAAY,KAAK,IAAI,QAAQ,kBAAkB,aAAa,QAAQ,KAAK,SACnG,YAAY,YAAY,KAAK,IAAI,iBAAiB,kBAAkB,aAAa,QAAQ,KAAK;AAElG,YAAM,aAAa;AAAA,QACjB,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC;AAAA,QAC3D,mBAAmB;AAAA,UACjB;AAAA,UACA;AAAA,YACE,SAAS;AAAA,YACT,YAAY;AAAA,YACZ;AAAA,YACA,QAAQ;AAAA,YACR,cAAc,QAAQ;AAAA,YACtB,gBAAgB,eAAe,UAC3B,EAAE,GAAG,cAAc,SAAS,QAAQ,cAAc,UAAU,YAAY,IACxE;AAAA,YACJ,GAAI,kBAAkB,EAAE,YAAY,eAAe;AAAA,YACnD,GAAI,aAAa,EAAE,UAAU;AAAA,UAC/B;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,iBAAe,WAAW;AAI1B,QAAM,mBAAmB,OAAO;AAAA,IAC9B;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAMF,aAAa,mBAAmB;AAAA,MAChC,aAAa,EAAE,cAAc,OAAO,iBAAiB,OAAO,eAAe,MAAM;AAAA,IACnF;AAAA,IACA,aAAa,OAAO,EAAE,QAAQ,MAAM;AAClC,yBAAmB;AAEnB,YAAM,UAAU,kBAAkB;AAClC,YAAM,YAAY,UAAU,SAAS,OAAO,KAAK;AAEjD,YAAM,UAOD,CAAC;AAEN,YAAM,OAAO,mBAAmB;AAAA,QAC9B,OAAO;AAAA,QACP,MAAM,mBAAmB,QAAQ,MAAM;AAAA,QACvC,QAAQ;AAAA,MACV,CAAC;AAED,YAAM,iBAAiB,MAAM,SAAgB,uBAAuB;AACpE,YAAM,YAAY,oBAAI,IAAiB;AACvC,iBAAW,KAAK,eAAgB,WAAU,IAAI,EAAE,MAAM,CAAC;AACvD,YAAM,eAAe,oBAAI,IAAoB;AAC7C,iBAAW,KAAK,eAAgB,cAAa,IAAI,EAAE,KAAK,EAAE,IAAI;AAE9D,eAAS,WAAW,GAAG,WAAW,QAAQ,QAAQ,YAAY;AAC5D,cAAM,QAAQ,QAAQ,QAAQ;AAE9B,YAAI,WAAW,KAAK,WAAW,MAAM,GAAG;AACtC,gBAAM,OAAO,mBAAmB;AAAA,YAC9B,OAAO;AAAA,YACP,MAAM,YAAY,QAAQ,IAAI,QAAQ,MAAM;AAAA,YAC5C,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AACA,cAAM,UAAU,SAAS,IAAI,MAAM,UAAU,KAAK;AAClD,cAAM,MAAM,UAAU,IAAI,MAAM,UAAU;AAE1C,YAAI,CAAC,KAAK;AACR,kBAAQ,KAAK,EAAE,MAAM,MAAM,MAAM,YAAY,MAAM,YAAY,SAAS,IAAI,IAAI,OAAO,WAAW,GAAG,OAAO,eAAe,MAAM,UAAU,cAAc,CAAC;AAC1J;AAAA,QACF;AAEA,cAAM,OAAgC,CAAC;AACvC,cAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAEnD,mBAAW,SAAS,IAAI,UAAU,CAAC,GAAG;AACpC,gBAAM,MAAM,MAAM;AAClB,cAAI,QAAQ,QAAQ,kBAAkB;AACpC,iBAAK,GAAG,IAAI,MAAM;AAAA,UACpB,WAAW,MAAM,SAAS,WAAW,MAAM,SAAS,gBAAgB;AAClE,iBAAK,GAAG,IAAI,CAAC;AAAA,UACf,WAAW,MAAM,SAAS,UAAU;AAAA,UAEpC,OAAO;AACL,iBAAK,GAAG,IAAI;AAAA,UACd;AAAA,QACF;AAEA,mBAAW,OAAO,QAAQ,UAAU;AAClC,cAAI,IAAI,UAAU,QAAS,MAAK,IAAI,GAAG,IAAI;AAAA,mBAClC,IAAI,UAAU,QAAS,MAAK,IAAI,GAAG,IAAI,IAAI;AAAA,QACtD;AAEA,YAAI,QAAQ,YAAY;AACtB,gBAAM,WAAW,QAAQ,WAAW;AAAA,YAClC,YAAY,MAAM;AAAA,YAAY,MAAM,MAAM;AAAA,YAAM,aAAa,MAAM;AAAA,YACnE;AAAA,YAAM,SAAS;AAAA,YAAI,cAAc,CAAC;AAAA,YAAG,gBAAgB,CAAC;AAAA,YAAG,kBAAkB,IAAI,UAAU,CAAC;AAAA,UAC5F,CAAC;AACD,qBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACjD,gBAAI,QAAQ,UAAa,QAAQ,GAAI,MAAK,GAAG,IAAI;AAAA,UACnD;AAAA,QACF;AAEA,YAAI,CAAC,KAAK,QAAQ,gBAAgB,KAAK,CAAC,KAAK,eAAe,CAAC,KAAK,WAAW;AAC3E,eAAK,QAAQ,oBAAoB,aAAa,IAAI,MAAM;AAAA,QAC1D;AAEA,YAAI;AACF,gBAAM,SAAS,MAAM,YAAgD,qBAAqB;AAAA,YACxF,gBAAgB,MAAM;AAAA,YACtB,SAAS,MAAM,WAAW;AAAA,YAC1B,MAAM,MAAM;AAAA,YACZ,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,YACA,WAAW,WAAW;AAAA,UACxB,CAAC;AACD,gBAAM,aAAa,OAAO;AAC1B,gBAAM,eAAe,OAAO;AAE5B,cAAI,gBAAgB;AACpB,gBAAM,cAAc,mBAAmB,MAAM,MAAM,MAAM,WAAW;AACpE,cAAI,aAAa;AACf,gBAAI;AACF,oBAAM,gBAAgB,MAAM,SAAgB,uBAAuB,EAAE,OAAO,YAAY,CAAC;AACzF,oBAAM,cAAc,iBAAiB,CAAC,GACnC,OAAO,CAAC,MAAM,EAAE,YAAY,YAAY,EACxC,IAAI,CAAC,MAAM;AACV,sBAAM,OAAO,sBAAsB,GAAG,MAAM,MAAM,MAAM,aAAa,MAAM,YAAY,aAAa,IAAI,EAAE,YAAY,KAAK,SAAS;AACpI,uBAAO;AAAA,kBACL,GAAG;AAAA,kBACH,UAAU,aAAa,IAAI,EAAE,YAAY,KAAK;AAAA,kBAC9C,YAAY,KAAK;AAAA,gBACnB;AAAA,cACF,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAE7C,yBAAW,KAAK,YAAY;AAC1B,oBAAI,iBAAiB,eAAgB;AACrC,oBAAI,EAAE,aAAa,+BAAgC;AACnD,oBAAI,CAAC,EAAE,QAAS;AAChB,sBAAM,EAAE,MAAM,aAAa,IAAI,kBAAkB,MAAM,YAAY,EAAE,UAAU,OAAO;AACtF,oBAAI;AACF,wBAAM,YAAY,6BAA6B;AAAA,oBAC7C,aAAa;AAAA,oBACb,WAAW,EAAE;AAAA,oBACb,MAAM;AAAA,kBACR,CAAC;AACD;AAAA,gBACF,QAAQ;AAAA,gBAAyB;AAAA,cACnC;AAAA,YACF,QAAQ;AAAA,YAA2C;AAAA,UACrD;AAEA,kBAAQ,KAAK,EAAE,MAAM,MAAM,MAAM,YAAY,MAAM,YAAY,SAAS,cAAc,IAAI,MAAM,WAAW,cAAc,CAAC;AAC1H,gBAAM,sBAAsB,EAAE,cAAc,WAAW,CAAC;AAAA,QAC1D,SAAS,OAAgB;AACvB,gBAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,kBAAQ,KAAK,EAAE,MAAM,MAAM,MAAM,YAAY,MAAM,YAAY,SAAS,IAAI,IAAI,OAAO,WAAW,GAAG,OAAO,IAAI,CAAC;AAAA,QACnH;AAAA,MACF;AAEA,YAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,EAAE;AAC1C,YAAM,SAAS,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE;AAE1C,YAAM,OAAO,mBAAmB;AAAA,QAC9B,OAAO;AAAA,QACP,MAAM,mBAAmB,QAAQ,MAAM,eAAe,OAAO,MAAM;AAAA,QACnE,QAAQ;AAAA,MACV,CAAC;AAED,YAAM,iBAAiB,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,WAAW,CAAC;AAEtE,YAAM,eAAe,oBAAI,IAAoB;AAC7C,iBAAW,KAAK,SAAS;AACvB,qBAAa,IAAI,EAAE,aAAa,aAAa,IAAI,EAAE,UAAU,KAAK,KAAK,CAAC;AAAA,MAC1E;AAEA,YAAM,QAAkB;AAAA,QACtB;AAAA,QACA,KAAK,QAAQ,MAAM,iBAAiB,OAAO,MAAM,oBAAoB,QAAQ,MAAM;AAAA,QACnF,2BAA2B,cAAc;AAAA,QACzC;AAAA,MACF;AAEA,UAAI,aAAa,OAAO,GAAG;AACzB,cAAM,KAAK,kBAAkB;AAC7B,mBAAW,CAAC,KAAK,KAAK,KAAK,cAAc;AACvC,gBAAM,KAAK,OAAO,GAAG,OAAO,KAAK,UAAU;AAAA,QAC7C;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAEA,UAAI,QAAQ,SAAS,GAAG;AACtB,cAAM,KAAK,YAAY;AACvB,mBAAW,KAAK,SAAS;AACvB,gBAAM,WAAW,EAAE,YAAY,IAAI,KAAK,EAAE,SAAS,iBAAiB;AACpE,gBAAM,KAAK,OAAO,EAAE,OAAO,OAAO,EAAE,IAAI,KAAK,EAAE,UAAU,IAAI,QAAQ,EAAE;AAAA,QACzE;AAAA,MACF;AAEA,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,WAAW;AACtB,mBAAW,KAAK,QAAQ;AACtB,gBAAM,KAAK,KAAK,EAAE,IAAI,KAAK,EAAE,UAAU,OAAO,EAAE,KAAK,GAAG;AAAA,QAC1D;AACA,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,+FAA+F;AAAA,MAC5G;AAEA,YAAM,WAAW,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAO;AAC7C,UAAI,SAAS,SAAS,GAAG;AACvB,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,eAAe;AAC1B,cAAM,KAAK,yFAAyF;AACpG,cAAM,KAAK,8DAA8D;AACzE,cAAM,KAAK,0FAA0F;AAAA,MACvG;AAEA,YAAM,UAAU,OAAO,SAAS,IAC5B,kBAAkB,QAAQ,MAAM,IAAI,QAAQ,MAAM,aAAa,OAAO,MAAM,cAC5E,kBAAkB,QAAQ,MAAM;AAEpC,YAAM,OAAqB,QAAQ,SAAS,IACxC;AAAA,QACE,EAAE,MAAM,SAAS,aAAa,wBAAwB,YAAY,EAAE,QAAQ,WAAW,SAAS,QAAQ,CAAC,EAAE,QAAQ,EAAE;AAAA,QACrH,EAAE,MAAM,gBAAgB,aAAa,sBAAsB,YAAY,EAAE,SAAS,QAAQ,CAAC,EAAE,QAAQ,EAAE;AAAA,MACzG,IACA,CAAC;AAEL,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC;AAAA,QAC3D,mBAAmB;AAAA,UACjB;AAAA,UACA;AAAA,YACE,UAAU,QAAQ,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,YAAY,EAAE,YAAY,MAAM,EAAE,KAAK,EAAE;AAAA,YAC7F,OAAO,QAAQ;AAAA,YACf,QAAQ,OAAO;AAAA,YACf,GAAI,OAAO,SAAS,KAAK;AAAA,cACvB,eAAe,OAAO,IAAI,CAAC,OAAO;AAAA,gBAChC,OAAO,QAAQ,QAAQ,CAAC;AAAA,gBACxB,YAAY,EAAE;AAAA,gBACd,MAAM,EAAE;AAAA,gBACR,OAAO,EAAE,SAAS;AAAA,cACpB,EAAE;AAAA,YACJ;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACA,iBAAe,gBAAgB;AAEjC;AAMA,IAAM,aAAa,oBAAI,IAAI;AAAA,EACzB;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EACtE;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EACtE;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EACtE;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACvE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EACrE;AAAA,EAAU;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAC3E,CAAC;AAED,SAAS,aAAa,OAAyB;AAC7C,SAAO,MACJ,YAAY,EACZ,QAAQ,sBAAsB,GAAG,EACjC,MAAM,KAAK,EACX,OAAO,OAAO;AACnB;AAeA,eAAsB,sBACpB,MACA,aACiC;AACjC,QAAM,WAAmC,CAAC;AAC1C,MAAI;AACF,UAAM,WAAW,aAAa,GAAG,IAAI,IAAI,WAAW,EAAE,EACnD,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,EACjD,MAAM,GAAG,CAAC;AAEb,QAAI,SAAS,WAAW,EAAG,QAAO;AAElC,UAAM,cAAc,SAAS,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AACjD,UAAM,CAAC,YAAY,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,MAClD,SAAgB,uBAAuB,EAAE,OAAO,aAAa,gBAAgB,iBAAiB,CAAC;AAAA,MAC/F,SAAgB,uBAAuB,EAAE,OAAO,aAAa,gBAAgB,eAAe,CAAC;AAAA,IAC/F,CAAC;AAED,UAAM,SAAS,CAAC,GAAI,cAAc,CAAC,GAAI,GAAI,eAAe,CAAC,CAAE,EAAE,MAAM,GAAG,CAAC;AAEzE,eAAW,SAAS,QAAQ;AAC1B,YAAM,cAAc,IAAI,IAAI,aAAa,GAAG,MAAM,IAAI,IAAI,MAAM,MAAM,eAAe,EAAE,EAAE,CAAC;AAC1F,YAAM,UAAU,SAAS,OAAO,CAAC,MAAM,YAAY,IAAI,CAAC,CAAC;AACzD,UAAI,QAAQ,SAAS,EAAG;AAGxB,UAAI,eAAe;AACnB,UAAI;AACF,cAAM,YAAY,MAAM,SAAgB,4BAA4B;AAAA,UAClE,SAAS,MAAM;AAAA,QACjB,CAAC;AACD,wBAAgB,aAAa,CAAC,GAAG,OAAO,CAAC,MAAW,EAAE,SAAS,SAAS,EAAE;AAAA,MAC5E,QAAQ;AAAA,MAAqB;AAE7B,eAAS,KAAK;AAAA,QACZ,SAAS,MAAM,WAAW;AAAA,QAC1B,MAAM,MAAM;AAAA,QACZ,YAAY,MAAM,kBAAkB;AAAA,QACpC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAiBO,SAAS,qBAAqB,QAAqB;AACxD,QAAM,EAAE,SAAS,YAAY,IAAI;AACjC,MAAI,CAAC,WAAW,QAAQ,SAAS,WAAW,EAAG,QAAO;AAEtD,QAAM,QAAkB,CAAC,qBAAqB;AAC9C,QAAM,UAAU,QAAQ,YAAY,CAAC,GAAG,OAAO,CAAC,MAAW,CAAC,EAAE,MAAM;AACpE,QAAM,QAAQ,QAAQ,UAAU,UAAU;AAC1C,QAAM,cAAc,QAAQ,OAAO;AAEnC,MAAI,QAAQ,QAAQ;AAClB,UAAM,KAAK,OAAO,KAAK,+BAA+B,QAAQ,YAAY,OAAO,QAAQ,IAAI,SAAS;AAAA,EACxG,OAAO;AACL,UAAM,KAAK,GAAG,WAAW,IAAI,KAAK,wBAAwB,QAAQ,YAAY,OAAO,QAAQ,IAAI,QAAQ;AACzG,UAAM,KAAK,EAAE;AACb,eAAW,KAAK,QAAQ,UAAU;AAChC,YAAM,OAAO,EAAE,SAAS,QAAQ;AAChC,YAAM,QAAQ,EAAE,SAAS,KAAK,WAAM,EAAE,IAAI;AAC1C,YAAM,KAAK,GAAG,IAAI,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE;AAAA,IACtC;AAEA,QAAI,QAAQ,SAAS;AACnB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,sBAAsB,QAAQ,QAAQ,IAAI,EAAE;AACvD,YAAM,KAAK,2BAA2B,QAAQ,QAAQ,gBAAgB,EAAE;AAAA,IAC1E;AAAA,EACF;AAEA,MAAI,aAAa;AACf,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,uBAAuB;AAClC,QAAI,YAAY,mBAAmB;AACjC,YAAM,KAAK,6EAAwE;AAAA,IACrF,OAAO;AACL,YAAM,KAAK,iDAAiD,YAAY,SAAS,EAAE;AACnF,UAAI,YAAY,YAAY;AAC1B,cAAM,KAAK,iBAAiB,YAAY,UAAU,EAAE;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAMO,SAAS,2BAA2B,SAAsB;AAC/D,MAAI,CAAC,WAAW,CAAC,QAAQ,YAAY,QAAQ,SAAS,WAAW,EAAG,QAAO;AAE3E,QAAM,QAAkB,CAAC,qBAAqB;AAC9C,QAAM,SAAS,QAAQ,SAAS,OAAO,CAAC,MAAW,CAAC,EAAE,MAAM;AAC5D,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,cAAc,QAAQ,OAAO;AAEnC,QAAM,iBAAiB,QAAQ,gBAAgB,QAAQ,QAAQ,gBAAgB,KAAM,QAAQ,CAAC,CAAC,MAAM;AACrG,QAAM,aAAa,QAAQ,cAAc,YACrC,0CACA,QAAQ,cAAc,WACpB,gCAA2B,QAAQ,WAAW,KAAK,QAAQ,QAAQ,KAAK,EAAE,gCAC1E,QAAQ,WAAW,SAAS,iBAC1B,oBAAe,cAAc,KAC7B;AAER,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,KAAK,OAAO,KAAK,+BAA+B,QAAQ,YAAY,OAAO,QAAQ,IAAI,UAAU,QAAQ,MAAM,gBAAgB,UAAU,EAAE;AAAA,EACnJ,OAAO;AACL,UAAM,KAAK,GAAG,WAAW,IAAI,KAAK,wBAAwB,QAAQ,YAAY,OAAO,QAAQ,IAAI,UAAU,QAAQ,MAAM,eAAe,UAAU,EAAE;AACpJ,UAAM,KAAK,EAAE;AACb,eAAW,KAAK,QAAQ,UAAU;AAChC,YAAM,OAAO,EAAE,SAAS,QAAQ;AAChC,YAAM,QAAQ,EAAE,SAAS,KAAK,WAAM,EAAE,IAAI;AAC1C,YAAM,KAAK,GAAG,IAAI,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE;AAAA,IACtC;AAEA,QAAI,QAAQ,SAAS;AACnB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,wBAAwB,QAAQ,QAAQ,IAAI,EAAE;AAAA,IAC3D;AAAA,EACF;AAEA,MAAI,QAAQ,aAAa;AACvB,UAAM,KAAK,QAAQ;AACnB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,uBAAuB;AAClC,QAAI,GAAG,mBAAmB;AACxB,YAAM,KAAK,sEAAiE,GAAG,SAAS,EAAE;AAAA,IAC5F,OAAO;AACL,YAAM,KAAK,uCAAuC,GAAG,SAAS,EAAE;AAChE,UAAI,GAAG,YAAY;AACjB,cAAM,KAAK,iBAAiB,GAAG,UAAU,EAAE;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;","names":["z","AsyncLocalStorage","AsyncLocalStorage","passed","z"]}
|
|
File without changes
|
|
File without changes
|