@mukulaggarwal/pacman 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -0
- package/dist/chunk-3QNXXON5.js +330 -0
- package/dist/chunk-3QNXXON5.js.map +1 -0
- package/dist/chunk-43PUZDIZ.js +148 -0
- package/dist/chunk-43PUZDIZ.js.map +1 -0
- package/dist/chunk-7D4SUZUM.js +38 -0
- package/dist/chunk-7D4SUZUM.js.map +1 -0
- package/dist/chunk-AYFIQNZ5.js +807 -0
- package/dist/chunk-AYFIQNZ5.js.map +1 -0
- package/dist/chunk-FH6ZHWGR.js +37 -0
- package/dist/chunk-FH6ZHWGR.js.map +1 -0
- package/dist/chunk-O6T35A4O.js +137 -0
- package/dist/chunk-O6T35A4O.js.map +1 -0
- package/dist/chunk-TRQIZP6Z.js +451 -0
- package/dist/chunk-TRQIZP6Z.js.map +1 -0
- package/dist/chunk-UWT6AFJB.js +471 -0
- package/dist/chunk-UWT6AFJB.js.map +1 -0
- package/dist/chunk-ZKKMIDRK.js +3923 -0
- package/dist/chunk-ZKKMIDRK.js.map +1 -0
- package/dist/daemon.d.ts +3 -0
- package/dist/daemon.js +141 -0
- package/dist/daemon.js.map +1 -0
- package/dist/dist-3PIJOFZ4.js +91 -0
- package/dist/dist-3PIJOFZ4.js.map +1 -0
- package/dist/dist-L76NGFFH.js +102 -0
- package/dist/dist-L76NGFFH.js.map +1 -0
- package/dist/dist-NV2YVVHI.js +178 -0
- package/dist/dist-NV2YVVHI.js.map +1 -0
- package/dist/dist-RMYCRZIU.js +41 -0
- package/dist/dist-RMYCRZIU.js.map +1 -0
- package/dist/dist-THLCZNOZ.js +14 -0
- package/dist/dist-THLCZNOZ.js.map +1 -0
- package/dist/dist-TWNHTXYH.js +95 -0
- package/dist/dist-TWNHTXYH.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +452 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-compat.d.ts +1 -0
- package/dist/mcp-compat.js +78 -0
- package/dist/mcp-compat.js.map +1 -0
- package/dist/onboarding-server.d.ts +3 -0
- package/dist/onboarding-server.js +1172 -0
- package/dist/onboarding-server.js.map +1 -0
- package/dist/provider-runtime.d.ts +11 -0
- package/dist/provider-runtime.js +10 -0
- package/dist/provider-runtime.js.map +1 -0
- package/dist/slack-listener.d.ts +49 -0
- package/dist/slack-listener.js +888 -0
- package/dist/slack-listener.js.map +1 -0
- package/dist/storage.d.ts +8 -0
- package/dist/storage.js +9 -0
- package/dist/storage.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/mcp-installers.ts","../src/mcp-server.ts"],"sourcesContent":["import * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport const MCP_SERVER_NAME = 'personal_assistant';\nexport const DEFAULT_WORKSPACE = path.join(os.homedir(), '.personal-assistant');\n\nexport interface ServerCommand {\n command: string;\n args: string[];\n}\n\nexport interface CommandResult {\n stdout: string;\n stderr: string;\n}\n\nexport interface CodexMcpServer {\n name: string;\n}\n\nexport type CommandRunner = (\n command: string,\n args: string[],\n) => Promise<CommandResult>;\n\nasync function runCommand(command: string, args: string[]): Promise<CommandResult> {\n const result = await execFileAsync(command, args);\n return {\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n };\n}\n\nexport async function resolveWorkspacePath(dirOpt?: string): Promise<string> {\n if (dirOpt) {\n return path.resolve(dirOpt);\n }\n\n const rcPath = path.join(os.homedir(), '.personal-assistant-rc.json');\n try {\n const rc = JSON.parse(await fs.readFile(rcPath, 'utf-8')) as { workspacePath?: string };\n if (rc.workspacePath) {\n return rc.workspacePath;\n }\n } catch {\n // Fall back to the default workspace.\n }\n\n return DEFAULT_WORKSPACE;\n}\n\nexport async function resolvePacmanServerCommand(): Promise<ServerCommand> {\n const scriptPath = path.resolve(process.argv[1]);\n return { command: process.execPath, args: [scriptPath, 'mcp', 'serve'] };\n}\n\nexport async function resolveCompatServerCommand(): Promise<ServerCommand> {\n const scriptPath = path.resolve(process.argv[1]);\n return { command: process.execPath, args: [scriptPath] };\n}\n\nexport async function installClaudeMcp(\n workspacePath: string,\n resolveCommand: () => Promise<ServerCommand> = resolvePacmanServerCommand,\n runner: CommandRunner = runCommand,\n): Promise<void> {\n const serverCommand = await resolveCommand();\n const fallbackCommand = formatClaudeManualInstallCommand(workspacePath, serverCommand);\n\n try {\n try {\n await runner('claude', ['mcp', 'remove', '-s', 'user', MCP_SERVER_NAME]);\n } catch (err) {\n const code = typeof err === 'object' && err !== null && 'code' in err\n ? String((err as { code?: unknown }).code)\n : '';\n if (code === 'ENOENT') {\n throw err;\n }\n }\n\n await runner('claude', [\n 'mcp',\n 'add',\n '-s',\n 'user',\n `--env=PA_WORKSPACE=${workspacePath}`,\n MCP_SERVER_NAME,\n '--',\n serverCommand.command,\n ...serverCommand.args,\n ]);\n } catch (err) {\n throw normalizeClaudeInstallError(err, fallbackCommand);\n }\n}\n\nexport function formatClaudeManualInstallCommand(\n workspacePath: string,\n serverCommand: ServerCommand,\n): string {\n return [\n 'claude',\n 'mcp',\n 'add',\n '-s',\n 'user',\n `--env=${shellQuote(`PA_WORKSPACE=${workspacePath}`)}`,\n MCP_SERVER_NAME,\n '--',\n shellQuote(serverCommand.command),\n ...serverCommand.args.map(shellQuote),\n ].join(' ');\n}\n\nexport function formatCodexManualInstallCommand(\n workspacePath: string,\n serverCommand: ServerCommand,\n): string {\n return [\n 'codex',\n 'mcp',\n 'add',\n MCP_SERVER_NAME,\n '--env',\n shellQuote(`PA_WORKSPACE=${workspacePath}`),\n '--',\n shellQuote(serverCommand.command),\n ...serverCommand.args.map(shellQuote),\n ].join(' ');\n}\n\nexport function parseCodexServerList(stdout: string): CodexMcpServer[] {\n const trimmed = stdout.trim();\n if (trimmed.length === 0) {\n return [];\n }\n\n const jsonStart = trimmed.indexOf('[');\n const json = jsonStart >= 0 ? trimmed.slice(jsonStart) : trimmed;\n return JSON.parse(json) as CodexMcpServer[];\n}\n\nexport async function installCodexMcp(\n workspacePath: string,\n resolveCommand: () => Promise<ServerCommand> = resolvePacmanServerCommand,\n runner: CommandRunner = runCommand,\n): Promise<void> {\n const serverCommand = await resolveCommand();\n const fallbackCommand = formatCodexManualInstallCommand(workspacePath, serverCommand);\n\n try {\n const { stdout } = await runner('codex', ['mcp', 'list', '--json']);\n const servers = parseCodexServerList(stdout);\n\n if (servers.some((server) => server.name === MCP_SERVER_NAME)) {\n await runner('codex', ['mcp', 'remove', MCP_SERVER_NAME]);\n }\n\n await runner('codex', [\n 'mcp',\n 'add',\n MCP_SERVER_NAME,\n '--env',\n `PA_WORKSPACE=${workspacePath}`,\n '--',\n serverCommand.command,\n ...serverCommand.args,\n ]);\n } catch (err) {\n throw normalizeCodexInstallError(err, fallbackCommand);\n }\n}\n\nfunction shellQuote(value: string): string {\n if (/^[A-Za-z0-9_./:=+-]+$/.test(value)) {\n return value;\n }\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction normalizeCodexInstallError(err: unknown, fallbackCommand: string): Error {\n const code = typeof err === 'object' && err !== null && 'code' in err\n ? String((err as { code?: unknown }).code)\n : '';\n const stderr = typeof err === 'object' && err !== null && 'stderr' in err\n ? String((err as { stderr?: unknown }).stderr ?? '')\n : '';\n const message = err instanceof Error ? err.message : String(err);\n\n if (code === 'ENOENT') {\n return new Error(\n `Codex CLI was not found on PATH. Install Codex, then rerun \\`pacman mcp codex install\\`. Manual registration once Codex is available: \\`${fallbackCommand}\\``,\n );\n }\n\n const details = stderr.trim() || message;\n return new Error(\n `Unable to register the Personal Assistant MCP server with Codex. ${details} Manual fallback: \\`${fallbackCommand}\\``,\n );\n}\n\nfunction normalizeClaudeInstallError(err: unknown, fallbackCommand: string): Error {\n const code = typeof err === 'object' && err !== null && 'code' in err\n ? String((err as { code?: unknown }).code)\n : '';\n const stderr = typeof err === 'object' && err !== null && 'stderr' in err\n ? String((err as { stderr?: unknown }).stderr ?? '')\n : '';\n const message = err instanceof Error ? err.message : String(err);\n\n if (code === 'ENOENT') {\n return new Error(\n `Claude Code CLI was not found on PATH. Install Claude Code, then rerun \\`pacman mcp claude install\\`. Manual registration once Claude Code is available: \\`${fallbackCommand}\\``,\n );\n }\n\n const details = stderr.trim() || message;\n return new Error(\n `Unable to register the Personal Assistant MCP server with Claude Code. ${details} Manual fallback: \\`${fallbackCommand}\\``,\n );\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { createLocalStorage } from '@personal-assistant/storage-local';\nimport { createGDriveStorage } from '@personal-assistant/storage-gdrive';\nimport { createConfigManager } from '@personal-assistant/config-manager';\nimport { createContextManager } from '@personal-assistant/context-manager';\nimport { createIndexer } from '@personal-assistant/indexer';\nimport { createNoopEventClient } from '@personal-assistant/event-client';\nimport { validateIntegrationConfig } from '@personal-assistant/integration-runtime';\nimport type {\n AppConfig,\n GDriveStorageConfig,\n IntegrationConfig,\n StorageBackend,\n} from '@personal-assistant/core-types';\n\ntype ToolResult = {\n content: Array<{ type: 'text'; text: string }>;\n isError?: boolean;\n};\n\ntype HealthStatus = 'healthy' | 'error';\n\ninterface StorageHealth {\n status: HealthStatus;\n mode: 'local' | 'gdrive';\n summary: string;\n reason?: string;\n fix: string[];\n restart: string[];\n}\n\ninterface IntegrationHealth {\n type: IntegrationConfig['type'];\n status: HealthStatus;\n summary: string;\n reason?: string;\n fix: string[];\n restart: string[];\n}\n\ninterface StartupAlert {\n component: 'storage' | 'integration';\n name: string;\n reason: string;\n fix: string[];\n restart: string[];\n}\n\nconst DEFAULT_RESTART_STEPS = [\n 'Restart your MCP client after the configuration has been updated.',\n 'If the registered workspace path changed, rerun `pacman mcp claude install` for Claude Code or `pacman mcp codex install` for Codex before restarting.',\n];\n\nexport async function startMcpServer(workspacePath: string): Promise<void> {\n const localStore = createLocalStorage(workspacePath);\n let storage: StorageBackend = localStore;\n let configManager = createConfigManager(localStore);\n let contextManager = createContextManager(localStore);\n let indexer = createIndexer(localStore);\n const eventClient = createNoopEventClient();\n\n let bootstrapConfig: AppConfig | null = null;\n let storageReadyResolve: (() => void) | undefined;\n const storageReady = new Promise<void>((resolve) => {\n storageReadyResolve = resolve;\n });\n\n const runtimeHealth: {\n storage: StorageHealth;\n integrations: IntegrationHealth[];\n alerts: StartupAlert[];\n } = {\n storage: {\n status: 'healthy',\n mode: 'local',\n summary: `Using local workspace at ${workspacePath}`,\n fix: [],\n restart: DEFAULT_RESTART_STEPS,\n },\n integrations: [],\n alerts: [],\n };\n\n const server = new McpServer({\n name: 'personal-assistant',\n version: '0.1.0',\n });\n\n function textResult(text: string, isError = false): ToolResult {\n return {\n content: [{ type: 'text', text }],\n ...(isError ? { isError: true } : {}),\n };\n }\n\n function getStatusConfig(): AppConfig {\n return bootstrapConfig ?? {\n user: { name: '', assistantName: 'Jarvis', profileType: 'software-engineer', responsibilities: [] },\n storage: { mode: 'local', workspacePath },\n integrations: [],\n sync: {\n dailySyncTime: '09:00',\n timezone: 'UTC',\n manualSyncEnabled: false,\n asyncUpdateEnabled: false,\n },\n };\n }\n\n function addAlert(alert: StartupAlert): void {\n runtimeHealth.alerts.push(alert);\n }\n\n function setStorageFailure(\n mode: 'local' | 'gdrive',\n reason: string,\n fix: string[],\n ): void {\n runtimeHealth.storage = {\n status: 'error',\n mode,\n summary: `Unable to use ${mode} storage`,\n reason,\n fix,\n restart: DEFAULT_RESTART_STEPS,\n };\n addAlert({\n component: 'storage',\n name: mode,\n reason,\n fix,\n restart: DEFAULT_RESTART_STEPS,\n });\n }\n\n function formatSteps(label: string, steps: string[]): string {\n if (steps.length === 0) return '';\n return `${label}:\\n${steps.map((step, index) => `${index + 1}. ${step}`).join('\\n')}`;\n }\n\n function storageUnavailableMessage(): string {\n const sections = [\n `Personal Assistant MCP storage is unavailable: ${runtimeHealth.storage.reason ?? runtimeHealth.storage.summary}`,\n formatSteps('Fix', runtimeHealth.storage.fix),\n formatSteps('Restart', runtimeHealth.storage.restart),\n ].filter(Boolean);\n\n return sections.join('\\n\\n');\n }\n\n function logStartupHealth(): void {\n if (runtimeHealth.alerts.length === 0) {\n console.error(`Personal Assistant MCP ready. Storage: ${runtimeHealth.storage.mode}`);\n return;\n }\n\n console.error('Personal Assistant MCP startup alerts:');\n for (const alert of runtimeHealth.alerts) {\n console.error(`- ${alert.component} ${alert.name}: ${alert.reason}`);\n for (const step of alert.fix) {\n console.error(` Fix: ${step}`);\n }\n for (const step of alert.restart) {\n console.error(` Restart: ${step}`);\n }\n }\n }\n\n function getStorageFixSteps(mode: 'local' | 'gdrive', config?: GDriveStorageConfig): string[] {\n if (mode === 'gdrive') {\n return [\n 'Verify the Google Drive folder ID and OAuth credentials in profile/storage.json.',\n 'If the refresh token is no longer valid, reconnect Google Drive and save the updated configuration.',\n ...(config?.cachePath ? [`Ensure the local cache path exists and is writable: ${config.cachePath}`] : []),\n ];\n }\n\n return [\n `Verify that PA_WORKSPACE points to the correct workspace directory: ${workspacePath}`,\n 'Ensure the workspace directory exists and is writable.',\n 'Run `pacman init` if the workspace has not been initialized yet.',\n ];\n }\n\n function getIntegrationHealth(type: IntegrationConfig['type']): IntegrationHealth | undefined {\n return runtimeHealth.integrations.find((integration) => integration.type === type);\n }\n\n async function ensureStorageAvailable(): Promise<ToolResult | null> {\n await storageReady;\n if (runtimeHealth.storage.status === 'error') {\n return textResult(storageUnavailableMessage(), true);\n }\n return null;\n }\n\n async function resolveStorageBackend(): Promise<void> {\n bootstrapConfig = await configManager.loadConfig();\n runtimeHealth.storage.mode = bootstrapConfig.storage.mode;\n\n if (bootstrapConfig.storage.mode === 'gdrive') {\n const gdriveConfig = bootstrapConfig.storage as GDriveStorageConfig;\n const resolvedCachePath = path.isAbsolute(gdriveConfig.cachePath)\n ? gdriveConfig.cachePath\n : path.resolve(path.dirname(workspacePath), gdriveConfig.cachePath);\n\n try {\n const gdriveStorage = createGDriveStorage({\n ...gdriveConfig,\n cachePath: resolvedCachePath,\n });\n await gdriveStorage.initialize();\n\n storage = gdriveStorage;\n configManager = createConfigManager(gdriveStorage);\n contextManager = createContextManager(gdriveStorage);\n indexer = createIndexer(gdriveStorage);\n bootstrapConfig = await configManager.loadConfig();\n\n runtimeHealth.storage = {\n status: 'healthy',\n mode: 'gdrive',\n summary: `Connected to Google Drive storage${gdriveConfig.folderName ? ` (${gdriveConfig.folderName})` : ''}`,\n fix: [],\n restart: DEFAULT_RESTART_STEPS,\n };\n } catch (err) {\n setStorageFailure(\n 'gdrive',\n err instanceof Error ? err.message : String(err),\n getStorageFixSteps('gdrive', {\n ...gdriveConfig,\n cachePath: resolvedCachePath,\n }),\n );\n }\n } else {\n try {\n await fs.mkdir(workspacePath, { recursive: true });\n runtimeHealth.storage = {\n status: 'healthy',\n mode: 'local',\n summary: `Using local workspace at ${workspacePath}`,\n fix: [],\n restart: DEFAULT_RESTART_STEPS,\n };\n } catch (err) {\n setStorageFailure(\n 'local',\n err instanceof Error ? err.message : String(err),\n getStorageFixSteps('local'),\n );\n }\n }\n\n const configForIntegrations = getStatusConfig();\n runtimeHealth.integrations = [];\n for (const integration of configForIntegrations.integrations.filter((item) => item.enabled)) {\n const result = await validateIntegrationConfig(integration);\n\n if (result.ok) {\n runtimeHealth.integrations.push({\n type: integration.type,\n status: 'healthy',\n summary: result.summary ?? `Connected to ${integration.type}`,\n fix: [],\n restart: DEFAULT_RESTART_STEPS,\n });\n continue;\n }\n\n runtimeHealth.integrations.push({\n type: integration.type,\n status: 'error',\n summary: `Unable to connect to ${integration.type}`,\n reason: result.reason ?? `Unable to connect to ${integration.type}`,\n fix: result.fix ?? [],\n restart: DEFAULT_RESTART_STEPS,\n });\n addAlert({\n component: 'integration',\n name: integration.type,\n reason: result.reason ?? `Unable to connect to ${integration.type}`,\n fix: result.fix ?? [],\n restart: DEFAULT_RESTART_STEPS,\n });\n }\n\n logStartupHealth();\n }\n\n server.tool('config_get', 'Get the full application configuration', {}, async () => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n const config = await configManager.loadConfig();\n return textResult(JSON.stringify(config, null, 2));\n } catch (err) {\n return textResult(`Error loading config: ${err}`, true);\n }\n });\n\n server.tool('config_get_storage_mode', 'Get the current storage mode (local or gdrive)', {}, async () => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n const mode = await configManager.getStorageMode();\n return textResult(mode);\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n });\n\n server.tool('config_get_active_project', 'Get the currently active project name', {}, async () => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n const project = await configManager.getActiveProject();\n return textResult(project ?? 'No active project set');\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n });\n\n server.tool(\n 'config_set_active_project',\n 'Set the active project',\n { project_name: z.string().describe('The project name to set as active') },\n async ({ project_name }) => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n await configManager.setActiveProject(project_name);\n await eventClient.emitWithProject('project_selected', project_name);\n return textResult(`Active project set to: ${project_name}`);\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n },\n );\n\n server.tool('project_list', 'List all known projects', {}, async () => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n const projects = await contextManager.listProjects();\n return textResult(projects.length > 0 ? projects.join('\\n') : 'No projects found');\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n });\n\n server.tool(\n 'project_suggest',\n 'Suggest a project based on context',\n {\n hint: z.string().optional().describe('Optional hint to narrow project suggestion'),\n },\n async ({ hint }) => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n const suggestion = await contextManager.suggestProject(hint);\n if (!suggestion) {\n return textResult('No projects found to suggest');\n }\n return textResult(JSON.stringify(suggestion, null, 2));\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n },\n );\n\n server.tool(\n 'project_get_context',\n 'Get the full context for a project',\n { project_name: z.string().describe('The project name') },\n async ({ project_name }) => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n const context = await contextManager.getProjectContext(project_name);\n await eventClient.emit('mcp_query_executed', { tool: 'project_get_context' });\n\n const parts: string[] = [];\n parts.push(`# Project: ${context.name}\\n`);\n\n for (const file of context.canonicalFiles) {\n parts.push(`## ${file.path}\\n${file.content}\\n`);\n }\n\n for (const file of context.derivedFiles) {\n if (file.path.endsWith('.json')) {\n parts.push(`## ${file.path}\\n\\`\\`\\`json\\n${file.content.slice(0, 2000)}\\n\\`\\`\\`\\n`);\n } else {\n parts.push(`## ${file.path}\\n${file.content}\\n`);\n }\n }\n\n return textResult(parts.join('\\n'));\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n },\n );\n\n server.tool(\n 'context_search',\n 'Search across all context files',\n { query: z.string().describe('Search query') },\n async ({ query }) => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n const results = await indexer.search(query);\n await eventClient.emit('mcp_query_executed', { tool: 'context_search' });\n\n if (results.length === 0) {\n return textResult('No results found');\n }\n\n const text = results\n .map(\n (result) =>\n `[${result.matchType}] ${result.filePath}${result.section ? ` > ${result.section}` : ''} (score: ${result.score})\\n${result.content}\\n`,\n )\n .join('\\n---\\n');\n\n return textResult(text);\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n },\n );\n\n server.tool(\n 'context_read_file',\n 'Read a specific context file',\n { file_path: z.string().describe('Path to the context file') },\n async ({ file_path }) => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n const content = await contextManager.readFile(file_path);\n return textResult(content);\n } catch (err) {\n return textResult(`Error reading file: ${err}`, true);\n }\n },\n );\n\n server.tool(\n 'context_read_section',\n 'Read a specific section from a context file',\n {\n file_path: z.string().describe('Path to the context file'),\n section_name: z.string().describe('Name of the section to read'),\n },\n async ({ file_path, section_name }) => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n const section = await contextManager.readSection(file_path, section_name);\n if (!section) {\n return textResult(`Section \"${section_name}\" not found in ${file_path}`);\n }\n return textResult(section);\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n },\n );\n\n server.tool(\n 'context_list_recent_updates',\n 'List recent context update proposals',\n { limit: z.number().optional().describe('Maximum number of updates to return') },\n async ({ limit }) => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n const updates = await contextManager.listRecentUpdates(limit ?? 10);\n if (updates.length === 0) {\n return textResult('No recent updates');\n }\n return textResult(JSON.stringify(updates, null, 2));\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n },\n );\n\n server.tool(\n 'context_get_daily_summary',\n 'Get the daily summary for a specific date',\n { date: z.string().optional().describe('Date in YYYY-MM-DD format (defaults to today)') },\n async ({ date }) => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n const summary = await contextManager.getDailySummary(date);\n if (!summary) {\n return textResult(`No daily summary found for ${date ?? 'today'}`);\n }\n return textResult(summary);\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n },\n );\n\n server.tool(\n 'context_propose_update',\n 'Propose an update to a context file',\n {\n target_file: z.string().describe('Path to the target file'),\n section: z.string().optional().describe('Section name to update (omit for full file)'),\n proposed_content: z.string().describe('The proposed new content'),\n reason: z.string().describe('Reason for the update'),\n },\n async ({ target_file, section, proposed_content, reason }) => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n const proposal = await contextManager.proposeUpdate({\n targetFile: target_file,\n section,\n proposedContent: proposed_content,\n reason,\n });\n await eventClient.emit('context_update_proposed');\n return textResult(\n `Update proposal created: ${proposal.id}\\nTarget: ${proposal.targetFile}\\nReason: ${proposal.reason}\\nStatus: ${proposal.status}`,\n );\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n },\n );\n\n server.tool(\n 'context_apply_update',\n 'Apply a pending update proposal',\n { proposal_id: z.string().describe('ID of the proposal to apply') },\n async ({ proposal_id }) => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n const applied = await contextManager.applyUpdate(proposal_id);\n await eventClient.emit('context_update_applied');\n return textResult(\n `Update applied: ${applied.id}\\nTarget: ${applied.targetFile}\\nApplied at: ${applied.appliedAt}`,\n );\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n },\n );\n\n server.tool(\n 'context_append_note',\n 'Append a note to a project context file',\n {\n project_name: z.string().describe('The project name'),\n note: z.string().describe('The note to append'),\n },\n async ({ project_name, note }) => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n await contextManager.appendNote(project_name, note);\n return textResult(`Note appended to project: ${project_name}`);\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n },\n );\n\n server.tool('context_rebuild_indexes', 'Rebuild all context indexes', {}, async () => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n await indexer.buildIndexes();\n return textResult('Indexes rebuilt successfully');\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n });\n\n server.tool(\n 'session_end',\n 'End the current session: force-apply all pending proposals, save session notes, rebuild indexes, and clear the active project',\n {\n project_name: z.string().optional().describe('The active project name'),\n session_notes: z.string().optional().describe('Summary of what was learned or decided during this session'),\n },\n async ({ project_name, session_notes }) => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n const results: string[] = [];\n\n const appliedIds = await contextManager.applyAllPending();\n if (appliedIds.length > 0) {\n results.push(`Applied ${appliedIds.length} pending proposal(s): ${appliedIds.join(', ')}`);\n } else {\n results.push('No pending proposals to apply.');\n }\n\n if (session_notes && project_name) {\n await contextManager.appendNote(project_name, session_notes);\n results.push(`Session notes saved to project: ${project_name}`);\n }\n\n await indexer.buildIndexes();\n results.push('Indexes rebuilt.');\n\n await configManager.setActiveProject('');\n results.push('Active project cleared.');\n\n const timestamp = new Date().toISOString();\n const logEntry = `[${timestamp}] Session ended for project \"${project_name ?? 'none'}\". Applied ${appliedIds.length} proposals.\\n`;\n await storage.append('logs/audit.log', logEntry);\n\n return textResult(`Session ended successfully.\\n\\n${results.join('\\n')}`);\n } catch (err) {\n return textResult(`Error ending session: ${err}`, true);\n }\n },\n );\n\n server.tool('sync_run_now', 'Trigger an immediate sync', {}, async () => {\n const unavailable = await ensureStorageAvailable();\n if (unavailable) return unavailable;\n try {\n await indexer.buildIndexes();\n return textResult('Sync completed. Indexes rebuilt.');\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n });\n\n server.tool('sync_status', 'Get the current sync status', {}, async () => {\n await storageReady;\n try {\n const config = getStatusConfig();\n const integrations = config.integrations\n .filter((integration) => integration.enabled)\n .map((integration) => {\n const health = getIntegrationHealth(integration.type);\n return {\n type: integration.type,\n lastSyncAt: integration.lastSyncAt ?? 'never',\n cursor: integration.cursor ?? 'none',\n connectionStatus: health?.status ?? 'healthy',\n connectionSummary: health?.summary ?? `No startup health check recorded for ${integration.type}`,\n connectionReason: health?.reason ?? null,\n fix: health?.fix ?? [],\n restart: health?.restart ?? DEFAULT_RESTART_STEPS,\n };\n });\n\n const status = {\n syncTime: config.sync.dailySyncTime,\n timezone: config.sync.timezone,\n storage: {\n mode: runtimeHealth.storage.mode,\n status: runtimeHealth.storage.status,\n summary: runtimeHealth.storage.summary,\n reason: runtimeHealth.storage.reason ?? null,\n fix: runtimeHealth.storage.fix,\n restart: runtimeHealth.storage.restart,\n },\n integrations,\n alerts: runtimeHealth.alerts,\n };\n\n return textResult(JSON.stringify(status, null, 2));\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n });\n\n server.tool('sync_list_integrations', 'List all configured integrations', {}, async () => {\n await storageReady;\n try {\n const config = getStatusConfig();\n const list = config.integrations.map((integration) => {\n const health = getIntegrationHealth(integration.type);\n const connection = health\n ? health.status === 'healthy'\n ? `healthy - ${health.summary}`\n : `error - ${health.reason ?? health.summary}`\n : 'not checked';\n return `${integration.type}: ${integration.enabled ? 'enabled' : 'disabled'} (connection: ${connection}; last sync: ${integration.lastSyncAt ?? 'never'})`;\n });\n\n return textResult(list.join('\\n') || 'No integrations configured');\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n });\n\n server.tool(\n 'events_ping',\n 'Emit a metadata-only event',\n {\n event_name: z.string().describe('Name of the event'),\n metadata: z.record(z.string()).optional().describe('Optional metadata key-value pairs'),\n },\n async ({ event_name, metadata }) => {\n await storageReady;\n try {\n await eventClient.emit(event_name as any, metadata);\n return textResult(`Event emitted: ${event_name}`);\n } catch (err) {\n return textResult(`Error: ${err}`, true);\n }\n },\n );\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n await resolveStorageBackend();\n storageReadyResolve?.();\n}\n"],"mappings":"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","names":["fs","path","resolve"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createConfigManager,
|
|
3
|
+
createGDriveStorage,
|
|
4
|
+
createLocalStorage
|
|
5
|
+
} from "./chunk-TRQIZP6Z.js";
|
|
6
|
+
|
|
7
|
+
// src/storage.ts
|
|
8
|
+
import * as path from "path";
|
|
9
|
+
async function resolveConfiguredStorage(workspacePath) {
|
|
10
|
+
const localStore = createLocalStorage(workspacePath);
|
|
11
|
+
const localConfigManager = createConfigManager(localStore);
|
|
12
|
+
const localConfig = await localConfigManager.loadConfig();
|
|
13
|
+
if (localConfig.storage.mode !== "gdrive") {
|
|
14
|
+
return {
|
|
15
|
+
config: localConfig,
|
|
16
|
+
storage: localStore
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const gdriveConfig = localConfig.storage;
|
|
20
|
+
const resolvedCachePath = path.isAbsolute(gdriveConfig.cachePath) ? gdriveConfig.cachePath : path.resolve(path.dirname(workspacePath), gdriveConfig.cachePath);
|
|
21
|
+
const gdriveStorage = createGDriveStorage({
|
|
22
|
+
...gdriveConfig,
|
|
23
|
+
cachePath: resolvedCachePath
|
|
24
|
+
});
|
|
25
|
+
await gdriveStorage.initialize();
|
|
26
|
+
const gdriveConfigManager = createConfigManager(gdriveStorage);
|
|
27
|
+
const gdriveResolvedConfig = await gdriveConfigManager.loadConfig();
|
|
28
|
+
return {
|
|
29
|
+
config: gdriveResolvedConfig,
|
|
30
|
+
storage: gdriveStorage
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export {
|
|
35
|
+
resolveConfiguredStorage
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=chunk-FH6ZHWGR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage.ts"],"sourcesContent":["import * as path from 'node:path';\nimport { createLocalStorage } from '@personal-assistant/storage-local';\nimport { createGDriveStorage } from '@personal-assistant/storage-gdrive';\nimport { createConfigManager } from '@personal-assistant/config-manager';\nimport type {\n AppConfig,\n StorageBackend,\n GDriveStorageConfig,\n} from '@personal-assistant/core-types';\n\nexport async function resolveConfiguredStorage(\n workspacePath: string,\n): Promise<{\n config: AppConfig;\n storage: StorageBackend;\n}> {\n const localStore = createLocalStorage(workspacePath);\n const localConfigManager = createConfigManager(localStore);\n const localConfig = await localConfigManager.loadConfig();\n\n if (localConfig.storage.mode !== 'gdrive') {\n return {\n config: localConfig,\n storage: localStore,\n };\n }\n\n const gdriveConfig = localConfig.storage as GDriveStorageConfig;\n const resolvedCachePath = path.isAbsolute(gdriveConfig.cachePath)\n ? gdriveConfig.cachePath\n : path.resolve(path.dirname(workspacePath), gdriveConfig.cachePath);\n\n const gdriveStorage = createGDriveStorage({\n ...gdriveConfig,\n cachePath: resolvedCachePath,\n });\n await gdriveStorage.initialize();\n\n const gdriveConfigManager = createConfigManager(gdriveStorage);\n const gdriveResolvedConfig = await gdriveConfigManager.loadConfig();\n\n return {\n config: gdriveResolvedConfig,\n storage: gdriveStorage,\n };\n}\n"],"mappings":";;;;;;;AAAA,YAAY,UAAU;AAUtB,eAAsB,yBACpB,eAIC;AACD,QAAM,aAAa,mBAAmB,aAAa;AACnD,QAAM,qBAAqB,oBAAoB,UAAU;AACzD,QAAM,cAAc,MAAM,mBAAmB,WAAW;AAExD,MAAI,YAAY,QAAQ,SAAS,UAAU;AACzC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,eAAe,YAAY;AACjC,QAAM,oBAAyB,gBAAW,aAAa,SAAS,IAC5D,aAAa,YACR,aAAa,aAAQ,aAAa,GAAG,aAAa,SAAS;AAEpE,QAAM,gBAAgB,oBAAoB;AAAA,IACxC,GAAG;AAAA,IACH,WAAW;AAAA,EACb,CAAC;AACD,QAAM,cAAc,WAAW;AAE/B,QAAM,sBAAsB,oBAAoB,aAAa;AAC7D,QAAM,uBAAuB,MAAM,oBAAoB,WAAW;AAElE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF;","names":[]}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// src/provider-runtime.ts
|
|
2
|
+
var OPENAI_BASE_URL = "https://api.openai.com/v1";
|
|
3
|
+
var ANTHROPIC_BASE_URL = "https://api.anthropic.com/v1";
|
|
4
|
+
async function validateProviderConfig(provider, apiKey, model) {
|
|
5
|
+
if (!apiKey.trim()) {
|
|
6
|
+
return { valid: false, error: `${provider} API key is required` };
|
|
7
|
+
}
|
|
8
|
+
try {
|
|
9
|
+
if (provider === "openai") {
|
|
10
|
+
const res2 = await fetch(`${OPENAI_BASE_URL}/models`, {
|
|
11
|
+
headers: { Authorization: `Bearer ${apiKey}` }
|
|
12
|
+
});
|
|
13
|
+
if (!res2.ok) {
|
|
14
|
+
return { valid: false, error: `OpenAI validation failed: ${res2.statusText}` };
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
valid: true,
|
|
18
|
+
info: model ? `OpenAI configured (${model})` : "OpenAI configured"
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const res = await fetch(`${ANTHROPIC_BASE_URL}/models`, {
|
|
22
|
+
headers: {
|
|
23
|
+
"x-api-key": apiKey,
|
|
24
|
+
"anthropic-version": "2023-06-01"
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
if (!res.ok) {
|
|
28
|
+
return { valid: false, error: `Anthropic validation failed: ${res.statusText}` };
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
valid: true,
|
|
32
|
+
info: model ? `Anthropic configured (${model})` : "Anthropic configured"
|
|
33
|
+
};
|
|
34
|
+
} catch (err) {
|
|
35
|
+
return {
|
|
36
|
+
valid: false,
|
|
37
|
+
error: err instanceof Error ? err.message : String(err)
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function generateDraft(provider, model, providers, input) {
|
|
42
|
+
const instructions = 'You are Atlas, a privacy-aware project assistant. Return only valid JSON with keys: outcome, draftText, citations, missingFacts, escalationOwner, confidence. Use all provided evidence, including project summaries, derived context, and relevant raw context. Use outcome="abstain" when the evidence is insufficient or conflicting. Never invent facts. Keep draftText concise and ready for Slack.';
|
|
43
|
+
const serializedInput = JSON.stringify(input, null, 2);
|
|
44
|
+
if (provider === "openai") {
|
|
45
|
+
const apiKey2 = providers?.openai?.apiKey;
|
|
46
|
+
if (!apiKey2) throw new Error("OpenAI is not configured");
|
|
47
|
+
const response2 = await fetch(`${providers?.openai?.baseUrl ?? OPENAI_BASE_URL}/chat/completions`, {
|
|
48
|
+
method: "POST",
|
|
49
|
+
headers: {
|
|
50
|
+
Authorization: `Bearer ${apiKey2}`,
|
|
51
|
+
"Content-Type": "application/json"
|
|
52
|
+
},
|
|
53
|
+
body: JSON.stringify({
|
|
54
|
+
model,
|
|
55
|
+
temperature: 0.2,
|
|
56
|
+
response_format: { type: "json_object" },
|
|
57
|
+
messages: [
|
|
58
|
+
{ role: "system", content: instructions },
|
|
59
|
+
{ role: "user", content: serializedInput }
|
|
60
|
+
]
|
|
61
|
+
})
|
|
62
|
+
});
|
|
63
|
+
if (!response2.ok) {
|
|
64
|
+
throw new Error(`OpenAI draft generation failed: ${response2.statusText}`);
|
|
65
|
+
}
|
|
66
|
+
const data2 = await response2.json();
|
|
67
|
+
return normalizeDraftOutput(data2.choices?.[0]?.message?.content);
|
|
68
|
+
}
|
|
69
|
+
const apiKey = providers?.anthropic?.apiKey;
|
|
70
|
+
if (!apiKey) throw new Error("Anthropic is not configured");
|
|
71
|
+
const response = await fetch(`${providers?.anthropic?.baseUrl ?? ANTHROPIC_BASE_URL}/messages`, {
|
|
72
|
+
method: "POST",
|
|
73
|
+
headers: {
|
|
74
|
+
"x-api-key": apiKey,
|
|
75
|
+
"anthropic-version": "2023-06-01",
|
|
76
|
+
"Content-Type": "application/json"
|
|
77
|
+
},
|
|
78
|
+
body: JSON.stringify({
|
|
79
|
+
model,
|
|
80
|
+
max_tokens: 900,
|
|
81
|
+
temperature: 0.2,
|
|
82
|
+
system: instructions,
|
|
83
|
+
messages: [
|
|
84
|
+
{ role: "user", content: serializedInput }
|
|
85
|
+
]
|
|
86
|
+
})
|
|
87
|
+
});
|
|
88
|
+
if (!response.ok) {
|
|
89
|
+
throw new Error(`Anthropic draft generation failed: ${response.statusText}`);
|
|
90
|
+
}
|
|
91
|
+
const data = await response.json();
|
|
92
|
+
const text = data.content?.find((entry) => entry.type === "text")?.text;
|
|
93
|
+
return normalizeDraftOutput(text);
|
|
94
|
+
}
|
|
95
|
+
function normalizeDraftOutput(rawContent) {
|
|
96
|
+
const parsed = parseJsonObject(rawContent);
|
|
97
|
+
if (!parsed || typeof parsed !== "object") {
|
|
98
|
+
return {
|
|
99
|
+
outcome: "draft",
|
|
100
|
+
draftText: rawContent?.trim() || "No draft returned by provider.",
|
|
101
|
+
citations: [],
|
|
102
|
+
missingFacts: [],
|
|
103
|
+
confidence: "medium"
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
outcome: parsed.outcome === "abstain" ? "abstain" : "draft",
|
|
108
|
+
draftText: typeof parsed.draftText === "string" ? parsed.draftText.trim() : "",
|
|
109
|
+
citations: Array.isArray(parsed.citations) ? parsed.citations.map(String) : [],
|
|
110
|
+
missingFacts: Array.isArray(parsed.missingFacts) ? parsed.missingFacts.map(String) : [],
|
|
111
|
+
escalationOwner: typeof parsed.escalationOwner === "string" ? parsed.escalationOwner : void 0,
|
|
112
|
+
confidence: parsed.confidence === "high" || parsed.confidence === "low" ? parsed.confidence : "medium"
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function parseJsonObject(rawContent) {
|
|
116
|
+
if (!rawContent) return null;
|
|
117
|
+
try {
|
|
118
|
+
return JSON.parse(rawContent);
|
|
119
|
+
} catch {
|
|
120
|
+
}
|
|
121
|
+
const start = rawContent.indexOf("{");
|
|
122
|
+
const end = rawContent.lastIndexOf("}");
|
|
123
|
+
if (start === -1 || end === -1 || end <= start) {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
return JSON.parse(rawContent.slice(start, end + 1));
|
|
128
|
+
} catch {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export {
|
|
134
|
+
validateProviderConfig,
|
|
135
|
+
generateDraft
|
|
136
|
+
};
|
|
137
|
+
//# sourceMappingURL=chunk-O6T35A4O.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/provider-runtime.ts"],"sourcesContent":["import type {\n DraftOutput,\n LlmProvider,\n LlmProvidersConfig,\n ReplyInput,\n} from '@personal-assistant/core-types';\n\nconst OPENAI_BASE_URL = 'https://api.openai.com/v1';\nconst ANTHROPIC_BASE_URL = 'https://api.anthropic.com/v1';\n\nexport interface ProviderValidationResult {\n valid: boolean;\n info?: string;\n error?: string;\n}\n\nexport async function validateProviderConfig(\n provider: LlmProvider,\n apiKey: string,\n model?: string,\n): Promise<ProviderValidationResult> {\n if (!apiKey.trim()) {\n return { valid: false, error: `${provider} API key is required` };\n }\n\n try {\n if (provider === 'openai') {\n const res = await fetch(`${OPENAI_BASE_URL}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n });\n if (!res.ok) {\n return { valid: false, error: `OpenAI validation failed: ${res.statusText}` };\n }\n return {\n valid: true,\n info: model ? `OpenAI configured (${model})` : 'OpenAI configured',\n };\n }\n\n const res = await fetch(`${ANTHROPIC_BASE_URL}/models`, {\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n });\n if (!res.ok) {\n return { valid: false, error: `Anthropic validation failed: ${res.statusText}` };\n }\n return {\n valid: true,\n info: model ? `Anthropic configured (${model})` : 'Anthropic configured',\n };\n } catch (err) {\n return {\n valid: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nexport async function generateDraft(\n provider: LlmProvider,\n model: string,\n providers: LlmProvidersConfig | undefined,\n input: ReplyInput,\n): Promise<DraftOutput> {\n const instructions =\n 'You are Atlas, a privacy-aware project assistant. Return only valid JSON with keys: ' +\n 'outcome, draftText, citations, missingFacts, escalationOwner, confidence. ' +\n 'Use all provided evidence, including project summaries, derived context, and relevant raw context. ' +\n 'Use outcome=\"abstain\" when the evidence is insufficient or conflicting. ' +\n 'Never invent facts. Keep draftText concise and ready for Slack.';\n\n const serializedInput = JSON.stringify(input, null, 2);\n\n if (provider === 'openai') {\n const apiKey = providers?.openai?.apiKey;\n if (!apiKey) throw new Error('OpenAI is not configured');\n\n const response = await fetch(`${providers?.openai?.baseUrl ?? OPENAI_BASE_URL}/chat/completions`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model,\n temperature: 0.2,\n response_format: { type: 'json_object' },\n messages: [\n { role: 'system', content: instructions },\n { role: 'user', content: serializedInput },\n ],\n }),\n });\n\n if (!response.ok) {\n throw new Error(`OpenAI draft generation failed: ${response.statusText}`);\n }\n\n const data = await response.json() as {\n choices?: Array<{\n message?: {\n content?: string;\n };\n }>;\n };\n\n return normalizeDraftOutput(data.choices?.[0]?.message?.content);\n }\n\n const apiKey = providers?.anthropic?.apiKey;\n if (!apiKey) throw new Error('Anthropic is not configured');\n\n const response = await fetch(`${providers?.anthropic?.baseUrl ?? ANTHROPIC_BASE_URL}/messages`, {\n method: 'POST',\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model,\n max_tokens: 900,\n temperature: 0.2,\n system: instructions,\n messages: [\n { role: 'user', content: serializedInput },\n ],\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Anthropic draft generation failed: ${response.statusText}`);\n }\n\n const data = await response.json() as {\n content?: Array<{\n type: string;\n text?: string;\n }>;\n };\n\n const text = data.content?.find((entry) => entry.type === 'text')?.text;\n return normalizeDraftOutput(text);\n}\n\nfunction normalizeDraftOutput(rawContent: string | undefined): DraftOutput {\n const parsed = parseJsonObject(rawContent);\n if (!parsed || typeof parsed !== 'object') {\n return {\n outcome: 'draft',\n draftText: rawContent?.trim() || 'No draft returned by provider.',\n citations: [],\n missingFacts: [],\n confidence: 'medium',\n };\n }\n\n return {\n outcome: parsed.outcome === 'abstain' ? 'abstain' : 'draft',\n draftText: typeof parsed.draftText === 'string' ? parsed.draftText.trim() : '',\n citations: Array.isArray(parsed.citations) ? parsed.citations.map(String) : [],\n missingFacts: Array.isArray(parsed.missingFacts) ? parsed.missingFacts.map(String) : [],\n escalationOwner: typeof parsed.escalationOwner === 'string' ? parsed.escalationOwner : undefined,\n confidence:\n parsed.confidence === 'high' || parsed.confidence === 'low'\n ? parsed.confidence\n : 'medium',\n };\n}\n\nfunction parseJsonObject(rawContent: string | undefined): Record<string, unknown> | null {\n if (!rawContent) return null;\n\n try {\n return JSON.parse(rawContent) as Record<string, unknown>;\n } catch {\n // Some providers may wrap JSON in prose; recover the first JSON object.\n }\n\n const start = rawContent.indexOf('{');\n const end = rawContent.lastIndexOf('}');\n if (start === -1 || end === -1 || end <= start) {\n return null;\n }\n\n try {\n return JSON.parse(rawContent.slice(start, end + 1)) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":["res","apiKey","response","data"]}
|