@productbrain/mcp 0.0.1-beta.6 → 0.0.1-beta.8

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.
@@ -73,6 +73,7 @@ var DEFAULT_CLOUD_URL = "https://trustworthy-kangaroo-277.convex.site";
73
73
  var cachedWorkspaceId = null;
74
74
  var cachedWorkspaceSlug = null;
75
75
  var cachedWorkspaceName = null;
76
+ var cachedWorkspaceCreatedAt = null;
76
77
  var cachedAgentSessionId = null;
77
78
  var cachedApiKeyId = null;
78
79
  var cachedApiKeyScope = "readwrite";
@@ -87,9 +88,6 @@ function isSessionOriented() {
87
88
  function setSessionOriented(value) {
88
89
  sessionOriented = value;
89
90
  }
90
- function getApiKeyScope() {
91
- return cachedApiKeyScope;
92
- }
93
91
  async function startAgentSession() {
94
92
  const workspaceId = await getWorkspaceId();
95
93
  if (!cachedApiKeyId) {
@@ -239,6 +237,7 @@ async function resolveWorkspaceWithRetry(maxRetries = 2) {
239
237
  cachedWorkspaceId = workspace._id;
240
238
  cachedWorkspaceSlug = workspace.slug;
241
239
  cachedWorkspaceName = workspace.name;
240
+ cachedWorkspaceCreatedAt = workspace.createdAt ?? null;
242
241
  if (workspace.keyScope) cachedApiKeyScope = workspace.keyScope;
243
242
  if (workspace.keyId) cachedApiKeyId = workspace.keyId;
244
243
  return cachedWorkspaceId;
@@ -261,7 +260,8 @@ async function getWorkspaceContext() {
261
260
  return {
262
261
  workspaceId,
263
262
  workspaceSlug: cachedWorkspaceSlug ?? "unknown",
264
- workspaceName: cachedWorkspaceName ?? "unknown"
263
+ workspaceName: cachedWorkspaceName ?? "unknown",
264
+ createdAt: cachedWorkspaceCreatedAt
265
265
  };
266
266
  }
267
267
  async function mcpQuery(fn, args = {}) {
@@ -1181,7 +1181,6 @@ export {
1181
1181
  getAgentSessionId,
1182
1182
  isSessionOriented,
1183
1183
  setSessionOriented,
1184
- getApiKeyScope,
1185
1184
  startAgentSession,
1186
1185
  closeAgentSession,
1187
1186
  orphanAgentSession,
@@ -1200,4 +1199,4 @@ export {
1200
1199
  registerSmartCaptureTools,
1201
1200
  runContradictionCheck
1202
1201
  };
1203
- //# sourceMappingURL=chunk-YLVX2CON.js.map
1202
+ //# sourceMappingURL=chunk-6ZSCQINU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tools/smart-capture.ts","../src/analytics.ts","../src/client.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\";\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 idPrefix: string;\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 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}\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 `suggest-links` and `relate-entries` 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};\n\nconst PROFILES: Map<string, CollectionProfile> = new Map([\n [\"tensions\", {\n idPrefix: \"TEN\",\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 {\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 idPrefix: \"SOS\",\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 {\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 idPrefix: \"GT\",\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 {\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 idPrefix: \"DEC\",\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 {\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 idPrefix: \"FEAT\",\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 {\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 idPrefix: \"AUD\",\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 {\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 idPrefix: \"STR\",\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.diverseRelations,\n ],\n }],\n\n [\"maps\", {\n idPrefix: \"MAP\",\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 idPrefix: \"CHN\",\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 [\"standards\", {\n idPrefix: \"STD\",\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 ],\n }],\n\n [\"tracking-events\", {\n idPrefix: \"TE\",\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\nconst FALLBACK_PROFILE: CollectionProfile = {\n idPrefix: \"ENT\",\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 ],\n};\n\n// ── ID Generation ───────────────────────────────────────────────────────────\n\nfunction generateEntryId(prefix: string): string {\n const effectivePrefix = prefix || \"ENT\";\n const chars = \"abcdefghijklmnopqrstuvwxyz0123456789\";\n let suffix = \"\";\n for (let i = 0; i < 6; i++) {\n suffix += chars[Math.floor(Math.random() * chars.length)];\n }\n return `${effectivePrefix}-${suffix}`;\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\nfunction computeLinkConfidence(\n candidate: { name: string; data?: any; entryId?: string },\n sourceName: string,\n sourceDescription: string,\n sourceCollection: string,\n candidateCollection: string,\n): number {\n const text = `${sourceName} ${sourceDescription}`.toLowerCase();\n const candidateName = candidate.name.toLowerCase();\n let score = 0;\n\n if (text.includes(candidateName) && candidateName.length > 3) {\n score += 40;\n }\n\n const candidateWords = candidateName.split(/\\s+/).filter((w) => w.length > 3);\n const matchingWords = candidateWords.filter((w) => text.includes(w));\n score += (matchingWords.length / Math.max(candidateWords.length, 1)) * 30;\n\n const HUB_COLLECTIONS = new Set([\"strategy\", \"features\"]);\n if (HUB_COLLECTIONS.has(candidateCollection)) {\n score += 15;\n }\n\n if (candidateCollection !== sourceCollection) {\n score += 10;\n }\n\n return Math.min(score, 100);\n}\n\nfunction inferRelationType(\n sourceCollection: string,\n targetCollection: string,\n profile: CollectionProfile,\n): string {\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 return typeMap[sourceCollection]?.[targetCollection]\n ?? profile.recommendedRelationTypes[0]\n ?? \"related_to\";\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 lines: string[] = [`## Quality: ${result.score}/${result.maxScore}`];\n for (const check of result.checks) {\n const icon = check.passed ? \"[x]\" : \"[ ]\";\n const suggestion = check.passed ? \"\" : ` -- ${check.suggestion ?? \"\"}`;\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 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 \\`relate-entries\\` 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;\n\nexport function registerSmartCaptureTools(server: McpServer) {\n\n 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 collection, name, and description — everything else is inferred or auto-filled.\\n\\n\" +\n \"Supported collections with smart profiles: tensions, business-rules, glossary, decisions, features, \" +\n \"audiences, strategy, standards, maps, chains, tracking-events.\\n\" +\n \"All other collections get an ENT-{random} ID and sensible defaults.\\n\\n\" +\n \"Always creates as 'draft' for governed collections. Use `update-entry` for post-creation adjustments.\",\n inputSchema: {\n collection: z.string().describe(\"Collection slug, e.g. 'tensions', 'business-rules', 'glossary', 'decisions'\"),\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 gather-context calls taking 700ms+')\"),\n entryId: z.string().optional().describe(\"Optional custom entry ID (e.g. 'TEN-my-id'). Auto-generated if omitted.\"),\n },\n annotations: { destructiveHint: false },\n },\n async ({ collection, name, description, context, entryId }) => {\n requireWriteAccess();\n\n const profile = PROFILES.get(collection) ?? FALLBACK_PROFILE;\n\n // 1. Resolve collection schema\n const col = await mcpQuery<any>(\"chain.getCollection\", { slug: collection });\n if (!col) {\n return {\n content: [{ type: \"text\" as const, text: `Collection \\`${collection}\\` not found. Use \\`list-collections\\` to see available collections.` }],\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 {\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, 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 if (!data[profile.descriptionField] && !data.description && !data.canonical) {\n data[profile.descriptionField || \"description\"] = description;\n }\n\n // 3. Determine status\n const status = GOVERNED_COLLECTIONS.has(collection) ? \"draft\" : \"draft\";\n\n // 4. Generate entry ID\n const finalEntryId = entryId ?? generateEntryId(profile.idPrefix);\n\n // 5. Create entry\n let internalId: string;\n try {\n const agentId = getAgentSessionId();\n internalId = await mcpMutation<string>(\"chain.createEntry\", {\n collectionSlug: collection,\n entryId: finalEntryId || undefined,\n name,\n status,\n data,\n createdBy: agentId ? `agent:${agentId}` : \"capture\",\n });\n\n await recordSessionActivity({ entryCreated: finalEntryId || 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 \\`get-entry\\` to inspect the existing entry, or \\`update-entry\\` to modify it.`,\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\n const searchQuery = extractSearchTerms(name, description);\n if (searchQuery) {\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 ...r,\n collSlug: collMap.get(r.collectionId) ?? \"unknown\",\n confidence: computeLinkConfidence(r, name, description, collection, collMap.get(r.collectionId) ?? \"unknown\"),\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 relationType = inferRelationType(collection, 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 });\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 // 7. Score quality\n const captureCtx: CaptureContext = {\n collection,\n name,\n description,\n context,\n data,\n entryId: finalEntryId,\n linksCreated,\n linksSuggested,\n collectionFields: col.fields ?? [],\n };\n const quality = scoreQuality(captureCtx, profile);\n\n // 8. 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 // 9. Format response\n const wsCtx = await getWorkspaceContext();\n const lines: string[] = [\n `# Captured: ${finalEntryId || name}`,\n `**${name}** added to \\`${collection}\\` as \\`${status}\\``,\n `**Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})`,\n ];\n\n if (linksCreated.length > 0) {\n lines.push(\"\");\n lines.push(`## Auto-linked (${linksCreated.length})`);\n for (const link of linksCreated) {\n lines.push(`- -> **${link.relationType}** ${link.targetEntryId}: ${link.targetName} [${link.targetCollection}]`);\n }\n }\n\n if (linksSuggested.length > 0) {\n lines.push(\"\");\n lines.push(\"## Suggested links (review and use relate-entries)\");\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 // 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 gather-context on these entries before committing.\");\n }\n\n // Next steps: guide the agent to connect and commit\n lines.push(\"\");\n lines.push(\"## Next Steps\");\n const eid = finalEntryId || \"(check entry ID)\";\n lines.push(`1. **Connect it:** \\`suggest-links entryId=\"${eid}\"\\` — discover what this should link to`);\n lines.push(`2. **Commit it:** \\`commit-entry entryId=\"${eid}\"\\` — promote from draft to SSOT on the Chain`);\n if (failedChecks.length > 0) {\n lines.push(`3. **Improve quality:** \\`update-entry entryId=\"${eid}\"\\` — fill missing fields`);\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 return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n // ── Quality Check Tool ──────────────────────────────────────────────────\n\n server.registerTool(\n \"quality-check\",\n {\n title: \"Quality Check\",\n description:\n \"Score an existing knowledge entry against collection-specific quality criteria. \" +\n \"Returns a scorecard (X/10) with specific, actionable suggestions for improvement — \" +\n \"including concrete link suggestions from graph analysis when relations are missing.\\n\\n\" +\n \"Checks: name clarity, description completeness, relation connectedness, and collection-specific fields.\\n\\n\" +\n \"Use after creating entries to assess their quality, or to audit existing entries.\",\n inputSchema: {\n entryId: z.string().describe(\"Entry ID to check, e.g. 'TEN-graph-db', 'GT-019', 'SOS-006'\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ entryId }) => {\n const result = await checkEntryQuality(entryId);\n\n // If relations are missing, offer graph-aware suggestions\n const needsRelations = result.quality.checks.some(\n (c) => !c.passed && (c.id === \"has-relations\" || c.id === \"diverse-relations\"),\n );\n\n if (needsRelations) {\n try {\n const suggestions = await mcpQuery<any>(\"chain.graphSuggestLinks\", {\n entryId,\n maxHops: 2,\n limit: 3,\n });\n\n if (suggestions?.suggestions?.length > 0) {\n const linkHints = suggestions.suggestions\n .map((s: any) => ` → \\`relate-entries from='${entryId}' to='${s.entryId}' type='${s.recommendedRelationType}'\\` — ${s.name} [${s.collectionSlug}] (${s.score}/100)`)\n .join(\"\\n\");\n\n result.text += `\\n\\n## Suggested Links to Improve Quality\\n${linkHints}`;\n }\n } catch {\n // Graph suggestions failed — quality check still works without them\n }\n }\n\n return { content: [{ type: \"text\" as const, text: result.text }] };\n }\n );\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nfunction extractPreview(data: any, maxLen: number): string {\n if (!data || typeof data !== \"object\") return \"\";\n const raw = data.description ?? data.canonical ?? data.detail ?? data.rule ?? \"\";\n if (typeof raw !== \"string\" || !raw) return \"\";\n return raw.length > maxLen ? raw.substring(0, maxLen) + \"...\" : raw;\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\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 text = `${name} ${description}`.toLowerCase();\n const keyTerms = text\n .split(/\\s+/)\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, 3).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 entryText = `${entry.name} ${entry.data?.description ?? \"\"}`.toLowerCase();\n const matched = keyTerms.filter((t) => entryText.includes(t));\n if (matched.length < 2) 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 * PostHog analytics for SynergyOS maintainers — tracks MCP usage (sessions, tool calls).\n * Not user-facing. Key is injected at build time via SYNERGYOS_POSTHOG_KEY.\n * Override with POSTHOG_MCP_KEY for self-hosted deployments.\n */\n\nimport { userInfo } from \"node:os\";\nimport { PostHog } from \"posthog-node\";\n\nlet client: PostHog | null = null;\nlet distinctId = \"anonymous\";\n\nconst POSTHOG_HOST = \"https://eu.i.posthog.com\";\n\n/** Injected at build time: SYNERGYOS_POSTHOG_KEY env when running `npm run build`/publish. */\ndeclare const __SYNERGYOS_POSTHOG_KEY__: string;\n\n/** Only write to stderr when MCP_DEBUG=1 for quieter default DX. */\nfunction log(msg: string): void {\n if (process.env.MCP_DEBUG === \"1\") {\n process.stderr.write(msg);\n }\n}\n\nexport function initAnalytics(): void {\n const apiKey = process.env.POSTHOG_MCP_KEY || __SYNERGYOS_POSTHOG_KEY__;\n if (!apiKey) {\n log(\"[MCP-ANALYTICS] No PostHog key — tracking disabled (set SYNERGYOS_POSTHOG_KEY at build time for publish)\\n\");\n return;\n }\n\n client = new PostHog(apiKey, {\n host: POSTHOG_HOST,\n flushAt: 1,\n flushInterval: 5000,\n });\n distinctId = process.env.MCP_USER_ID || fallbackDistinctId();\n\n log(`[MCP-ANALYTICS] Initialized — host=${POSTHOG_HOST} distinctId=${distinctId}\\n`);\n}\n\nfunction fallbackDistinctId(): string {\n try {\n return userInfo().username;\n } catch {\n return `os-${process.pid}`;\n }\n}\n\nexport function trackSessionStarted(\n workspaceId: string,\n serverVersion: string,\n): void {\n if (!client) return;\n client.capture({\n distinctId,\n event: \"mcp_session_started\",\n properties: {\n workspace_id: workspaceId,\n server_version: serverVersion,\n source: \"mcp-server\",\n $groups: { workspace: workspaceId },\n },\n });\n}\n\nexport function trackToolCall(\n fn: string,\n status: \"ok\" | \"error\",\n durationMs: number,\n workspaceId: string,\n errorMsg?: string,\n): void {\n const properties: Record<string, unknown> = {\n tool: fn,\n status,\n duration_ms: durationMs,\n workspace_id: workspaceId,\n source: \"mcp-server\",\n $groups: { workspace: workspaceId },\n };\n if (errorMsg) properties.error = errorMsg;\n\n if (!client) return;\n client.capture({\n distinctId,\n event: \"mcp_tool_called\",\n properties,\n });\n}\n\nexport async function shutdownAnalytics(): Promise<void> {\n await client?.shutdown();\n}\n","/**\n * MCP client — communicates with the Convex HTTP Action gateway.\n *\n * Configuration:\n * PRODUCTBRAIN_API_KEY — pb_sk_* key (workspace + user + scope derived server-side)\n * CONVEX_SITE_URL — (optional) Convex deployment URL, defaults to cloud\n */\n\nimport { trackToolCall } from \"./analytics.js\";\n\nconst DEFAULT_CLOUD_URL = \"https://trustworthy-kangaroo-277.convex.site\";\n\nlet cachedWorkspaceId: string | null = null;\nlet cachedWorkspaceSlug: string | null = null;\nlet cachedWorkspaceName: string | null = null;\n\n// ─── Agent Session State ──────────────────────────────────────────────────\n\nlet cachedAgentSessionId: string | null = null;\nlet cachedApiKeyId: string | null = null;\nlet cachedApiKeyScope: \"read\" | \"readwrite\" = \"readwrite\";\nlet sessionOriented = false;\nlet sessionClosed = false;\n\nexport function getAgentSessionId(): string | null {\n return cachedAgentSessionId;\n}\n\nexport function isSessionOriented(): boolean {\n return sessionOriented;\n}\n\nexport function setSessionOriented(value: boolean): void {\n sessionOriented = value;\n}\n\nexport function getApiKeyScope(): \"read\" | \"readwrite\" {\n return cachedApiKeyScope;\n}\n\nexport function isSessionClosed(): boolean {\n return 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 if (!cachedApiKeyId) {\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: cachedApiKeyId,\n });\n\n cachedAgentSessionId = result.sessionId;\n cachedApiKeyScope = result.toolsScope;\n sessionOriented = false;\n sessionClosed = false;\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 if (!cachedAgentSessionId) return;\n try {\n await mcpCall(\"agent.closeSession\", {\n sessionId: cachedAgentSessionId,\n status: \"closed\",\n });\n } finally {\n sessionClosed = true;\n cachedAgentSessionId = null;\n sessionOriented = false;\n }\n}\n\n/**\n * Mark current session as orphaned (used on disconnect/crash).\n */\nexport async function orphanAgentSession(): Promise<void> {\n if (!cachedAgentSessionId) return;\n try {\n await mcpCall(\"agent.closeSession\", {\n sessionId: cachedAgentSessionId,\n status: \"orphaned\",\n });\n } catch {\n // Best-effort on disconnect\n } finally {\n cachedAgentSessionId = null;\n sessionOriented = false;\n }\n}\n\n/**\n * Touch the session to update lastToolCallAt. Fire-and-forget.\n */\nexport function touchSessionActivity(): void {\n if (!cachedAgentSessionId) return;\n mcpCall(\"agent.touchSession\", {\n sessionId: cachedAgentSessionId,\n }).catch(() => {\n // Non-critical\n });\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}): Promise<void> {\n if (!cachedAgentSessionId) return;\n try {\n await mcpCall(\"agent.recordActivity\", {\n sessionId: cachedAgentSessionId,\n ...activity,\n });\n } catch {\n // Non-critical — don't fail the tool call over activity tracking\n }\n}\n\nexport interface AuditEntry {\n ts: string;\n fn: string;\n workspace: string;\n status: \"ok\" | \"error\";\n durationMs: number;\n error?: string;\n}\n\nconst AUDIT_BUFFER_SIZE = 50;\nconst auditBuffer: AuditEntry[] = [];\n\n/**\n * Bootstrap the client: validate PRODUCTBRAIN_API_KEY and default CONVEX_SITE_URL.\n * Must be called once before any mcpCall.\n */\nexport function bootstrap(): void {\n const pbKey = process.env.PRODUCTBRAIN_API_KEY;\n if (!pbKey?.startsWith(\"pb_sk_\")) {\n throw new Error(\n \"PRODUCTBRAIN_API_KEY is required and must start with 'pb_sk_'. \" +\n \"Generate one at Settings > API Keys in the Product OS UI.\"\n );\n }\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 = cachedWorkspaceId ?? \"unresolved\";\n\n const entry: AuditEntry = { ts, fn, workspace, status, durationMs };\n if (errorMsg) entry.error = errorMsg;\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/**\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 */\nexport async function mcpCall<T>(fn: string, args: Record<string, unknown> = {}): Promise<T> {\n const siteUrl = getEnv(\"CONVEX_SITE_URL\").replace(/\\/$/, \"\");\n const apiKey = getEnv(\"PRODUCTBRAIN_API_KEY\");\n\n const start = Date.now();\n\n let res: Response;\n try {\n res = await fetch(`${siteUrl}/api/mcp`, {\n method: \"POST\",\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 // Touch session activity on every successful call\n if (cachedAgentSessionId && fn !== \"agent.touchSession\" && fn !== \"agent.startSession\") {\n touchSessionActivity();\n }\n\n return json.data as T;\n}\n\nlet resolveInFlight: Promise<string> | null = null;\n\nexport async function getWorkspaceId(): Promise<string> {\n if (cachedWorkspaceId) return cachedWorkspaceId;\n\n if (resolveInFlight) return resolveInFlight;\n\n resolveInFlight = resolveWorkspaceWithRetry().finally(() => {\n resolveInFlight = null;\n });\n return resolveInFlight;\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 keyScope?: string;\n keyId?: string;\n } | null>(\"resolveWorkspace\", {});\n\n if (!workspace) {\n throw new Error(\n \"API key is valid but no workspace is associated. \" +\n \"Run `npx productbrain setup` or regenerate your key.\"\n );\n }\n\n cachedWorkspaceId = workspace._id;\n cachedWorkspaceSlug = workspace.slug;\n cachedWorkspaceName = workspace.name;\n if (workspace.keyScope) cachedApiKeyScope = workspace.keyScope as \"read\" | \"readwrite\";\n if (workspace.keyId) cachedApiKeyId = workspace.keyId;\n return cachedWorkspaceId;\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}\n\nexport async function getWorkspaceContext(): Promise<WorkspaceContext> {\n const workspaceId = await getWorkspaceId();\n return {\n workspaceId,\n workspaceSlug: cachedWorkspaceSlug ?? \"unknown\",\n workspaceName: cachedWorkspaceName ?? \"unknown\",\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 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 if (!cachedAgentSessionId) {\n throw new Error(\n \"Agent session required for write operations. Call `agent-start` first.\"\n );\n }\n\n if (sessionClosed) {\n throw new Error(\n \"Agent session has been closed. Write tools are no longer available.\"\n );\n }\n\n if (!sessionOriented) {\n throw new Error(\n \"Orientation required before writing to the Chain. Call 'orient' first.\"\n );\n }\n\n if (cachedApiKeyScope === \"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 if (!cachedWorkspaceId) 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: cachedWorkspaceId });\n\n if (session && session.status === \"active\") {\n cachedAgentSessionId = session._id;\n sessionOriented = session.oriented;\n cachedApiKeyScope = session.toolsScope as \"read\" | \"readwrite\";\n sessionClosed = false;\n }\n } catch {\n // Recovery is best-effort\n }\n}\n"],"mappings":"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","names":["passed"]}
1
+ {"version":3,"sources":["../src/tools/smart-capture.ts","../src/analytics.ts","../src/client.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\";\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 idPrefix: string;\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 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}\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 `suggest-links` and `relate-entries` 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};\n\nconst PROFILES: Map<string, CollectionProfile> = new Map([\n [\"tensions\", {\n idPrefix: \"TEN\",\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 {\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 idPrefix: \"SOS\",\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 {\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 idPrefix: \"GT\",\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 {\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 idPrefix: \"DEC\",\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 {\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 idPrefix: \"FEAT\",\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 {\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 idPrefix: \"AUD\",\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 {\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 idPrefix: \"STR\",\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.diverseRelations,\n ],\n }],\n\n [\"maps\", {\n idPrefix: \"MAP\",\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 idPrefix: \"CHN\",\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 [\"standards\", {\n idPrefix: \"STD\",\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 ],\n }],\n\n [\"tracking-events\", {\n idPrefix: \"TE\",\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\nconst FALLBACK_PROFILE: CollectionProfile = {\n idPrefix: \"ENT\",\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 ],\n};\n\n// ── ID Generation ───────────────────────────────────────────────────────────\n\nfunction generateEntryId(prefix: string): string {\n const effectivePrefix = prefix || \"ENT\";\n const chars = \"abcdefghijklmnopqrstuvwxyz0123456789\";\n let suffix = \"\";\n for (let i = 0; i < 6; i++) {\n suffix += chars[Math.floor(Math.random() * chars.length)];\n }\n return `${effectivePrefix}-${suffix}`;\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\nfunction computeLinkConfidence(\n candidate: { name: string; data?: any; entryId?: string },\n sourceName: string,\n sourceDescription: string,\n sourceCollection: string,\n candidateCollection: string,\n): number {\n const text = `${sourceName} ${sourceDescription}`.toLowerCase();\n const candidateName = candidate.name.toLowerCase();\n let score = 0;\n\n if (text.includes(candidateName) && candidateName.length > 3) {\n score += 40;\n }\n\n const candidateWords = candidateName.split(/\\s+/).filter((w) => w.length > 3);\n const matchingWords = candidateWords.filter((w) => text.includes(w));\n score += (matchingWords.length / Math.max(candidateWords.length, 1)) * 30;\n\n const HUB_COLLECTIONS = new Set([\"strategy\", \"features\"]);\n if (HUB_COLLECTIONS.has(candidateCollection)) {\n score += 15;\n }\n\n if (candidateCollection !== sourceCollection) {\n score += 10;\n }\n\n return Math.min(score, 100);\n}\n\nfunction inferRelationType(\n sourceCollection: string,\n targetCollection: string,\n profile: CollectionProfile,\n): string {\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 return typeMap[sourceCollection]?.[targetCollection]\n ?? profile.recommendedRelationTypes[0]\n ?? \"related_to\";\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 lines: string[] = [`## Quality: ${result.score}/${result.maxScore}`];\n for (const check of result.checks) {\n const icon = check.passed ? \"[x]\" : \"[ ]\";\n const suggestion = check.passed ? \"\" : ` -- ${check.suggestion ?? \"\"}`;\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 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 \\`relate-entries\\` 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;\n\nexport function registerSmartCaptureTools(server: McpServer) {\n\n 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 collection, name, and description — everything else is inferred or auto-filled.\\n\\n\" +\n \"Supported collections with smart profiles: tensions, business-rules, glossary, decisions, features, \" +\n \"audiences, strategy, standards, maps, chains, tracking-events.\\n\" +\n \"All other collections get an ENT-{random} ID and sensible defaults.\\n\\n\" +\n \"Always creates as 'draft' for governed collections. Use `update-entry` for post-creation adjustments.\",\n inputSchema: {\n collection: z.string().describe(\"Collection slug, e.g. 'tensions', 'business-rules', 'glossary', 'decisions'\"),\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 gather-context calls taking 700ms+')\"),\n entryId: z.string().optional().describe(\"Optional custom entry ID (e.g. 'TEN-my-id'). Auto-generated if omitted.\"),\n },\n annotations: { destructiveHint: false },\n },\n async ({ collection, name, description, context, entryId }) => {\n requireWriteAccess();\n\n const profile = PROFILES.get(collection) ?? FALLBACK_PROFILE;\n\n // 1. Resolve collection schema\n const col = await mcpQuery<any>(\"chain.getCollection\", { slug: collection });\n if (!col) {\n return {\n content: [{ type: \"text\" as const, text: `Collection \\`${collection}\\` not found. Use \\`list-collections\\` to see available collections.` }],\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 {\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, 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 if (!data[profile.descriptionField] && !data.description && !data.canonical) {\n data[profile.descriptionField || \"description\"] = description;\n }\n\n // 3. Determine status\n const status = GOVERNED_COLLECTIONS.has(collection) ? \"draft\" : \"draft\";\n\n // 4. Generate entry ID\n const finalEntryId = entryId ?? generateEntryId(profile.idPrefix);\n\n // 5. Create entry\n let internalId: string;\n try {\n const agentId = getAgentSessionId();\n internalId = await mcpMutation<string>(\"chain.createEntry\", {\n collectionSlug: collection,\n entryId: finalEntryId || undefined,\n name,\n status,\n data,\n createdBy: agentId ? `agent:${agentId}` : \"capture\",\n });\n\n await recordSessionActivity({ entryCreated: finalEntryId || 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 \\`get-entry\\` to inspect the existing entry, or \\`update-entry\\` to modify it.`,\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\n const searchQuery = extractSearchTerms(name, description);\n if (searchQuery) {\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 ...r,\n collSlug: collMap.get(r.collectionId) ?? \"unknown\",\n confidence: computeLinkConfidence(r, name, description, collection, collMap.get(r.collectionId) ?? \"unknown\"),\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 relationType = inferRelationType(collection, 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 });\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 // 7. Score quality\n const captureCtx: CaptureContext = {\n collection,\n name,\n description,\n context,\n data,\n entryId: finalEntryId,\n linksCreated,\n linksSuggested,\n collectionFields: col.fields ?? [],\n };\n const quality = scoreQuality(captureCtx, profile);\n\n // 8. 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 // 9. Format response\n const wsCtx = await getWorkspaceContext();\n const lines: string[] = [\n `# Captured: ${finalEntryId || name}`,\n `**${name}** added to \\`${collection}\\` as \\`${status}\\``,\n `**Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})`,\n ];\n\n if (linksCreated.length > 0) {\n lines.push(\"\");\n lines.push(`## Auto-linked (${linksCreated.length})`);\n for (const link of linksCreated) {\n lines.push(`- -> **${link.relationType}** ${link.targetEntryId}: ${link.targetName} [${link.targetCollection}]`);\n }\n }\n\n if (linksSuggested.length > 0) {\n lines.push(\"\");\n lines.push(\"## Suggested links (review and use relate-entries)\");\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 // 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 gather-context on these entries before committing.\");\n }\n\n // Next steps: guide the agent to connect and commit\n lines.push(\"\");\n lines.push(\"## Next Steps\");\n const eid = finalEntryId || \"(check entry ID)\";\n lines.push(`1. **Connect it:** \\`suggest-links entryId=\"${eid}\"\\` — discover what this should link to`);\n lines.push(`2. **Commit it:** \\`commit-entry entryId=\"${eid}\"\\` — promote from draft to SSOT on the Chain`);\n if (failedChecks.length > 0) {\n lines.push(`3. **Improve quality:** \\`update-entry entryId=\"${eid}\"\\` — fill missing fields`);\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 return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n // ── Quality Check Tool ──────────────────────────────────────────────────\n\n server.registerTool(\n \"quality-check\",\n {\n title: \"Quality Check\",\n description:\n \"Score an existing knowledge entry against collection-specific quality criteria. \" +\n \"Returns a scorecard (X/10) with specific, actionable suggestions for improvement — \" +\n \"including concrete link suggestions from graph analysis when relations are missing.\\n\\n\" +\n \"Checks: name clarity, description completeness, relation connectedness, and collection-specific fields.\\n\\n\" +\n \"Use after creating entries to assess their quality, or to audit existing entries.\",\n inputSchema: {\n entryId: z.string().describe(\"Entry ID to check, e.g. 'TEN-graph-db', 'GT-019', 'SOS-006'\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ entryId }) => {\n const result = await checkEntryQuality(entryId);\n\n // If relations are missing, offer graph-aware suggestions\n const needsRelations = result.quality.checks.some(\n (c) => !c.passed && (c.id === \"has-relations\" || c.id === \"diverse-relations\"),\n );\n\n if (needsRelations) {\n try {\n const suggestions = await mcpQuery<any>(\"chain.graphSuggestLinks\", {\n entryId,\n maxHops: 2,\n limit: 3,\n });\n\n if (suggestions?.suggestions?.length > 0) {\n const linkHints = suggestions.suggestions\n .map((s: any) => ` → \\`relate-entries from='${entryId}' to='${s.entryId}' type='${s.recommendedRelationType}'\\` — ${s.name} [${s.collectionSlug}] (${s.score}/100)`)\n .join(\"\\n\");\n\n result.text += `\\n\\n## Suggested Links to Improve Quality\\n${linkHints}`;\n }\n } catch {\n // Graph suggestions failed — quality check still works without them\n }\n }\n\n return { content: [{ type: \"text\" as const, text: result.text }] };\n }\n );\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nfunction extractPreview(data: any, maxLen: number): string {\n if (!data || typeof data !== \"object\") return \"\";\n const raw = data.description ?? data.canonical ?? data.detail ?? data.rule ?? \"\";\n if (typeof raw !== \"string\" || !raw) return \"\";\n return raw.length > maxLen ? raw.substring(0, maxLen) + \"...\" : raw;\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\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 text = `${name} ${description}`.toLowerCase();\n const keyTerms = text\n .split(/\\s+/)\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, 3).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 entryText = `${entry.name} ${entry.data?.description ?? \"\"}`.toLowerCase();\n const matched = keyTerms.filter((t) => entryText.includes(t));\n if (matched.length < 2) 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 * PostHog analytics for SynergyOS maintainers — tracks MCP usage (sessions, tool calls).\n * Not user-facing. Key is injected at build time via SYNERGYOS_POSTHOG_KEY.\n * Override with POSTHOG_MCP_KEY for self-hosted deployments.\n */\n\nimport { userInfo } from \"node:os\";\nimport { PostHog } from \"posthog-node\";\n\nlet client: PostHog | null = null;\nlet distinctId = \"anonymous\";\n\nconst POSTHOG_HOST = \"https://eu.i.posthog.com\";\n\n/** Injected at build time: SYNERGYOS_POSTHOG_KEY env when running `npm run build`/publish. */\ndeclare const __SYNERGYOS_POSTHOG_KEY__: string;\n\n/** Only write to stderr when MCP_DEBUG=1 for quieter default DX. */\nfunction log(msg: string): void {\n if (process.env.MCP_DEBUG === \"1\") {\n process.stderr.write(msg);\n }\n}\n\nexport function initAnalytics(): void {\n const apiKey = process.env.POSTHOG_MCP_KEY || __SYNERGYOS_POSTHOG_KEY__;\n if (!apiKey) {\n log(\"[MCP-ANALYTICS] No PostHog key — tracking disabled (set SYNERGYOS_POSTHOG_KEY at build time for publish)\\n\");\n return;\n }\n\n client = new PostHog(apiKey, {\n host: POSTHOG_HOST,\n flushAt: 1,\n flushInterval: 5000,\n });\n distinctId = process.env.MCP_USER_ID || fallbackDistinctId();\n\n log(`[MCP-ANALYTICS] Initialized — host=${POSTHOG_HOST} distinctId=${distinctId}\\n`);\n}\n\nfunction fallbackDistinctId(): string {\n try {\n return userInfo().username;\n } catch {\n return `os-${process.pid}`;\n }\n}\n\nexport function trackSessionStarted(\n workspaceId: string,\n serverVersion: string,\n): void {\n if (!client) return;\n client.capture({\n distinctId,\n event: \"mcp_session_started\",\n properties: {\n workspace_id: workspaceId,\n server_version: serverVersion,\n source: \"mcp-server\",\n $groups: { workspace: workspaceId },\n },\n });\n}\n\nexport function trackToolCall(\n fn: string,\n status: \"ok\" | \"error\",\n durationMs: number,\n workspaceId: string,\n errorMsg?: string,\n): void {\n const properties: Record<string, unknown> = {\n tool: fn,\n status,\n duration_ms: durationMs,\n workspace_id: workspaceId,\n source: \"mcp-server\",\n $groups: { workspace: workspaceId },\n };\n if (errorMsg) properties.error = errorMsg;\n\n if (!client) return;\n client.capture({\n distinctId,\n event: \"mcp_tool_called\",\n properties,\n });\n}\n\nexport async function shutdownAnalytics(): Promise<void> {\n await client?.shutdown();\n}\n","/**\n * MCP client — communicates with the Convex HTTP Action gateway.\n *\n * Configuration:\n * PRODUCTBRAIN_API_KEY — pb_sk_* key (workspace + user + scope derived server-side)\n * CONVEX_SITE_URL — (optional) Convex deployment URL, defaults to cloud\n */\n\nimport { trackToolCall } from \"./analytics.js\";\n\nconst DEFAULT_CLOUD_URL = \"https://trustworthy-kangaroo-277.convex.site\";\n\nlet cachedWorkspaceId: string | null = null;\nlet cachedWorkspaceSlug: string | null = null;\nlet cachedWorkspaceName: string | null = null;\nlet cachedWorkspaceCreatedAt: number | null = null;\n\n// ─── Agent Session State ──────────────────────────────────────────────────\n\nlet cachedAgentSessionId: string | null = null;\nlet cachedApiKeyId: string | null = null;\nlet cachedApiKeyScope: \"read\" | \"readwrite\" = \"readwrite\";\nlet sessionOriented = false;\nlet sessionClosed = false;\n\nexport function getAgentSessionId(): string | null {\n return cachedAgentSessionId;\n}\n\nexport function isSessionOriented(): boolean {\n return sessionOriented;\n}\n\nexport function setSessionOriented(value: boolean): void {\n sessionOriented = value;\n}\n\nexport function getApiKeyScope(): \"read\" | \"readwrite\" {\n return cachedApiKeyScope;\n}\n\nexport function isSessionClosed(): boolean {\n return 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 if (!cachedApiKeyId) {\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: cachedApiKeyId,\n });\n\n cachedAgentSessionId = result.sessionId;\n cachedApiKeyScope = result.toolsScope;\n sessionOriented = false;\n sessionClosed = false;\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 if (!cachedAgentSessionId) return;\n try {\n await mcpCall(\"agent.closeSession\", {\n sessionId: cachedAgentSessionId,\n status: \"closed\",\n });\n } finally {\n sessionClosed = true;\n cachedAgentSessionId = null;\n sessionOriented = false;\n }\n}\n\n/**\n * Mark current session as orphaned (used on disconnect/crash).\n */\nexport async function orphanAgentSession(): Promise<void> {\n if (!cachedAgentSessionId) return;\n try {\n await mcpCall(\"agent.closeSession\", {\n sessionId: cachedAgentSessionId,\n status: \"orphaned\",\n });\n } catch {\n // Best-effort on disconnect\n } finally {\n cachedAgentSessionId = null;\n sessionOriented = false;\n }\n}\n\n/**\n * Touch the session to update lastToolCallAt. Fire-and-forget.\n */\nexport function touchSessionActivity(): void {\n if (!cachedAgentSessionId) return;\n mcpCall(\"agent.touchSession\", {\n sessionId: cachedAgentSessionId,\n }).catch(() => {\n // Non-critical\n });\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}): Promise<void> {\n if (!cachedAgentSessionId) return;\n try {\n await mcpCall(\"agent.recordActivity\", {\n sessionId: cachedAgentSessionId,\n ...activity,\n });\n } catch {\n // Non-critical — don't fail the tool call over activity tracking\n }\n}\n\nexport interface AuditEntry {\n ts: string;\n fn: string;\n workspace: string;\n status: \"ok\" | \"error\";\n durationMs: number;\n error?: string;\n}\n\nconst AUDIT_BUFFER_SIZE = 50;\nconst auditBuffer: AuditEntry[] = [];\n\n/**\n * Bootstrap the client: validate PRODUCTBRAIN_API_KEY and default CONVEX_SITE_URL.\n * Must be called once before any mcpCall.\n */\nexport function bootstrap(): void {\n const pbKey = process.env.PRODUCTBRAIN_API_KEY;\n if (!pbKey?.startsWith(\"pb_sk_\")) {\n throw new Error(\n \"PRODUCTBRAIN_API_KEY is required and must start with 'pb_sk_'. \" +\n \"Generate one at Settings > API Keys in the Product OS UI.\"\n );\n }\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 = cachedWorkspaceId ?? \"unresolved\";\n\n const entry: AuditEntry = { ts, fn, workspace, status, durationMs };\n if (errorMsg) entry.error = errorMsg;\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/**\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 */\nexport async function mcpCall<T>(fn: string, args: Record<string, unknown> = {}): Promise<T> {\n const siteUrl = getEnv(\"CONVEX_SITE_URL\").replace(/\\/$/, \"\");\n const apiKey = getEnv(\"PRODUCTBRAIN_API_KEY\");\n\n const start = Date.now();\n\n let res: Response;\n try {\n res = await fetch(`${siteUrl}/api/mcp`, {\n method: \"POST\",\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 // Touch session activity on every successful call\n if (cachedAgentSessionId && fn !== \"agent.touchSession\" && fn !== \"agent.startSession\") {\n touchSessionActivity();\n }\n\n return json.data as T;\n}\n\nlet resolveInFlight: Promise<string> | null = null;\n\nexport async function getWorkspaceId(): Promise<string> {\n if (cachedWorkspaceId) return cachedWorkspaceId;\n\n if (resolveInFlight) return resolveInFlight;\n\n resolveInFlight = resolveWorkspaceWithRetry().finally(() => {\n resolveInFlight = null;\n });\n return resolveInFlight;\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 } | null>(\"resolveWorkspace\", {});\n\n if (!workspace) {\n throw new Error(\n \"API key is valid but no workspace is associated. \" +\n \"Run `npx productbrain setup` or regenerate your key.\"\n );\n }\n\n cachedWorkspaceId = workspace._id;\n cachedWorkspaceSlug = workspace.slug;\n cachedWorkspaceName = workspace.name;\n cachedWorkspaceCreatedAt = workspace.createdAt ?? null;\n if (workspace.keyScope) cachedApiKeyScope = workspace.keyScope as \"read\" | \"readwrite\";\n if (workspace.keyId) cachedApiKeyId = workspace.keyId;\n return cachedWorkspaceId;\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}\n\nexport async function getWorkspaceContext(): Promise<WorkspaceContext> {\n const workspaceId = await getWorkspaceId();\n return {\n workspaceId,\n workspaceSlug: cachedWorkspaceSlug ?? \"unknown\",\n workspaceName: cachedWorkspaceName ?? \"unknown\",\n createdAt: cachedWorkspaceCreatedAt,\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 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 if (!cachedAgentSessionId) {\n throw new Error(\n \"Agent session required for write operations. Call `agent-start` first.\"\n );\n }\n\n if (sessionClosed) {\n throw new Error(\n \"Agent session has been closed. Write tools are no longer available.\"\n );\n }\n\n if (!sessionOriented) {\n throw new Error(\n \"Orientation required before writing to the Chain. Call 'orient' first.\"\n );\n }\n\n if (cachedApiKeyScope === \"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 if (!cachedWorkspaceId) 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: cachedWorkspaceId });\n\n if (session && session.status === \"active\") {\n cachedAgentSessionId = session._id;\n sessionOriented = session.oriented;\n cachedApiKeyScope = session.toolsScope as \"read\" | \"readwrite\";\n sessionClosed = false;\n }\n } catch {\n // Recovery is best-effort\n }\n}\n"],"mappings":"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","names":["passed"]}
package/dist/cli/index.js CHANGED
@@ -3,7 +3,7 @@
3
3
  // src/cli/index.ts
4
4
  var subcommand = process.argv[2];
5
5
  if (subcommand === "setup") {
6
- const { runSetup } = await import("../setup-MJLPTQBL.js");
6
+ const { runSetup } = await import("../setup-42R6TBPH.js");
7
7
  await runSetup();
8
8
  } else {
9
9
  await import("../index.js");