@productbrain/mcp 0.0.1-beta.39 → 0.0.1-beta.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-XCKGFYDP.js → chunk-6WVRGNJU.js} +966 -351
- package/dist/chunk-6WVRGNJU.js.map +1 -0
- package/dist/{chunk-7VJP2IMS.js → chunk-M264FY2V.js} +492 -36
- package/dist/chunk-M264FY2V.js.map +1 -0
- package/dist/{chunk-TB24VJ4Z.js → chunk-P7ABQEFK.js} +33 -1
- package/dist/{chunk-TB24VJ4Z.js.map → chunk-P7ABQEFK.js.map} +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/http.js +6 -3
- package/dist/http.js.map +1 -1
- package/dist/index.js +15 -14
- package/dist/index.js.map +1 -1
- package/dist/{setup-AJCCLPQP.js → setup-RSGAAKJB.js} +2 -2
- package/dist/{smart-capture-E53YEHHO.js → smart-capture-GH4CXVVX.js} +13 -3
- package/package.json +1 -1
- package/dist/chunk-7VJP2IMS.js.map +0 -1
- package/dist/chunk-XCKGFYDP.js.map +0 -1
- /package/dist/{setup-AJCCLPQP.js.map → setup-RSGAAKJB.js.map} +0 -0
- /package/dist/{smart-capture-E53YEHHO.js.map → smart-capture-GH4CXVVX.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server.ts","../src/tools/knowledge.ts","../src/tools/entries.ts","../src/tools/graph.ts","../src/tools/relations.ts","../src/tools/context.ts","../src/tools/collections.ts","../src/tools/labels.ts","../src/tools/health.ts","../src/tools/session.ts","../src/tools/wrapup.ts","../src/tools/quality.ts","../src/tools/workflows.ts","../src/workflows/definitions.ts","../src/tools/facilitate.ts","../src/tools/facilitate-rubrics.ts","../src/tools/facilitate-validation.ts","../src/tools/facilitate-format.ts","../src/tools/verify.ts","../src/tools/start.ts","../src/presets/collections.ts","../src/tools/planned-work.ts","../src/tools/orient-shared.ts","../src/tools/start-interview.ts","../src/tools/usage.ts","../src/tools/gitchain.ts","../src/tools/maps.ts","../src/tools/architecture.ts","../src/resources/index.ts","../src/prompts/index.ts"],"sourcesContent":["/**\n * McpServer factory — shared between stdio (index.ts) and HTTP (http.ts) entry points.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport { registerKnowledgeTools } from \"./tools/knowledge.js\";\nimport { registerEntriesTools } from \"./tools/entries.js\";\nimport { registerGraphTools } from \"./tools/graph.js\";\nimport { registerRelationsTools } from \"./tools/relations.js\";\nimport { registerContextTools } from \"./tools/context.js\";\nimport { registerCollectionsTools } from \"./tools/collections.js\";\nimport { registerLabelTools } from \"./tools/labels.js\";\nimport { registerHealthTools } from \"./tools/health.js\";\nimport { registerVerifyTools } from \"./tools/verify.js\";\nimport { registerSmartCaptureTools } from \"./tools/smart-capture.js\";\nimport { registerArchitectureTools } from \"./tools/architecture.js\";\nimport { registerWorkflowTools } from \"./tools/workflows.js\";\nimport { registerQualityTools } from \"./tools/quality.js\";\nimport { registerSessionTools } from \"./tools/session.js\";\nimport { registerWrapupTools } from \"./tools/wrapup.js\";\nimport { registerGitChainTools } from \"./tools/gitchain.js\";\nimport { registerMapTools } from \"./tools/maps.js\";\nimport { registerStartTools } from \"./tools/start.js\";\nimport { registerUsageTools } from \"./tools/usage.js\";\nimport { registerFacilitateTools } from \"./tools/facilitate.js\";\nimport { registerResources } from \"./resources/index.js\";\nimport { registerPrompts } from \"./prompts/index.js\";\nimport { initToolSurface } from \"./tool-surface.js\";\n\nexport const SERVER_VERSION = \"0.7.2\";\n\nconst INSTRUCTIONS = [\n \"Product Brain — the single source of truth for product knowledge.\",\n \"Terminology, standards, and core data all live here — no need to check external docs.\",\n \"\",\n \"## About Product Brain (PB)\",\n \"\",\n \"PB is a knowledge management system used by many product teams.\",\n \"These describe how PB works — not your product.\",\n \"\",\n \"### How PB Organizes Its Tools\",\n \"- **Tools** are for actions with side-effects or dynamic computation (capture, commit, search).\",\n \"- **Resources** are for stable, read-only data (orientation, terminology, collection schemas).\",\n \"- **Prompts** are for multi-step choreography (workflows, guided capture, deep dives).\",\n \"- Every tool, resource, and prompt works for ANY workspace — no bespoke logic.\",\n \"- Resource templates (URI params) provide workspace-specific data through generic patterns.\",\n \"- Tool count stays minimal: compound tools with `action` enums over many single-purpose tools.\",\n \"\",\n \"### How PB Handles Your Data\",\n \"- **Draft-first**: all writes create drafts. Nothing reaches SSOT without explicit user confirmation.\",\n \"- **Empty-workspace safe**: every tool and resource handles zero entries, zero collections, and fresh workspaces.\",\n \"- **Advisory, not blocking**: quality scores, contradiction checks, and coaching are informational. They never prevent an operation.\",\n \"- **Workspace-agnostic**: PB is a product used by many teams. No workspace-specific logic in server code.\",\n \"- **Self-documenting**: orient and server instructions teach agents how PB works. Cursor rules supplement but don't replace.\",\n \"\",\n \"## Your Workspace Principles\",\n \"\",\n \"When you orient or start, PB surfaces active entries from your `principles`, `standards`,\",\n \"and `business-rules` collections. These are YOUR team's guardrails — respect them during implementation.\",\n \"If no principles exist yet, PB will tell you and suggest how to add them.\",\n \"\",\n \"The three governance collections:\",\n \"- **Principles** (`principles`) — beliefs that guide decisions. 'We believe X.' You reason from a principle.\",\n \"- **Standards** (`standards`) — conventions about how work is done. 'We do X this way.' You lint for a standard.\",\n \"- **Business Rules** (`business-rules`) — system constraints. 'The system must do X.' You test for a rule.\",\n \"\",\n \"## Workflow\",\n \"\",\n \" 1. Start: call `session action=start` to begin a tracked session.\",\n \" 2. Orient: call `orient` to load workspace context and unlock write tools.\",\n \" 3. Discover: use `entries action=search` to find entries, or `entries action=list` to browse.\",\n \" 4. Drill in: use `entries action=get entryId=\\\"...\\\"` for full details — data, labels, relations, history.\",\n \" 5. Context: use `context action=gather` with an entryId or a task description.\",\n \" 6. Capture: use `capture` to create entries — auto-links and scores in one call.\",\n \" 7. Commit: use `commit-entry` to promote drafts to SSOT — only when the user confirms.\",\n \" 8. Connect: use `graph action=suggest` then `relations action=create` to build the graph.\",\n \" 9. Wrapup: call `session-wrapup` before closing — reviews drafts, coaches quality, suggests links.\",\n \" 10. Close: call `session action=close` when done — records session activity. Auto-nudges if wrapup was skipped.\",\n \"\",\n \"Write tools (capture, update-entry, relations, commit-entry) require:\",\n \" - An active agent session (call session action=start)\",\n \" - Completed orientation (call orient)\",\n \" - A readwrite API key scope\",\n \"\",\n \"Commit-on-confirm: always capture as draft first and show the user what was captured.\",\n \"Only call `commit-entry` when the user explicitly confirms (e.g. 'commit', 'looks good', 'yes').\",\n \"This builds trust — the Chain (main) is SSOT; nothing goes there without user consent.\",\n \"\",\n \"Alignment-first: before proposing or building anything, check orient's Workspace Governance\",\n \"and Active bets sections. These are constraints, not reference material.\",\n \"If the proposal conflicts with a principle, standard, or business rule — stop, flag the conflict,\",\n \"and get explicit user confirmation before proceeding. Do not design around governance.\",\n \"If the work is outside the scope of active bets — stop, name the gap, and ask the user\",\n \"to confirm before designing. Do not propose implementation for out-of-scope work without a go-ahead.\",\n \"\",\n \"Workspace setup: use `collections action=create` and `collections action=update` to shape the workspace\",\n \"structure with the user. Ask what they need to track; presets are starting points, not fixed.\",\n \"\",\n \"Personalization: if you have context about the user from memory (prior work, recent\",\n \"conversations, team context), use it to personalize recommendations. For example,\",\n \"'Based on your recent pitch reviews, the gap most likely to matter is X.'\",\n \"The orient/start output gives you the workspace state; your memory fills in the human context.\",\n].join(\"\\n\");\n\nexport function createProductBrainServer(): McpServer {\n const server = new McpServer(\n { name: \"Product Brain\", version: SERVER_VERSION },\n { capabilities: { logging: {} }, instructions: INSTRUCTIONS },\n );\n\n initToolSurface(server);\n\n const enabledModules = new Set(\n (process.env.PB_MODULES ?? \"core,gitchain,arch\")\n .split(\",\").map((m) => m.trim().toLowerCase()),\n );\n\n registerSessionTools(server);\n registerWrapupTools(server);\n registerEntriesTools(server);\n registerGraphTools(server);\n registerRelationsTools(server);\n registerContextTools(server);\n registerCollectionsTools(server);\n registerKnowledgeTools(server);\n registerLabelTools(server);\n registerHealthTools(server);\n registerVerifyTools(server);\n registerSmartCaptureTools(server);\n registerQualityTools(server);\n registerWorkflowTools(server);\n\n if (enabledModules.has(\"gitchain\")) registerGitChainTools(server);\n if (enabledModules.has(\"gitchain\")) registerMapTools(server);\n if (enabledModules.has(\"arch\")) registerArchitectureTools(server);\n registerStartTools(server);\n registerUsageTools(server);\n registerFacilitateTools(server);\n\n registerResources(server);\n registerPrompts(server);\n\n // All 31 tools visible from connection. Write tools are guarded at handler\n // level (requireWriteAccess checks session + orient + key scope). Hiding\n // tools via disable() broke Claude's lazy tool indexing — it never\n // re-indexed after list_changed notifications.\n\n return server;\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation, getWorkspaceContext, requireWriteAccess, recordSessionActivity, getAgentSessionId } from \"../client.js\";\nimport { formatRubricCoaching } from \"./smart-capture.js\";\nimport { trackQualityVerdict, trackQualityCheck } from \"../analytics.js\";\nimport { extractPreview } from \"./knowledge-helpers.js\";\nimport { trackWriteTool } from \"../tool-surface.js\";\n\ntype WorkflowStatus =\n | 'open' | 'pending' | 'proposed' | 'accepted' | 'needs-amendment'\n | 'withdrawn' | 'review' | 'in-progress' | 'decided' | 'conflict'\n | 'processing' | 'closed';\n\ntype LifecycleStatus = 'draft' | 'active' | 'deprecated' | 'archived';\n\n// Backward-compat shim (BET-68, expires ~2026-09-03)\n// Workflow values passed via `status` are routed to `workflowStatus` with a deprecation warning.\nconst LEGACY_WORKFLOW_STATUSES = new Set<string>([\n 'open', 'pending', 'decided', 'proposed', 'accepted', 'needs-amendment',\n 'withdrawn', 'review', 'in-progress', 'conflict', 'processing', 'closed',\n 'shaped', 'bet', 'building', 'shipped',\n]);\n\nexport const updateEntrySchema = z.object({\n entryId: z.string().describe(\"Entry ID to update, e.g. 'T-SUPPLIER', 'BR-001'\"),\n name: z.string().optional().describe(\"New display name\"),\n status: z.union([\n z.enum(['draft', 'active', 'deprecated', 'archived']),\n z.enum(['open', 'pending', 'decided', 'proposed', 'accepted', 'needs-amendment', 'withdrawn', 'review', 'in-progress', 'conflict', 'processing', 'closed', 'shaped', 'bet', 'building', 'shipped']),\n ]).optional().describe(\"Lifecycle status: draft | active | deprecated | archived. **Workflow values (open, pending, decided…) are deprecated here — use `workflowStatus` instead. Passing a workflow value as `status` will be auto-routed with a warning until 2026-09-03, then hard-errored.**\"),\n workflowStatus: z.enum(['open', 'pending', 'proposed', 'accepted', 'needs-amendment', 'withdrawn', 'review', 'in-progress', 'decided', 'conflict', 'processing', 'closed']).optional().describe(\"Collection workflow state (e.g. 'open', 'pending', 'decided', 'conflict'). Validated against collection's allowed values.\"),\n data: z.record(z.unknown()).optional().describe(\"Fields to update (merged with existing data)\"),\n order: z.number().optional().describe(\"New sort order\"),\n canonicalKey: z.string().optional().describe(\"Semantic type (e.g. 'decision', 'tension'). Only changeable on draft/uncommitted entries.\"),\n autoPublish: z.boolean().optional().default(false).describe(\"Only true when user explicitly asks to publish. Default false = draft. Never auto-publish without user confirmation.\"),\n changeNote: z.string().optional().describe(\"Short human-readable summary for history (e.g. 'Updated description to F1-themed copy'). If omitted, a friendly default is generated from fields changed.\"),\n});\n\nexport const getHistorySchema = z.object({\n entryId: z.string().describe(\"Entry ID, e.g. 'T-SUPPLIER', 'BR-001'\"),\n});\n\nexport const commitEntrySchema = z.object({\n entryId: z.string().describe(\"Entry ID to commit, e.g. 'TEN-abc123', 'GT-019'\"),\n});\n\nexport function registerKnowledgeTools(server: McpServer) {\n\n const updateTool = server.registerTool(\n \"update-entry\",\n {\n title: \"Update Entry\",\n description:\n \"Update an existing entry by its human-readable ID. Only provide the fields you want to change — data fields are merged with existing values. \" +\n \"Creates a draft version by default. **Never use autoPublish=true unless the user explicitly asks to publish** — same rule as commit-entry. \" +\n \"Use entries action=get first to see current values.\",\n inputSchema: updateEntrySchema,\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },\n },\n async ({ entryId, name, status: rawStatus, workflowStatus: rawWorkflowStatus, data, order, canonicalKey, autoPublish, changeNote }) => {\n requireWriteAccess();\n\n // Detect data fields that should be top-level params\n const PROMOTED_FIELDS = ['status', 'workflowStatus', 'name', 'order', 'canonicalKey'] as const;\n const topLevelByField: Record<string, unknown> = { status: rawStatus, workflowStatus: rawWorkflowStatus, name, order, canonicalKey };\n const confusedFields: string[] = [];\n\n if (data) {\n for (const field of PROMOTED_FIELDS) {\n if (field in data && topLevelByField[field] === undefined) {\n confusedFields.push(field);\n }\n }\n }\n\n // Track which updatable fields were actually provided\n const fieldsProvided: string[] = [];\n if (name !== undefined) fieldsProvided.push('name');\n if (rawStatus !== undefined) fieldsProvided.push('status');\n if (rawWorkflowStatus !== undefined) fieldsProvided.push('workflowStatus');\n if (data !== undefined) fieldsProvided.push('data');\n if (order !== undefined) fieldsProvided.push('order');\n if (canonicalKey !== undefined) fieldsProvided.push('canonicalKey');\n\n // Backward-compat shim: route legacy workflow values from `status` → `workflowStatus`\n let status: LifecycleStatus | undefined = rawStatus as LifecycleStatus | undefined;\n let workflowStatus: WorkflowStatus | undefined = rawWorkflowStatus as WorkflowStatus | undefined;\n let deprecationWarning: string | undefined;\n\n if (rawStatus && LEGACY_WORKFLOW_STATUSES.has(rawStatus)) {\n if (!workflowStatus) {\n workflowStatus = rawStatus as WorkflowStatus;\n }\n status = undefined;\n deprecationWarning = `⚠️ Deprecation: \\`status: '${rawStatus}'\\` — use \\`workflowStatus: '${rawStatus}'\\` instead. Support ends ~2026-09-03.`;\n }\n\n const id = await mcpMutation<string>(\"chain.updateEntry\", {\n entryId,\n name,\n status,\n workflowStatus,\n data,\n order,\n canonicalKey,\n autoPublish,\n changeNote,\n changedBy: getAgentSessionId() ? `agent:${getAgentSessionId()}` : undefined,\n });\n\n await recordSessionActivity({ entryModified: id });\n\n const wsCtx = await getWorkspaceContext();\n const updated = await mcpQuery<any>(\"chain.getEntry\", { entryId });\n const entryStatus: LifecycleStatus = (updated?.status ?? 'draft') as LifecycleStatus;\n const versionMode = entryStatus === 'active' ? 'published' : `saved as ${entryStatus}`;\n const responseLines = [\n `# Entry Updated`,\n ``,\n `**${entryId}** — ${versionMode}.`,\n ``,\n `Internal ID: ${id}`,\n `**Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})`,\n ];\n\n if (fieldsProvided.length > 0) {\n responseLines.push(`**Fields provided:** ${fieldsProvided.join(', ')}`);\n } else {\n responseLines.push('');\n responseLines.push('⚠️ No fields to update were provided — only `entryId` was set.');\n }\n\n if (deprecationWarning) {\n responseLines.push('');\n responseLines.push(deprecationWarning);\n }\n\n if (confusedFields.length > 0) {\n responseLines.push('');\n for (const field of confusedFields) {\n responseLines.push(`⚠️ \\`data.${field}\\` detected — did you mean the top-level \\`${field}\\` parameter?`);\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: responseLines.join(\"\\n\") }],\n structuredContent: { entryId: id, versionMode, fieldsProvided, confusedFields },\n };\n }\n );\n trackWriteTool(updateTool);\n\n server.registerTool(\n \"get-history\",\n {\n title: \"Entry Change History\",\n description:\n \"Get the audit trail for an entry — when it was created, updated, status-changed, etc. \" +\n \"Returns timestamped events with change details.\",\n inputSchema: getHistorySchema,\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },\n },\n async ({ entryId }) => {\n const history = await mcpQuery<any[]>(\"chain.listEntryHistory\", { entryId });\n\n if (history.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No history found for \\`${entryId}\\`.` }] };\n }\n\n const formatted = history\n .map((h) => {\n const date = new Date(h.timestamp).toISOString();\n const changes = h.changes ? ` — ${JSON.stringify(h.changes)}` : \"\";\n return `- **${date}** ${h.event}${h.changedBy ? ` _(${h.changedBy})_` : \"\"}${changes}`;\n })\n .join(\"\\n\");\n\n return {\n content: [{ type: \"text\" as const, text: `# History for \\`${entryId}\\` (${history.length} events)\\n\\n${formatted}` }],\n };\n }\n );\n\n const commitTool = server.registerTool(\n \"commit-entry\",\n {\n title: \"Commit Entry to Chain\",\n description:\n \"Promote a draft entry to committed status (SSOT on the Chain). \" +\n \"Runs a keyword contradiction check against governance entries before committing. \" +\n \"Warnings are advisory — they do not block the commit.\\n\\n\" +\n \"Use after capture + graph action=suggest + relations action=create to finalize an entry.\",\n inputSchema: commitEntrySchema,\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },\n },\n async ({ entryId }) => {\n requireWriteAccess();\n\n const { runContradictionCheck } = await import(\"./smart-capture.js\");\n\n const entry = await mcpQuery<any>(\"chain.getEntry\", { entryId });\n if (!entry) {\n return {\n content: [{ type: \"text\" as const, text: `Entry \\`${entryId}\\` not found. Try search to find the right ID.` }],\n };\n }\n\n // Run contradiction check before committing\n const descField = entry.data?.description ?? entry.data?.canonical ?? entry.data?.rationale ?? \"\";\n const warnings = await runContradictionCheck(entry.name, descField);\n\n if (warnings.length > 0) {\n await recordSessionActivity({ contradictionWarning: true });\n }\n\n // Quality coaching: heuristic instant, LLM scheduled in background\n let coachingResult: any = null;\n try {\n coachingResult = await mcpMutation<any>(\"quality.evaluateHeuristicAndSchedule\", {\n entryId,\n context: \"commit\",\n });\n } catch {\n // Quality coaching is advisory — commit proceeds without it\n }\n\n const result = await mcpMutation<any>(\"chain.commitEntry\", {\n entryId,\n author: getAgentSessionId() ? `agent:${getAgentSessionId()}` : undefined,\n sessionId: getAgentSessionId() ?? undefined,\n });\n\n const docId = result?._id ?? entry._id;\n await recordSessionActivity({ entryModified: docId });\n\n const wsCtx = await getWorkspaceContext();\n let lines: string[];\n\n if (result?.status === \"proposal_created\") {\n lines = [\n `# Proposal created: ${result.entryId ?? entryId}`,\n `**${result.name ?? entry.name}** — commit requires consent. A proposal was created instead of committing directly.`,\n `**Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})`,\n \"\",\n result.existing\n ? \"An open proposal for this entry already exists.\"\n : \"Affected owners will be notified. The entry will be committed when the consent window expires with no objections, or when all owners approve.\",\n ];\n } else {\n lines = [\n `# Committed: ${entryId}`,\n `**${entry.name}** promoted to SSOT on the Chain.`,\n `**Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})`,\n ];\n }\n\n if (warnings.length > 0) {\n lines.push(\"\");\n lines.push(\"⚠ Contradiction check: proposed entry matched existing governance entries:\");\n for (const w of warnings) {\n lines.push(`- ${w.name} (${w.collection}, ${w.entryId}) — has 'governs' relation to ${w.governsCount} entries`);\n }\n lines.push(\"Run context action=gather on these entries before committing.\");\n }\n\n // Track commit quality verdict\n if (coachingResult?.verdict) {\n try {\n const v = coachingResult.verdict;\n const failedCount = (v.criteria ?? []).filter((c: any) => !c.passed).length;\n trackQualityVerdict(wsCtx.workspaceId, {\n entry_id: entryId,\n entry_type: v.canonicalKey ?? entry.canonicalKey ?? \"\",\n tier: v.tier,\n context: \"commit\",\n passed: v.passed,\n source: coachingResult.source ?? \"heuristic\",\n criteria_total: v.criteria?.length ?? 0,\n criteria_failed: failedCount,\n llm_scheduled: v.tier !== \"passive\",\n });\n } catch { /* tracking is advisory */ }\n }\n\n // Rubric coaching section (assertive/nudge only — passive verdicts stored but not surfaced)\n if (coachingResult?.verdict && coachingResult.verdict.tier !== \"passive\" && coachingResult.verdict.criteria.length > 0) {\n const coaching = formatRubricCoaching(coachingResult);\n if (coaching) {\n lines.push(\"\");\n lines.push(coaching);\n if (!coachingResult.verdict.passed && coachingResult.verdict.tier === \"assertive\") {\n lines.push(\"\");\n lines.push(\"_This entry was committed despite quality concerns. The override has been recorded._\");\n }\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: coachingResult?.verdict\n ? { qualityVerdict: coachingResult.verdict, source: coachingResult.source ?? \"heuristic\" }\n : undefined,\n };\n }\n );\n trackWriteTool(commitTool);\n\n}\n","/**\n * Entries compound tool — list, get, batch, search.\n * Consolidates list-entries, get-entry, batch-get, search into one tool.\n * BR-72: Compound Tool Standard.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, runWithToolContext } from \"../client.js\";\nimport { extractPreview } from \"./knowledge-helpers.js\";\n\nconst ENTRIES_ACTIONS = [\"list\", \"get\", \"batch\", \"search\"] as const;\ntype EntriesAction = (typeof ENTRIES_ACTIONS)[number];\n\nexport const entriesSchema = z.object({\n action: z.enum(ENTRIES_ACTIONS).describe(\n \"'list': browse entries with filters. 'get': fetch one entry by ID. 'batch': fetch multiple entries. 'search': full-text search.\",\n ),\n entryId: z.string().optional().describe(\"Entry ID for get action, e.g. 'T-SUPPLIER', 'BR-001'\"),\n entryIds: z.array(z.string()).min(1).max(20).optional()\n .describe(\"Entry IDs for batch action, e.g. ['TYPE-strategy', 'STR-jljeg7']\"),\n collection: z.string().optional()\n .describe(\"Collection slug for list/search, e.g. 'glossary', 'tracking-events', 'business-rules'\"),\n status: z.string().optional()\n .describe(\"Filter: draft | active | deprecated | archived\"),\n tag: z.string().optional().describe(\"Filter by internal tag for list\"),\n label: z.string().optional().describe(\"Filter by label slug for list — matches entries across all collections\"),\n query: z.string().optional().describe(\"Search text for search action (min 2 characters)\"),\n});\n\nexport const entriesGetOutputSchema = z.object({\n entryId: z.string(),\n name: z.string(),\n collection: z.string(),\n status: z.string(),\n data: z.record(z.unknown()).optional(),\n relations: z.array(z.object({\n entryId: z.string().optional(),\n name: z.string(),\n type: z.string(),\n direction: z.string(),\n })).optional(),\n labels: z.array(z.string()).optional(),\n});\n\nexport const entriesListOutputSchema = z.object({\n entries: z.array(z.object({\n entryId: z.string(),\n name: z.string(),\n collection: z.string(),\n status: z.string(),\n })),\n total: z.number(),\n});\n\nexport const entriesSearchOutputSchema = z.object({\n results: z.array(z.object({\n entryId: z.string(),\n name: z.string(),\n collection: z.string(),\n status: z.string(),\n score: z.number().optional(),\n })),\n total: z.number(),\n query: z.string(),\n});\n\nexport const entriesBatchOutputSchema = z.object({\n entries: z.array(z.object({\n entryId: z.string(),\n name: z.string(),\n collection: z.string(),\n status: z.string(),\n data: z.record(z.unknown()).optional(),\n })),\n total: z.number(),\n});\n\nexport function registerEntriesTools(server: McpServer): void {\n server.registerTool(\n \"entries\",\n {\n title: \"Entries\",\n description:\n \"Read entries from the Chain. One tool for all entry reading.\\n\\n\" +\n \"- **list**: Browse entries with optional filters (collection, status, tag, label). Use collections action=list first to discover slugs.\\n\" +\n \"- **get**: Fetch a single entry by ID — full record with data, labels, relations, history.\\n\" +\n \"- **batch**: Fetch multiple entries (max 20) in one call. Same shape as get per entry.\\n\" +\n \"- **search**: Full-text search across entries. Scope by collection or filter by status.\\n\\n\" +\n \"Use `entries action=get entryId=\\\"...\\\"` to fetch one. Use `entries action=search query=\\\"...\\\"` to discover.\",\n inputSchema: entriesSchema,\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },\n _meta: { ui: { resourceUri: \"ui://entries/entry-cards.html\" } },\n },\n async (args) => {\n const parsed = entriesSchema.safeParse(args);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \");\n return { content: [{ type: \"text\" as const, text: `Invalid arguments: ${issues}` }] };\n }\n\n const { action, entryId, entryIds, collection, status, tag, label, query } = parsed.data;\n\n return runWithToolContext({ tool: \"entries\", action }, async () => {\n if (action === \"get\") {\n if (!entryId) {\n return { content: [{ type: \"text\" as const, text: \"`entryId` is required when action is 'get'.\" }] };\n }\n return handleGet(entryId);\n }\n\n if (action === \"batch\") {\n if (!entryIds || entryIds.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"`entryIds` is required when action is 'batch'.\" }] };\n }\n return handleBatch(entryIds);\n }\n\n if (action === \"search\") {\n if (!query || query.length < 2) {\n return { content: [{ type: \"text\" as const, text: \"`query` is required for search (min 2 characters).\" }] };\n }\n return handleSearch(server, query, collection, status);\n }\n\n if (action === \"list\") {\n return handleList(collection, status, tag, label);\n }\n\n return {\n content: [{\n type: \"text\" as const,\n text: `Unknown action '${action}'. Valid actions: ${ENTRIES_ACTIONS.join(\", \")}.`,\n }],\n };\n });\n },\n );\n}\n\nasync function handleGet(entryId: string) {\n const entry = await mcpQuery<unknown>(\"chain.getEntry\", { entryId });\n\n if (!entry) {\n return { content: [{ type: \"text\" as const, text: `Entry \\`${entryId}\\` not found. Try search to find the right ID.` }] };\n }\n\n const e = entry as Record<string, unknown>;\n const lines: string[] = [\n `## Get Result`,\n \"\",\n `# ${e.entryId ? `${e.entryId}: ` : \"\"}${e.name}`,\n \"\",\n `**Status:** ${e.status}${e.workflowStatus ? ` / ${e.workflowStatus}` : \"\"}`,\n `**Type:** ${e.canonicalKey ?? \"untyped\"}`,\n ];\n\n if (e.data && typeof e.data === \"object\") {\n lines.push(\"\");\n for (const [key, val] of Object.entries(e.data as Record<string, unknown>)) {\n const display = typeof val === \"string\" ? val : JSON.stringify(val);\n lines.push(`**${key}:** ${display}`);\n }\n }\n\n if (Array.isArray(e.tags) && e.tags.length > 0) {\n lines.push(\"\", `**Tags:** ${(e.tags as string[]).join(\", \")}`);\n }\n\n if (Array.isArray(e.labels) && (e.labels as unknown[]).length > 0) {\n const labels = e.labels as { slug?: string; name?: string }[];\n lines.push(\"\", `**Labels:** ${labels.map((l) => `\\`${l.slug ?? l.name}\\``).join(\", \")}`);\n }\n\n if (Array.isArray(e.relations) && (e.relations as unknown[]).length > 0) {\n lines.push(\"\", \"## Relations\");\n for (const r of e.relations as { direction?: string; type?: string; otherEntryId?: string; otherName?: string }[]) {\n const arrow = r.direction === \"outgoing\" ? \"\\u2192\" : \"\\u2190\";\n const other = r.otherEntryId ? `${r.otherEntryId}: ${r.otherName}` : (r.otherName ?? \"unknown\");\n lines.push(`- ${arrow} **${r.type}** ${other}`);\n }\n }\n\n if (Array.isArray(e.history) && (e.history as unknown[]).length > 0) {\n lines.push(\"\", \"## History (last 10)\");\n for (const h of (e.history as { timestamp: string; event: string; changedBy?: string }[]).slice(-10)) {\n const date = new Date(h.timestamp).toISOString().split(\"T\")[0];\n lines.push(`- ${date}: ${h.event}${h.changedBy ? ` _(${h.changedBy})_` : \"\"}`);\n }\n }\n\n const structuredContent = {\n entryId: String(e.entryId ?? \"\"),\n name: String(e.name ?? \"\"),\n collection: String(e.canonicalKey ?? \"\"),\n status: String(e.status ?? \"\"),\n ...(e.workflowStatus ? { workflowStatus: String(e.workflowStatus) } : {}),\n entries: [{ entryId: e.entryId, name: e.name, status: e.status, ...(e.workflowStatus ? { workflowStatus: e.workflowStatus } : {}), collectionName: String((e as { collectionName?: string }).collectionName ?? e.canonicalKey ?? \"—\") }],\n ...(e.data && typeof e.data === \"object\" ? { data: e.data as Record<string, unknown> } : {}),\n ...(Array.isArray(e.relations) && (e.relations as unknown[]).length > 0\n ? {\n relations: (e.relations as { direction?: string; type?: string; otherEntryId?: string; otherName?: string }[]).map((r) => ({\n ...(r.otherEntryId ? { entryId: r.otherEntryId } : {}),\n name: r.otherName ?? \"unknown\",\n type: r.type ?? \"unknown\",\n direction: r.direction ?? \"unknown\",\n })),\n }\n : {}),\n ...(Array.isArray(e.labels) && (e.labels as unknown[]).length > 0\n ? { labels: (e.labels as { slug?: string; name?: string }[]).map((l) => l.slug ?? l.name ?? \"\") }\n : {}),\n };\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent,\n };\n}\n\nasync function handleBatch(entryIds: string[]) {\n const results = await mcpQuery<Array<{ entry?: unknown; error?: string }>>(\"chain.batchGetEntries\", { entryIds });\n\n const lines: string[] = [`## Batch Result`, \"\", `# Batch Get (${results.length} requested)`, \"\"];\n\n for (let i = 0; i < results.length; i++) {\n const r = results[i];\n const requestedId = entryIds[i];\n if (r.error) {\n lines.push(`## ${requestedId}\\n\\n**Error:** ${r.error}\\n`);\n continue;\n }\n const entry = r.entry as Record<string, unknown>;\n lines.push(`## ${entry.entryId ? `${entry.entryId}: ` : \"\"}${entry.name}`);\n lines.push(\"\");\n lines.push(`**Status:** ${entry.status}${entry.workflowStatus ? ` / ${entry.workflowStatus}` : \"\"}`);\n lines.push(`**Type:** ${entry.canonicalKey ?? \"untyped\"}`);\n\n if (entry.data && typeof entry.data === \"object\") {\n lines.push(\"\");\n for (const [key, val] of Object.entries(entry.data as Record<string, unknown>)) {\n const display = typeof val === \"string\" ? val : JSON.stringify(val);\n lines.push(`**${key}:** ${display}`);\n }\n }\n\n if (Array.isArray(entry.tags) && entry.tags.length > 0) {\n lines.push(\"\", `**Tags:** ${(entry.tags as string[]).join(\", \")}`);\n }\n\n if (Array.isArray(entry.labels) && (entry.labels as unknown[]).length > 0) {\n const labels = entry.labels as { slug?: string; name?: string }[];\n lines.push(\"\", `**Labels:** ${labels.map((l) => `\\`${l.slug ?? l.name}\\``).join(\", \")}`);\n }\n\n if (Array.isArray(entry.relations) && (entry.relations as unknown[]).length > 0) {\n lines.push(\"\", \"**Relations:**\");\n for (const rel of entry.relations as { direction?: string; type?: string; otherEntryId?: string; otherName?: string }[]) {\n const dir = rel.direction === \"outgoing\" ? \"→\" : \"←\";\n const other = rel.otherEntryId ?? rel.otherName ?? \"?\";\n lines.push(`- ${dir} [${rel.type}] ${other}`);\n }\n }\n\n if (Array.isArray(entry.history) && (entry.history as unknown[]).length > 0) {\n lines.push(\"\", \"**History (last 5):**\");\n for (const h of (entry.history as { timestamp: string; event: string }[]).slice(-5)) {\n const date = new Date(h.timestamp).toISOString().split(\"T\")[0];\n lines.push(`- ${date}: ${h.event}`);\n }\n }\n\n lines.push(\"\");\n }\n\n const structuredEntries = results\n .filter((r) => !r.error && r.entry)\n .map((r) => {\n const entry = r.entry as Record<string, unknown>;\n return {\n entryId: String(entry.entryId ?? \"\"),\n name: String(entry.name ?? \"\"),\n collection: String(entry.canonicalKey ?? \"\"),\n status: String(entry.status ?? \"\"),\n ...(entry.workflowStatus ? { workflowStatus: String(entry.workflowStatus) } : {}),\n ...(entry.data && typeof entry.data === \"object\" ? { data: entry.data as Record<string, unknown> } : {}),\n };\n });\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: { entries: structuredEntries, total: structuredEntries.length },\n };\n}\n\nasync function handleList(collection?: string, status?: string, tag?: string, label?: string) {\n let entries: unknown[];\n\n if (label) {\n entries = await mcpQuery<unknown[]>(\"chain.listEntriesByLabel\", { labelSlug: label });\n if (status) {\n entries = (entries as { status?: string }[]).filter((e) => e.status === status);\n }\n } else {\n entries = await mcpQuery<unknown[]>(\"chain.listEntries\", {\n collectionSlug: collection,\n status,\n tag,\n });\n }\n\n if (entries.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"No entries match the given filters.\" }] };\n }\n\n const formatted = (entries as { entryId?: string; name?: string; status?: string; workflowStatus?: string; data?: unknown }[])\n .map((e) => {\n const id = e.entryId ? `**${e.entryId}:** ` : \"\";\n const statusDisplay = e.workflowStatus ? `${e.status} / ${e.workflowStatus}` : e.status;\n const dataPreview = e.data\n ? Object.entries(e.data as Record<string, unknown>)\n .slice(0, 4)\n .map(([k, v]) => ` ${k}: ${typeof v === \"string\" ? v.substring(0, 120) : JSON.stringify(v)}`)\n .join(\"\\n\")\n : \"\";\n return `- ${id}${e.name} \\`${statusDisplay}\\`${dataPreview ? `\\n${dataPreview}` : \"\"}`;\n })\n .join(\"\\n\\n\");\n\n const scope = collection ? ` in \\`${collection}\\`` : \"\";\n\n const structuredEntries = (entries as { entryId?: string; name?: string; status?: string; workflowStatus?: string; canonicalKey?: string }[]).map((e) => ({\n entryId: String(e.entryId ?? \"\"),\n name: String(e.name ?? \"\"),\n collection: String(e.canonicalKey ?? collection ?? \"\"),\n status: String(e.status ?? \"\"),\n ...(e.workflowStatus ? { workflowStatus: e.workflowStatus } : {}),\n }));\n\n return {\n content: [{ type: \"text\" as const, text: `## List Result\\n\\n# Entries${scope} (${entries.length})\\n\\n${formatted}` }],\n structuredContent: { entries: structuredEntries, total: structuredEntries.length },\n };\n}\n\nasync function handleSearch(\n server: McpServer,\n query: string,\n collection?: string,\n status?: string,\n) {\n const scope = collection ? ` in \\`${collection}\\`` : \"\";\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Searching${scope} for \"${query}\"...`,\n logger: \"product-os\",\n });\n\n const [results, collections] = await Promise.all([\n mcpQuery<unknown[]>(\"chain.searchEntries\", { query, collectionSlug: collection, status }),\n mcpQuery<unknown[]>(\"chain.listCollections\"),\n ]);\n\n if (results.length === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: `No results for \"${query}\"${scope}. Try a broader search or use \\`collections action=list\\` to see available data.`,\n }],\n };\n }\n\n const collMap = new Map<string, { name: string; slug: string }>();\n for (const c of collections as { _id: string; name: string; slug: string }[]) {\n collMap.set(c._id, { name: c.name, slug: c.slug });\n }\n\n const countsBySlug = new Map<string, number>();\n for (const e of results as { collectionId: string }[]) {\n const col = collMap.get(e.collectionId);\n const slug = col?.slug ?? \"unknown\";\n countsBySlug.set(slug, (countsBySlug.get(slug) ?? 0) + 1);\n }\n const collSummary = [...countsBySlug.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([slug, count]) => `${count} ${slug}`)\n .join(\", \");\n\n const formatted = (results as {\n entryId?: string;\n name?: string;\n status?: string;\n workflowStatus?: string;\n collectionId?: string;\n canonicalKey?: string;\n data?: unknown;\n }[])\n .map((e) => {\n const id = e.entryId ? `**${e.entryId}:** ` : \"\";\n const statusDisplay = e.workflowStatus ? `${e.status} / ${e.workflowStatus}` : e.status;\n const col = collMap.get(e.collectionId ?? \"\");\n const colTag = col ? ` [${col.slug}]` : \"\";\n const typeTag = e.canonicalKey ? ` (${e.canonicalKey})` : \"\";\n const desc = extractPreview(e.data, 150);\n const preview = desc ? `\\n ${desc}` : \"\";\n return `- ${id}${e.name} \\`${statusDisplay}\\`${colTag}${typeTag}${preview}`;\n })\n .join(\"\\n\");\n\n const header = `## Search Result\\n\\n# Search Results for \"${query}\"${scope} (${results.length} match${results.length === 1 ? \"\" : \"es\"})\\n\\n**By collection:** ${collSummary}`;\n const footer = `_Tip: Use \\`collection\\` param to scope search. Use entries action=get with an entry ID for full details._`;\n\n const structuredResults = (results as {\n entryId?: string;\n name?: string;\n status?: string;\n workflowStatus?: string;\n collectionId?: string;\n score?: number;\n }[]).map((e) => ({\n entryId: String(e.entryId ?? \"\"),\n name: String(e.name ?? \"\"),\n collection: collMap.get(e.collectionId ?? \"\")?.slug ?? \"unknown\",\n status: String(e.status ?? \"\"),\n ...(e.workflowStatus ? { workflowStatus: e.workflowStatus } : {}),\n ...(e.score != null ? { score: e.score } : {}),\n }));\n\n const entriesForView = structuredResults.map((e) => ({\n entryId: e.entryId,\n name: e.name,\n status: e.status,\n collectionName: e.collection,\n }));\n\n return {\n content: [{ type: \"text\" as const, text: `${header}\\n\\n${formatted}\\n\\n${footer}` }],\n structuredContent: {\n results: structuredResults,\n entries: entriesForView,\n total: structuredResults.length,\n query,\n },\n };\n}\n","/**\n * Graph compound tool — find, suggest.\n * Consolidates find-related and suggest-links into one read-only tool.\n * find: traverses relations from a specific entry (graph walk). NOT full-text search — use entries action=search.\n * suggest: recommends new relations (link discovery).\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, runWithToolContext } from \"../client.js\";\n\nconst GRAPH_ACTIONS = [\"find\", \"suggest\"] as const;\n\nexport const graphSchema = z.object({\n action: z.enum(GRAPH_ACTIONS).describe(\n \"'find': traverse relations from an entry (graph walk). 'suggest': discover potential connections for an entry.\",\n ),\n entryId: z.string().describe(\"Entry ID, e.g. 'GT-019', 'FEAT-001'\"),\n direction: z.enum([\"incoming\", \"outgoing\", \"both\"]).default(\"both\").optional()\n .describe(\"For find: 'incoming' = what references this, 'outgoing' = what this references\"),\n limit: z.number().min(1).max(20).default(10).optional()\n .describe(\"For suggest: max suggestions to return\"),\n depth: z.number().min(1).max(3).default(2).optional()\n .describe(\"For suggest: graph traversal depth\"),\n});\n\nexport const graphFindOutputSchema = z.object({\n entryId: z.string(),\n relations: z.array(z.object({\n entryId: z.string().optional(),\n name: z.string(),\n type: z.string(),\n direction: z.enum([\"outgoing\", \"incoming\"]),\n })),\n total: z.number(),\n});\n\nexport const graphSuggestOutputSchema = z.object({\n entryId: z.string(),\n suggestions: z.array(z.object({\n targetEntryId: z.string().optional(),\n targetName: z.string(),\n relationType: z.string(),\n direction: z.string(),\n confidence: z.number(),\n reason: z.string(),\n })),\n total: z.number(),\n});\n\nexport function registerGraphTools(server: McpServer): void {\n server.registerTool(\n \"graph\",\n {\n title: \"Graph\",\n description:\n \"Read from the knowledge graph. Two actions:\\n\\n\" +\n \"- **find**: Traverse relations from a specific entry — shows incoming/outgoing connections. \" +\n \"Use after entries action=get to explore connections. This is NOT full-text search (use entries action=search).\\n\" +\n \"- **suggest**: Discover potential relations for an entry using graph-aware intelligence. \" +\n \"Returns ranked suggestions with confidence scores. Use relations action=create or relations action=batch-create to create the ones that make sense.\",\n inputSchema: graphSchema,\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },\n _meta: { ui: { resourceUri: \"ui://graph/constellation.html\" } },\n },\n async (args) => {\n const parsed = graphSchema.safeParse(args);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \");\n return { content: [{ type: \"text\" as const, text: `Invalid arguments: ${issues}` }] };\n }\n\n const { action, entryId, direction, limit, depth } = parsed.data;\n\n return runWithToolContext({ tool: \"graph\", action }, async () => {\n if (action === \"find\") {\n return handleFind(entryId, direction ?? \"both\");\n }\n\n if (action === \"suggest\") {\n return handleSuggest(entryId, limit ?? 10, depth ?? 2);\n }\n\n return {\n content: [{\n type: \"text\" as const,\n text: `Unknown action '${action}'. Valid actions: ${GRAPH_ACTIONS.join(\", \")}.`,\n }],\n };\n });\n },\n );\n}\n\nasync function handleFind(entryId: string, direction: \"incoming\" | \"outgoing\" | \"both\") {\n const relations = await mcpQuery<Array<{ fromId: string; toId: string; type: string }>>(\"chain.listEntryRelations\", { entryId });\n\n if (relations.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No relations found for \\`${entryId}\\`. Use relations action=create to create connections.` }] };\n }\n\n const sourceEntry = await mcpQuery<{ _id: string; name: string } | null>(\"chain.getEntry\", { entryId });\n if (!sourceEntry) {\n return { content: [{ type: \"text\" as const, text: `Entry \\`${entryId}\\` not found. Try entries action=search to find the right ID.` }] };\n }\n const sourceInternalId = sourceEntry._id;\n\n const MAX_RELATIONS = 25;\n const truncated = relations.length > MAX_RELATIONS;\n const capped = relations.slice(0, MAX_RELATIONS);\n\n const otherIds = new Set<string>();\n for (const r of capped) {\n const otherId = r.fromId === sourceInternalId ? r.toId : r.fromId;\n otherIds.add(otherId);\n }\n\n const otherEntries = new Map<string, { entryId?: string; name: string; collectionId: string }>();\n for (const id of otherIds) {\n const entry = await mcpQuery<{ _id: string; entryId?: string; name: string; collectionId: string } | null>(\"chain.getEntry\", { id });\n if (entry) {\n otherEntries.set(entry._id, { entryId: entry.entryId, name: entry.name, collectionId: entry.collectionId });\n }\n }\n\n const collections = await mcpQuery<Array<{ _id: string; slug: string }>>(\"chain.listCollections\");\n const collMap = new Map<string, string>();\n for (const c of collections) collMap.set(c._id, c.slug);\n\n const lines: string[] = [`## Find Result`, \"\", `# Relations for ${entryId}: ${sourceEntry.name}`, \"\"];\n\n const enriched = capped.map((r) => {\n const isOutgoing = r.fromId === sourceInternalId;\n const otherId = isOutgoing ? r.toId : r.fromId;\n const other = otherEntries.get(otherId);\n const otherLabel = other?.entryId ? `${other.entryId}: ${other.name}` : (other?.name ?? \"(deleted)\");\n const colSlug = other ? (collMap.get(other.collectionId) ?? \"unknown\") : \"unknown\";\n return { isOutgoing, type: r.type, otherLabel, colSlug, otherEntryId: other?.entryId, otherName: other?.name ?? \"(deleted)\" };\n });\n\n const outgoing = enriched.filter((r) => r.isOutgoing);\n const incoming = enriched.filter((r) => !r.isOutgoing);\n\n if ((direction === \"outgoing\" || direction === \"both\") && outgoing.length > 0) {\n lines.push(`## Outgoing (${outgoing.length})`);\n for (const r of outgoing) {\n lines.push(`- → **${r.type}** ${r.otherLabel} [${r.colSlug}]`);\n }\n lines.push(\"\");\n }\n\n if ((direction === \"incoming\" || direction === \"both\") && incoming.length > 0) {\n lines.push(`## Incoming (${incoming.length})`);\n for (const r of incoming) {\n lines.push(`- ← **${r.type}** ${r.otherLabel} [${r.colSlug}]`);\n }\n lines.push(\"\");\n }\n\n const shown = direction === \"outgoing\" ? outgoing : direction === \"incoming\" ? incoming : enriched;\n if (shown.length === 0) {\n lines.push(`No ${direction} relations found for \\`${entryId}\\`.`);\n }\n\n if (truncated) {\n lines.push(`_Showing first ${MAX_RELATIONS} of ${relations.length} relations. Use entries action=get for the full picture._`);\n }\n\n const structuredRelations = shown.map((r) => ({\n entryId: r.otherEntryId,\n name: r.otherName,\n type: r.type,\n direction: (r.isOutgoing ? \"outgoing\" : \"incoming\") as \"outgoing\" | \"incoming\",\n }));\n\n const nodes = [\n { id: entryId, name: sourceEntry.name, collectionName: \"\" },\n ...shown.map((r) => ({\n id: r.otherEntryId ?? String(Math.random()),\n name: r.otherName,\n collectionName: r.colSlug,\n })),\n ];\n const edges = shown\n .filter((r) => r.otherEntryId)\n .map((r) => ({\n source: entryId,\n target: r.otherEntryId!,\n type: r.type,\n }));\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: {\n entryId,\n relations: structuredRelations,\n nodes,\n edges,\n total: relations.length,\n },\n };\n}\n\nasync function handleSuggest(entryId: string, limit: number, depth: number) {\n const result = await mcpQuery<{\n resolvedEntry?: { entryId?: string; name: string };\n suggestions?: Array<{\n entryId?: string;\n name: string;\n collectionSlug: string;\n score: number;\n recommendedRelationType: string;\n reasoning: string;\n preview?: string;\n graphDistance: number;\n }>;\n }>(\"chain.graphSuggestLinks\", {\n entryId,\n maxHops: depth,\n limit,\n });\n\n if (!result?.suggestions || result.suggestions.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No suggestions found for \\`${entryId}\\` — it may already be well-connected, or no similar entries exist.` }] };\n }\n\n const resolved = result.resolvedEntry;\n const resolvedLabel = resolved\n ? `\\`${resolved.entryId ?? resolved.name}\\` (${resolved.name})`\n : `\\`${entryId}\\``;\n\n const suggestions = result.suggestions;\n const graphCount = suggestions.filter((s) => s.graphDistance > 0).length;\n const textCount = suggestions.filter((s) => s.graphDistance === -1).length;\n const sourceId = resolved?.entryId ?? entryId;\n\n const lines = [\n `## Suggest Result`,\n \"\",\n `# Link Suggestions for ${resolvedLabel}`,\n `_${suggestions.length} potential connections (${graphCount} via graph, ${textCount} via text similarity)._`,\n \"\",\n ];\n\n const top3 = suggestions.slice(0, 3);\n lines.push(\"## Quick Wins (top 3)\");\n const batchArgs: string[] = [];\n for (const s of top3) {\n const tid = s.entryId ?? \"(no ID)\";\n const relType = s.recommendedRelationType || \"related_to\";\n lines.push(`- **${tid}**: ${s.name} [${s.collectionSlug}] — ${s.score}/100 → \\`${relType}\\``);\n if (s.entryId) batchArgs.push(`{from:\"${sourceId}\",to:\"${tid}\",type:\"${relType}\"}`);\n }\n lines.push(\"\");\n if (batchArgs.length > 0) {\n lines.push(`**Link all 3:** \\`relations action=batch-create relations=[${batchArgs.join(\",\")}]\\``);\n lines.push(\"\");\n }\n\n if (suggestions.length > 3) {\n lines.push(\"## All Suggestions\");\n for (let i = 0; i < suggestions.length; i++) {\n const s = suggestions[i];\n const scoreBar = \"█\".repeat(Math.round(s.score / 10)) + \"░\".repeat(10 - Math.round(s.score / 10));\n const hopLabel = s.graphDistance > 0 ? `${s.graphDistance}-hop` : \"text\";\n const recType = s.recommendedRelationType !== \"related_to\" ? ` → \\`${s.recommendedRelationType}\\`` : \"\";\n lines.push(`${i + 1}. **${s.entryId ?? \"(no ID)\"}**: ${s.name} [${s.collectionSlug}] (${hopLabel})`);\n lines.push(` ${scoreBar} ${s.score}/100${recType}`);\n if (s.preview) lines.push(` ${s.preview}`);\n lines.push(` _${s.reasoning}_`);\n }\n }\n\n lines.push(\"\");\n lines.push(`**To link one:** \\`relations action=create from=\"${sourceId}\" to=\"{target_id}\" type=\"{type}\"\\``);\n lines.push(`**To dismiss:** \\`relations action=dismiss from=\"${sourceId}\" to=\"{target_id}\" type=\"{type}\"\\``);\n\n const structuredSuggestions = suggestions.map((s) => ({\n targetEntryId: s.entryId,\n targetName: s.name,\n relationType: s.recommendedRelationType || \"related_to\",\n direction: \"outgoing\" as const,\n confidence: s.score,\n reason: s.reasoning,\n }));\n\n const nodes = [\n { id: sourceId, name: resolved?.name ?? entryId, collectionName: \"\" },\n ...suggestions.map((s) => ({\n id: s.entryId ?? String(Math.random()),\n name: s.name,\n collectionName: s.collectionSlug,\n })),\n ];\n const edges = suggestions\n .filter((s) => s.entryId)\n .map((s) => ({\n source: sourceId,\n target: s.entryId!,\n type: s.recommendedRelationType || \"suggested\",\n }));\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: {\n entryId: sourceId,\n suggestions: structuredSuggestions,\n nodes,\n edges,\n total: suggestions.length,\n },\n };\n}\n","/**\n * Relations compound tool — create, batch-create, dismiss.\n * Consolidates relate-entries, batch-relate, dismiss-suggestion into one write tool.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation, getWorkspaceContext, requireWriteAccess, recordSessionActivity, runWithToolContext } from \"../client.js\";\nimport { trackWriteTool } from \"../tool-surface.js\";\n\nconst RELATIONS_ACTIONS = [\"create\", \"batch-create\", \"dismiss\"] as const;\n\nexport const relationsSchema = z.object({\n action: z.enum(RELATIONS_ACTIONS).describe(\n \"'create': link two entries. 'batch-create': create multiple relations. 'dismiss': record that a suggestion was not relevant.\",\n ),\n from: z.string().optional().describe(\"Source entry ID for create/dismiss\"),\n to: z.string().optional().describe(\"Target entry ID for create/dismiss\"),\n type: z.string().optional().describe(\"Relation type for create/dismiss\"),\n score: z.number().optional().describe(\"Suggestion score from graph action=suggest (for dismiss)\"),\n relations: z.array(z.object({\n from: z.string(),\n to: z.string(),\n type: z.string(),\n })).min(1).max(20).optional().describe(\"Array of relations for batch-create\"),\n});\n\nexport function registerRelationsTools(server: McpServer): void {\n const tool = server.registerTool(\n \"relations\",\n {\n title: \"Relations\",\n description:\n \"Create or manage relations between entries. Write tool — requires active session.\\n\\n\" +\n \"- **create**: Link two entries with a typed relation. Use graph action=suggest to discover connections.\\n\" +\n \"- **batch-create**: Create multiple relations in one call. Use after graph action=suggest.\\n\" +\n \"- **dismiss**: Record that a suggested link was not relevant. Improves future suggestion quality.\",\n inputSchema: relationsSchema,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n },\n async (args) => {\n const parsed = relationsSchema.safeParse(args);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \");\n return { content: [{ type: \"text\" as const, text: `Invalid arguments: ${issues}` }] };\n }\n\n const { action, from, to, type, score, relations } = parsed.data;\n\n return runWithToolContext({ tool: \"relations\", action }, async () => {\n if (action === \"create\") {\n if (!from || !to || !type) {\n return { content: [{ type: \"text\" as const, text: \"`from`, `to`, and `type` are required when action is 'create'.\" }] };\n }\n return handleCreate(from, to, type, score);\n }\n\n if (action === \"batch-create\") {\n if (!relations || relations.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"`relations` is required when action is 'batch-create'.\" }] };\n }\n return handleBatchCreate(relations);\n }\n\n if (action === \"dismiss\") {\n if (!from || !to) {\n return { content: [{ type: \"text\" as const, text: \"`from` and `to` are required when action is 'dismiss'.\" }] };\n }\n return handleDismiss(from, to, type ?? \"related_to\", score);\n }\n\n return {\n content: [{\n type: \"text\" as const,\n text: `Unknown action '${action}'. Valid actions: ${RELATIONS_ACTIONS.join(\", \")}.`,\n }],\n };\n });\n },\n );\n trackWriteTool(tool);\n}\n\nasync function handleCreate(from: string, to: string, type: string, score?: number) {\n requireWriteAccess();\n\n const result = await mcpMutation<{ status?: string; proposalId?: string; existing?: boolean; fromEntryId?: string; toEntryId?: string; message?: string }>(\"chain.createEntryRelation\", {\n fromEntryId: from,\n toEntryId: to,\n type,\n suggestionScore: score ?? undefined,\n });\n\n await recordSessionActivity({ relationCreated: result?.status !== \"proposal_created\" });\n\n const wsCtx = await getWorkspaceContext();\n if (result?.status === \"proposal_created\") {\n const existingNote = result.existing ? \" (existing proposal reused)\" : \"\";\n return {\n content: [{\n type: \"text\" as const,\n text: `# Proposal Created — Governs Relation\\n\\n**${result.fromEntryId ?? from}** —[${type}]→ **${result.toEntryId ?? to}**\\n\\n${result.message ?? \"Governs relation requires async consent. A proposal was created for review.\"}\\n\\n**Proposal ID:** \\`${result.proposalId}\\`${existingNote}\\n**Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})\\n\\nThe relation was **not applied** — it will be created when the proposal is approved.`,\n }],\n };\n }\n return {\n content: [{ type: \"text\" as const, text: `# Relation Created\\n\\n**${from}** —[${type}]→ **${to}**\\n**Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})` }],\n };\n}\n\nasync function handleBatchCreate(relations: Array<{ from: string; to: string; type: string }>) {\n requireWriteAccess();\n\n type RelResult = { from: string; to: string; type: string; ok: boolean; error?: string; proposalCreated?: boolean; proposalId?: string };\n const results: RelResult[] = [];\n\n for (const rel of relations) {\n try {\n const result = await mcpMutation<{ status?: string; proposalId?: string }>(\"chain.createEntryRelation\", {\n fromEntryId: rel.from,\n toEntryId: rel.to,\n type: rel.type,\n });\n results.push({\n ...rel,\n ok: true,\n proposalCreated: result?.status === \"proposal_created\",\n proposalId: result?.proposalId,\n });\n } catch (e: unknown) {\n results.push({ ...rel, ok: false, error: e instanceof Error ? e.message : \"Unknown error\" });\n }\n }\n\n const created = results.filter((r) => r.ok && !r.proposalCreated);\n const proposals = results.filter((r) => r.ok && r.proposalCreated);\n const failed = results.filter((r) => !r.ok);\n\n for (let i = 0; i < created.length; i++) {\n await recordSessionActivity({ relationCreated: true });\n }\n\n const lines = [`# Batch Link Results\\n`];\n lines.push(`**${created.length}** created, **${proposals.length}** proposals, **${failed.length}** failed out of ${relations.length} total.\\n`);\n\n if (created.length > 0) {\n lines.push(\"## Created\");\n for (const r of created) {\n lines.push(`- **${r.from}** —[${r.type}]→ **${r.to}**`);\n }\n }\n\n if (proposals.length > 0) {\n lines.push(\"\");\n lines.push(\"## Proposals (governs — not yet applied)\");\n for (const r of proposals) {\n lines.push(`- **${r.from}** —[${r.type}]→ **${r.to}** — proposal \\`${r.proposalId}\\``);\n }\n }\n\n if (failed.length > 0) {\n lines.push(\"\");\n lines.push(\"## Failed\");\n for (const r of failed) {\n lines.push(`- **${r.from}** → **${r.to}** (${r.type}): _${r.error}_`);\n }\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n}\n\nasync function handleDismiss(from: string, to: string, type: string, score?: number) {\n requireWriteAccess();\n\n const fromEntry = await mcpQuery<{ _id: string } | null>(\"chain.getEntry\", { entryId: from });\n if (!fromEntry) {\n return { content: [{ type: \"text\" as const, text: `Entry \\`${from}\\` not found.` }] };\n }\n const toEntry = await mcpQuery<{ _id: string } | null>(\"chain.getEntry\", { entryId: to });\n if (!toEntry) {\n return { content: [{ type: \"text\" as const, text: `Entry \\`${to}\\` not found.` }] };\n }\n\n await mcpMutation(\"chain.dismissSuggestion\", {\n fromEntryId: fromEntry._id,\n suggestedEntryId: toEntry._id,\n recommendedType: type,\n score: score ?? 0,\n });\n\n return {\n content: [{\n type: \"text\" as const,\n text: `Dismissed suggestion: ${from} → ${to} (${type}). Feedback recorded for scoring improvements.`,\n }],\n };\n}\n","/**\n * Context compound tool — gather, build.\n * Consolidates gather-context and get-build-context into one tool.\n * gather: entry-based graph traversal, task-based auto-load, or graph mode with provenance.\n * build: structured build spec for an entry (requires active session).\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, requireActiveSession, runWithToolContext } from \"../client.js\";\nimport { translateStaleToolNames } from \"./knowledge-helpers.js\";\n\nfunction annotateStaleNames(text: string): string {\n const footnote = translateStaleToolNames(text);\n return footnote ? text + footnote : text;\n}\n\ninterface ContextEntry {\n entryId?: string;\n name: string;\n collectionName: string;\n relationType: string;\n relationDirection: \"outgoing\" | \"incoming\";\n hop: number;\n score?: number;\n scoreFlags?: string[];\n preview?: string;\n provenance?: Array<{ entryId?: string; name: string; relationType: string }>;\n}\n\ninterface GatherResult {\n root: { entryId: string; name: string } | null;\n related: ContextEntry[];\n totalRelations: number;\n hopsTraversed: number;\n}\n\ninterface GraphGatherResult {\n root: { entryId: string; name: string } | null;\n context: ContextEntry[];\n totalFound: number;\n hopsTraversed: number;\n}\n\ninterface TaskGatherResult {\n context: ContextEntry[];\n totalFound: number;\n confidence: string;\n seeds?: Array<{ entryId?: string; name: string }>;\n}\n\ninterface JourneyStage {\n slotId: string;\n label: string;\n ingredients: Array<{ entryId: string; name: string; status: string }>;\n}\n\ninterface JourneyGatherResult {\n map: { entryId: string; name: string; templateId: string; templateName: string };\n stages: JourneyStage[];\n context: ContextEntry[];\n totalFound: number;\n seedCount: number;\n truncated: boolean;\n}\n\ninterface BuildResult {\n entry: { name: string; entryId?: string; collectionSlug: string; status: string; data: Record<string, unknown> };\n relatedByCollection: Record<string, Array<{ entryId?: string; name: string; relationType: string }>>;\n businessRules: Array<{ entryId?: string; name: string; description?: string }>;\n glossaryTerms: Array<{ entryId?: string; name: string; definition?: string }>;\n rulesToHonor: unknown[];\n chainRefs: string[];\n contextTruncated: boolean;\n}\n\nconst CONTEXT_ACTIONS = [\"gather\", \"build\"] as const;\n\nexport const contextSchema = z.object({\n action: z.enum(CONTEXT_ACTIONS).describe(\n \"'gather': assemble knowledge context (entry graph, task auto-load, journey mode, or graph mode). 'build': structured build spec for an entry.\",\n ),\n entryId: z.string().optional().describe(\"Entry ID for graph traversal or build, e.g. 'FEAT-001', 'GT-019'\"),\n mapEntryId: z.string().optional().describe(\n \"Journey map entry ID for journey-aware context (gather only). Returns context organised by journey stage. \" +\n \"Takes precedence over entryId when both are supplied. Example: 'MAP-1'.\",\n ),\n task: z.string().optional().describe(\"Natural-language task description for auto-loading relevant context (gather only)\"),\n mode: z.enum([\"search\", \"graph\"]).default(\"search\").optional()\n .describe(\"For gather: 'search' (default) or 'graph' (enhanced with provenance paths). Ignored when mapEntryId is provided.\"),\n maxHops: z.number().min(1).max(3).default(2)\n .describe(\"Relation traversal depth (1=direct only, 2=default, 3=wide net)\"),\n maxResults: z.number().min(1).max(25).default(10).optional()\n .describe(\"Max entries to return in gather task mode (default 10)\"),\n});\n\nexport function registerContextTools(server: McpServer): void {\n server.registerTool(\n \"context\",\n {\n title: \"Context\",\n description:\n \"Assemble knowledge context in one call. Two actions:\\n\\n\" +\n \"- **gather**: Three modes — (1) By entry: traverse the graph around a specific entry. \" +\n \"(2) By task: auto-load relevant domain knowledge for a natural-language task. \" +\n \"(3) Graph mode (entryId + mode='graph'): enhanced traversal with provenance paths.\\n\" +\n \"- **build**: Structured build spec for any entry — data, related entries, business rules, \" +\n \"glossary terms, chain refs. Use when starting a build. Requires active session.\",\n inputSchema: contextSchema,\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },\n _meta: { ui: { resourceUri: \"ui://graph/constellation.html\" } },\n },\n async (args) => {\n const parsed = contextSchema.safeParse(args);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \");\n return { content: [{ type: \"text\" as const, text: `Invalid arguments: ${issues}` }] };\n }\n\n const { action, entryId, mapEntryId, task, mode, maxHops, maxResults } = parsed.data;\n\n return runWithToolContext({ tool: \"context\", action }, async () => {\n if (action === \"gather\") {\n // Journey mode takes precedence over entryId when mapEntryId is supplied\n if (mapEntryId) {\n return handleJourneyGather(server, mapEntryId, maxHops ?? 2, maxResults ?? 20);\n }\n return handleGather(server, entryId, task, mode ?? \"search\", maxHops ?? 2, maxResults ?? 10);\n }\n\n if (action === \"build\") {\n if (!entryId) {\n return { content: [{ type: \"text\" as const, text: \"`entryId` is required when action is 'build'.\" }] };\n }\n return handleBuild(server, entryId, maxHops ?? 2);\n }\n\n return {\n content: [{\n type: \"text\" as const,\n text: `Unknown action '${action}'. Valid actions: ${CONTEXT_ACTIONS.join(\", \")}.`,\n }],\n };\n });\n },\n );\n}\n\nasync function handleGather(\n server: McpServer,\n entryId: string | undefined,\n task: string | undefined,\n mode: \"search\" | \"graph\",\n maxHops: number,\n maxResults: number,\n) {\n if (!entryId && !task) {\n return { content: [{ type: \"text\" as const, text: \"Provide either `entryId` (graph traversal) or `task` (auto-load context for a task).\" }] };\n }\n\n // Graph mode: enhanced traversal with provenance paths\n if (entryId && mode === \"graph\") {\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Graph traversal for ${entryId} (depth: ${maxHops})...`,\n logger: \"product-brain\",\n });\n\n const result = await mcpQuery<GraphGatherResult>(\"chain.graphGatherContext\", {\n entryId,\n maxHops,\n });\n\n if (!result?.root) {\n return { content: [{ type: \"text\" as const, text: `Entry \\`${entryId}\\` not found. Try search to find the right ID.` }] };\n }\n\n if (result.context.length === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# Context for ${result.root.entryId}: ${result.root.name}\\n\\n` +\n `_No relations found._ This entry is not yet connected to the knowledge graph.\\n\\n` +\n `Use \\`graph action=suggest\\` to discover potential connections.`,\n }],\n };\n }\n\n const byCollection = new Map<string, ContextEntry[]>();\n for (const entry of result.context) {\n const key = entry.collectionName;\n if (!byCollection.has(key)) byCollection.set(key, []);\n byCollection.get(key)!.push(entry);\n }\n\n const lines: string[] = [\n `# Context for ${result.root.entryId}: ${result.root.name} (graph mode)`,\n `_${result.totalFound} related entries across ${byCollection.size} collections (${result.hopsTraversed} hops)_`,\n \"\",\n ];\n\n for (const [collName, entries] of byCollection) {\n lines.push(`## ${collName} (${entries.length})`);\n for (const e of entries) {\n const arrow = e.relationDirection === \"outgoing\" ? \"→\" : \"←\";\n const id = e.entryId ? `${e.entryId}: ` : \"\";\n const hopLabel = e.hop > 1 ? ` (hop ${e.hop})` : \"\";\n const scoreLabel = typeof e.score === \"number\" ? ` ${e.score}` : \"\";\n const flagsLabel = e.scoreFlags?.length ? ` [${e.scoreFlags.join(\", \")}]` : \"\";\n const provenancePath = e.provenance && e.provenance.length > 1\n ? `\\n _Path: ${e.provenance.map((p) => `${p.entryId ?? p.name} [${p.relationType}]`).join(\" → \")}_`\n : \"\";\n const preview = e.preview ? `\\n ${e.preview.substring(0, 120)}` : \"\";\n lines.push(`- ${arrow} **${e.relationType}** ${id}${e.name}${hopLabel}${scoreLabel}${flagsLabel}${provenancePath}${preview}`);\n }\n lines.push(\"\");\n }\n\n const rootId = result.root.entryId ?? \"root\";\n const nodes = [\n { id: rootId, name: result.root.name, collectionName: \"\" },\n ...result.context.map((e) => ({\n id: e.entryId ?? String(Math.random()),\n name: e.name,\n collectionName: e.collectionName,\n })),\n ];\n const edges = result.context\n .filter((e) => e.entryId)\n .map((e) => ({\n source: rootId,\n target: e.entryId!,\n type: e.relationType,\n }));\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: { nodes, edges },\n };\n }\n\n // Task mode: unified search-then-traverse via intelligence layer\n if (task && !entryId) {\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Loading context for task: \"${task.substring(0, 80)}...\"`,\n logger: \"product-brain\",\n });\n\n const result = await mcpQuery<TaskGatherResult>(\"chain.taskAwareGatherContext\", {\n task,\n maxHops,\n maxResults,\n });\n\n if (!result || result.totalFound === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# Context Loaded\\n\\n**Confidence:** None\\n\\n` +\n `No context found for this task. The chain may not cover this area yet.\\n\\n` +\n `_Consider capturing domain knowledge discovered during this task via \\`capture\\`._`,\n }],\n };\n }\n\n const byCollection = new Map<string, ContextEntry[]>();\n for (const entry of result.context) {\n const key = entry.collectionName;\n if (!byCollection.has(key)) byCollection.set(key, []);\n byCollection.get(key)!.push(entry);\n }\n\n const lines: string[] = [\n `# Context Loaded`,\n `**Confidence:** ${result.confidence.charAt(0).toUpperCase() + result.confidence.slice(1)}`,\n `**Matched:** ${result.totalFound} entries across ${byCollection.size} collection${byCollection.size === 1 ? \"\" : \"s\"}`,\n `**Seeds:** ${result.seeds?.map((s) => s.entryId ?? s.name).join(\", \") ?? \"none\"}`,\n \"\",\n ];\n\n for (const [collName, entries] of byCollection) {\n lines.push(`### ${collName} (${entries.length})`);\n for (const e of entries) {\n const arrow = e.relationDirection === \"outgoing\" ? \"→\" : \"←\";\n const id = e.entryId ? `**${e.entryId}:** ` : \"\";\n const scoreLabel = typeof e.score === \"number\" ? ` ${e.score}` : \"\";\n const flagsLabel = e.scoreFlags?.length ? ` [${e.scoreFlags.join(\", \")}]` : \"\";\n const hopLabel = e.hop > 0 ? ` _(hop ${e.hop}, ${arrow} ${e.relationType})_` : \"\";\n lines.push(`- ${id}${e.name}${scoreLabel}${flagsLabel}${hopLabel}`);\n }\n lines.push(\"\");\n }\n\n lines.push(`_Use \\`entries action=get\\` for full details on any entry._`);\n\n const taskEntries = result.context.map((e) => ({\n entryId: e.entryId ?? String(Math.random()),\n name: e.name,\n collectionName: e.collectionName,\n }));\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: { entries: taskEntries },\n };\n }\n\n // Entry mode: traverse the knowledge graph around a specific entry\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Gathering context for ${entryId} (depth: ${maxHops})...`,\n logger: \"product-brain\",\n });\n\n const result = await mcpQuery<GatherResult>(\"chain.gatherContext\", { entryId, maxHops });\n\n if (!result?.root) {\n return { content: [{ type: \"text\" as const, text: `Entry \\`${entryId}\\` not found. Try search to find the right ID.` }] };\n }\n\n if (result.related.length === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# Context for ${result.root.entryId}: ${result.root.name}\\n\\n` +\n `_No relations found._ This entry is not yet connected to the knowledge graph.\\n\\n` +\n `Use \\`graph action=suggest\\` to discover potential connections, or \\`relations action=create\\` to link manually.`,\n }],\n };\n }\n\n const byCollection = new Map<string, typeof result.related>();\n for (const entry of result.related) {\n const key = entry.collectionName;\n if (!byCollection.has(key)) byCollection.set(key, []);\n byCollection.get(key)!.push(entry);\n }\n\n const lines: string[] = [\n `# Context for ${result.root.entryId}: ${result.root.name}`,\n `_${result.totalRelations} related entries across ${byCollection.size} collections (${result.hopsTraversed} hops traversed)_`,\n \"\",\n ];\n\n for (const [collName, entries] of byCollection) {\n lines.push(`## ${collName} (${entries.length})`);\n for (const e of entries) {\n const arrow = e.relationDirection === \"outgoing\" ? \"\\u2192\" : \"\\u2190\";\n const hopLabel = e.hop > 1 ? ` (hop ${e.hop})` : \"\";\n const id = e.entryId ? `${e.entryId}: ` : \"\";\n lines.push(`- ${arrow} **${e.relationType}** ${id}${e.name}${hopLabel}`);\n }\n lines.push(\"\");\n }\n\n const rootId = result.root.entryId ?? \"root\";\n const nodes = [\n { id: rootId, name: result.root.name, collectionName: \"\" },\n ...result.related.map((e) => ({\n id: e.entryId ?? String(Math.random()),\n name: e.name,\n collectionName: e.collectionName,\n })),\n ];\n const edges = result.related\n .filter((e) => e.entryId)\n .map((e) => ({\n source: rootId,\n target: e.entryId!,\n type: e.relationType,\n }));\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: { nodes, edges },\n };\n}\n\nasync function handleJourneyGather(\n server: McpServer,\n mapEntryId: string,\n maxHops: number,\n maxResults: number,\n) {\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Loading journey context for map ${mapEntryId}...`,\n logger: \"product-brain\",\n });\n\n const result = await mcpQuery<JourneyGatherResult | null>(\"chain.journeyAwareGatherContext\", {\n mapEntryId,\n maxHops,\n maxResults,\n });\n\n if (!result) {\n return { content: [{ type: \"text\" as const, text: `Journey map \\`${mapEntryId}\\` not found or has no slot data. Verify the map entry ID.` }] };\n }\n\n if (result.stages.length === 0 || result.seedCount === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# Journey Context: ${result.map.name}\\n\\n` +\n `_No ingredients found in this journey map._\\n\\n` +\n `Add journey steps via MCP: \\`map-slot action=add mapEntryId=\"${mapEntryId}\" slotId=\"...\" ingredientEntryId=\"...\"\\``,\n }],\n };\n }\n\n const lines: string[] = [\n `# Journey Context: ${result.map.name}`,\n `**Template:** ${result.map.templateName} | **Map ID:** ${result.map.entryId}`,\n `**Steps scanned:** ${result.seedCount}${result.truncated ? ` (capped at 10 — ${result.stages.flatMap((s) => s.ingredients).length} total ingredients)` : \"\"}`,\n `**Related knowledge:** ${result.totalFound} entries`,\n \"\",\n \"## Journey Stages\",\n ];\n\n for (const stage of result.stages) {\n const ingredientList = stage.ingredients.length === 0\n ? \"_empty_\"\n : stage.ingredients.map((i) => `${i.entryId}: ${i.name}`).join(\", \");\n lines.push(`- **${stage.label}**: ${ingredientList}`);\n }\n\n if (result.context.length > 0) {\n lines.push(\"\");\n lines.push(\"## Governance & Intelligence\");\n lines.push(`_Entries from the knowledge graph connected to journey steps:_`);\n lines.push(\"\");\n\n const byCollection = new Map<string, ContextEntry[]>();\n for (const entry of result.context) {\n const key = entry.collectionName;\n if (!byCollection.has(key)) byCollection.set(key, []);\n byCollection.get(key)!.push(entry);\n }\n\n for (const [collName, entries] of byCollection) {\n lines.push(`### ${collName} (${entries.length})`);\n for (const e of entries) {\n const arrow = e.relationDirection === \"outgoing\" ? \"→\" : \"←\";\n const id = e.entryId ? `**${e.entryId}:** ` : \"\";\n const scoreLabel = typeof e.score === \"number\" ? ` ${e.score}` : \"\";\n lines.push(`- ${arrow} ${id}${e.name}${scoreLabel}`);\n }\n lines.push(\"\");\n }\n }\n\n lines.push(`_Use \\`entries action=get\\` for full details. Link governance to steps: \\`relations action=create\\`._`);\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: {\n map: result.map,\n stages: result.stages,\n context: result.context.map((e) => ({\n entryId: e.entryId ?? \"\",\n name: e.name,\n collectionName: e.collectionName,\n })),\n },\n };\n}\n\nasync function handleBuild(server: McpServer, entryId: string, maxHops: number) {\n requireActiveSession();\n\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Assembling build context for ${entryId}...`,\n logger: \"product-brain\",\n });\n\n const result = await mcpQuery<BuildResult>(\"chain.assembleBuildContext\", {\n entryId,\n maxHops,\n });\n\n const { entry, relatedByCollection, businessRules, glossaryTerms, chainRefs, contextTruncated } = result;\n\n const lines: string[] = [\n `# Build Context: ${entry.name}`,\n `**Entry:** ${entry.entryId ?? entry.name} [${entry.collectionSlug}]`,\n `**Status:** ${entry.status}`,\n \"\",\n ];\n\n if (Object.keys(entry.data).length > 0) {\n lines.push(\"## Entry Data\");\n for (const [key, val] of Object.entries(entry.data)) {\n const str = typeof val === \"string\" ? val : JSON.stringify(val);\n if (str.length > 200) {\n lines.push(`- **${key}:** ${str.slice(0, 200)}...`);\n } else {\n lines.push(`- **${key}:** ${str}`);\n }\n }\n lines.push(\"\");\n }\n\n if (businessRules.length > 0) {\n lines.push(\"## Business Rules to Honor\");\n for (const r of businessRules) {\n const id = r.entryId ?? r.name;\n lines.push(`- **${id}:** ${r.name}`);\n if (r.description) lines.push(` ${r.description.slice(0, 150)}${r.description.length > 150 ? \"...\" : \"\"}`);\n }\n lines.push(\"\");\n }\n\n if (glossaryTerms.length > 0) {\n lines.push(\"## Glossary Terms\");\n for (const t of glossaryTerms.slice(0, 15)) {\n const id = t.entryId ?? t.name;\n lines.push(`- **${id}:** ${t.name}`);\n if (t.definition) lines.push(` ${t.definition.slice(0, 120)}${t.definition.length > 120 ? \"...\" : \"\"}`);\n }\n if (glossaryTerms.length > 15) lines.push(` _...and ${glossaryTerms.length - 15} more_`);\n lines.push(\"\");\n }\n\n const relatedCount = Object.values(relatedByCollection).reduce((sum, arr) => sum + arr.length, 0);\n if (relatedCount > 0) {\n lines.push(\"## Related Entries\");\n for (const [coll, entries] of Object.entries(relatedByCollection)) {\n lines.push(`### ${coll} (${entries.length})`);\n for (const e of entries.slice(0, 5)) {\n lines.push(`- ${e.entryId ?? e.name}: ${e.name} [${e.relationType}]`);\n }\n if (entries.length > 5) lines.push(` _...and ${entries.length - 5} more_`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"## Chain Refs to Consult\");\n lines.push(chainRefs.slice(0, 15).map((r: string) => `- ${r}`).join(\"\\n\"));\n\n if (contextTruncated) {\n lines.push(\"\");\n lines.push(\"_Context was truncated (limits: 50 related, 20 rules, 30 glossary). Use entries action=get for full details._\");\n }\n\n return { content: [{ type: \"text\" as const, text: annotateStaleNames(lines.join(\"\\n\")) }] };\n}\n","/**\n * Collections compound tool — list, create, update.\n * Consolidates list-collections, create-collection, update-collection into one tool.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation, requireWriteAccess, getAgentSessionId, runWithToolContext } from \"../client.js\";\nimport { trackWriteTool } from \"../tool-surface.js\";\n\ninterface CollectionField {\n key: string;\n type: string;\n required?: boolean;\n searchable?: boolean;\n}\n\ninterface CollectionRecord {\n slug: string;\n name: string;\n description?: string;\n purpose?: string;\n navGroup?: string;\n icon?: string;\n fields: CollectionField[];\n}\n\nconst COLLECTIONS_ACTIONS = [\"list\", \"create\", \"update\"] as const;\n\nconst fieldSchema = z.object({\n key: z.string().describe(\"Field key, e.g. 'description', 'severity', 'status'\"),\n label: z.string().describe(\"Display label, e.g. 'Description', 'Severity'\"),\n type: z.string().describe(\"Field type: 'string', 'select', 'array', 'number', 'boolean'\"),\n required: z.boolean().optional().describe(\"Whether this field is required\"),\n options: z.array(z.string()).optional().describe(\"Options for 'select' type fields\"),\n searchable: z.boolean().optional().describe(\"Whether this field is included in full-text search\"),\n});\n\nexport const collectionsSchema = z.object({\n action: z.enum(COLLECTIONS_ACTIONS).describe(\n \"'list': browse all collections. 'create': create a new collection. 'update': update an existing collection.\",\n ),\n slug: z.string().optional().describe(\"URL-safe identifier for create/update, e.g. 'glossary', 'tech-debt'\"),\n name: z.string().optional().describe(\"Display name for create, or new name for update\"),\n description: z.string().optional().describe(\"What this collection is for\"),\n purpose: z.string().optional().describe(\"Why this collection exists — strategic reason\"),\n icon: z.string().optional().describe(\"Emoji icon for the collection\"),\n navGroup: z.enum([\"daily\", \"strategic\", \"governance\", \"reference\", \"collections\"]).optional()\n .describe(\"Sidebar placement: 'daily', 'strategic', 'governance', 'reference', 'collections'\"),\n fields: z.array(fieldSchema).optional()\n .describe(\"Field definitions for create, or replacement schema for update (replaces all fields)\"),\n});\n\nexport function registerCollectionsTools(server: McpServer): void {\n const tool = server.registerTool(\n \"collections\",\n {\n title: \"Collections\",\n description:\n \"Manage knowledge collections. Three actions:\\n\\n\" +\n \"- **list**: Browse all collections — glossary, business rules, tracking events, etc. \" +\n \"Returns slug, name, description, and field schema. Use before capture to see what exists.\\n\" +\n \"- **create**: Create a new collection. Provide slug, name, and field schema. \" +\n \"Use when setting up a workspace or tracking a new type of knowledge.\\n\" +\n \"- **update**: Update an existing collection's name, description, purpose, icon, navGroup, or fields. \" +\n \"Only provide the fields you want to change.\",\n inputSchema: collectionsSchema,\n annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: false },\n },\n async (args) => {\n const parsed = collectionsSchema.safeParse(args);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \");\n return { content: [{ type: \"text\" as const, text: `Invalid arguments: ${issues}` }] };\n }\n\n const { action, slug, name, description, purpose, icon, navGroup, fields } = parsed.data;\n\n return runWithToolContext({ tool: \"collections\", action }, async () => {\n if (action === \"list\") {\n return handleList();\n }\n\n if (action === \"create\") {\n if (!slug || !name || !fields || fields.length === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"`slug`, `name`, and `fields` are required when action is 'create'.\",\n }],\n };\n }\n return handleCreate(slug, name, description, purpose, icon, navGroup ?? \"collections\", fields);\n }\n\n if (action === \"update\") {\n if (!slug) {\n return { content: [{ type: \"text\" as const, text: \"`slug` is required when action is 'update'.\" }] };\n }\n if (!name && !description && !purpose && !icon && !navGroup && !fields) {\n return { content: [{ type: \"text\" as const, text: \"Provide at least one field to update (name, description, purpose, icon, navGroup, or fields).\" }] };\n }\n return handleUpdate(slug, name, description, purpose, icon, navGroup, fields);\n }\n\n return {\n content: [{\n type: \"text\" as const,\n text: `Unknown action '${action}'. Valid actions: ${COLLECTIONS_ACTIONS.join(\", \")}.`,\n }],\n };\n });\n },\n );\n trackWriteTool(tool);\n}\n\nasync function handleList() {\n const collections = await mcpQuery<CollectionRecord[]>(\"chain.listCollections\");\n\n if (collections.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"No collections found in this workspace.\" }] };\n }\n\n const formatted = collections\n .map((c) => {\n const fieldList = c.fields\n .map((f) => ` - \\`${f.key}\\` (${f.type}${f.required ? \", required\" : \"\"}${f.searchable ? \", searchable\" : \"\"})`)\n .join(\"\\n\");\n const meta = [\n c.description || \"_No description_\",\n c.purpose ? `**Purpose:** ${c.purpose}` : null,\n c.navGroup ? `**Nav group:** ${c.navGroup}` : null,\n ].filter(Boolean).join(\"\\n\");\n return `## ${c.name} (\\`${c.slug}\\`)\\n${meta}\\n\\n**Fields:**\\n${fieldList}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\n return {\n content: [{ type: \"text\" as const, text: `# Knowledge Collections (${collections.length})\\n\\n${formatted}` }],\n };\n}\n\nasync function handleCreate(\n slug: string,\n name: string,\n description: string | undefined,\n purpose: string | undefined,\n icon: string | undefined,\n navGroup: string,\n fields: z.infer<typeof fieldSchema>[],\n) {\n requireWriteAccess();\n\n try {\n await mcpMutation(\"chain.createCollection\", {\n slug,\n name,\n description,\n purpose,\n icon,\n navGroup,\n fields,\n createdBy: getAgentSessionId() ? `agent:${getAgentSessionId()}` : \"mcp\",\n });\n\n const fieldList = fields\n .map((f) => ` - \\`${f.key}\\` (${f.type}${f.required ? \", required\" : \"\"}${f.searchable ? \", searchable\" : \"\"})`)\n .join(\"\\n\");\n\n return {\n content: [{\n type: \"text\" as const,\n text: `# Collection Created: ${name}\\n\\n` +\n `**Slug:** \\`${slug}\\`\\n` +\n (description ? `**Description:** ${description}\\n` : \"\") +\n (purpose ? `**Purpose:** ${purpose}\\n` : \"\") +\n `**Nav group:** ${navGroup}\\n` +\n `\\n**Fields:**\\n${fieldList}\\n\\n` +\n `You can now capture entries: \\`capture collection=\"${slug}\" name=\"...\" description=\"...\"\\``,\n }],\n };\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes(\"already exists\")) {\n return {\n content: [{\n type: \"text\" as const,\n text: `Collection \\`${slug}\\` already exists. Use \\`collections action=update slug=\"${slug}\"\\` to modify it, or choose a different slug.`,\n }],\n };\n }\n throw error;\n }\n}\n\nasync function handleUpdate(\n slug: string,\n name: string | undefined,\n description: string | undefined,\n purpose: string | undefined,\n icon: string | undefined,\n navGroup: string | undefined,\n fields: z.infer<typeof fieldSchema>[] | undefined,\n) {\n requireWriteAccess();\n\n await mcpMutation(\"chain.updateCollection\", {\n slug,\n ...(name !== undefined && { name }),\n ...(description !== undefined && { description }),\n ...(purpose !== undefined && { purpose }),\n ...(icon !== undefined && { icon }),\n ...(navGroup !== undefined && { navGroup }),\n ...(fields !== undefined && { fields }),\n });\n\n const changes = [name && \"name\", description && \"description\", purpose && \"purpose\", icon && \"icon\", navGroup && \"navGroup\", fields && \"fields\"]\n .filter(Boolean).join(\", \");\n\n return {\n content: [{\n type: \"text\" as const,\n text: `# Collection Updated: \\`${slug}\\`\\n\\nChanged: ${changes || \"no changes\"}.\\n\\n` +\n `Use \\`collections action=list\\` to verify the result.`,\n }],\n };\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation } from \"../client.js\";\nimport { trackWriteTool } from \"../tool-surface.js\";\n\nexport const labelsSchema = z.object({\n action: z.enum([\"list\", \"create\", \"update\", \"delete\", \"apply\", \"remove\"])\n .describe(\"Action: list all labels, create/update/delete a label, or apply/remove a label on an entry\"),\n slug: z.string().optional().describe(\"Label slug (required for create/update/delete/apply/remove)\"),\n name: z.string().optional().describe(\"Display name (required for create)\"),\n color: z.string().optional().describe(\"Hex color, e.g. '#ef4444'\"),\n description: z.string().optional().describe(\"What this label means\"),\n parentSlug: z.string().optional().describe(\"Parent group slug for label hierarchy\"),\n isGroup: z.boolean().optional().describe(\"True if this is a group container, not a taggable label\"),\n order: z.number().optional().describe(\"Sort order within its group\"),\n entryId: z.string().optional().describe(\"Entry ID for apply/remove actions\"),\n});\n\nexport function registerLabelTools(server: McpServer) {\n\n const tool = server.registerTool(\n \"labels\",\n {\n title: \"Labels\",\n description:\n \"Manage workspace labels — list, create, update, delete, apply to entries, or remove from entries. \" +\n \"Labels can be applied to any entry across any collection for cross-domain filtering. \" +\n \"Similar to labels in Linear or GitHub. Labels support hierarchy (groups with children).\",\n inputSchema: labelsSchema,\n annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: false },\n },\n async ({ action, slug, name, color, description, parentSlug, isGroup, order, entryId }) => {\n if (action === \"list\") {\n const labels = await mcpQuery<any[]>(\"chain.listLabels\");\n\n if (labels.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"No labels defined in this workspace yet.\" }] };\n }\n\n const groups = labels.filter((l) => l.isGroup);\n const ungrouped = labels.filter((l) => !l.isGroup && !l.parentId);\n const children = (parentId: string) => labels.filter((l) => l.parentId === parentId);\n\n const lines: string[] = [\"# Workspace Labels\"];\n\n for (const group of groups) {\n lines.push(`\\n## ${group.name}`);\n if (group.description) lines.push(`_${group.description}_`);\n for (const child of children(group._id)) {\n const c = child.color ? ` ${child.color}` : \"\";\n lines.push(` - \\`${child.slug}\\` ${child.name}${c}`);\n }\n }\n\n if (ungrouped.length > 0) {\n lines.push(\"\\n## Ungrouped\");\n for (const label of ungrouped) {\n const c = label.color ? ` ${label.color}` : \"\";\n lines.push(`- \\`${label.slug}\\` ${label.name}${c}${label.description ? ` — _${label.description}_` : \"\"}`);\n }\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n\n if (!slug) {\n return { content: [{ type: \"text\" as const, text: \"A `slug` is required for this action.\" }] };\n }\n\n if (action === \"create\") {\n if (!name) {\n return { content: [{ type: \"text\" as const, text: \"Cannot create a label without a name.\" }] };\n }\n\n let parentId: string | undefined;\n if (parentSlug) {\n const labels = await mcpQuery<any[]>(\"chain.listLabels\");\n const parent = labels.find((l: any) => l.slug === parentSlug);\n if (!parent) {\n return { content: [{ type: \"text\" as const, text: `Parent label \\`${parentSlug}\\` not found. Use \\`labels action=list\\` to see available groups.` }] };\n }\n parentId = parent._id;\n }\n\n await mcpMutation(\"chain.createLabel\", { slug, name, color, description, parentId, isGroup, order });\n return { content: [{ type: \"text\" as const, text: `# Label Created\\n\\n**${name}** (\\`${slug}\\`)` }] };\n }\n\n if (action === \"update\") {\n await mcpMutation(\"chain.updateLabel\", { slug, name, color, description, isGroup, order });\n return { content: [{ type: \"text\" as const, text: `# Label Updated\\n\\n\\`${slug}\\` has been updated.` }] };\n }\n\n if (action === \"delete\") {\n await mcpMutation(\"chain.deleteLabel\", { slug });\n return { content: [{ type: \"text\" as const, text: `# Label Deleted\\n\\n\\`${slug}\\` removed from all entries and deleted.` }] };\n }\n\n if (action === \"apply\" || action === \"remove\") {\n if (!entryId) {\n return { content: [{ type: \"text\" as const, text: \"An `entryId` is required for apply/remove actions.\" }] };\n }\n\n if (action === \"apply\") {\n await mcpMutation(\"chain.applyLabel\", { entryId, labelSlug: slug });\n return { content: [{ type: \"text\" as const, text: `Label \\`${slug}\\` applied to **${entryId}**.` }] };\n }\n\n await mcpMutation(\"chain.removeLabel\", { entryId, labelSlug: slug });\n return { content: [{ type: \"text\" as const, text: `Label \\`${slug}\\` removed from **${entryId}**.` }] };\n }\n\n return { content: [{ type: \"text\" as const, text: \"Unknown action.\" }] };\n }\n );\n trackWriteTool(tool);\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation, mcpCall, getWorkspaceId, getWorkspaceContext, getAuditLog, getAgentSessionId, setSessionOriented, getApiKeyScope, isSessionOriented, runWithToolContext, type AuditEntry } from \"../client.js\";\nimport { entriesSchema } from \"./entries.js\";\nimport { relationsSchema } from \"./relations.js\";\nimport { graphSchema } from \"./graph.js\";\nimport { contextSchema } from \"./context.js\";\nimport { collectionsSchema } from \"./collections.js\";\nimport { sessionSchema } from \"./session.js\";\nimport { qualitySchema } from \"./quality.js\";\nimport { workflowsSchema } from \"./workflows.js\";\nimport { wrapupSchema } from \"./wrapup.js\";\nimport { facilitateSchema } from \"./facilitate.js\";\nimport { labelsSchema } from \"./labels.js\";\nimport { verifySchema } from \"./verify.js\";\nimport { captureSchema, batchCaptureSchema } from \"./smart-capture.js\";\nimport { updateEntrySchema, getHistorySchema, commitEntrySchema } from \"./knowledge.js\";\nimport { startSchema } from \"./start.js\";\nimport { usageSummarySchema } from \"./usage.js\";\nimport { chainSchema, chainVersionSchema, chainBranchSchema, chainReviewSchema } from \"./gitchain.js\";\nimport { createAudienceMapSetSchema, mapSchema, mapSlotSchema, mapVersionSchema, mapSuggestSchema } from \"./maps.js\";\nimport { architectureSchema, architectureAdminSchema } from \"./architecture.js\";\nimport { queryPlannedWork, hasPlannedWork, buildPlannedWorkSection, formatRecoveryBlock } from \"./planned-work.js\";\nimport { runAlignmentCheck, buildAlignmentCheckLines, buildOperatingProtocol } from \"./orient-shared.js\";\n\ntype CallCategory = \"read\" | \"search\" | \"write\" | \"label\" | \"meta\";\n\nconst CALL_CATEGORIES: Record<string, CallCategory> = {\n \"chain.getEntry\": \"read\",\n \"chain.batchGetEntries\": \"read\",\n \"chain.listEntries\": \"read\",\n \"chain.listEntryHistory\": \"read\",\n \"chain.listEntryRelations\": \"read\",\n \"chain.listEntriesByLabel\": \"read\",\n \"chain.searchEntries\": \"search\",\n \"chain.createEntry\": \"write\",\n \"chain.updateEntry\": \"write\",\n \"chain.createEntryRelation\": \"write\",\n \"chain.applyLabel\": \"label\",\n \"chain.removeLabel\": \"label\",\n \"chain.createLabel\": \"label\",\n \"chain.updateLabel\": \"label\",\n \"chain.deleteLabel\": \"label\",\n \"chain.createCollection\": \"write\",\n \"chain.updateCollection\": \"write\",\n \"chain.listCollections\": \"meta\",\n \"chain.getCollection\": \"meta\",\n \"chain.listLabels\": \"meta\",\n \"resolveWorkspace\": \"meta\",\n};\n\nfunction categorize(fn: string): CallCategory {\n return CALL_CATEGORIES[fn] ?? \"meta\";\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`;\n const mins = Math.floor(ms / 60_000);\n const secs = Math.round((ms % 60_000) / 1000);\n return `${mins}m ${secs}s`;\n}\n\nfunction buildSessionSummary(log: readonly AuditEntry[]): string {\n if (log.length === 0) return \"\";\n\n const byCategory = new Map<CallCategory, Map<string, number>>();\n let errorCount = 0;\n let writeCreates = 0;\n let writeUpdates = 0;\n\n for (const entry of log) {\n const cat = categorize(entry.fn);\n if (!byCategory.has(cat)) byCategory.set(cat, new Map());\n const fnCounts = byCategory.get(cat)!;\n fnCounts.set(entry.fn, (fnCounts.get(entry.fn) ?? 0) + 1);\n\n if (entry.status === \"error\") errorCount++;\n if (entry.fn === \"chain.createEntry\" && entry.status === \"ok\") writeCreates++;\n if (entry.fn === \"chain.updateEntry\" && entry.status === \"ok\") writeUpdates++;\n }\n\n const firstTs = new Date(log[0].ts).getTime();\n const lastTs = new Date(log[log.length - 1].ts).getTime();\n const duration = formatDuration(lastTs - firstTs);\n\n const lines: string[] = [`# Session Summary (${duration})\\n`];\n\n const categoryLabels: [CallCategory, string][] = [\n [\"read\", \"Reads\"],\n [\"search\", \"Searches\"],\n [\"write\", \"Writes\"],\n [\"label\", \"Labels\"],\n [\"meta\", \"Meta\"],\n ];\n\n for (const [cat, label] of categoryLabels) {\n const fnCounts = byCategory.get(cat);\n if (!fnCounts || fnCounts.size === 0) continue;\n const total = [...fnCounts.values()].reduce((a, b) => a + b, 0);\n const detail = [...fnCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([fn, count]) => `${fn.replace(\"chain.\", \"\")} x${count}`)\n .join(\", \");\n lines.push(`- **${label}:** ${total} call${total === 1 ? \"\" : \"s\"} (${detail})`);\n }\n\n lines.push(`- **Errors:** ${errorCount}`);\n\n if (writeCreates > 0 || writeUpdates > 0) {\n lines.push(\"\");\n lines.push(\"## Knowledge Contribution\");\n if (writeCreates > 0) lines.push(`- ${writeCreates} entr${writeCreates === 1 ? \"y\" : \"ies\"} created`);\n if (writeUpdates > 0) lines.push(`- ${writeUpdates} entr${writeUpdates === 1 ? \"y\" : \"ies\"} updated`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Extract entry IDs from prior sessions for contextual priming.\n * - all: deduplicated from all sessions, capped at 10 (for scoring)\n * - lastSessionOnly: from most recent session only, capped at 5 (for temporal thread)\n */\nfunction extractSessionEntryIds(priorSessions: Array<{ entriesCreated?: string[]; entriesModified?: string[] }>): {\n all: string[];\n lastSessionOnly: string[];\n} {\n const allSeen = new Set<string>();\n const all: string[] = [];\n let lastSessionOnly: string[] = [];\n for (let i = 0; i < priorSessions.length; i++) {\n const s = priorSessions[i];\n const ids = [...(s.entriesCreated ?? []), ...(s.entriesModified ?? [])].filter((id) => id);\n if (i === 0) {\n lastSessionOnly = [...new Set(ids)].slice(0, 5);\n }\n for (const id of ids) {\n if (!allSeen.has(id)) {\n allSeen.add(id);\n all.push(id);\n if (all.length >= 10) break;\n }\n }\n if (all.length >= 10) break;\n }\n return { all, lastSessionOnly };\n}\n\nasync function handleHealthCheck() {\n const start = Date.now();\n const errors: string[] = [];\n\n let workspaceId: string | undefined;\n try {\n workspaceId = await getWorkspaceId();\n } catch (e: unknown) {\n errors.push(`Workspace resolution failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n let collections: unknown[] = [];\n try {\n collections = await mcpQuery<unknown[]>(\"chain.listCollections\");\n } catch (e: unknown) {\n errors.push(`Collection fetch failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n let totalEntries = 0;\n if (collections.length > 0) {\n try {\n const entries = await mcpQuery<unknown[]>(\"chain.listEntries\", {});\n totalEntries = entries.length;\n } catch (e: unknown) {\n errors.push(`Entry count failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n let wsCtx: { workspaceSlug: string; workspaceName: string } | null = null;\n try {\n wsCtx = await getWorkspaceContext();\n } catch { /* already captured workspace error above */ }\n\n const durationMs = Date.now() - start;\n const healthy = errors.length === 0;\n\n const lines = [\n `# ${healthy ? \"Healthy\" : \"Degraded\"}`,\n \"\",\n `**Workspace:** ${workspaceId ?? \"unresolved\"}`,\n `**Workspace Slug:** ${wsCtx?.workspaceSlug ?? \"unknown\"}`,\n `**Workspace Name:** ${wsCtx?.workspaceName ?? \"unknown\"}`,\n `**Collections:** ${collections.length}`,\n `**Entries:** ${totalEntries}`,\n `**Latency:** ${durationMs}ms`,\n ];\n\n if (errors.length > 0) {\n lines.push(\"\", \"## Errors\");\n for (const err of errors) {\n lines.push(`- ${err}`);\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: {\n healthy,\n collections: collections.length,\n entries: totalEntries,\n latencyMs: durationMs,\n workspace: workspaceId ?? \"unresolved\",\n },\n };\n}\n\nasync function handleWhoami() {\n const ctx = await getWorkspaceContext();\n const sessionId = getAgentSessionId();\n const scope = getApiKeyScope();\n const oriented = isSessionOriented();\n const lines = [\n `# Session Identity`,\n \"\",\n `**Workspace ID:** ${ctx.workspaceId}`,\n `**Workspace Slug:** ${ctx.workspaceSlug}`,\n `**Workspace Name:** ${ctx.workspaceName}`,\n ];\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: {\n workspaceId: ctx.workspaceId,\n workspaceName: ctx.workspaceName,\n scope,\n sessionId,\n oriented,\n },\n };\n}\n\nconst STAGE_LABELS: Record<string, string> = {\n blank: \"Blank\",\n seeded: \"Seeded\",\n grounded: \"Grounded\",\n connected: \"Connected\",\n};\n\nconst STAGE_DESCRIPTIONS: Record<string, string> = {\n blank: \"No knowledge captured yet.\",\n seeded: \"Early knowledge is in place — keep building.\",\n grounded: \"Solid foundations — a few gaps remain.\",\n connected: \"Well-connected knowledge graph — your Brain is useful.\",\n};\n\nasync function handleWorkspaceStatus() {\n const result = await mcpQuery<{\n score: number;\n totalChecks: number;\n passedChecks: number;\n scoringVersion: \"v1\" | \"v2\";\n stage: \"blank\" | \"seeded\" | \"grounded\" | \"connected\";\n checks: Array<{\n passed: boolean;\n label: string;\n current: number;\n required: number;\n capabilityLabel?: string;\n }>;\n gaps: Array<{\n id: string;\n label: string;\n description: string;\n current: number;\n required: number;\n guidance: string;\n capabilityGuidance?: string;\n }>;\n stats: {\n totalEntries: number;\n activeCount: number;\n draftCount: number;\n totalRelations: number;\n collectionCount: number;\n orphanedCount: number;\n };\n governanceMode?: string;\n }>(\"chain.workspaceReadiness\");\n\n const { score, totalChecks, passedChecks, checks, gaps, stats, governanceMode } = result;\n // Guard against older backends that predate v2 scoring.\n const scoringVersion: \"v1\" | \"v2\" = result.scoringVersion ?? \"v1\";\n const stage: \"blank\" | \"seeded\" | \"grounded\" | \"connected\" = result.stage ?? \"seeded\";\n\n const stageLabel = STAGE_LABELS[stage] ?? stage;\n const stageDescription = STAGE_DESCRIPTIONS[stage] ?? \"\";\n const scoreBar = \"█\".repeat(Math.round(score / 10)) + \"░\".repeat(10 - Math.round(score / 10));\n\n const lines = [\n `# Brain Status: ${stageLabel}`,\n `_${stageDescription}_`,\n \"\",\n `${scoreBar} ${stageLabel} · ${score}%`,\n `**Governance:** ${governanceMode ?? \"open\"}${(governanceMode ?? \"open\") !== \"open\" ? \" (commits require proposal)\" : \"\"}`,\n \"\",\n \"## Stats\",\n `- **Entries:** ${stats.totalEntries} (${stats.activeCount} active, ${stats.draftCount} draft)`,\n `- **Relations:** ${stats.totalRelations}`,\n `- **Collections:** ${stats.collectionCount}`,\n `- **Orphaned:** ${stats.orphanedCount} committed entries with no relations`,\n \"\",\n ];\n\n if (gaps.length > 0) {\n lines.push(\"## Gaps\");\n for (const gap of gaps) {\n // capabilityGuidance is plain English (v2); fall back to guidance for backward compat\n const action = gap.capabilityGuidance ?? gap.guidance;\n lines.push(`- [ ] **${gap.label}**`);\n lines.push(` _${action}_`);\n }\n lines.push(\"\");\n }\n\n const passed = checks.filter((c) => c.passed);\n if (passed.length > 0) {\n lines.push(\"## Passing checks\");\n for (const check of passed) {\n lines.push(`- [x] ${check.label} (${check.current}/${check.required})`);\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: {\n stage,\n scoringVersion,\n readinessScore: score,\n activeEntries: stats.activeCount,\n totalRelations: stats.totalRelations,\n orphanedEntries: stats.orphanedCount,\n gaps: gaps.map((g) => ({\n id: g.id,\n label: g.label,\n guidance: g.capabilityGuidance ?? g.guidance,\n })),\n },\n };\n}\n\nasync function handleAudit(limit: number) {\n const log = getAuditLog();\n const recent = log.slice(-limit);\n\n if (recent.length === 0) {\n return {\n content: [{ type: \"text\" as const, text: \"No calls recorded yet this session.\" }],\n structuredContent: { totalCalls: 0, calls: [] },\n };\n }\n\n const summary = buildSessionSummary(log);\n\n const logLines = [`# Audit Log (last ${recent.length} of ${log.length} total)\\n`];\n for (const entry of recent) {\n const icon = entry.status === \"ok\" ? \"\\u2713\" : \"\\u2717\";\n const errPart = entry.error ? ` \\u2014 ${entry.error}` : \"\";\n const toolPart = entry.toolContext\n ? ` [${entry.toolContext.tool}${entry.toolContext.action ? ` action=${entry.toolContext.action}` : \"\"}]`\n : \"\";\n logLines.push(`${icon} \\`${entry.fn}\\`${toolPart} ${entry.durationMs}ms ${entry.status}${errPart}`);\n }\n\n return {\n content: [{ type: \"text\" as const, text: `${summary}\\n\\n---\\n\\n${logLines.join(\"\\n\")}` }],\n structuredContent: {\n totalCalls: log.length,\n calls: recent.map((entry) => ({\n tool: entry.fn,\n ...(entry.toolContext?.action && { action: entry.toolContext.action }),\n timestamp: entry.ts,\n ...(entry.durationMs != null && { durationMs: entry.durationMs }),\n })),\n },\n };\n}\n\nconst HEALTH_ACTIONS = [\"check\", \"whoami\", \"status\", \"audit\", \"self-test\"] as const;\ntype HealthAction = (typeof HEALTH_ACTIONS)[number];\n\nexport const healthSchema = z.object({\n action: z.enum(HEALTH_ACTIONS).describe(\n \"'check': connectivity and workspace stats. 'whoami': session identity. 'status': workspace readiness. 'audit': session audit log. 'self-test': validate all tool schemas.\",\n ),\n limit: z.number().min(1).max(50).default(20).optional()\n .describe(\"For audit: how many recent calls to show (max 50)\"),\n});\n\nexport const orientSchema = z.object({\n mode: z.enum([\"full\", \"brief\"]).optional().default(\"full\").describe(\"full = full context (default). brief = compact summary for mid-session re-orientation.\"),\n task: z.string().optional().describe(\"Natural-language task description for task-scoped context. When provided, orient returns scored, relevant entries for the task.\"),\n});\n\nexport const healthCheckOutputSchema = z.object({\n healthy: z.boolean(),\n collections: z.number(),\n entries: z.number(),\n latencyMs: z.number(),\n workspace: z.string(),\n});\n\nexport const healthStatusOutputSchema = z.object({\n // Optional with defaults — older backends that don't return these fields won't fail.\n stage: z.enum([\"blank\", \"seeded\", \"grounded\", \"connected\"]).optional().default(\"seeded\"),\n scoringVersion: z.enum([\"v1\", \"v2\"]).optional().default(\"v1\"),\n readinessScore: z.number(),\n activeEntries: z.number(),\n totalRelations: z.number(),\n orphanedEntries: z.number(),\n gaps: z.array(z.object({ id: z.string(), label: z.string(), guidance: z.string() })),\n});\n\nexport const healthAuditOutputSchema = z.object({\n totalCalls: z.number(),\n calls: z.array(z.object({\n tool: z.string(),\n action: z.string().optional(),\n timestamp: z.string(),\n durationMs: z.number().optional(),\n })),\n});\n\nexport const healthWhoamiOutputSchema = z.object({\n workspaceId: z.string(),\n workspaceName: z.string(),\n scope: z.string(),\n sessionId: z.union([z.string(), z.null()]),\n oriented: z.boolean(),\n});\n\nconst ALL_TOOL_SCHEMAS: ReadonlyArray<{ name: string; schema: z.ZodTypeAny }> = [\n { name: \"entries\", schema: entriesSchema },\n { name: \"relations\", schema: relationsSchema },\n { name: \"graph\", schema: graphSchema },\n { name: \"context\", schema: contextSchema },\n { name: \"collections\", schema: collectionsSchema },\n { name: \"session\", schema: sessionSchema },\n { name: \"health\", schema: healthSchema },\n { name: \"orient\", schema: orientSchema },\n { name: \"quality\", schema: qualitySchema },\n { name: \"workflows\", schema: workflowsSchema },\n { name: \"session-wrapup\", schema: wrapupSchema },\n { name: \"labels\", schema: labelsSchema },\n { name: \"verify\", schema: verifySchema },\n { name: \"capture\", schema: captureSchema },\n { name: \"batch-capture\", schema: batchCaptureSchema },\n { name: \"update-entry\", schema: updateEntrySchema },\n { name: \"get-history\", schema: getHistorySchema },\n { name: \"commit-entry\", schema: commitEntrySchema },\n { name: \"start\", schema: startSchema },\n { name: \"get-usage-summary\", schema: usageSummarySchema },\n { name: \"chain\", schema: chainSchema },\n { name: \"chain-version\", schema: chainVersionSchema },\n { name: \"chain-branch\", schema: chainBranchSchema },\n { name: \"chain-review\", schema: chainReviewSchema },\n { name: \"create-audience-map-set\", schema: createAudienceMapSetSchema },\n { name: \"map\", schema: mapSchema },\n { name: \"map-slot\", schema: mapSlotSchema },\n { name: \"map-version\", schema: mapVersionSchema },\n { name: \"map-suggest\", schema: mapSuggestSchema },\n { name: \"architecture\", schema: architectureSchema },\n { name: \"architecture-admin\", schema: architectureAdminSchema },\n { name: \"facilitate\", schema: facilitateSchema },\n];\n\nexport const selfTestOutputSchema = z.object({\n passed: z.number(),\n failed: z.number(),\n total: z.number(),\n results: z.array(z.object({\n tool: z.string(),\n valid: z.boolean(),\n error: z.string().optional(),\n })),\n});\n\nfunction handleSelfTest() {\n const results: Array<{ tool: string; valid: boolean; error?: string }> = [];\n\n for (const { name, schema } of ALL_TOOL_SCHEMAS) {\n try {\n if (!schema || typeof schema.safeParse !== \"function\") {\n results.push({ tool: name, valid: false, error: \"Schema is not a valid Zod object\" });\n continue;\n }\n const test = schema.safeParse({});\n // Even if parse fails (expected for required fields), the schema itself is valid\n if (test.success || test.error) {\n results.push({ tool: name, valid: true });\n }\n } catch (e: unknown) {\n results.push({ tool: name, valid: false, error: e instanceof Error ? e.message : String(e) });\n }\n }\n\n const passed = results.filter((r) => r.valid).length;\n const failed = results.filter((r) => !r.valid).length;\n const total = results.length;\n\n const lines: string[] = [\n `# Self-Test: Tool Schema Validation`,\n `**Result:** ${failed === 0 ? \"ALL PASS\" : `${failed} FAILED`}`,\n `**Schemas validated:** ${passed}/${total}`,\n \"\",\n ];\n\n if (failed > 0) {\n lines.push(\"## Failures\");\n for (const r of results.filter((r) => !r.valid)) {\n lines.push(`- **${r.tool}**: ${r.error}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"## All Tools\");\n for (const r of results) {\n lines.push(`- ${r.valid ? \"PASS\" : \"FAIL\"} \\`${r.tool}\\``);\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: { passed, failed, total, results },\n };\n}\n\nexport function registerHealthTools(server: McpServer) {\n\n server.registerTool(\n \"health\",\n {\n title: \"Health\",\n description:\n \"Diagnostics and session identity. Four actions:\\n\\n\" +\n \"- **check**: Verify connectivity — workspace, collections, entries, latency.\\n\" +\n \"- **whoami**: Session identity — workspace ID, slug, name.\\n\" +\n \"- **status**: Workspace readiness — score, gaps, stats (entries, relations, orphans).\\n\" +\n \"- **audit**: Session audit log — last N backend calls with summary.\",\n inputSchema: healthSchema,\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },\n },\n async (args) => {\n const parsed = healthSchema.safeParse(args ?? {});\n if (!parsed.success) {\n const issues = parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \");\n return { content: [{ type: \"text\" as const, text: `Invalid arguments: ${issues}` }] };\n }\n\n const { action, limit } = parsed.data;\n\n return runWithToolContext({ tool: \"health\", action }, async () => {\n if (action === \"check\") return handleHealthCheck();\n if (action === \"whoami\") return handleWhoami();\n if (action === \"status\") return handleWorkspaceStatus();\n if (action === \"audit\") return handleAudit(limit ?? 20);\n if (action === \"self-test\") return handleSelfTest();\n\n return {\n content: [{ type: \"text\" as const, text: `Unknown action '${action}'. Valid actions: ${HEALTH_ACTIONS.join(\", \")}.` }],\n };\n });\n }\n );\n\n server.registerTool(\n \"orient\",\n {\n title: \"Orient — Start Here\",\n description:\n \"The single entry point for starting a session. Returns workspace context with a \" +\n \"single recommended next action for low-readiness workspaces, or a standup-style \" +\n \"briefing for established workspaces.\\n\\n\" +\n \"Use this FIRST. One call to orient replaces 3–5 individual tool calls.\\n\\n\" +\n \"Completing orientation unlocks write tools for the active session.\\n\\n\" +\n \"**mode:** `full` (default) returns full context. `brief` returns only vision, bet/tension counts, readiness, active bet names, and last-session summary — use for mid-session re-orientation.\\n\\n\" +\n \"**task:** Optional natural-language task description. When provided, returns task-scoped context (scored, relevant entries) in addition to standard orient sections.\",\n inputSchema: orientSchema,\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },\n },\n async ({ mode = \"full\", task } = {}) => {\n const errors: string[] = [];\n const agentSessionId = getAgentSessionId();\n\n // Skip heavy queries when already oriented and no task-specific context needed\n if (isSessionOriented() && mode === \"brief\" && !task) {\n return {\n content: [{ type: \"text\" as const, text: \"Already oriented. Session active, writes unlocked. Use `orient mode='full'` or `orient task='...'` for full context.\" }],\n structuredContent: { alreadyOriented: true, sessionId: agentSessionId },\n };\n }\n\n let wsCtx: { workspaceSlug: string; workspaceName: string; workspaceId: string; createdAt: number | null } | null = null;\n try {\n wsCtx = await getWorkspaceContext();\n } catch (e: unknown) {\n errors.push(`Workspace: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n let priorSessions: Record<string, unknown>[] = [];\n let recoveryBlock: Record<string, unknown> | null = null;\n if (wsCtx) {\n try {\n const sessionsResult = await mcpQuery<{ sessions: Record<string, unknown>[]; recoveryBlock: Record<string, unknown> | null }>(\"agent.recentSessions\", { limit: 3 });\n priorSessions = sessionsResult?.sessions ?? [];\n recoveryBlock = sessionsResult?.recoveryBlock ?? null;\n } catch { /* non-critical */ }\n }\n\n const { all: sessionEntryIds, lastSessionOnly } = extractSessionEntryIds(priorSessions);\n\n let orientEntries: {\n strategicContext: {\n vision: string | null;\n activeBetCount: number;\n currentBet: string | null;\n activeTensionCount: number;\n productAreas?: string[];\n productAreaCount?: number;\n };\n activeGoals: any[];\n recentDecisions: any[];\n recentlySuperseded: any[];\n staleEntries: any[];\n principles: any[];\n standards: any[];\n businessRules: any[];\n architectureNotes: any[];\n activeBets: any[];\n stalenessThresholdDays: number;\n taskContext?: {\n seeds: Array<{ entryId: string | null; name: string; collectionSlug: string }>;\n context: Array<{ entryId: string | null; name: string; score: number; hop: number; collectionSlug?: string }>;\n totalFound: number;\n confidence: string;\n };\n continuingFrom?: Array<{ entryId: string | null; name: string; collectionSlug: string | null; score: number; reasoning: string; canonicalKey: string | null }>;\n lastSessionTouched?: Array<{ entryId: string | null; name: string; collectionSlug: string | null; canonicalKey: string | null }>;\n } | null = null;\n try {\n const orientArgs: { task?: string; sessionEntryIds?: string[]; lastSessionEntryIds?: string[] } = {};\n if (task) orientArgs.task = task;\n if (sessionEntryIds.length > 0) orientArgs.sessionEntryIds = sessionEntryIds;\n if (lastSessionOnly.length > 0) orientArgs.lastSessionEntryIds = lastSessionOnly;\n orientEntries = await mcpQuery<any>(\"chain.getOrientEntries\", orientArgs);\n } catch { /* non-critical */ }\n\n let openTensions: any[] = [];\n try {\n const tensions = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"tensions\" });\n openTensions = (tensions ?? []).filter((e: { workflowStatus?: string }) => e.workflowStatus === \"open\");\n } catch { /* non-critical */ }\n\n let readiness: any = null;\n try {\n readiness = await mcpQuery<any>(\"chain.workspaceReadiness\");\n } catch (e: unknown) {\n errors.push(`Readiness: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n const lines: string[] = [];\n const isLowReadiness = readiness && readiness.score < 50;\n\n // --- Identity ---\n if (wsCtx) {\n lines.push(`# ${wsCtx.workspaceName}`);\n lines.push(`_Workspace \\`${wsCtx.workspaceSlug}\\` — Product Brain is healthy._`);\n } else {\n lines.push(\"# Workspace\");\n lines.push(\"_Could not resolve workspace._\");\n }\n lines.push(\"\");\n\n // --- Brief mode: compact output only ---\n if (mode === \"brief\") {\n const briefStage = readiness?.stage ?? (readiness?.score != null ? (readiness.score < 50 ? \"seeded\" : \"grounded\") : \"unknown\");\n lines.push(`Brain stage: ${briefStage}`);\n if (orientEntries?.strategicContext) {\n const sc = orientEntries.strategicContext;\n if (sc.vision) lines.push(`Vision: ${sc.vision}`);\n if (sc.productAreaCount != null && sc.productAreaCount > 0) {\n lines.push(`Product areas (${sc.productAreaCount}): ${(sc.productAreas ?? []).join(\", \")}`);\n }\n lines.push(`${sc.activeBetCount} active bet(s), ${sc.activeTensionCount} tension(s).`);\n }\n if (orientEntries?.taskContext && orientEntries.taskContext.context.length > 0) {\n lines.push(`Task context: ${orientEntries.taskContext.totalFound} relevant entries (${orientEntries.taskContext.confidence} confidence).`);\n }\n if (orientEntries?.activeBets?.length > 0) {\n for (const e of orientEntries.activeBets) {\n const tensions = (e as any).linkedTensions as Array<{ entryId: string | null; name: string; severity?: string }> | undefined;\n const tensionPart = tensions?.length\n ? ` — ${tensions.map((t) => `${t.entryId ?? t.name} (${t.severity ?? \"—\"})`).join(\", \")}`\n : \"\";\n lines.push(`- \\`${e.entryId ?? e._id}\\` ${e.name}${tensionPart}`);\n }\n }\n if (recoveryBlock) {\n lines.push(\"\");\n lines.push(...formatRecoveryBlock(recoveryBlock as Parameters<typeof formatRecoveryBlock>[0]));\n } else if (priorSessions.length > 0) {\n const last = priorSessions[0];\n const date = new Date(last.startedAt).toISOString().split(\"T\")[0];\n const created = Array.isArray(last.entriesCreated) ? last.entriesCreated.length : last.entriesCreated ?? 0;\n const modified = Array.isArray(last.entriesModified) ? last.entriesModified.length : last.entriesModified ?? 0;\n lines.push(`Last session (${date}): ${created} created, ${modified} modified`);\n }\n if (orientEntries) {\n const mapGovernanceEntry = (e: any) => ({\n entryId: e.entryId,\n name: e.name,\n description: typeof e.preview === \"string\" ? e.preview : undefined,\n });\n lines.push(\"\");\n lines.push(...buildOperatingProtocol({\n principles: (orientEntries.principles ?? []).map(mapGovernanceEntry),\n standards: (orientEntries.standards ?? []).map(mapGovernanceEntry),\n businessRules: (orientEntries.businessRules ?? []).map(mapGovernanceEntry),\n }, task));\n }\n\n if (agentSessionId) {\n try {\n await mcpCall(\"agent.markOriented\", { sessionId: agentSessionId });\n setSessionOriented(true);\n } catch { /* non-critical */ }\n lines.push(\"---\");\n lines.push(`Orientation complete. Session ${agentSessionId}.`);\n } else {\n lines.push(\"---\");\n lines.push(\"_No active agent session. Call `session action=start` to begin._\");\n }\n if (errors.length > 0) {\n lines.push(\"\");\n for (const err of errors) lines.push(`- ${err}`);\n }\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n\n const orientStage: string = readiness?.stage ?? \"seeded\";\n\n // --- Full mode: New vs neglected framing ---\n if (isLowReadiness && wsCtx?.createdAt) {\n const ageDays = Math.floor((Date.now() - wsCtx.createdAt) / (1000 * 60 * 60 * 24));\n if (ageDays >= 30) {\n lines.push(`Your workspace has been around for ${ageDays} days and is still at the **${orientStage}** stage.`);\n lines.push(\"Let's close the gaps — or if the current structure doesn't fit, we can reshape it.\");\n lines.push(\"\");\n }\n }\n\n // --- Single next action for low-readiness ---\n if (isLowReadiness) {\n lines.push(`**Brain stage: ${orientStage}.**`);\n lines.push(\"\");\n\n const gaps = readiness.gaps ?? [];\n if (gaps.length > 0) {\n const gap = gaps[0];\n // capabilityGuidance is the v2 plain-English CTA — no CLI syntax.\n // Falls back to guidance for backward compat with any v1 responses.\n const cta =\n gap.capabilityGuidance ??\n gap.guidance ??\n `Tell me about your ${gap.label.toLowerCase()} and I'll capture it.`;\n\n lines.push(\"## Recommended next step\");\n lines.push(`**${gap.label}**`);\n lines.push(\"\");\n lines.push(cta);\n lines.push(\"\");\n lines.push(\"_Everything stays as a draft until you confirm. Say \\\"commit\\\" or \\\"looks good\\\" to promote to the Chain._\");\n lines.push(\"\");\n\n const remainingGaps = gaps.length - 1;\n if (remainingGaps > 0 || openTensions.length > 0) {\n lines.push(`_${remainingGaps > 0 ? `${remainingGaps} more gap${remainingGaps === 1 ? \"\" : \"s\"}` : \"\"}${remainingGaps > 0 && openTensions.length > 0 ? \" and \" : \"\"}${openTensions.length > 0 ? `${openTensions.length} open tension${openTensions.length === 1 ? \"\" : \"s\"}` : \"\"} — ask \"show full status\" for details._`);\n lines.push(\"\");\n }\n }\n\n lines.push(\"_Need a collection that doesn't exist yet (e.g. audiences, personas, metrics)?_\");\n lines.push(\"_Use `collections action=create` to add it, or ask me to propose collections for your domain._\");\n lines.push(\"\");\n } else if (readiness) {\n lines.push(`**Brain stage: ${orientStage}.**`);\n lines.push(\"\");\n\n if (orientEntries?.strategicContext) {\n const sc = orientEntries.strategicContext;\n lines.push(\"## Strategic Context\");\n if (sc.vision) lines.push(`**Vision:** ${sc.vision}`);\n if (sc.productAreaCount != null && sc.productAreaCount > 0) {\n lines.push(`**Product areas (${sc.productAreaCount}):** ${(sc.productAreas ?? []).join(\", \")}`);\n }\n const betLine = sc.currentBet\n ? `**Current bet:** ${sc.currentBet}. ${sc.activeBetCount} active bet(s).`\n : \"No active bets.\";\n lines.push(`${betLine} ${sc.activeTensionCount} open tension(s).`);\n lines.push(\"\");\n }\n\n if (orientEntries?.continuingFrom && orientEntries.continuingFrom.length > 0) {\n lines.push(\"## Continuing from\");\n lines.push(\"_Prior-session entries most relevant to your task._\");\n lines.push(\"\");\n for (const e of orientEntries.continuingFrom) {\n const id = e.entryId ?? e.name;\n const type = e.canonicalKey ?? \"generic\";\n const coll = e.collectionSlug ? ` [${e.collectionSlug}]` : \"\";\n lines.push(`- \\`${id}\\` (score ${e.score}) [${type}]${coll} — ${e.name}`);\n if (e.reasoning) lines.push(` _${e.reasoning}_`);\n }\n lines.push(\"\");\n }\n\n if (orientEntries?.lastSessionTouched && orientEntries.lastSessionTouched.length > 0) {\n lines.push(\"## Last session touched\");\n lines.push(\"_Entries created or modified in your most recent session._\");\n lines.push(\"\");\n for (const e of orientEntries.lastSessionTouched) {\n const id = e.entryId ?? e.name;\n const type = e.canonicalKey ?? \"generic\";\n const coll = e.collectionSlug ? ` [${e.collectionSlug}]` : \"\";\n lines.push(`- \\`${id}\\` [${type}]${coll} — ${e.name}`);\n }\n lines.push(\"\");\n }\n\n if (orientEntries?.taskContext && orientEntries.taskContext.context.length > 0) {\n const tc = orientEntries.taskContext;\n lines.push(\"## Task Context\");\n lines.push(`_Task-scoped entries (${tc.confidence} confidence, ${tc.totalFound} relevant)`);\n lines.push(\"\");\n for (const e of tc.context) {\n const id = e.entryId ?? e.name;\n const coll = e.collectionSlug ? ` [${e.collectionSlug}]` : \"\";\n lines.push(`- \\`${id}\\` (score ${e.score})${coll}${e.name !== id ? ` — ${e.name}` : \"\"}`);\n }\n lines.push(\"\");\n }\n\n if (task && orientEntries) {\n const result = runAlignmentCheck(\n task,\n orientEntries.activeBets ?? [],\n orientEntries.taskContext?.context,\n );\n lines.push(...buildAlignmentCheckLines(result));\n }\n\n if (orientEntries) {\n const fmt = (e: any) => {\n const type = e.canonicalKey ?? 'generic';\n const stratum = e.stratum ?? '?';\n return `- \\`${e.entryId ?? e._id}\\` [${type} · ${stratum}] ${e.name}`;\n };\n if (orientEntries.activeBets?.length > 0) {\n lines.push(\"## Active bets — current scope\");\n lines.push(\"_These define what you're building now. Work outside these bets requires explicit user confirmation before designing._\");\n lines.push(\"\");\n for (const e of orientEntries.activeBets) {\n lines.push(fmt(e));\n const tensions = (e as any).linkedTensions as Array<{ entryId: string | null; name: string; severity?: string; priority?: string }> | undefined;\n if (tensions?.length) {\n const tensionLines = tensions.map((t) => {\n const meta = [t.severity, t.priority].filter(Boolean).join(\", \");\n return `\\`${t.entryId ?? t.name}\\` (${t.name}${meta ? `, ${meta}` : \"\"})`;\n });\n lines.push(` Tensions: ${tensionLines.join(\"; \")}`);\n } else {\n lines.push(` Tensions: No linked tensions`);\n }\n }\n lines.push(\"\");\n }\n if (orientEntries.activeGoals.length > 0) {\n lines.push(\"## Active goals\");\n orientEntries.activeGoals.forEach((e) => lines.push(fmt(e)));\n lines.push(\"\");\n }\n if (orientEntries.recentDecisions.length > 0) {\n lines.push(\"## Recent decisions\");\n orientEntries.recentDecisions.forEach((e) => lines.push(fmt(e)));\n lines.push(\"\");\n }\n if (orientEntries.recentlySuperseded.length > 0) {\n lines.push(\"## Recently superseded\");\n orientEntries.recentlySuperseded.forEach((e) => lines.push(fmt(e)));\n lines.push(\"\");\n }\n if (orientEntries.staleEntries.length > 0) {\n lines.push(\"## Needs confirmation\");\n lines.push(`_Domain stratum entries not confirmed in ${orientEntries.stalenessThresholdDays} days._`);\n orientEntries.staleEntries.forEach((e) => lines.push(fmt(e)));\n lines.push(\"\");\n }\n const hasPrinciples = orientEntries.principles?.length > 0;\n const hasStandards = orientEntries.standards?.length > 0;\n const hasBusinessRules = orientEntries.businessRules.length > 0;\n if (hasPrinciples || hasStandards || hasBusinessRules) {\n lines.push(\"## Workspace Governance — constraints\");\n lines.push(\"_These constrain what you build. If your proposal conflicts with any of these, stop and flag it. Do not design around them without explicit user confirmation._\");\n lines.push(\"\");\n if (hasPrinciples) {\n lines.push(\"**Principles** — beliefs that guide decisions:\");\n orientEntries.principles.forEach((e: any) => lines.push(fmt(e)));\n lines.push(\"\");\n }\n if (hasStandards) {\n lines.push(\"**Standards** — conventions for how work is done:\");\n orientEntries.standards.forEach((e: any) => lines.push(fmt(e)));\n lines.push(\"\");\n }\n if (hasBusinessRules) {\n lines.push(\"**Business Rules** — system constraints:\");\n orientEntries.businessRules.forEach((e: any) => lines.push(fmt(e)));\n lines.push(\"\");\n }\n }\n if (orientEntries.architectureNotes.length > 0) {\n lines.push(\"## Architecture notes\");\n orientEntries.architectureNotes.forEach((e) => lines.push(fmt(e)));\n lines.push(\"\");\n }\n\n const mapGovernanceEntry = (e: any) => ({\n entryId: e.entryId,\n name: e.name,\n description: typeof e.preview === \"string\" ? e.preview : undefined,\n });\n lines.push(...buildOperatingProtocol({\n principles: (orientEntries.principles ?? []).map(mapGovernanceEntry),\n standards: (orientEntries.standards ?? []).map(mapGovernanceEntry),\n businessRules: (orientEntries.businessRules ?? []).map(mapGovernanceEntry),\n }, task));\n }\n\n const plannedWork = await queryPlannedWork();\n\n if (hasPlannedWork(plannedWork)) {\n lines.push(...buildPlannedWorkSection(plannedWork, priorSessions, recoveryBlock));\n } else {\n const briefingItems: string[] = [];\n\n if (priorSessions.length > 0 && !recoveryBlock) {\n const last = priorSessions[0];\n const date = new Date(last.startedAt).toISOString().split(\"T\")[0];\n const created = Array.isArray(last.entriesCreated) ? last.entriesCreated.length : last.entriesCreated ?? 0;\n const modified = Array.isArray(last.entriesModified) ? last.entriesModified.length : last.entriesModified ?? 0;\n briefingItems.push(`**Last session** (${date}): ${created} created, ${modified} modified`);\n }\n\n if (readiness.gaps?.length > 0) {\n briefingItems.push(`**${readiness.gaps.length} gap${readiness.gaps.length === 1 ? \"\" : \"s\"}** remaining`);\n }\n\n if (briefingItems.length > 0) {\n lines.push(\"## Briefing\");\n for (const item of briefingItems) {\n lines.push(`- ${item}`);\n }\n lines.push(\"\");\n }\n\n if (recoveryBlock) {\n lines.push(\"\");\n lines.push(...formatRecoveryBlock(recoveryBlock as Parameters<typeof formatRecoveryBlock>[0]));\n }\n }\n\n lines.push(\"What would you like to work on?\");\n lines.push(\"\");\n }\n\n if (errors.length > 0) {\n lines.push(\"## Errors\");\n for (const err of errors) lines.push(`- ${err}`);\n lines.push(\"\");\n }\n\n // --- Mark session as oriented ---\n if (agentSessionId) {\n try {\n await mcpCall(\"agent.markOriented\", { sessionId: agentSessionId });\n setSessionOriented(true);\n\n lines.push(\"---\");\n lines.push(`Orientation complete. Session ${agentSessionId}. Write tools available.`);\n } catch {\n lines.push(\"---\");\n lines.push(\"_Warning: Could not mark session as oriented. Write tools may be restricted._\");\n }\n\n // Record session signal: orient was called (implicit feedback for the intelligence kernel)\n try {\n await mcpMutation(\"chain.recordSessionSignal\", {\n sessionId: agentSessionId,\n signalType: \"immediate_context_load\",\n metadata: { source: \"orient\" },\n });\n } catch (err) {\n process.stderr.write(`[MCP] recordSessionSignal failed: ${(err as Error).message}\\n`);\n // Non-fatal: orient still succeeds; signal is for analytics\n }\n } else {\n lines.push(\"---\");\n lines.push(\"_No active agent session. Call `session action=start` to begin a tracked session._\");\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n}\n","/**\n * Session compound tool — start, close, status.\n * Consolidates agent-start, agent-close, agent-status into one tool.\n * Chain: PB-TEN-001 (AI starts from zero every session)\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n getWorkspaceContext,\n startAgentSession,\n closeAgentSession,\n getAgentSessionId,\n isSessionOriented,\n mcpCall,\n runWithToolContext,\n} from \"../client.js\";\nimport { runWrapupReview } from \"./wrapup.js\";\n\nconst SESSION_ACTIONS = [\"start\", \"close\", \"status\"] as const;\ntype SessionAction = (typeof SESSION_ACTIONS)[number];\n\nexport const sessionSchema = z.object({\n action: z.enum(SESSION_ACTIONS).describe(\n \"'start': begin a tracked session. 'close': end the session and record activity. 'status': check current session state.\",\n ),\n});\n\nexport function registerSessionTools(server: McpServer): void {\n server.registerTool(\n \"session\",\n {\n title: \"Session\",\n description:\n \"Manage agent session lifecycle. Three actions:\\n\\n\" +\n \"- **start**: Begin a tracked session. Creates attribution for this workspace. \" +\n \"If a session is already active, it gets superseded. Write tools available after orient.\\n\" +\n \"- **close**: End the current session. Records structured data (entries created, modified, relations). \" +\n \"If uncommitted drafts exist and wrapup hasn't run, shows a review summary. Run session-wrapup before closing.\\n\" +\n \"- **status**: Check current session — active or not, oriented, activity counts.\",\n inputSchema: sessionSchema,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n },\n async (args) => {\n const parsed = sessionSchema.safeParse(args);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \");\n return { content: [{ type: \"text\" as const, text: `Invalid arguments: ${issues}` }] };\n }\n\n const { action } = parsed.data;\n\n return runWithToolContext({ tool: \"session\", action }, async () => {\n if (action === \"start\") {\n return handleStart();\n }\n if (action === \"close\") {\n return handleClose();\n }\n if (action === \"status\") {\n return handleStatus();\n }\n\n return {\n content: [{\n type: \"text\" as const,\n text: `Unknown action '${action}'. Valid actions: ${SESSION_ACTIONS.join(\", \")}.`,\n }],\n };\n });\n },\n );\n}\n\nasync function handleStart() {\n try {\n const result = await startAgentSession();\n\n const lines: string[] = [];\n\n if (result.superseded) {\n lines.push(\n `Previous session superseded. Session ${result.superseded.previousSessionId} ` +\n `(started ${result.superseded.startedAt}, initiated by ${result.superseded.initiatedBy}) was closed.`,\n \"\",\n );\n }\n\n lines.push(\n `Session ${result.sessionId} active. ` +\n `Initiated by ${result.initiatedBy}. ` +\n `Workspace ${result.workspaceName}. ` +\n `Scope: ${result.toolsScope}. ` +\n `Write tools available after orient.`,\n );\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: \"text\" as const, text: `Failed to start agent session: ${msg}` }],\n isError: true,\n };\n }\n}\n\nasync function handleClose() {\n try {\n const sessionId = getAgentSessionId();\n if (!sessionId) {\n return {\n content: [{ type: \"text\" as const, text: \"No active agent session to close.\" }],\n };\n }\n\n const session = await mcpCall<Record<string, unknown>>(\"agent.getSession\", {\n sessionId,\n });\n\n let wrapupNudge = \"\";\n if (session && !(session.wrapupCompletedAt as number)) {\n try {\n const { text, data } = await runWrapupReview();\n if (data && data.drafts.length > 0) {\n wrapupNudge = [\n \"## Session Wrapup\",\n \"\",\n text,\n \"\",\n `> **${data.drafts.length} uncommitted draft(s) remain.** ` +\n \"Run `session-wrapup` with action `commit-all` before closing next time.\",\n \"\",\n \"---\",\n \"\",\n ].join(\"\\n\");\n }\n } catch {\n // Non-critical — proceed with close even if wrapup review fails\n }\n }\n\n await closeAgentSession();\n\n const lines: string[] = [\n `Session ${sessionId} closed.`,\n \"\",\n ];\n\n if (session) {\n const created = (session.entriesCreated as string[])?.length ?? 0;\n const modified = (session.entriesModified as string[])?.length ?? 0;\n const relations = (session.relationsCreated as number) ?? 0;\n const gates = (session.gateFailures as number) ?? 0;\n const warnings = (session.contradictionWarnings as number) ?? 0;\n\n lines.push(\n `| Metric | Count |`,\n `|--------|-------|`,\n `| Entries created | ${created} |`,\n `| Entries modified | ${modified} |`,\n `| Relations created | ${relations} |`,\n `| Gate failures | ${gates} |`,\n `| Contradiction warnings | ${warnings} |`,\n );\n }\n\n lines.push(\"\", \"Write tools are now blocked. Session data saved for future orientation.\");\n\n const fullResponse = wrapupNudge + lines.join(\"\\n\");\n\n return { content: [{ type: \"text\" as const, text: fullResponse }] };\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: \"text\" as const, text: `Failed to close agent session: ${msg}` }],\n isError: true,\n };\n }\n}\n\nasync function handleStatus() {\n try {\n const sessionId = getAgentSessionId();\n if (!sessionId) {\n return {\n content: [{ type: \"text\" as const, text: \"No active agent session. Call `session action=start` to begin.\" }],\n };\n }\n\n const session = await mcpCall<Record<string, unknown>>(\"agent.getSession\", {\n sessionId,\n });\n\n if (!session) {\n return {\n content: [{ type: \"text\" as const, text: \"Session ID cached but not found in Convex. Call `session action=start` to create a new session.\" }],\n };\n }\n\n const oriented = isSessionOriented();\n const created = (session.entriesCreated as string[])?.length ?? 0;\n const modified = (session.entriesModified as string[])?.length ?? 0;\n\n const lines = [\n `Session ${sessionId} ${session.status}.`,\n `Initiated by ${session.initiatedBy}.`,\n `Scope: ${session.toolsScope}.`,\n `Oriented: ${oriented ? \"yes\" : \"no\"}.`,\n \"\",\n `| Metric | Value |`,\n `|--------|-------|`,\n `| Entries created | ${created} |`,\n `| Entries modified | ${modified} |`,\n `| Relations created | ${session.relationsCreated ?? 0} |`,\n `| Started | ${new Date(session.startedAt as number).toISOString()} |`,\n `| Expires | ${new Date(session.expiresAt as number).toISOString()} |`,\n ];\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: \"text\" as const, text: `Failed to get session status: ${msg}` }],\n isError: true,\n };\n }\n}\n","/**\n * Session wrapup tools — the closing ceremony for agent sessions.\n * Chain: GLO-47 (Wrapup), GLO-48 (Draft Harvest), ENT-33 (Session Wrapup Ceremony)\n *\n * session-wrapup: Reviews session drafts, quality coaches, suggests links, offers batch commit.\n * Aliases wrapup/finish were removed — \"Also known as\" is in the description for discoverability.\n *\n * Wrapup must run BEFORE session action=close (BR-8: active session required for writes).\n * Commit-on-confirm: wrapup surfaces drafts but only commits when explicitly asked.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n getAgentSessionId,\n getApiKeyScope,\n mcpCall,\n mcpQuery,\n mcpMutation,\n requireWriteAccess,\n recordSessionActivity,\n runWithToolContext,\n} from \"../client.js\";\nimport { trackWriteTool } from \"../tool-surface.js\";\n\ninterface WrapupEntry {\n docId: string;\n entryId: string;\n name: string;\n collection: string;\n status: string;\n canonicalKey: string | null;\n wasCreated: boolean;\n}\n\ninterface WrapupVerdict {\n passed: boolean;\n tier: string;\n weakest: { criterion: string; hint: string } | null;\n source: string;\n}\n\ninterface LinkSuggestion {\n fromEntryId: string;\n toEntryId: string;\n type: string;\n label: string;\n}\n\nexport interface WrapupData {\n drafts: WrapupEntry[];\n committed: WrapupEntry[];\n qualityVerdicts: Record<string, WrapupVerdict>;\n connectionCounts: Record<string, number>;\n summary: { created: number; modified: number; uncommitted: number; totalReviewed: number };\n overflow: number;\n wrapupCompletedAt: number | null;\n}\n\ninterface SuggestLinksResult {\n resolvedEntry: { entryId: string; name: string; docId: string };\n suggestions: {\n entryId: string;\n name: string;\n collectionSlug: string;\n score: number;\n recommendedRelationType: string;\n reasoning: string;\n }[];\n}\n\ninterface WrapupReviewResult {\n text: string;\n data: WrapupData | null;\n suggestions: LinkSuggestion[];\n}\n\n// ─── Concurrency helper ──────────────────────────────────────────────────────\n\nasync function mapWithConcurrency<T, U>(\n items: T[],\n mapper: (item: T) => Promise<U>,\n concurrency = 3,\n): Promise<PromiseSettledResult<U>[]> {\n const results: PromiseSettledResult<U>[] = new Array(items.length);\n let index = 0;\n\n async function runNext(): Promise<void> {\n while (index < items.length) {\n const i = index++;\n try {\n const value = await mapper(items[i]);\n results[i] = { status: \"fulfilled\", value };\n } catch (reason) {\n results[i] = { status: \"rejected\", reason };\n }\n }\n }\n\n await Promise.all(\n Array.from({ length: Math.min(concurrency, items.length) }, () => runNext()),\n );\n return results;\n}\n\n// ─── Suggest links with concurrency ──────────────────────────────────────────\n\nasync function suggestLinksForEntries(entries: WrapupEntry[]): Promise<LinkSuggestion[]> {\n const suggestions: LinkSuggestion[] = [];\n\n const results = await mapWithConcurrency(\n entries,\n async (entry) => {\n const result = await mcpQuery<SuggestLinksResult>(\"chain.graphSuggestLinks\", {\n entryId: entry.entryId,\n limit: 3,\n });\n return { entry, suggestions: result.suggestions ?? [] };\n },\n 3,\n );\n\n for (const result of results) {\n if (result.status !== \"fulfilled\") continue;\n const { entry, suggestions: entrySuggestions } = result.value;\n for (const s of entrySuggestions.slice(0, 2)) {\n suggestions.push({\n fromEntryId: entry.entryId,\n toEntryId: s.entryId,\n type: s.recommendedRelationType,\n label: `${entry.entryId} → ${s.entryId} (${s.name}) [${s.recommendedRelationType}]`,\n });\n }\n }\n\n return suggestions;\n}\n\n// ─── Core review logic ───────────────────────────────────────────────────────\n\nasync function runWrapupReview(): Promise<WrapupReviewResult> {\n const sessionId = getAgentSessionId();\n if (!sessionId) {\n return { text: \"No active agent session. Call `session action=start` first.\", data: null, suggestions: [] };\n }\n\n if (getApiKeyScope() === \"read\") {\n return { text: \"Read-only session — nothing to review.\", data: null, suggestions: [] };\n }\n\n const data = await mcpCall<WrapupData>(\"agent.getSessionWrapup\", { sessionId });\n\n if (data.wrapupCompletedAt) {\n return { text: \"Wrapup already completed this session.\", data, suggestions: [] };\n }\n\n if (data.drafts.length === 0 && data.committed.length === 0) {\n return { text: \"Empty session — no entries to review.\", data, suggestions: [] };\n }\n\n const lines: string[] = [];\n\n lines.push(\n `**Session activity:** ${data.summary.created} created, ${data.summary.modified} modified, ` +\n `${data.summary.uncommitted} uncommitted drafts.`,\n );\n if (data.overflow > 0) {\n lines.push(`_...and ${data.overflow} more entries not shown._`);\n }\n lines.push(\"\");\n\n if (data.drafts.length > 0) {\n lines.push(\"### Uncommitted Drafts\", \"\");\n lines.push(\"| Entry | Collection | Quality | Connections | Coaching |\");\n lines.push(\"|-------|------------|---------|-------------|----------|\");\n\n for (const draft of data.drafts) {\n const verdict = data.qualityVerdicts[draft.entryId];\n const conns = data.connectionCounts[draft.entryId] ?? 0;\n const qualityStr = verdict\n ? `${verdict.passed ? \"Pass\" : \"Needs work\"} (${verdict.source})`\n : \"—\";\n const coaching = verdict?.weakest\n ? verdict.weakest.hint\n : \"—\";\n\n lines.push(`| \\`${draft.entryId}\\` ${draft.name} | ${draft.collection} | ${qualityStr} | ${conns} | ${coaching} |`);\n }\n lines.push(\"\");\n }\n\n if (data.committed.length > 0) {\n lines.push(`### Already Committed (${data.committed.length})`, \"\");\n for (const entry of data.committed) {\n const conns = data.connectionCounts[entry.entryId] ?? 0;\n lines.push(`- \\`${entry.entryId}\\` [${entry.collection}] ${entry.name} (${conns} connections)`);\n }\n lines.push(\"\");\n }\n\n // Suggest links for low-connection entries (bounded concurrency)\n const lowConnEntries = [...data.drafts, ...data.committed].filter(\n (e) => (data.connectionCounts[e.entryId] ?? 0) < 2,\n );\n\n const suggestions = lowConnEntries.length > 0\n ? await suggestLinksForEntries(lowConnEntries.slice(0, 10))\n : [];\n\n if (suggestions.length > 0) {\n lines.push(\"### Suggested Links\", \"\");\n for (const s of suggestions) {\n lines.push(`- ${s.label}`);\n }\n lines.push(\"\");\n }\n\n if (data.drafts.length > 0) {\n const draftIds = data.drafts.map((d) => `\\`${d.entryId}\\``).join(\", \");\n lines.push(\"### Actions\", \"\");\n lines.push(`Uncommitted: ${draftIds}`);\n lines.push(\"- **Commit all:** call \\`session-wrapup\\` with action `commit-all`\");\n lines.push(\"- **Skip:** call \\`session action=close\\` — drafts remain for next session's orient recovery.\");\n }\n\n return { text: lines.join(\"\\n\"), data, suggestions };\n}\n\n// ─── Commit flow ─────────────────────────────────────────────────────────────\n\nasync function runWrapupCommitAll(\n data: WrapupData,\n cachedSuggestions: LinkSuggestion[],\n): Promise<string> {\n requireWriteAccess();\n\n const sessionId = getAgentSessionId();\n if (!sessionId) return \"No active session.\";\n\n const results: { entryId: string; ok: boolean; error?: string }[] = [];\n let linksCreated = 0;\n\n for (const draft of data.drafts) {\n try {\n await mcpMutation(\"chain.commitEntry\", {\n entryId: draft.entryId,\n author: \"agent (wrapup)\",\n });\n await recordSessionActivity({ entryModified: draft.docId });\n results.push({ entryId: draft.entryId, ok: true });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n results.push({ entryId: draft.entryId, ok: false, error: msg });\n }\n }\n\n // Use cached suggestions from review phase, or fetch fresh if none\n const suggestionsToApply = cachedSuggestions.length > 0\n ? cachedSuggestions\n : await suggestLinksForEntries(\n [...data.drafts, ...data.committed].filter(\n (e) => (data.connectionCounts[e.entryId] ?? 0) < 2,\n ).slice(0, 10),\n );\n\n for (const s of suggestionsToApply.slice(0, 15)) {\n try {\n await mcpMutation(\"chain.createEntryRelation\", {\n fromEntryId: s.fromEntryId,\n toEntryId: s.toEntryId,\n type: s.type,\n });\n await recordSessionActivity({ relationCreated: true });\n linksCreated++;\n } catch {\n // Non-critical\n }\n }\n\n const committed = results.filter((r) => r.ok).length;\n const failed = results.filter((r) => !r.ok);\n\n await mcpCall(\"agent.recordWrapup\", {\n sessionId,\n draftsReviewed: data.drafts.length,\n draftsCommitted: committed,\n linksCreated,\n });\n\n const lines: string[] = [\n \"## Wrapup Complete\",\n \"\",\n `**${committed}** drafts committed, **${linksCreated}** links created.`,\n ];\n\n if (failed.length > 0) {\n lines.push(\"\");\n lines.push(\"### Failed to commit\");\n for (const f of failed) {\n lines.push(`- \\`${f.entryId}\\`: ${f.error}`);\n }\n lines.push(\"_These remain as drafts for next session._\");\n }\n\n return lines.join(\"\\n\");\n}\n\n// ─── Tool registration ───────────────────────────────────────────────────────\n\nconst WRAPUP_TOOL_DESCRIPTION =\n \"Review your session before closing. Shows uncommitted drafts with quality scores, \" +\n \"suggests links for low-connection entries, and offers batch commit. \" +\n \"Run this before `session action=close` to ensure nothing is left behind. \" +\n \"If you call `session action=close` without running wrapup first, you'll get a review-only nudge.\";\n\nexport const wrapupSchema = z.object({\n action: z.enum([\"review\", \"commit-all\"]).optional().describe(\n \"Action to perform. 'review' (default) shows the wrapup summary. 'commit-all' commits all uncommitted drafts and creates suggested links.\",\n ),\n});\n\nexport function registerWrapupTools(server: McpServer): void {\n let lastReviewData: WrapupData | null = null;\n let lastReviewSuggestions: LinkSuggestion[] = [];\n\n const wrapupHandler = async ({ action }: { action?: \"review\" | \"commit-all\" }) => {\n try {\n if (action === \"commit-all\") {\n const sessionId = getAgentSessionId();\n if (!sessionId) {\n return { content: [{ type: \"text\" as const, text: \"No active agent session.\" }] };\n }\n\n const data = lastReviewData ?? await mcpCall<WrapupData>(\"agent.getSessionWrapup\", { sessionId });\n if (data.drafts.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"No uncommitted drafts to commit.\" }] };\n }\n\n const result = await runWrapupCommitAll(data, lastReviewSuggestions);\n lastReviewData = null;\n lastReviewSuggestions = [];\n return { content: [{ type: \"text\" as const, text: result }] };\n }\n\n const { text, data, suggestions } = await runWrapupReview();\n lastReviewData = data;\n lastReviewSuggestions = suggestions;\n\n const fullText = data && (data.drafts.length > 0 || data.committed.length > 0)\n ? `## Session Wrapup\\n\\n${text}`\n : text;\n\n return { content: [{ type: \"text\" as const, text: fullText }] };\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\" as const, text: `Wrapup failed: ${msg}` }], isError: true };\n }\n };\n\n const tool = server.registerTool(\"session-wrapup\", {\n title: \"Session Wrapup\",\n description: WRAPUP_TOOL_DESCRIPTION + \" Also known as: wrapup, finish.\",\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n inputSchema: wrapupSchema,\n }, async (args) => {\n const parsed = wrapupSchema.safeParse(args);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \");\n return { content: [{ type: \"text\" as const, text: `Invalid arguments: ${issues}` }] };\n }\n const act = parsed.data.action ?? \"review\";\n return runWithToolContext({ tool: \"session-wrapup\", action: act }, () =>\n wrapupHandler({ action: act }),\n );\n });\n trackWriteTool(tool);\n}\n\nexport { runWrapupReview, type WrapupReviewResult };\n","/**\n * Quality compound tool — check, re-evaluate.\n * Consolidates quality-check and re-evaluate into one tool.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation, getWorkspaceContext, requireWriteAccess, runWithToolContext } from \"../client.js\";\nimport { trackQualityCheck, trackQualityVerdict } from \"../analytics.js\";\nimport { trackWriteTool } from \"../tool-surface.js\";\nimport { checkEntryQuality, formatRubricVerdictSection } from \"./smart-capture.js\";\n\nconst QUALITY_ACTIONS = [\"check\", \"re-evaluate\"] as const;\n\nexport const qualitySchema = z.object({\n action: z.enum(QUALITY_ACTIONS).describe(\n \"'check': score an entry against quality criteria. 're-evaluate': trigger fresh evaluation.\",\n ),\n entryId: z.string().describe(\"Entry ID, e.g. 'TEN-graph-db', 'GT-019', 'SOS-006'\"),\n context: z.enum([\"capture\", \"commit\", \"review\"]).default(\"review\").optional()\n .describe(\"For re-evaluate: evaluation context\"),\n});\n\nexport const qualityCheckOutputSchema = z.object({\n entryId: z.string(),\n score: z.number(),\n maxScore: z.number(),\n criteria: z.array(z.object({\n name: z.string(),\n score: z.number(),\n maxScore: z.number(),\n met: z.boolean(),\n })),\n});\n\nexport const qualityReevaluateOutputSchema = z.object({\n entryId: z.string(),\n context: z.string(),\n score: z.number(),\n maxScore: z.number(),\n improved: z.boolean(),\n});\n\nexport function registerQualityTools(server: McpServer): void {\n const qualityTool = server.registerTool(\n \"quality\",\n {\n title: \"Quality\",\n description:\n \"Assess and re-evaluate entry quality. Two actions:\\n\\n\" +\n \"- **check**: Score an entry against collection-specific quality criteria. \" +\n \"Returns a scorecard with actionable suggestions. Includes link suggestions when relations are missing.\\n\" +\n \"- **re-evaluate**: Trigger a fresh quality evaluation. Returns heuristic verdict immediately, \" +\n \"schedules LLM evaluation in background.\",\n inputSchema: qualitySchema,\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },\n },\n async (args) => {\n const parsed = qualitySchema.safeParse(args);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \");\n return { content: [{ type: \"text\" as const, text: `Invalid arguments: ${issues}` }] };\n }\n\n const { action, entryId, context } = parsed.data;\n\n return runWithToolContext({ tool: \"quality\", action }, async () => {\n if (action === \"check\") {\n return handleCheck(entryId);\n }\n if (action === \"re-evaluate\") {\n return handleReEvaluate(entryId, context ?? \"review\");\n }\n\n return {\n content: [{\n type: \"text\" as const,\n text: `Unknown action '${action}'. Valid actions: ${QUALITY_ACTIONS.join(\", \")}.`,\n }],\n };\n });\n },\n );\n trackWriteTool(qualityTool);\n}\n\nasync function handleCheck(entryId: string) {\n const result = await checkEntryQuality(entryId);\n\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<{ suggestions?: Array<{ entryId: string; name: string; collectionSlug: string; recommendedRelationType: string; score: number }> }>(\"chain.graphSuggestLinks\", {\n entryId,\n maxHops: 2,\n limit: 3,\n });\n\n if ((suggestions?.suggestions?.length ?? 0) > 0) {\n const linkHints = (suggestions.suggestions ?? [])\n .map((s) => ` → \\`relations action=create 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 try {\n const verdict = await mcpQuery<{ criteria?: unknown[]; canonicalKey?: string; tier?: string; passed?: boolean; source?: string; llmStatus?: string; llmDurationMs?: number; llmError?: string; rogerMartin?: unknown } | null>(\"quality.getLatestVerdictForEntry\", { entryId });\n if (verdict && verdict.criteria && verdict.criteria.length > 0) {\n result.text += \"\\n\\n\" + formatRubricVerdictSection(verdict);\n\n try {\n const wsForTracking = await getWorkspaceContext();\n trackQualityCheck(wsForTracking.workspaceId, {\n entry_id: entryId,\n entry_type: verdict.canonicalKey ?? \"\",\n tier: verdict.tier ?? \"\",\n passed: verdict.passed ?? false,\n source: verdict.source ?? \"\",\n llm_status: verdict.llmStatus,\n llm_duration_ms: verdict.llmDurationMs,\n llm_error: verdict.llmError,\n has_roger_martin: !!verdict.rogerMartin,\n });\n } catch { /* tracking is advisory */ }\n }\n } catch {\n // Rubric verdicts are advisory — quality check works without them\n }\n\n return {\n content: [{ type: \"text\" as const, text: result.text }],\n structuredContent: {\n entryId,\n score: result.quality.score,\n maxScore: result.quality.maxScore,\n criteria: result.quality.checks.map((c) => ({\n name: c.label,\n score: c.passed ? 1 : 0,\n maxScore: 1,\n met: c.passed,\n })),\n },\n };\n}\n\nasync function handleReEvaluate(entryId: string, context: \"capture\" | \"commit\" | \"review\") {\n requireWriteAccess();\n const ws = await getWorkspaceContext();\n const result = await mcpMutation<{\n verdict: { canonicalKey?: string; tier?: string; passed?: boolean; criteria?: Array<{ passed: boolean; id: string; hint?: string }> };\n source?: string;\n } | null>(\"quality.reEvaluateEntry\", {\n entryId,\n context,\n });\n\n if (!result) {\n return {\n content: [{ type: \"text\" as const, text: `Entry \\`${entryId}\\` not found or has no rubric.` }],\n structuredContent: { entryId, context, score: 0, maxScore: 0, improved: false },\n };\n }\n\n const llmScheduled = result.verdict.tier !== \"passive\";\n const lines: string[] = [`Re-evaluated \\`${entryId}\\` in \\`${context}\\` context.`];\n lines.push(\"\");\n lines.push(formatRubricVerdictSection({\n ...result.verdict,\n source: result.source,\n llmStatus: llmScheduled ? \"pending\" : \"skipped\",\n }));\n\n try {\n trackQualityVerdict(ws.workspaceId, {\n entry_id: entryId,\n entry_type: result.verdict.canonicalKey ?? \"\",\n tier: result.verdict.tier ?? \"\",\n context,\n passed: result.verdict.passed ?? false,\n source: \"heuristic\",\n criteria_total: result.verdict.criteria?.length ?? 0,\n criteria_failed: result.verdict.criteria?.filter((c) => !c.passed).length ?? 0,\n llm_scheduled: llmScheduled,\n });\n } catch { /* tracking is advisory */ }\n\n const criteria = result.verdict.criteria ?? [];\n const reEvalScore = criteria.filter((c) => c.passed).length;\n const reEvalMaxScore = criteria.length;\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: {\n entryId,\n context,\n score: reEvalScore,\n maxScore: reEvalMaxScore,\n improved: result.verdict.passed ?? false,\n },\n };\n}\n","/**\n * Workflows compound tool — list, checkpoint.\n * Consolidates list-workflows and workflow-checkpoint into one tool.\n * Chain: FEAT-MCP-001 (MCP Server)\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpMutation, runWithToolContext, requireWriteAccess } from \"../client.js\";\nimport { trackWriteTool } from \"../tool-surface.js\";\nimport {\n getWorkflow,\n listWorkflows,\n type WorkflowDefinition,\n} from \"../workflows/definitions.js\";\n\nconst WORKFLOWS_ACTIONS = [\"list\", \"checkpoint\"] as const;\ntype WorkflowsAction = (typeof WORKFLOWS_ACTIONS)[number];\n\nexport const workflowsSchema = z.object({\n action: z.enum(WORKFLOWS_ACTIONS).describe(\n \"'list': browse available workflows. 'checkpoint': record round output or final summary.\",\n ),\n workflowId: z.string().optional().describe(\"Workflow ID for checkpoint, e.g. 'retro'\"),\n roundId: z.string().optional().describe(\"Round ID for checkpoint, e.g. 'what-went-well'\"),\n output: z.string().optional().describe(\"The round's output — synthesized by the facilitator\"),\n isFinal: z.boolean().optional().describe(\"If true, final checkpoint — triggers summary chain entry\"),\n summaryName: z.string().optional().describe(\"Name for final chain entry (required when isFinal=true)\"),\n summaryDescription: z.string().optional().describe(\"Description for final chain entry (required when isFinal=true)\"),\n});\n\nfunction formatWorkflowCard(wf: WorkflowDefinition): string {\n const roundList = wf.rounds\n .map((r) => ` ${r.num}. ${r.label} (${r.type}, ~${r.maxDurationHint ?? \"?\"})`)\n .join(\"\\n\");\n\n return (\n `## ${wf.icon} ${wf.name}\\n` +\n `**ID**: \\`${wf.id}\\`\\n` +\n `${wf.shortDescription}\\n\\n` +\n `**Rounds** (${wf.rounds.length}):\\n${roundList}\\n\\n` +\n `**Output**: Creates entries in \\`${wf.kbOutputCollection}\\` collection.\\n` +\n `_Use the \\`run-workflow\\` prompt with workflow=\"${wf.id}\" to start._`\n );\n}\n\nexport function registerWorkflowTools(server: McpServer): void {\n const workflowsTool = server.registerTool(\n \"workflows\",\n {\n title: \"Workflows\",\n description:\n \"Chainwork workflow discovery and checkpointing. Two actions:\\n\\n\" +\n \"- **list**: Browse available workflows — retro, shape-a-bet, IDM, etc. \" +\n \"Use the `run-workflow` prompt to launch one.\\n\" +\n \"- **checkpoint**: Record round output during Facilitator Mode. Persists progress. \" +\n \"At completion, use isFinal=true to create the summary chain entry.\",\n inputSchema: workflowsSchema,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n },\n async (args) => {\n const parsed = workflowsSchema.safeParse(args ?? {});\n if (!parsed.success) {\n const issues = parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \");\n return { content: [{ type: \"text\" as const, text: `Invalid arguments: ${issues}` }] };\n }\n\n const { action, workflowId, roundId, output, isFinal, summaryName, summaryDescription } = parsed.data;\n\n return runWithToolContext({ tool: \"workflows\", action }, async () => {\n if (action === \"list\") {\n return handleList();\n }\n if (action === \"checkpoint\") {\n if (!workflowId || !roundId || output === undefined) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"`workflowId`, `roundId`, and `output` are required when action is 'checkpoint'.\",\n }],\n };\n }\n return handleCheckpoint(workflowId, roundId, output, isFinal, summaryName, summaryDescription);\n }\n\n return {\n content: [{\n type: \"text\" as const,\n text: `Unknown action '${action}'. Valid actions: ${WORKFLOWS_ACTIONS.join(\", \")}.`,\n }],\n };\n });\n },\n );\n trackWriteTool(workflowsTool);\n}\n\nasync function handleList() {\n const workflows = listWorkflows();\n\n if (workflows.length === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"No workflows registered yet. Check back after the workflow definitions are configured.\",\n }],\n };\n }\n\n const cards = workflows.map(formatWorkflowCard).join(\"\\n\\n---\\n\\n\");\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Available Chainwork Workflows\\n\\n` +\n `${workflows.length} workflow(s) available. Use the \\`run-workflow\\` prompt to launch one.\\n\\n` +\n `---\\n\\n${cards}`,\n }],\n };\n}\n\nasync function handleCheckpoint(\n workflowId: string,\n roundId: string,\n output: string,\n isFinal?: boolean,\n summaryName?: string,\n summaryDescription?: string,\n) {\n const wf = getWorkflow(workflowId);\n if (!wf) {\n return {\n content: [{\n type: \"text\" as const,\n text:\n `Workflow \"${workflowId}\" not found. ` +\n `Available: ${listWorkflows().map((w) => w.id).join(\", \")}.\\n\\n` +\n `This checkpoint was NOT saved. Continue the conversation — the facilitator has the context.`,\n }],\n };\n }\n\n const round = wf.rounds.find((r) => r.id === roundId);\n if (!round) {\n return {\n content: [{\n type: \"text\" as const,\n text:\n `Round \"${roundId}\" not found in workflow \"${workflowId}\". ` +\n `Available rounds: ${wf.rounds.map((r) => r.id).join(\", \")}.\\n\\n` +\n `This checkpoint was NOT saved. The conversation context is preserved — continue facilitating.`,\n }],\n };\n }\n\n const lines: string[] = [\n `## Checkpoint: Round ${round.num} — ${round.label}`,\n `Workflow: ${wf.name} (\\`${wf.id}\\`)`,\n \"\",\n ];\n\n if (isFinal && summaryName && summaryDescription) {\n requireWriteAccess();\n try {\n const result = await mcpMutation<{ docId: string; entryId: string }>(\"chain.createEntry\", {\n collectionSlug: wf.kbOutputCollection,\n name: summaryName,\n status: \"draft\",\n data: {\n [wf.kbOutputTemplate.descriptionField]: summaryDescription,\n workflowType: wf.id,\n completedRound: roundId,\n date: new Date().toISOString().split(\"T\")[0],\n },\n createdBy: `workflow:${wf.id}`,\n });\n\n lines.push(\n `**Draft Created**: \\`${result.entryId}\\``,\n `Collection: \\`${wf.kbOutputCollection}\\``,\n `Name: ${summaryName}`,\n \"\",\n `The summary is captured as a draft. Use \\`commit-entry entryId=\"${result.entryId}\"\\` to promote it to the Chain.`,\n `Use \\`graph action=suggest entryId=\"${result.entryId}\"\\` to discover connections.`,\n );\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n lines.push(\n `**Chain commit failed**: ${msg}`,\n \"\",\n `The retro output is preserved in this conversation. `,\n `You can manually create the entry later using \\`capture\\` with:`,\n `- Collection: \\`${wf.kbOutputCollection}\\``,\n `- Name: ${summaryName}`,\n `- Description: (copy from the conversation summary above)`,\n );\n }\n } else {\n lines.push(\n `Round ${round.num} output recorded.`,\n `Output: ${output.substring(0, 200)}${output.length > 200 ? \"...\" : \"\"}`,\n );\n\n const currentIdx = wf.rounds.findIndex((r) => r.id === roundId);\n if (currentIdx < wf.rounds.length - 1) {\n const next = wf.rounds[currentIdx + 1];\n lines.push(\n \"\",\n `**Next**: Round ${next.num} — ${next.label}`,\n `_${next.instruction}_`,\n );\n } else {\n lines.push(\n \"\",\n `**All rounds complete.** Call this tool again with \\`isFinal: true\\` to commit to the Chain.`,\n );\n }\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n}\n","/**\n * Chainwork Workflow Definitions — ARCH-node-mcp (Core layer)\n * Chain: GT-006 (MCP), FEAT-MCP-001\n *\n * Each workflow is a typed chain of rounds with facilitation instructions.\n * The agent uses these to drive structured conversations in Facilitator Mode.\n */\n\nexport interface WorkflowRound {\n id: string;\n num: string;\n label: string;\n type: \"open\" | \"choice\" | \"synthesis\" | \"commit\" | \"close\";\n instruction: string;\n facilitatorGuidance: string;\n questions?: WorkflowQuestion[];\n outputSchema: {\n field: string;\n description: string;\n format: \"freetext\" | \"list\" | \"choice\" | \"structured\";\n };\n kbCollection?: string;\n maxDurationHint?: string;\n}\n\nexport interface WorkflowQuestion {\n id: string;\n prompt: string;\n options?: { id: string; label: string }[];\n allowMultiple?: boolean;\n required?: boolean;\n}\n\nexport interface WorkflowDefinition {\n id: string;\n name: string;\n shortDescription: string;\n icon: string;\n facilitatorPreamble: string;\n rounds: WorkflowRound[];\n kbOutputCollection: string;\n kbOutputTemplate: {\n nameTemplate: string;\n descriptionField: string;\n };\n errorRecovery: string;\n}\n\n// ── Retro Workflow ──────────────────────────────────────────────────────────\n\nconst RETRO_WORKFLOW: WorkflowDefinition = {\n id: \"retro\",\n name: \"Retrospective\",\n shortDescription:\n \"Structured team retrospective — reflect, surface patterns, commit to actions. Commits a decision entry to the Chain.\",\n icon: \"◎\",\n facilitatorPreamble: `You are now in **Facilitator Mode**. You are not a coding assistant — you are a facilitator running a structured retrospective.\n\n## Your Behavior\n\n1. **Guide, don't solve.** Ask questions, reflect back, synthesize. Never jump to solutions.\n2. **One round at a time.** Complete each round fully before moving to the next. No skipping.\n3. **Use structured questions** (AskQuestion tool) for choices and multi-select. Use open conversation for reflection.\n4. **Create a Plan** at the start showing all rounds as tasks. Update it as you progress.\n5. **Synthesize between rounds.** After collecting input, reflect back what you heard before moving on.\n6. **Never go silent.** If something fails, say what happened and what to do next.\n7. **Commit to the Chain** at the end using the Product OS capture tool.\n8. **Match the energy.** Be warm but structured. This is a ceremony, not a checklist.\n\n## Communication Style\n\n- Start each round with its number, name, and a brief instruction\n- Use quotes and emphasis to reflect back what the participant said\n- End each round with a brief synthesis before transitioning\n- When a round is complete, mark it as done in the Plan\n- If the participant seems stuck, offer prompts — never pressure\n- If a tool call fails, explain what happened and offer an alternative path\n\n## Error Recovery\n\nIf at any point a tool call or MCP operation fails:\n1. Tell the participant what you were trying to do\n2. Explain what went wrong (briefly, no stack traces)\n3. Offer a manual alternative (e.g., \"I'll capture this in the conversation instead\")\n4. Continue the workflow — never halt completely\n\n## Plan Structure\n\nCreate a Cursor Plan with these rounds as tasks. Mark each in_progress as you enter it, completed when done.`,\n\n rounds: [\n {\n id: \"set-stage\",\n num: \"01\",\n label: \"Set the Stage\",\n type: \"choice\",\n instruction:\n \"Before we dive in, let's frame what we're reflecting on. What's the scope of this retro?\",\n facilitatorGuidance:\n \"Start warm. Ask the participant to pick or describe what they're retro-ing. Confirm the scope before proceeding. If they gave context already in their initial message, use it — don't make them repeat.\",\n questions: [\n {\n id: \"scope\",\n prompt:\n \"What are we reflecting on? Pick one or describe your own.\",\n options: [\n { id: \"last-week\", label: \"Last week's work\" },\n { id: \"last-sprint\", label: \"Last sprint/cycle\" },\n { id: \"specific-project\", label: \"A specific project or feature\" },\n { id: \"process\", label: \"A process or workflow\" },\n { id: \"custom\", label: \"Something else — let me describe it\" },\n ],\n },\n ],\n outputSchema: {\n field: \"scope\",\n description: \"What timeframe or project is being retro'd\",\n format: \"freetext\",\n },\n maxDurationHint: \"2 min\",\n },\n {\n id: \"what-went-well\",\n num: \"02\",\n label: \"What Went Well\",\n type: \"open\",\n instruction:\n \"Let's start with the good. What went well? What are you proud of? What should we do more of?\",\n facilitatorGuidance:\n \"Celebrate. Reflect back each win with genuine emphasis. Ask follow-ups like 'What made that work?' or 'Who else contributed to that?' Collect at least 3 items before synthesizing. Don't rush past the positive — teams skip this too fast.\",\n outputSchema: {\n field: \"wentWell\",\n description: \"List of things that went well\",\n format: \"list\",\n },\n maxDurationHint: \"5 min\",\n },\n {\n id: \"what-didnt-go-well\",\n num: \"03\",\n label: \"What Didn't Go Well\",\n type: \"open\",\n instruction:\n \"Now the harder part. What didn't go well? What frustrated you? Where did things break down?\",\n facilitatorGuidance:\n \"Create safety. Acknowledge that this is harder. Don't judge or immediately problem-solve — just listen and capture. Ask 'What was the impact of that?' and 'When did you first notice it?'. Reflect back without softening. Collect at least 3 items.\",\n outputSchema: {\n field: \"didntGoWell\",\n description: \"List of things that didn't go well\",\n format: \"list\",\n },\n maxDurationHint: \"5 min\",\n },\n {\n id: \"patterns\",\n num: \"04\",\n label: \"Patterns & Insights\",\n type: \"synthesis\",\n instruction:\n \"Looking at what went well and what didn't — what patterns do you see? What's the deeper insight?\",\n facilitatorGuidance:\n \"This is YOUR moment as facilitator. Synthesize what you've heard across rounds 2 and 3. Surface themes, connections, and contradictions. Propose 2-3 patterns and ask the participant to react. This round transforms raw observations into actionable insights. Don't let the participant skip the 'why' — push for root causes.\",\n outputSchema: {\n field: \"patterns\",\n description: \"Synthesized patterns and insights\",\n format: \"structured\",\n },\n maxDurationHint: \"5 min\",\n },\n {\n id: \"actions\",\n num: \"05\",\n label: \"Actions & Commitments\",\n type: \"commit\",\n instruction:\n \"Based on these patterns, what will we actually change? Be specific — who does what, by when?\",\n facilitatorGuidance:\n \"Push for specificity. 'Be better at X' is not an action. 'Randy will set up a 15-min weekly check-in by Friday' is. Each action needs an owner and a deadline. Aim for 2-4 concrete actions. Use AskQuestion to confirm the final list. These become the retro's output.\",\n questions: [\n {\n id: \"action-confirm\",\n prompt: \"Are these actions concrete enough to actually happen?\",\n options: [\n { id: \"yes\", label: \"Yes — these are clear and actionable\" },\n { id: \"refine\", label: \"Let me refine some of these\" },\n { id: \"add\", label: \"I want to add more\" },\n ],\n },\n ],\n outputSchema: {\n field: \"actions\",\n description: \"Committed actions with owners and deadlines\",\n format: \"structured\",\n },\n maxDurationHint: \"5 min\",\n },\n {\n id: \"close\",\n num: \"06\",\n label: \"Close & Capture\",\n type: \"close\",\n instruction:\n \"One last thing — in one sentence, what's the single most important thing you're taking away from this retro?\",\n facilitatorGuidance:\n \"Keep it brief. One sentence reflection. Then summarize the entire retro: scope, key wins, key pain points, patterns identified, actions committed. Ask if they want to commit this to the Chain. If yes, use capture to create a decision/tension entry. Thank them for the retro.\",\n outputSchema: {\n field: \"takeaway\",\n description: \"Single-sentence takeaway\",\n format: \"freetext\",\n },\n kbCollection: \"decisions\",\n maxDurationHint: \"2 min\",\n },\n ],\n\n kbOutputCollection: \"decisions\",\n kbOutputTemplate: {\n nameTemplate: \"Retro: {scope} — {date}\",\n descriptionField: \"rationale\",\n },\n\n errorRecovery: `If anything goes wrong during the retro:\n\n1. **MCP tool failure**: Skip the chain commit step. Summarize everything in the conversation instead. Suggest the participant runs \\`capture\\` manually later.\n2. **AskQuestion not available**: Fall back to numbered options in plain text. \"Reply with 1, 2, or 3.\"\n3. **Plan creation fails**: Continue without the Plan. The conversation IS the record.\n4. **Participant goes off-topic**: Gently redirect: \"That's valuable — let's capture it. For now, let's stay with [current round].\"\n5. **Participant wants to stop**: Respect it. Summarize what you have so far. Offer to commit partial results to the Chain.\n\nThe retro must never fail silently. Always communicate state.`,\n};\n\n// ── Shape Workflow ──────────────────────────────────────────────────────────\n\nconst SHAPE_WORKFLOW: WorkflowDefinition = {\n id: \"shape\",\n name: \"Shape a Bet\",\n shortDescription:\n \"Coached shaping session — problem → appetite → elements → architecture → de-risk → pitch. \" +\n \"Uses the `facilitate` tool for scoring and Chain capture.\",\n icon: \"◆\",\n facilitatorPreamble: `You are now in **Shaping Mode**. You are an **investigating** shaping facilitator powered by the \\`facilitate\\` tool and Cursor sub-agents.\n\n## Your Behavior\n\n1. **Start with \\`facilitate action=start\\`.** This creates a draft bet on the Chain and returns the Studio URL, initial coaching, and an investigationBrief.\n2. **Investigate before asking.** At each phase transition, read the \\`investigationBrief\\` in the structured response. Spawn sub-agents to search the codebase and Chain. Synthesize findings into proposals. Present proposals for user reaction.\n3. **Use \\`facilitate action=respond\\` for every input.** Pass the user's text, betEntryId, dimension, and the \\`source\\` field:\n - \\`source=\"user\"\\` — user typed this directly (default, full score weight)\n - \\`source=\"agent_proposal\"\\` — you generated this proposal text (discounted score)\n - \\`source=\"user_reaction\"\\` — user reacting to your proposal (full score weight)\n4. **Read the structured response carefully.** The coaching object tells you what to say next. The scorecard tells you what's missing. The investigationBrief tells you what to investigate for the next phase.\n5. **One dimension at a time.** Follow the round progression below. Don't dump all dimensions at once.\n6. **Push back with evidence.** Don't just ask \"Who's affected?\" — search the codebase for evidence and say \"I found 3 workarounds in the codebase related to this. Here's what they suggest about the problem.\"\n7. **Capture elements and risks inline** using the \\`capture\\` parameter on respond calls. Each becomes a Chain entry with a relation to the bet.\n8. **CRITICAL: Elements, rabbit holes, and no-gos MUST use the \\`capture\\` parameter.** Never pass them as plain \\`userInput\\` without \\`capture\\`. Without \\`capture\\`, nothing is saved to the bet — the data is silently lost. Always include \\`capture={type:\"element\"|\"risk\"|\"noGo\", name:\"...\", description:\"...\"}\\` for every structured item. Each element, risk, and no-go needs its own \\`respond\\` call with \\`capture\\`.\n9. **When captureReady is true, offer to finalize** — but don't force it. The user decides when the shape is complete.\n\n## Investigation Pattern (ENT-59)\n\nAt phase transitions, follow this pattern:\n1. Read the \\`investigationBrief\\` from the structured response\n2. Spawn sub-agents in parallel (max 2, 30s budget each):\n - \\`explore\\` sub-agent: codebase searches (files, patterns, architecture)\n - \\`generalPurpose\\` sub-agent: Chain searches (entries, governance, context)\n3. Synthesize findings into a concrete proposal (cite files and entry IDs)\n4. Present the proposal for user reaction — \"Based on the codebase, I'd suggest...\"\n5. Score the user's reaction with \\`source=\"user_reaction\"\\` (full weight)\n\nIf investigation fails or times out, continue with the conversation — the user's knowledge is always the primary input.\n\n## DEC-56 Boundary\n\nThe **server judges** — it scores input against 6 rubric dimensions, detects overlap, checks governance alignment. Agent-generated text is scored at ${0.6}x weight to prevent keyword inflation (RH1).\n**You coach** — you interpret the structured response, synthesize naturally, investigate proactively, propose grounded solutions, and push back when shaping isn't sharp.\nThe \\`coaching.suggestedQuestion\\` is a suggestion, not a script — rephrase or skip based on conversation flow.\n\n## Error Recovery\n\nIf any facilitate call fails:\n1. Tell the user what you were trying to do\n2. Explain what went wrong (one sentence)\n3. Continue shaping — the conversation IS the backup\n4. Suggest retrying or capturing manually later\n\n## Communication Style\n\n- Start each round with its phase header\n- Keep chat messages to 5 lines or fewer — heavy context degrades performance\n- Use AskQuestion for structured choices (appetite, gates)\n- Synthesize between phases — reflect what was decided before moving on\n- When proposing, cite evidence: \"I found X in the codebase\" or \"The Chain has DEC-Y about this\"\n- If the user seems stuck, investigate and propose rather than just asking`,\n\n rounds: [\n {\n id: \"context\",\n num: \"01\",\n label: \"Gather Context\",\n type: \"open\",\n instruction:\n \"Before shaping, let's see what the Chain already knows. Search for related entries, business rules, and existing decisions.\",\n facilitatorGuidance:\n \"**Investigate proactively.** Spawn sub-agents in parallel: \" +\n \"(1) `explore` agent to search the codebase for code related to the bet topic — find modules, patterns, and pain points. \" +\n \"(2) `generalPurpose` agent to search the Chain: call `orient`, use `entries action=search` with keywords, surface related tensions, active bets, and applicable business rules. \" +\n \"Synthesize both into a 3-5 line context brief: what the codebase reveals, what the Chain knows, what governance applies. \" +\n \"Present with IDs and file paths. Then transition: 'Here's what I found. Does this match the problem you're seeing?'\",\n outputSchema: {\n field: \"context\",\n description: \"Chain context: related entries, governance, existing decisions\",\n format: \"structured\",\n },\n maxDurationHint: \"2 min\",\n },\n {\n id: \"framing\",\n num: \"02\",\n label: \"Frame the Problem\",\n type: \"open\",\n instruction:\n \"What's the problem? Who's affected? What's the workaround today? How much time is this worth?\",\n facilitatorGuidance:\n \"This round covers problem_clarity AND appetite. \" +\n \"If the investigationBrief has framing tasks, search the codebase for workarounds, TODOs, and hacks related to the problem — cite what you find as evidence. \" +\n \"Call `facilitate action=respond` with dimension='problem_clarity' for the problem input, \" +\n \"then dimension='appetite' for the time budget. Push with evidence: 'I found 3 workaround patterns in the codebase — this suggests the problem is bigger than it looks.' \" +\n \"Use AskQuestion for appetite: Small Batch (1-2 weeks) or Big Batch (6 weeks). \" +\n \"When both dimensions score 6+, present the frame and ask for Frame Go confirmation. \" +\n \"If new terms surfaced, capture them to the glossary via `capture`. If tensions surfaced, capture them too.\",\n questions: [\n {\n id: \"appetite\",\n prompt: \"How much time is this idea worth? Not how long it'll take — how much are you willing to invest?\",\n options: [\n { id: \"small\", label: \"Small Batch — 1-2 weeks, focused scope\" },\n { id: \"big\", label: \"Big Batch — 6 weeks, full treatment\" },\n ],\n },\n {\n id: \"frame-go\",\n prompt: \"Frame Go — the problem is tight enough to shape a solution. Proceed to elements?\",\n options: [\n { id: \"go\", label: \"Frame Go — move to elements\" },\n { id: \"refine\", label: \"Refine the frame — something's not right\" },\n ],\n },\n ],\n outputSchema: {\n field: \"framing\",\n description: \"Confirmed problem statement and appetite\",\n format: \"structured\",\n },\n kbCollection: \"bets\",\n maxDurationHint: \"10 min\",\n },\n {\n id: \"elements\",\n num: \"03\",\n label: \"Find the Elements\",\n type: \"open\",\n instruction:\n \"What are the solution elements? Think breadboard level — places, affordances, connections. What's the architecture?\",\n facilitatorGuidance:\n \"**Investigate first.** Read the investigationBrief. Spawn sub-agents to search the codebase for affected modules, existing architecture patterns, and API boundaries. \" +\n \"Synthesize findings into 3-5 proposed solution elements at breadboard level, citing specific files and modules. \" +\n \"Present proposals for user reaction: 'Based on the codebase, here are the elements I'd suggest.' \" +\n \"For each confirmed element, capture with its own respond call: \" +\n \"`facilitate action=respond betEntryId='...' dimension='elements' source='user_reaction' userInput='...' capture={type:'element', name:'Element Name', description:'What it does'}`. \" +\n \"Without the `capture` parameter, the element is NOT saved to the bet — you will get a WARNING if you forget. \" +\n \"Each captured element becomes a features entry linked to the bet via part_of. \" +\n \"For Big Batch: also investigate architecture — search for layer boundaries and dependency directions, then propose architecture. \" +\n \"Call respond with dimension='architecture' for architecture input (no capture needed — free-form text). \" +\n \"Check business rules: do any elements conflict with governance surfaced in Round 1? \" +\n \"Capture new glossary terms and decisions as they surface. \" +\n \"Aim for 3-5 elements. When elements score 6+ (and architecture for Big Batch), present for confirmation.\",\n outputSchema: {\n field: \"elements\",\n description: \"Core solution elements and architecture\",\n format: \"structured\",\n },\n kbCollection: \"features\",\n maxDurationHint: \"15 min\",\n },\n {\n id: \"derisking\",\n num: \"04\",\n label: \"De-risk — Rabbit Holes & No-Gos\",\n type: \"open\",\n instruction:\n \"What could go wrong? What are we NOT building? Walk through the solution slowly and find the risks.\",\n facilitatorGuidance:\n \"**Investigate first.** Read the investigationBrief. Spawn sub-agents to search the codebase for fragile code, tight coupling, missing tests, performance-sensitive paths, and external dependencies near the affected modules. \" +\n \"Propose risks with evidence: 'I found that X module has no tests and is tightly coupled to Y — this is a rabbit hole.' \" +\n \"Every confirmed risk MUST be captured with its own respond call: \" +\n \"`facilitate action=respond betEntryId='...' dimension='risks' source='user_reaction' userInput='...' capture={type:'risk', name:'Risk Name', description:'What could go wrong', theme:'implementation'}`. \" +\n \"Each becomes a tensions entry linked to the bet via constrains. Push for mitigations — every risk needs a patch or explicit acceptance. \" +\n \"Then declare no-gos: 'Based on what I've seen, I'd suggest these no-gos.' Every no-go MUST use capture: \" +\n \"`facilitate action=respond betEntryId='...' dimension='boundaries' source='user_reaction' userInput='...' capture={type:'noGo', name:'No-Go Title', description:'Why we are not doing this'}`. \" +\n \"Without the `capture` parameter on each call, the item is NOT saved — you will get a WARNING. \" +\n \"When risks score 6+ and boundaries score 4+, present Shape Go gate: 'Is this buildable within the appetite?'\",\n questions: [\n {\n id: \"shape-go\",\n prompt: \"Shape Go — the solution fits the appetite and risks are managed. Proceed to validation?\",\n options: [\n { id: \"go\", label: \"Shape Go — move to validation\" },\n { id: \"cut\", label: \"Cut scope — this grew beyond appetite\" },\n { id: \"refine\", label: \"Refine — more de-risking needed\" },\n ],\n },\n ],\n outputSchema: {\n field: \"derisking\",\n description: \"Rabbit holes with patches, explicit no-gos\",\n format: \"structured\",\n },\n kbCollection: \"tensions\",\n maxDurationHint: \"10 min\",\n },\n {\n id: \"validation\",\n num: \"05\",\n label: \"Validate & Build Contract\",\n type: \"synthesis\",\n instruction:\n \"Check completeness. Generate the build contract. Review the full scorecard.\",\n facilitatorGuidance:\n \"Call `facilitate action=score` to get the full scorecard. Present it as a table. \" +\n \"Check: does the response include a buildContract? If captureReady is true, it should. \" +\n \"Verify the 5 core ingredients: Problem, Appetite, Solution elements, Rabbit Holes, No-Gos. \" +\n \"For Big Batch: also verify Architecture, narrative hook, and value-flow annotations. \" +\n \"Present the build contract. Ask: 'Anything to adjust before we capture to the Chain?'\",\n outputSchema: {\n field: \"validation\",\n description: \"Completeness check result and build contract\",\n format: \"structured\",\n },\n maxDurationHint: \"5 min\",\n },\n {\n id: \"capture\",\n num: \"06\",\n label: \"Capture & Commit\",\n type: \"close\",\n instruction:\n \"Capture the pitch to the Chain. Commit draft entries. Connect the constellation.\",\n facilitatorGuidance:\n \"List all draft entries created during shaping (elements, risks, decisions, glossary terms). \" +\n \"Ask the user to confirm: 'Ready to commit these to the Chain?' \" +\n \"For each confirmed entry: `commit-entry entryId='...'`. \" +\n \"Then `graph action=suggest entryId='<betId>'` to discover connections. \" +\n \"Create the top 3 suggested relations. Update the bet status from 'shaping' to 'shaped'. \" +\n \"Thank the user and summarize: how many entries captured, relations created, Chain enrichment.\",\n outputSchema: {\n field: \"capture\",\n description: \"Final capture summary — entries committed, relations created\",\n format: \"structured\",\n },\n kbCollection: \"bets\",\n maxDurationHint: \"5 min\",\n },\n ],\n\n kbOutputCollection: \"bets\",\n kbOutputTemplate: {\n nameTemplate: \"{betName}\",\n descriptionField: \"problem\",\n },\n\n errorRecovery: `If anything goes wrong during shaping:\n\n1. **facilitate tool failure**: Continue the conversation. The shaping knowledge is in the chat. Suggest retrying the tool call or capturing manually later.\n2. **Chain capture failure (duplicate)**: The tool handles duplicates by linking existing entries. If it still fails, note the entry name and move on — capture manually after the session.\n3. **Score seems wrong**: Call \\`facilitate action=score\\` to get a clean read. Scores are heuristic — the agent's judgment matters more than the number.\n4. **User wants to stop mid-session**: Respect it. Everything captured so far is on the Chain as drafts. Use \\`facilitate action=resume\\` to pick up later.\n5. **MCP server unreachable**: Run the shaping from conversation knowledge. Skip chain capture. Say: \"Product Brain is temporarily unavailable — I'll shape from our conversation and we can commit afterward.\"\n\nThe shaping must never fail silently. Always communicate state.`,\n};\n\n// ── Workflow Registry ───────────────────────────────────────────────────────\n\nconst WORKFLOWS = new Map<string, WorkflowDefinition>([\n [\"retro\", RETRO_WORKFLOW],\n [\"shape\", SHAPE_WORKFLOW],\n]);\n\nexport function getWorkflow(id: string): WorkflowDefinition | undefined {\n return WORKFLOWS.get(id);\n}\n\nexport function listWorkflows(): WorkflowDefinition[] {\n return Array.from(WORKFLOWS.values());\n}\n\nexport function getWorkflowIds(): string[] {\n return Array.from(WORKFLOWS.keys());\n}\n","/**\n * Facilitate compound tool — coached shaping sessions with real-time Chain capture.\n *\n * Actions: start, respond, score, resume\n * Session type: \"shape\" (only type in v1, parameter exists for forward-compat)\n *\n * Chain: ENT-37 (Facilitate v1), DEC-56 (PB judges, agents coach),\n * STA-1 (Constellation Capture Pattern)\n * Rules: BR-8 (session required), BR-22 (single impl), BR-25 (MCP layer),\n * BR-70 (audit trail)\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n mcpQuery,\n mcpMutation,\n getWorkspaceContext,\n requireWriteAccess,\n recordSessionActivity,\n getAgentSessionId,\n runWithToolContext,\n} from \"../client.js\";\nimport {\n type Scorecard,\n type ShapingDimension,\n type ShapingPhase,\n type ScoringContext,\n type BuildContractContext,\n type ResponseSource,\n DIMENSIONS,\n DIMENSION_LABELS,\n PHASE_LABELS,\n SUGGESTED_ORDER,\n buildScorecard,\n buildDetailedScorecard,\n scoreDimension,\n isCaptureReady,\n inferActiveDimension,\n inferPhase,\n completedDimensions,\n activeDimensions,\n suggestCaptures,\n generateBuildContract,\n buildInvestigationBrief,\n} from \"./facilitate-rubrics.js\";\nimport { computeCommitBlockers, type CommitBlocker } from \"./facilitate-validation.js\";\nimport type { FacilitateResponseV2 } from \"./facilitate-contract.js\";\nimport {\n appendElement,\n appendRabbitHole,\n appendNoGo,\n formatCriteriaLine,\n} from \"./facilitate-format.js\";\n\n// ── Schema ─────────────────────────────────────────────────────────────────\n\nconst FACILITATE_ACTIONS = [\"start\", \"respond\", \"score\", \"resume\", \"commit-constellation\"] as const;\n\nconst captureItemSchema = z.object({\n type: z.enum([\"element\", \"risk\", \"noGo\", \"decision\"]).describe(\"What to capture\"),\n name: z.string().describe(\"Entry name\"),\n description: z.string().describe(\"Entry description\"),\n theme: z.string().optional().describe(\"Risk theme (for risk type)\"),\n});\n\nexport const facilitateSchema = z.object({\n action: z.enum(FACILITATE_ACTIONS).describe(\n \"'start': create draft bet and begin session. \" +\n \"'respond': process user input, score, capture, return coaching. \" +\n \"'score': return current scorecard without advancing. \" +\n \"'resume': reconstruct session from existing bet entry. \" +\n \"'commit-constellation': atomically commit a bet and all its linked draft entries in one call. Requires betEntryId.\",\n ),\n sessionType: z.enum([\"shape\"]).default(\"shape\").optional()\n .describe(\"Session type. Only 'shape' in v1.\"),\n betEntryId: z.string().optional()\n .describe(\"Bet entry ID. Required for resume/score. For respond: omit on first call after start (entry created automatically); required for subsequent calls.\"),\n operationId: z.string().optional()\n .describe(\"Optional idempotency key for commit-constellation retries.\"),\n userInput: z.string().optional()\n .describe(\"User's input text for respond action.\"),\n dimension: z.string().optional()\n .describe(\"Explicit dimension to score against (e.g. 'problem_clarity'). If omitted, inferred from scorecard.\"),\n betName: z.string().optional()\n .describe(\"Name for the bet (used in start action).\"),\n source: z.enum([\"user\", \"agent_proposal\", \"user_reaction\"]).default(\"user\").optional()\n .describe(\"ENT-59: Source of the input text. 'user' = typed by user (default, full score weight). 'agent_proposal' = agent-generated proposal (discounted score). 'user_reaction' = user reacting to agent proposal (full weight).\"),\n\n capture: z.union([\n captureItemSchema,\n z.array(captureItemSchema).max(15),\n ]).optional().describe(\"Entry or entries to capture alongside the respond action. Accepts a single object or an array (max 15) for batch capture.\"),\n});\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\ninterface SessionDraft {\n entryId: string;\n name: string;\n collection: string;\n relationType: string;\n status: string;\n}\n\ninterface BetEntry {\n _id: string;\n entryId: string | null;\n name: string;\n status: string;\n data?: Record<string, unknown>;\n}\n\ninterface RelationEntry {\n fromId: string;\n toId: string;\n type: string;\n}\n\n// ── Registration ───────────────────────────────────────────────────────────\n\nexport function registerFacilitateTools(server: McpServer): void {\n server.registerTool(\n \"facilitate\",\n {\n title: \"Facilitate — Coached Shaping\",\n description:\n \"Server-controlled coached shaping session with real-time Chain capture.\\n\\n\" +\n \"- **start**: Create a draft bet on the Chain and begin a coached session. Returns Studio URL, initial context, and first coaching prompt.\\n\" +\n \"- **respond**: Process user input — scores against 7 shaping rubrics (problem, appetite, elements, architecture, risks, boundaries, done-when), searches for overlap, captures to Chain, returns structured coaching response with phase tracking.\\n\" +\n \"- **score**: Return the current scorecard without advancing the session.\\n\" +\n \"- **resume**: Reconstruct session state from an existing bet entry on the Chain.\\n\" +\n \"- **commit-constellation**: Atomically commit a bet and all its linked draft entries (features, tensions, decisions) in one call. Validates strategy link and required fields before committing anything. Replaces 9-13 sequential commit-entry calls.\\n\\n\" +\n \"The structured response separates judgment (server) from coaching (agent) per DEC-56. \" +\n \"Read the phase, scorecard, and coaching fields to determine what to say next. \" +\n \"When captureReady is true, buildContract is auto-generated from Chain governance.\",\n inputSchema: facilitateSchema,\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: false,\n },\n },\n async (args) => {\n const parsed = facilitateSchema.safeParse(args);\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \");\n return {\n content: [{ type: \"text\" as const, text: `Invalid arguments: ${issues}` }],\n };\n }\n\n const { action } = parsed.data;\n\n return runWithToolContext({ tool: \"facilitate\", action }, async () => {\n switch (action) {\n case \"start\":\n return handleStart(parsed.data);\n case \"respond\":\n return handleRespond(parsed.data);\n case \"score\":\n return handleScore(parsed.data);\n case \"resume\":\n return handleResume(parsed.data);\n case \"commit-constellation\":\n return handleCommitConstellation(parsed.data);\n default:\n return {\n content: [{\n type: \"text\" as const,\n text: `Unknown action '${action}'. Valid: ${FACILITATE_ACTIONS.join(\", \")}.`,\n }],\n };\n }\n });\n },\n );\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nfunction buildStudioUrl(workspaceSlug: string, entryId: string): string {\n const appUrl = process.env.PRODUCTBRAIN_APP_URL ?? \"https://productbrain.io\";\n return `${appUrl}/${workspaceSlug}/studio/entries/${entryId}`;\n}\n\n// ── Agent Directives ────────────────────────────────────────────────────────\n// Text-based directives that work in ANY client mode (Composer, Agent, Ask).\n// ENT-59: Directives now include investigation briefs — the agent investigates\n// the codebase and Chain before proposing to the user.\n\nfunction buildDirective(\n scorecard: Scorecard,\n phase: ShapingPhase,\n betEntryId: string,\n captureReady: boolean,\n activeDimension?: ShapingDimension,\n nextDimension?: ShapingDimension,\n): string | null {\n const b = betEntryId;\n\n if (scorecard.problem_clarity >= 6 && scorecard.appetite === 0) {\n return [\n `Present this to the user exactly as formatted:`,\n ``,\n `**Appetite** — How much time is this idea worth? (Not how long it takes — how much you're willing to invest.)`,\n `1. **Small Batch** — 1-2 weeks, focused scope`,\n `2. **Big Batch** — 6 weeks, full treatment`,\n ``,\n `Wait for their answer. Then call \\`facilitate action=respond betEntryId=\"${b}\" dimension=\"appetite\"\\` with their choice.`,\n ].join(\"\\n\");\n }\n\n if (scorecard.problem_clarity >= 6 && scorecard.appetite >= 6 && scorecard.elements === 0) {\n return [\n `Synthesize the problem and appetite back to the user in 2-3 lines, then present:`,\n ``,\n `**Frame Go** — The problem is framed and appetite is set.`,\n `1. **Go** — move to solution elements`,\n `2. **Refine** — something's not right, let's adjust`,\n ``,\n `If Go: **investigate first** — use the investigationBrief in the structured response to search the codebase and Chain.`,\n `Spawn sub-agents to explore the codebase for affected modules, existing architecture, and related patterns.`,\n `Then propose 3-5 solution elements grounded in what you found.`,\n `Present proposals for user reaction: \"Based on the codebase, here are the elements I'd suggest. Which feel right?\"`,\n `For each confirmed element, call \\`facilitate action=respond betEntryId=\"${b}\" dimension=\"elements\" source=\"user_reaction\"\\` with the user's reaction.`,\n `If Refine: ask what needs adjusting, then call respond with dimension=\"problem_clarity\" or \"appetite\".`,\n ].join(\"\\n\");\n }\n\n if (phase === \"derisking\" && scorecard.elements >= 6 && scorecard.risks >= 4 && scorecard.boundaries >= 4) {\n return [\n `Synthesize the shape so far in 3-4 lines, then present:`,\n ``,\n `**Shape Go** — Elements defined, risks covered.`,\n `1. **Go** — validate and capture the pitch`,\n `2. **Refine** — there's more to cover`,\n ``,\n `If Go: call \\`facilitate action=score betEntryId=\"${b}\"\\` and present the full scorecard.`,\n `If Refine: ask what needs work, continue with respond.`,\n ].join(\"\\n\");\n }\n\n if (captureReady) {\n return [\n `Present the full scorecard, then:`,\n ``,\n `**Ready to commit?**`,\n `1. **Commit** — publish to the Chain as source of truth`,\n `2. **Review** — show the full pitch first`,\n `3. **Keep as draft** — not ready yet`,\n ``,\n `If Commit: call \\`facilitate action=commit-constellation betEntryId=\"${b}\"\\` to publish the bet and all linked entries in one call.`,\n `If Review: call \\`facilitate action=score betEntryId=\"${b}\"\\` for the detailed view.`,\n `If Draft: acknowledge and end the session.`,\n ].join(\"\\n\");\n }\n\n // Default: guide to the next dimension with investigation-first approach\n if (nextDimension && nextDimension !== activeDimension) {\n const nextLabel = DIMENSION_LABELS[nextDimension];\n const investigationPhases: ShapingDimension[] = [\"elements\", \"architecture\", \"risks\", \"boundaries\"];\n const shouldInvestigate = investigationPhases.includes(nextDimension);\n\n if (shouldInvestigate) {\n return [\n `Briefly synthesize what was just covered (2 lines max), then move to **${nextLabel}**.`,\n `**Investigate first:** Use the investigationBrief to search the codebase and Chain before asking the user.`,\n `Spawn sub-agents to gather evidence, then propose findings for user reaction.`,\n `After the user reacts, call \\`facilitate action=respond betEntryId=\"${b}\" dimension=\"${nextDimension}\" source=\"user_reaction\"\\` with their reaction.`,\n `If the user provides their own input instead, call with source=\"user\".`,\n ].join(\"\\n\");\n }\n\n return [\n `Briefly synthesize what was just covered (2 lines max), then move to **${nextLabel}**.`,\n `Ask ONE open question about ${nextLabel.toLowerCase()}. Keep it to 3 lines.`,\n `After the user answers, call \\`facilitate action=respond betEntryId=\"${b}\" dimension=\"${nextDimension}\"\\` with their input.`,\n ].join(\"\\n\");\n }\n\n return null;\n}\n\nfunction emptyScorecard(): Scorecard {\n return { problem_clarity: 0, appetite: 0, elements: 0, architecture: 0, risks: 0, boundaries: 0, done_when: 0 };\n}\n\nfunction detectSmallBatch(appetiteText: string): boolean {\n if (!appetiteText) return false;\n return /small\\s*batch|1[-–]2\\s*week|2[-–]week|one.?week|two.?week/i.test(appetiteText);\n}\n\ninterface ContentEvidence {\n elementCount: number;\n riskCount: number;\n noGoCount: number;\n hasArchitectureText: boolean;\n}\n\nfunction buildCachedScoringContext(\n betData: Record<string, unknown>,\n constellation: { relations: RelationEntry[]; elementCount: number; riskCount: number; decisionCount: number },\n): ScoringContext {\n const cachedOverlapIds = typeof betData._overlapIds === \"string\"\n ? betData._overlapIds.split(\",\").filter((id: string) => id && id !== \"_checked\")\n : [];\n const cachedGovCount = typeof betData._governanceCount === \"number\" ? betData._governanceCount : 0;\n const syntheticChainSurfaced = Array.from({ length: cachedGovCount }, () => ({ collection: \"principles\" }));\n return buildScoringContext(\"\", betData, constellation, cachedOverlapIds, syntheticChainSurfaced);\n}\n\nfunction extractContentEvidence(ctx: ScoringContext): ContentEvidence {\n return {\n elementCount: ctx.elementCount,\n riskCount: ctx.riskCount,\n noGoCount: ctx.noGoCount,\n hasArchitectureText: ctx.hasArchitectureText,\n };\n}\n\nfunction emptyResponse(betEntryId: string, studioUrl: string): FacilitateResponseV2 {\n return {\n version: 2,\n phase: \"context\",\n phaseLabel: PHASE_LABELS.context,\n scorecard: emptyScorecard(),\n overlap: [],\n alignment: [],\n chainSurfaced: [],\n suggestedCaptures: [],\n sessionDrafts: [],\n coaching: {\n observation: \"New shaping session started\",\n missing: [\"Problem statement\", \"Appetite\", \"Solution elements\", \"Architecture\", \"Risks\", \"Boundaries\", \"Done-when criteria\"],\n pushback: \"\",\n suggestedQuestion: \"Describe the problem you want to solve. Who's affected? What's the workaround today?\",\n captureReady: false,\n nextDimension: \"problem_clarity\",\n },\n captured: {\n betEntryId,\n studioUrl,\n entriesCreated: [],\n relationsCreated: 0,\n },\n captureErrors: [],\n navigation: {\n completedDimensions: [],\n activeDimension: \"problem_clarity\",\n suggestedOrder: [...SUGGESTED_ORDER],\n },\n };\n}\n\nasync function loadBetEntry(entryId: string): Promise<BetEntry | null> {\n try {\n return await mcpQuery<BetEntry>(\"chain.getEntry\", { entryId });\n } catch {\n return null;\n }\n}\n\nasync function loadConstellationState(betEntryId: string, betInternalId?: string): Promise<{\n relations: RelationEntry[];\n elementCount: number;\n riskCount: number;\n decisionCount: number;\n}> {\n try {\n const relations = await mcpQuery<RelationEntry[]>(\"chain.listEntryRelations\", {\n entryId: betEntryId,\n });\n\n const internalId = betInternalId ?? (await loadBetEntry(betEntryId))?._id;\n const elementCount = relations.filter(\n (r) => r.type === \"part_of\" && r.toId === internalId,\n ).length;\n const riskCount = relations.filter((r) => r.type === \"constrains\").length;\n const decisionCount = relations.filter((r) => r.type === \"informs\").length;\n\n return { relations, elementCount, riskCount, decisionCount };\n } catch {\n return { relations: [], elementCount: 0, riskCount: 0, decisionCount: 0 };\n }\n}\n\nconst RELATION_TO_COLLECTION: Record<string, string> = {\n part_of: \"features\",\n constrains: \"tensions\",\n informs: \"decisions\",\n};\n\nasync function loadSessionDrafts(betEntryId: string, betInternalId?: string): Promise<SessionDraft[]> {\n try {\n const relations = await mcpQuery<RelationEntry[]>(\"chain.listEntryRelations\", {\n entryId: betEntryId,\n });\n const internalId = betInternalId ?? (await loadBetEntry(betEntryId))?._id;\n\n const incoming = relations.filter(\n (r) => r.toId === internalId && [\"part_of\", \"constrains\", \"informs\"].includes(r.type),\n );\n\n const drafts: SessionDraft[] = [];\n for (const rel of incoming.slice(0, 15)) {\n try {\n const entry = await mcpQuery<{ entryId: string | null; name: string; status: string }>(\n \"chain.getEntry\", { id: rel.fromId },\n );\n if (entry?.entryId) {\n drafts.push({\n entryId: entry.entryId,\n name: entry.name,\n collection: RELATION_TO_COLLECTION[rel.type] ?? \"unknown\",\n relationType: rel.type,\n status: entry.status ?? \"draft\",\n });\n }\n } catch {\n // Entry may have been deleted — skip\n }\n }\n return drafts;\n } catch {\n return [];\n }\n}\n\nfunction buildScoringContext(\n userInput: string,\n betData: Record<string, unknown>,\n constellation: { elementCount: number; riskCount: number; decisionCount: number },\n overlapIds: string[],\n chainResults: Array<{ collection: string }> = [],\n activeDimension?: ShapingDimension,\n source: ResponseSource = \"user\",\n): ScoringContext {\n const str = (key: string) => (betData[key] as string) ?? \"\";\n\n const accParts = [\n str(\"problem\"), str(\"appetite\"), str(\"elements\"),\n str(\"architecture\"), str(\"rabbitHoles\"), str(\"noGos\"), str(\"done_when\"), str(\"doneWhen\"),\n str(\"solution\"), userInput,\n ];\n\n const noGoText = str(\"noGos\");\n const noGoCount = (noGoText.match(/^- \\*\\*/gm) ?? []).length;\n\n const elementsText = str(\"elements\");\n const elementHeaderCount = (elementsText.match(/###\\s*Element\\s*\\d/gi) ?? []).length;\n\n const governanceCollections = new Set([\"principles\", \"standards\", \"business-rules\"]);\n const governanceCount = chainResults.filter((e) => governanceCollections.has(e.collection)).length;\n const hasArchitectureText = str(\"architecture\").length > 20;\n\n const join = (...parts: string[]) => parts.filter(Boolean).join(\"\\n\\n\");\n const inputFor = (dim: ShapingDimension) => activeDimension === dim ? userInput : \"\";\n\n const dimensionTexts: Record<ShapingDimension, string> = {\n problem_clarity: join(str(\"problem\"), inputFor(\"problem_clarity\")),\n appetite: join(str(\"appetite\"), inputFor(\"appetite\")),\n elements: join(str(\"elements\"), str(\"solution\"), inputFor(\"elements\")),\n architecture: join(str(\"architecture\"), inputFor(\"architecture\")),\n risks: join(str(\"rabbitHoles\"), inputFor(\"risks\")),\n boundaries: join(str(\"noGos\"), inputFor(\"boundaries\")),\n done_when: join(str(\"done_when\"), str(\"doneWhen\"), inputFor(\"done_when\")),\n };\n\n return {\n userInput,\n accumulatedText: accParts.filter(Boolean).join(\"\\n\\n\"),\n dimensionTexts,\n existingEntryIds: overlapIds,\n elementCount: Math.max(constellation.elementCount, elementHeaderCount),\n riskCount: constellation.riskCount,\n noGoCount,\n\n governanceCount,\n decisionCount: constellation.decisionCount,\n hasArchitectureText,\n source,\n };\n}\n\ninterface ChainSearchResult {\n entryId: string;\n name: string;\n collection: string;\n}\n\nasync function searchChain(\n text: string,\n opts: { maxResults?: number; excludeIds?: string[] } = {},\n): Promise<ChainSearchResult[]> {\n const { maxResults = 8, excludeIds = [] } = opts;\n if (text.length < 10) return [];\n const query = text.slice(0, 300);\n try {\n const results = await mcpQuery<Array<{ entryId: string | null; name: string; collectionSlug?: string }>>(\n \"chain.searchEntries\",\n { query },\n );\n const excluded = new Set(excludeIds);\n return (results ?? [])\n .filter((e) => e.entryId && !excluded.has(e.entryId))\n .slice(0, maxResults)\n .map((e) => ({\n entryId: e.entryId!,\n name: e.name,\n collection: e.collectionSlug ?? \"unknown\",\n }));\n } catch {\n return [];\n }\n}\n\n/**\n * When createEntry fails with \"Duplicate entry\", search for the existing entry\n * and link it to the bet instead of failing silently.\n */\nasync function findAndLinkExisting(\n name: string,\n collectionSlug: string,\n betEntryId: string,\n relationType: string,\n): Promise<{ entryId: string; linked: boolean } | null> {\n try {\n const results = await mcpQuery<Array<{ entryId: string | null; name: string; collectionSlug?: string }>>(\n \"chain.searchEntries\",\n { query: name },\n );\n const match = (results ?? []).find(\n (r) => r.entryId && r.name.toLowerCase() === name.toLowerCase() &&\n (r.collectionSlug === collectionSlug || !r.collectionSlug),\n );\n if (!match?.entryId) return null;\n\n try {\n await mcpMutation(\"chain.createEntryRelation\", {\n fromEntryId: match.entryId,\n toEntryId: betEntryId,\n type: relationType,\n });\n await recordSessionActivity({ relationCreated: true });\n return { entryId: match.entryId, linked: true };\n } catch {\n return { entryId: match.entryId, linked: false };\n }\n } catch {\n return null;\n }\n}\n\n// ── Action Handlers ────────────────────────────────────────────────────────\n\nasync function handleStart(args: z.infer<typeof facilitateSchema>) {\n requireWriteAccess();\n\n const betName = args.betName ?? \"Untitled Bet (Shaping)\";\n\n let orientContext = \"\";\n try {\n const orient = await mcpQuery<{\n strategicContext: { vision: string | null; activeBetCount: number; activeTensionCount: number };\n activeBets: Array<{ entryId: string | null; name: string }>;\n }>(\"chain.getOrientEntries\", {});\n\n const sc = orient?.strategicContext;\n const parts: string[] = [];\n if (sc?.vision) parts.push(`Vision: ${sc.vision}`);\n if (sc?.activeBetCount) parts.push(`${sc.activeBetCount} active bet(s)`);\n if (sc?.activeTensionCount) parts.push(`${sc.activeTensionCount} open tension(s)`);\n if (orient?.activeBets?.length) {\n parts.push(\"Active bets: \" + orient.activeBets.map((b) => `${b.entryId ?? \"?\"} ${b.name}`).join(\", \"));\n }\n orientContext = parts.join(\". \");\n } catch {\n orientContext = \"Could not load workspace context.\";\n }\n\n const investigationBrief = buildInvestigationBrief(\"context\", betName, \"pending\");\n const response = emptyResponse(\"pending\", \"\");\n if (investigationBrief) {\n response.investigationBrief = investigationBrief;\n }\n\n const output = [\n `# Shaping Session Started`,\n \"\",\n `**Bet:** ${betName} (draft entry will be created when you describe the problem)`,\n `**Phase:** ${PHASE_LABELS.context}`,\n \"\",\n orientContext ? `**Workspace context:** ${orientContext}` : \"\",\n \"\",\n \"No entry created yet — the bet will be saved to the Chain once you describe the problem.\",\n \"\",\n \"---\",\n \"## Agent Directive\",\n \"**Investigate first** — before asking the user, use the investigationBrief to search the codebase and Chain for context related to this bet.\",\n \"Spawn sub-agents: one `explore` agent to search the codebase, one `generalPurpose` agent to search the Chain.\",\n \"Synthesize findings into a 3-5 line context brief, then present to the user.\",\n \"After presenting context, ask: **What's not working well? Describe the problem — who's affected, and what's the workaround today?**\",\n \"Keep your message to 5 lines or fewer. Heavy context degrades the shaping experience.\",\n `After the user responds, call \\`facilitate action=respond betName=\"${betName}\" dimension=\"problem_clarity\"\\` with their answer as userInput.`,\n `Note: pass betName (not betEntryId) — the entry will be created on the first respond call.`,\n ].filter(Boolean).join(\"\\n\");\n\n return {\n content: [{ type: \"text\" as const, text: output }],\n structuredContent: response,\n };\n}\n\nasync function handleRespond(args: z.infer<typeof facilitateSchema>) {\n requireWriteAccess();\n\n const { userInput, betEntryId: argBetId, dimension: argDimension, capture: rawCapture, source: argSource, betName: argBetName } = args;\n const source: ResponseSource = argSource ?? \"user\";\n const captureItems = rawCapture ? (Array.isArray(rawCapture) ? rawCapture : [rawCapture]) : [];\n\n if (!userInput) {\n return {\n content: [{ type: \"text\" as const, text: \"`userInput` is required for respond action.\" }],\n };\n }\n\n const captureErrors: Array<{ operation: string; detail: string }> = [];\n const entriesCreated: string[] = [];\n let relationsCreated = 0;\n\n // ── Deferred bet creation (BET-69 Fix 5: no zombie entries) ──────────\n let betId = argBetId;\n if (!betId) {\n const betName = argBetName ?? \"Untitled Bet (Shaping)\";\n const agentId = getAgentSessionId();\n try {\n const result = await mcpMutation<{ docId: string; entryId: string }>(\n \"chain.createEntry\",\n {\n collectionSlug: \"bets\",\n name: betName,\n status: \"draft\",\n data: {\n problem: userInput,\n appetite: \"\",\n elements: \"\",\n rabbitHoles: \"\",\n noGos: \"\",\n architecture: \"\",\n buildContract: \"\",\n description: `Shaping session for: ${betName}`,\n status: \"shaping\",\n shapingSessionActive: true,\n },\n createdBy: agentId ? `agent:${agentId}` : \"facilitate\",\n sessionId: agentId ?? undefined,\n },\n );\n betId = result.entryId;\n await recordSessionActivity({ entryCreated: result.docId });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: \"text\" as const, text: `Failed to create bet entry: ${msg}` }],\n isError: true,\n };\n }\n }\n\n // ── Round 1: Parallel reads ──────────────────────────────────────────\n\n const [betEntry, constellation, chainSurfaced] = await Promise.all([\n loadBetEntry(betId),\n loadConstellationState(betId),\n searchChain(userInput, { maxResults: 8 }),\n ]);\n\n if (!betEntry) {\n return {\n content: [{ type: \"text\" as const, text: `Bet \\`${betId}\\` not found. Use start to create a session.` }],\n };\n }\n\n const betData = (betEntry.data ?? {}) as Record<string, unknown>;\n\n // ── Capture inline entries (STA-1) — batch-capable with duplicate fallback ──\n\n if (captureItems.length > 0) {\n const capAgentId = getAgentSessionId();\n const collectionMap: Record<string, { slug: string; dataField: string; relationType: string }> = {\n element: { slug: \"features\", dataField: \"description\", relationType: \"part_of\" },\n risk: { slug: \"tensions\", dataField: \"description\", relationType: \"constrains\" },\n decision: { slug: \"decisions\", dataField: \"rationale\", relationType: \"informs\" },\n };\n\n let runningBetData = { ...betData };\n\n for (const item of captureItems) {\n if (item.type === \"noGo\") {\n const updatedNoGos = appendNoGo(\n runningBetData.noGos as string | undefined,\n { title: item.name, explanation: item.description },\n );\n runningBetData.noGos = updatedNoGos;\n try {\n await mcpMutation(\"chain.updateEntry\", {\n entryId: betId,\n data: { noGos: updatedNoGos },\n changeNote: `Added no-go: ${item.name}`,\n });\n await recordSessionActivity({ entryModified: betEntry._id });\n } catch (updErr: unknown) {\n captureErrors.push({\n operation: \"update\",\n detail: `noGos field: ${updErr instanceof Error ? updErr.message : String(updErr)}`,\n });\n }\n continue;\n }\n\n const mapping = collectionMap[item.type];\n if (!mapping) continue;\n\n let capturedEntryId: string | null = null;\n\n try {\n const result = await mcpMutation<{ docId: string; entryId: string }>(\n \"chain.createEntry\",\n {\n collectionSlug: mapping.slug,\n name: item.name,\n status: \"draft\",\n data: { [mapping.dataField]: item.description },\n createdBy: capAgentId ? `agent:${capAgentId}` : \"facilitate\",\n sessionId: capAgentId ?? undefined,\n },\n );\n capturedEntryId = result.entryId;\n entriesCreated.push(result.entryId);\n await recordSessionActivity({ entryCreated: result.docId });\n } catch (createErr: unknown) {\n const msg = createErr instanceof Error ? createErr.message : String(createErr);\n if (msg.includes(\"Duplicate entry\") || msg.includes(\"already exists\")) {\n const fallback = await findAndLinkExisting(\n item.name, mapping.slug, betId, mapping.relationType,\n );\n if (fallback) {\n capturedEntryId = fallback.entryId;\n entriesCreated.push(fallback.entryId);\n if (fallback.linked) relationsCreated++;\n captureErrors.push({\n operation: \"info\",\n detail: `Linked existing ${mapping.slug} entry \\`${fallback.entryId}\\` instead of creating duplicate.`,\n });\n } else {\n captureErrors.push({ operation: \"capture\", detail: `${item.type}: ${msg}` });\n }\n } else {\n captureErrors.push({ operation: \"capture\", detail: `${item.type}: ${msg}` });\n }\n }\n\n if (!capturedEntryId) continue;\n\n try {\n await mcpMutation(\"chain.createEntryRelation\", {\n fromEntryId: capturedEntryId,\n toEntryId: betId,\n type: mapping.relationType,\n });\n relationsCreated++;\n await recordSessionActivity({ relationCreated: true });\n } catch (relErr: unknown) {\n const msg = relErr instanceof Error ? relErr.message : String(relErr);\n if (!msg.includes(\"already exists\") && !msg.includes(\"Duplicate\")) {\n captureErrors.push({\n operation: \"relation\",\n detail: `${mapping.relationType} from ${capturedEntryId} to ${betId}: ${msg}`,\n });\n }\n }\n\n if (item.type === \"element\") {\n const updatedElements = appendElement(\n runningBetData.elements as string | undefined,\n { name: item.name, description: item.description, entryId: capturedEntryId },\n );\n runningBetData.elements = updatedElements;\n try {\n await mcpMutation(\"chain.updateEntry\", {\n entryId: betId,\n data: { elements: updatedElements },\n changeNote: `Added element: ${item.name}`,\n });\n await recordSessionActivity({ entryModified: betEntry._id });\n } catch (updErr: unknown) {\n captureErrors.push({\n operation: \"update\",\n detail: `elements field: ${updErr instanceof Error ? updErr.message : String(updErr)}`,\n });\n }\n } else if (item.type === \"risk\") {\n const updatedRisks = appendRabbitHole(\n runningBetData.rabbitHoles as string | undefined,\n { name: item.name, description: item.description, theme: item.theme, entryId: capturedEntryId },\n );\n runningBetData.rabbitHoles = updatedRisks;\n try {\n await mcpMutation(\"chain.updateEntry\", {\n entryId: betId,\n data: { rabbitHoles: updatedRisks },\n changeNote: `Added risk: ${item.name}`,\n });\n await recordSessionActivity({ entryModified: betEntry._id });\n } catch (updErr: unknown) {\n captureErrors.push({\n operation: \"update\",\n detail: `rabbitHoles field: ${updErr instanceof Error ? updErr.message : String(updErr)}`,\n });\n }\n }\n }\n }\n\n // ── Score ────────────────────────────────────────────────────────────\n\n const refreshedBet = await loadBetEntry(betId);\n const refreshedData = (refreshedBet?.data ?? betData) as Record<string, unknown>;\n const refreshedConstellation = captureItems.length > 0\n ? await loadConstellationState(betId, refreshedBet?._id ?? betEntry._id)\n : constellation;\n\n // Load session drafts early — used for both overlap exclusion and response\n const sessionDrafts = await loadSessionDrafts(betId, refreshedBet?._id ?? betEntry._id);\n const constellationEntryIds = sessionDrafts.map((d) => d.entryId);\n\n // Overlap detection: run once per session using the problem field (BET-69 Fix 7)\n const alreadyCheckedOverlap = typeof refreshedData._overlapIds === \"string\";\n let overlap: Array<{ entryId: string; similarity: string; summary: string }> = [];\n if (!alreadyCheckedOverlap && captureItems.length === 0) {\n const problemText = (refreshedData.problem as string) ?? userInput;\n const overlapResults = await searchChain(problemText, { maxResults: 5, excludeIds: [betId, ...constellationEntryIds] });\n overlap = overlapResults.map((r) => ({\n entryId: r.entryId,\n similarity: \"text_match\",\n summary: `${r.name} [${r.collection}]`,\n }));\n }\n const overlapIds = overlap.map((o) => o.entryId);\n\n // Detect appetite size from persisted data + current input\n const appetiteText = (refreshedData.appetite as string) ?? \"\";\n const isSmallBatch = detectSmallBatch(\n argDimension === \"appetite\" ? userInput : appetiteText,\n );\n\n // Resolve active dimension first — explicit arg or inferred from a preliminary pass\n let activeDimension: ShapingDimension;\n if (argDimension && DIMENSIONS.includes(argDimension as ShapingDimension)) {\n activeDimension = argDimension as ShapingDimension;\n } else {\n const prelim = buildScoringContext(userInput, refreshedData, refreshedConstellation, overlapIds, chainSurfaced, undefined, source);\n activeDimension = inferActiveDimension(buildScorecard(prelim), isSmallBatch);\n }\n\n // Score with isolation — userInput routed only to the active dimension\n const scoringCtx = buildScoringContext(\n userInput, refreshedData, refreshedConstellation, overlapIds, chainSurfaced, activeDimension, source,\n );\n\n const dimensionResult = scoreDimension(activeDimension, scoringCtx);\n const { scorecard, criteria: scorecardCriteria } = buildDetailedScorecard(scoringCtx, { isSmallBatch });\n const nextDimension = inferActiveDimension(scorecard, isSmallBatch);\n const phase = inferPhase(scorecard, isSmallBatch, extractContentEvidence(scoringCtx));\n\n // ── Update bet fields based on dimension ─────────────────────────────\n\n try {\n const fieldUpdates: Record<string, unknown> = {};\n const persist = (dim: ShapingDimension, field: string, minLen: number) => {\n if (activeDimension === dim && !refreshedData[field] && userInput.length > minLen) {\n fieldUpdates[field] = userInput;\n }\n };\n persist(\"problem_clarity\", \"problem\", 50);\n persist(\"appetite\", \"appetite\", 20);\n persist(\"architecture\", \"architecture\", 50);\n // elements, rabbitHoles, noGos have format contracts with BetRenderer —\n // they must only be written via appendElement/appendRabbitHole/appendNoGo\n\n if (!refreshedData._overlapIds) {\n fieldUpdates._overlapIds = overlapIds.length > 0 ? overlapIds.join(\",\") : \"_checked\";\n }\n\n const govCount = chainSurfaced.filter((e) =>\n [\"principles\", \"standards\", \"business-rules\"].includes(e.collection),\n ).length;\n if (govCount > 0) {\n fieldUpdates._governanceCount = govCount;\n }\n\n if (Object.keys(fieldUpdates).length > 0) {\n await mcpMutation(\"chain.updateEntry\", {\n entryId: betId,\n data: fieldUpdates,\n changeNote: `Updated ${Object.keys(fieldUpdates).join(\", \")} from shaping session`,\n });\n await recordSessionActivity({ entryModified: refreshedBet?._id ?? betEntry._id });\n }\n } catch (updErr: unknown) {\n captureErrors.push({\n operation: \"update\",\n detail: `bet fields: ${updErr instanceof Error ? updErr.message : String(updErr)}`,\n });\n }\n\n // ── Build alignment from chain surfaced ──────────────────────────────\n\n const alignment: Array<{ entryId: string; relationship: string }> = [];\n const governanceCollections = new Set([\"principles\", \"standards\", \"business-rules\", \"strategy\", \"bets\"]);\n for (const result of chainSurfaced) {\n if (governanceCollections.has(result.collection)) {\n alignment.push({ entryId: result.entryId, relationship: `governs [${result.collection}]` });\n }\n }\n\n // ── Build coaching ───────────────────────────────────────────────────\n\n const { ready: captureReady, completed } = isCaptureReady(scorecard, isSmallBatch);\n\n const observation = dimensionResult.satisfied.length > 0\n ? `${DIMENSION_LABELS[activeDimension]}: ${dimensionResult.satisfied.join(\"; \")}`\n : `${DIMENSION_LABELS[activeDimension]}: needs more detail`;\n\n // When capture is present, the agent is recording — don't challenge with overlap noise\n const pushback = captureItems.length === 0 && overlap.length > 0\n ? `${overlap[0].summary} already exists on the Chain. How does your bet differ?`\n : dimensionResult.missing.length > 0\n ? dimensionResult.missing[0]\n : \"\";\n\n const suggestedQuestion = dimensionResult.missing.length > 1\n ? dimensionResult.missing[1]\n : dimensionResult.missing.length > 0\n ? dimensionResult.missing[0]\n : `${DIMENSION_LABELS[nextDimension]} is next — ready to move on?`;\n\n const wsCtx = await getWorkspaceContext();\n const studioUrl = buildStudioUrl(wsCtx.workspaceSlug, betId);\n\n // ── Build Contract (auto-generated when captureReady) ────────────────\n\n let buildContract: string | undefined;\n if (captureReady) {\n const contractCtx: BuildContractContext = {\n betEntryId: betId,\n governanceEntries: chainSurfaced\n .filter((e) => [\"principles\", \"standards\", \"business-rules\"].includes(e.collection))\n .map((e) => ({ entryId: e.entryId, name: e.name, collection: e.collection })),\n relatedDecisions: chainSurfaced\n .filter((e) => e.collection === \"decisions\")\n .map((e) => ({ entryId: e.entryId, name: e.name })),\n relatedTensions: chainSurfaced\n .filter((e) => e.collection === \"tensions\")\n .map((e) => ({ entryId: e.entryId, name: e.name })),\n };\n buildContract = generateBuildContract(contractCtx);\n }\n\n // ── Commit blockers (progressive validation) ─────────────────────────\n\n let commitBlockers: CommitBlocker[] | undefined;\n if (captureReady) {\n commitBlockers = computeCommitBlockers({\n betEntryId: betId,\n relations: refreshedConstellation.relations,\n betData: refreshedData,\n sessionDrafts,\n });\n if (commitBlockers.length === 0) commitBlockers = undefined;\n }\n\n // ── Suggested captures ───────────────────────────────────────────────\n\n const suggested = suggestCaptures(scoringCtx, activeDimension);\n\n const betProblem = (refreshedData.problem as string) ?? \"\";\n const betName = (refreshedData.description as string) ?? betEntry.name;\n const elementNames = ((refreshedData.elements as string) ?? \"\")\n .match(/###\\s*Element\\s*\\d+:\\s*(.+)/gi)\n ?.map((h) => h.replace(/###\\s*Element\\s*\\d+:\\s*/i, \"\").trim()) ?? [];\n const investigationBrief = buildInvestigationBrief(phase, betName, betId, betProblem, elementNames) ?? undefined;\n\n const response: FacilitateResponseV2 = {\n version: 2,\n phase,\n phaseLabel: PHASE_LABELS[phase],\n scorecard,\n overlap,\n alignment,\n chainSurfaced: chainSurfaced.map((r) => ({ entryId: r.entryId, relevance: r.name, collection: r.collection })),\n suggestedCaptures: suggested,\n sessionDrafts,\n coaching: {\n observation,\n missing: dimensionResult.missing,\n pushback,\n suggestedQuestion,\n captureReady,\n nextDimension,\n },\n captured: {\n betEntryId: betId,\n studioUrl,\n entriesCreated,\n relationsCreated,\n },\n captureErrors,\n navigation: {\n completedDimensions: completed,\n activeDimension,\n suggestedOrder: activeDimensions(isSmallBatch),\n },\n buildContract,\n investigationBrief,\n commitBlockers,\n scorecardCriteria,\n };\n\n // ── Data-loss warning for structured dimensions without capture ──────\n const STRUCTURED_DIMS: Record<string, string> = {\n elements: \"element\",\n risks: \"risk\",\n boundaries: \"noGo\",\n };\n const expectedCaptureType = STRUCTURED_DIMS[activeDimension];\n const dataLossWarning = expectedCaptureType && captureItems.length === 0\n ? `**WARNING:** You discussed ${activeDimension} but did not use the \\`capture\\` parameter — ` +\n `nothing was saved to the bet. Re-send with ` +\n `\\`capture={type:\"${expectedCaptureType}\", name:\"...\", description:\"...\"}\\` to persist this.`\n : \"\";\n\n const directive = buildDirective(scorecard, phase, betId, captureReady, activeDimension, nextDimension);\n\n const summaryParts = [\n `# ${PHASE_LABELS[phase]} — ${DIMENSION_LABELS[activeDimension]}`,\n \"\",\n dataLossWarning,\n `**Score:** ${DIMENSION_LABELS[activeDimension]}: ${scorecard[activeDimension]}/10 — ${formatCriteriaLine(dimensionResult.criteria)}`,\n `**Phase:** ${PHASE_LABELS[phase]}`,\n observation,\n pushback ? `**Pushback:** ${pushback}` : \"\",\n `**Next:** ${suggestedQuestion}`,\n captureReady ? \"\\n**Capture ready** — the bet has enough shape to finalize.\" : \"\",\n commitBlockers?.length\n ? `\\n⚠ **Commit blockers (${commitBlockers.length}):** ${commitBlockers.map((b) => `${b.blocker} → \\`${b.fix}\\``).join(\"; \")}`\n : \"\",\n entriesCreated.length > 0 ? `**Captured:** ${entriesCreated.join(\", \")}` : \"\",\n suggested.length > 0 ? `**Suggest capturing:** ${suggested.map((s) => `${s.type}: \"${s.name}\"`).join(\"; \")}` : \"\",\n sessionDrafts.length > 0 ? `**Session drafts (${sessionDrafts.length}):** ${sessionDrafts.map((d) => `\\`${d.entryId}\\` ${d.name}`).join(\", \")}` : \"\",\n captureErrors.length > 0 ? `**Warnings:** ${captureErrors.map((e) => e.detail).join(\"; \")}` : \"\",\n directive ? `\\n---\\n## Agent Directive\\n${directive}` : \"\",\n investigationBrief ? `\\n## Investigation Brief\\n${investigationBrief.tasks.map((t) => `- **${t.target}:** ${t.query} — ${t.purpose}`).join(\"\\n\")}\\n\\n**Proposal guidance:** ${investigationBrief.proposalGuidance}\\n**Reaction prompt:** ${investigationBrief.reactionPrompt}` : \"\",\n ];\n\n return {\n content: [{ type: \"text\" as const, text: summaryParts.filter(Boolean).join(\"\\n\") }],\n structuredContent: response,\n };\n}\n\nasync function handleScore(args: z.infer<typeof facilitateSchema>) {\n const betId = args.betEntryId;\n if (!betId) {\n return {\n content: [{ type: \"text\" as const, text: \"`betEntryId` is required for score action.\" }],\n };\n }\n\n const betEntry = await loadBetEntry(betId);\n if (!betEntry) {\n return {\n content: [{ type: \"text\" as const, text: `Bet \\`${betId}\\` not found.` }],\n };\n }\n\n const constellation = await loadConstellationState(betId, betEntry._id);\n const betData = (betEntry.data ?? {}) as Record<string, unknown>;\n const isSmallBatch = detectSmallBatch((betData.appetite as string) ?? \"\");\n const scoringCtx = buildCachedScoringContext(betData, constellation);\n const { scorecard, criteria: scorecardCriteria } = buildDetailedScorecard(scoringCtx, { isSmallBatch });\n const dims = activeDimensions(isSmallBatch);\n const { ready: captureReady, completed } = isCaptureReady(scorecard, isSmallBatch);\n const active = inferActiveDimension(scorecard, isSmallBatch);\n const phase = inferPhase(scorecard, isSmallBatch, extractContentEvidence(scoringCtx));\n\n const lines: string[] = [\n `# Scorecard — ${betEntry.name}`,\n `**Phase:** ${PHASE_LABELS[phase]}`,\n \"\",\n \"| Dimension | Score | Status |\",\n \"|-----------|-------|--------|\",\n ];\n\n for (const dim of dims) {\n const label = DIMENSION_LABELS[dim];\n const score = scorecard[dim];\n const status = score >= 6 ? \"done\" : score > 0 ? \"in progress\" : \"not started\";\n const marker = dim === active ? \" **<-**\" : \"\";\n lines.push(`| ${label} | ${score}/10 | ${status}${marker} |`);\n }\n\n lines.push(\"\");\n lines.push(\"### Criteria Detail\");\n for (const dim of dims) {\n const label = DIMENSION_LABELS[dim];\n lines.push(`**${label} (${scorecard[dim]}/10):** ${formatCriteriaLine(scorecardCriteria[dim])}`);\n }\n\n lines.push(\"\");\n lines.push(`Completed: ${completed.length}/${dims.length}`);\n lines.push(`Next dimension: ${DIMENSION_LABELS[active]}`);\n\n const sessionDrafts = await loadSessionDrafts(betId, betEntry._id);\n const constellationDrafts = sessionDrafts.filter((d) => d.collection !== \"unknown\");\n\n if (sessionDrafts.length > 0) {\n lines.push(\"\");\n lines.push(`**Session drafts (${sessionDrafts.length}):** ${sessionDrafts.map((d) => `\\`${d.entryId}\\` ${d.name}`).join(\", \")}`);\n }\n\n const commitBlockers = computeCommitBlockers({\n betEntryId: betId,\n relations: constellation.relations,\n betData,\n sessionDrafts,\n });\n\n if (captureReady) {\n lines.push(\"\");\n lines.push(\"**Capture ready** — the bet has enough shape to finalize.\");\n if (constellationDrafts.length > 0) {\n lines.push(\"\");\n lines.push(`**Constellation entries to commit alongside the bet:**`);\n for (const draft of constellationDrafts) {\n lines.push(`- \\`${draft.entryId}\\` ${draft.name} [${draft.collection}]`);\n }\n lines.push(\"\");\n lines.push(\"When committing, also commit these constellation entries to keep the graph consistent.\");\n }\n }\n\n if (commitBlockers.length > 0) {\n lines.push(\"\");\n lines.push(`⚠ **Commit blockers (${commitBlockers.length}):**`);\n for (const b of commitBlockers) {\n lines.push(`- ${b.blocker} → \\`${b.fix}\\``);\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: {\n scorecard, phase, phaseLabel: PHASE_LABELS[phase],\n completedDimensions: completed, nextDimension: active,\n sessionDrafts, captureReady, constellationDrafts,\n commitBlockers: commitBlockers.length > 0 ? commitBlockers : undefined,\n scorecardCriteria,\n },\n };\n}\n\nasync function handleResume(args: z.infer<typeof facilitateSchema>) {\n const betId = args.betEntryId;\n if (!betId) {\n return {\n content: [{ type: \"text\" as const, text: \"`betEntryId` is required for resume action.\" }],\n };\n }\n\n const betEntry = await loadBetEntry(betId);\n if (!betEntry) {\n return {\n content: [{ type: \"text\" as const, text: `Bet \\`${betId}\\` not found. Cannot resume.` }],\n };\n }\n\n const constellation = await loadConstellationState(betId, betEntry._id);\n\n const betData = (betEntry.data ?? {}) as Record<string, unknown>;\n const isSmallBatch = detectSmallBatch((betData.appetite as string) ?? \"\");\n const scoringCtx = buildCachedScoringContext(betData, constellation);\n const { scorecard, criteria: scorecardCriteria } = buildDetailedScorecard(scoringCtx, { isSmallBatch });\n const dims = activeDimensions(isSmallBatch);\n const { ready: captureReady, completed } = isCaptureReady(scorecard, isSmallBatch);\n const active = inferActiveDimension(scorecard, isSmallBatch);\n const phase = inferPhase(scorecard, isSmallBatch, extractContentEvidence(scoringCtx));\n const wsCtx = await getWorkspaceContext();\n const studioUrl = buildStudioUrl(wsCtx.workspaceSlug, betId);\n\n const constellationSummary: string[] = [];\n if (constellation.elementCount > 0) constellationSummary.push(`${constellation.elementCount} element(s)`);\n if (constellation.riskCount > 0) constellationSummary.push(`${constellation.riskCount} risk(s)`);\n if (constellation.decisionCount > 0) constellationSummary.push(`${constellation.decisionCount} decision(s)`);\n\n const sessionDrafts = await loadSessionDrafts(betId, betEntry._id);\n\n const response: FacilitateResponseV2 = {\n version: 2,\n phase,\n phaseLabel: PHASE_LABELS[phase],\n scorecard,\n overlap: [],\n alignment: [],\n chainSurfaced: [],\n suggestedCaptures: [],\n sessionDrafts,\n coaching: {\n observation: `Resuming session for \"${betEntry.name}\". ${constellationSummary.length > 0 ? `Constellation: ${constellationSummary.join(\", \")}.` : \"No constellation entries yet.\"}`,\n missing: dims.filter((d) => scorecard[d] < 6).map((d) => `${DIMENSION_LABELS[d]} needs work (${scorecard[d]}/10)`),\n pushback: \"\",\n suggestedQuestion: `Continue with ${DIMENSION_LABELS[active]}?`,\n captureReady,\n nextDimension: active,\n },\n captured: {\n betEntryId: betId,\n studioUrl,\n entriesCreated: [],\n relationsCreated: 0,\n },\n captureErrors: [],\n navigation: {\n completedDimensions: completed,\n activeDimension: active,\n suggestedOrder: dims,\n },\n scorecardCriteria,\n };\n\n const directive = buildDirective(scorecard, phase, betId, captureReady, active, active);\n\n const scorecardLines = dims.map((dim) => {\n const s = scorecard[dim];\n const bar = s > 0 ? \"█\".repeat(s) + \"░\".repeat(10 - s) : \"░░░░░░░░░░\";\n const arrow = dim === active ? \" ◀ next\" : \"\";\n return `| ${DIMENSION_LABELS[dim]} | ${bar} ${s}/10${arrow} |`;\n });\n\n const criteriaDetail = dims.map((dim) =>\n `**${DIMENSION_LABELS[dim]} (${scorecard[dim]}/10):** ${formatCriteriaLine(scorecardCriteria[dim])}`,\n );\n\n const output = [\n `# Session Resumed — ${betEntry.name}`,\n \"\",\n `**Bet:** \\`${betId}\\``,\n `**Studio:** ${studioUrl}`,\n `**Status:** ${betEntry.status}`,\n `**Phase:** ${PHASE_LABELS[phase]}`,\n constellationSummary.length > 0\n ? `**Constellation:** ${constellationSummary.join(\", \")}`\n : \"**Constellation:** Empty — no entries captured yet.\",\n sessionDrafts.length > 0 ? `**Session drafts (${sessionDrafts.length}):** ${sessionDrafts.map((d) => `\\`${d.entryId}\\` ${d.name}`).join(\", \")}` : \"\",\n \"\",\n \"## Scorecard\",\n \"| Dimension | Score |\",\n \"|---|---|\",\n ...scorecardLines,\n \"\",\n \"### Criteria Detail\",\n ...criteriaDetail,\n \"\",\n `Continue with ${DIMENSION_LABELS[active]}?`,\n directive ? `\\n---\\n## Agent Directive\\n${directive}` : \"\",\n ].filter(Boolean).join(\"\\n\");\n\n return {\n content: [{ type: \"text\" as const, text: output }],\n structuredContent: response,\n };\n}\n\n// ── Commit Constellation ────────────────────────────────────────────────\n\ninterface ConstellationCommitResult {\n operationId: string;\n committedIds: string[];\n alreadyCommittedIds: string[];\n failedIds: Array<{ entryId: string; name: string; error: string }>;\n conflictIds: Array<{ entryId: string; name: string; reason: string }>;\n totalRelations: number;\n proposalCreated?: boolean;\n}\n\nexport async function handleCommitConstellation(args: z.infer<typeof facilitateSchema>) {\n requireWriteAccess();\n\n const betId = args.betEntryId;\n const operationId = args.operationId ?? `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n if (!betId) {\n return {\n content: [{ type: \"text\" as const, text: \"`betEntryId` is required for commit-constellation action.\" }],\n };\n }\n\n const betEntry = await loadBetEntry(betId);\n if (!betEntry) {\n return {\n content: [{ type: \"text\" as const, text: `Bet \\`${betId}\\` not found.` }],\n };\n }\n\n // ── Pre-validation: single source of truth via computeCommitBlockers ────\n\n const betData = (betEntry.data ?? {}) as Record<string, unknown>;\n\n const relations = await mcpQuery<RelationEntry[]>(\"chain.listEntryRelations\", {\n entryId: betId,\n });\n\n const sessionDrafts = await loadSessionDrafts(betId, betEntry._id);\n\n const commitBlockerItems = computeCommitBlockers({\n betEntryId: betId,\n relations,\n betData,\n sessionDrafts,\n });\n\n if (commitBlockerItems.length > 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: [\n `# Cannot commit constellation`,\n \"\",\n `**${commitBlockerItems.length} blocker(s) found** — fix these before committing:`,\n ...commitBlockerItems.map((b) => `- ${b.blocker} → \\`${b.fix}\\``),\n \"\",\n \"No entries were committed.\",\n ].join(\"\\n\"),\n }],\n structuredContent: {\n operationId,\n blockers: commitBlockerItems,\n committedIds: [],\n alreadyCommittedIds: [],\n failedIds: [],\n conflictIds: [],\n totalRelations: relations.length,\n },\n };\n }\n\n // ── Contradiction check on bet (same as commit-entry) ──────────────────\n\n let contradictionWarnings: string[] = [];\n try {\n const { runContradictionCheck } = await import(\"./smart-capture.js\");\n const descField = (betData.problem as string) ?? (betData.description as string) ?? \"\";\n contradictionWarnings = await runContradictionCheck(\n betEntry.name ?? betId,\n descField,\n );\n if (contradictionWarnings.length > 0) {\n await recordSessionActivity({ contradictionWarning: true });\n }\n } catch {\n // Contradiction check is advisory — proceed without it\n }\n\n // ── Commit atomically in backend mutation ───────────────────────────────\n\n const author = getAgentSessionId() ? `agent:${getAgentSessionId()}` : undefined;\n const sessionId = getAgentSessionId() ?? undefined;\n let result: ConstellationCommitResult;\n try {\n result = await mcpMutation<ConstellationCommitResult>(\"chain.batchCommitConstellation\", {\n betEntryId: betId,\n author,\n sessionId,\n operationId,\n });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{\n type: \"text\" as const,\n text: `# Bet commit failed\\n\\n\\`${betId}\\` could not be committed: ${msg}\\n\\nNo constellation entries were committed.`,\n }],\n isError: true,\n };\n }\n\n for (const entryId of result.committedIds) {\n await recordSessionActivity({ entryModified: entryId });\n }\n\n const lines: string[] = [];\n if (result.proposalCreated) {\n const linkedCount = result.committedIds.filter((id) => id !== betId).length;\n lines.push(\n `# Proposal created`,\n \"\",\n `Workspace uses consent-based governance. \\`${betId}\\` was submitted as a proposal — it will be committed when approved.`,\n `**${linkedCount} linked entries** were committed directly (proposals apply to the bet only).`,\n );\n } else {\n lines.push(\n `# Published`,\n \"\",\n `**${result.committedIds.length} entries** committed to the Chain, **${result.totalRelations} connections** preserved.`,\n `\\`${betId}\\` and its full constellation are now source of truth.`,\n );\n }\n\n if (contradictionWarnings.length > 0) {\n lines.push(\"\", `⚠ **Contradiction warnings** (advisory):`, ...contradictionWarnings.map((w) => `- ${w}`));\n }\n\n if (result.committedIds.length > 0) {\n lines.push(\"\", `**Committed:** ${result.committedIds.join(\", \")}`);\n }\n\n if (result.alreadyCommittedIds.length > 0) {\n lines.push(\"\", `**Already committed:** ${result.alreadyCommittedIds.join(\", \")}`);\n }\n\n if (result.conflictIds.length > 0) {\n lines.push(\"\", `**${result.conflictIds.length} conflicts:**`);\n for (const c of result.conflictIds) {\n lines.push(`- \\`${c.entryId}\\` ${c.name}: ${c.reason}`);\n }\n }\n\n if (result.failedIds.length > 0) {\n lines.push(\"\", `**${result.failedIds.length} failed:**`);\n for (const f of result.failedIds) {\n lines.push(`- \\`${f.entryId}\\` ${f.name}: ${f.error}`);\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n structuredContent: { ...result, contradictionWarnings },\n };\n}\n","/**\n * Shaping rubric dimensions — heuristic scoring for coached facilitation.\n *\n * Seven dimensions (problem, appetite, elements, architecture, risks, boundaries, done-when),\n * each returning 0-10. Chain-assisted: overlap, governance, and constellation\n * state feed into scoring alongside keyword heuristics.\n *\n * No LLM calls — heuristic only (latency budget per RH1).\n * The server catches structure; the agent catches substance (DEC-56).\n */\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface ScoringCriterion {\n label: string;\n met: boolean;\n /** Points this criterion contributed (if met) or could contribute (if not met). */\n weight: number;\n}\n\nexport interface RubricScore {\n score: number;\n missing: string[];\n satisfied: string[];\n criteria: ScoringCriterion[];\n}\n\nexport interface Scorecard {\n problem_clarity: number;\n appetite: number;\n elements: number;\n architecture: number;\n risks: number;\n boundaries: number;\n done_when: number;\n}\n\nexport type ShapingDimension = keyof Scorecard;\n\n/** ENT-59 FEAT-41: Source of the text being scored — enables scoring integrity */\nexport type ResponseSource = \"user\" | \"agent_proposal\" | \"user_reaction\";\n\n/**\n * ENT-59 FEAT-41: Discount factor for agent-generated text (RH1 mitigation).\n * Agent proposals naturally contain architecture/risk vocabulary that inflates\n * keyword-based scores. User reactions to proposals get full weight — the user\n * has endorsed the content by reacting to it.\n */\nconst AGENT_DISCOUNT_FACTOR = 0.6;\n\nexport const DIMENSIONS: readonly ShapingDimension[] = [\n \"problem_clarity\",\n \"appetite\",\n \"elements\",\n \"architecture\",\n \"risks\",\n \"boundaries\",\n \"done_when\",\n] as const;\n\nexport const DIMENSION_LABELS: Record<ShapingDimension, string> = {\n problem_clarity: \"Problem Clarity\",\n appetite: \"Appetite Definition\",\n elements: \"Element Decomposition\",\n architecture: \"Architecture Grounding\",\n risks: \"Risk Coverage\",\n boundaries: \"Boundary Specification\",\n done_when: \"Done-When Quality\",\n};\n\nexport const SUGGESTED_ORDER: ShapingDimension[] = [\n \"problem_clarity\",\n \"appetite\",\n \"elements\",\n \"architecture\",\n \"risks\",\n \"boundaries\",\n \"done_when\",\n];\n\n// ── Shaping Phases ─────────────────────────────────────────────────────────\n\nexport type ShapingPhase =\n | \"context\" // Phase 0: gather Chain context\n | \"framing\" // Phase 1: problem + appetite\n | \"elements\" // Phase 2: solution elements + architecture\n | \"derisking\" // Phase 3: rabbit holes + no-gos\n | \"validation\" // Phase 4: completeness check + build contract\n | \"capture\"; // Phase 5: review + commit\n\nexport const PHASE_ORDER: ShapingPhase[] = [\n \"context\", \"framing\", \"elements\", \"derisking\", \"validation\", \"capture\",\n];\n\nexport const PHASE_LABELS: Record<ShapingPhase, string> = {\n context: \"Phase 0: Gather Context\",\n framing: \"Phase 1: Frame the Problem\",\n elements: \"Phase 2: Find the Elements\",\n derisking: \"Phase 3: De-risk\",\n validation: \"Phase 4: Validate & Contract\",\n capture: \"Phase 5: Capture & Commit\",\n};\n\nexport interface ContentEvidence {\n elementCount: number;\n riskCount: number;\n noGoCount: number;\n hasArchitectureText?: boolean;\n}\n\nfunction contentFloor(content: ContentEvidence, isSmallBatch: boolean): ShapingPhase {\n const hasElements = content.elementCount >= 1;\n const hasDerisking = content.riskCount >= 1 || content.noGoCount >= 1;\n const hasArchOrSkipped = isSmallBatch || !!content.hasArchitectureText;\n const wellShaped = content.elementCount >= 2 && hasDerisking && hasArchOrSkipped;\n\n if (wellShaped && content.riskCount >= 1 && content.noGoCount >= 2) return \"validation\";\n if (hasDerisking) return \"derisking\";\n if (hasElements) return \"elements\";\n return \"context\";\n}\n\nfunction laterPhase(a: ShapingPhase, b: ShapingPhase): ShapingPhase {\n return PHASE_ORDER.indexOf(a) >= PHASE_ORDER.indexOf(b) ? a : b;\n}\n\nexport function inferPhase(scorecard: Scorecard, isSmallBatch = false, content?: ContentEvidence): ShapingPhase {\n let scorePhase: ShapingPhase;\n if (scorecard.problem_clarity === 0 && scorecard.appetite === 0) scorePhase = \"context\";\n else if (scorecard.problem_clarity < 6 || scorecard.appetite < 6) scorePhase = \"framing\";\n else {\n const archGate = isSmallBatch ? true : scorecard.architecture >= 4;\n if (scorecard.elements < 6 || !archGate) scorePhase = \"elements\";\n else if (scorecard.risks < 6 || scorecard.boundaries < 4 || scorecard.done_when < 4) scorePhase = \"derisking\";\n else {\n const activeDims = activeDimensions(isSmallBatch);\n const allAboveThreshold = activeDims.every((d) => scorecard[d] >= 4);\n if (!allAboveThreshold) scorePhase = \"derisking\";\n else {\n const highQuality = activeDims.every((d) => scorecard[d] >= 6);\n scorePhase = highQuality ? \"capture\" : \"validation\";\n }\n }\n }\n\n if (!content) return scorePhase;\n return laterPhase(scorePhase, contentFloor(content, isSmallBatch));\n}\n\nexport function activeDimensions(isSmallBatch: boolean): ShapingDimension[] {\n return isSmallBatch\n ? SUGGESTED_ORDER.filter((d) => d !== \"architecture\")\n : SUGGESTED_ORDER;\n}\n\n// ── Scoring Context ────────────────────────────────────────────────────────\n\nexport interface ScoringContext {\n userInput: string;\n accumulatedText: string;\n /** Per-dimension text — each scorer reads only its own field to prevent bleed */\n dimensionTexts: Record<ShapingDimension, string>;\n existingEntryIds: string[];\n elementCount: number;\n riskCount: number;\n noGoCount: number;\n /** Chain-assisted: governance entries (rules, standards, principles) surfaced */\n governanceCount: number;\n /** Chain-assisted: related decisions found */\n decisionCount: number;\n /** Whether architecture text exists in the bet data */\n hasArchitectureText: boolean;\n /** ENT-59 FEAT-41: Source of the current input for scoring integrity */\n source: ResponseSource;\n}\n\n// ── Keyword Sets ───────────────────────────────────────────────────────────\n\nconst WORKAROUND_SIGNALS = [\n \"workaround\", \"currently\", \"today\", \"right now\", \"manually\",\n \"hack\", \"instead\", \"rather than\", \"in practice\", \"as-is\",\n];\n\nconst AFFECTED_SIGNALS = [\n \"user\", \"team\", \"developer\", \"engineer\", \"customer\",\n \"everyone\", \"nobody\", \"people\", \"stakeholder\", \"builder\",\n];\n\nconst FREQUENCY_SIGNALS = [\n \"every time\", \"always\", \"often\", \"rarely\", \"daily\",\n \"weekly\", \"never\", \"sometimes\", \"constantly\", \"repeatedly\",\n \"each session\", \"per session\",\n];\n\nconst APPETITE_SIGNALS = [\n \"week\", \"weeks\", \"day\", \"days\", \"month\", \"sprint\",\n \"small batch\", \"big batch\", \"appetite\", \"time box\", \"timebox\",\n \"budget\", \"phased\",\n];\n\nconst SCOPE_SIGNALS = [\n \"trade-off\", \"tradeoff\", \"trade off\", \"not including\",\n \"out of scope\", \"defer\", \"skip\", \"cut\", \"80%\",\n \"good enough\", \"mvp\", \"v1\", \"phase\",\n];\n\nconst RISK_SIGNALS = [\n \"risk\", \"rabbit hole\", \"unknown\", \"complexity\", \"might\",\n \"could fail\", \"latency\", \"performance\", \"coupling\", \"dependency\",\n \"fragile\", \"brittle\", \"unclear\", \"uncertain\", \"tricky\",\n];\n\nconst MITIGATION_SIGNALS = [\n \"patch\", \"mitigate\", \"accept\", \"workaround\", \"fallback\",\n \"circuit breaker\", \"degrade\", \"graceful\", \"monitor\", \"benchmark\",\n];\n\nconst NOGO_SIGNALS = [\n \"no-go\", \"nogo\", \"won't\", \"will not\", \"must not\",\n \"not building\", \"out of scope\", \"explicitly excluded\", \"defer\",\n \"not in v1\", \"not in this bet\",\n];\n\nconst ARCHITECTURE_SIGNALS = [\n \"layer\", \"boundary\", \"dependency\", \"api\", \"contract\",\n \"interface\", \"module\", \"component\", \"service\", \"schema\",\n \"mermaid\", \"diagram\", \"infra\", \"core\", \"feature\",\n];\n\nconst ARCH_QUALITY_SIGNALS = [\n \"direction\", \"imports\", \"never imports\", \"http only\",\n \"separation\", \"encapsulat\", \"decouple\", \"isolat\",\n];\n\nconst DONE_WHEN_SIGNALS = [\n \"done when\",\n \"acceptance criteria\",\n \"verified\",\n \"test plan\",\n \"validation\",\n \"rollback\",\n \"gate\",\n \"threshold\",\n \"metric\",\n \"success\",\n \"p95\",\n \"p99\",\n];\n\n// ── Scoring Functions ──────────────────────────────────────────────────────\n\nfunction countMatches(text: string, signals: string[]): number {\n const lower = text.toLowerCase();\n return signals.filter((s) => lower.includes(s)).length;\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, n));\n}\n\nexport function scoreProblemClarity(ctx: ScoringContext): RubricScore {\n const text = ctx.dimensionTexts.problem_clarity;\n const missing: string[] = [];\n const satisfied: string[] = [];\n const criteria: ScoringCriterion[] = [];\n let score = 0;\n\n const hasWorkaround = countMatches(text, WORKAROUND_SIGNALS) > 0;\n criteria.push({ label: \"Current workaround described\", met: hasWorkaround, weight: 3 });\n if (hasWorkaround) {\n satisfied.push(\"Current workaround described\");\n score += 3;\n } else {\n missing.push(\"Describe the current workaround — how do people deal with this today?\");\n }\n\n const hasAffected = countMatches(text, AFFECTED_SIGNALS) > 0;\n criteria.push({ label: \"Affected people identified\", met: hasAffected, weight: 2 });\n if (hasAffected) {\n satisfied.push(\"Affected people identified\");\n score += 2;\n } else {\n missing.push(\"Who experiences this problem? Be specific about the role or persona.\");\n }\n\n const hasFrequency = countMatches(text, FREQUENCY_SIGNALS) > 0;\n criteria.push({ label: \"Frequency or severity stated\", met: hasFrequency, weight: 2 });\n if (hasFrequency) {\n satisfied.push(\"Frequency or severity stated\");\n score += 2;\n } else {\n missing.push(\"How often does this happen, or how severe is it when it does?\");\n }\n\n if (ctx.existingEntryIds.length > 0) {\n satisfied.push(`Differentiated from ${ctx.existingEntryIds.length} existing entries`);\n criteria.push({ label: \"Differentiated from existing entries\", met: true, weight: 2 });\n score += 2;\n } else if (/\\b(TEN|DEC|ENT|FEAT|BET)-\\w+/i.test(text)) {\n satisfied.push(\"References existing Chain entries\");\n criteria.push({ label: \"References existing Chain entries\", met: true, weight: 1 });\n score += 1;\n } else {\n missing.push(\"How does this differ from existing tensions or bets on the Chain?\");\n criteria.push({ label: \"Differentiated from existing entries\", met: false, weight: 2 });\n }\n\n const isSubstantive = text.length > 200;\n criteria.push({ label: \"Substantive description provided\", met: isSubstantive, weight: 1 });\n if (isSubstantive) {\n satisfied.push(\"Substantive description provided\");\n score += 1;\n }\n\n return { score: clamp(score, 0, 10), missing, satisfied, criteria };\n}\n\nexport function scoreAppetite(ctx: ScoringContext): RubricScore {\n const text = ctx.dimensionTexts.appetite;\n const missing: string[] = [];\n const satisfied: string[] = [];\n const criteria: ScoringCriterion[] = [];\n let score = 0;\n\n const hasSizeDecl = /small\\s*batch|big\\s*batch|[1-6]\\s*week/i.test(text);\n const hasTimeSignals = countMatches(text, APPETITE_SIGNALS) > 0;\n if (hasSizeDecl) {\n satisfied.push(\"Size and timeframe declared\");\n criteria.push({ label: \"Size and timeframe declared\", met: true, weight: 4 });\n score += 4;\n } else if (hasTimeSignals) {\n satisfied.push(\"Time constraint mentioned\");\n criteria.push({ label: \"Size and timeframe declared\", met: false, weight: 4 });\n criteria.push({ label: \"Time constraint mentioned\", met: true, weight: 2 });\n score += 2;\n missing.push(\"Declare the batch size explicitly — Small Batch (1-2 weeks) or Big Batch (6 weeks).\");\n } else {\n criteria.push({ label: \"Size and timeframe declared\", met: false, weight: 4 });\n missing.push(\"Set a time constraint — how long is this bet allowed to take?\");\n }\n\n const hasTradeoffs = countMatches(text, SCOPE_SIGNALS) > 0;\n criteria.push({ label: \"Scope bounded with trade-offs\", met: hasTradeoffs, weight: 2 });\n if (hasTradeoffs) {\n satisfied.push(\"Scope bounded with trade-offs\");\n score += 2;\n } else {\n missing.push(\"What trade-offs are you making? What's the 80% cut?\");\n }\n\n const hasPhased = /phase\\s*[a-c1-3]|phased|milestone/i.test(text);\n criteria.push({ label: \"Phased delivery strategy\", met: hasPhased, weight: 2 });\n if (hasPhased) {\n satisfied.push(\"Phased delivery strategy\");\n score += 2;\n }\n\n const hasGate = /gate|validate|dogfood|benchmark|circuit.?breaker/i.test(text);\n criteria.push({ label: \"Validation gate defined\", met: hasGate, weight: 2 });\n if (hasGate) {\n satisfied.push(\"Validation gate defined\");\n score += 2;\n } else {\n missing.push(\"How will you know if this bet is working before full commitment?\");\n }\n\n return { score: clamp(score, 0, 10), missing, satisfied, criteria };\n}\n\nexport function scoreElements(ctx: ScoringContext): RubricScore {\n const text = ctx.dimensionTexts.elements;\n const missing: string[] = [];\n const satisfied: string[] = [];\n const criteria: ScoringCriterion[] = [];\n let score = 0;\n\n const headingCount = (text.match(/###\\s*Element\\s*\\d/gi) ?? []).length;\n const inlineCount = (text.match(/element\\s*\\d|component\\s*\\d|piece\\s*\\d/gi) ?? []).length;\n const ordinalCount = (text.match(/\\b(first|second|third|fourth|fifth)\\b[,:]?\\s/gi) ?? []).length;\n const numberedCount = (text.match(/^\\s*\\d+[.)]\\s/gm) ?? []).length;\n const namedCount = (text.match(/\\belement\\s+\\d|[A-Z][a-z]+ (?:Engine|Store|Gate|Manager|Service|Module|Handler|Layer|Registry|Pipeline)\\b/g) ?? []).length;\n const textDescribed = Math.max(headingCount, inlineCount, ordinalCount, numberedCount, namedCount);\n\n let elemMet = true;\n let elemWeight = 0;\n if (ctx.elementCount >= 3) {\n satisfied.push(`${ctx.elementCount} elements captured on Chain`);\n elemWeight = 5;\n score += 5;\n } else if (ctx.elementCount > 0) {\n satisfied.push(`${ctx.elementCount} element(s) captured`);\n elemWeight = ctx.elementCount * 2;\n score += ctx.elementCount * 2;\n if (ctx.elementCount < 3) {\n missing.push(`Identify ${3 - ctx.elementCount} more solution elements for adequate decomposition.`);\n }\n } else if (textDescribed >= 3) {\n satisfied.push(`${textDescribed} elements described in text`);\n elemWeight = 4;\n score += 4;\n missing.push(\"Capture these elements as typed entries on the Chain.\");\n } else if (textDescribed > 0) {\n satisfied.push(`${textDescribed} element(s) described in text`);\n elemWeight = textDescribed * 2;\n score += textDescribed * 2;\n missing.push(\"Identify more solution elements — aim for 3+ independently describable pieces.\");\n } else {\n elemMet = false;\n elemWeight = 5;\n missing.push(\"Identify solution elements — breadboard-level pieces, each independently describable.\");\n }\n criteria.push({ label: \"Solution elements identified\", met: elemMet, weight: elemWeight });\n\n const totalElements = Math.max(ctx.elementCount, textDescribed);\n const decompMet = totalElements >= 2;\n let decompWeight: number;\n if (totalElements >= 3) {\n satisfied.push(\"Multiple independently describable pieces\");\n decompWeight = 3;\n score += 3;\n } else if (totalElements >= 2) {\n satisfied.push(\"Multiple independently describable pieces\");\n decompWeight = 2;\n score += 2;\n } else {\n decompWeight = 3;\n }\n criteria.push({ label: \"Adequate decomposition (3+ pieces)\", met: decompMet, weight: decompWeight });\n\n const govMet = ctx.governanceCount > 0;\n criteria.push({ label: \"Governance constraints applied\", met: govMet, weight: 1 });\n if (govMet) {\n satisfied.push(`${ctx.governanceCount} governance entries constrain the solution`);\n score += 1;\n }\n\n return { score: clamp(score, 0, 10), missing, satisfied, criteria };\n}\n\nexport function scoreArchitecture(ctx: ScoringContext): RubricScore {\n const text = ctx.dimensionTexts.architecture;\n const missing: string[] = [];\n const satisfied: string[] = [];\n const criteria: ScoringCriterion[] = [];\n let score = 0;\n\n const hasArchSection = ctx.hasArchitectureText;\n criteria.push({ label: \"Architecture section present\", met: hasArchSection, weight: 3 });\n if (hasArchSection) {\n satisfied.push(\"Architecture section present in bet\");\n score += 3;\n } else {\n missing.push(\"Where does this live in the architecture? Name each layer and what belongs where.\");\n }\n\n const archSignals = countMatches(text, ARCHITECTURE_SIGNALS);\n const archVocabMet = archSignals > 0;\n const archVocabWeight = archSignals >= 3 ? 2 : archSignals > 0 ? 1 : 2;\n criteria.push({ label: \"Architecture vocabulary used\", met: archVocabMet, weight: archVocabWeight });\n if (archSignals >= 3) {\n satisfied.push(\"Architecture vocabulary used\");\n score += 2;\n } else if (archSignals > 0) {\n score += 1;\n } else {\n missing.push(\"Describe the API boundary, modules, and services involved.\");\n }\n\n const hasDependencyDir = countMatches(text, ARCH_QUALITY_SIGNALS) > 0;\n criteria.push({ label: \"Dependency direction specified\", met: hasDependencyDir, weight: 2 });\n if (hasDependencyDir) {\n satisfied.push(\"Dependency direction / boundaries specified\");\n score += 2;\n } else {\n missing.push(\"What dependencies does this create or remove? Specify direction.\");\n }\n\n const hasDiagram = /mermaid|diagram|flowchart|graph/i.test(text);\n criteria.push({ label: \"Visual architecture diagram\", met: hasDiagram, weight: 2 });\n if (hasDiagram) {\n satisfied.push(\"Visual architecture representation\");\n score += 2;\n } else {\n missing.push(\"Add an architecture diagram (Mermaid) showing layers and data flow.\");\n }\n\n const govMet = ctx.governanceCount > 0;\n criteria.push({ label: \"Checked against governance\", met: govMet, weight: 1 });\n if (govMet) {\n satisfied.push(\"Architecture checked against governance\");\n score += 1;\n }\n\n return { score: clamp(score, 0, 10), missing, satisfied, criteria };\n}\n\nexport function scoreRisks(ctx: ScoringContext): RubricScore {\n const text = ctx.dimensionTexts.risks;\n const missing: string[] = [];\n const satisfied: string[] = [];\n const criteria: ScoringCriterion[] = [];\n let score = 0;\n\n const riskSignalCount = countMatches(text, RISK_SIGNALS);\n const textRiskCount = (text.match(/rabbit hole|risk:|risk \\d|R\\d:/gi) ?? []).length;\n const totalRisks = Math.max(ctx.riskCount, textRiskCount, Math.min(riskSignalCount, 3));\n\n let riskMet = true;\n let riskWeight = 0;\n if (ctx.riskCount >= 2) {\n satisfied.push(`${ctx.riskCount} risks captured on Chain`);\n riskWeight = 4;\n score += 4;\n } else if (totalRisks >= 2) {\n satisfied.push(`${totalRisks} risks identified`);\n riskWeight = 3;\n score += 3;\n if (ctx.riskCount === 0) missing.push(\"Capture identified risks as entries on the Chain.\");\n } else if (totalRisks > 0 || riskSignalCount > 0) {\n satisfied.push(\"Risk language present\");\n riskWeight = 2;\n score += 2;\n missing.push(\"Identify more risks — aim for 2+ rabbit holes with mitigations.\");\n } else {\n riskMet = false;\n riskWeight = 4;\n missing.push(\"Name the rabbit holes — what could go wrong, what's unknown?\");\n }\n criteria.push({ label: \"Risks identified\", met: riskMet, weight: riskWeight });\n\n const mitigationCount = countMatches(text, MITIGATION_SIGNALS);\n let mitigMet = mitigationCount > 0;\n let mitigWeight: number;\n if (mitigationCount >= 2) {\n satisfied.push(\"Multiple mitigations specified\");\n mitigWeight = 3;\n score += 3;\n } else if (mitigationCount > 0) {\n satisfied.push(\"Mitigation present\");\n mitigWeight = 2;\n score += 2;\n missing.push(\"Each risk should have a mitigation or explicit acceptance.\");\n } else {\n mitigMet = false;\n mitigWeight = 3;\n missing.push(\"Each risk needs a mitigation or explicit acceptance.\");\n }\n criteria.push({ label: \"Mitigations specified\", met: mitigMet, weight: mitigWeight });\n\n const hasCodebaseRisks = /codebase|architecture|coupling|dependency|schema|migration/i.test(text);\n criteria.push({ label: \"Codebase-level risks identified\", met: hasCodebaseRisks, weight: 2 });\n if (hasCodebaseRisks) {\n satisfied.push(\"Codebase-level risks identified\");\n score += 2;\n } else {\n missing.push(\"Are there high-risk areas in the codebase? Check architecture and dependencies.\");\n }\n\n const thorough = totalRisks >= 3;\n criteria.push({ label: \"Thorough risk coverage\", met: thorough, weight: 1 });\n if (thorough) {\n satisfied.push(\"Thorough risk coverage\");\n score += 1;\n }\n\n return { score: clamp(score, 0, 10), missing, satisfied, criteria };\n}\n\nexport function scoreBoundaries(ctx: ScoringContext): RubricScore {\n const text = ctx.dimensionTexts.boundaries;\n const missing: string[] = [];\n const satisfied: string[] = [];\n const criteria: ScoringCriterion[] = [];\n let score = 0;\n\n const textNoGos = Math.max(countMatches(text, NOGO_SIGNALS), (text.match(/\\bwon'?t\\b|\\bwill not\\b/gi) ?? []).length);\n const totalNoGos = Math.max(ctx.noGoCount, textNoGos);\n\n let nogoMet = totalNoGos > 0;\n let nogoWeight: number;\n if (totalNoGos >= 3) {\n satisfied.push(`${totalNoGos} explicit no-gos declared`);\n nogoWeight = 5;\n score += 5;\n } else if (totalNoGos > 0) {\n satisfied.push(`${totalNoGos} no-go(s) declared`);\n nogoWeight = totalNoGos * 2;\n score += totalNoGos * 2;\n missing.push(\"Add more explicit no-gos to prevent scope creep.\");\n } else {\n nogoMet = false;\n nogoWeight = 5;\n missing.push(\"Declare what you're NOT building — explicit no-gos prevent scope creep.\");\n }\n criteria.push({ label: \"No-gos declared\", met: nogoMet, weight: nogoWeight });\n\n const hasScopeCreep = /scope creep|prevent|boundary|limit|constrain|excluded/i.test(text);\n criteria.push({ label: \"Scope creep prevention language\", met: hasScopeCreep, weight: 2 });\n if (hasScopeCreep) {\n satisfied.push(\"Scope creep prevention language\");\n score += 2;\n }\n\n const hasDirectional = /direction|instead.*will|rather.*than|not.*but/i.test(text);\n criteria.push({ label: \"Directional no-gos\", met: hasDirectional, weight: 2 });\n if (hasDirectional) {\n satisfied.push(\"Each no-go prevents scope creep in a specific direction\");\n score += 2;\n } else if (totalNoGos > 0) {\n missing.push(\"Each no-go should prevent scope creep in a specific direction.\");\n }\n\n const comprehensive = totalNoGos >= 5;\n criteria.push({ label: \"Comprehensive boundary specification\", met: comprehensive, weight: 1 });\n if (comprehensive) {\n satisfied.push(\"Comprehensive boundary specification\");\n score += 1;\n }\n\n return { score: clamp(score, 0, 10), missing, satisfied, criteria };\n}\n\nexport function scoreDoneWhen(ctx: ScoringContext): RubricScore {\n const text = ctx.dimensionTexts.done_when ?? \"\";\n const missing: string[] = [];\n const satisfied: string[] = [];\n const criteria: ScoringCriterion[] = [];\n let score = 0;\n\n const hasSection = text.trim().length > 0;\n criteria.push({ label: \"Done-when section present\", met: hasSection, weight: 3 });\n if (hasSection) {\n satisfied.push(\"Done-when section present\");\n score += 3;\n } else {\n missing.push(\"Define explicit done-when criteria.\");\n }\n\n const hasMeasurableTargets = /\\b\\d+%|\\bp\\d{2}|\\b>=?\\s*\\d+|\\b<=?\\s*\\d+|target|threshold|SLO|SLA|median/i.test(text);\n criteria.push({ label: \"Measurable targets defined\", met: hasMeasurableTargets, weight: 3 });\n if (hasMeasurableTargets) {\n satisfied.push(\"Measurable targets defined\");\n score += 3;\n } else if (hasSection) {\n missing.push(\"Add measurable targets (thresholds, percentages, latency targets, or numeric criteria).\");\n }\n\n const hasValidationPlan = /\\btest|verify|validation|contract test|rollback|drill|gate/i.test(text);\n criteria.push({ label: \"Validation plan specified\", met: hasValidationPlan, weight: 2 });\n if (hasValidationPlan) {\n satisfied.push(\"Validation plan specified\");\n score += 2;\n } else if (hasSection) {\n missing.push(\"Specify how success will be validated (tests, gates, rollback drills).\");\n }\n\n const hasSignals = countMatches(text, DONE_WHEN_SIGNALS) >= 3;\n criteria.push({ label: \"Operational signal coverage\", met: hasSignals, weight: 2 });\n if (hasSignals) {\n satisfied.push(\"Operational signal coverage\");\n score += 2;\n } else if (hasSection) {\n missing.push(\"Include operational signals (metrics, gates, and release thresholds).\");\n }\n\n return { score: clamp(score, 0, 10), missing, satisfied, criteria };\n}\n\n// ── Composite Scoring ──────────────────────────────────────────────────────\n\nconst SCORERS: Record<ShapingDimension, (ctx: ScoringContext) => RubricScore> = {\n problem_clarity: scoreProblemClarity,\n appetite: scoreAppetite,\n elements: scoreElements,\n architecture: scoreArchitecture,\n risks: scoreRisks,\n boundaries: scoreBoundaries,\n done_when: scoreDoneWhen,\n};\n\nexport function scoreDimension(dimension: ShapingDimension, ctx: ScoringContext): RubricScore {\n const raw = SCORERS[dimension](ctx);\n\n if (ctx.source === \"agent_proposal\") {\n return {\n ...raw,\n score: clamp(Math.round(raw.score * AGENT_DISCOUNT_FACTOR), 0, 10),\n };\n }\n\n return raw;\n}\n\nexport function scoreAll(ctx: ScoringContext): Record<ShapingDimension, RubricScore> {\n const results = {} as Record<ShapingDimension, RubricScore>;\n for (const dim of DIMENSIONS) {\n results[dim] = scoreDimension(dim, ctx);\n }\n return results;\n}\n\nexport function buildScorecard(ctx: ScoringContext): Scorecard {\n const results = scoreAll(ctx);\n return {\n problem_clarity: results.problem_clarity.score,\n appetite: results.appetite.score,\n elements: results.elements.score,\n architecture: results.architecture.score,\n risks: results.risks.score,\n boundaries: results.boundaries.score,\n done_when: results.done_when.score,\n };\n}\n\nexport interface DetailedScorecard {\n scorecard: Scorecard;\n criteria: Record<ShapingDimension, ScoringCriterion[]>;\n}\n\nexport function buildDetailedScorecard(ctx: ScoringContext, opts?: { isSmallBatch?: boolean }): DetailedScorecard {\n const results = scoreAll(ctx);\n const scorecard = {} as Scorecard;\n const criteria = {} as Record<ShapingDimension, ScoringCriterion[]>;\n for (const dim of DIMENSIONS) {\n scorecard[dim] = results[dim].score;\n criteria[dim] = results[dim].criteria;\n }\n if (opts?.isSmallBatch) scorecard.architecture = -1;\n return { scorecard, criteria };\n}\n\n// formatCriteriaLine moved to facilitate-format.ts per DEC-32\n\nexport function isCaptureReady(scorecard: Scorecard, isSmallBatch: boolean): { ready: boolean; completed: ShapingDimension[] } {\n const completed = completedDimensions(scorecard, 6, isSmallBatch);\n const dims = activeDimensions(isSmallBatch);\n const ready = completed.length >= (isSmallBatch ? 5 : 6) && dims.every((d) => scorecard[d] >= 4);\n return { ready, completed };\n}\n\nexport function inferActiveDimension(scorecard: Scorecard, isSmallBatch = false): ShapingDimension {\n const order = activeDimensions(isSmallBatch);\n\n // First pass: next unscored dimension in natural sequence\n const firstZero = order.find((d) => scorecard[d] === 0);\n if (firstZero) return firstZero;\n\n // Second pass: next dimension below threshold (6) in natural sequence\n const firstWeak = order.find((d) => scorecard[d] < 6);\n if (firstWeak) return firstWeak;\n\n // All above threshold — return last in sequence for final polish\n return order[order.length - 1];\n}\n\nexport function completedDimensions(scorecard: Scorecard, threshold = 6, isSmallBatch = false): ShapingDimension[] {\n return activeDimensions(isSmallBatch).filter((d) => scorecard[d] >= threshold);\n}\n\n// ── Suggested Captures ─────────────────────────────────────────────────────\n\nexport interface SuggestedCapture {\n type: \"element\" | \"risk\" | \"decision\" | \"tension\" | \"glossary\";\n name: string;\n reason: string;\n confidence: number;\n}\n\n/**\n * Detect capturable patterns from user input that haven't been captured yet.\n * Returns suggestions the agent can action — the server suggests, the agent decides.\n */\nexport function suggestCaptures(ctx: ScoringContext, activeDimension: ShapingDimension): SuggestedCapture[] {\n const suggestions: SuggestedCapture[] = [];\n const text = ctx.dimensionTexts[activeDimension];\n if (text.length < 30) return suggestions;\n\n if (activeDimension === \"problem_clarity\" || activeDimension === \"appetite\") {\n if (countMatches(text, WORKAROUND_SIGNALS) > 0 && ctx.riskCount === 0) {\n const match = text.match(/(?:workaround|currently|today|right now)[^.]{0,120}\\./i);\n if (match && isBalanced(match[0])) {\n suggestions.push({\n type: \"tension\",\n name: extractPhrase(match[0], 60),\n reason: \"Workaround described — captures the pain point as a trackable tension\",\n confidence: 0.7,\n });\n }\n }\n }\n\n if (activeDimension === \"elements\") {\n if (ctx.elementCount === 0 && /(?:service|component|module|layer|store|engine|kernel)/i.test(text)) {\n const match = text.match(/(?:a |the )?(\\w[\\w\\s]{2,30}(?:service|component|module|layer|store|engine|kernel))/i);\n if (match && isBalanced(match[1])) {\n suggestions.push({\n type: \"element\",\n name: capitalize(match[1].trim()),\n reason: \"Solution component identified — capture as a feature entry\",\n confidence: 0.8,\n });\n }\n }\n }\n\n if (activeDimension === \"risks\") {\n if (ctx.riskCount === 0 && countMatches(text, RISK_SIGNALS) >= 2) {\n const match = text.match(/(?:risk|rabbit hole|unknown|might|could fail)[^.]{0,120}\\./i);\n if (match && isBalanced(match[0])) {\n suggestions.push({\n type: \"risk\",\n name: extractPhrase(match[0], 60),\n reason: \"Risk language detected — capture as a tension with mitigation\",\n confidence: 0.7,\n });\n }\n }\n }\n\n if (/(?:we(?:'ll| will) (?:use|go with|pick|choose)|decided to|decision:|instead of)/i.test(text)) {\n const match = text.match(/(?:we(?:'ll| will) (?:use|go with|pick|choose)|decided to|decision:)[^.]{0,120}\\./i);\n if (match && isBalanced(match[0])) {\n suggestions.push({\n type: \"decision\",\n name: extractPhrase(match[0], 60),\n reason: \"Decision language detected — capture rationale while it's fresh\",\n confidence: 0.6,\n });\n }\n }\n\n return suggestions.slice(0, 3);\n}\n\nfunction extractPhrase(text: string, maxLen: number): string {\n const cleaned = text.replace(/^(?:the |a |an )/i, \"\").trim();\n return cleaned.length > maxLen ? cleaned.slice(0, maxLen - 3) + \"...\" : cleaned;\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction isBalanced(text: string): boolean {\n const opens = (text.match(/[(\"']/g) ?? []).length;\n const closes = (text.match(/[)\"']/g) ?? []).length;\n return Math.abs(opens - closes) <= 1;\n}\n\n// ── Investigation Briefs (ENT-59 FEAT-43) ──────────────────────────────────\n// Phase-specific investigation tasks that tell the agent what to explore,\n// what to propose, and how to present findings for user reaction.\n// No LLM calls here — these are deterministic instructions.\n\nexport interface InvestigationTask {\n target: \"codebase\" | \"chain\" | \"architecture\";\n query: string;\n purpose: string;\n}\n\nexport interface InvestigationBrief {\n phase: ShapingPhase;\n dimension: ShapingDimension;\n tasks: InvestigationTask[];\n proposalGuidance: string;\n reactionPrompt: string;\n}\n\nconst PHASE_INVESTIGATIONS: Record<ShapingPhase, (searchTerm: string, betEntryId: string, elementNames?: string[]) => InvestigationBrief | null> = {\n context: (searchTerm) => ({\n phase: \"context\",\n dimension: \"problem_clarity\",\n tasks: [\n { target: \"chain\", query: `Search for entries related to: ${searchTerm}`, purpose: \"Find existing tensions, decisions, and bets that overlap\" },\n { target: \"chain\", query: \"List active governance: principles, standards, business-rules\", purpose: \"Surface constraints the solution must honor\" },\n { target: \"codebase\", query: `Search for code related to: ${searchTerm}`, purpose: \"Understand current implementation and pain points\" },\n ],\n proposalGuidance: \"Synthesize findings into a 3-5 line context brief: what the Chain knows, what the codebase reveals, what governance applies.\",\n reactionPrompt: \"Here's what I found. Does this match what you're seeing, or is the problem different from what the Chain suggests?\",\n }),\n framing: (searchTerm) => ({\n phase: \"framing\",\n dimension: \"problem_clarity\",\n tasks: [\n { target: \"codebase\", query: `Find workarounds, TODOs, or hacks related to: ${searchTerm}`, purpose: \"Surface concrete evidence of the problem\" },\n { target: \"chain\", query: `Search for tensions related to: ${searchTerm}`, purpose: \"Quantify how often this problem occurs\" },\n ],\n proposalGuidance: \"Propose a problem statement based on codebase evidence. Include who's affected and what the workaround looks like in the code.\",\n reactionPrompt: \"Based on the codebase, here's a draft problem statement. Does this capture it, or is the real problem different?\",\n }),\n elements: (searchTerm, _betEntryId, elementNames) => ({\n phase: \"elements\",\n dimension: \"elements\",\n tasks: [\n { target: \"codebase\", query: `Find modules, services, and components that would be affected by: ${searchTerm}`, purpose: \"Map the solution to existing architecture\" },\n ...(elementNames?.length\n ? [{ target: \"codebase\" as const, query: `Locate existing code paths for these elements: ${elementNames.join(\", \")}`, purpose: \"Ground each proposed element in current implementation\" }]\n : []),\n { target: \"architecture\", query: \"Identify layer boundaries, API contracts, and dependency directions\", purpose: \"Ground elements in real architecture\" },\n { target: \"chain\", query: \"Check DEC-31, STA-3, and other architecture standards\", purpose: \"Ensure elements respect existing decisions\" },\n ],\n proposalGuidance: \"Propose 3-5 solution elements at breadboard level. Each element should name the layer it lives in, what it does, and how it connects to existing code.\",\n reactionPrompt: \"I've mapped out these solution elements based on the codebase. Which feel right? Which need adjustment?\",\n }),\n derisking: (searchTerm, _betEntryId, elementNames) => ({\n phase: \"derisking\",\n dimension: \"risks\",\n tasks: [\n { target: \"codebase\", query: `Find fragile code, tight coupling, or missing tests near: ${searchTerm}`, purpose: \"Surface technical risks from code\" },\n ...(elementNames?.length\n ? [{ target: \"codebase\" as const, query: `Check implementation complexity for: ${elementNames.join(\", \")}`, purpose: \"Assess element-specific risks\" }]\n : [{ target: \"codebase\" as const, query: \"Check for performance-sensitive paths, database queries, and external dependencies\", purpose: \"Identify performance and reliability risks\" }]),\n { target: \"chain\", query: \"Search for related tensions and past decisions that constrain this solution\", purpose: \"Surface risks from existing constraints\" },\n ],\n proposalGuidance: \"Propose rabbit holes with severity and mitigations. Each risk should cite specific code or Chain evidence. Also propose no-gos — what should be explicitly excluded.\",\n reactionPrompt: \"These are the risks I found in the codebase. Are these real concerns? What am I missing?\",\n }),\n validation: () => null,\n capture: () => null,\n};\n\nexport function buildInvestigationBrief(\n phase: ShapingPhase,\n betName: string,\n betEntryId: string,\n betProblem?: string,\n elementNames?: string[],\n): InvestigationBrief | null {\n const searchTerm = betProblem?.slice(0, 200) || betName;\n const builder = PHASE_INVESTIGATIONS[phase];\n return builder(searchTerm, betEntryId, elementNames);\n}\n\n// computeCommitBlockers lives in facilitate-validation.ts — import directly from there.\n\n// ── Build Contract Generation ──────────────────────────────────────────────\n\nexport interface BuildContractContext {\n governanceEntries: Array<{ entryId: string; name: string; collection: string }>;\n relatedDecisions: Array<{ entryId: string; name: string }>;\n relatedTensions: Array<{ entryId: string; name: string }>;\n betEntryId: string;\n}\n\nexport function generateBuildContract(ctx: BuildContractContext): string {\n const lines: string[] = [\"## Build Contract\"];\n\n const consult = [\n ...ctx.governanceEntries.map((e) => `- \\`${e.entryId}\\` ${e.name} [${e.collection}]`),\n ...ctx.relatedDecisions.map((e) => `- \\`${e.entryId}\\` ${e.name} [decision]`),\n ...ctx.relatedTensions.map((e) => `- \\`${e.entryId}\\` ${e.name} [tension]`),\n ];\n\n if (consult.length > 0) {\n lines.push(\"\", \"**Chain entries to consult before building:**\");\n lines.push(...consult);\n } else {\n lines.push(\"\", \"**Chain entries to consult:** Run `orient` to discover applicable rules.\");\n }\n\n lines.push(\n \"\",\n \"**Capture obligations during build:**\",\n \"- New glossary terms that emerge from implementation\",\n \"- Implementation decisions not covered in shaping\",\n \"- Bugs or tensions discovered during build\",\n \"- Any deviation from the shaped solution (capture as decision with rationale)\",\n \"\",\n \"**Post-build Chain update:**\",\n `- Update \\`${ctx.betEntryId}\\` with actual outcome vs. shaped intent`,\n \"- Commit any draft entries created during the build\",\n \"- Capture a retrospective if the build deviated significantly\",\n );\n\n return lines.join(\"\\n\");\n}\n","/**\n * Commit validation — pure functions for pre-commit checks.\n *\n * Chain: STA-1 (Constellation Capture Pattern), STD-5 (Chain Traceability)\n * Extracted from facilitate-rubrics.ts per DEC-32 (separate concerns).\n */\n\nexport interface CommitBlocker {\n entryId: string;\n blocker: string;\n fix: string;\n}\n\nexport function computeCommitBlockers(opts: {\n betEntryId: string;\n relations: Array<{ type: string }>;\n betData: Record<string, unknown>;\n sessionDrafts: Array<{ collection: string; name?: string }>;\n}): CommitBlocker[] {\n const { betEntryId, relations, betData, sessionDrafts } = opts;\n const blockers: CommitBlocker[] = [];\n const str = (key: string) => ((betData[key] as string) ?? \"\").trim();\n\n const hasStrategyLink = relations.some((r) => r.type === \"commits_to\");\n if (!hasStrategyLink) {\n blockers.push({\n entryId: betEntryId,\n blocker: \"Missing strategy link\",\n fix: `relations action=create from=${betEntryId} to=<strategy> type=commits_to`,\n });\n }\n\n const MIN_FIELD_LENGTH = 20;\n\n if (str(\"problem\").length < MIN_FIELD_LENGTH) {\n blockers.push({\n entryId: betEntryId,\n blocker: str(\"problem\") ? \"Problem statement too short (< 20 chars)\" : \"Missing problem statement\",\n fix: `update-entry entryId=\"${betEntryId}\" data.problem=\"<problem description>\"`,\n });\n }\n if (!str(\"appetite\")) {\n blockers.push({\n entryId: betEntryId,\n blocker: \"Missing appetite\",\n fix: `update-entry entryId=\"${betEntryId}\" data.appetite=\"<appetite declaration>\"`,\n });\n }\n if (str(\"elements\").length < MIN_FIELD_LENGTH) {\n blockers.push({\n entryId: betEntryId,\n blocker: str(\"elements\") ? \"Solution elements too short (< 20 chars)\" : \"Missing solution elements\",\n fix: `facilitate action=respond betEntryId=\"${betEntryId}\" dimension=\"elements\"`,\n });\n }\n\n const hasFeatures = sessionDrafts.some((d) => d.collection === \"features\");\n if (!hasFeatures && str(\"elements\").length >= MIN_FIELD_LENGTH) {\n blockers.push({\n entryId: betEntryId,\n blocker: \"Elements described but no feature entries linked in constellation\",\n fix: `facilitate action=respond betEntryId=\"${betEntryId}\" capture={type:\"element\", name:\"...\", description:\"...\"}`,\n });\n }\n\n for (const draft of sessionDrafts) {\n if (!draft.name || draft.name.trim().length === 0) {\n blockers.push({\n entryId: betEntryId,\n blocker: `Draft constellation entry is missing a name`,\n fix: `update-entry entryId=\"<draftId>\" name=\"<name>\"`,\n });\n }\n }\n\n return blockers;\n}\n","/**\n * Convention-compatible markdown formatter for coached shaping sessions.\n *\n * Produces markdown matching BetRenderer's parsing conventions (Element 6):\n * - Problem: first paragraph = hero, **Label:** = callout, rest = narrative\n * - Elements: ### Element N: Title headings\n * - Rabbit holes: ### RHN: Title headings\n * - No-gos: - **Title.** Explanation per line\n *\n * Phase A bridge — the contingent follow-up bet (constellation-native\n * rendering) removes this coupling.\n */\n\nimport type { ScoringCriterion } from \"./facilitate-rubrics.js\";\n\n// ── Scoring Presentation (DEC-32) ──────────────────────────────────────────\n\nexport function formatCriteriaLine(criteria: ScoringCriterion[]): string {\n return criteria\n .map((c) => `${c.met ? \"✓\" : \"○\"} ${c.label} (${c.weight}pt)`)\n .join(\" · \");\n}\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface BetFields {\n problem?: string;\n appetite?: string;\n elements?: string;\n rabbitHoles?: string;\n noGos?: string;\n solution?: string;\n}\n\nexport interface ElementEntry {\n name: string;\n description: string;\n entryId?: string;\n}\n\nexport interface RiskEntry {\n name: string;\n description: string;\n theme?: string;\n status?: string;\n entryId?: string;\n}\n\nexport interface NoGoItem {\n title: string;\n explanation: string;\n}\n\n// ── Problem Formatting ─────────────────────────────────────────────────────\n\nexport function formatProblem(parts: {\n hero: string;\n callouts?: Array<{ label: string; content: string }>;\n narrative?: string;\n}): string {\n const lines: string[] = [parts.hero];\n\n if (parts.callouts?.length) {\n lines.push(\"\");\n for (const c of parts.callouts) {\n lines.push(`**${c.label}:** ${c.content}`);\n }\n }\n\n if (parts.narrative) {\n lines.push(\"\");\n lines.push(parts.narrative);\n }\n\n return lines.join(\"\\n\");\n}\n\n// ── Element Formatting ─────────────────────────────────────────────────────\n\nexport function formatElements(elements: ElementEntry[]): string {\n return elements\n .map((el, i) => {\n const id = el.entryId ? ` (${el.entryId})` : \"\";\n return `### Element ${i + 1}: ${el.name}${id}\\n\\n${el.description}`;\n })\n .join(\"\\n\\n\");\n}\n\n// ── Rabbit Hole Formatting ─────────────────────────────────────────────────\n\nexport function formatRabbitHoles(risks: RiskEntry[]): string {\n return risks\n .map((r, i) => {\n const theme = r.theme ? ` (${r.theme})` : \"\";\n const status = r.status ? ` — ${r.status}` : \"\";\n const id = r.entryId ? ` [${r.entryId}]` : \"\";\n return `### RH${i + 1}: ${r.name}${theme}${status}${id}\\n\\n${r.description}`;\n })\n .join(\"\\n\\n\");\n}\n\n// ── No-Go Formatting ───────────────────────────────────────────────────────\n\nexport function formatNoGos(items: NoGoItem[]): string {\n return items\n .map((item) => `- **${item.title}.** ${item.explanation}`)\n .join(\"\\n\");\n}\n\n// ── Appetite Formatting ────────────────────────────────────────────────────\n\nexport function formatAppetite(parts: {\n size: string;\n duration: string;\n phases?: string[];\n validationGate?: string;\n eightyCut?: string;\n}): string {\n const lines: string[] = [\n `**${parts.size} — ${parts.duration}**`,\n ];\n\n if (parts.phases?.length) {\n lines.push(\"\");\n for (const phase of parts.phases) {\n lines.push(`- ${phase}`);\n }\n }\n\n if (parts.validationGate) {\n lines.push(\"\");\n lines.push(`**Validation gate:** ${parts.validationGate}`);\n }\n\n if (parts.eightyCut) {\n lines.push(\"\");\n lines.push(`**80% cut:** ${parts.eightyCut}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n// ── Composite Formatter ────────────────────────────────────────────────────\n\n/**\n * Build a complete bet data object with convention-compatible markdown.\n * Only includes fields that have content — safe for incremental updates.\n */\nexport function buildBetFields(parts: Partial<{\n problem: string;\n appetite: string;\n elements: ElementEntry[];\n risks: RiskEntry[];\n noGos: NoGoItem[];\n solution: string;\n}>): BetFields {\n const fields: BetFields = {};\n\n if (parts.problem) fields.problem = parts.problem;\n if (parts.appetite) fields.appetite = parts.appetite;\n if (parts.elements?.length) fields.elements = formatElements(parts.elements);\n if (parts.risks?.length) fields.rabbitHoles = formatRabbitHoles(parts.risks);\n if (parts.noGos?.length) fields.noGos = formatNoGos(parts.noGos);\n if (parts.solution) fields.solution = parts.solution;\n\n return fields;\n}\n\n/**\n * Merge new bet fields into existing ones. New content replaces old\n * for the fields provided; unspecified fields are left unchanged.\n */\nexport function mergeBetFields(existing: BetFields, updates: BetFields): BetFields {\n return { ...existing, ...updates };\n}\n\n/**\n * Append an element to an existing elements markdown string.\n * Infers the next element number from existing content.\n */\nexport function appendElement(existing: string | undefined, element: ElementEntry): string {\n const existingCount = (existing?.match(/###\\s*Element\\s*\\d/gi) ?? []).length;\n const num = existingCount + 1;\n const id = element.entryId ? ` (${element.entryId})` : \"\";\n const newBlock = `### Element ${num}: ${element.name}${id}\\n\\n${element.description}`;\n return existing ? `${existing}\\n\\n${newBlock}` : newBlock;\n}\n\n/**\n * Append a rabbit hole to an existing rabbit holes markdown string.\n */\nexport function appendRabbitHole(existing: string | undefined, risk: RiskEntry): string {\n const existingCount = (existing?.match(/###\\s*RH\\d/gi) ?? []).length;\n const num = existingCount + 1;\n const theme = risk.theme ? ` (${risk.theme})` : \"\";\n const status = risk.status ? ` — ${risk.status}` : \"\";\n const id = risk.entryId ? ` [${risk.entryId}]` : \"\";\n const newBlock = `### RH${num}: ${risk.name}${theme}${status}${id}\\n\\n${risk.description}`;\n return existing ? `${existing}\\n\\n${newBlock}` : newBlock;\n}\n\n/**\n * Append a no-go line to existing no-gos markdown.\n */\nexport function appendNoGo(existing: string | undefined, item: NoGoItem): string {\n const line = `- **${item.title}.** ${item.explanation}`;\n return existing ? `${existing}\\n${line}` : line;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation } from \"../client.js\";\nimport { trackWriteTool } from \"../tool-surface.js\";\n\n// ── Types ──────────────────────────────────────────────────────────────\n\ntype MappingKind = \"file\" | \"schema\" | \"conceptual\";\ntype CheckResult = \"verified\" | \"drifted\" | \"unverifiable\";\n\ninterface MappingCheck {\n entryId: string;\n entryName: string;\n field: string;\n kind: MappingKind;\n result: CheckResult;\n reason: string;\n currentStatus: string;\n}\n\ninterface RefCheck {\n entryId: string;\n entryName: string;\n refValue: string;\n found: boolean;\n}\n\n// ── Project Root Resolution ────────────────────────────────────────────\n\nfunction resolveProjectRoot(): string | null {\n const candidates = [\n process.env.WORKSPACE_PATH,\n process.cwd(),\n resolve(process.cwd(), \"..\"),\n ].filter(Boolean) as string[];\n\n for (const dir of candidates) {\n const resolved = resolve(dir);\n if (existsSync(resolve(resolved, \"convex/schema.ts\"))) return resolved;\n }\n return null;\n}\n\n// ── Schema Parser ──────────────────────────────────────────────────────\n\nfunction parseConvexSchema(schemaPath: string): Map<string, Set<string>> {\n const content = readFileSync(schemaPath, \"utf-8\");\n const tables = new Map<string, Set<string>>();\n let currentTable: string | null = null;\n\n for (const line of content.split(\"\\n\")) {\n const tableMatch = line.match(/^\\t(\\w+):\\s*defineTable\\(/);\n if (tableMatch) {\n currentTable = tableMatch[1];\n tables.set(currentTable, new Set());\n continue;\n }\n\n if (currentTable && /^\\t[}\\)]/.test(line) && !/^\\t\\t/.test(line)) {\n currentTable = null;\n continue;\n }\n\n if (currentTable) {\n const fieldMatch = line.match(/^\\t\\t(\\w+):\\s*v\\./);\n if (fieldMatch) tables.get(currentTable)!.add(fieldMatch[1]);\n }\n }\n\n return tables;\n}\n\n// ── Code Mapping Classifiers ───────────────────────────────────────────\n\nfunction cleanFieldRef(field: string): string {\n return field\n .replace(/\\s*\\(.*\\)\\s*$/, \"\")\n .replace(/\\s*=\\s*.*$/, \"\")\n .trim();\n}\n\nfunction splitMultiRefs(field: string): string[] {\n if (field.includes(\" + \")) return field.split(/\\s*\\+\\s*/);\n return [field];\n}\n\nconst FILE_EXT_RE = /\\.(ts|js|svelte|json|css|md|jsx|tsx|mjs|cjs)(?:\\s|$)/i;\n\nfunction classifyRef(cleaned: string): MappingKind {\n if (cleaned.includes(\"/\") || FILE_EXT_RE.test(cleaned) || /^\\.\\w+/.test(cleaned)) {\n return \"file\";\n }\n if (/^\\w+\\.\\w+$/.test(cleaned)) return \"schema\";\n if (/^\\w+\\s+table$/i.test(cleaned)) return \"schema\";\n return \"conceptual\";\n}\n\n// ── Verification Checkers ──────────────────────────────────────────────\n\nfunction checkFileRef(ref: string, root: string): { result: CheckResult; reason: string } {\n const filePart = ref.split(/\\s+/)[0];\n const fullPath = resolve(root, filePart);\n if (existsSync(fullPath)) return { result: \"verified\", reason: \"exists\" };\n return { result: \"drifted\", reason: `not found: ${filePart}` };\n}\n\nfunction checkSchemaRef(\n ref: string,\n schema: Map<string, Set<string>>,\n): { result: CheckResult; reason: string } {\n const tableOnlyMatch = ref.match(/^(\\w+)\\s+table$/i);\n if (tableOnlyMatch) {\n const table = tableOnlyMatch[1];\n if (schema.has(table)) return { result: \"verified\", reason: `table \"${table}\" exists` };\n return { result: \"drifted\", reason: `table \"${table}\" not found in schema` };\n }\n\n const dotIdx = ref.indexOf(\".\");\n if (dotIdx > 0) {\n const table = ref.slice(0, dotIdx);\n const field = ref.slice(dotIdx + 1);\n if (!schema.has(table)) return { result: \"drifted\", reason: `table \"${table}\" not found in schema` };\n if (!schema.get(table)!.has(field)) return { result: \"drifted\", reason: `field \"${field}\" not found in table \"${table}\"` };\n return { result: \"verified\", reason: `${table}.${field} exists` };\n }\n\n return { result: \"unverifiable\", reason: \"could not parse schema reference\" };\n}\n\n// ── Trust Report Formatter ─────────────────────────────────────────────\n\nfunction formatTrustReport(\n collection: string,\n entryCount: number,\n mappings: MappingCheck[],\n refs: RefCheck[],\n fixes: string[],\n mode: string,\n schemaTableCount: number,\n projectRoot: string,\n): string {\n const verified = mappings.filter((c) => c.result === \"verified\").length;\n const drifted = mappings.filter((c) => c.result === \"drifted\").length;\n const unverifiable = mappings.filter((c) => c.result === \"unverifiable\").length;\n\n const refsValid = refs.filter((c) => c.found).length;\n const refsBroken = refs.filter((c) => !c.found).length;\n\n const totalChecks = mappings.length + refs.length;\n const totalPassed = verified + refsValid;\n const trustScore = totalChecks > 0 ? Math.round((totalPassed / totalChecks) * 100) : 100;\n\n const lines: string[] = [\n `# Trust Report: ${collection} (${entryCount} entries scanned)`,\n \"\",\n ];\n\n if (mappings.length > 0) {\n lines.push(\n \"## Code Mapping Verification\",\n `- ${mappings.length} mappings checked`,\n `- ${verified} verified (${Math.round((verified / mappings.length) * 100)}%)`,\n `- ${drifted} drifted (file/schema not found)`,\n `- ${unverifiable} unverifiable (conceptual — skipped)`,\n \"\",\n );\n }\n\n if (drifted > 0) {\n lines.push(\"### Drifted Mappings\");\n for (const mc of mappings.filter((c) => c.result === \"drifted\")) {\n lines.push(`- **${mc.entryId}** (${mc.entryName}): \\`${mc.field}\\` — ${mc.reason}`);\n }\n lines.push(\"\");\n }\n\n if (unverifiable > 0) {\n lines.push(\"### Unverifiable (Conceptual)\");\n for (const mc of mappings.filter((c) => c.result === \"unverifiable\")) {\n lines.push(`- **${mc.entryId}** (${mc.entryName}): \\`${mc.field}\\``);\n }\n lines.push(\"\");\n }\n\n if (refs.length > 0) {\n lines.push(\n \"## Cross-Reference Verification\",\n `- ${refs.length} references checked`,\n `- ${refsValid} valid (${refs.length > 0 ? Math.round((refsValid / refs.length) * 100) : 0}%)`,\n `- ${refsBroken} broken`,\n \"\",\n );\n }\n\n if (refsBroken > 0) {\n lines.push(\"### Broken References\");\n for (const rc of refs.filter((c) => !c.found)) {\n lines.push(`- **${rc.entryId}** (${rc.entryName}): relatedRules \\`${rc.refValue}\\` — entry not found`);\n }\n lines.push(\"\");\n }\n\n lines.push(`## Trust Score: ${trustScore}% (${totalPassed} of ${totalChecks} checks passed)`);\n\n if (mode === \"fix\" && fixes.length > 0) {\n lines.push(\n \"\",\n \"## Applied Fixes\",\n `Updated codeMapping status from \\`aligned\\` → \\`drifted\\` on ${fixes.length} entr${fixes.length === 1 ? \"y\" : \"ies\"}:`,\n );\n for (const eid of fixes) lines.push(`- ${eid}`);\n } else if (mode === \"report\" && drifted > 0) {\n const fixable = mappings.filter((c) => c.result === \"drifted\" && c.currentStatus === \"aligned\").length;\n if (fixable > 0) {\n lines.push(\"\", `_${fixable} mapping(s) marked \"aligned\" but actually drifted. Run with mode=\"fix\" to update._`);\n }\n }\n\n lines.push(\"\", \"---\", `_Schema: ${schemaTableCount} tables parsed from convex/schema.ts. Project root: ${projectRoot}_`);\n\n return lines.join(\"\\n\");\n}\n\n// ── Tool Registration ──────────────────────────────────────────────────\n\nexport const verifySchema = z.object({\n collection: z.string().default(\"glossary\")\n .describe(\"Collection slug to verify (default: glossary)\"),\n mode: z.enum([\"report\", \"fix\"]).default(\"report\")\n .describe(\"'report' = read-only trust report. 'fix' = also update drifted codeMapping statuses.\"),\n});\n\nexport function registerVerifyTools(server: McpServer) {\n const verifyTool = server.registerTool(\n \"verify\",\n {\n title: \"Verify the Chain\",\n description:\n \"Verify knowledge entries against the actual codebase. Checks glossary code mappings \" +\n \"(do referenced files and schema fields still exist?) and validates cross-references \" +\n \"(do relatedRules point to real entries?). Produces a trust report with a trust score. \" +\n \"Use mode='fix' to auto-update drifted codeMapping statuses.\",\n inputSchema: verifySchema,\n annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: false },\n },\n async ({ collection, mode }) => {\n const projectRoot = resolveProjectRoot();\n if (!projectRoot) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"# Verification Failed\\n\\n\" +\n \"Cannot find project root (looked for `convex/schema.ts` in cwd and parent directory).\\n\\n\" +\n \"Set `WORKSPACE_PATH` in `.env.mcp` to the absolute path of the Product Brain project root.\",\n }],\n };\n }\n\n const schema = parseConvexSchema(resolve(projectRoot, \"convex/schema.ts\"));\n\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Verifying \"${collection}\" against ${schema.size} schema tables at ${projectRoot}`,\n logger: \"product-os\",\n });\n\n const scopedEntries = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: collection });\n\n if (scopedEntries.length === 0) {\n return {\n content: [{ type: \"text\" as const, text: `No entries found in \\`${collection}\\`. Nothing to verify.` }],\n };\n }\n\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Scanning ${scopedEntries.length} entries in ${collection}...`,\n logger: \"product-brain\",\n });\n\n // Build cross-reference lookup: fetch all entries to check relatedRules\n let allEntryIds: Set<string>;\n try {\n const allEntries = await mcpQuery<any[]>(\"chain.listEntries\", {});\n allEntryIds = new Set(allEntries.map((e: any) => e.entryId).filter(Boolean));\n } catch {\n allEntryIds = new Set(scopedEntries.map((e: any) => e.entryId).filter(Boolean));\n }\n\n const mappingChecks: MappingCheck[] = [];\n const refChecks: RefCheck[] = [];\n\n for (let idx = 0; idx < scopedEntries.length; idx++) {\n const entry = scopedEntries[idx];\n\n if (idx > 0 && idx % 10 === 0) {\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Scanned ${idx}/${scopedEntries.length} entries...`,\n logger: \"product-brain\",\n });\n }\n\n const eid = entry.entryId ?? entry.name;\n const ename = entry.name;\n\n // ── Code mapping verification ──\n const codeMappings: any[] = entry.data?.codeMapping ?? [];\n for (const cm of codeMappings) {\n const rawField: string = cm.field ?? \"\";\n for (const rawRef of splitMultiRefs(rawField)) {\n const cleaned = cleanFieldRef(rawRef);\n if (!cleaned) continue;\n\n const kind = classifyRef(cleaned);\n let result: CheckResult;\n let reason: string;\n\n if (kind === \"file\") {\n ({ result, reason } = checkFileRef(cleaned, projectRoot));\n } else if (kind === \"schema\") {\n ({ result, reason } = checkSchemaRef(cleaned, schema));\n } else {\n result = \"unverifiable\";\n reason = \"conceptual reference\";\n }\n\n mappingChecks.push({\n entryId: eid, entryName: ename, field: rawRef.trim(),\n kind, result, reason, currentStatus: cm.status ?? \"unknown\",\n });\n }\n }\n\n // ── Cross-reference verification (relatedRules only) ──\n const MAX_CROSS_REFS = 50;\n const relatedRules: string[] = entry.data?.relatedRules ?? [];\n for (const ruleId of relatedRules) {\n if (refChecks.length >= MAX_CROSS_REFS) break;\n refChecks.push({\n entryId: eid, entryName: ename, refValue: ruleId,\n found: allEntryIds.has(ruleId),\n });\n }\n }\n\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Scan complete. Building trust report...`,\n logger: \"product-brain\",\n });\n\n // ── Fix mode: update aligned → drifted ──\n const fixes: string[] = [];\n if (mode === \"fix\") {\n const driftedByEntry = new Map<string, Set<string>>();\n for (const mc of mappingChecks) {\n if (mc.result === \"drifted\" && mc.currentStatus === \"aligned\") {\n if (!driftedByEntry.has(mc.entryId)) driftedByEntry.set(mc.entryId, new Set());\n driftedByEntry.get(mc.entryId)!.add(mc.field);\n }\n }\n\n for (const [eid, driftedFields] of driftedByEntry) {\n const entry = scopedEntries.find((e: any) => (e.entryId ?? e.name) === eid);\n if (!entry?.entryId) continue;\n\n const updated = (entry.data?.codeMapping ?? []).map((cm: any) =>\n cm.status === \"aligned\" && driftedFields.has(cm.field)\n ? { ...cm, status: \"drifted\" }\n : cm,\n );\n\n await mcpMutation(\"chain.updateEntry\", {\n entryId: entry.entryId,\n data: { codeMapping: updated },\n });\n fixes.push(entry.entryId);\n }\n }\n\n const report = formatTrustReport(\n collection, scopedEntries.length,\n mappingChecks, refChecks, fixes, mode,\n schema.size, projectRoot,\n );\n\n return { content: [{ type: \"text\" as const, text: report }] };\n },\n );\n trackWriteTool(verifyTool);\n}\n","/**\n * `start` tool — the unified MCP entry point for Product Brain.\n *\n * BET-76 FEAT-108: Stage-aware response branches on readiness stage.\n * Replaced detectFreshWorkspace() (used stratum !== 'system', wrong axis) with\n * chain.workspaceReadiness stage (uses !seededByPlatform, correct axis).\n *\n * Stage decision table:\n * blank → project scan instructions (FEAT-107) or preset menu if preset provided\n * seeded → \"picking up where you left off\" + top 3 gaps\n * grounded → standup briefing (existing orient-style response)\n * connected → full context brief (existing orient-style response)\n *\n * `orient` continues to exist unchanged for backward compatibility.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n mcpQuery,\n mcpMutation,\n mcpCall,\n getWorkspaceContext,\n getAgentSessionId,\n setSessionOriented,\n} from \"../client.js\";\nimport { listPresets, getPreset } from \"../presets/collections.js\";\nimport { queryPlannedWork, hasPlannedWork, buildPlannedWorkSection, formatRecoveryBlock } from \"./planned-work.js\";\nimport { buildOperatingProtocol, type ActiveBet } from \"./orient-shared.js\";\nimport { buildInterviewResponse } from \"./start-interview.js\";\n\nexport const startSchema = z.object({\n preset: z\n .string()\n .optional()\n .describe(\n \"Collection preset ID to seed (e.g. 'software-product', 'content-business', 'agency', 'saas-api', 'general'). \" +\n \"Only used for fresh workspaces. If omitted on a fresh workspace, returns the preset menu.\"\n ),\n});\n\nexport function registerStartTools(server: McpServer) {\n server.registerTool(\n \"start\",\n {\n title: \"Start Product Brain\",\n description:\n \"The zero-friction entry point. Say 'start PB' to begin.\\n\\n\" +\n \"- **Fresh workspace (blank)**: scans your codebase and seeds knowledge from what it finds.\\n\" +\n \"- **Early workspace (seeded)**: picks up where you left off with the top gaps to fill.\\n\" +\n \"- **Active workspace (grounded/connected)**: standup briefing with recent activity and open items.\\n\\n\" +\n \"Use this as your first call. Replaces the need to call orient or health separately.\",\n inputSchema: startSchema,\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },\n },\n async ({ preset }) => {\n const errors: string[] = [];\n const agentSessionId = getAgentSessionId();\n\n let wsCtx: Awaited<ReturnType<typeof getWorkspaceContext>> | null = null;\n try {\n wsCtx = await getWorkspaceContext();\n } catch (e: any) {\n errors.push(`Workspace: ${e.message}`);\n }\n\n if (!wsCtx) {\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n \"# Could not connect to Product Brain\\n\\n\" +\n (errors.length > 0 ? errors.map((e) => `- ${e}`).join(\"\\n\") : \"Check your API key and CONVEX_SITE_URL.\"),\n },\n ],\n };\n }\n\n // BET-76 FEAT-108: Branch on readiness stage (replaces detectFreshWorkspace).\n // chain.workspaceReadiness uses !seededByPlatform — correct axis.\n let stage: string | null = null; // null = readiness call failed\n let readiness: any = null;\n try {\n readiness = await mcpQuery<any>(\"chain.workspaceReadiness\");\n stage = readiness?.stage ?? \"blank\";\n } catch {\n // Readiness unavailable — fall through to orient (safest degraded path).\n // Do NOT default to \"blank\": an active workspace seeing project-scan instructions\n // on a transient error would be actively harmful.\n errors.push(\"Readiness check unavailable — showing workspace summary.\");\n }\n\n // Backward compat: if preset explicitly provided, seed it (blank stage only).\n if (stage === \"blank\" && preset) {\n return { content: [{ type: \"text\" as const, text: await seedPreset(wsCtx, preset, agentSessionId) }] };\n }\n\n if (stage === \"blank\") {\n return { content: [{ type: \"text\" as const, text: buildProjectScanResponse(wsCtx) }] };\n }\n\n if (stage === \"seeded\") {\n const text = await buildSeededResponse(wsCtx, readiness, agentSessionId);\n // BET-76: durable onboarding stamp — workspace is past blank, mark it so the\n // web gate never re-shows even if the user rotates their API key.\n void mcpMutation(\"chain.setOnboardingCompleted\", {}).catch(() => { /* non-critical */ });\n return { content: [{ type: \"text\" as const, text }] };\n }\n\n // grounded or connected (or readiness failed) — full orient-style response\n if (stage === \"grounded\" || stage === \"connected\") {\n void mcpMutation(\"chain.setOnboardingCompleted\", {}).catch(() => { /* non-critical */ });\n }\n return { content: [{ type: \"text\" as const, text: await buildOrientResponse(wsCtx, agentSessionId, errors) }] };\n }\n );\n}\n\n/**\n * BET-76 FEAT-107: Project scan instructions for blank stage.\n *\n * The MCP server cannot read local files — this response instructs the calling\n * LLM (agent in the IDE) to scan the codebase and present findings for confirmation.\n * Commitment class: agent-inferred entries ALWAYS require explicit user confirmation\n * before capture is called. Pass `autoCommit: false` to all captures from this flow.\n */\nfunction buildProjectScanResponse(wsCtx: { workspaceName: string; workspaceSlug: string }): string {\n return [\n `# Welcome to ${wsCtx.workspaceName}`,\n \"\",\n \"Your workspace is fresh. Let me get oriented in your codebase.\",\n \"\",\n \"**Please read these files and tell me what you find:**\",\n \"1. `README.md` (or equivalent — top-level docs)\",\n \"2. `package.json` / `pyproject.toml` / `Cargo.toml` (project manifest)\",\n \"3. Top-level source directories and their purpose\",\n \"\",\n \"From those, infer 5–8 product knowledge entries — things like:\",\n \"- **Product name and what it does** (1–2 sentences)\",\n \"- **Key technical decisions** already made (framework, DB, architecture)\",\n \"- **Core features** the codebase reveals\",\n \"- **Conventions** you notice (naming, patterns, standards)\",\n \"\",\n \"Present them as a numbered list:\",\n \"```\",\n \"1. [Entry name]: [1-sentence description]\",\n \"2. ...\",\n \"```\",\n \"\",\n \"Then ask: **\\\"Which of these are accurate? Reply with numbers to skip (e.g. 'skip 2, 4') \" +\n \"or say 'all good' to capture everything.\\\"**\",\n \"\",\n \"Once confirmed, call `capture` for each entry with `autoCommit: false` — the user will review before anything hits the Chain.\",\n \"\",\n \"**If the codebase is sparse** (no README, empty project, monorepo root): say so and ask \" +\n \"\\\"Tell me about your product in a sentence — what does it do and who is it for?\\\" instead.\",\n \"\",\n \"_Prefer 5 specific entries over 8 generic ones. Skip anything that would apply to any codebase._\",\n ].join(\"\\n\");\n}\n\nasync function buildSeededResponse(\n wsCtx: { workspaceName: string; workspaceSlug: string; workspaceId: string },\n readiness: any,\n agentSessionId: string | null,\n): Promise<string> {\n // BET-76 FEAT-108: seeded stage — picking up where we left off + top 3 gaps.\n const lines: string[] = [\n `# ${wsCtx.workspaceName}`,\n \"_Picking up where you left off._\",\n \"\",\n ];\n\n const stage = readiness?.stage ?? \"seeded\";\n const score = readiness?.score;\n if (score !== undefined) {\n lines.push(`**Brain stage: ${stage}.** Readiness score: ${score}/100.`);\n lines.push(\"\");\n }\n\n const gaps: any[] = readiness?.gaps ?? [];\n if (gaps.length > 0) {\n lines.push(\"## Top gaps to fill\");\n for (const gap of gaps.slice(0, 3)) {\n const cta = gap.capabilityGuidance ?? gap.guidance ?? `Capture ${gap.label.toLowerCase()} to unlock this.`;\n lines.push(`**${gap.label}** — ${cta}`);\n }\n lines.push(\"\");\n if (gaps.length > 3) {\n lines.push(`_${gaps.length - 3} more gap${gaps.length - 3 === 1 ? \"\" : \"s\"} — use \\`health action=status\\` for the full list._`);\n lines.push(\"\");\n }\n } else {\n lines.push(\"No gaps detected — workspace is filling up nicely.\");\n lines.push(\"\");\n }\n\n lines.push(\"What would you like to work on?\");\n lines.push(\"\");\n\n if (agentSessionId) {\n try {\n await mcpCall(\"agent.markOriented\", { sessionId: agentSessionId });\n setSessionOriented(true);\n lines.push(\"---\");\n lines.push(\"Orientation complete. Write tools available.\");\n } catch {\n lines.push(\"---\");\n lines.push(\"_Warning: Could not mark session as oriented._\");\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nasync function seedPreset(\n wsCtx: { workspaceName: string; workspaceSlug: string },\n presetId: string,\n agentSessionId: string | null,\n): Promise<string> {\n const preset = getPreset(presetId);\n if (!preset) {\n return (\n `Preset \"${presetId}\" not found.\\n\\n` +\n `Available presets: ${listPresets().map((p) => `\\`${p.id}\\``).join(\", \")}`\n );\n }\n\n const seeded: string[] = [];\n const skipped: string[] = [];\n\n for (const col of preset.collections) {\n try {\n await mcpCall(\"chain.createCollection\", {\n slug: col.slug,\n name: col.name,\n description: col.description,\n icon: col.icon,\n idPrefix: col.idPrefix,\n fields: col.fields,\n createdBy: \"preset:\" + presetId,\n });\n seeded.push(col.name);\n } catch {\n skipped.push(`${col.name} (already exists)`);\n }\n }\n\n if (agentSessionId) {\n try {\n await mcpCall(\"agent.markOriented\", { sessionId: agentSessionId });\n setSessionOriented(true);\n } catch { /* non-critical */ }\n }\n\n const lines = [\n `# ${wsCtx.workspaceName} is ready`,\n \"\",\n `Seeded **${preset.name}** preset with ${seeded.length} collection${seeded.length === 1 ? \"\" : \"s\"}:`,\n \"\",\n ];\n\n for (const name of seeded) {\n lines.push(`- ${name}`);\n }\n\n if (skipped.length > 0) {\n lines.push(\"\", \"Skipped (already exist):\");\n for (const name of skipped) {\n lines.push(`- ${name}`);\n }\n }\n\n lines.push(\n \"\",\n buildInterviewResponse(wsCtx.workspaceName),\n \"\",\n \"_You can also customize your structure anytime: `collections action=create`, `collections action=update`, or `collections action=list`._\",\n \"\",\n \"---\",\n \"Orientation complete. Write tools are available.\",\n );\n\n return lines.join(\"\\n\");\n}\n\nfunction computeWorkspaceAge(createdAt: number | null): { ageDays: number; isNeglected: boolean } {\n if (!createdAt) return { ageDays: 0, isNeglected: false };\n const ageDays = Math.floor((Date.now() - createdAt) / (1000 * 60 * 60 * 24));\n return { ageDays, isNeglected: ageDays >= 30 };\n}\n\nfunction pickNextAction(\n gaps: any[],\n openTensions: any[],\n priorSessions: any[],\n): { action: string; cta: string } | null {\n if (gaps.length === 0 && openTensions.length === 0) return null;\n\n // First gap is already sorted by the backend (singletons first, gap-ratio descending — DEC-105).\n // capabilityGuidance is the v2 plain-English CTA; guidance is the backward-compat fallback.\n if (gaps.length > 0) {\n const gap = gaps[0];\n const cta =\n gap.capabilityGuidance ??\n gap.guidance ??\n `Tell me about your ${gap.label.toLowerCase()} and I'll capture it.`;\n return { action: gap.label, cta };\n }\n\n if (openTensions.length > 0) {\n const t = openTensions[0];\n return {\n action: `Open tension: ${t.name}`,\n cta: \"Want to discuss this tension or capture a decision about it?\",\n };\n }\n\n return null;\n}\n\nasync function buildOrientResponse(\n wsCtx: { workspaceName: string; workspaceSlug: string; workspaceId: string },\n agentSessionId: string | null,\n errors: string[],\n): Promise<string> {\n const wsFullCtx = await getWorkspaceContext();\n const { ageDays, isNeglected } = computeWorkspaceAge(wsFullCtx.createdAt);\n\n let priorSessions: any[] = [];\n let recoveryBlock: Record<string, unknown> | null = null;\n try {\n const sessionsResult = await mcpQuery<{ sessions: any[]; recoveryBlock: Record<string, unknown> | null }>(\"agent.recentSessions\", { limit: 3 });\n priorSessions = sessionsResult?.sessions ?? [];\n recoveryBlock = sessionsResult?.recoveryBlock ?? null;\n } catch { /* non-critical */ }\n\n let openTensions: any[] = [];\n try {\n const tensions = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"tensions\" });\n openTensions = (tensions ?? []).filter((e: any) => e.workflowStatus === \"open\");\n } catch { /* non-critical */ }\n\n let readiness: any = null;\n try {\n readiness = await mcpQuery<any>(\"chain.workspaceReadiness\");\n } catch (e: any) {\n errors.push(`Readiness: ${e.message}`);\n }\n\n const lines: string[] = [];\n // Use explicit null comparisons to avoid falsiness bug when score === 0.\n const isLowReadiness = readiness !== null && readiness.score < 50;\n const isHighReadiness = readiness !== null && readiness.score >= 50;\n // Only render stage framing when readiness is known; don't lie about stage if backend failed.\n const stage: string | null = readiness?.stage ?? null;\n\n // --- Identity ---\n lines.push(`# ${wsCtx.workspaceName}`);\n lines.push(`_Workspace \\`${wsCtx.workspaceSlug}\\` — Product Brain is healthy._`);\n lines.push(\"\");\n\n // --- New vs neglected framing ---\n if (isLowReadiness && isNeglected) {\n const stageNote = stage ? ` and is still at the **${stage}** stage` : \"\";\n lines.push(`Your workspace has been around for ${ageDays} days${stageNote}.`);\n lines.push(\"Let's close the gaps — or if the current structure doesn't fit, we can reshape it.\");\n lines.push(\"\");\n } else if (isLowReadiness) {\n if (stage) lines.push(`**Brain stage: ${stage}.** Let's get your workspace active.`);\n lines.push(\"\");\n }\n\n // --- Single next action (low-readiness) or standup briefing (high-readiness) ---\n if (isLowReadiness) {\n const nextAction = pickNextAction(readiness.gaps ?? [], openTensions, priorSessions);\n if (nextAction) {\n lines.push(\"## Recommended next step\");\n lines.push(`**${nextAction.action}**`);\n lines.push(\"\");\n lines.push(nextAction.cta);\n lines.push(\"\");\n lines.push(\"_Everything stays as a draft until you confirm. Say \\\"commit\\\" or \\\"looks good\\\" to promote to the Chain._\");\n lines.push(\"\");\n\n const remainingGaps = (readiness.gaps ?? []).length - 1;\n if (remainingGaps > 0 || openTensions.length > 0) {\n lines.push(`_${remainingGaps > 0 ? `${remainingGaps} more gap${remainingGaps === 1 ? \"\" : \"s\"}` : \"\"}${remainingGaps > 0 && openTensions.length > 0 ? \" and \" : \"\"}${openTensions.length > 0 ? `${openTensions.length} open tension${openTensions.length === 1 ? \"\" : \"s\"}` : \"\"} — ask \\\"show full status\\\" for details._`);\n lines.push(\"\");\n }\n }\n\n lines.push(\"_Need a collection that doesn't exist yet (e.g. audiences, personas, metrics)?_\");\n lines.push(\"_Use `collections action=create` to add it, or ask me to propose collections for your domain._\");\n lines.push(\"\");\n } else if (isHighReadiness) {\n if (readiness) {\n lines.push(`**Brain stage: ${stage}.**`);\n }\n\n // Surface governance: principles, standards, business-rules\n let wsPrinciples: any[] = [];\n let wsStandards: any[] = [];\n let wsBusinessRules: any[] = [];\n try {\n const govSlugs = [\"principles\", \"standards\", \"business-rules\"] as const;\n const govLabels: Record<string, string> = {\n principles: \"Principles\",\n standards: \"Standards\",\n \"business-rules\": \"Business Rules\",\n };\n const govEntries: Array<{ slug: string; entries: any[] }> = [];\n for (const slug of govSlugs) {\n const entries = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: slug });\n const active = (entries ?? []).filter((e: any) => e.status === \"active\");\n if (active.length > 0) {\n govEntries.push({ slug, entries: active });\n if (slug === \"principles\") wsPrinciples = active;\n if (slug === \"standards\") wsStandards = active;\n if (slug === \"business-rules\") wsBusinessRules = active;\n }\n }\n if (govEntries.length > 0) {\n lines.push(\"\");\n lines.push(\"## Workspace Governance — constraints\");\n lines.push(\"_These constrain what you build. If your proposal conflicts with any of these, stop and flag it._\");\n lines.push(\"\");\n for (const g of govEntries) {\n lines.push(`**${govLabels[g.slug]}:**`);\n for (const e of g.entries.slice(0, 8)) {\n lines.push(`- \\`${e.entryId ?? e.name}\\` ${e.name}`);\n }\n lines.push(\"\");\n }\n }\n } catch { /* non-critical */ }\n\n // Surface active bets as scope boundary\n let activeBets: ActiveBet[] = [];\n try {\n const betEntries = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"bets\" });\n activeBets = (betEntries ?? [])\n .filter((e: any) => e.status === \"active\" && e.data?.horizon === \"now\")\n .slice(0, 8);\n if (activeBets.length > 0) {\n lines.push(\"\");\n lines.push(\"## Active bets — current scope\");\n lines.push(\"_These define what you're building now. Work outside these bets requires explicit user confirmation before designing._\");\n lines.push(\"\");\n for (const e of activeBets as any[]) {\n lines.push(`- \\`${e.entryId ?? e.name}\\` ${e.name}`);\n }\n lines.push(\"\");\n }\n } catch { /* non-critical */ }\n\n const mapGovEntry = (e: any) => ({\n entryId: e.entryId,\n name: e.name,\n description: typeof e.data?.description === \"string\" ? e.data.description : (typeof e.description === \"string\" ? e.description : undefined),\n });\n lines.push(...buildOperatingProtocol({\n principles: wsPrinciples.map(mapGovEntry),\n standards: wsStandards.map(mapGovEntry),\n businessRules: wsBusinessRules.map(mapGovEntry),\n }));\n\n const plannedWork = await queryPlannedWork();\n\n if (hasPlannedWork(plannedWork)) {\n lines.push(\"\");\n lines.push(...buildPlannedWorkSection(plannedWork, priorSessions, recoveryBlock));\n } else {\n const briefingItems: string[] = [];\n\n if (priorSessions.length > 0 && !recoveryBlock) {\n const last = priorSessions[0];\n const date = new Date(last.startedAt).toISOString().split(\"T\")[0];\n const created = Array.isArray(last.entriesCreated) ? last.entriesCreated.length : last.entriesCreated ?? 0;\n const modified = Array.isArray(last.entriesModified) ? last.entriesModified.length : last.entriesModified ?? 0;\n briefingItems.push(`**Last session** (${date}): ${created} created, ${modified} modified`);\n }\n\n if (readiness?.gaps?.length > 0) {\n briefingItems.push(`**${readiness.gaps.length} gap${readiness.gaps.length === 1 ? \"\" : \"s\"}** remaining`);\n }\n\n if (briefingItems.length > 0) {\n lines.push(\"\");\n lines.push(\"## Briefing\");\n for (const item of briefingItems) {\n lines.push(`- ${item}`);\n }\n lines.push(\"\");\n }\n\n if (recoveryBlock) {\n lines.push(\"\");\n lines.push(...formatRecoveryBlock(recoveryBlock as Parameters<typeof formatRecoveryBlock>[0]));\n }\n }\n\n // --- Activation milestone + WOW moment ---\n // When >= 10 user-authored committed entries across >= 3 collections, surface the WOW prompt.\n // BET-76 FEAT-110: Must exclude platform-seeded entries — STR-5 measures user knowledge, not scaffolding.\n // Consistent with pulseMetrics and workspaceReadiness which both apply !seededByPlatform.\n try {\n const allEntries = await mcpQuery<any[]>(\"chain.listEntries\", {});\n const committed = (allEntries ?? []).filter(\n (e: any) => e.status === \"active\" && !e.seededByPlatform,\n );\n const committedCollections = new Set(committed.map((e: any) => e.collectionId ?? e.collection));\n\n if (committed.length >= 10 && committedCollections.size >= 3) {\n lines.push(\"\");\n lines.push(\"## Your workspace is activated\");\n lines.push(\n `**${committed.length} committed entries** across **${committedCollections.size} collections** — ` +\n `your knowledge graph is alive.`,\n );\n lines.push(\"\");\n lines.push(\n `**Try it:** Ask me anything about your product — architecture, decisions, tensions — ` +\n `and I'll pull context from the graph.`,\n );\n lines.push(\"\");\n if (wsCtx.workspaceSlug) {\n lines.push(`**View in Studio:** \\`/w/${wsCtx.workspaceSlug}/studio\\``);\n lines.push(\"\");\n }\n // Quality hint per CPO review: nudge toward relation-building\n lines.push(`_Tip: Connect entries with \\`graph action=suggest\\` to unlock deeper context._`);\n lines.push(\"\");\n }\n } catch { /* non-critical — entry count query is best-effort */ }\n\n lines.push(\"What would you like to work on?\");\n lines.push(\"\");\n }\n\n if (errors.length > 0) {\n lines.push(\"## Errors\");\n for (const err of errors) lines.push(`- ${err}`);\n lines.push(\"\");\n }\n\n // --- Mark session as oriented ---\n if (agentSessionId) {\n try {\n await mcpCall(\"agent.markOriented\", { sessionId: agentSessionId });\n setSessionOriented(true);\n\n lines.push(\"---\");\n lines.push(\n `Orientation complete. Session ${agentSessionId}. Write tools available.`,\n );\n } catch {\n lines.push(\"---\");\n lines.push(\"_Warning: Could not mark session as oriented. Write tools may be restricted._\");\n }\n } else {\n lines.push(\"---\");\n lines.push(\"_No active agent session. Call `session action=start` to begin a tracked session._\");\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * Collection presets — curated starter sets for common workspace types.\n * Each preset is a list of collection definitions that can be seeded\n * into a fresh workspace via the `start` flow.\n *\n * These are the seed of a future collection marketplace.\n */\n\nexport interface CollectionPresetField {\n key: string;\n label: string;\n type: string;\n required?: boolean;\n options?: string[];\n searchable?: boolean;\n}\n\nexport interface CollectionPresetDef {\n slug: string;\n name: string;\n description: string;\n icon?: string;\n idPrefix?: string;\n fields: CollectionPresetField[];\n}\n\nexport interface CollectionPreset {\n id: string;\n name: string;\n description: string;\n collections: CollectionPresetDef[];\n}\n\nconst GOVERNANCE_CORE: CollectionPresetDef[] = [\n {\n slug: \"principles\",\n name: \"Principles\",\n description: \"Higher-level beliefs that guide decision-making — the 'why' behind rules and standards. You reason from a principle.\",\n idPrefix: \"PRI\",\n fields: [\n { key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true },\n { key: \"rationale\", label: \"Rationale\", type: \"string\", searchable: true },\n { key: \"category\", label: \"Category\", type: \"select\", options: [\"Product\", \"Engineering\", \"Design\", \"Business\", \"Operations\"] },\n { key: \"severity\", label: \"Weight\", type: \"select\", options: [\"foundational\", \"high\", \"medium\"] },\n ],\n },\n {\n slug: \"standards\",\n name: \"Standards\",\n description: \"Conventions and norms about how work is done — naming patterns, coding styles, process steps. You lint for a standard.\",\n idPrefix: \"STD\",\n fields: [\n { key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true },\n { key: \"domain\", label: \"Domain\", type: \"string\" },\n { key: \"severity\", label: \"Severity\", type: \"select\", options: [\"low\", \"medium\", \"high\"] },\n ],\n },\n {\n slug: \"business-rules\",\n name: \"Business Rules\",\n description: \"Concrete, enforceable constraints about how the system behaves — testable, specific, tied to code. You test for a rule.\",\n idPrefix: \"BR\",\n fields: [\n { key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true },\n { key: \"rationale\", label: \"Rationale\", type: \"string\", searchable: true },\n { key: \"domain\", label: \"Domain\", type: \"string\" },\n { key: \"severity\", label: \"Severity\", type: \"select\", options: [\"low\", \"medium\", \"high\", \"critical\"] },\n { key: \"platforms\", label: \"Platforms\", type: \"array\" },\n ],\n },\n];\n\nexport const COLLECTION_PRESETS: CollectionPreset[] = [\n {\n id: \"software-product\",\n name: \"Software Product\",\n description: \"For teams building software products — glossary, features, architecture, tech debt, and API endpoints\",\n collections: [\n ...GOVERNANCE_CORE,\n { slug: \"glossary\", name: \"Glossary\", description: \"Canonical terminology for the product domain\", idPrefix: \"GLO\", fields: [{ key: \"canonical\", label: \"Canonical\", type: \"string\", required: true, searchable: true }, { key: \"category\", label: \"Category\", type: \"select\", options: [\"Platform & Architecture\", \"Knowledge Management\", \"AI & Developer Tools\", \"Governance & Process\"] }, { key: \"confusedWith\", label: \"Confused With\", type: \"array\" }] },\n { slug: \"features\", name: \"Features\", description: \"Product features and capabilities\", idPrefix: \"FEAT\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"scope\", label: \"Scope\", type: \"string\" }, { key: \"area\", label: \"Area\", type: \"string\" }, { key: \"status\", label: \"Status\", type: \"select\", options: [\"proposed\", \"in-progress\", \"shipped\", \"deprecated\"] }] },\n { slug: \"architecture\", name: \"Architecture\", description: \"System architecture layers and components\", idPrefix: \"ARCH\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"layer\", label: \"Layer\", type: \"string\" }, { key: \"dependencies\", label: \"Dependencies\", type: \"array\" }] },\n { slug: \"tech-debt\", name: \"Tech Debt\", description: \"Technical debt items to track and address\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"severity\", label: \"Severity\", type: \"select\", options: [\"low\", \"medium\", \"high\", \"critical\"] }, { key: \"area\", label: \"Area\", type: \"string\" }, { key: \"effort\", label: \"Effort\", type: \"select\", options: [\"small\", \"medium\", \"large\"] }] },\n { slug: \"api-endpoints\", name: \"API Endpoints\", description: \"REST/GraphQL endpoints and their contracts\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"method\", label: \"Method\", type: \"select\", options: [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"] }, { key: \"path\", label: \"Path\", type: \"string\" }, { key: \"auth\", label: \"Auth Required\", type: \"select\", options: [\"none\", \"api-key\", \"bearer\", \"session\"] }] },\n { slug: \"decisions\", name: \"Decisions\", description: \"Significant decisions with rationale and context\", idPrefix: \"DEC\", fields: [{ key: \"rationale\", label: \"Rationale\", type: \"string\", required: true, searchable: true }, { key: \"date\", label: \"Date\", type: \"string\" }, { key: \"decidedBy\", label: \"Decided By\", type: \"string\" }, { key: \"alternatives\", label: \"Alternatives\", type: \"string\" }] },\n { slug: \"tensions\", name: \"Tensions\", description: \"Friction points, pain points, and unmet needs\", idPrefix: \"TEN\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"priority\", label: \"Priority\", type: \"select\", options: [\"low\", \"medium\", \"high\", \"critical\"] }, { key: \"severity\", label: \"Severity\", type: \"select\", options: [\"low\", \"medium\", \"high\", \"critical\"] }] },\n ],\n },\n {\n id: \"content-business\",\n name: \"Content Business\",\n description: \"For content creators, publishers, and media companies — topics, audience segments, content calendar, and brand voice\",\n collections: [\n ...GOVERNANCE_CORE,\n { slug: \"glossary\", name: \"Glossary\", description: \"Industry terminology and brand language\", fields: [{ key: \"canonical\", label: \"Canonical\", type: \"string\", required: true, searchable: true }, { key: \"category\", label: \"Category\", type: \"string\" }] },\n { slug: \"topics\", name: \"Topics\", description: \"Content topics and themes\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"pillar\", label: \"Content Pillar\", type: \"string\" }, { key: \"stage\", label: \"Stage\", type: \"select\", options: [\"idea\", \"researching\", \"drafting\", \"published\", \"evergreen\"] }] },\n { slug: \"audience-segments\", name: \"Audience Segments\", description: \"Target reader/viewer personas\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"painPoints\", label: \"Pain Points\", type: \"string\" }, { key: \"channels\", label: \"Channels\", type: \"array\" }] },\n { slug: \"brand-voice\", name: \"Brand Voice\", description: \"Tone, style, and voice guidelines\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"doThis\", label: \"Do This\", type: \"string\" }, { key: \"notThis\", label: \"Not This\", type: \"string\" }] },\n { slug: \"decisions\", name: \"Decisions\", description: \"Editorial and strategic decisions\", fields: [{ key: \"rationale\", label: \"Rationale\", type: \"string\", required: true, searchable: true }, { key: \"date\", label: \"Date\", type: \"string\" }, { key: \"decidedBy\", label: \"Decided By\", type: \"string\" }] },\n { slug: \"tensions\", name: \"Tensions\", description: \"Content gaps, audience friction, and unmet needs\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"priority\", label: \"Priority\", type: \"select\", options: [\"low\", \"medium\", \"high\", \"critical\"] }] },\n ],\n },\n {\n id: \"agency\",\n name: \"Agency\",\n description: \"For agencies managing multiple clients — client profiles, project scopes, deliverables, and processes\",\n collections: [\n ...GOVERNANCE_CORE,\n { slug: \"glossary\", name: \"Glossary\", description: \"Agency and client terminology\", fields: [{ key: \"canonical\", label: \"Canonical\", type: \"string\", required: true, searchable: true }, { key: \"category\", label: \"Category\", type: \"string\" }] },\n { slug: \"clients\", name: \"Clients\", description: \"Client profiles and relationship context\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"industry\", label: \"Industry\", type: \"string\" }, { key: \"contact\", label: \"Primary Contact\", type: \"string\" }] },\n { slug: \"deliverables\", name: \"Deliverables\", description: \"Standard deliverable types and templates\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"type\", label: \"Type\", type: \"string\" }, { key: \"estimatedHours\", label: \"Estimated Hours\", type: \"string\" }] },\n { slug: \"processes\", name: \"Processes\", description: \"Standard operating procedures and workflows\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"steps\", label: \"Steps\", type: \"string\" }, { key: \"owner\", label: \"Owner\", type: \"string\" }] },\n { slug: \"decisions\", name: \"Decisions\", description: \"Strategic and operational decisions\", fields: [{ key: \"rationale\", label: \"Rationale\", type: \"string\", required: true, searchable: true }, { key: \"date\", label: \"Date\", type: \"string\" }] },\n { slug: \"tensions\", name: \"Tensions\", description: \"Process bottlenecks and client friction\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"priority\", label: \"Priority\", type: \"select\", options: [\"low\", \"medium\", \"high\", \"critical\"] }] },\n ],\n },\n {\n id: \"saas-api\",\n name: \"SaaS API\",\n description: \"For API-first SaaS products — endpoints, schemas, rate limits, changelog, and integration guides\",\n collections: [\n ...GOVERNANCE_CORE,\n { slug: \"glossary\", name: \"Glossary\", description: \"API and domain terminology\", fields: [{ key: \"canonical\", label: \"Canonical\", type: \"string\", required: true, searchable: true }, { key: \"category\", label: \"Category\", type: \"string\" }] },\n { slug: \"api-endpoints\", name: \"API Endpoints\", description: \"API routes and contracts\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"method\", label: \"Method\", type: \"select\", options: [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"] }, { key: \"path\", label: \"Path\", type: \"string\" }, { key: \"auth\", label: \"Auth\", type: \"select\", options: [\"none\", \"api-key\", \"bearer\", \"oauth\"] }] },\n { slug: \"schemas\", name: \"Schemas\", description: \"Data models and API schemas\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"format\", label: \"Format\", type: \"select\", options: [\"json\", \"protobuf\", \"graphql\", \"openapi\"] }, { key: \"version\", label: \"Version\", type: \"string\" }] },\n { slug: \"rate-limits\", name: \"Rate Limits\", description: \"Rate limiting policies and tiers\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"tier\", label: \"Tier\", type: \"string\" }, { key: \"limit\", label: \"Limit\", type: \"string\" }] },\n { slug: \"changelog\", name: \"Changelog\", description: \"API version history and breaking changes\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"version\", label: \"Version\", type: \"string\" }, { key: \"date\", label: \"Date\", type: \"string\" }, { key: \"breaking\", label: \"Breaking\", type: \"select\", options: [\"yes\", \"no\"] }] },\n { slug: \"decisions\", name: \"Decisions\", description: \"API design decisions and rationale\", fields: [{ key: \"rationale\", label: \"Rationale\", type: \"string\", required: true, searchable: true }, { key: \"date\", label: \"Date\", type: \"string\" }] },\n ],\n },\n {\n id: \"general\",\n name: \"General\",\n description: \"A minimal starter set — glossary, decisions, tensions, and governance. Add more collections as you need them.\",\n collections: [\n ...GOVERNANCE_CORE,\n { slug: \"glossary\", name: \"Glossary\", description: \"Canonical terminology\", fields: [{ key: \"canonical\", label: \"Canonical\", type: \"string\", required: true, searchable: true }, { key: \"category\", label: \"Category\", type: \"string\" }] },\n { slug: \"decisions\", name: \"Decisions\", description: \"Decisions with rationale\", fields: [{ key: \"rationale\", label: \"Rationale\", type: \"string\", required: true, searchable: true }, { key: \"date\", label: \"Date\", type: \"string\" }, { key: \"decidedBy\", label: \"Decided By\", type: \"string\" }] },\n { slug: \"tensions\", name: \"Tensions\", description: \"Friction points and unmet needs\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"priority\", label: \"Priority\", type: \"select\", options: [\"low\", \"medium\", \"high\", \"critical\"] }] },\n ],\n },\n];\n\nexport function getPreset(id: string): CollectionPreset | undefined {\n return COLLECTION_PRESETS.find((p) => p.id === id);\n}\n\nexport function listPresets(): Array<{ id: string; name: string; description: string; collectionCount: number }> {\n return COLLECTION_PRESETS.map((p) => ({\n id: p.id,\n name: p.name,\n description: p.description,\n collectionCount: p.collections.length,\n }));\n}\n","/**\n * Shared \"planned work\" query and formatting for orient/start.\n *\n * Surfaces uncommitted drafts, in-progress features/decisions, and\n * open tensions as a single \"Continue from\" section with a concrete CTA.\n */\n\nimport { mcpQuery } from \"../client.js\";\n\nexport interface PlannedWork {\n uncommittedDrafts: Array<{ name: string; collection: string }>;\n inProgressEntries: Array<{ name: string; collection: string; entryId: string }>;\n openTensions: Array<{ name: string; entryId: string }>;\n}\n\nexport async function queryPlannedWork(): Promise<PlannedWork> {\n const result: PlannedWork = {\n uncommittedDrafts: [],\n inProgressEntries: [],\n openTensions: [],\n };\n\n try {\n const allEntries = await mcpQuery<any[]>(\"chain.listEntries\", {});\n if (!allEntries) return result;\n\n for (const entry of allEntries) {\n if (entry.stratum === 'system') continue;\n\n const collection = entry.collectionSlug ?? entry.collection ?? \"unknown\";\n\n if (entry.status === \"draft\") {\n result.uncommittedDrafts.push({ name: entry.name, collection });\n }\n\n // Tensions use workflowStatus for domain state\n if (collection === \"tensions\" && entry.workflowStatus === \"open\") {\n result.openTensions.push({ name: entry.name, entryId: entry.entryId ?? entry._id });\n }\n\n if (entry.workflowStatus === \"in-progress\") {\n result.inProgressEntries.push({\n name: entry.name,\n collection,\n entryId: entry.entryId ?? entry._id,\n });\n }\n }\n } catch {\n // Non-critical — return empty planned work\n }\n\n return result;\n}\n\nexport function hasPlannedWork(work: PlannedWork): boolean {\n return (\n work.uncommittedDrafts.length > 0 ||\n work.inProgressEntries.length > 0 ||\n work.openTensions.length > 0\n );\n}\n\n/** ENT-yaic53: Format recovery block from Convex structured data. */\nexport function formatRecoveryBlock(block: {\n sessionId: string;\n status: 'timed_out' | 'completed';\n date: string;\n duration: string;\n created: { entryId: string; collection: string; name: string }[];\n modified: { entryId: string; collection: string; name: string }[];\n draftsNeedingAttention: { entryId: string; collection: string; name: string }[];\n relationsCreated: number;\n createdOverflow?: number;\n modifiedOverflow?: number;\n draftsOverflow?: number;\n}): string[] {\n const fmt = (items: { entryId: string; collection: string; name: string }[], overflow?: number) =>\n items.map((e) => `${e.entryId} [${e.collection}] ${e.name}`).join(', ') +\n (overflow && overflow > 0 ? ` (+${overflow} more)` : '');\n\n const lines: string[] = [\n '## Previous Session Recovery',\n '',\n `Session ${block.sessionId} — ${block.date}, ${block.duration}, status: ${block.status}`,\n `Created (${block.created.length + (block.createdOverflow ?? 0)}): ${fmt(block.created, block.createdOverflow)}`,\n `Modified (${block.modified.length + (block.modifiedOverflow ?? 0)}): ${fmt(block.modified, block.modifiedOverflow)}`,\n `Drafts needing attention (${block.draftsNeedingAttention.length + (block.draftsOverflow ?? 0)}): ${fmt(block.draftsNeedingAttention, block.draftsOverflow)}`,\n `Relations created: ${block.relationsCreated}`,\n '',\n ];\n return lines;\n}\n\nexport function buildPlannedWorkSection(\n work: PlannedWork,\n priorSessions: any[],\n recoveryBlock?: { sessionId: string; status: 'timed_out' | 'completed'; date: string; duration: string; created: { entryId: string; collection: string; name: string }[]; modified: { entryId: string; collection: string; name: string }[]; draftsNeedingAttention: { entryId: string; collection: string; name: string }[]; relationsCreated: number; createdOverflow?: number; modifiedOverflow?: number; draftsOverflow?: number } | null,\n): string[] {\n if (!hasPlannedWork(work) && priorSessions.length === 0) return [];\n\n const lines: string[] = [];\n lines.push(\"## Continue from where you left off\");\n lines.push(\"\");\n\n if (work.inProgressEntries.length > 0) {\n const top = work.inProgressEntries[0];\n lines.push(`- **Active: ${top.name}** (${top.collection}) — want to continue?`);\n for (const entry of work.inProgressEntries.slice(1, 3)) {\n lines.push(`- ${entry.name} (${entry.collection})`);\n }\n if (work.inProgressEntries.length > 3) {\n lines.push(`- _...and ${work.inProgressEntries.length - 3} more in progress_`);\n }\n }\n\n if (work.uncommittedDrafts.length > 0) {\n const count = work.uncommittedDrafts.length;\n const label = count === 1 ? \"1 uncommitted draft\" : `${count} uncommitted drafts`;\n const topNames = work.uncommittedDrafts\n .slice(0, 3)\n .map((d) => d.name)\n .join(\", \");\n lines.push(`- **${label}** — ${topNames}${count > 3 ? \", ...\" : \"\"}`);\n }\n\n if (work.openTensions.length > 0) {\n const top = work.openTensions[0];\n const count = work.openTensions.length;\n if (count === 1) {\n lines.push(`- **Open tension: ${top.name}** — discuss or capture a decision?`);\n } else {\n lines.push(`- **${count} open tensions** — top: ${top.name}`);\n }\n }\n\n if (priorSessions.length > 0 && !hasPlannedWork(work) && !recoveryBlock) {\n const last = priorSessions[0];\n const date = new Date(last.startedAt).toISOString().split(\"T\")[0];\n const created = Array.isArray(last.entriesCreated) ? last.entriesCreated.length : last.entriesCreated ?? 0;\n const modified = Array.isArray(last.entriesModified) ? last.entriesModified.length : last.entriesModified ?? 0;\n if (created > 0 || modified > 0) {\n lines.push(`- **Last session** (${date}): ${created} created, ${modified} modified`);\n }\n }\n\n if (recoveryBlock) {\n lines.push('');\n lines.push(...formatRecoveryBlock(recoveryBlock));\n }\n\n lines.push(\"\");\n return lines;\n}\n","/**\n * Shared functions for orient and start tools.\n * Single code path for alignment checks and operating protocol (STA-3).\n */\n\nexport interface ActiveBet {\n name: string;\n entryId?: string | null;\n _id?: string;\n}\n\nexport interface AlignmentCheckResult {\n aligned: boolean;\n matchedBet: string | null;\n betNames: string[];\n}\n\nexport function runAlignmentCheck(\n task: string,\n activeBets: ActiveBet[],\n taskContextHits?: Array<{ collectionSlug?: string; name?: string }>,\n): AlignmentCheckResult {\n const betNames = activeBets.map((b) => b.name);\n const taskWords = task.toLowerCase().split(/\\s+/).filter((w) => w.length > 3);\n\n const matchingBet = activeBets.find((b) => {\n const name = (b.name ?? \"\").toLowerCase();\n return taskWords.some((w) => name.includes(w));\n });\n\n const betHits = (taskContextHits ?? []).filter(\n (e) => e.collectionSlug === \"bets\",\n );\n\n const aligned = !!matchingBet || betHits.length > 0;\n const matchedBet = matchingBet?.name ?? betHits[0]?.name ?? null;\n\n return { aligned, matchedBet, betNames };\n}\n\nexport function buildAlignmentCheckLines(\n result: AlignmentCheckResult,\n): string[] {\n const lines: string[] = [\"## Alignment Check\"];\n\n if (result.aligned) {\n lines.push(\n `Task appears related to active bet: **${result.matchedBet}**. Proceed.`,\n );\n } else if (result.betNames.length === 0) {\n lines.push(\n \"No active bets in workspace. Consider shaping a bet before building.\",\n );\n } else {\n lines.push(\"**This task does not match any active bet.**\");\n lines.push(`Active bets: ${result.betNames.join(\", \")}`);\n lines.push(\n \"Stop and confirm with the user before designing. This may be out of scope.\",\n );\n }\n\n lines.push(\"\");\n return lines;\n}\n\nconst CORE_PROTOCOL = [\n \"**Search before proposing.** Before suggesting new features, architecture, or changes, \" +\n \"search the Chain: `entries action=search query=\\\"<relevant terms>\\\"`. Build on what exists.\",\n \"**Reference by ID.** When discussing a topic that has Chain entries, cite them by entry ID \" +\n \"(e.g. `DEC-50`, `PRI-3`). This keeps conversations grounded in shared knowledge.\",\n \"**Check scope.** If the proposed work doesn't fall under an active bet, stop and say so. \" +\n \"Do not design implementation for out-of-scope work without explicit user go-ahead.\",\n \"**Capture continuously.** When a decision, tension, insight, or new term surfaces during \" +\n \"work, capture it as a draft immediately. Don't defer to \\\"later.\\\"\",\n \"**Validate against governance.** Before proposing any solution, check it against the \" +\n \"Workspace Governance directives below. If your proposal conflicts with a principle, standard, \" +\n \"or business rule — stop, name the conflict, and get explicit user confirmation before proceeding.\",\n];\n\nexport interface StandardEntry {\n entryId?: string | null;\n name: string;\n description?: string;\n}\n\nexport interface GovernanceEntries {\n principles?: StandardEntry[];\n standards?: StandardEntry[];\n businessRules?: StandardEntry[];\n}\n\nconst MAX_ENTRIES_NO_TASK = 3;\n\nfunction extractKeywords(text: string): string[] {\n return [...new Set(text.toLowerCase().split(/\\s+/).filter((w) => w.length > 3))];\n}\n\nfunction scoreEntry(entry: StandardEntry, keywords: string[]): number {\n const text = `${entry.name} ${entry.description ?? \"\"}`.toLowerCase();\n return keywords.filter((kw) => text.includes(kw)).length;\n}\n\nfunction formatGovernanceEntry(entry: StandardEntry): string {\n const id = entry.entryId ?? entry.name;\n const desc = entry.description\n ? ` — ${entry.description.slice(0, 120)}${entry.description.length > 120 ? \"...\" : \"\"}`\n : \"\";\n return `- **[${id}]** ${entry.name}${desc}`;\n}\n\n/**\n * Build the Operating Protocol section for orient/start output.\n * Accepts either the new GovernanceEntries object or a plain StandardEntry[]\n * for backward compatibility.\n */\nexport function buildOperatingProtocol(\n governanceOrStandards?: GovernanceEntries | StandardEntry[],\n task?: string,\n): string[] {\n const governance: GovernanceEntries = Array.isArray(governanceOrStandards)\n ? { standards: governanceOrStandards }\n : governanceOrStandards ?? {};\n\n const lines: string[] = [\n \"## Operating Protocol\",\n \"_How to work in this workspace. Follow these before and during every task._\",\n \"\",\n ];\n\n for (let i = 0; i < CORE_PROTOCOL.length; i++) {\n lines.push(`${i + 1}. ${CORE_PROTOCOL[i]}`);\n }\n\n const { principles = [], standards = [], businessRules = [] } = governance;\n const hasGovernance =\n principles.length > 0 || standards.length > 0 || businessRules.length > 0;\n\n if (hasGovernance) {\n lines.push(\"\");\n lines.push(\"### Workspace governance directives\");\n\n const types: Array<{\n header: string;\n entries: StandardEntry[];\n }> = [\n { header: \"**Active principles:**\", entries: principles },\n { header: \"**Active business rules:**\", entries: businessRules },\n { header: \"**Active standards:**\", entries: standards },\n ];\n\n if (task) {\n const keywords = extractKeywords(task);\n let anyRelevant = false;\n\n for (const type of types) {\n if (type.entries.length === 0) continue;\n const scored = type.entries\n .map((e) => ({ entry: e, score: scoreEntry(e, keywords) }))\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score);\n\n if (scored.length > 0) {\n anyRelevant = true;\n lines.push(type.header);\n for (const s of scored) {\n lines.push(formatGovernanceEntry(s.entry));\n }\n lines.push(\"\");\n }\n }\n\n if (!anyRelevant) {\n for (const type of types) {\n if (type.entries.length === 0) continue;\n lines.push(type.header);\n for (const e of type.entries.slice(0, MAX_ENTRIES_NO_TASK)) {\n lines.push(formatGovernanceEntry(e));\n }\n lines.push(\"\");\n }\n }\n\n lines.push(\n \"_Governance filtered by task relevance. Run `orient` without a task to see all._\",\n );\n } else {\n for (const type of types) {\n if (type.entries.length === 0) continue;\n lines.push(type.header);\n for (const e of type.entries.slice(0, MAX_ENTRIES_NO_TASK)) {\n lines.push(formatGovernanceEntry(e));\n }\n lines.push(\"\");\n }\n lines.push(\n '_Showing top governance entries. Use `orient task=\"...\"` for task-relevant filtering._',\n );\n }\n }\n\n lines.push(\"\");\n return lines;\n}\n","/**\n * start-interview.ts — Activation Interview Contract\n *\n * Stateless module: returns structured interview instructions for the IDE agent.\n * The agent asks 1–2 questions, infers structured data, and calls batch-capture.\n *\n * Interview Contract (BET-64):\n * Q1: \"What are you building and for whom?\" → vision + audience\n * Q2 (optional): \"What's your tech stack or key domain terms?\" → architecture + glossary\n * Schema: { vision, audience?, techStack?, keyTerms?, keyDecisions?, tensions? }\n * Mapping: vision → strategy | audience → audiences | techStack → architecture + glossary | keyTerms → glossary | keyDecisions → decisions | tensions → tensions\n */\n\nimport { z } from \"zod\";\n\n// ── Extraction Schema ─────────────────────────────────────────────────────────\n// Used to validate LLM-extracted output before feeding batch-capture.\n\nexport const interviewExtractionSchema = z.object({\n vision: z.string().min(10).describe(\"What they're building — concise product purpose statement\"),\n audience: z.string().optional().describe(\"Who it's for — primary user or customer segment\"),\n techStack: z.array(z.string()).optional().describe(\"Key technologies, frameworks, or platforms (e.g. ['SvelteKit', 'Convex', 'PostgreSQL'])\"),\n keyTerms: z.array(z.string()).optional().describe(\"Domain-specific terms that belong in the glossary\"),\n keyDecisions: z.array(z.string()).optional().describe(\"Recent significant decisions made (each as a concise statement)\"),\n tensions: z.array(z.string()).optional().describe(\"Pain points or friction the product is solving\"),\n});\n\nexport type InterviewExtraction = z.infer<typeof interviewExtractionSchema>;\n\n// ── Mapping: extraction → batch-capture entries ──────────────────────────────\n\nexport function extractionToBatchEntries(\n extracted: InterviewExtraction,\n): Array<{ collection: string; name: string; description: string }> {\n const entries: Array<{ collection: string; name: string; description: string }> = [];\n\n if (extracted.vision) {\n entries.push({\n collection: \"strategy\",\n name: \"Product Vision\",\n description: extracted.vision,\n });\n }\n\n if (extracted.audience) {\n const audienceName = extracted.audience.split(/\\s+/).slice(0, 6).join(\" \");\n entries.push({\n collection: \"audiences\",\n name: audienceName,\n description: extracted.audience,\n });\n }\n\n if (extracted.techStack?.length) {\n entries.push({\n collection: \"architecture\",\n name: \"Tech Stack\",\n description: `Technology choices: ${extracted.techStack.join(\", \")}`,\n });\n // Top 3 stack entries as glossary terms\n for (const tech of extracted.techStack.slice(0, 3)) {\n entries.push({ collection: \"glossary\", name: tech, description: `${tech} — part of the tech stack` });\n }\n }\n\n if (extracted.keyTerms?.length) {\n for (const term of extracted.keyTerms) {\n const alreadyAdded = entries.some(\n (e) => e.collection === \"glossary\" && e.name.toLowerCase() === term.toLowerCase(),\n );\n if (!alreadyAdded) {\n entries.push({ collection: \"glossary\", name: term, description: `Core domain term: ${term}` });\n }\n }\n }\n\n if (extracted.keyDecisions?.length) {\n for (const decision of extracted.keyDecisions) {\n entries.push({\n collection: \"decisions\",\n name: decision.slice(0, 80),\n description: decision,\n });\n }\n }\n\n if (extracted.tensions?.length) {\n for (const tension of extracted.tensions) {\n entries.push({\n collection: \"tensions\",\n name: tension.slice(0, 80),\n description: tension,\n });\n }\n }\n\n return entries;\n}\n\n// ── Interview Instructions ────────────────────────────────────────────────────\n\nexport interface InterviewInstructions {\n systemPrompt: string;\n question1: string;\n question2: string;\n extractionGuidance: string;\n captureInstructions: string;\n qualityNote: string;\n scanOffer: string;\n}\n\n/**\n * Returns structured instructions for the IDE agent to run a fresh-workspace\n * activation interview. The agent manages the conversation turns; PB stays stateless.\n */\nexport function getInterviewInstructions(workspaceName: string): InterviewInstructions {\n return {\n systemPrompt:\n `You are activating the **${workspaceName}** Product Brain. ` +\n `Ask 1–2 focused questions, then extract structured knowledge and feed it to batch-capture. ` +\n `Everything lands as a draft — the user confirms before anything is committed.`,\n\n question1:\n `**Q1 — What are you building and for whom?** ` +\n `Describe your product in 1–2 sentences and who it's for. ` +\n `(This becomes your Product Vision and primary Audience.)`,\n\n question2:\n `**Q2 (optional) — What's your tech stack or key domain terms?** ` +\n `Name a few core technologies or terms your team uses. ` +\n `(These become Architecture + Glossary entries.)`,\n\n extractionGuidance:\n `After the user answers, extract:\\n` +\n `- vision: the core product purpose (required)\\n` +\n `- audience: who it's for (optional)\\n` +\n `- techStack: technologies mentioned (optional, array)\\n` +\n `- keyTerms: domain terms (optional, array)\\n` +\n `- keyDecisions: any decisions stated (optional, array)\\n` +\n `- tensions: any pain points stated (optional, array)\\n\\n` +\n `Map to batch-capture entries:\\n` +\n `- vision → strategy (\"Product Vision\")\\n` +\n `- audience → audiences (1 entry)\\n` +\n `- techStack → architecture (\"Tech Stack\") + top 3 terms → glossary\\n` +\n `- keyTerms → glossary (1 per term)\\n` +\n `- keyDecisions → decisions (1 per decision)\\n` +\n `- tensions → tensions (1 per tension)`,\n\n captureInstructions:\n `Call batch-capture with the extracted entries. ` +\n `Keep descriptions concise (1–2 sentences each). ` +\n `Prefer 8 good entries over 15 mediocre ones — quality over volume. ` +\n `If batch-capture returns failedEntries, tell the user and retry those individually.`,\n\n qualityNote:\n `After capturing, call graph action=suggest on 2–3 key entries to build the graph. ` +\n `Present the drafts grouped by collection. Ask: \"Commit all, or review first?\" ` +\n `Only call commit-entry when the user confirms.`,\n\n scanOffer:\n `After the interview capture, offer the Project Scan: ` +\n `\"I can also scan your project files (README.md, package.json, .cursorrules) to extract more knowledge automatically. ` +\n `Want me to? It takes about 2 minutes and stays as drafts.\"`,\n };\n}\n\n// ── Interview Response Text Builder ──────────────────────────────────────────\n\n/**\n * Builds the full activation interview text for embedding in start/seedPreset responses.\n */\nexport function buildInterviewResponse(workspaceName: string): string {\n const instructions = getInterviewInstructions(workspaceName);\n\n return [\n \"## Let's activate your workspace\",\n \"\",\n instructions.systemPrompt,\n \"\",\n \"I'll ask you 1–2 questions. Your answers become the first entries in your knowledge graph — all as drafts until you confirm.\",\n \"\",\n `**${instructions.question1}**`,\n \"\",\n \"_Take your time — a sentence or two is enough. I'll extract the structure from your answer._\",\n \"\",\n `> ${instructions.scanOffer}`,\n \"\",\n \"_Everything stays as a draft until you say \\\"commit\\\" or \\\"looks good\\\"._\",\n ].join(\"\\n\");\n}\n","/**\n * LLM Usage MCP tools — STR-23 (MCP before UI)\n * Chain: DEC-61, TEN-65\n *\n * AI agents can query their own workspace spend, model breakdown,\n * and session economics before the Settings UI ships.\n */\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, getWorkspaceContext, getAgentSessionId } from \"../client.js\";\n\nexport const usageSummarySchema = z.object({\n periodDays: z\n .number()\n .min(1)\n .max(90)\n .optional()\n .describe(\"Number of days to look back (default 30, max 90)\"),\n});\n\nexport function registerUsageTools(server: McpServer) {\n server.registerTool(\n \"get-usage-summary\",\n {\n title: \"Get Usage Summary\",\n description:\n \"Returns LLM usage and cost summary for the current workspace. \" +\n \"Includes total spend, token counts, model breakdown, and feature breakdown \" +\n \"for the specified period. If called within an agent session, also includes \" +\n \"the current session's cost. Use this to understand AI spend, check budgets, \" +\n \"or analyze which features and models drive cost.\",\n inputSchema: usageSummarySchema,\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },\n },\n async ({ periodDays }) => {\n const ws = await getWorkspaceContext();\n const sessionId = getAgentSessionId();\n\n const summary = await mcpQuery<{\n periodDays: number;\n totalTokens: number;\n totalCostUsd: number;\n totalCostCredits: number;\n totalRequests: number;\n cachedTokens: number;\n reasoningTokens: number;\n cacheHitRate: number;\n modelBreakdown: Array<{ model: string; requests: number; costUsd: number }>;\n featureBreakdown: Array<{ feature: string; requests: number; costUsd: number }>;\n }>(\"usage.getWorkspaceSummary\", {\n periodDays: periodDays ?? 30,\n });\n\n if (!summary) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"No usage data available yet. LLM tracking may not be active or no calls have been made in this period.\",\n },\n ],\n };\n }\n\n const lines: string[] = [\n `## Usage Summary — ${ws.workspaceName}`,\n `Period: last ${summary.periodDays} days`,\n \"\",\n `**Total spend:** $${summary.totalCostUsd.toFixed(4)} USD (${summary.totalRequests} requests)`,\n `**Total tokens:** ${summary.totalTokens.toLocaleString()} (cached: ${summary.cachedTokens.toLocaleString()}, reasoning: ${summary.reasoningTokens.toLocaleString()})`,\n `**Cache hit rate:** ${(summary.cacheHitRate * 100).toFixed(1)}%`,\n ];\n\n if (summary.modelBreakdown.length > 0) {\n lines.push(\"\", \"### Model Breakdown\");\n for (const m of summary.modelBreakdown) {\n lines.push(`- **${m.model}**: $${m.costUsd.toFixed(4)} (${m.requests} requests)`);\n }\n }\n\n if (summary.featureBreakdown.length > 0) {\n lines.push(\"\", \"### Feature Breakdown\");\n for (const f of summary.featureBreakdown) {\n lines.push(`- **${f.feature}**: $${f.costUsd.toFixed(4)} (${f.requests} requests)`);\n }\n }\n\n if (sessionId) {\n lines.push(\"\", `_Current agent session: ${sessionId}_`);\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: lines.join(\"\\n\"),\n },\n ],\n };\n },\n );\n}\n","/**\n * GitChain MCP tools — consolidated chain lifecycle operations.\n *\n * 4 tools (down from 14) covering CRUD, versioning, branching, and review.\n * Backend calls are unchanged — same Convex `gitchain.*` namespace.\n *\n * Chain: GT-vaw0re (Git Chain), FEAT-CW-001 (ChainWork Engine)\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation, getWorkspaceContext } from \"../client.js\";\nimport { trackWriteTool } from \"../tool-surface.js\";\n\nexport const chainSchema = z.object({\n action: z.enum([\"create\", \"get\", \"list\", \"edit\"])\n .describe(\"Action: create a process, get process details, list all processes, or edit a process link\"),\n chainEntryId: z.string().optional()\n .describe(\"Chain entry ID (required for get/edit)\"),\n title: z.string().optional()\n .describe(\"Process title (required for create)\"),\n chainTypeId: z.string().optional().default(\"strategy-coherence\")\n .describe(\"Process template slug for create: 'strategy-coherence', 'idm-proposal', or any custom template slug\"),\n description: z.string().optional()\n .describe(\"Description (for create)\"),\n linkId: z.string().optional()\n .describe(\"Link to edit (for edit action): problem, insight, choice, action, outcome\"),\n content: z.string().optional()\n .describe(\"New content for the link (for edit action)\"),\n status: z.string().optional()\n .describe(\"Filter by status for list: 'draft' or 'active'\"),\n author: z.string().optional()\n .describe(\"Who is performing the action. Defaults to 'mcp'.\"),\n});\n\nexport const chainVersionSchema = z.object({\n action: z.enum([\"commit\", \"list\", \"diff\", \"revert\", \"history\"])\n .describe(\"Action: commit a snapshot, list commits, diff two versions, revert to a version, or view history\"),\n chainEntryId: z.string().describe(\"The chain's entry ID\"),\n commitMessage: z.string().optional()\n .describe(\"Commit message (required for commit). Convention: type(link): description\"),\n versionA: z.number().optional().describe(\"Earlier version for diff\"),\n versionB: z.number().optional().describe(\"Later version for diff\"),\n toVersion: z.number().optional().describe(\"Version number to revert to\"),\n author: z.string().optional().describe(\"Who is performing the action. Defaults to 'mcp'.\"),\n});\n\nexport const chainBranchSchema = z.object({\n action: z.enum([\"create\", \"list\", \"merge\", \"conflicts\"])\n .describe(\"Action: create a branch, list branches, merge a branch, or check for conflicts\"),\n chainEntryId: z.string().describe(\"The chain's entry ID\"),\n branchName: z.string().optional()\n .describe(\"Branch name (required for merge/conflicts, optional for create)\"),\n strategy: z.enum([\"merge_commit\", \"squash\"]).optional()\n .describe(\"Merge strategy: 'merge_commit' (default) or 'squash'\"),\n author: z.string().optional().describe(\"Who is performing the action. Defaults to 'mcp'.\"),\n});\n\nexport const chainReviewSchema = z.object({\n action: z.enum([\"gate\", \"comment\", \"resolve-comment\", \"list-comments\"])\n .describe(\"Action: run coherence gate, add a comment, resolve a comment, or list comments\"),\n chainEntryId: z.string().describe(\"The chain's entry ID\"),\n commitMessage: z.string().optional()\n .describe(\"Commit message to lint (for gate action)\"),\n versionNumber: z.number().optional()\n .describe(\"Version to comment on or list comments for\"),\n linkId: z.string().optional()\n .describe(\"Link this comment targets (optional for comment)\"),\n body: z.string().optional()\n .describe(\"Comment text (required for comment action)\"),\n commentId: z.string().optional()\n .describe(\"Comment ID (required for resolve-comment)\"),\n author: z.string().optional().describe(\"Who is performing the action. Defaults to 'mcp'.\"),\n});\n\nfunction linkSummary(links: Record<string, string>): string {\n return Object.entries(links)\n .map(([id, content]) => {\n const filled = typeof content === \"string\" && content.length > 0;\n const preview = filled\n ? content.substring(0, 80) + (content.length > 80 ? \"...\" : \"\")\n : \"(empty)\";\n return ` - **${id}**: ${preview}`;\n })\n .join(\"\\n\");\n}\n\nexport function registerGitChainTools(server: McpServer) {\n\n // ─── chain: CRUD operations ─────────────────────────────────────────\n\n const chainTool = server.registerTool(\n \"chain\",\n {\n title: \"Chain\",\n description:\n \"Manage processes — create, get, list, or edit process links. \" +\n \"Processes are versioned knowledge artifacts that follow a process template \" +\n \"(e.g. Strategy Coherence: Problem → Insight → Choice → Action → Outcome).\",\n inputSchema: chainSchema,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n },\n async ({ action, chainEntryId, title, chainTypeId, description, linkId, content, status, author }) => {\n if (action === \"create\") {\n if (!title) return { content: [{ type: \"text\" as const, text: \"A `title` is required to create a process.\" }] };\n\n const result = await mcpMutation<{ _id: string; entryId: string }>(\n \"gitchain.createChain\",\n { title, chainTypeId, description, author }\n );\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Process Created\\n\\n` +\n `- **Entry ID:** \\`${result.entryId}\\`\\n` +\n `- **Title:** ${title}\\n` +\n `- **Type:** ${chainTypeId}\\n` +\n `- **Status:** draft\\n\\n` +\n `Use \\`chain action=edit chainEntryId=\"${result.entryId}\" linkId=\"problem\" content=\"...\"\\` to start filling in links.`,\n }],\n };\n }\n\n if (action === \"get\") {\n if (!chainEntryId) return { content: [{ type: \"text\" as const, text: \"A `chainEntryId` is required.\" }] };\n\n const chain = await mcpQuery<any>(\"gitchain.getChain\", { chainEntryId });\n if (!chain) {\n return { content: [{ type: \"text\" as const, text: `Process \"${chainEntryId}\" not found.` }] };\n }\n\n const scoreSection = chain.scores\n ? `\\n## Coherence: ${chain.coherenceScore}%\\n\\n` +\n chain.scores.sections\n .map((s: any) => `- **${s.key}**: ${s.power}/100 (${\"★\".repeat(Math.min(s.stars ?? 0, 5))}${\"☆\".repeat(Math.max(0, 5 - (s.stars ?? 0)))})`)\n .join(\"\\n\")\n : \"\";\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# ${chain.name}\\n\\n` +\n `- **Entry ID:** \\`${chain.entryId}\\`\\n` +\n `- **Type:** ${chain.chainTypeName}\\n` +\n `- **Status:** ${chain.status}\\n` +\n `- **Links filled:** ${chain.filledCount}/${chain.totalCount}\\n` +\n `- **Version:** ${chain.currentVersion}\\n` +\n `- **Created by:** ${chain.createdBy ?? \"unknown\"}\\n` +\n `- **History events:** ${chain.historyCount}\\n` +\n scoreSection +\n `\\n\\n## Links\\n\\n` +\n linkSummary(chain.links),\n }],\n };\n }\n\n if (action === \"list\") {\n const chains = await mcpQuery<any[]>(\"gitchain.listChains\", {\n chainTypeId,\n status,\n });\n\n if (chains.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"No processes found. Use `chain action=create` to create one.\" }] };\n }\n\n const formatted = chains\n .map((c) =>\n `- **\\`${c.entryId}\\`** ${c.name} — ${c.chainTypeId} · ` +\n `${c.filledCount}/${c.totalCount} links · ` +\n `coherence: ${c.coherenceScore}% · status: ${c.status}`\n )\n .join(\"\\n\");\n\n return { content: [{ type: \"text\" as const, text: `# Chains (${chains.length})\\n\\n${formatted}` }] };\n }\n\n if (action === \"edit\") {\n if (!chainEntryId) return { content: [{ type: \"text\" as const, text: \"A `chainEntryId` is required.\" }] };\n if (!linkId) return { content: [{ type: \"text\" as const, text: \"A `linkId` is required (e.g. problem, insight, choice, action, outcome).\" }] };\n if (!content) return { content: [{ type: \"text\" as const, text: \"The `content` for the link is required.\" }] };\n\n const result = await mcpMutation<{\n _id: string; entryId: string; linkId: string; status: string;\n }>(\"gitchain.editLink\", { chainEntryId, linkId, content, author });\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Link Updated\\n\\n` +\n `- **Chain:** \\`${result.entryId}\\`\\n` +\n `- **Link:** ${result.linkId}\\n` +\n `- **Chain status:** ${result.status}\\n` +\n `- **Content length:** ${content.length} chars\\n\\n` +\n `Use \\`chain action=get\\` to see the full chain with updated scores.`,\n }],\n };\n }\n\n return { content: [{ type: \"text\" as const, text: \"Unknown action.\" }] };\n }\n );\n trackWriteTool(chainTool);\n\n // ─── chain-version: versioning operations ───────────────────────────\n\n const chainVersionTool = server.registerTool(\n \"chain-version\",\n {\n title: \"Chain Version\",\n description:\n \"Manage process versions — commit snapshots, list commits, view history, diff versions, or revert. \" +\n \"Commits record all link content, compute coherence scores, and track changes.\",\n inputSchema: chainVersionSchema,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n },\n async ({ action, chainEntryId, commitMessage, versionA, versionB, toVersion, author }) => {\n if (action === \"commit\") {\n if (!commitMessage) return { content: [{ type: \"text\" as const, text: \"A `commitMessage` is required.\" }] };\n\n const result = await mcpMutation<{\n entryId: string; version: number; coherenceScore: number;\n linksModified: string[]; commitLintWarning: string | null;\n }>(\"gitchain.commitChain\", { chainEntryId, commitMessage, author });\n\n const warning = result.commitLintWarning\n ? `\\n\\n> **Lint warning:** ${result.commitLintWarning}`\n : \"\";\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Committed v${result.version}\\n\\n` +\n `- **Chain:** \\`${result.entryId}\\`\\n` +\n `- **Version:** ${result.version}\\n` +\n `- **Message:** ${commitMessage}\\n` +\n `- **Coherence:** ${result.coherenceScore}%\\n` +\n `- **Links modified:** ${result.linksModified.length > 0 ? result.linksModified.join(\", \") : \"none\"}\\n` +\n warning,\n }],\n };\n }\n\n if (action === \"list\") {\n const commits = await mcpQuery<any[]>(\"gitchain.listCommits\", { chainEntryId });\n\n if (commits.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No commits found for chain \"${chainEntryId}\". Use \\`chain-version action=commit\\` to create the first snapshot.` }] };\n }\n\n const formatted = commits\n .map((c: any) => {\n const date = new Date(c.createdAt).toISOString().replace(\"T\", \" \").substring(0, 19);\n const msg = c.commitMessage ?? c.changeNote ?? \"(no message)\";\n const links = c.linksModified?.length > 0 ? ` [${c.linksModified.join(\", \")}]` : \"\";\n return `- **v${c.version}** ${date} by ${c.author} — ${msg}${links} (${c.versionStatus})`;\n })\n .join(\"\\n\");\n\n return { content: [{ type: \"text\" as const, text: `# Commits for ${chainEntryId} (${commits.length})\\n\\n${formatted}` }] };\n }\n\n if (action === \"diff\") {\n if (versionA == null || versionB == null) {\n return { content: [{ type: \"text\" as const, text: \"Both `versionA` and `versionB` are required for diff.\" }] };\n }\n\n const diff = await mcpMutation<any>(\"gitchain.diffVersions\", { chainEntryId, versionA, versionB });\n\n let text =\n `# Diff: v${versionA} → v${versionB}\\n\\n` +\n `- **Chain:** \\`${diff.chainEntryId}\\`\\n` +\n `- **Coherence:** ${diff.coherenceBefore}% → ${diff.coherenceAfter}% (${diff.coherenceDelta >= 0 ? \"+\" : \"\"}${diff.coherenceDelta})\\n` +\n `- **Links changed:** ${diff.linksChanged.length > 0 ? diff.linksChanged.join(\", \") : \"none\"}\\n`;\n\n for (const ld of diff.linkDiffs) {\n if (ld.status === \"unchanged\") continue;\n text += `\\n## ${ld.linkId} (${ld.status})\\n\\n`;\n const wordDiff = diff.wordDiffs[ld.linkId];\n if (wordDiff?.length > 0) {\n for (const w of wordDiff) {\n if (w.type === \"delete\") text += `~~${w.value.substring(0, 200)}~~`;\n else if (w.type === \"insert\") text += `**${w.value.substring(0, 200)}**`;\n else text += w.value.substring(0, 200);\n }\n text += \"\\n\";\n }\n }\n\n return { content: [{ type: \"text\" as const, text }] };\n }\n\n if (action === \"revert\") {\n if (toVersion == null) return { content: [{ type: \"text\" as const, text: \"A `toVersion` is required for revert.\" }] };\n\n const result = await mcpMutation<{\n entryId: string; revertedTo: number; newVersion: number; linksModified: string[];\n }>(\"gitchain.revertChain\", { chainEntryId, toVersion, author });\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Reverted\\n\\n` +\n `- **Chain:** \\`${result.entryId}\\`\\n` +\n `- **Reverted to:** v${result.revertedTo}\\n` +\n `- **New version:** v${result.newVersion}\\n` +\n `- **Links affected:** ${result.linksModified.length > 0 ? result.linksModified.join(\", \") : \"none\"}\\n\\n` +\n `History is preserved — this created a new version, not a destructive reset.`,\n }],\n };\n }\n\n if (action === \"history\") {\n const history = await mcpQuery<any[]>(\"gitchain.getHistory\", { chainEntryId });\n\n if (history.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No history found for chain \"${chainEntryId}\".` }] };\n }\n\n const formatted = history\n .sort((a: any, b: any) => b.timestamp - a.timestamp)\n .map((h: any) => {\n const date = new Date(h.timestamp).toISOString().replace(\"T\", \" \").substring(0, 19);\n return `- **${date}** [${h.event}] by ${h.changedBy ?? \"unknown\"} — ${h.note ?? \"\"}`;\n })\n .join(\"\\n\");\n\n return { content: [{ type: \"text\" as const, text: `# History for ${chainEntryId} (${history.length} events)\\n\\n${formatted}` }] };\n }\n\n return { content: [{ type: \"text\" as const, text: \"Unknown action.\" }] };\n }\n );\n trackWriteTool(chainVersionTool);\n\n // ─── chain-branch: branching operations ─────────────────────────────\n\n const chainBranchTool = server.registerTool(\n \"chain-branch\",\n {\n title: \"Chain Branch\",\n description:\n \"Manage process branches — create a branch for isolated editing, list branches, \" +\n \"merge a branch back into main, or check for conflicts.\",\n inputSchema: chainBranchSchema,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n },\n async ({ action, chainEntryId, branchName, strategy, author }) => {\n if (action === \"create\") {\n const result = await mcpMutation<{\n branchId: string; name: string; baseVersion: number;\n }>(\"gitchain.createBranch\", { chainEntryId, name: branchName, author });\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Branch Created\\n\\n` +\n `- **Name:** ${result.name}\\n` +\n `- **Based on:** v${result.baseVersion}\\n` +\n `- **Chain:** \\`${chainEntryId}\\`\\n\\n` +\n `Edit links and commit on this branch, then use \\`chain-branch action=merge\\` to land changes.`,\n }],\n };\n }\n\n if (action === \"list\") {\n const branches = await mcpMutation<any[]>(\"gitchain.listBranches\", { chainEntryId });\n\n if (branches.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No branches found for chain \"${chainEntryId}\".` }] };\n }\n\n const formatted = branches\n .map((b: any) => `- **${b.name}** (${b.status}) — based on v${b.baseVersion}, by ${b.createdBy}`)\n .join(\"\\n\");\n\n return { content: [{ type: \"text\" as const, text: `# Branches for ${chainEntryId} (${branches.length})\\n\\n${formatted}` }] };\n }\n\n if (action === \"merge\") {\n if (!branchName) return { content: [{ type: \"text\" as const, text: \"A `branchName` is required for merge.\" }] };\n\n const result = await mcpMutation<{\n entryId: string; branchName: string; version: number; strategy: string;\n }>(\"gitchain.mergeBranch\", { chainEntryId, branchName, strategy, author });\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Branch Merged\\n\\n` +\n `- **Chain:** \\`${result.entryId}\\`\\n` +\n `- **Branch:** ${result.branchName} (now closed)\\n` +\n `- **Version:** v${result.version}\\n` +\n `- **Strategy:** ${result.strategy}\\n\\n` +\n `Main is now at v${result.version}. The branch has been closed.`,\n }],\n };\n }\n\n if (action === \"conflicts\") {\n if (!branchName) return { content: [{ type: \"text\" as const, text: \"A `branchName` is required for conflict check.\" }] };\n\n const result = await mcpMutation<any>(\"gitchain.checkConflicts\", { chainEntryId, branchName });\n\n if (!result.hasConflicts) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# No Conflicts\\n\\nBranch \"${branchName}\" on \\`${chainEntryId}\\` has no conflicts. Safe to merge.`,\n }],\n };\n }\n\n const conflictLines = result.conflicts\n .map((c: any) =>\n `- **${c.linkId}** — modified by: ${c.branches.map((b: any) => `${b.branchName} (${b.author})`).join(\", \")}`\n )\n .join(\"\\n\");\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Conflicts Detected\\n\\n` +\n `Branch \"${branchName}\" conflicts with other branches on these links:\\n\\n` +\n conflictLines +\n `\\n\\nResolve conflicts before merging.`,\n }],\n };\n }\n\n return { content: [{ type: \"text\" as const, text: \"Unknown action.\" }] };\n }\n );\n trackWriteTool(chainBranchTool);\n\n // ─── chain-review: quality gate and comments ────────────────────────\n\n const chainReviewTool = server.registerTool(\n \"chain-review\",\n {\n title: \"Chain Review\",\n description:\n \"Review process quality — run the coherence gate or manage comments on process versions. \" +\n \"The gate checks: coherence score >= 70%, all links filled, commit message convention.\",\n inputSchema: chainReviewSchema,\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },\n },\n async ({ action, chainEntryId, commitMessage, versionNumber, linkId, body, commentId, author }) => {\n if (action === \"gate\") {\n const gate = await mcpQuery<any>(\"gitchain.runGate\", { chainEntryId, commitMessage });\n\n const checkLines = gate.checks\n .map((c: any) => `- ${c.pass ? \"PASS\" : \"FAIL\"} **${c.name}**: ${c.detail}`)\n .join(\"\\n\");\n\n const icon = gate.pass ? \"PASS\" : \"BLOCKED\";\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Gate: ${icon}\\n\\n` +\n `- **Score:** ${gate.score}%\\n` +\n `- **Threshold:** ${gate.threshold}%\\n\\n` +\n `## Checks\\n\\n${checkLines}`,\n }],\n };\n }\n\n if (action === \"comment\") {\n if (!versionNumber) return { content: [{ type: \"text\" as const, text: \"A `versionNumber` is required.\" }] };\n if (!body) return { content: [{ type: \"text\" as const, text: \"A `body` is required.\" }] };\n\n const result = await mcpMutation<any>(\"gitchain.addComment\", {\n chainEntryId, versionNumber, linkId, body, author,\n });\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Comment Added\\n\\n` +\n `- **Chain:** \\`${result.chainEntryId}\\`\\n` +\n `- **Version:** v${result.versionNumber}\\n` +\n (result.linkId ? `- **Link:** ${result.linkId}\\n` : \"\") +\n `- **Body:** ${body.substring(0, 200)}`,\n }],\n };\n }\n\n if (action === \"resolve-comment\") {\n if (!commentId) return { content: [{ type: \"text\" as const, text: \"A `commentId` is required.\" }] };\n await mcpMutation(\"gitchain.resolveComment\", { commentId });\n return { content: [{ type: \"text\" as const, text: `Comment resolved.` }] };\n }\n\n if (action === \"list-comments\") {\n const comments = await mcpMutation<any[]>(\"gitchain.listComments\", {\n chainEntryId, versionNumber,\n });\n\n if (comments.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No comments found for chain \"${chainEntryId}\"${versionNumber ? ` v${versionNumber}` : \"\"}.` }] };\n }\n\n const formatted = comments\n .map((c: any) => {\n const date = new Date(c.createdAt).toISOString().replace(\"T\", \" \").substring(0, 19);\n const resolved = c.resolved ? \" (RESOLVED)\" : \"\";\n const link = c.linkId ? ` [${c.linkId}]` : \"\";\n return `- **v${c.version}${link}** ${date} by ${c.author}${resolved}: ${c.body.substring(0, 150)}`;\n })\n .join(\"\\n\");\n\n const unresolvedCount = comments.filter((c: any) => !c.resolved).length;\n\n return {\n content: [{\n type: \"text\" as const,\n text: `# Comments for ${chainEntryId} (${comments.length}, ${unresolvedCount} unresolved)\\n\\n${formatted}`,\n }],\n };\n }\n\n return { content: [{ type: \"text\" as const, text: \"Unknown action.\" }] };\n }\n );\n trackWriteTool(chainReviewTool);\n}\n","/**\n * Map Composition MCP tools — CRUD, slot management, versioning, and suggestion.\n *\n * Maps are composed frameworks (e.g. Lean Canvas) assembled from shared\n * ingredient entries across collections. Each slot holds references to\n * ingredients; committing pins versions to create an immutable snapshot.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation, getWorkspaceContext } from \"../client.js\";\nimport { trackWriteTool } from \"../tool-surface.js\";\n\nexport const createAudienceMapSetSchema = z.object({\n audienceEntryId: z.string().describe(\"Entry ID of the audience (e.g. STR-fb7hje)\"),\n});\n\nexport const mapSchema = z.object({\n action: z\n .enum([\"create\", \"get\", \"list\"])\n .describe(\"Action: create a map, get map details, or list all maps\"),\n mapEntryId: z.string().optional().describe(\"Map entry ID (for get)\"),\n title: z.string().optional().describe(\"Map title (for create)\"),\n templateId: z\n .string()\n .optional()\n .default(\"lean-canvas\")\n .describe(\"Template slug for create: 'lean-canvas' or any composed template\"),\n description: z.string().optional().describe(\"Description (for create)\"),\n slotIds: z\n .array(z.string())\n .optional()\n .describe(\"Slot IDs to initialize (for create; auto-populated from template if omitted)\"),\n status: z.string().optional().describe(\"Filter by status for list\"),\n});\n\nexport const mapSlotSchema = z.object({\n action: z\n .enum([\"add\", \"remove\", \"replace\", \"list\"])\n .describe(\"Action: add/remove/replace an ingredient in a slot, or list slot contents\"),\n mapEntryId: z.string().describe(\"Map entry ID\"),\n slotId: z.string().optional().describe(\"Slot ID (e.g. 'problem', 'customer-segments')\"),\n ingredientEntryId: z\n .string()\n .optional()\n .describe(\"Ingredient entry ID to add/remove\"),\n newIngredientEntryId: z\n .string()\n .optional()\n .describe(\"New ingredient entry ID (for replace)\"),\n label: z.string().optional().describe(\"Display label override\"),\n author: z.string().optional().describe(\"Who is performing the action\"),\n});\n\nexport const mapVersionSchema = z.object({\n action: z\n .enum([\"commit\", \"list\", \"history\"])\n .describe(\"Action: commit the map, list commits, or view commit history\"),\n mapEntryId: z.string().describe(\"Map entry ID\"),\n commitMessage: z\n .string()\n .optional()\n .describe(\"Commit message (for commit action)\"),\n author: z.string().optional().describe(\"Who is committing\"),\n});\n\nexport const mapSuggestSchema = z.object({\n mapEntryId: z.string().describe(\"Map entry ID to suggest ingredients for\"),\n slotId: z\n .string()\n .optional()\n .describe(\"Specific slot to find ingredients for (or all empty slots)\"),\n query: z\n .string()\n .optional()\n .describe(\"Optional search query to narrow ingredient suggestions\"),\n});\n\nfunction slotSummary(slots: Record<string, any[]>): string {\n return Object.entries(slots)\n .map(([id, refs]) => {\n if (!refs || refs.length === 0) return ` - **${id}**: (empty)`;\n const items = refs\n .map((r: any) => {\n const name = r.ingredientName ?? r.label ?? r.entryId;\n const version = r.pinnedVersion ? ` v${r.pinnedVersion}` : \"\";\n const status = r.ingredientStatus ? ` [${r.ingredientStatus}]` : \"\";\n return `${name}${version}${status}`;\n })\n .join(\", \");\n return ` - **${id}**: ${items}`;\n })\n .join(\"\\n\");\n}\n\nexport function registerMapTools(server: McpServer) {\n // ─── create-audience-map-set: convenience for audience intelligence ──\n\n const createAudienceMapSetTool = server.registerTool(\n \"create-audience-map-set\",\n {\n title: \"Create Audience Map Set\",\n description:\n \"Create all three audience intelligence maps (Empathy, Narrowing, Jobs & Alternatives) \" +\n \"anchored to one audience entry. The audience is pre-slotted in the anchor position of each map.\",\n inputSchema: createAudienceMapSetSchema,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n },\n async ({ audienceEntryId }) => {\n const result = await mcpMutation<{ audienceEntryId: string; maps: Array<{ templateId: string; mapEntryId: string }> }>(\n \"maps.createAudienceMapSet\",\n { audienceEntryId }\n );\n\n const wsCtx = await getWorkspaceContext();\n const lines = result.maps.map(\n (m) => `- **${m.templateId}**: \\`${m.mapEntryId}\\``\n );\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Audience Map Set Created\\n\\n` +\n `**Audience:** \\`${result.audienceEntryId}\\`\\n` +\n `**Workspace:** ${wsCtx.workspaceSlug}\\n\\n` +\n `## Maps\\n\\n${lines.join(\"\\n\")}\\n\\n` +\n `Use map-slot to add ingredients. View at /empathy, /narrowing, and /jobs.`,\n },\n ],\n };\n }\n );\n trackWriteTool(createAudienceMapSetTool);\n\n // ─── map: CRUD operations ──────────────────────────────────────────\n\n const mapTool = server.registerTool(\n \"map\",\n {\n title: \"Map\",\n description:\n \"Manage composed framework maps — create, get, or list. \" +\n \"Maps assemble ingredient entries into framework slots (e.g. Lean Canvas). \" +\n \"Use map-slot to add/remove ingredients, map-version to commit and view history.\",\n inputSchema: mapSchema,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n },\n async ({ action, mapEntryId, title, templateId, description, slotIds, status }) => {\n if (action === \"create\") {\n if (!title) {\n return {\n content: [\n { type: \"text\" as const, text: \"A `title` is required to create a map.\" },\n ],\n };\n }\n\n const result = await mcpMutation<{ _id: string; entryId: string }>(\n \"maps.createMap\",\n { title, templateId, description, slotIds }\n );\n\n const wsCtx = await getWorkspaceContext();\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Map Created\\n\\n` +\n `- **Entry ID:** \\`${result.entryId}\\`\\n` +\n `- **Title:** ${title}\\n` +\n `- **Template:** ${templateId}\\n` +\n `- **Status:** draft\\n` +\n `- **Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})\\n\\n` +\n `Use \\`map-slot action=add mapEntryId=\"${result.entryId}\" slotId=\"problem\" ingredientEntryId=\"...\"\\` to start filling slots.`,\n },\n ],\n };\n }\n\n if (action === \"get\") {\n if (!mapEntryId) {\n return {\n content: [{ type: \"text\" as const, text: \"A `mapEntryId` is required.\" }],\n };\n }\n\n const map = await mcpQuery<any>(\"maps.getMap\", { mapEntryId });\n if (!map) {\n return {\n content: [{ type: \"text\" as const, text: `Map \"${mapEntryId}\" not found.` }],\n };\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# ${map.name}\\n\\n` +\n `- **Entry ID:** \\`${map.entryId}\\`\\n` +\n `- **Template:** ${map.templateName}\\n` +\n `- **Status:** ${map.status}\\n` +\n `- **Version:** ${map.currentVersion}\\n` +\n `- **Completion:** ${map.completionScore}% (${map.filledSlots}/${map.totalSlots} slots)\\n\\n` +\n `## Slots\\n\\n` +\n slotSummary(map.slots),\n },\n ],\n };\n }\n\n if (action === \"list\") {\n const maps = await mcpQuery<any[]>(\"maps.listMaps\", {\n templateId: templateId !== \"lean-canvas\" ? templateId : undefined,\n status,\n });\n\n if (!maps || maps.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"No maps found. Create one with `map action=create title=\\\"My Canvas\\\"`.\",\n },\n ],\n };\n }\n\n const lines = maps.map(\n (m: any) =>\n `- **${m.name}** (\\`${m.entryId}\\`) — ${m.templateId}, ${m.completionScore}% complete, v${m.currentVersion}`\n );\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `# Maps (${maps.length})\\n\\n${lines.join(\"\\n\")}`,\n },\n ],\n };\n }\n\n return {\n content: [{ type: \"text\" as const, text: `Unknown action: ${action}` }],\n };\n }\n );\n trackWriteTool(mapTool);\n\n // ─── map-slot: manage ingredients in slots ─────────────────────────\n\n const mapSlotTool = server.registerTool(\n \"map-slot\",\n {\n title: \"Map Slot\",\n description:\n \"Add, remove, or replace ingredient references in a map's slots. \" +\n \"Ingredients are entries from any collection that fill a framework position.\",\n inputSchema: mapSlotSchema,\n annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: false },\n },\n async ({\n action,\n mapEntryId,\n slotId,\n ingredientEntryId,\n newIngredientEntryId,\n label,\n author,\n }) => {\n if (action === \"list\") {\n const map = await mcpQuery<any>(\"maps.getMap\", { mapEntryId });\n if (!map) {\n return {\n content: [{ type: \"text\" as const, text: `Map \"${mapEntryId}\" not found.` }],\n };\n }\n\n if (slotId && map.slots[slotId]) {\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Slot: ${slotId}\\n\\n` +\n (map.slots[slotId].length === 0\n ? \"(empty)\"\n : map.slots[slotId]\n .map(\n (r: any) =>\n `- **${r.ingredientName ?? r.entryId}** (\\`${r.entryId}\\`)${r.pinnedVersion ? ` v${r.pinnedVersion}` : \"\"}`\n )\n .join(\"\\n\")),\n },\n ],\n };\n }\n\n return {\n content: [\n { type: \"text\" as const, text: `## All Slots\\n\\n${slotSummary(map.slots)}` },\n ],\n };\n }\n\n if (action === \"add\") {\n if (!slotId || !ingredientEntryId) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Both `slotId` and `ingredientEntryId` are required for add.\",\n },\n ],\n };\n }\n\n await mcpMutation(\"maps.addToSlot\", {\n mapEntryId,\n slotId,\n ingredientEntryId,\n label,\n author,\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Added \\`${ingredientEntryId}\\` to slot \"${slotId}\" on map \\`${mapEntryId}\\`.`,\n },\n ],\n };\n }\n\n if (action === \"remove\") {\n if (!slotId || !ingredientEntryId) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Both `slotId` and `ingredientEntryId` are required for remove.\",\n },\n ],\n };\n }\n\n await mcpMutation(\"maps.removeFromSlot\", {\n mapEntryId,\n slotId,\n ingredientEntryId,\n author,\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Removed \\`${ingredientEntryId}\\` from slot \"${slotId}\" on map \\`${mapEntryId}\\`.`,\n },\n ],\n };\n }\n\n if (action === \"replace\") {\n if (!slotId || !ingredientEntryId || !newIngredientEntryId) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"`slotId`, `ingredientEntryId`, and `newIngredientEntryId` are required for replace.\",\n },\n ],\n };\n }\n\n await mcpMutation(\"maps.replaceInSlot\", {\n mapEntryId,\n slotId,\n oldIngredientEntryId: ingredientEntryId,\n newIngredientEntryId,\n label,\n author,\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Replaced \\`${ingredientEntryId}\\` with \\`${newIngredientEntryId}\\` in slot \"${slotId}\".`,\n },\n ],\n };\n }\n\n return {\n content: [{ type: \"text\" as const, text: `Unknown action: ${action}` }],\n };\n }\n );\n trackWriteTool(mapSlotTool);\n\n // ─── map-version: commit, list history, diff ───────────────────────\n\n const mapVersionTool = server.registerTool(\n \"map-version\",\n {\n title: \"Map Version\",\n description:\n \"Commit a map (pins ingredient versions), list commit history, or view a specific commit.\",\n inputSchema: mapVersionSchema,\n annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },\n },\n async ({ action, mapEntryId, commitMessage, author }) => {\n if (action === \"commit\") {\n const result = await mcpMutation<any>(\"maps.commitMap\", {\n mapEntryId,\n commitMessage: commitMessage ?? \"Map committed\",\n author,\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Map Committed\\n\\n` +\n `- **Version:** ${result.version}\\n` +\n `- **Completion:** ${result.completionScore}%\\n` +\n `- **Slots modified:** ${result.slotsModified.length > 0 ? result.slotsModified.join(\", \") : \"(none)\"}\\n\\n` +\n `All ingredient references have been pinned at their current versions.`,\n },\n ],\n };\n }\n\n if (action === \"list\" || action === \"history\") {\n const commits = await mcpQuery<any[]>(\"maps.listMapCommits\", {\n mapEntryId,\n });\n\n if (!commits || commits.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `No commits yet for map \\`${mapEntryId}\\`. Use \\`map-version action=commit\\` to create the first snapshot.`,\n },\n ],\n };\n }\n\n const lines = commits.map(\n (c: any) =>\n `- **v${c.version}** (${new Date(c.createdAt).toLocaleDateString()}) — ${c.commitMessage ?? \"(no message)\"} — by ${c.author}` +\n (c.slotsModified.length > 0\n ? `\\n Slots changed: ${c.slotsModified.join(\", \")}`\n : \"\")\n );\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `# Map History: \\`${mapEntryId}\\` (${commits.length} commits)\\n\\n${lines.join(\"\\n\")}`,\n },\n ],\n };\n }\n\n return {\n content: [{ type: \"text\" as const, text: `Unknown action: ${action}` }],\n };\n }\n );\n trackWriteTool(mapVersionTool);\n\n // ─── map-suggest: find ingredients to fill slots ───────────────────\n\n server.registerTool(\n \"map-suggest\",\n {\n title: \"Map Suggest\",\n description:\n \"Given a map with empty slots, search the Chain for ingredients that could fill them. \" +\n \"Uses keyword search and collection matching based on the template's suggested collections.\",\n inputSchema: mapSuggestSchema,\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },\n },\n async ({ mapEntryId, slotId, query }) => {\n const map = await mcpQuery<any>(\"maps.getMap\", { mapEntryId });\n if (!map) {\n return {\n content: [{ type: \"text\" as const, text: `Map \"${mapEntryId}\" not found.` }],\n };\n }\n\n const emptySlots = slotId\n ? [slotId].filter((id) => (map.slots[id]?.length ?? 0) === 0)\n : Object.entries(map.slots as Record<string, any[]>)\n .filter(([, refs]) => refs.length === 0)\n .map(([id]) => id);\n\n if (emptySlots.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: slotId\n ? `Slot \"${slotId}\" already has ingredients.`\n : \"All slots have ingredients. Nothing to suggest.\",\n },\n ],\n };\n }\n\n const slotDefs = map.slotDefs ?? [];\n const suggestions: string[] = [];\n\n for (const sid of emptySlots) {\n const def = slotDefs.find((s: any) => s.id === sid);\n const searchQuery = query ?? def?.label ?? sid;\n\n const results = await mcpQuery<any[]>(\"knowledge.search\", {\n query: searchQuery,\n limit: 5,\n });\n\n if (results && results.length > 0) {\n const items = results.map(\n (r: any) =>\n ` - **${r.name}** (\\`${r.entryId}\\`, ${r.collectionName ?? \"unknown\"}) — ${r.status}`\n );\n suggestions.push(\n `### ${def?.label ?? sid}\\n${def?.description ?? \"\"}\\n\\n${items.join(\"\\n\")}`\n );\n } else {\n suggestions.push(\n `### ${def?.label ?? sid}\\n_No matching entries found. Create ingredients first._`\n );\n }\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Ingredient Suggestions for \"${map.name}\"\\n\\n` +\n suggestions.join(\"\\n\\n\") +\n `\\n\\nUse \\`map-slot action=add mapEntryId=\"${mapEntryId}\" slotId=\"...\" ingredientEntryId=\"...\"\\` to add ingredients.`,\n },\n ],\n };\n }\n );\n}\n","/**\n * Architecture tools — ARCH-node-mcp (Core layer)\n *\n * Tools: architecture (show/explore/flow), architecture-admin (seed/check)\n * Chain refs: FEAT-ARCH-001 (Architecture Explorer), FEAT-dep-health (Dep Health Scanner),\n * SOS-dbl1n9 (dependency direction rule), GT-wk426u (Fitness Function)\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { resolve, relative, dirname, normalize } from \"node:path\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation } from \"../client.js\";\nimport { trackWriteTool } from \"../tool-surface.js\";\n\nconst COLLECTION_SLUG = \"architecture\";\n\nconst COLLECTION_FIELDS = [\n { key: \"archType\", label: \"Architecture Type\", type: \"select\", required: true, options: [\"template\", \"layer\", \"node\", \"flow\"], searchable: true },\n { key: \"templateRef\", label: \"Template Entry ID\", type: \"text\", searchable: false },\n { key: \"layerRef\", label: \"Layer Entry ID\", type: \"text\", searchable: false },\n { key: \"description\", label: \"Description\", type: \"text\", searchable: true },\n { key: \"color\", label: \"Color\", type: \"text\" },\n { key: \"icon\", label: \"Icon\", type: \"text\" },\n { key: \"sourceNode\", label: \"Source Node (flows)\", type: \"text\" },\n { key: \"targetNode\", label: \"Target Node (flows)\", type: \"text\" },\n { key: \"filePaths\", label: \"File Paths\", type: \"text\", searchable: true },\n { key: \"owner\", label: \"Owner (circle/role)\", type: \"text\", searchable: true },\n { key: \"layerOrder\", label: \"Layer Order (for templates)\", type: \"text\" },\n { key: \"rationale\", label: \"Why Here? (placement rationale)\", type: \"text\", searchable: true },\n { key: \"dependsOn\", label: \"Allowed Dependencies (layers this can import from)\", type: \"text\" },\n];\n\ninterface ArchEntry {\n _id: string;\n entryId: string;\n name: string;\n status: string;\n order: number;\n data: Record<string, unknown>;\n tags?: string[];\n}\n\nconst ARCHITECTURE_CANONICAL_KEY = \"architecture_note\";\n\nasync function ensureCollection(): Promise<void> {\n const collections = await mcpQuery<any[]>(\"chain.listCollections\");\n const existing = collections.find((c: any) => c.slug === COLLECTION_SLUG);\n\n if (existing) {\n if (!existing.defaultCanonicalKey) {\n await mcpMutation(\"chain.updateCollection\", {\n slug: COLLECTION_SLUG,\n defaultCanonicalKey: ARCHITECTURE_CANONICAL_KEY,\n });\n }\n return;\n }\n\n await mcpMutation(\"chain.createCollection\", {\n slug: COLLECTION_SLUG,\n name: \"Architecture\",\n icon: \"🏗️\",\n description:\n \"System architecture map — templates, layers, nodes, and flows. \" +\n \"Visualized in the Architecture Explorer and via MCP architecture tools.\",\n fields: COLLECTION_FIELDS,\n });\n}\n\nasync function listArchEntries(): Promise<ArchEntry[]> {\n return mcpQuery<ArchEntry[]>(\"chain.listEntries\", { collectionSlug: COLLECTION_SLUG });\n}\n\nfunction byTag(entries: ArchEntry[], archType: string): ArchEntry[] {\n return entries\n .filter((e) => e.tags?.includes(`archType:${archType}`) || e.data?.archType === archType)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n}\n\n// ── HTML renderer for MCP Apps ──────────────────────────────────────────────\n\nfunction renderArchitectureHtml(\n layers: ArchEntry[],\n nodes: ArchEntry[],\n flows: ArchEntry[],\n templateName: string,\n): string {\n const layerHtml = layers.map((layer) => {\n const layerNodes = nodes.filter(\n (n) => n.data?.layerRef === layer.entryId\n );\n const nodeCards = layerNodes.map((n) => `\n <div class=\"node\" title=\"${escHtml(String(n.data?.description ?? ''))}\">\n <span class=\"node-icon\">${escHtml(String(n.data?.icon ?? '◻'))}</span>\n <span class=\"node-name\">${escHtml(n.name)}</span>\n </div>\n `).join(\"\");\n\n return `\n <div class=\"layer\" style=\"--layer-color: ${escHtml(String(layer.data?.color ?? '#666'))}\">\n <div class=\"layer-label\">\n <span class=\"layer-dot\"></span>\n <span class=\"layer-name\">${escHtml(layer.name)}</span>\n <span class=\"layer-count\">${layerNodes.length}</span>\n </div>\n <div class=\"layer-desc\">${escHtml(String(layer.data?.description ?? ''))}</div>\n <div class=\"nodes\">${nodeCards || '<span class=\"empty\">No components</span>'}</div>\n </div>\n `;\n }).join(\"\");\n\n return `<!DOCTYPE html>\n<html><head><meta charset=\"utf-8\"><style>\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:-apple-system,system-ui,sans-serif;background:#1a1a2e;color:#e0e0e0;padding:16px}\nh1{font-size:14px;font-weight:600;color:#a0a0c0;margin-bottom:12px;letter-spacing:.04em}\n.layer{border-left:3px solid var(--layer-color);padding:8px 12px;margin-bottom:8px;background:rgba(255,255,255,.03);border-radius:0 6px 6px 0}\n.layer-label{display:flex;align-items:center;gap:8px;margin-bottom:4px}\n.layer-dot{width:8px;height:8px;border-radius:50%;background:var(--layer-color)}\n.layer-name{font-size:12px;font-weight:600;color:#fff;letter-spacing:.03em}\n.layer-count{font-size:10px;color:var(--layer-color);background:rgba(255,255,255,.06);padding:1px 6px;border-radius:8px}\n.layer-desc{font-size:11px;color:#888;margin-bottom:6px}\n.nodes{display:flex;flex-wrap:wrap;gap:6px}\n.node{display:flex;align-items:center;gap:4px;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.08);border-radius:4px;padding:4px 8px;font-size:11px;cursor:default;transition:border-color .15s}\n.node:hover{border-color:var(--layer-color)}\n.node-icon{font-size:12px}\n.node-name{color:#ddd}\n.empty{font-size:11px;color:#555;font-style:italic}\n.flows{margin-top:12px;border-top:1px solid rgba(255,255,255,.06);padding-top:8px}\n.flow{font-size:11px;color:#888;padding:2px 0}\n.flow-arrow{color:#6366f1;margin:0 4px}\n</style></head><body>\n<h1>${escHtml(templateName)}</h1>\n${layerHtml}\n${flows.length > 0 ? `<div class=\"flows\"><div style=\"font-size:10px;color:#666;margin-bottom:4px;letter-spacing:.06em\">DATA FLOWS</div>${flows.map((f) => `<div class=\"flow\">${escHtml(f.name)}<span class=\"flow-arrow\">→</span><span style=\"color:#aaa\">${escHtml(String(f.data?.description ?? ''))}</span></div>`).join(\"\")}</div>` : \"\"}\n</body></html>`;\n}\n\nfunction escHtml(s: string): string {\n return s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\").replace(/\"/g, \""\");\n}\n\nfunction formatLayerText(layer: ArchEntry, nodes: ArchEntry[]): string {\n const layerNodes = nodes.filter((n) => n.data?.layerRef === layer.entryId);\n const nodeList = layerNodes.map((n) => {\n const desc = n.data?.description ? ` — ${n.data.description}` : \"\";\n const owner = n.data?.owner ? ` (${n.data.owner})` : \"\";\n return ` - ${n.data?.icon ?? \"◻\"} **${n.name}**${desc}${owner}`;\n }).join(\"\\n\");\n return `### ${layer.name}\\n${layer.data?.description ?? \"\"}\\n\\n${nodeList || \" _No components_\"}`;\n}\n\n// ── Seed data: Product OS default architecture ──────────────────────────────\n\nconst SEED_TEMPLATE = {\n entryId: \"ARCH-tpl-product-os\",\n name: \"Product OS Default\",\n data: {\n archType: \"template\",\n description: \"Default 4-layer architecture: Auth → Infrastructure → Core → Features, with an outward Integration layer\",\n layerOrder: JSON.stringify([\"auth\", \"infrastructure\", \"core\", \"features\", \"integration\"]),\n },\n};\n\nconst SEED_LAYERS = [\n { entryId: \"ARCH-layer-auth\", name: \"Auth\", order: 0, data: { archType: \"layer\", templateRef: \"ARCH-tpl-product-os\", color: \"#22c55e\", description: \"Authentication, user management, and workspace-scoped access control\", icon: \"🔐\", dependsOn: \"none\", rationale: \"Foundation layer. Auth depends on nothing — it is the first gate. No layer may bypass auth. All other layers depend on auth to know who the user is and which workspace they belong to.\" } },\n { entryId: \"ARCH-layer-infra\", name: \"Infrastructure\", order: 1, data: { archType: \"layer\", templateRef: \"ARCH-tpl-product-os\", color: \"#ec4899\", description: \"Real-time data, event tracking, and AI model infrastructure\", icon: \"⚙️\", dependsOn: \"Auth\", rationale: \"Infrastructure sits on top of Auth. It provides the database, analytics, and AI plumbing that Core and Features consume. Infra may import from Auth (needs workspace context) but never from Core or Features.\" } },\n { entryId: \"ARCH-layer-core\", name: \"Core\", order: 2, data: { archType: \"layer\", templateRef: \"ARCH-tpl-product-os\", color: \"#8b5cf6\", description: \"Business logic, knowledge graph, workflow engines, and MCP tooling\", icon: \"🧠\", dependsOn: \"Auth, Infrastructure\", rationale: \"Core contains business logic and engines that are UI-agnostic. It may import from Auth and Infra. Features depend on Core, but Core must never depend on Features — this is what keeps engines reusable across different UIs.\" } },\n { entryId: \"ARCH-layer-features\", name: \"Features\", order: 3, data: { archType: \"layer\", templateRef: \"ARCH-tpl-product-os\", color: \"#6366f1\", description: \"User-facing pages, components, and feature modules\", icon: \"✦\", dependsOn: \"Auth, Infrastructure, Core\", rationale: \"Features are the user-facing layer — SvelteKit routes, components, and page-level logic. Features may import from any lower layer but nothing above may import from Features. This is the outermost application layer.\" } },\n { entryId: \"ARCH-layer-integration\", name: \"Integration\", order: 4, data: { archType: \"layer\", templateRef: \"ARCH-tpl-product-os\", color: \"#f59e0b\", description: \"Outward connections to external tools, IDEs, and services\", icon: \"🔌\", dependsOn: \"Core\", rationale: \"Integration is a lateral/outward layer — it connects to external systems (IDE, GitHub, Linear). It depends on Core (to expose knowledge) but sits outside the main stack. External tools call into Core via Integration, never directly into Features.\" } },\n];\n\nconst SEED_NODES = [\n // Auth layer\n { entryId: \"ARCH-node-clerk\", name: \"Clerk\", order: 0, data: { archType: \"node\", layerRef: \"ARCH-layer-auth\", color: \"#22c55e\", icon: \"🔑\", description: \"Authentication provider — sign-in/sign-up pages, session management, organization-level access control. UserSync.svelte is cross-cutting layout glue (not mapped here).\", filePaths: \"src/routes/sign-in/, src/routes/sign-up/\", owner: \"Platform\", rationale: \"Auth layer because Clerk is the identity gate. Every request flows through auth first. No other layer provides identity.\" } },\n { entryId: \"ARCH-node-workspace\", name: \"Workspace Scoping\", order: 1, data: { archType: \"node\", layerRef: \"ARCH-layer-auth\", color: \"#22c55e\", icon: \"🏢\", description: \"Multi-tenancy anchor — all data is workspace-scoped via workspaceId\", filePaths: \"src/lib/stores/workspace.ts, convex/workspaces.ts\", owner: \"Platform\", rationale: \"Auth layer because workspace scoping is the second gate after identity. All queries require workspaceId, making this foundational.\" } },\n\n // Infrastructure layer\n { entryId: \"ARCH-node-convex\", name: \"Convex\", order: 0, data: { archType: \"node\", layerRef: \"ARCH-layer-infra\", color: \"#ec4899\", icon: \"⚡\", description: \"Reactive database with real-time sync, serverless functions, and type-safe API generation. Unified Collections + Entries model\", filePaths: \"convex/schema.ts, convex/entries.ts, convex/http.ts\", owner: \"Platform\", rationale: \"Infrastructure because Convex is raw persistence and reactivity plumbing. It stores data but has no business logic opinions. Core and Features consume it.\" } },\n { entryId: \"ARCH-node-posthog\", name: \"PostHog\", order: 1, data: { archType: \"node\", layerRef: \"ARCH-layer-infra\", color: \"#ec4899\", icon: \"📊\", description: \"Product analytics — workspace-scoped events, feature flags, session replay\", filePaths: \"src/lib/analytics.ts, src/lib/components/PostHogWorkspaceSync.svelte\", owner: \"Platform\", rationale: \"Infrastructure because PostHog is analytics plumbing — event collection and aggregation. It has no knowledge of business domains.\" } },\n { entryId: \"ARCH-node-openrouter\", name: \"OpenRouter\", order: 2, data: { archType: \"node\", layerRef: \"ARCH-layer-infra\", color: \"#ec4899\", icon: \"🤖\", description: \"AI model routing for ChainWork artifact generation — streaming responses with format-aware prompts\", filePaths: \"src/routes/api/chainwork/generate/+server.ts\", owner: \"ChainWork\", rationale: \"Infrastructure because OpenRouter is an AI model gateway — it routes prompts to models. The strategy logic lives in ChainWork Engine (Core); this is just the pipe.\" } },\n\n // Core layer\n { entryId: \"ARCH-node-mcp\", name: \"MCP Server\", order: 0, data: { archType: \"node\", layerRef: \"ARCH-layer-core\", color: \"#8b5cf6\", icon: \"🔧\", description: \"~19 modular tools exposing the knowledge graph as AI-consumable operations — capture, context assembly, verification, quality checks\", filePaths: \"packages/mcp-server/src/index.ts, packages/mcp-server/src/tools/\", owner: \"AI DX\", rationale: \"Core layer because the MCP server encodes business operations — capture with auto-linking, quality scoring, governance rules. It depends on Infra (Convex) but never touches UI routes. Why not Infrastructure? Because it has domain opinions. Why not Features? Because it has no UI — any client (Cursor, CLI, API) can call it.\" } },\n { entryId: \"ARCH-node-knowledge-graph\", name: \"Knowledge Graph\", order: 1, data: { archType: \"node\", layerRef: \"ARCH-layer-core\", color: \"#8b5cf6\", icon: \"🕸️\", description: \"20 collections, 170+ entries with typed cross-collection relations. Smart capture, auto-linking, quality scoring\", filePaths: \"convex/mcpKnowledge.ts, convex/entries.ts\", owner: \"Knowledge\", rationale: \"Core layer because the knowledge graph IS the domain model — collections, entries, relations, versioning, quality scoring. Glossary DATA, business rules DATA, tension DATA all live here. Why not Features? Because the data model exists independently of any page. The Glossary page in Features is just one way to visualize terms that Core owns. Think: Core owns the dictionary, Features owns the dictionary app.\" } },\n { entryId: \"ARCH-node-governance\", name: \"Governance Engine\", order: 2, data: { archType: \"node\", layerRef: \"ARCH-layer-core\", color: \"#8b5cf6\", icon: \"⚖️\", description: \"Circles, roles, consent-based decision-making, tension processing with IDM-inspired async workflows\", filePaths: \"convex/versioning.ts, src/lib/components/versioning/\", owner: \"Governance\", rationale: \"Core layer because governance logic (draft→publish workflows, consent-based decisions, tension status rules) is business process that multiple UIs consume. Why not Features? Because the versioning system and proposal flow are reusable engines — the Governance Pages in Features are just one rendering of these rules.\" } },\n { entryId: \"ARCH-node-chainwork-engine\", name: \"ChainWork Engine\", order: 3, data: { archType: \"node\", layerRef: \"ARCH-layer-core\", color: \"#8b5cf6\", icon: \"⛓\", description: \"Guided strategy creation through 5-step coherence chain — AI-generated artifacts with scoring and achievements\", filePaths: \"src/lib/components/chainwork/config.ts, src/lib/components/chainwork/scoring.ts\", owner: \"ChainWork\", rationale: \"Core layer because the coherence chain logic, scoring algorithm, and quality gates are business rules. config.ts defines chain steps, scoring.ts computes quality — these could power a CLI or API. Why not Features? Because the ChainWork UI wizard in Features is just one skin over this engine.\" } },\n\n // Features layer\n { entryId: \"ARCH-node-command-center\", name: \"Command Center\", order: 0, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"⬡\", description: \"Calm home screen — daily orientation, triage mode, pulse metrics, momentum tracking\", filePaths: \"src/routes/+page.svelte, src/lib/components/command-center/\", owner: \"Command Center\", rationale: \"Features layer because the Command Center is a SvelteKit page — PulseMetrics, NeedsAttention, DailyBriefing are UI components that assemble data from Core queries. Why not Core? Because it has no reusable business logic or engines — it is pure layout and presentation. If you deleted this page, no business rule would break.\" } },\n { entryId: \"ARCH-node-chainwork-ui\", name: \"ChainWork UI\", order: 1, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"⛓\", description: \"Multi-step wizard for strategy artifact creation — setup, chain steps, quality gates, output\", filePaths: \"src/routes/chainwork/, src/lib/components/chainwork/\", owner: \"ChainWork\", rationale: \"Features layer because the ChainWork UI is the wizard interface — step navigation, form inputs, output rendering. Why not Core? Because the scoring logic and chain config ARE in Core (ChainWork Engine). This is the presentation skin over that engine. Delete this page and the engine still works via MCP.\" } },\n { entryId: \"ARCH-node-glossary\", name: \"Glossary\", order: 2, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"Aa\", description: \"Canonical vocabulary management — term detail, code drift detection, inline term linking\", filePaths: \"src/routes/glossary/, src/lib/components/glossary/\", owner: \"Knowledge\", rationale: \"Features layer — NOT Core or Infrastructure — because this is the Glossary PAGE: the SvelteKit route for browsing, editing, and viewing terms. Why not Core? Because Core owns the glossary DATA (Knowledge Graph) and term-linking logic. The MCP server also accesses glossary terms without any page. Why not Infrastructure? Because glossary is domain-specific vocabulary, not generic plumbing. The page is one consumer of the data — Core owns the dictionary, Features owns the dictionary app.\" } },\n { entryId: \"ARCH-node-tensions\", name: \"Tensions\", order: 3, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"⚡\", description: \"Tension capture and processing — raise, triage, resolve through governance workflow\", filePaths: \"src/routes/tensions/, src/lib/components/tensions/\", owner: \"Governance\", rationale: \"Features layer because this is the Tensions PAGE — the UI for raising, listing, and viewing tensions. Why not Core? Because tension data, status rules (SOS-020), and processing logic already live in Core (Governance Engine). This page is a form + list view that reads from and writes to Core. Delete it and the governance engine still processes tensions via MCP.\" } },\n { entryId: \"ARCH-node-strategy\", name: \"Strategy\", order: 4, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"▣\", description: \"Product strategy pages — vision, ecosystem, product areas, decision frameworks, sequencing\", filePaths: \"src/routes/strategy/, src/routes/bridge/, src/routes/topology/\", owner: \"Strategy\", rationale: \"Features layer because Strategy is a set of SvelteKit pages (strategy, bridge, topology) that visualize strategy entries. Why not Core? Because the strategy data (vision, principles, ecosystem layers) lives in the Knowledge Graph (Core). These pages render and allow inline editing — they consume Core downward.\" } },\n { entryId: \"ARCH-node-governance-ui\", name: \"Governance Pages\", order: 5, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"◈\", description: \"Roles, circles, principles, policies, decisions, proposals, business rules\", filePaths: \"src/routes/roles/, src/routes/circles/, src/routes/decisions/, src/routes/proposals/\", owner: \"Governance\", rationale: \"Features layer because these are governance PAGES — list views and detail views for roles, circles, decisions, proposals. Why not Core? Because the governance ENGINE (versioning, consent, IDM) IS in Core. These pages are the user-facing window into governance data. The logic doesn't live here, only the rendering.\" } },\n { entryId: \"ARCH-node-artifacts\", name: \"Artifacts\", order: 6, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"📄\", description: \"Strategy artifacts from ChainWork — pitches, briefs, one-pagers linked to the knowledge graph\", filePaths: \"src/routes/artifacts/\", owner: \"ChainWork\", rationale: \"Features layer because the Artifacts page is a list/detail view for strategy artifacts produced by ChainWork. Why not Core? Because artifact data and scoring live in Core (ChainWork Engine). This page just renders the output and links back to the knowledge graph.\" } },\n\n // Integration layer\n { entryId: \"ARCH-node-cursor\", name: \"Cursor IDE\", order: 0, data: { archType: \"node\", layerRef: \"ARCH-layer-integration\", color: \"#f59e0b\", icon: \"🖥️\", description: \"AI-assisted development with MCP-powered knowledge context — smart capture, verification, context assembly in the editor\", filePaths: \".cursor/mcp.json, .cursor/rules/\", owner: \"AI DX\", rationale: \"Integration layer because Cursor is an external tool that connects INTO our system via MCP. Why not Core or Features? Because Cursor itself is not our code — it's a consumer. The .cursor/ config files define how it talks to us, but Cursor lives outside our deployment boundary.\" } },\n { entryId: \"ARCH-node-github\", name: \"GitHub\", order: 1, data: { archType: \"node\", layerRef: \"ARCH-layer-integration\", color: \"#f59e0b\", icon: \"🐙\", description: \"Code repository, PR reviews with governance context, CI/CD\", owner: \"Platform\", rationale: \"Integration layer because GitHub is an external service. Why not Infrastructure? Because Infra is about plumbing we control (database, analytics). GitHub is a third-party that hooks into our Core (PR reviews checking governance rules) but is not part of our deployed application.\" } },\n { entryId: \"ARCH-node-linear\", name: \"Linear (planned)\", order: 2, data: { archType: \"node\", layerRef: \"ARCH-layer-integration\", color: \"#f59e0b\", icon: \"📐\", description: \"Issue tracking, roadmap sync, tension-to-issue pipeline (planned integration)\", owner: \"Platform\", rationale: \"Integration layer because Linear is an external issue tracker. Why not Infrastructure? Because Infra is generic plumbing we run. Linear is a third-party tool we connect to. The planned pipeline bridges tensions (Core) to Linear issues — a classic outward integration pattern.\" } },\n];\n\nconst SEED_FLOWS = [\n { entryId: \"ARCH-flow-smart-capture\", name: \"Capture Flow\", order: 0, data: { archType: \"flow\", sourceNode: \"ARCH-node-cursor\", targetNode: \"ARCH-node-knowledge-graph\", description: \"Developer/AI calls capture via MCP → entry created with auto-linking and quality score → stored in Knowledge Graph\", color: \"#8b5cf6\" } },\n { entryId: \"ARCH-flow-governance\", name: \"Governance Flow\", order: 1, data: { archType: \"flow\", sourceNode: \"ARCH-node-tensions\", targetNode: \"ARCH-node-governance\", description: \"Tension raised → appears in Command Center → triaged → processed via IDM → decision logged\", color: \"#6366f1\" } },\n { entryId: \"ARCH-flow-chainwork\", name: \"ChainWork Strategy Flow\", order: 2, data: { archType: \"flow\", sourceNode: \"ARCH-node-chainwork-ui\", targetNode: \"ARCH-node-artifacts\", description: \"Leader opens ChainWork → walks coherence chain → AI generates artifact → scored and published to knowledge graph\", color: \"#f59e0b\" } },\n { entryId: \"ARCH-flow-knowledge-trust\", name: \"Knowledge Trust Flow\", order: 3, data: { archType: \"flow\", sourceNode: \"ARCH-node-mcp\", targetNode: \"ARCH-node-glossary\", description: \"MCP verify tool checks entries against codebase → file existence, schema references validated → trust scores updated\", color: \"#22c55e\" } },\n { entryId: \"ARCH-flow-analytics\", name: \"Analytics Flow\", order: 4, data: { archType: \"flow\", sourceNode: \"ARCH-node-command-center\", targetNode: \"ARCH-node-posthog\", description: \"Feature views and actions tracked → workspace-scoped events → PostHog group analytics → Command Center metrics\", color: \"#ec4899\" } },\n];\n\n// ── Tool Registration ───────────────────────────────────────────────────────\n\nexport const architectureSchema = z.object({\n action: z.enum([\"show\", \"explore\", \"flow\"])\n .describe(\"Action: show full map, explore a layer, or visualize a flow\"),\n template: z.string().optional().describe(\"Template entry ID to filter by (for show)\"),\n layer: z.string().optional().describe(\"Layer name or entry ID (for explore), e.g. 'Core' or 'ARCH-layer-core'\"),\n flow: z.string().optional().describe(\"Flow name or entry ID (for flow), e.g. 'Smart Capture Flow'\"),\n});\n\nexport const architectureAdminSchema = z.object({\n action: z.enum([\"seed\", \"check\"])\n .describe(\"Action: seed default architecture data, or check dependency health\"),\n});\n\nexport function registerArchitectureTools(server: McpServer) {\n\n // ─── architecture: viewing operations ───────────────────────────────\n\n server.registerTool(\n \"architecture\",\n {\n title: \"Architecture\",\n description:\n \"Explore the system architecture — show the full map, explore a specific layer, or visualize a data flow.\\n\\n\" +\n \"Actions:\\n\" +\n \"- `show`: Render the layered architecture map (Auth → Infra → Core → Features → Integration)\\n\" +\n \"- `explore`: Drill into a layer to see nodes, ownership, file paths\\n\" +\n \"- `flow`: Visualize a data flow path between nodes\",\n inputSchema: architectureSchema,\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },\n },\n async ({ action, template, layer, flow }) => {\n await ensureCollection();\n const all = await listArchEntries();\n\n if (action === \"show\") {\n const templates = byTag(all, \"template\");\n const activeTemplate = template\n ? templates.find((t) => t.entryId === template)\n : templates[0];\n\n const templateName = activeTemplate?.name ?? \"System Architecture\";\n const templateId = activeTemplate?.entryId;\n\n const layers = byTag(all, \"layer\")\n .filter((l) => !templateId || l.data?.templateRef === templateId);\n const nodes = byTag(all, \"node\");\n const flows = byTag(all, \"flow\");\n\n if (layers.length === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"# Architecture Explorer\\n\\nNo architecture data found. Use `architecture-admin action=seed` to populate the default architecture.\",\n }],\n };\n }\n\n const textLayers = layers.map((l) => formatLayerText(l, nodes)).join(\"\\n\\n\");\n const textFlows = flows.length > 0\n ? \"\\n\\n---\\n\\n## Data Flows\\n\\n\" + flows.map((f) =>\n `- **${f.name}**: ${f.data?.description ?? \"\"}`\n ).join(\"\\n\")\n : \"\";\n\n const text = `# ${templateName}\\n\\n${textLayers}${textFlows}`;\n const html = renderArchitectureHtml(layers, nodes, flows, templateName);\n\n return {\n content: [\n { type: \"text\" as const, text },\n { type: \"resource\" as const, resource: { uri: `ui://product-os/architecture`, mimeType: \"text/html\", text: html } },\n ],\n };\n }\n\n if (action === \"explore\") {\n if (!layer) return { content: [{ type: \"text\" as const, text: \"A `layer` is required for explore.\" }] };\n\n const layers = byTag(all, \"layer\");\n const target = layers.find(\n (l) => l.name.toLowerCase() === layer.toLowerCase() || l.entryId === layer\n );\n\n if (!target) {\n const available = layers.map((l) => `\\`${l.name}\\``).join(\", \");\n return { content: [{ type: \"text\" as const, text: `Layer \"${layer}\" not found. Available layers: ${available}` }] };\n }\n\n const nodes = byTag(all, \"node\").filter((n) => n.data?.layerRef === target.entryId);\n const flows = byTag(all, \"flow\").filter(\n (f) => nodes.some((n) => n.entryId === f.data?.sourceNode || n.entryId === f.data?.targetNode)\n );\n\n const depRule = target.data?.dependsOn\n ? `\\n**Dependency rule:** May import from ${target.data.dependsOn === \"none\" ? \"nothing (foundation layer)\" : target.data.dependsOn}.\\n`\n : \"\";\n const layerRationale = target.data?.rationale ? `\\n> ${target.data.rationale}\\n` : \"\";\n\n const nodeDetail = nodes.map((n) => {\n const lines = [`#### ${n.data?.icon ?? \"◻\"} ${n.name}`];\n if (n.data?.description) lines.push(String(n.data.description));\n if (n.data?.owner) lines.push(`**Owner:** ${n.data.owner}`);\n if (n.data?.filePaths) lines.push(`**Files:** \\`${n.data.filePaths}\\``);\n if (n.data?.rationale) lines.push(`\\n**Why here?** ${n.data.rationale}`);\n return lines.join(\"\\n\");\n }).join(\"\\n\\n\");\n\n const flowLines = flows.length > 0\n ? \"\\n\\n### Connected Flows\\n\\n\" + flows.map((f) => `- ${f.name}: ${f.data?.description ?? \"\"}`).join(\"\\n\")\n : \"\";\n\n return {\n content: [{\n type: \"text\" as const,\n text: `# ${target.data?.icon ?? \"\"} ${target.name} Layer\\n\\n${target.data?.description ?? \"\"}${depRule}${layerRationale}\\n**${nodes.length} components**\\n\\n${nodeDetail}${flowLines}`,\n }],\n };\n }\n\n if (action === \"flow\") {\n if (!flow) return { content: [{ type: \"text\" as const, text: \"A `flow` name or entry ID is required.\" }] };\n\n const flows = byTag(all, \"flow\");\n const target = flows.find(\n (f) => f.name.toLowerCase() === flow.toLowerCase() || f.entryId === flow\n );\n\n if (!target) {\n const available = flows.map((f) => `\\`${f.name}\\``).join(\", \");\n return { content: [{ type: \"text\" as const, text: `Flow \"${flow}\" not found. Available flows: ${available}` }] };\n }\n\n const nodes = byTag(all, \"node\");\n const source = nodes.find((n) => n.entryId === target.data?.sourceNode);\n const dest = nodes.find((n) => n.entryId === target.data?.targetNode);\n\n const lines = [\n `# ${target.name}`,\n \"\",\n `**${source?.data?.icon ?? \"?\"} ${source?.name ?? \"Unknown\"}** → **${dest?.data?.icon ?? \"?\"} ${dest?.name ?? \"Unknown\"}**`,\n \"\",\n String(target.data?.description ?? \"\"),\n ];\n\n if (source) {\n lines.push(\"\", `### Source: ${source.name}`, String(source.data?.description ?? \"\"));\n if (source.data?.filePaths) lines.push(`Files: \\`${source.data.filePaths}\\``);\n }\n if (dest) {\n lines.push(\"\", `### Target: ${dest.name}`, String(dest.data?.description ?? \"\"));\n if (dest.data?.filePaths) lines.push(`Files: \\`${dest.data.filePaths}\\``);\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n\n return { content: [{ type: \"text\" as const, text: \"Unknown action.\" }] };\n }\n );\n\n // ─── architecture-admin: seed and health check ──────────────────────\n\n const archAdminTool = server.registerTool(\n \"architecture-admin\",\n {\n title: \"Architecture Admin\",\n description:\n \"Architecture maintenance — seed the default architecture data or run a dependency health check.\\n\\n\" +\n \"Actions:\\n\" +\n \"- `seed`: Populate the architecture collection with the default Product OS map. Safe to re-run.\\n\" +\n \"- `check`: Scan the codebase for dependency direction violations against layer rules.\",\n inputSchema: architectureAdminSchema,\n annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: false },\n },\n async ({ action }) => {\n if (action === \"seed\") {\n await ensureCollection();\n const existing = await listArchEntries();\n const existingIds = new Set(existing.map((e) => e.entryId));\n\n let created = 0;\n let updated = 0;\n let unchanged = 0;\n\n const allSeeds = [\n { ...SEED_TEMPLATE, order: 0, status: \"active\" },\n ...SEED_LAYERS.map((l) => ({ ...l, status: \"active\" as const })),\n ...SEED_NODES.map((n) => ({ ...n, status: \"active\" as const })),\n ...SEED_FLOWS.map((f) => ({ ...f, status: \"active\" as const })),\n ];\n\n for (const seed of allSeeds) {\n if (existingIds.has(seed.entryId)) {\n const existingEntry = existing.find((e) => e.entryId === seed.entryId);\n const existingData = (existingEntry?.data ?? {}) as Record<string, unknown>;\n const seedData = seed.data as Record<string, unknown>;\n const hasChanges = Object.keys(seedData).some(\n (k) => seedData[k] !== undefined && existingData[k] !== seedData[k],\n );\n if (hasChanges) {\n const mergedData = { ...existingData, ...seedData };\n await mcpMutation(\"chain.updateEntry\", { entryId: seed.entryId, data: mergedData });\n updated++;\n } else {\n unchanged++;\n }\n continue;\n }\n await mcpMutation(\"chain.createEntry\", {\n collectionSlug: COLLECTION_SLUG,\n entryId: seed.entryId,\n name: seed.name,\n status: seed.status,\n data: seed.data,\n order: seed.order ?? 0,\n });\n created++;\n }\n\n return {\n content: [{\n type: \"text\" as const,\n text: `# Architecture Seeded\\n\\n**Created:** ${created} entries\\n**Updated:** ${updated} (merged new fields)\\n**Unchanged:** ${unchanged}\\n\\nUse \\`architecture action=show\\` to view the map.`,\n }],\n };\n }\n\n if (action === \"check\") {\n const projectRoot = resolveProjectRoot();\n if (!projectRoot) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"# Scan Failed\\n\\nCannot find project root (looked for `convex/schema.ts` in cwd and parent). \" +\n \"Set `WORKSPACE_PATH` env var to the absolute path of the Product OS project root.\",\n }],\n };\n }\n\n await ensureCollection();\n const all = await listArchEntries();\n const layers = byTag(all, \"layer\");\n const nodes = byTag(all, \"node\");\n\n const result = scanDependencies(projectRoot, layers, nodes);\n\n return { content: [{ type: \"text\" as const, text: formatScanReport(result) }] };\n }\n\n return { content: [{ type: \"text\" as const, text: \"Unknown action.\" }] };\n }\n );\n trackWriteTool(archAdminTool);\n}\n\n// ── Scanner Engine — FEAT-dep-health, enforces SOS-dbl1n9 (dependency direction) ──\n\ninterface Violation {\n sourceNode: string;\n sourceLayer: string;\n sourceFile: string;\n importPath: string;\n targetNode: string;\n targetLayer: string;\n rule: string;\n}\n\ninterface ScanResult {\n violations: Violation[];\n filesScanned: number;\n importsChecked: number;\n unmappedImports: number;\n nodeResults: Map<string, { violations: Violation[]; filesScanned: number }>;\n}\n\nfunction resolveProjectRoot(): string | null {\n const candidates = [\n process.env.WORKSPACE_PATH,\n process.cwd(),\n resolve(process.cwd(), \"..\"),\n ].filter(Boolean) as string[];\n\n for (const dir of candidates) {\n const resolved = resolve(dir);\n if (existsSync(resolve(resolved, \"convex/schema.ts\"))) return resolved;\n }\n return null;\n}\n\nfunction scanDependencies(\n projectRoot: string,\n layers: ArchEntry[],\n nodes: ArchEntry[],\n): ScanResult {\n const layerMap = new Map<string, ArchEntry>();\n for (const l of layers) layerMap.set(l.entryId, l);\n\n const allowedDeps = buildAllowedDeps(layers);\n const nodePathPrefixes = buildNodePrefixes(nodes);\n\n const violations: Violation[] = [];\n const nodeResults = new Map<string, { violations: Violation[]; filesScanned: number }>();\n let totalFiles = 0;\n let totalImports = 0;\n let unmapped = 0;\n\n for (const node of nodes) {\n const layerRef = String(node.data?.layerRef ?? \"\");\n const layer = layerMap.get(layerRef);\n if (!layer) continue;\n\n const filePaths = parseFilePaths(node);\n const nodeViolations: Violation[] = [];\n let nodeFileCount = 0;\n\n for (const fp of filePaths) {\n const absPath = resolve(projectRoot, fp);\n const files = collectFiles(absPath);\n\n for (const file of files) {\n nodeFileCount++;\n totalFiles++;\n const relFile = relative(projectRoot, file);\n const imports = parseImports(file);\n\n for (const imp of imports) {\n totalImports++;\n const resolved = resolveImport(imp, file, projectRoot);\n if (!resolved) { unmapped++; continue; }\n\n const targetNode = findNodeByPath(resolved, nodePathPrefixes);\n if (!targetNode) { unmapped++; continue; }\n\n const targetLayerRef = String(targetNode.data?.layerRef ?? \"\");\n const targetLayer = layerMap.get(targetLayerRef);\n if (!targetLayer) continue;\n\n if (targetLayerRef === layerRef) continue;\n\n const allowed = allowedDeps.get(layerRef);\n if (allowed && !allowed.has(targetLayerRef)) {\n const v: Violation = {\n sourceNode: node.name,\n sourceLayer: layer.name,\n sourceFile: relFile,\n importPath: imp,\n targetNode: targetNode.name,\n targetLayer: targetLayer.name,\n rule: `${layer.name} cannot import from ${targetLayer.name}`,\n };\n violations.push(v);\n nodeViolations.push(v);\n }\n }\n }\n }\n\n nodeResults.set(node.entryId, { violations: nodeViolations, filesScanned: nodeFileCount });\n }\n\n return { violations, filesScanned: totalFiles, importsChecked: totalImports, unmappedImports: unmapped, nodeResults };\n}\n\nfunction buildAllowedDeps(layers: ArchEntry[]): Map<string, Set<string>> {\n const nameToId = new Map<string, string>();\n for (const l of layers) nameToId.set(l.name.toLowerCase(), l.entryId);\n\n const allowed = new Map<string, Set<string>>();\n for (const layer of layers) {\n const deps = String(layer.data?.dependsOn ?? \"none\");\n const set = new Set<string>();\n if (deps !== \"none\") {\n for (const dep of deps.split(\",\").map((d) => d.trim().toLowerCase())) {\n const id = nameToId.get(dep);\n if (id) set.add(id);\n }\n }\n allowed.set(layer.entryId, set);\n }\n return allowed;\n}\n\nfunction buildNodePrefixes(nodes: ArchEntry[]): { prefix: string; node: ArchEntry }[] {\n const entries: { prefix: string; node: ArchEntry }[] = [];\n for (const node of nodes) {\n for (const fp of parseFilePaths(node)) {\n entries.push({ prefix: normalize(fp), node });\n }\n }\n entries.sort((a, b) => b.prefix.length - a.prefix.length);\n return entries;\n}\n\nfunction parseFilePaths(node: ArchEntry): string[] {\n const raw = node.data?.filePaths;\n if (!raw || typeof raw !== \"string\") return [];\n return raw.split(\",\").map((p) => p.trim()).filter(Boolean);\n}\n\nfunction collectFiles(absPath: string): string[] {\n if (!existsSync(absPath)) return [];\n const stat = statSync(absPath);\n if (stat.isFile()) {\n return isScannableFile(absPath) ? [absPath] : [];\n }\n if (!stat.isDirectory()) return [];\n\n const results: string[] = [];\n const walk = (dir: string) => {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n const full = resolve(dir, entry.name);\n if (entry.isDirectory()) walk(full);\n else if (isScannableFile(full)) results.push(full);\n }\n };\n walk(absPath);\n return results;\n}\n\nfunction isScannableFile(p: string): boolean {\n return /\\.(ts|js|svelte)$/.test(p) && !p.endsWith(\".d.ts\");\n}\n\nfunction parseImports(filePath: string): string[] {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const re = /(?:^|\\n)\\s*import\\s+(?:[\\s\\S]*?\\s+from\\s+)?['\"]([^'\"]+)['\"]/g;\n const imports: string[] = [];\n let match: RegExpExecArray | null;\n while ((match = re.exec(content)) !== null) {\n imports.push(match[1]);\n }\n return imports;\n } catch {\n return [];\n }\n}\n\nconst EXTENSIONS = [\".ts\", \".js\", \".svelte\", \"/index.ts\", \"/index.js\", \"/index.svelte\"];\n\nfunction tryResolveWithExtension(absPath: string): string | null {\n if (existsSync(absPath) && statSync(absPath).isFile()) return absPath;\n for (const ext of EXTENSIONS) {\n const withExt = absPath + ext;\n if (existsSync(withExt)) return withExt;\n }\n return null;\n}\n\nfunction resolveImport(imp: string, fromFile: string, root: string): string | null {\n let rel: string | null = null;\n if (imp.startsWith(\"$lib/\")) rel = imp.replace(\"$lib/\", \"src/lib/\");\n else if (imp.startsWith(\"$convex/\")) rel = imp.replace(\"$convex/\", \"convex/\");\n else if (imp.startsWith(\"$env/\") || imp.startsWith(\"$app/\")) return null;\n else if (imp.startsWith(\"./\") || imp.startsWith(\"../\")) {\n const fromDir = dirname(fromFile);\n const abs = resolve(fromDir, imp);\n rel = relative(root, abs);\n }\n if (!rel) return null;\n\n const abs = resolve(root, rel);\n const actual = tryResolveWithExtension(abs);\n return actual ? relative(root, actual) : rel;\n}\n\nfunction findNodeByPath(\n filePath: string,\n prefixes: { prefix: string; node: ArchEntry }[],\n): ArchEntry | null {\n const normalized = normalize(filePath);\n for (const { prefix, node } of prefixes) {\n if (normalized.startsWith(prefix)) return node;\n }\n return null;\n}\n\nfunction formatScanReport(result: ScanResult): string {\n const lines: string[] = [];\n\n if (result.violations.length === 0) {\n lines.push(\n `# Architecture Health Check Passed`,\n \"\",\n `**0 violations** across ${result.filesScanned} files (${result.importsChecked} imports checked, ${result.unmappedImports} unmapped).`,\n \"\",\n \"All imports respect the layer dependency rules.\",\n );\n } else {\n lines.push(\n `# Architecture Health Check — ${result.violations.length} Violation${result.violations.length === 1 ? \"\" : \"s\"}`,\n \"\",\n `Scanned ${result.filesScanned} files, checked ${result.importsChecked} imports, found **${result.violations.length} violation${result.violations.length === 1 ? \"\" : \"s\"}** (${result.unmappedImports} unmapped).`,\n \"\",\n );\n\n const byNode = new Map<string, Violation[]>();\n for (const v of result.violations) {\n if (!byNode.has(v.sourceNode)) byNode.set(v.sourceNode, []);\n byNode.get(v.sourceNode)!.push(v);\n }\n\n for (const [nodeName, vs] of byNode) {\n lines.push(`## ${nodeName} (${vs[0].sourceLayer})`);\n for (const v of vs) {\n lines.push(`- \\`${v.sourceFile}\\` imports \\`${v.importPath}\\` → **${v.targetNode}** (${v.targetLayer}) — ${v.rule}`);\n }\n lines.push(\"\");\n }\n }\n\n lines.push(\"---\", \"\");\n\n const nodeEntries = [...result.nodeResults.entries()];\n const cleanCount = nodeEntries.filter(([, r]) => r.violations.length === 0 && r.filesScanned > 0).length;\n const dirtyCount = nodeEntries.filter(([, r]) => r.violations.length > 0).length;\n const emptyCount = nodeEntries.filter(([, r]) => r.filesScanned === 0).length;\n\n lines.push(\n `**Summary:** ${cleanCount} clean nodes, ${dirtyCount} with violations, ${emptyCount} with no files.`,\n );\n\n return lines.join(\"\\n\");\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { mcpQuery } from \"../client.js\";\n\n/** MCP App View HTML bundles — served so Cursor/Claude can render tool UIs */\nconst UI_VIEWS: Record<string, string> = {\n \"ui://entries/entry-cards.html\": \"src/entry-cards/index.html\",\n \"ui://graph/constellation.html\": \"src/graph-constellation/index.html\",\n};\n\n// ─── Response Types ──────────────────────────────────────────────────\n\ninterface EntryListItem {\n _id: string;\n entryId?: string;\n name: string;\n status: string;\n collectionName?: string;\n collectionSlug?: string;\n data?: Record<string, unknown>;\n}\n\ninterface EntryRelation {\n type: string;\n direction: \"outgoing\" | \"incoming\";\n otherEntryId: string | null;\n otherName: string | null;\n}\n\ninterface EntryDetail extends EntryListItem {\n relations?: EntryRelation[];\n labels?: Array<{ name: string; slug: string; color?: string }>;\n history?: Array<{ action: string; timestamp: number; actor?: string }>;\n}\n\ninterface Collection {\n _id: string;\n name: string;\n slug: string;\n description?: string;\n icon?: string;\n fields: Array<{ key: string; type: string; required?: boolean; searchable?: boolean }>;\n}\n\ninterface LabelRecord {\n _id: string;\n name: string;\n slug: string;\n color?: string;\n isGroup?: boolean;\n parentId?: string;\n}\n\ninterface ContextResult {\n root: { entryId: string; name: string } | null;\n related?: Array<{\n entryId?: string;\n name: string;\n collectionName: string;\n relationType: string;\n relationDirection: string;\n hop: number;\n }>;\n totalRelations: number;\n hopsTraversed: number;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────\n\nfunction formatEntryMarkdown(entry: EntryListItem): string {\n const id = entry.entryId ? `${entry.entryId}: ` : \"\";\n const lines = [`## ${id}${entry.name} [${entry.status}]`];\n if (entry.data && typeof entry.data === \"object\") {\n for (const [key, val] of Object.entries(entry.data)) {\n if (val && key !== \"rawData\") {\n lines.push(`**${key}**: ${typeof val === \"string\" ? val : JSON.stringify(val)}`);\n }\n }\n }\n return lines.join(\"\\n\");\n}\n\nfunction buildOrientationMarkdown(\n collections: Collection[] | null,\n trackingEvents: EntryListItem[] | null,\n standards: EntryListItem[] | null,\n businessRules: EntryListItem[] | null,\n principles: EntryListItem[] | null,\n): string {\n const sections: string[] = [\"# Product Brain — Orientation\"];\n\n // About Product Brain (the tool)\n sections.push(\n \"## About Product Brain (PB)\\n\" +\n \"PB is a knowledge management system used by many product teams. \" +\n \"This section describes how PB works — not your product.\\n\\n\" +\n \"### How PB Organizes Its Tools\\n\" +\n \"- **Tools** = actions with side-effects or dynamic computation (capture, commit, search).\\n\" +\n \"- **Resources** = stable, read-only data (orientation, terminology, collection schemas).\\n\" +\n \"- **Prompts** = multi-step choreography (workflows, guided capture, deep dives).\\n\" +\n \"- Every tool, resource, and prompt works for ANY workspace — no bespoke logic.\\n\" +\n \"- Resource templates (URI params) serve workspace-specific data through generic patterns.\\n\" +\n \"- Compound tools with `action` enums keep the tool count minimal.\\n\\n\" +\n \"### How PB Handles Your Data\\n\" +\n \"- **Draft-first**: all writes create drafts. SSOT requires explicit user confirmation.\\n\" +\n \"- **Empty-workspace safe**: every operation handles zero entries and fresh workspaces.\\n\" +\n \"- **Advisory, not blocking**: quality scores, contradiction checks, and coaching never prevent operations.\\n\" +\n \"- **Workspace-agnostic**: PB is a product for many teams — no workspace-specific logic.\\n\" +\n \"- **Self-documenting**: orient and server instructions teach agents how PB works.\",\n );\n\n // Workspace principles, standards, and rules from the Chain\n const wsRules: Array<{ id: string; name: string; severity?: string; source: string }> = [];\n\n for (const p of (principles ?? []).filter((e) => e.status === \"active\" || e.status === \"verified\")) {\n wsRules.push({ id: p.entryId ?? \"\", name: p.name, severity: (p.data?.severity as string) ?? undefined, source: \"principles\" });\n }\n for (const s of (standards ?? []).filter((e) => e.status === \"active\" || e.status === \"verified\")) {\n wsRules.push({ id: s.entryId ?? \"\", name: s.name, severity: (s.data?.severity as string) ?? undefined, source: \"standards\" });\n }\n for (const r of (businessRules ?? []).filter((e) => e.status === \"active\" || e.status === \"verified\")) {\n wsRules.push({ id: r.entryId ?? \"\", name: r.name, severity: (r.data?.severity as string) ?? undefined, source: \"business-rules\" });\n }\n\n if (wsRules.length > 0) {\n const ruleLines = wsRules\n .map((r) => {\n const sev = r.severity ? ` [${r.severity}]` : \"\";\n return `- **${r.id}**: ${r.name}${sev}`;\n })\n .join(\"\\n\");\n sections.push(\n `## Your Workspace Principles & Rules (${wsRules.length} active)\\n` +\n \"These are principles, standards, and rules your team has committed to the Chain. \" +\n \"Respect them during implementation.\\n\\n\" +\n ruleLines + \"\\n\\n\" +\n 'Use `entries action=get entryId=\"<ID>\"` to drill into any rule before making changes in that area.',\n );\n } else {\n sections.push(\n \"## Your Workspace Principles & Rules\\n\" +\n \"No active principles, standards, or business rules on the Chain yet.\\n\" +\n \"Use `capture` with collection `principles`, `standards`, or `business-rules` to add your team's guardrails.\\n\" +\n \"Once committed, they appear here at orient time — so every agent session starts with your rules visible.\",\n );\n }\n\n // Core Product Architecture (the three primitives)\n sections.push(\n \"## Core Product Architecture\\n\" +\n \"The Chain is a versioned, connected, compounding knowledge base — the SSOT for a product team.\\n\" +\n \"Everything on the Chain is one of **three primitives**:\\n\\n\" +\n \"- **Entry** (atom) — a discrete knowledge unit: target audience, business rule, glossary term, metric, tension. Lives in a collection.\\n\" +\n \"- **Process** (authored) — a narrative chain with named links (Strategy Coherence, IDM Proposal). Content is inline text. Collection: `chains`.\\n\" +\n \"- **Map** (composed) — a framework assembled by reference (Lean Canvas, Empathy Map). Slots point to ingredient entries. Collection: `maps`.\\n\\n\" +\n \"Entries are atoms. Processes author narrative from atoms. Maps compose frameworks from atoms.\\n\" +\n \"All three share the same versioning, branching, gating, and relation system.\\n\\n\" +\n \"The Chain compounds: each new relation makes entries discoverable from more starting points → \" +\n \"context gathering returns richer results → AI processes have more context → quality scores improve → \" +\n \"next commit is smarter than the last.\",\n );\n\n // Architecture\n sections.push(\n \"## Architecture\\n\" +\n \"```\\n\" +\n \"Cursor (stdio) → MCP Server (mcp-server/src/index.ts)\\n\" +\n \" → POST /api/mcp with Bearer token\\n\" +\n \" → Convex HTTP Action (convex/http.ts)\\n\" +\n \" → internalQuery / internalMutation (convex/mcpKnowledge.ts)\\n\" +\n \" → Convex DB (workspace-scoped)\\n\" +\n \"```\\n\" +\n \"Security: API key auth on every request, workspace-scoped data, internal functions blocked from external clients.\\n\" +\n \"Key files: `packages/mcp-server/src/client.ts` (HTTP client + audit), `convex/schema.ts` (schema).\",\n );\n\n // Data model\n if (collections) {\n const collList = collections\n .map((c) => {\n const prefix = c.icon ? `${c.icon} ` : \"\";\n return `- ${prefix}**${c.name}** (\\`${c.slug}\\`) — ${c.description || \"no description\"}`;\n })\n .join(\"\\n\");\n sections.push(\n `## Data Model (${collections.length} collections)\\n` +\n \"Unified entries model: collections define field schemas, entries hold data in a flexible `data` field.\\n\" +\n \"The `data` field is polymorphic: plain fields for generic entries, `ChainData` (chainTypeId + links) for processes, `MapData` (templateId + slots) for maps.\\n\" +\n \"Tags for filtering (e.g. `severity:high`), relations via `entryRelations`, versions via `entryVersions`, labels via `labels` + `entryLabels`.\\n\\n\" +\n collList + \"\\n\\n\" +\n \"Use `collections action=list` for field schemas, `entries action=get` for full records.\",\n );\n } else {\n sections.push(\n \"## Data Model\\n\" +\n \"Could not load collections — use `collections action=list` to browse manually.\",\n );\n }\n\n // Business rules\n const rulesCount = businessRules ? `${businessRules.length} entries` : \"not loaded — collection may not exist yet\";\n sections.push(\n \"## Business Rules\\n\" +\n `Collection: \\`business-rules\\` (${rulesCount}).\\n` +\n \"Find rules: `entries action=search` for text search, `entries action=list collection=business-rules` to browse.\\n\" +\n \"Check compliance: use the `review-against-rules` prompt (pass a domain).\\n\" +\n \"Draft a new rule: use the `draft-rule-from-context` prompt.\",\n );\n\n // Analytics / tracking\n const eventsCount = trackingEvents ? `${trackingEvents.length} events` : \"not loaded — collection may not exist yet\";\n const conventionNote = standards\n ? \"Naming convention: `object_action` in snake_case with past-tense verbs (from standards collection).\"\n : \"Naming convention: `object_action` in snake_case with past-tense verbs.\";\n sections.push(\n \"## Analytics & Tracking\\n\" +\n `Event catalog: \\`tracking-events\\` collection (${eventsCount}).\\n` +\n `${conventionNote}\\n` +\n \"Implementation: `src/lib/analytics.ts`. Workspace-scoped events MUST use `withWorkspaceGroup()`.\\n\" +\n \"Browse: `entries action=list collection=tracking-events`.\",\n );\n\n // Knowledge Graph\n sections.push(\n \"## Knowledge Graph\\n\" +\n \"Entries are connected via typed relations (`entryRelations` table). Relations are bidirectional and collection-agnostic — any entry can link to any other entry.\\n\\n\" +\n \"**Recommended relation types** (extensible — any string accepted):\\n\" +\n \"- `governs` — a rule constrains behavior of a feature\\n\" +\n \"- `defines_term_for` — a glossary term is canonical vocabulary for a feature/area\\n\" +\n \"- `belongs_to` — a feature belongs to a product area or parent concept\\n\" +\n \"- `informs` — a decision or insight informs a feature\\n\" +\n \"- `fills_slot` — an ingredient entry fills a slot in a map\\n\" +\n \"- `surfaces_tension_in` — a tension exists within a feature area\\n\" +\n \"- `related_to`, `depends_on`, `replaces`, `conflicts_with`, `references`, `confused_with`\\n\\n\" +\n \"Each relation type is defined as a glossary entry (prefix `GT-REL-*`) to prevent terminology drift.\\n\\n\" +\n \"**Tools:**\\n\" +\n \"- `context action=gather` — get the full context around any entry (multi-hop graph traversal)\\n\" +\n \"- `graph action=suggest` — discover potential connections for an entry\\n\" +\n \"- `relations action=create` — create a typed link between two entries\\n\" +\n \"- `graph action=find` — list direct relations for an entry\\n\\n\" +\n \"**Convention:** When creating or updating entries in governed collections, always use `graph action=suggest` to discover and create relevant relations.\",\n );\n\n // Creating Knowledge\n sections.push(\n \"## Creating Knowledge\\n\" +\n \"**Entries:** Use `capture` as the primary tool for creating new entries. It handles the full workflow in one call:\\n\" +\n \"1. Creates the entry with collection-aware defaults (auto-fills dates, infers domains, sets priority)\\n\" +\n \"2. Auto-links related entries from across the chain (up to 5 confident matches)\\n\" +\n \"3. Returns a quality scorecard (X/10) with actionable improvement suggestions\\n\\n\" +\n \"**Smart profiles** exist for: `tensions`, `business-rules`, `glossary`, `decisions`, `features`, `audiences`, `strategy`, `standards`, `maps`, `chains`, `tracking-events`.\\n\" +\n \"All other collections use the `ENT-{random}` fallback profile.\\n\\n\" +\n \"**Processes:** Use `chain action=create` with a template (e.g., `strategy-coherence`, `idm-proposal`). Fill links with `chain action=edit`.\\n\\n\" +\n \"**Maps:** Use `map action=create` with a template (e.g., `lean-canvas`). Fill slots with `map-slot action=add`. Commit with `map-version action=commit`.\\n\" +\n \"Note: committing a map version creates a snapshot but does NOT change the entry status. To activate: `update-entry entryId=MAP-xxx status=active autoPublish=true`.\\n\" +\n \"Use `map-suggest` to discover ingredients for empty slots.\\n\\n\" +\n \"**Prompts** (invoke via MCP prompt protocol):\\n\" +\n \"- `name-check` — verify a name against glossary conventions\\n\" +\n \"- `draft-decision-record` — scaffold a decision entry\\n\" +\n \"- `review-against-rules` — check work against business rules for a domain\\n\" +\n \"- `draft-rule-from-context` — create a new business rule from context\\n\" +\n \"- `run-workflow` — run a structured ceremony (e.g., retrospective)\\n\\n\" +\n \"Use `quality action=check` to score existing entries retroactively.\\n\" +\n \"Use `update-entry` for post-creation adjustments (status changes, field updates, deprecation).\",\n );\n\n // Where to go next\n sections.push(\n \"## Where to Go Next\\n\" +\n \"- **Create entry** → `capture` tool (auto-links + quality score in one call)\\n\" +\n \"- **Full context** → `context action=gather` (by entry ID or task description)\\n\" +\n \"- **Discover links** → `graph action=suggest`\\n\" +\n \"- **Quality audit** → `quality action=check`\\n\" +\n \"- **Terminology** → `name-check` prompt or `productbrain://terminology` resource\\n\" +\n \"- **Schema details** → `productbrain://collections` resource or `collections action=list`\\n\" +\n \"- **Labels** → `productbrain://labels` resource or `labels` tool\\n\" +\n \"- **Any collection** → `productbrain://{slug}/entries` resource\\n\" +\n \"- **Log a decision** → `draft-decision-record` prompt\\n\" +\n \"- **Build a map** → `map action=create` + `map-slot action=add` + `map-version action=commit`\\n\" +\n \"- **Architecture map** → `architecture action=show` tool (layered system visualization)\\n\" +\n \"- **Explore a layer** → `architecture action=explore` tool (drill into Auth, Core, Features, etc.)\\n\" +\n \"- **Growth funnel** → `productbrain://growth-funnel` resource or `entries action=list collection=strategy status=draft`\\n\" +\n \"- **Audiences** → `productbrain://audiences/entries` resource or `entries action=list collection=audiences`\\n\" +\n \"- **Session identity** → `health action=whoami`\\n\" +\n \"- **Health check** → `health action=check`\\n\" +\n \"- **Debug MCP calls** → `health action=audit`\",\n );\n\n return sections.join(\"\\n\\n---\\n\\n\");\n}\n\nconst AGENT_CHEATSHEET = `# Product Brain — Agent Cheatsheet\n\n## Core Tools\n| Tool | Purpose | Key params |\n|---|---|---|\n| \\`orient\\` | Workspace context, governance, active bets | — (call at session start) |\n| \\`capture\\` | Create entry (draft) | \\`collection\\`, \\`name\\`, \\`description\\`, optional \\`data\\` |\n| \\`entries\\` | List / get / batch / search entries | \\`action\\` + \\`entryId\\` / \\`query\\` / \\`collection\\` |\n| \\`update-entry\\` | Update fields on an entry | \\`entryId\\`, optional \\`name\\`, \\`status\\`, \\`workflowStatus\\`, \\`data\\`, \\`changeNote\\` |\n| \\`commit-entry\\` | Promote draft → SSOT | \\`entryId\\` |\n| \\`graph\\` | Suggest / find relations | \\`action\\` + \\`entryId\\` |\n| \\`relations\\` | Create / batch-create / delete links | \\`from\\`, \\`to\\`, \\`type\\` |\n| \\`context\\` | Gather related knowledge | \\`entryId\\` or \\`task\\` |\n| \\`collections\\` | List / create / update collections | \\`action\\` |\n| \\`labels\\` | List / create / apply / remove labels | \\`action\\` |\n| \\`quality\\` | Score an entry | \\`entryId\\` |\n| \\`session\\` | Start / close agent session | \\`action\\` |\n| \\`health\\` | Check / audit / whoami | \\`action\\` |\n| \\`facilitate\\` | Shaping workflows | \\`action\\`: start, respond, status |\n\n## Collection Prefixes\nGLO (glossary), BR (business-rules), PRI (principles), STD (standards),\nDEC (decisions), STR (strategy), TEN (tensions), FEAT (features),\nBET (bets), INS (insights), ARCH (architecture), CIR (circles),\nROL (roles), MAP (maps), MTRC (tracking-events), ST (semantic-types)\n\n## Valid Relation Types (21)\ninforms, governs, surfaces_tension_in, defines_term_for, belongs_to,\nreferences, related_to, fills_slot, commits_to, informed_by, depends_on,\nconflicts_with, confused_with, replaces, part_of, constrains,\ngoverned_by, alternative_to, has_proposal, requests_promotion_of, resolves\n\n## Lifecycle Status\nAll entries: \\`draft\\` | \\`active\\` | \\`deprecated\\` | \\`archived\\`\n\n## Workflow Status (per collection)\n- **tensions:** open → processing → decided → closed\n- **decisions:** pending → decided\n- **bets:** shaped → bet → building → shipped\n- **business-rules:** active | conflict | review\n\n## Key Patterns\n- **Capture flow:** \\`capture\\` → \\`graph action=suggest\\` → \\`relations action=batch-create\\` → \\`commit-entry\\`\n- Use \\`workflowStatus\\` (not \\`status\\`) for domain workflow state\n- \\`data\\` param is merged (not replaced) — safe for partial updates\n`;\n\nexport function registerResources(server: McpServer) {\n // Agent cheatsheet: compact tool/schema reference (~500 tokens)\n server.resource(\n \"agent-cheatsheet\",\n \"productbrain://agent-cheatsheet\",\n async (uri) => ({\n contents: [{\n uri: uri.href,\n text: AGENT_CHEATSHEET,\n mimeType: \"text/markdown\",\n }],\n })\n );\n\n // Orientation: single-call system map for AI developers\n server.resource(\n \"chain-orientation\",\n \"productbrain://orientation\",\n async (uri) => {\n const [collectionsResult, eventsResult, standardsResult, rulesResult, principlesResult] = await Promise.allSettled([\n mcpQuery<Collection[]>(\"chain.listCollections\"),\n mcpQuery<EntryListItem[]>(\"chain.listEntries\", { collectionSlug: \"tracking-events\" }),\n mcpQuery<EntryListItem[]>(\"chain.listEntries\", { collectionSlug: \"standards\" }),\n mcpQuery<EntryListItem[]>(\"chain.listEntries\", { collectionSlug: \"business-rules\" }),\n mcpQuery<EntryListItem[]>(\"chain.listEntries\", { collectionSlug: \"principles\" }),\n ]);\n\n const collections = collectionsResult.status === \"fulfilled\" ? collectionsResult.value : null;\n const trackingEvents = eventsResult.status === \"fulfilled\" ? eventsResult.value : null;\n const standards = standardsResult.status === \"fulfilled\" ? standardsResult.value : null;\n const businessRules = rulesResult.status === \"fulfilled\" ? rulesResult.value : null;\n const principles = principlesResult.status === \"fulfilled\" ? principlesResult.value : null;\n\n return {\n contents: [{\n uri: uri.href,\n text: buildOrientationMarkdown(collections, trackingEvents, standards, businessRules, principles),\n mimeType: \"text/markdown\",\n }],\n };\n }\n );\n\n // Terminology: glossary + standards summary for deep-dives\n server.resource(\n \"chain-terminology\",\n \"productbrain://terminology\",\n async (uri) => {\n const [glossaryResult, standardsResult] = await Promise.allSettled([\n mcpQuery<EntryListItem[]>(\"chain.listEntries\", { collectionSlug: \"glossary\" }),\n mcpQuery<EntryListItem[]>(\"chain.listEntries\", { collectionSlug: \"standards\" }),\n ]);\n\n const lines: string[] = [\"# Product Brain — Terminology\"];\n\n if (glossaryResult.status === \"fulfilled\") {\n const glossary = glossaryResult.value ?? [];\n if (glossary.length > 0) {\n const terms = glossary\n .map((t) => `- **${t.name}** (${t.entryId ?? \"—\"}) [${t.status}]: ${t.data?.canonical ?? t.data?.description ?? \"\"}`)\n .join(\"\\n\");\n lines.push(`## Glossary (${glossary.length} terms)\\n\\n${terms}`);\n } else {\n lines.push(\"## Glossary\\n\\nNo glossary terms yet. Use `capture` with collection `glossary` to add terms.\");\n }\n } else {\n lines.push(\"## Glossary\\n\\nCould not load glossary — use `entries action=list collection=glossary` to browse manually.\");\n }\n\n if (standardsResult.status === \"fulfilled\") {\n const standards = standardsResult.value ?? [];\n if (standards.length > 0) {\n const stds = standards\n .map((s) => `- **${s.name}** (${s.entryId ?? \"—\"}) [${s.status}]: ${s.data?.description ?? \"\"}`)\n .join(\"\\n\");\n lines.push(`## Standards (${standards.length} entries)\\n\\n${stds}`);\n } else {\n lines.push(\"## Standards\\n\\nNo standards yet. Use `capture` with collection `standards` to add standards.\");\n }\n } else {\n lines.push(\"## Standards\\n\\nCould not load standards — use `entries action=list collection=standards` to browse manually.\");\n }\n\n return {\n contents: [{ uri: uri.href, text: lines.join(\"\\n\\n---\\n\\n\"), mimeType: \"text/markdown\" }],\n };\n }\n );\n\n server.resource(\n \"chain-collections\",\n \"productbrain://collections\",\n async (uri) => {\n const collections = (await mcpQuery<Collection[]>(\"chain.listCollections\")) ?? [];\n\n if (collections.length === 0) {\n return { contents: [{ uri: uri.href, text: \"No collections in this workspace. Use `collections action=create` or `start` with a preset to get started.\", mimeType: \"text/markdown\" }] };\n }\n\n const formatted = collections\n .map((c) => {\n const fieldList = (c.fields ?? [])\n .map((f) => ` - \\`${f.key}\\` (${f.type}${f.required ? \", required\" : \"\"}${f.searchable ? \", searchable\" : \"\"})`)\n .join(\"\\n\");\n return `## ${c.icon ?? \"\"} ${c.name} (\\`${c.slug}\\`)\\n${c.description || \"\"}\\n\\n**Fields:**\\n${fieldList}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\n return {\n contents: [{ uri: uri.href, text: `# Knowledge Collections (${collections.length})\\n\\n${formatted}`, mimeType: \"text/markdown\" }],\n };\n }\n );\n\n server.resource(\n \"chain-collection-entries\",\n new ResourceTemplate(\"productbrain://{slug}/entries\", {\n list: async () => {\n const collections = (await mcpQuery<Collection[]>(\"chain.listCollections\")) ?? [];\n return {\n resources: collections.map((c) => ({\n uri: `productbrain://${c.slug}/entries`,\n name: `${c.icon ?? \"\"} ${c.name}`.trim(),\n })),\n };\n },\n }),\n async (uri, { slug }) => {\n const entries = (await mcpQuery<EntryListItem[]>(\"chain.listEntries\", { collectionSlug: slug as string })) ?? [];\n const formatted = entries.map(formatEntryMarkdown).join(\"\\n\\n---\\n\\n\");\n\n return {\n contents: [{\n uri: uri.href,\n text: formatted || \"No entries in this collection.\",\n mimeType: \"text/markdown\",\n }],\n };\n }\n );\n\n server.resource(\n \"chain-labels\",\n \"productbrain://labels\",\n async (uri) => {\n const labels = (await mcpQuery<LabelRecord[]>(\"chain.listLabels\")) ?? [];\n\n if (labels.length === 0) {\n return { contents: [{ uri: uri.href, text: \"No labels in this workspace.\", mimeType: \"text/markdown\" }] };\n }\n\n const groups = labels.filter((l) => l.isGroup);\n const ungrouped = labels.filter((l) => !l.isGroup && !l.parentId);\n const children = (parentId: string) => labels.filter((l) => l.parentId === parentId);\n\n const lines: string[] = [];\n for (const group of groups) {\n lines.push(`## ${group.name}`);\n for (const child of children(group._id)) {\n lines.push(`- \\`${child.slug}\\` ${child.name}${child.color ? ` (${child.color})` : \"\"}`);\n }\n }\n if (ungrouped.length > 0) {\n lines.push(\"## Ungrouped\");\n for (const l of ungrouped) {\n lines.push(`- \\`${l.slug}\\` ${l.name}${l.color ? ` (${l.color})` : \"\"}`);\n }\n }\n\n return {\n contents: [{ uri: uri.href, text: `# Workspace Labels (${labels.length})\\n\\n${lines.join(\"\\n\")}`, mimeType: \"text/markdown\" }],\n };\n }\n );\n\n server.resource(\n \"chain-entry\",\n new ResourceTemplate(\"productbrain://entries/{entryId}\", {\n complete: {\n entryId: async (value) => {\n if (!value || value.length < 1) return [];\n const entries = (await mcpQuery<EntryListItem[]>(\"chain.searchEntries\", { query: value })) ?? [];\n return entries.slice(0, 10).map((e) => e.entryId ?? e._id);\n },\n },\n }),\n async (uri, { entryId }) => {\n const [entry, collections] = await Promise.all([\n mcpQuery<EntryDetail | null>(\"chain.getEntry\", { entryId: entryId as string }),\n mcpQuery<Collection[]>(\"chain.listCollections\"),\n ]);\n if (!entry) {\n return { contents: [{ uri: uri.href, text: `Entry \"${entryId}\" not found.`, mimeType: \"text/markdown\" }] };\n }\n\n const collectionMap = new Map((collections ?? []).map((c) => [c._id, c]));\n const col = collectionMap.get((entry as any).collectionId);\n const collLabel = col?.name ?? entry.collectionName ?? entry.collectionSlug ?? \"unknown\";\n\n const lines: string[] = [\n `# ${entry.entryId}: ${entry.name}`,\n `**Collection:** ${collLabel}`,\n `**Status:** ${entry.status}`,\n \"\",\n ];\n\n if (entry.data && typeof entry.data === \"object\") {\n lines.push(\"## Data\");\n for (const [key, val] of Object.entries(entry.data)) {\n if (val && key !== \"rawData\") {\n const str = typeof val === \"string\" ? val : JSON.stringify(val, null, 2);\n lines.push(`**${key}:** ${str}`);\n }\n }\n lines.push(\"\");\n }\n\n if (entry.relations && entry.relations.length > 0) {\n lines.push(\"## Relations\");\n for (const rel of entry.relations) {\n const arrow = rel.direction === \"outgoing\" ? \"→\" : \"←\";\n const id = rel.otherEntryId ?? \"\";\n const name = rel.otherName ?? \"(unknown)\";\n lines.push(`- ${arrow} **${rel.type}** ${id}: ${name}`);\n }\n lines.push(\"\");\n }\n\n if (entry.labels && entry.labels.length > 0) {\n lines.push(`## Labels\\n${entry.labels.map((l) => `- ${l.name ?? l.slug}`).join(\"\\n\")}`);\n }\n\n return {\n contents: [{ uri: uri.href, text: lines.join(\"\\n\"), mimeType: \"text/markdown\" }],\n };\n }\n );\n\n server.resource(\n \"chain-context\",\n new ResourceTemplate(\"productbrain://context/{entryId}\", {\n complete: {\n entryId: async (value) => {\n if (!value || value.length < 1) return [];\n const entries = (await mcpQuery<EntryListItem[]>(\"chain.searchEntries\", { query: value })) ?? [];\n return entries.slice(0, 10).map((e) => e.entryId ?? e._id);\n },\n },\n }),\n async (uri, { entryId }) => {\n const result = await mcpQuery<ContextResult>(\"chain.gatherContext\", {\n entryId: entryId as string,\n maxHops: 2,\n });\n\n if (!result?.root) {\n return { contents: [{ uri: uri.href, text: `Entry \"${entryId}\" not found.`, mimeType: \"text/markdown\" }] };\n }\n\n const lines: string[] = [\n `# Context: ${result.root.entryId}: ${result.root.name}`,\n `_${result.totalRelations} related entries (${result.hopsTraversed} hops)_`,\n \"\",\n ];\n\n const byCollection = new Map<string, NonNullable<ContextResult[\"related\"]>>();\n for (const entry of result.related ?? []) {\n const key = entry.collectionName;\n if (!byCollection.has(key)) byCollection.set(key, []);\n byCollection.get(key)!.push(entry);\n }\n\n for (const [collName, entries] of byCollection) {\n lines.push(`## ${collName} (${entries.length})`);\n for (const e of entries) {\n const arrow = e.relationDirection === \"outgoing\" ? \"→\" : \"←\";\n const hopLabel = e.hop > 1 ? ` (hop ${e.hop})` : \"\";\n const id = e.entryId ? `${e.entryId}: ` : \"\";\n lines.push(`- ${arrow} **${e.relationType}** ${id}${e.name}${hopLabel}`);\n }\n lines.push(\"\");\n }\n\n return {\n contents: [{ uri: uri.href, text: lines.join(\"\\n\"), mimeType: \"text/markdown\" }],\n };\n }\n );\n\n server.resource(\n \"chain-search\",\n new ResourceTemplate(\"productbrain://search/{query}\", {\n complete: {\n query: async (value) => {\n if (!value) return [\"glossary:\", \"business-rules:\", \"decisions:\", \"tensions:\"];\n return [];\n },\n },\n }),\n async (uri, { query }) => {\n const results = await mcpQuery<EntryListItem[]>(\"chain.searchEntries\", { query: query as string });\n\n if (!results || results.length === 0) {\n return { contents: [{ uri: uri.href, text: `No results for \"${query}\".`, mimeType: \"text/markdown\" }] };\n }\n\n const lines: string[] = [\n `# Search: \"${query}\"`,\n `_${results.length} results_`,\n \"\",\n ];\n\n for (const entry of results) {\n const id = entry.entryId ? `**${entry.entryId}:** ` : \"\";\n const coll = entry.collectionName ?? entry.collectionSlug ?? \"\";\n lines.push(`- ${id}${entry.name} [${coll}] (${entry.status})`);\n }\n\n return {\n contents: [{ uri: uri.href, text: lines.join(\"\\n\"), mimeType: \"text/markdown\" }],\n };\n }\n );\n\n // MCP App Views — HTML bundles for Cursor/Claude tool UIs\n const viewsBase = resolve(process.cwd(), \"packages\", \"mcp-views\", \"dist\");\n for (const [uri, filePath] of Object.entries(UI_VIEWS)) {\n server.resource(`ui-view-${uri.replace(/[^a-z0-9]/gi, \"-\")}`, uri, async (uriObj) => {\n try {\n const html = await readFile(join(viewsBase, filePath), \"utf-8\");\n return { contents: [{ uri: uriObj.href, text: html, mimeType: \"text/html\" }] };\n } catch {\n return {\n contents: [{\n uri: uriObj.href,\n text: \"View not found. Run npm run build in packages/mcp-views.\",\n mimeType: \"text/plain\",\n }],\n };\n }\n });\n }\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery } from \"../client.js\";\nimport { getWorkflow, listWorkflows } from \"../workflows/definitions.js\";\nimport { interviewExtractionSchema, extractionToBatchEntries } from \"../tools/start-interview.js\";\n\nexport function registerPrompts(server: McpServer) {\n server.prompt(\n \"review-against-rules\",\n \"Review code or a design decision against all business rules for a given domain. Fetches the rules and asks you to do a structured compliance review.\",\n { domain: z.string().describe(\"Business rule domain (e.g. 'Identity & Access', 'Governance & Decision-Making')\") },\n async ({ domain }) => {\n const entries = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"business-rules\" });\n const rules = entries.filter((e) => e.data?.domain === domain);\n\n if (rules.length === 0) {\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `No business rules found for domain \"${domain}\". Use \\`entries action=list collection=business-rules\\` to see available domains.`,\n },\n },\n ],\n };\n }\n\n const rulesText = rules\n .map(\n (r) =>\n `### ${r.entryId ?? \"\"}: ${r.name}\\n` +\n `Status: ${r.status} | Severity: ${r.data?.severity ?? \"unknown\"}\\n` +\n `Description: ${r.data?.description ?? \"\"}\\n` +\n `Data Impact: ${r.data?.dataImpact ?? \"\"}\\n` +\n `Platforms: ${(r.data?.platforms ?? []).join(\", \")}\\n` +\n (r.data?.conflictWith ? `CONFLICT: ${r.data.conflictWith.rule} — ${r.data.conflictWith.nature}\\n` : \"\")\n )\n .join(\"\\n---\\n\\n\");\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `Review the current code or design against the following business rules for the \"${domain}\" domain.\\n\\n` +\n `For each rule, assess:\\n` +\n `1. Is the current implementation compliant?\\n` +\n `2. Are there potential violations or edge cases?\\n` +\n `3. What specific changes would be needed for compliance?\\n\\n` +\n `Business Rules:\\n\\n${rulesText}\\n\\n` +\n `Provide a structured review with a compliance status for each rule (COMPLIANT / AT RISK / VIOLATION / NOT APPLICABLE).`,\n },\n },\n ],\n };\n }\n );\n\n server.prompt(\n \"name-check\",\n \"Check variable names, field names, or API names against the glossary for terminology alignment. Flags drift from canonical terms.\",\n { names: z.string().describe(\"Comma-separated list of names to check (e.g. 'vendor_id, compliance_level, formulator_type')\") },\n async ({ names }) => {\n const terms = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"glossary\" });\n\n const glossaryContext = terms\n .map(\n (t) =>\n `${t.name} (${t.entryId ?? \"\"}) [${t.status}]: ${t.data?.canonical ?? \"\"}` +\n (t.data?.confusedWith?.length > 0 ? ` — Often confused with: ${t.data.confusedWith.join(\", \")}` : \"\") +\n (t.data?.codeMapping?.length > 0\n ? `\\n Code mappings: ${t.data.codeMapping.map((m: any) => `${m.platform}:${m.field}`).join(\", \")}`\n : \"\")\n )\n .join(\"\\n\");\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `Check the following names against the glossary for terminology alignment:\\n\\n` +\n `Names to check: ${names}\\n\\n` +\n `Glossary (canonical terms):\\n${glossaryContext}\\n\\n` +\n `For each name:\\n` +\n `1. Does it match a canonical term? If so, which one?\\n` +\n `2. Is there terminology drift? (e.g. using \"vendor\" instead of \"supplier\", \"compliance\" instead of \"conformance\")\\n` +\n `3. Suggest the canonical alternative if drift is detected.\\n` +\n `4. Flag any names that don't have a corresponding glossary term (might need one).\\n\\n` +\n `Format as a table: Name | Status | Canonical Form | Action Needed`,\n },\n },\n ],\n };\n }\n );\n\n server.prompt(\n \"draft-decision-record\",\n \"Draft a structured decision record from a description of what was decided. Includes context from recent decisions and relevant rules.\",\n { context: z.string().describe(\"Description of the decision (e.g. 'We decided to use MRSL v3.1 as the conformance baseline because...')\") },\n async ({ context }) => {\n const recentDecisions = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"decisions\" });\n const sorted = [...recentDecisions]\n .sort((a, b) => ((b.data?.date ?? \"\") > (a.data?.date ?? \"\") ? 1 : -1))\n .slice(0, 5);\n\n const recentContext = sorted.length > 0\n ? sorted.map((d) => `- [${d.status}] ${d.name} (${d.data?.date ?? \"no date\"})`).join(\"\\n\")\n : \"No previous decisions recorded.\";\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `Draft a structured decision record from the following context:\\n\\n` +\n `\"${context}\"\\n\\n` +\n `Recent decisions for reference:\\n${recentContext}\\n\\n` +\n `Structure the decision record with:\\n` +\n `1. **Title**: Concise decision statement\\n` +\n `2. **Decided by**: Who made or approved this decision\\n` +\n `3. **Date**: When it was decided\\n` +\n `4. **Status**: decided / proposed / revisited\\n` +\n `5. **Rationale**: Why this decision was made, including trade-offs considered\\n` +\n `6. **Alternatives considered**: What else was on the table\\n` +\n `7. **Related rules or tensions**: Any business rules or tensions this connects to\\n\\n` +\n `After drafting, I can log it using the capture tool with collection \"decisions\".`,\n },\n },\n ],\n };\n }\n );\n\n server.prompt(\n \"draft-rule-from-context\",\n \"Draft a new business rule from an observation or discovery made while coding. Fetches existing rules for the domain to ensure consistency.\",\n {\n observation: z.string().describe(\"What you observed or discovered (e.g. 'Suppliers can have multiple org types in Gateway')\"),\n domain: z.string().describe(\"Which domain this rule belongs to (e.g. 'Governance & Decision-Making')\"),\n },\n async ({ observation, domain }) => {\n const allRules = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"business-rules\" });\n const existingRules = allRules.filter((r) => r.data?.domain === domain);\n\n const existingContext =\n existingRules.length > 0\n ? existingRules.map((r) => `${r.entryId ?? \"\"}: ${r.name} [${r.status}] — ${r.data?.description ?? \"\"}`).join(\"\\n\")\n : \"No existing rules for this domain.\";\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `Draft a business rule based on this observation:\\n\\n` +\n `\"${observation}\"\\n\\n` +\n `Domain: ${domain}\\n\\n` +\n `Existing rules in this domain:\\n${existingContext}\\n\\n` +\n `Draft the rule with these fields (do not specify entryId — Convex assigns sequential IDs automatically, e.g. SOS-7):\\n` +\n `1. **name**: Concise rule title\\n` +\n `2. **data.description**: What the rule states\\n` +\n `3. **data.rationale**: Why this rule matters\\n` +\n `4. **data.dataImpact**: How this affects data models, APIs, or storage\\n` +\n `5. **data.severity**: high / medium / low\\n` +\n `6. **data.platforms**: Which platforms are affected\\n` +\n `7. **data.relatedRules**: Any related existing rules\\n\\n` +\n `Make sure the rule is consistent with existing rules and doesn't contradict them. ` +\n `After drafting, I can create it using the capture tool with collection \"business-rules\".`,\n },\n },\n ],\n };\n }\n );\n\n // ── Run Workflow Prompt ──────────────────────────────────────────────────\n\n server.prompt(\n \"run-workflow\",\n \"Launch a Chainwork workflow (retro, shape, IDM) in Facilitator Mode. \" +\n \"Returns the full workflow definition, facilitation instructions, and round structure. \" +\n \"The agent enters Facilitator Mode and guides the participant through each round.\",\n {\n workflow: z.string().describe(\n \"Workflow ID to run. Available: \" +\n listWorkflows().map((w) => `'${w.id}' (${w.name})`).join(\", \"),\n ),\n context: z.string().optional().describe(\n \"Optional context from the participant (e.g., 'retro on last sprint', 'shape the Chainwork API bet')\",\n ),\n },\n async ({ workflow: workflowId, context }) => {\n const wf = getWorkflow(workflowId);\n\n if (!wf) {\n const available = listWorkflows()\n .map((w) => `- **${w.id}**: ${w.name} — ${w.shortDescription}`)\n .join(\"\\n\");\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `Workflow \"${workflowId}\" not found.\\n\\n` +\n `Available workflows:\\n${available}\\n\\n` +\n `Use one of these IDs to run a workflow.`,\n },\n },\n ],\n };\n }\n\n // Fetch recent chain context for richer facilitation\n let kbContext = \"\";\n try {\n const recentDecisions = await mcpQuery<any[]>(\"chain.listEntries\", {\n collectionSlug: wf.kbOutputCollection,\n });\n const sorted = [...recentDecisions]\n .sort((a, b) => ((b.data?.date ?? \"\") > (a.data?.date ?? \"\") ? 1 : -1))\n .slice(0, 5);\n if (sorted.length > 0) {\n kbContext =\n `\\n## Recent ${wf.kbOutputCollection} entries (for context)\\n` +\n sorted.map((d) => `- ${d.entryId ?? \"\"}: ${d.name} [${d.status}]`).join(\"\\n\");\n }\n } catch {\n kbContext = \"\\n_Could not load chain context — proceed without it._\";\n }\n\n const roundsPlan = wf.rounds\n .map((r) =>\n `### Round ${r.num}: ${r.label}\\n` +\n `**Type**: ${r.type} | **Duration**: ~${r.maxDurationHint ?? \"5 min\"}\\n` +\n `**Instruction**: ${r.instruction}\\n` +\n `**Facilitator guidance**: ${r.facilitatorGuidance}\\n` +\n (r.questions\n ? r.questions.map((q) =>\n `**Question**: ${q.prompt}\\n` +\n (q.options\n ? q.options.map((o) => ` - ${o.id}: ${o.label}`).join(\"\\n\")\n : \" _(open response)_\"),\n ).join(\"\\n\")\n : \"\") +\n `\\n**Output**: Capture to \\`${r.outputSchema.field}\\` (${r.outputSchema.format})`,\n )\n .join(\"\\n\\n---\\n\\n\");\n\n const contextLine = context\n ? `\\nThe participant provided this context: \"${context}\"\\nUse it — don't make them repeat themselves.\\n`\n : \"\";\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `# ${wf.icon} ${wf.name} Workflow — Facilitator Mode\\n\\n` +\n `${wf.shortDescription}\\n` +\n contextLine +\n `\\n---\\n\\n` +\n `## Facilitator Instructions\\n\\n${wf.facilitatorPreamble}\\n\\n` +\n `---\\n\\n` +\n `## Rounds\\n\\n${roundsPlan}\\n\\n` +\n `---\\n\\n` +\n `## Error Recovery\\n\\n${wf.errorRecovery}\\n\\n` +\n `---\\n\\n` +\n `## Chain Output\\n\\n` +\n `When complete, use \\`capture\\` to create a \\`${wf.kbOutputCollection}\\` entry.\\n` +\n `Name template: ${wf.kbOutputTemplate.nameTemplate}\\n` +\n `Description field: ${wf.kbOutputTemplate.descriptionField}\\n` +\n kbContext +\n `\\n\\n---\\n\\n` +\n `**BEGIN THE WORKFLOW NOW.** Start with Round 01. Create a Plan first.`,\n },\n },\n ],\n };\n },\n );\n\n // ── Workflow Choreography Prompts ────────────────────────────────────────\n\n // DEC-72 (workflow prompts pattern), DEC-73 (dynamic tool surface — session start required)\n // ENT-37 (Facilitate v1): Dynamic prompt with workspace context injection\n server.prompt(\n \"shape-a-bet\",\n \"Launch a coached shaping session powered by the facilitate tool. \" +\n \"Dynamically loads workspace context, governance constraints, and coaching rubrics. \" +\n \"Use when the user wants to shape a bet, define a pitch, or scope work.\",\n {\n idea: z.string().describe(\"Brief description of the idea or feature to shape (e.g. 'Improve the glossary editing flow')\"),\n },\n async ({ idea }) => {\n let strategicContext = \"\";\n let governanceContext = \"\";\n let activeBetsContext = \"\";\n let tensionsContext = \"\";\n\n try {\n const orient = await mcpQuery<{\n strategicContext: { vision: string | null; activeBetCount: number; activeTensionCount: number; currentBet: string | null };\n activeBets: Array<{ entryId: string | null; name: string }>;\n businessRules: Array<{ entryId: string | null; name: string }>;\n standards: Array<{ entryId: string | null; name: string }>;\n principles: Array<{ entryId: string | null; name: string }>;\n }>(\"chain.getOrientEntries\", {});\n\n const sc = orient?.strategicContext;\n if (sc?.vision) strategicContext += `**Vision:** ${sc.vision}\\n`;\n if (sc?.currentBet) strategicContext += `**Current bet:** ${sc.currentBet}\\n`;\n strategicContext += `${sc?.activeBetCount ?? 0} active bet(s), ${sc?.activeTensionCount ?? 0} open tension(s).\\n`;\n\n if (orient?.activeBets?.length) {\n activeBetsContext = orient.activeBets\n .map((b) => `- \\`${b.entryId ?? \"?\"}\\` ${b.name}`)\n .join(\"\\n\");\n }\n\n const govParts: string[] = [];\n if (orient?.principles?.length) {\n govParts.push(\"**Principles:**\\n\" + orient.principles.map((p) => `- \\`${p.entryId}\\` ${p.name}`).join(\"\\n\"));\n }\n if (orient?.standards?.length) {\n govParts.push(\"**Standards:**\\n\" + orient.standards.map((s) => `- \\`${s.entryId}\\` ${s.name}`).join(\"\\n\"));\n }\n if (orient?.businessRules?.length) {\n govParts.push(\"**Business Rules:**\\n\" + orient.businessRules.map((r) => `- \\`${r.entryId}\\` ${r.name}`).join(\"\\n\"));\n }\n governanceContext = govParts.join(\"\\n\\n\");\n } catch {\n strategicContext = \"_Could not load workspace context — proceed without it._\\n\";\n }\n\n try {\n const tensions = await mcpQuery<Array<{ entryId: string | null; name: string; status: string; workflowStatus?: string }>>(\n \"chain.listEntries\",\n { collectionSlug: \"tensions\" },\n );\n const open = (tensions ?? []).filter((t) => t.workflowStatus === \"open\");\n if (open.length > 0) {\n tensionsContext = open.slice(0, 10)\n .map((t) => `- \\`${t.entryId ?? \"?\"}\\` ${t.name}`)\n .join(\"\\n\");\n }\n } catch { /* non-critical */ }\n\n return {\n messages: [{\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `# Shape a Bet: ${idea}\\n\\n` +\n `You are a **coached shaping facilitator** powered by the \\`facilitate\\` tool. ` +\n `You guide the user through structured shaping while the server scores, captures, and coaches.\\n\\n` +\n\n `## Your Role (DEC-56 Boundary)\\n\\n` +\n `The **server judges** — it scores input against 5 rubric dimensions, detects overlap with existing Chain entries, ` +\n `and checks alignment with governance. The server returns structured coaching responses.\\n` +\n `**You coach** — you interpret the structured response, synthesize it naturally, decide tone, ` +\n `follow up on weak areas, and push back when the shaping isn't sharp enough.\\n` +\n `The \\`coaching.suggestedQuestion\\` is a suggestion, not a script — rephrase or skip based on conversation flow.\\n\\n` +\n\n `## Rubric Dimensions (5 scoring criteria)\\n\\n` +\n `Each scored 0-10 by the server:\\n` +\n `1. **Problem Clarity** — workaround described, who affected, frequency/severity, differentiated from existing tensions\\n` +\n `2. **Appetite Definition** — time constraint explicit, scope bounded, trade-offs acknowledged\\n` +\n `3. **Element Decomposition** — breadboard-level pieces identified, independently describable, no implementation leaks\\n` +\n `4. **Risk Coverage** — rabbit holes named, mitigations or acceptances, codebase-level risks\\n` +\n `5. **Boundary Specification** — explicit no-gos, each prevents scope creep in a specific direction\\n\\n` +\n\n `## How to Use the Facilitate Tool\\n\\n` +\n `### Prerequisites\\n` +\n `1. \\`session action=start\\` (if not already active)\\n` +\n `2. \\`orient\\` (loads context and unlocks writes)\\n\\n` +\n\n `### Session Flow\\n` +\n `1. **Start:** \\`facilitate action=start betName=\"${idea}\"\\`\\n` +\n ` Creates a draft bet on the Chain. Returns Studio URL and initial coaching prompt.\\n\\n` +\n `2. **Respond (repeat):** \\`facilitate action=respond betEntryId=\"...\" userInput=\"<user's input>\"\\`\\n` +\n ` Optionally add \\`dimension=\"problem_clarity\"\\` to target a specific dimension.\\n\\n` +\n ` **CRITICAL — Capture is REQUIRED for structured items:**\\n` +\n ` Elements, risks, and no-gos MUST include the \\`capture\\` parameter. Without it, nothing is saved to the bet — the data is silently lost and you will receive a WARNING.\\n` +\n ` - Elements: \\`capture={type:\"element\", name:\"...\", description:\"...\"}\\`\\n` +\n ` - Risks: \\`capture={type:\"risk\", name:\"...\", description:\"...\", theme:\"implementation\"}\\`\\n` +\n ` - No-gos: \\`capture={type:\"noGo\", name:\"...\", description:\"...\"}\\`\\n` +\n ` Each element, risk, and no-go needs its own \\`respond\\` call with \\`capture\\`.\\n\\n` +\n `3. **Score (anytime):** \\`facilitate action=score betEntryId=\"...\"\\`\\n` +\n ` Check the scorecard without advancing.\\n\\n` +\n `4. **Resume:** \\`facilitate action=resume betEntryId=\"...\"\\`\\n` +\n ` Reconstruct session from Chain state if returning to an existing bet.\\n\\n` +\n\n `### Reading the Response\\n` +\n `The \\`respond\\` action returns JSON with:\\n` +\n `- \\`scorecard\\` — current scores per dimension (0-10)\\n` +\n `- \\`overlap\\` — existing Chain entries that may duplicate this work\\n` +\n `- \\`chainSurfaced\\` — related entries the user might not know about (weave into coaching)\\n` +\n `- \\`coaching.observation\\` — what the server observed\\n` +\n `- \\`coaching.missing\\` — what's still needed\\n` +\n `- \\`coaching.pushback\\` — challenge to present to the user\\n` +\n `- \\`coaching.suggestedQuestion\\` — next question to ask\\n` +\n `- \\`coaching.captureReady\\` — true when 3+ dimensions are complete\\n` +\n `- \\`navigation.activeDimension\\` — the dimension being coached\\n` +\n `- \\`captured\\` — entries created this turn, Studio URL\\n` +\n `- \\`captureErrors\\` — partial failures (non-blocking)\\n\\n` +\n\n `### Coaching Style\\n` +\n `- One dimension at a time. Don't dump all dimensions at once.\\n` +\n `- Push back on vague problems. \"Who's affected?\" is always a valid question.\\n` +\n `- When \\`chainSurfaced\\` returns related entries, weave them in: \"There's a decision on the Chain about this — DEC-56 says...\"\\n` +\n `- When \\`overlap\\` finds matches, challenge: \"This tension already exists. How is your bet different?\"\\n` +\n `- When \\`captureReady\\` is true, offer to finalize. Don't force completion.\\n` +\n `- Keep chat messages short (5 lines or fewer). The tool does the heavy lifting.\\n\\n` +\n\n `## Workspace Context\\n\\n` +\n (strategicContext ? `### Strategic Context\\n${strategicContext}\\n` : \"\") +\n (activeBetsContext ? `### Active Bets\\n${activeBetsContext}\\n\\n` : \"\") +\n (tensionsContext ? `### Open Tensions\\n${tensionsContext}\\n\\n` : \"\") +\n (governanceContext ? `### Governance Constraints\\n_The shaping must honor these:_\\n\\n${governanceContext}\\n\\n` : \"\") +\n\n `## Constellation Capture (STA-1)\\n` +\n `The facilitate tool captures in real-time:\\n` +\n `- Elements → \\`features\\` collection, \\`part_of\\` → bet\\n` +\n `- Risks → \\`tensions\\` collection, \\`constrains\\` → bet\\n` +\n `- Decisions → \\`decisions\\` collection, \\`informs\\` → bet\\n` +\n `- No-gos → updated on the bet entry directly\\n\\n` +\n\n `Walk away mid-session and everything captured so far exists as drafts. \\`facilitate action=resume\\` picks it up.\\n\\n` +\n\n `---\\n\\n` +\n `**Begin now.** Call \\`facilitate action=start betName=\"${idea}\"\\` and then ask the user to describe the problem.`,\n },\n }],\n };\n }\n );\n\n server.prompt(\n \"capture-and-connect\",\n \"Guided workflow: capture a knowledge entry, discover graph connections, create relations, and prepare for commit. \" +\n \"Encodes the capture → suggest → batch-create → commit choreography as a step-by-step guide.\",\n {\n collection: z.string().describe(\"Collection slug (e.g. 'glossary', 'business-rules', 'decisions', 'tensions')\"),\n name: z.string().describe(\"Entry name\"),\n description: z.string().describe(\"Entry description\"),\n },\n async ({ collection, name, description }) => {\n const collections = await mcpQuery<any[]>(\"chain.listCollections\");\n const col = collections.find((c: any) => c.slug === collection);\n const colName = col ? col.name : collection;\n\n return {\n messages: [{\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `# Capture & Connect Workflow\\n\\n` +\n `You are capturing a new **${colName}** entry and connecting it to the knowledge graph.\\n\\n` +\n `## Entry Details\\n` +\n `- **Collection:** ${collection}\\n` +\n `- **Name:** ${name}\\n` +\n `- **Description:** ${description}\\n\\n` +\n `## Steps (execute in order)\\n\\n` +\n `### Step 1: Capture\\n` +\n `\\`\\`\\`\\ncapture collection=\"${collection}\" name=\"${name}\" description=\"${description}\"\\n\\`\\`\\`\\n` +\n `Review the quality scorecard. Note the returned \\`entryId\\`.\\n\\n` +\n `### Step 2: Discover Connections\\n` +\n `\\`\\`\\`\\ngraph action=suggest entryId=\"<ID from step 1>\"\\n\\`\\`\\`\\n` +\n `Review the top 3 quick wins. Accept the ones that make sense.\\n\\n` +\n `### Step 3: Create Relations\\n` +\n `\\`\\`\\`\\nrelations action=batch-create relations=[...]\\n\\`\\`\\`\\n` +\n `Use the suggested relations from step 2.\\n\\n` +\n `### Step 4: Present for Commit\\n` +\n `Show the user what was captured and connected. Ask for confirmation.\\n` +\n `Only call \\`commit-entry\\` when the user explicitly confirms.\\n\\n` +\n `**Begin with Step 1 now.**`,\n },\n }],\n };\n }\n );\n\n server.prompt(\n \"deep-dive\",\n \"Explore everything the Chain knows about a topic or entry. \" +\n \"Assembles entry details, graph context, related business rules, and glossary terms into a comprehensive briefing.\",\n {\n topic: z.string().describe(\"Entry ID (e.g. 'BR-001') or topic to explore (e.g. 'authentication')\"),\n },\n async ({ topic }) => {\n const isEntryId = /^[A-Z]+-\\d+$/i.test(topic) || /^[A-Z]+-[a-z0-9]+$/i.test(topic);\n\n let contextInstructions: string;\n if (isEntryId) {\n contextInstructions =\n `The topic is an entry ID: \\`${topic}\\`\\n\\n` +\n `## Steps\\n\\n` +\n `### 1. Get the entry\\n` +\n `\\`\\`\\`\\nentries action=get entryId=\"${topic}\"\\n\\`\\`\\`\\n\\n` +\n `### 2. Gather full context\\n` +\n `\\`\\`\\`\\ncontext action=gather entryId=\"${topic}\" mode=\"graph\"\\n\\`\\`\\`\\n\\n` +\n `### 3. Check direct relations\\n` +\n `\\`\\`\\`\\ngraph action=find entryId=\"${topic}\"\\n\\`\\`\\`\\n\\n` +\n `### 4. Synthesize\\n` +\n `Combine everything into a comprehensive briefing:\\n` +\n `- What this entry IS (data, status, collection)\\n` +\n `- How it connects to the rest of the Chain (relations, context)\\n` +\n `- What business rules govern it\\n` +\n `- What glossary terms it uses\\n` +\n `- What gaps or opportunities exist (missing relations, low quality score)\\n\\n` +\n `Present the briefing, then ask if the user wants to explore any connection deeper.`;\n } else {\n contextInstructions =\n `The topic is a natural-language query: \"${topic}\"\\n\\n` +\n `## Steps\\n\\n` +\n `### 1. Search the Chain\\n` +\n `\\`\\`\\`\\nentries action=search query=\"${topic}\"\\n\\`\\`\\`\\n\\n` +\n `### 2. Load task context\\n` +\n `\\`\\`\\`\\ncontext action=gather task=\"${topic}\"\\n\\`\\`\\`\\n\\n` +\n `### 3. Explore top results\\n` +\n `For the top 3 most relevant entries from search, get their full details:\\n` +\n `\\`\\`\\`\\nentries action=get entryId=\"<ID>\"\\n\\`\\`\\`\\n\\n` +\n `### 4. Synthesize\\n` +\n `Combine everything into a comprehensive briefing about \"${topic}\":\\n` +\n `- What the Chain knows about this topic\\n` +\n `- Key entries, business rules, and glossary terms\\n` +\n `- How different entries relate to each other\\n` +\n `- What gaps exist in the Chain's knowledge\\n\\n` +\n `Present the briefing, then ask if the user wants to capture new knowledge or explore deeper.`;\n }\n\n return {\n messages: [{\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `# Deep Dive: ${topic}\\n\\nExplore everything the Chain knows about this topic.\\n\\n${contextInstructions}`,\n },\n }],\n };\n }\n );\n\n server.prompt(\n \"pre-commit-check\",\n \"Run a readiness check before committing an entry to the Chain. \" +\n \"Validates quality score, required relations, and business rule compliance.\",\n {\n entryId: z.string().describe(\"Entry ID to check (e.g. 'GT-019', 'DEC-005')\"),\n },\n async ({ entryId }) => {\n return {\n messages: [{\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `# Pre-Commit Check: ${entryId}\\n\\n` +\n `Run a full readiness check before committing this entry to the Chain.\\n\\n` +\n `## Steps (execute all, report results)\\n\\n` +\n `### 1. Quality Check\\n` +\n `\\`\\`\\`\\nquality action=check entryId=\"${entryId}\"\\n\\`\\`\\`\\n` +\n `Target: 8/10 or higher. If below, identify what to improve.\\n\\n` +\n `### 2. Re-evaluate in Commit Context\\n` +\n `\\`\\`\\`\\nquality action=re-evaluate entryId=\"${entryId}\" context=\"commit\"\\n\\`\\`\\`\\n` +\n `Check semantic quality criteria (specificity, actionability, testability).\\n\\n` +\n `### 3. Check Relations\\n` +\n `\\`\\`\\`\\ngraph action=find entryId=\"${entryId}\"\\n\\`\\`\\`\\n` +\n `Verify the entry has at least one relation. Strategy entries MUST have a strategy link.\\n\\n` +\n `### 4. Discover Missing Connections\\n` +\n `\\`\\`\\`\\ngraph action=suggest entryId=\"${entryId}\"\\n\\`\\`\\`\\n` +\n `Review suggestions. Create high-confidence relations before committing.\\n\\n` +\n `### 5. Readiness Verdict\\n` +\n `Present a summary:\\n` +\n `- **Quality:** X/10 (pass if >= 8)\\n` +\n `- **Relations:** X connections (pass if >= 1)\\n` +\n `- **Strategy link:** present/missing (required for governed collections)\\n` +\n `- **Semantic quality:** X/3 criteria pass\\n` +\n `- **Verdict:** READY TO COMMIT / NEEDS IMPROVEMENT\\n\\n` +\n `If ready, ask the user to confirm. If not, suggest specific improvements.\\n\\n` +\n `**Begin with Step 1 now.**`,\n },\n }],\n };\n }\n );\n\n // ── Project Scan Prompt ──────────────────────────────────────────────────────────────────────\n // BET-64 / FEAT-60: Agent-side knowledge extraction from local project files.\n // PB MCP runs remotely and cannot read local files — the IDE agent does the reading + extraction.\n // The agent validates its output against the extraction schema before calling batch-capture.\n //\n // ICP stack only (V1 no-go): README.md, package.json, tsconfig, folder structure,\n // .cursorrules/CLAUDE.md/AGENTS.md, recent git log.\n\n server.prompt(\n \"project-scan\",\n \"Scan local project files to extract structured knowledge for Product Brain. \" +\n \"The IDE agent reads README.md, package.json, .cursorrules, folder structure, and recent git history, \" +\n \"then extracts vision, tech stack, key terms, and decisions into batch-capture entries. \" +\n \"All entries land as drafts — the user reviews and commits.\",\n {\n workspaceContext: z\n .string()\n .optional()\n .describe(\"Optional context about the workspace preset and existing collections (paste from start/orient output)\"),\n },\n async ({ workspaceContext }) => {\n // Fetch existing collections so the agent knows what's available for capture\n let collectionsContext = \"\";\n try {\n const cols = await mcpQuery<any[]>(\"chain.listCollections\");\n if (cols?.length) {\n const colList = cols.map((c: any) => `- \\`${c.slug}\\`: ${c.name}`).join(\"\\n\");\n collectionsContext = `\\n## Available Collections\\n${colList}\\n`;\n }\n } catch { /* non-critical */ }\n\n // Build the extraction schema description for the prompt\n const schemaFields = Object.entries(interviewExtractionSchema.shape)\n .map(([key, field]) => `- \\`${key}\\`: ${(field as any).description ?? \"\"}`)\n .join(\"\\n\");\n\n // Show example batch-capture output from extraction\n const exampleExtraction = {\n vision: \"A task management app for solo developers who work with AI coding assistants\",\n audience: \"Solo developers using Cursor, Claude Code, or similar AI IDEs\",\n techStack: [\"SvelteKit\", \"Convex\", \"TypeScript\"],\n keyTerms: [\"Chain\", \"Capture\", \"Orientation\"],\n keyDecisions: [\"Use Convex for real-time backend to avoid managing infrastructure\"],\n tensions: [\"Activation requires skill — users need to know what to capture\"],\n };\n const exampleEntries = extractionToBatchEntries(exampleExtraction);\n const exampleOutput = JSON.stringify({ entries: exampleEntries.slice(0, 4) }, null, 2);\n\n return {\n messages: [{\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `# Project Scan — Agent-Side Knowledge Extraction\\n\\n` +\n `You are scanning the user's local project to extract structured knowledge for Product Brain.\\n` +\n `PB runs remotely — you do the file reading and extraction, then call \\`batch-capture\\`.\\n\\n` +\n (workspaceContext ? `## Workspace Context\\n${workspaceContext}\\n\\n` : \"\") +\n collectionsContext +\n `## Step 1: Read Project Files\\n\\n` +\n `Read these files in this order (skip gracefully if not present):\\n` +\n `1. \\`README.md\\` or \\`readme.md\\` — product description, purpose, setup\\n` +\n `2. \\`package.json\\` — name, description, dependencies (framework, database, auth)\\n` +\n `3. \\`tsconfig.json\\` or \\`tsconfig.app.json\\` — compilation target, paths\\n` +\n `4. Top-level folder structure (list directories only, max 2 levels deep)\\n` +\n `5. \\`.cursorrules\\` or \\`CLAUDE.md\\` or \\`AGENTS.md\\` — project conventions, constraints\\n` +\n `6. \\`git log --oneline -20\\` — recent commit messages for decisions/tensions\\n\\n` +\n `**ICP stack only (V1):** README, package.json, tsconfig, folder structure, .cursorrules/CLAUDE.md, git log.\\n` +\n `Do not attempt to read Python, Rust, Go, or mobile-specific files in this pass.\\n\\n` +\n `## Step 2: Extract Structured Data\\n\\n` +\n `After reading, extract the following schema:\\n\\n` +\n `\\`\\`\\`\\n${schemaFields}\\n\\`\\`\\`\\n\\n` +\n `**Quality rules (RH2 mitigation):**\\n` +\n `- Prefer 8 good entries over 20 mediocre ones\\n` +\n `- Only include terms you have direct evidence for from the files\\n` +\n `- Skip fields you cannot confidently fill — empty arrays > hallucinated data\\n` +\n `- Keep descriptions concise: 1–2 sentences max\\n\\n` +\n `## Step 3: Validate Before Capture\\n\\n` +\n `Before calling batch-capture, check your extraction:\\n` +\n `- vision is present and at least 10 characters\\n` +\n `- each entry has a non-empty name and description\\n` +\n `- no duplicate names within the same collection\\n` +\n `- if techStack is present, at least one glossary entry per technology\\n\\n` +\n `If validation fails for any entry, drop it rather than sending malformed data.\\n\\n` +\n `## Step 4: Map to batch-capture\\n\\n` +\n `Map your extracted data to entries using these rules:\\n` +\n `- \\`vision\\` → strategy collection, name: \"Product Vision\"\\n` +\n `- \\`audience\\` → audiences collection\\n` +\n `- \\`techStack\\` → architecture collection (\"Tech Stack\") + top 3 items → glossary\\n` +\n `- \\`keyTerms\\` → glossary collection (1 entry per term)\\n` +\n `- \\`keyDecisions\\` → decisions collection (1 entry per decision)\\n` +\n `- \\`tensions\\` → tensions collection (1 entry per tension)\\n\\n` +\n `**Example output:**\\n` +\n `\\`\\`\\`json\\n${exampleOutput}\\n\\`\\`\\`\\n\\n` +\n `## Step 5: Call batch-capture\\n\\n` +\n `\\`\\`\\`\\nbatch-capture entries=[...your mapped entries...]\\n\\`\\`\\`\\n\\n` +\n `If \\`failed > 0\\` in the response, inspect \\`failedEntries\\` and retry those individually.\\n\\n` +\n `## Step 6: Connect + Review\\n\\n` +\n `After capture:\\n` +\n `1. Call \\`graph action=suggest\\` on 2–3 key entries (vision, architecture, a decision)\\n` +\n `2. Present entries grouped by collection\\n` +\n `3. Ask: \"Commit all, or would you like to review first?\"\\n` +\n `4. Only call \\`commit-entry\\` when the user confirms\\n\\n` +\n `**Begin with Step 1 now.** Read the files, then report what you found before extracting.`,\n },\n }],\n };\n },\n );\n}\n"],"mappings":"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","names":["McpServer","z","z","z","z","z","z","z","z","result","byCollection","lines","rootId","nodes","edges","z","z","handleList","handleCreate","z","z","z","z","z","z","data","z","z","z","z","z","handleList","z","z","handleStart","join","betName","z","z","z","z","z","z","z","z","z","z","z","existsSync","readFileSync","resolve","z","z","resolveProjectRoot","resolve","existsSync","readFileSync","abs","z","r","resolve","resolve","z","z","McpServer"]}
|