@promptev/context-engine 0.0.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.
Files changed (68) hide show
  1. package/LICENSE.md +202 -0
  2. package/NOTICE +17 -0
  3. package/README.md +112 -0
  4. package/dist/cli.js +11998 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config-Bl9U789m.d.cts +174 -0
  7. package/dist/config-Bt9bUQqU.d.ts +174 -0
  8. package/dist/embeddings-B-jZ42mk.d.cts +67 -0
  9. package/dist/embeddings-DaSdAZN3.d.ts +67 -0
  10. package/dist/express.cjs +3173 -0
  11. package/dist/express.cjs.map +1 -0
  12. package/dist/express.d.cts +24 -0
  13. package/dist/express.d.ts +24 -0
  14. package/dist/express.js +3170 -0
  15. package/dist/express.js.map +1 -0
  16. package/dist/fastify.cjs +3184 -0
  17. package/dist/fastify.cjs.map +1 -0
  18. package/dist/fastify.d.cts +16 -0
  19. package/dist/fastify.d.ts +16 -0
  20. package/dist/fastify.js +3181 -0
  21. package/dist/fastify.js.map +1 -0
  22. package/dist/governance-BDkcv4qZ.d.cts +79 -0
  23. package/dist/governance-XIScatRO.d.ts +79 -0
  24. package/dist/graph/index.cjs +1428 -0
  25. package/dist/graph/index.cjs.map +1 -0
  26. package/dist/graph/index.d.cts +104 -0
  27. package/dist/graph/index.d.ts +104 -0
  28. package/dist/graph/index.js +1413 -0
  29. package/dist/graph/index.js.map +1 -0
  30. package/dist/hono.cjs +3183 -0
  31. package/dist/hono.cjs.map +1 -0
  32. package/dist/hono.d.cts +39 -0
  33. package/dist/hono.d.ts +39 -0
  34. package/dist/hono.js +3179 -0
  35. package/dist/hono.js.map +1 -0
  36. package/dist/index.cjs +11731 -0
  37. package/dist/index.cjs.map +1 -0
  38. package/dist/index.d.cts +851 -0
  39. package/dist/index.d.ts +851 -0
  40. package/dist/index.js +11676 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/mcp.cjs +181 -0
  43. package/dist/mcp.cjs.map +1 -0
  44. package/dist/mcp.d.cts +26 -0
  45. package/dist/mcp.d.ts +26 -0
  46. package/dist/mcp.js +179 -0
  47. package/dist/mcp.js.map +1 -0
  48. package/dist/migrations/sql/0001.sql +119 -0
  49. package/dist/migrations/sql/0002_graph.sql +48 -0
  50. package/dist/migrations/sql/0003_tools.sql +61 -0
  51. package/dist/migrations/sql/0004_acl_indexes.sql +4 -0
  52. package/dist/redaction-BmDSWJ7h.d.cts +98 -0
  53. package/dist/redaction-BmDSWJ7h.d.ts +98 -0
  54. package/dist/redaction-presidio.cjs +79 -0
  55. package/dist/redaction-presidio.cjs.map +1 -0
  56. package/dist/redaction-presidio.d.cts +22 -0
  57. package/dist/redaction-presidio.d.ts +22 -0
  58. package/dist/redaction-presidio.js +73 -0
  59. package/dist/redaction-presidio.js.map +1 -0
  60. package/dist/router-CrxZ2y_Z.d.ts +82 -0
  61. package/dist/router-OPgSoYAB.d.cts +82 -0
  62. package/dist/skills/context-engine/SKILL.md +160 -0
  63. package/package.json +184 -0
  64. package/src/migrations/sql/0001.sql +119 -0
  65. package/src/migrations/sql/0002_graph.sql +48 -0
  66. package/src/migrations/sql/0003_tools.sql +61 -0
  67. package/src/migrations/sql/0004_acl_indexes.sql +4 -0
  68. package/src/skills/context-engine/SKILL.md +160 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/tools/executors/db.ts","../src/fastify.ts","../src/sentinels.ts","../src/routing-core.ts","../src/tools/router.ts","../src/tools/acl.ts","../src/tools/approval.ts","../src/tools/config.ts","../src/version.ts","../src/tools/executors/mcp-client.ts","../src/tools/governance.ts","../src/hooks.ts","../src/crypto.ts","../src/redaction.ts","../src/tools/audit.ts","../src/tools/executors/http.ts","../src/tools/registry.ts","../src/tools/mcp-oauth.ts"],"names":["require","createRequire","z","randomUUID","msg","randomBytes","createCipheriv","createDecipheriv","createHmac","UUID_RE","contentType","note","testConnection","createHash"],"mappings":"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","file":"fastify.cjs","sourcesContent":["/** Action-surface errors — user-facing / data-dependent failures (not found, ACL, bad input).\n * Config/programming errors stay as TypeError / RangeError / Error.\n */\nexport class EngineActionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"EngineActionError\";\n }\n}\n\n/** Missing vs forbidden document: identical message so callers cannot distinguish. */\nexport class DocumentNotFoundError extends Error {\n constructor(documentId: string) {\n super(`document not found: ${documentId}`);\n this.name = \"DocumentNotFoundError\";\n }\n}\n\nexport class GraphLegUnavailable extends Error {\n constructor(message = \"graph ranked list was not supplied\") {\n super(message);\n this.name = \"GraphLegUnavailable\";\n }\n}\n\nexport class ApprovalNotPending extends Error {\n constructor(message = \"approval is not pending\") {\n super(message);\n this.name = \"ApprovalNotPending\";\n }\n}\n\nexport class ApprovalExpired extends Error {\n constructor(message = \"approval has expired\") {\n super(message);\n this.name = \"ApprovalExpired\";\n }\n}\n\nexport class CodeExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CodeExecutionError\";\n }\n}\n\nexport class CodeExecutionTimeout extends Error {\n constructor(message = \"code execution timed out\") {\n super(message);\n this.name = \"CodeExecutionTimeout\";\n }\n}\n\nexport class ExtraMissingError extends Error {\n constructor(extra: string, pkg: string, what: string) {\n super(`${what} requires the '${pkg}' package (optional extra: ${extra}): npm install ${pkg}`);\n this.name = \"ExtraMissingError\";\n }\n}\n","import { createRequire } from \"node:module\";\nimport { ExtraMissingError } from \"../../errors.js\";\n\nconst require = createRequire(import.meta.url);\n\nexport const MAX_ROWS = 1000;\nconst CONNECT_TIMEOUT = 10;\nconst QUERY_TIMEOUT_MS = 30_000;\n\nconst ALWAYS_BLOCKED = [\"GRANT\", \"REVOKE\"] as const;\nconst READONLY_BLOCKED = [\"INSERT\", \"UPDATE\", \"DELETE\", \"DROP\", \"ALTER\", \"CREATE\", \"TRUNCATE\"] as const;\nconst READWRITE_BLOCKED = [\"DELETE\", \"DROP\", \"TRUNCATE\"] as const;\nconst ALLOWED_ACCESS_MODES = [\"readonly\", \"readwrite\", \"full\"] as const;\ntype AccessMode = (typeof ALLOWED_ACCESS_MODES)[number];\n\nconst SQL_NOISE_RE = /'(?:[^']|'')*'|\\$([A-Za-z_]\\w*)?\\$.*?\\$\\1?\\$|--[^\\n]*|\\/\\*[\\s\\S]*?\\*\\//g;\n\nexport function stripSqlNoise(sql: string): string {\n return sql.replace(SQL_NOISE_RE, (m) => \" \".repeat(m.length));\n}\n\nfunction hasKeyword(sqlUpper: string, keyword: string): boolean {\n return new RegExp(`\\\\b${keyword}\\\\b`).test(sqlUpper);\n}\n\nexport function buildConnectionUrl(config: Record<string, unknown>): string {\n const engine = String(config.engine ?? \"postgresql\");\n if (engine === \"sqlite\") return `sqlite:///${config.database ?? \"\"}`;\n\n const host = String(config.host ?? \"localhost\");\n const port = Number(config.port ?? 5432);\n const database = String(config.database ?? \"\");\n const username = String(config.username ?? \"\");\n const password = encodeURIComponent(String(config.password ?? \"\"));\n\n if (engine === \"oracle\") {\n const serviceName = String(config.service_name ?? database);\n return `oracle://${username}:${password}@${host}:${port}/?service_name=${serviceName}`;\n }\n if (engine === \"snowflake\") {\n const schemaName = String(config.schema_name ?? \"PUBLIC\");\n const warehouse = String(config.warehouse ?? \"\");\n let url = `snowflake://${username}:${password}@${host}/${database}/${schemaName}`;\n if (warehouse) url += `?warehouse=${warehouse}`;\n return url;\n }\n if (engine === \"clickhouse\") {\n const secure = [9440, 8443, 443].includes(port);\n return `clickhouse://${username}:${password}@${host}:${port}/${database}${secure ? \"?secure=True\" : \"\"}`;\n }\n if (engine === \"mysql\" || engine === \"mariadb\") {\n return `mysql://${username}:${password}@${host}:${port}/${database}`;\n }\n if (engine === \"mssql\") {\n return `mssql://${username}:${password}@${host}:${port}/${database}`;\n }\n return `postgresql://${username}:${password}@${host}:${port}/${database}`;\n}\n\nfunction rowsToText(rows: Array<Record<string, unknown>>): string {\n if (!rows.length) return \"\";\n const columns = Object.keys(rows[0]!);\n const lines = [columns.join(\"\\t\")];\n for (const row of rows) {\n lines.push(columns.map((col) => String(row[col] ?? \"\")).join(\"\\t\"));\n }\n return lines.join(\"\\n\");\n}\n\ntype QueryResult = {\n columns: string[];\n rows: Array<Record<string, unknown>>;\n rowCount: number;\n};\n\nasync function runOnPostgres(\n config: Record<string, unknown>,\n sql: string,\n maxRows: number,\n readOnly = false,\n): Promise<QueryResult> {\n let pg: typeof import(\"pg\");\n try {\n pg = require(\"pg\") as typeof import(\"pg\");\n } catch {\n throw new ExtraMissingError(\"postgres\", \"pg\", \"database tool executor\");\n }\n const url = buildConnectionUrl({ ...config, engine: \"postgresql\" });\n const client = new pg.Client({\n connectionString: url,\n connectionTimeoutMillis: CONNECT_TIMEOUT * 1000,\n statement_timeout: QUERY_TIMEOUT_MS,\n });\n await client.connect();\n try {\n await client.query(\"BEGIN\");\n if (readOnly) {\n try {\n await client.query(\"SET TRANSACTION READ ONLY\");\n } catch (exc) {\n await client.query(\"ROLLBACK\");\n console.warn(\n \"[context-engine] db executor: engine rejected SET TRANSACTION READ ONLY; \" +\n \"read-only mode is enforced by statement inspection alone for this query\",\n exc,\n );\n await client.query(\"BEGIN\");\n }\n }\n const result = await client.query(sql);\n await client.query(\"COMMIT\");\n const columns = result.fields?.map((f) => f.name) ?? (result.rows[0] ? Object.keys(result.rows[0]) : []);\n const rows = result.rows.slice(0, maxRows).map((r) => ({ ...r }));\n return { columns, rows, rowCount: result.rowCount ?? rows.length };\n } catch (e) {\n try {\n await client.query(\"ROLLBACK\");\n } catch {\n /* ignore */\n }\n throw e;\n } finally {\n await client.end();\n }\n}\n\nasync function runOnMysql(\n config: Record<string, unknown>,\n sql: string,\n maxRows: number,\n): Promise<QueryResult> {\n let mysql: {\n createConnection: (opts: Record<string, unknown>) => Promise<{\n query: (sql: string) => Promise<[unknown[], { name: string }[]]>;\n end: () => Promise<void>;\n }>;\n };\n try {\n mysql = require(\"mysql2/promise\");\n } catch {\n throw new ExtraMissingError(\"mysql\", \"mysql2\", \"MySQL/MariaDB tool executor\");\n }\n const conn = await mysql.createConnection({\n host: config.host ?? \"localhost\",\n port: Number(config.port ?? 3306),\n user: config.username ?? \"\",\n password: config.password ?? \"\",\n database: config.database ?? \"\",\n connectTimeout: CONNECT_TIMEOUT * 1000,\n });\n try {\n const [rows, fields] = await conn.query(sql);\n const list = Array.isArray(rows) ? (rows as Array<Record<string, unknown>>) : [];\n const columns = (fields ?? []).map((f) => f.name);\n return { columns, rows: list.slice(0, maxRows), rowCount: list.length };\n } finally {\n await conn.end();\n }\n}\n\nasync function executeRaw(\n config: Record<string, unknown>,\n sql: string,\n maxRows: number,\n readOnly = false,\n): Promise<QueryResult> {\n const engine = String(config.engine ?? \"postgresql\");\n if (engine === \"postgresql\") return runOnPostgres(config, sql, maxRows, readOnly);\n if (engine === \"mysql\" || engine === \"mariadb\") return runOnMysql(config, sql, maxRows);\n throw new Error(\n `db executor: engine ${JSON.stringify(engine)} is not supported in the JS port ` +\n `(supported: postgresql, mysql, mariadb)`,\n );\n}\n\nexport function executeQuery(\n config: Record<string, unknown>,\n sql: string,\n maxRows: number = MAX_ROWS,\n accessMode: string = \"readonly\",\n): Promise<Record<string, unknown>> {\n return executeQueryAsync(config, sql, maxRows, accessMode);\n}\n\nasync function executeQueryAsync(\n config: Record<string, unknown>,\n sql: string,\n maxRows: number,\n accessModeRaw: string,\n): Promise<Record<string, unknown>> {\n const accessMode = (accessModeRaw || \"readonly\") as AccessMode;\n if (!(ALLOWED_ACCESS_MODES as readonly string[]).includes(accessMode)) {\n throw new Error(\n `Invalid access_mode ${JSON.stringify(accessModeRaw)}; must be one of ${ALLOWED_ACCESS_MODES}`,\n );\n }\n\n const sqlUpper = stripSqlNoise(sql).trim().toUpperCase();\n\n for (const keyword of ALWAYS_BLOCKED) {\n if (hasKeyword(sqlUpper, keyword)) {\n return { success: false, error: `${keyword} queries are not allowed` };\n }\n }\n\n if (accessMode === \"readonly\") {\n if (!sqlUpper.startsWith(\"SELECT\") && !sqlUpper.startsWith(\"WITH\")) {\n return { success: false, error: \"Only SELECT queries are allowed in read-only mode\" };\n }\n for (const keyword of READONLY_BLOCKED) {\n if (hasKeyword(sqlUpper, keyword)) {\n return { success: false, error: `${keyword} queries are not allowed in read-only mode` };\n }\n }\n } else if (accessMode === \"readwrite\") {\n for (const keyword of READWRITE_BLOCKED) {\n if (hasKeyword(sqlUpper, keyword)) {\n return { success: false, error: `${keyword} queries are not allowed in read-write mode` };\n }\n }\n }\n\n try {\n const result = await executeRaw(config, sql, maxRows, accessMode === \"readonly\");\n\n if (!sqlUpper.startsWith(\"SELECT\") && !sqlUpper.startsWith(\"WITH\")) {\n return {\n success: true,\n columns: [],\n rows: [],\n row_count: result.rowCount,\n affected_rows: result.rowCount,\n truncated: false,\n };\n }\n\n return {\n success: true,\n columns: result.columns,\n rows: result.rows,\n row_count: result.rows.length,\n truncated: result.rows.length >= maxRows,\n text: rowsToText(result.rows),\n };\n } catch (e) {\n return { success: false, error: String(e) };\n }\n}\n\nexport async function executeDb(\n config: Record<string, unknown>,\n sql: string,\n): Promise<Record<string, unknown>> {\n const maxRows = Number(config.max_rows ?? MAX_ROWS);\n const accessMode = String(config.access_mode ?? \"readonly\");\n return executeQueryAsync(config, sql, maxRows, accessMode);\n}\n\nexport async function testConnection(config: Record<string, unknown>): Promise<Record<string, unknown>> {\n const engineType = String(config.engine ?? \"postgresql\");\n const versionQueries: Record<string, string> = {\n postgresql: \"SELECT version()\",\n mysql: \"SELECT version()\",\n mariadb: \"SELECT version()\",\n mssql: \"SELECT @@VERSION\",\n sqlite: \"SELECT sqlite_version()\",\n oracle: \"SELECT banner FROM v$version WHERE ROWNUM = 1\",\n clickhouse: \"SELECT version()\",\n snowflake: \"SELECT CURRENT_VERSION()\",\n };\n const q = versionQueries[engineType] ?? \"SELECT version()\";\n const result = await executeQueryAsync(config, q, 1, \"readonly\");\n if (!result.success) return { success: false, error: result.error };\n const version = (result.rows as Array<Record<string, unknown>>)?.[0]\n ? Object.values((result.rows as Array<Record<string, unknown>>)[0]!)[0]\n : null;\n return {\n success: true,\n version: String(version),\n host: config.host,\n database: config.database,\n engine: engineType,\n };\n}\n\nexport async function fetchSchema(\n config: Record<string, unknown>,\n selectedTables?: string[] | null,\n): Promise<Record<string, unknown>> {\n const engine = String(config.engine ?? \"postgresql\");\n if (engine !== \"postgresql\") {\n return { success: false, error: `schema introspection is implemented for postgresql (got ${engine})` };\n }\n let pg: typeof import(\"pg\");\n try {\n pg = require(\"pg\") as typeof import(\"pg\");\n } catch {\n throw new ExtraMissingError(\"postgres\", \"pg\", \"database tool executor\");\n }\n const client = new pg.Client({ connectionString: buildConnectionUrl(config) });\n await client.connect();\n try {\n const schemaName = String(config.schema_name ?? \"public\");\n const tablesRes = await client.query(\n `SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = $1`,\n [schemaName],\n );\n let items = tablesRes.rows.map((r) => ({\n name: String(r.table_name),\n type: String(r.table_type).toLowerCase().includes(\"view\") ? \"view\" : \"table\",\n }));\n if (selectedTables?.length) {\n const selected = new Set(selectedTables);\n items = items.filter((i) => selected.has(i.name));\n }\n const tables = [];\n for (const item of items) {\n const cols = await client.query(\n `SELECT column_name, data_type, is_nullable FROM information_schema.columns\n WHERE table_schema = $1 AND table_name = $2 ORDER BY ordinal_position`,\n [schemaName, item.name],\n );\n tables.push({\n name: item.name,\n type: item.type,\n columns: cols.rows.map((c) => ({\n name: c.column_name,\n type: c.data_type,\n nullable: c.is_nullable === \"YES\",\n })),\n row_count: 0,\n });\n }\n return {\n success: true,\n database: config.database,\n schema: schemaName,\n tables,\n table_count: tables.length,\n all_tables: items.map((i) => i.name),\n };\n } finally {\n await client.end();\n }\n}\n\nexport async function getSchemaText(\n config: Record<string, unknown>,\n selectedTables?: string[] | null,\n): Promise<string> {\n const schema = await fetchSchema(config, selectedTables);\n const schemaRows: Array<Record<string, unknown>> = [];\n for (const table of (schema.tables as Array<Record<string, unknown>> | undefined) ?? []) {\n const kind = table.type ?? \"table\";\n for (const c of (table.columns as Array<Record<string, unknown>>) ?? []) {\n schemaRows.push({\n table: table.name,\n table_type: kind,\n column: c.name,\n type: String(c.type).toUpperCase(),\n pk: c.pk ?? false,\n fk: c.fk ?? \"\",\n rows: table.row_count,\n });\n }\n }\n return rowsToText(schemaRows);\n}\n","import { createRequire } from \"node:module\";\nimport { ExtraMissingError } from \"./errors.js\";\nimport {\n HandlerError,\n handleDeleteDocument,\n handleGetDocument,\n handleIngestFile,\n handleIngestJson,\n handleListDocuments,\n handleSearch,\n handleStats,\n handleUpdateDocument,\n} from \"./routing-core.js\";\nimport { createToolsHandlers, MCP_OAUTH_CALLBACK_PATH } from \"./tools/router.js\";\n\nconst require = createRequire(import.meta.url);\n\ntype Engine = Parameters<typeof handleIngestJson>[0] & Parameters<typeof createToolsHandlers>[0];\n\nexport type FastifyPluginOptions = {\n auth: (req: unknown) => unknown | Promise<unknown>;\n principals: (req: unknown) => unknown | Promise<unknown>;\n redirectBaseUrl?: string;\n};\n\nfunction requireFastifyTypes(): { fastifyPlugin: (fn: unknown, opts?: unknown) => unknown } {\n try {\n const fp = require(\"fastify-plugin\");\n return { fastifyPlugin: fp.default ?? fp };\n } catch {\n return {\n fastifyPlugin: (fn: unknown) => fn,\n };\n }\n}\n\ntype FastifyReq = {\n body?: unknown;\n params?: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n headers?: Record<string, string | undefined>;\n url: string;\n};\ntype FastifyReply = {\n code: (n: number) => { send: (b: unknown) => unknown };\n type: (t: string) => { send: (b: unknown) => unknown };\n};\n\nexport function createFastifyPlugin(engine: Engine, opts: FastifyPluginOptions) {\n if (!opts?.auth || !opts?.principals) {\n throw new TypeError(\"createFastifyPlugin requires auth and principals\");\n }\n try {\n require(\"fastify\");\n } catch {\n throw new ExtraMissingError(\"fastify\", \"fastify\", \"createFastifyPlugin\");\n }\n\n const tools = createToolsHandlers(engine, { redirectBaseUrl: opts.redirectBaseUrl });\n const { fastifyPlugin } = requireFastifyTypes();\n\n async function plugin(fastify: {\n addHook: (name: string, fn: (req: { url: string }, reply: unknown) => Promise<void>) => void;\n post: (path: string, handler: (req: unknown, reply: unknown) => Promise<unknown>) => void;\n get: (path: string, handler: (req: unknown, reply: unknown) => Promise<unknown>) => void;\n delete: (path: string, handler: (req: unknown, reply: unknown) => Promise<unknown>) => void;\n patch: (path: string, handler: (req: unknown, reply: unknown) => Promise<unknown>) => void;\n }) {\n fastify.addHook(\"preHandler\", async (req) => {\n const url = req.url.split(\"?\")[0] ?? \"\";\n if (url.endsWith(MCP_OAUTH_CALLBACK_PATH) || url === MCP_OAUTH_CALLBACK_PATH) return;\n await opts.auth(req);\n });\n\n const wrap = (fn: (req: FastifyReq) => Promise<unknown>) => async (req: unknown, reply: unknown) => {\n const r = req as FastifyReq;\n const rp = reply as FastifyReply;\n try {\n const result = await fn(r);\n if (result && typeof result === \"object\" && \"html\" in (result as object)) {\n const html = result as { html: string; contentType?: string };\n return rp.type(html.contentType ?? \"text/html\").send(html.html);\n }\n return result;\n } catch (exc) {\n if (exc instanceof HandlerError) return rp.code(exc.status).send({ detail: exc.detail });\n throw exc;\n }\n };\n\n const param = (req: FastifyReq, name: string) => req.params?.[name] ?? \"\";\n\n fastify.post(\n \"/documents\",\n wrap(async (req) => {\n const ct = String(req.headers?.[\"content-type\"] ?? \"\");\n const principals = await opts.principals(req);\n if (ct.startsWith(\"multipart/form-data\")) {\n const file = (\n req as { file?: () => Promise<{ toBuffer: () => Promise<Buffer>; filename?: string }> }\n ).file;\n if (!file) throw new HandlerError(400, \"multipart upload requires a 'file' field\");\n const part = await file();\n const content = await part.toBuffer();\n const fields = (req.body ?? {}) as Record<string, unknown>;\n return handleIngestFile(engine, {\n content,\n filename: part.filename ?? null,\n form: fields,\n principals,\n });\n }\n if (ct.startsWith(\"application/json\")) {\n return handleIngestJson(engine, req.body, principals);\n }\n throw new HandlerError(415, \"Content-Type must be multipart/form-data or application/json\");\n }),\n );\n\n fastify.get(\n \"/documents\",\n wrap(async (req) =>\n handleListDocuments(engine, {\n sourceId: req.query?.source_id ?? null,\n limit: Number(req.query?.limit ?? 50),\n cursor: req.query?.cursor ?? null,\n principals: await opts.principals(req),\n }),\n ),\n );\n fastify.get(\n \"/documents/:document_id\",\n wrap(async (req) => handleGetDocument(engine, param(req, \"document_id\"), await opts.principals(req))),\n );\n fastify.delete(\n \"/documents/:document_id\",\n wrap(async (req) =>\n handleDeleteDocument(engine, param(req, \"document_id\"), await opts.principals(req)),\n ),\n );\n fastify.patch(\n \"/documents/:document_id\",\n wrap(async (req) =>\n handleUpdateDocument(engine, param(req, \"document_id\"), req.body, await opts.principals(req)),\n ),\n );\n fastify.post(\n \"/search\",\n wrap(async (req) => handleSearch(engine, req.body, await opts.principals(req))),\n );\n fastify.get(\n \"/stats\",\n wrap(async (req) => handleStats(engine, req.query?.source_id ?? null)),\n );\n\n fastify.post(\n \"/tools\",\n wrap(async (req) => tools.createTool(req.body, await opts.principals(req))),\n );\n fastify.get(\n \"/tools\",\n wrap(async (req) =>\n tools.listToolsAdmin({ source_id: req.query?.source_id }, await opts.principals(req)),\n ),\n );\n fastify.get(\n \"/tools/schema/:kind\",\n wrap(async (req) => tools.toolSchemaRoute(param(req, \"kind\"))),\n );\n fastify.post(\n \"/tools/test\",\n wrap(async (req) => tools.testToolRoute(req.body)),\n );\n fastify.post(\n \"/tools/execute\",\n wrap(async (req) =>\n tools.executeToolRoute(req.body as { call_name?: string }, await opts.principals(req)),\n ),\n );\n fastify.get(\n \"/tools/:tool_id\",\n wrap(async (req) => tools.getTool(param(req, \"tool_id\"), await opts.principals(req))),\n );\n fastify.patch(\n \"/tools/:tool_id\",\n wrap(async (req) =>\n tools.updateToolRoute(\n param(req, \"tool_id\"),\n req.body as Record<string, unknown>,\n await opts.principals(req),\n ),\n ),\n );\n fastify.delete(\n \"/tools/:tool_id\",\n wrap(async (req) => tools.deleteToolRoute(param(req, \"tool_id\"), await opts.principals(req))),\n );\n fastify.post(\n \"/mcp/connect-and-list\",\n wrap(async (req) => tools.mcpConnectAndList(req.body as { server_name: string; url: string })),\n );\n fastify.post(\n \"/mcp/oauth/start\",\n wrap(async (req) => tools.mcpOauthStart(req.body as { server_url: string })),\n );\n fastify.get(\n MCP_OAUTH_CALLBACK_PATH,\n wrap(async (req) => tools.mcpOauthCallback(req.query ?? {})),\n );\n fastify.get(\n \"/approvals\",\n wrap(async (req) =>\n tools.listApprovalsRoute(\n { status: req.query?.status, source_id: req.query?.source_id },\n await opts.principals(req),\n ),\n ),\n );\n fastify.post(\n \"/approvals/:approval_id/resolve\",\n wrap(async (req) =>\n tools.resolveApprovalRoute(\n param(req, \"approval_id\"),\n req.body as { decision: \"approved\" | \"rejected\"; approver: string },\n await opts.principals(req),\n ),\n ),\n );\n }\n\n return fastifyPlugin(plugin, { name: \"context-engine\" });\n}\n","/**\n * Sentinels distinguishing omitted arguments from real values, including null.\n *\n * UNSET: \"argument omitted\" vs null (e.g. updateDocument acl=null means unrestricted).\n * TRUSTED: trusted caller, ACL filtering disabled. Truthy on purpose so\n * `if (principals)` does not treat a trusted caller as anonymous.\n */\n\nexport const UNSET: unique symbol = Symbol.for(\"context_engine.UNSET\");\nexport type Unset = typeof UNSET;\n\nclass TrustedSentinel {\n readonly [Symbol.toStringTag] = \"TRUSTED\";\n toString(): string {\n return \"TRUSTED\";\n }\n valueOf(): boolean {\n return true;\n }\n}\n\nexport const TRUSTED: TrustedSentinel = Object.freeze(new TrustedSentinel());\nexport type Trusted = typeof TRUSTED;\n\nexport type Principals = string[] | null | typeof TRUSTED | undefined;\n\nexport function resolvePrincipals(value: Principals, method: string): string[] | null {\n if (value === TRUSTED) return null;\n if (value === undefined) return null;\n if (value === null) {\n process.emitWarning(\n `${method}(principals=null) means TRUSTED CALLER — access control is ` +\n `disabled and every document is returned. If that is what you want, ` +\n `pass principals=TRUSTED (from @promptev/context-engine) to say so explicitly. ` +\n `If you meant 'no authenticated user', pass principals=[] instead; ` +\n `null returns the entire corpus. Passing null will raise in 1.0.`,\n \"DeprecationWarning\",\n );\n return null;\n }\n return Array.isArray(value) ? value : null;\n}\n\nexport function isTrusted(principals: string[] | null | undefined): boolean {\n return principals === null || principals === undefined;\n}\n","import { z } from \"zod\";\nimport { TRUSTED } from \"./sentinels.js\";\n\nexport class HandlerError extends Error {\n status: number;\n detail: unknown;\n constructor(status: number, detail: unknown) {\n super(typeof detail === \"string\" ? detail : JSON.stringify(detail));\n this.name = \"HandlerError\";\n this.status = status;\n this.detail = detail;\n }\n}\n\nexport const ingestJsonRequestSchema = z\n .object({\n text: z.string(),\n name: z.string(),\n source_id: z.string().nullable().optional(),\n external_id: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n meta_data: z.record(z.unknown()).nullable().optional(),\n acl: z.array(z.string()).nullable().optional(),\n mode: z.enum([\"hybrid\", \"graph\"]).nullable().optional(),\n extract_structured: z.boolean().optional().default(false),\n batch: z.boolean().optional().default(false),\n })\n .strip();\n\nexport const documentPatchSchema = z\n .object({\n acl: z.array(z.string()).nullable().optional(),\n name: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n meta_data: z.record(z.unknown()).nullable().optional(),\n })\n .strict();\n\nexport const searchRequestSchema = z\n .object({\n query: z.string(),\n source_ids: z.array(z.string()).nullable().optional(),\n top_k: z.number().int().optional().default(10),\n mode: z.enum([\"hybrid\", \"graph\"]).optional().default(\"hybrid\"),\n compress_to_tokens: z.number().int().nullable().optional(),\n })\n .strip();\n\nexport type IngestJSONRequest = z.infer<typeof ingestJsonRequestSchema>;\nexport type DocumentPatch = z.infer<typeof documentPatchSchema>;\nexport type SearchRequest = z.infer<typeof searchRequestSchema>;\n\nexport type ContextEngineLike = {\n ingest: (args: Record<string, unknown>) => Promise<unknown>;\n search: (query: string, opts?: Record<string, unknown>) => Promise<{ hits?: unknown[]; usage?: unknown }>;\n listDocuments: (opts: Record<string, unknown>) => Promise<unknown>;\n getDocument: (id: string, opts?: Record<string, unknown>) => Promise<unknown>;\n deleteDocument: (id: string, opts?: Record<string, unknown>) => Promise<unknown>;\n updateDocument: (id: string, opts?: Record<string, unknown>) => Promise<unknown>;\n stats: (sourceId?: string | null) => Promise<unknown>;\n};\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport function requireValidUuid(documentId: string): void {\n if (!UUID_RE.test(String(documentId))) {\n throw new HandlerError(400, `invalid document id: ${JSON.stringify(documentId)}`);\n }\n}\n\nexport function formBool(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n if (value == null) return false;\n return [\"1\", \"true\", \"yes\", \"on\"].includes(String(value).trim().toLowerCase());\n}\n\nexport function formJson(value: unknown): unknown {\n if (value === undefined || value === null || value === \"\") return null;\n if (typeof value === \"object\") return value;\n try {\n return JSON.parse(String(value));\n } catch {\n throw new HandlerError(400, `invalid JSON in field: ${JSON.stringify(value)}`);\n }\n}\n\nexport function formStr(value: unknown): string | null {\n return value === undefined || value === null || value === \"\" ? null : String(value);\n}\n\nexport function resolveRequestPrincipals(value: unknown, opts: { surface: string }): string[] | null {\n if (value === TRUSTED) return null;\n if (value == null) {\n throw new HandlerError(\n 500,\n `${opts.surface}: the \\`principals\\` dependency returned null, which means ` +\n `TRUSTED CALLER — it disables ACL filtering and skips the check that ` +\n `stops a caller filing documents under groups it does not hold. This ` +\n `mount is misconfigured: return [] for an unauthenticated caller, or ` +\n `pass TRUSTED explicitly (from @promptev/context-engine) if the surface really ` +\n `is trusted.`,\n );\n }\n return value as string[];\n}\n\nexport function authorizeAcl(requested: unknown, principals: string[] | null): void {\n if (requested == null || principals == null) return;\n if (!Array.isArray(requested)) {\n throw new HandlerError(422, \"acl must be a list of principal strings\");\n }\n const held = new Set(principals);\n const ungranted = [...new Set(requested.map(String))].filter((p) => !held.has(p)).sort();\n if (ungranted.length) {\n throw new HandlerError(403, `cannot grant access to principals you do not hold: ${ungranted}`);\n }\n}\n\nfunction asDict(obj: unknown): unknown {\n if (obj == null) return obj;\n if (typeof obj === \"object\" && typeof (obj as { toJSON?: () => unknown }).toJSON === \"function\") {\n return (obj as { toJSON: () => unknown }).toJSON();\n }\n return obj;\n}\n\nfunction zodError(err: z.ZodError): HandlerError {\n return new HandlerError(\n 422,\n err.issues.map((i) => ({ loc: i.path, msg: i.message, type: i.code })),\n );\n}\n\nasync function runIngest(engine: ContextEngineLike, kwargs: Record<string, unknown>): Promise<unknown> {\n try {\n return asDict(await engine.ingest(kwargs));\n } catch (exc) {\n if (exc instanceof TypeError || (exc instanceof Error && exc.name === \"TypeError\")) {\n throw new HandlerError(400, String(exc));\n }\n if (exc instanceof Error && exc.name === \"Error\" && /invalid|required/i.test(exc.message)) {\n throw new HandlerError(400, String(exc));\n }\n throw exc;\n }\n}\n\nexport async function handleIngestJson(\n engine: ContextEngineLike,\n payload: unknown,\n principals: unknown,\n): Promise<unknown> {\n const resolved = resolveRequestPrincipals(principals, { surface: \"handle_ingest_json\" });\n const parsed = ingestJsonRequestSchema.safeParse(payload);\n if (!parsed.success) throw zodError(parsed.error);\n const body = parsed.data;\n authorizeAcl(body.acl, resolved);\n return runIngest(engine, {\n text: body.text,\n name: body.name,\n description: body.description,\n sourceId: body.source_id,\n externalId: body.external_id,\n metaData: body.meta_data,\n acl: body.acl,\n mode: body.mode,\n extractStructured: body.extract_structured,\n batch: body.batch,\n });\n}\n\nexport async function handleIngestFile(\n engine: ContextEngineLike,\n opts: {\n content: Buffer | Uint8Array;\n filename: string | null | undefined;\n form: Record<string, unknown> | Map<string, unknown>;\n principals: unknown;\n },\n): Promise<unknown> {\n const resolved = resolveRequestPrincipals(opts.principals, { surface: \"handle_ingest_file\" });\n const form = opts.form instanceof Map ? Object.fromEntries(opts.form) : opts.form;\n const acl = formJson(form.acl);\n authorizeAcl(acl, resolved);\n return runIngest(engine, {\n content: opts.content,\n filename: opts.filename,\n name: formStr(form.name) || opts.filename,\n description: formStr(form.description),\n sourceId: formStr(form.source_id),\n externalId: formStr(form.external_id),\n metaData: formJson(form.meta_data),\n acl,\n mode: formStr(form.mode),\n extractStructured: formBool(form.extract_structured),\n batch: formBool(form.batch),\n });\n}\n\nexport async function handleListDocuments(\n engine: ContextEngineLike,\n opts: {\n sourceId: string | null | undefined;\n limit: number;\n cursor: string | null | undefined;\n principals: unknown;\n },\n): Promise<unknown> {\n const resolved = resolveRequestPrincipals(opts.principals, { surface: \"handle_list_documents\" });\n let parsedCursor: unknown = null;\n if (opts.cursor) {\n try {\n parsedCursor = JSON.parse(opts.cursor);\n } catch {\n throw new HandlerError(400, `invalid cursor: ${JSON.stringify(opts.cursor)}`);\n }\n }\n return engine.listDocuments({\n sourceId: opts.sourceId ?? null,\n principals: resolved,\n cursor: parsedCursor,\n limit: opts.limit,\n });\n}\n\nexport async function handleGetDocument(\n engine: ContextEngineLike,\n documentId: string,\n principals: unknown,\n): Promise<unknown> {\n const resolved = resolveRequestPrincipals(principals, { surface: \"handle_get_document\" });\n requireValidUuid(documentId);\n try {\n return await engine.getDocument(documentId, { principals: resolved });\n } catch (exc) {\n if (\n exc instanceof Error &&\n (exc.name === \"DocumentNotFoundError\" || exc instanceof TypeError === false)\n ) {\n const msg = String(exc);\n if (/not found/i.test(msg) || exc.name === \"DocumentNotFoundError\") {\n throw new HandlerError(404, msg.replace(/^Error:\\s*/, \"\"));\n }\n }\n throw exc;\n }\n}\n\nexport async function handleDeleteDocument(\n engine: ContextEngineLike,\n documentId: string,\n principals: unknown,\n): Promise<unknown> {\n const resolved = resolveRequestPrincipals(principals, { surface: \"handle_delete_document\" });\n requireValidUuid(documentId);\n try {\n await engine.deleteDocument(documentId, { principals: resolved });\n } catch (exc) {\n const msg = String(exc);\n if (/not found/i.test(msg) || (exc instanceof Error && exc.name === \"DocumentNotFoundError\")) {\n throw new HandlerError(404, msg.replace(/^Error:\\s*/, \"\"));\n }\n throw exc;\n }\n return { deleted: documentId };\n}\n\nexport async function handleUpdateDocument(\n engine: ContextEngineLike,\n documentId: string,\n payload: unknown,\n principals: unknown,\n): Promise<unknown> {\n const resolved = resolveRequestPrincipals(principals, { surface: \"handle_update_document\" });\n requireValidUuid(documentId);\n const parsed = documentPatchSchema.safeParse(payload);\n if (!parsed.success) throw zodError(parsed.error);\n const provided: Record<string, unknown> = {};\n const raw = payload as Record<string, unknown>;\n for (const key of [\"acl\", \"name\", \"description\", \"meta_data\"] as const) {\n if (Object.hasOwn(raw, key)) {\n provided[key === \"meta_data\" ? \"metaData\" : key] = raw[key];\n }\n }\n if (\"acl\" in provided) authorizeAcl(provided.acl, resolved);\n try {\n const changed = await engine.updateDocument(documentId, { principals: resolved, ...provided });\n return { changed };\n } catch (exc) {\n const msg = String(exc);\n if (/not found/i.test(msg) || (exc instanceof Error && exc.name === \"DocumentNotFoundError\")) {\n throw new HandlerError(404, msg.replace(/^Error:\\s*/, \"\"));\n }\n throw exc;\n }\n}\n\nexport async function handleSearch(\n engine: ContextEngineLike,\n payload: unknown,\n principals: unknown,\n): Promise<unknown> {\n const resolved = resolveRequestPrincipals(principals, { surface: \"handle_search\" });\n const parsed = searchRequestSchema.safeParse(payload);\n if (!parsed.success) throw zodError(parsed.error);\n const body = parsed.data;\n try {\n const result = await engine.search(body.query, {\n sourceIds: body.source_ids,\n principals: resolved,\n topK: body.top_k,\n mode: body.mode,\n compressToTokens: body.compress_to_tokens,\n });\n const hits = (result.hits ?? []).map((hit) => asDict(hit));\n return { hits, usage: result.usage };\n } catch (exc) {\n if (exc instanceof Error && /invalid|required|graph/i.test(exc.message)) {\n throw new HandlerError(400, String(exc));\n }\n throw exc;\n }\n}\n\nexport async function handleStats(\n engine: ContextEngineLike,\n sourceId: string | null | undefined,\n): Promise<unknown> {\n return engine.stats(sourceId ?? null);\n}\n","import { EngineActionError } from \"../errors.js\";\nimport { authorizeAcl, HandlerError, resolveRequestPrincipals } from \"../routing-core.js\";\nimport { aclVisible } from \"./acl.js\";\nimport {\n ApprovalExpired,\n ApprovalNotPending,\n type ApprovalRecord,\n listApprovals,\n resolveApproval,\n} from \"./approval.js\";\nimport { configSchema, ToolConfig, type ToolKind } from \"./config.js\";\nimport { MCPError, PromptevMCP } from \"./executors/mcp-client.js\";\nimport {\n deleteTool,\n executeTool,\n registerTool,\n type ToolEngine,\n testTool,\n updateTool,\n} from \"./governance.js\";\nimport {\n buildAuthorizeUrl,\n discoverOauthMetadata,\n exchangeCodeForToken,\n InMemoryPendingStore,\n type PendingStore,\n registerOauthClient,\n} from \"./mcp-oauth.js\";\n\nexport const MCP_OAUTH_CALLBACK_PATH = \"/mcp/oauth/callback\";\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction coerceUuid(value: string): string {\n if (!UUID_RE.test(String(value))) {\n throw new HandlerError(400, `invalid id: ${JSON.stringify(value)}`);\n }\n return value;\n}\n\nfunction toolRowPublic(row: Record<string, unknown>): Record<string, unknown> {\n return {\n id: String(row.id),\n name: row.name,\n kind: row.kind,\n description: row.description || \"\",\n source_id: row.source_id,\n acl: row.acl != null ? [...(row.acl as string[])] : null,\n requires_approval: row.requires_approval,\n approval_policy: row.approval_policy ?? {},\n enabled: row.enabled,\n };\n}\n\nfunction resolveCaller(value: unknown, surface: string): string[] | null {\n return resolveRequestPrincipals(value, { surface });\n}\n\nfunction recordToDict(record: ApprovalRecord): Record<string, unknown> {\n return {\n id: record.id,\n tool_name: record.toolName,\n tool_args_frozen: record.toolArgsFrozen,\n source_id: record.sourceId,\n principals: record.principals,\n status: record.status,\n approver: record.approver,\n approver_meta: record.approverMeta,\n expires_at: record.expiresAt?.toISOString() ?? null,\n resolved_at: record.resolvedAt?.toISOString() ?? null,\n created_at: record.createdAt?.toISOString() ?? null,\n };\n}\n\nexport function popupCloseHtml(\n success: boolean,\n message: string,\n targetOrigin: string,\n tokenData: Record<string, unknown> | null = null,\n): string {\n const status = success ? \"success\" : \"error\";\n const payload: Record<string, unknown> = { type: `mcp-oauth-${status}`, message };\n if (tokenData && success) payload.token = tokenData;\n const encoded = Buffer.from(JSON.stringify(payload), \"utf8\").toString(\"base64\");\n const title = success ? \"Connected\" : \"Failed\";\n return (\n `<!DOCTYPE html><html><head><title>Context Engine MCP OAuth</title></head>` +\n `<body style=\"font-family:system-ui;text-align:center;padding:40px;\">` +\n `<h2>${title}</h2>` +\n `<p>${message}</p>` +\n `<p style=\"font-size:12px;\">This window will close automatically&hellip;</p>` +\n `<script>` +\n `try {` +\n ` var d = JSON.parse(atob(\"${encoded}\"));` +\n ` if (window.opener) window.opener.postMessage(d, \"${targetOrigin}\");` +\n `} catch (e) { console.error('postMessage error', e); }` +\n `setTimeout(function () { window.close(); }, 1500);` +\n `</script>` +\n `</body></html>`\n );\n}\n\nexport type ToolsHandlerEngine = ToolEngine & {\n registerTool?: (tc: ToolConfig) => Promise<string>;\n updateTool?: (id: string, opts: Record<string, unknown>) => Promise<ToolConfig>;\n deleteTool?: (id: string, opts?: Record<string, unknown>) => Promise<void>;\n testTool?: (tc: ToolConfig) => Promise<Record<string, unknown>>;\n executeTool?: (\n callName: string,\n args: Record<string, unknown> | null,\n opts?: Record<string, unknown>,\n ) => Promise<Record<string, unknown>>;\n hooks?: ToolEngine[\"hooks\"];\n};\n\nexport function createToolsHandlers(\n engine: ToolsHandlerEngine,\n opts: {\n redirectBaseUrl?: string;\n pendingStore?: PendingStore | null;\n } = {},\n) {\n const store: PendingStore = opts.pendingStore ?? new InMemoryPendingStore();\n const redirectBaseUrl = (opts.redirectBaseUrl ?? \"\").replace(/\\/$/, \"\");\n let targetOrigin = \"\";\n try {\n if (redirectBaseUrl) targetOrigin = new URL(redirectBaseUrl).origin;\n } catch {\n targetOrigin = \"\";\n }\n const redirectUri = redirectBaseUrl ? `${redirectBaseUrl}${MCP_OAUTH_CALLBACK_PATH}` : \"\";\n\n return {\n async createTool(body: unknown, principals: unknown): Promise<Record<string, unknown>> {\n const caller = resolveCaller(principals, \"POST /tools\");\n const tc = ToolConfig.fromUnknown(body);\n authorizeAcl(tc.acl, caller);\n try {\n const toolId = engine.registerTool ? await engine.registerTool(tc) : await registerTool(engine, tc);\n return { id: toolId };\n } catch (exc) {\n if (exc instanceof Error && /canonicalFromConfig|kind=/.test(exc.message)) {\n throw new HandlerError(400, String(exc));\n }\n throw exc;\n }\n },\n\n async listToolsAdmin(\n query: { source_id?: string | null },\n principals: unknown,\n ): Promise<Record<string, unknown>> {\n const caller = resolveCaller(principals, \"GET /tools\");\n const params: unknown[] = [];\n let sql = `SELECT * FROM context_engine_tools`;\n if (query.source_id != null) {\n params.push(query.source_id);\n sql += ` WHERE source_id = $1`;\n }\n const result = await engine.pool.query(sql, params);\n const tools = result.rows\n .filter((row) => aclVisible(row.acl != null ? [...row.acl] : null, caller))\n .map(toolRowPublic);\n return { tools };\n },\n\n async getTool(toolId: string, principals: unknown): Promise<Record<string, unknown>> {\n const caller = resolveCaller(principals, \"GET /tools/{tool_id}\");\n const parsedId = coerceUuid(toolId);\n const result = await engine.pool.query(`SELECT * FROM context_engine_tools WHERE id = $1`, [parsedId]);\n const row = result.rows[0];\n if (!row || !aclVisible(row.acl != null ? [...row.acl] : null, caller)) {\n throw new HandlerError(404, `tool not found: ${toolId}`);\n }\n return toolRowPublic(row);\n },\n\n async updateToolRoute(\n toolId: string,\n body: Record<string, unknown>,\n principals: unknown,\n ): Promise<Record<string, unknown>> {\n const caller = resolveCaller(principals, \"PATCH /tools/{tool_id}\");\n coerceUuid(toolId);\n const fields: Record<string, unknown> = {};\n const map: Record<string, string> = {\n name: \"name\",\n kind: \"kind\",\n description: \"description\",\n config: \"config\",\n source_id: \"sourceId\",\n acl: \"acl\",\n requires_approval: \"requiresApproval\",\n approval_policy: \"approvalPolicy\",\n enabled: \"enabled\",\n };\n for (const [k, dest] of Object.entries(map)) {\n if (Object.hasOwn(body, k)) fields[dest] = body[k];\n }\n if (\"acl\" in fields) authorizeAcl(fields.acl, caller);\n try {\n const updated = engine.updateTool\n ? await engine.updateTool(toolId, { principals: caller, ...fields })\n : await updateTool(engine, toolId, { principals: caller, ...fields });\n return {\n id: updated.id,\n name: updated.name,\n kind: updated.kind,\n description: updated.description,\n source_id: updated.sourceId,\n acl: updated.acl,\n requires_approval: updated.requiresApproval,\n approval_policy: updated.approvalPolicy,\n enabled: updated.enabled,\n };\n } catch (exc) {\n if (exc instanceof EngineActionError) throw new HandlerError(404, String(exc.message));\n throw exc;\n }\n },\n\n async deleteToolRoute(toolId: string, principals: unknown): Promise<Record<string, unknown>> {\n const caller = resolveCaller(principals, \"DELETE /tools/{tool_id}\");\n coerceUuid(toolId);\n try {\n if (engine.deleteTool) await engine.deleteTool(toolId, { principals: caller });\n else await deleteTool(engine, toolId, { principals: caller });\n } catch (exc) {\n if (exc instanceof EngineActionError) throw new HandlerError(404, String(exc.message));\n throw exc;\n }\n return { deleted: toolId };\n },\n\n async testToolRoute(body: unknown): Promise<Record<string, unknown>> {\n const tc = ToolConfig.fromUnknown(body);\n return engine.testTool ? engine.testTool(tc) : testTool(engine, tc);\n },\n\n toolSchemaRoute(kind: string): Record<string, unknown> {\n try {\n return configSchema(kind as ToolKind);\n } catch {\n throw new HandlerError(404, `unknown tool kind: ${JSON.stringify(kind)}`);\n }\n },\n\n async executeToolRoute(\n body: { call_name?: string; args?: Record<string, unknown> | null; source_id?: string | null },\n principals: unknown,\n ): Promise<Record<string, unknown>> {\n const caller = resolveCaller(principals, \"POST /tools/execute\");\n if (!body.call_name) throw new HandlerError(422, \"call_name is required\");\n try {\n const exec = engine.executeTool ?? ((n, a, o) => executeTool(engine, n, a, o));\n return await exec(body.call_name, body.args ?? null, {\n sourceId: body.source_id,\n principals: caller,\n });\n } catch (exc) {\n if (exc instanceof EngineActionError) throw new HandlerError(404, String(exc.message));\n throw exc;\n }\n },\n\n async mcpConnectAndList(body: {\n server_name: string;\n url: string;\n token?: string | null;\n headers?: Record<string, string> | null;\n include_resources?: boolean;\n }): Promise<Record<string, unknown>> {\n const mcp = new PromptevMCP();\n try {\n await mcp.addServer(body.server_name, body.url, { token: body.token, headers: body.headers });\n const client = mcp.clients.get(body.server_name);\n const tools = await client.listTools();\n const resources = body.include_resources ? await client.listResources() : null;\n return {\n server: body.server_name,\n url: client.url,\n transport: client.transport.kind,\n tools,\n resources,\n requires_oauth: false,\n };\n } catch (exc) {\n const msg = String(exc);\n const statusMatch = /HTTP (401|403)/.exec(msg);\n if (statusMatch || /401|403/.test(msg)) {\n const metadata = await discoverOauthMetadata(body.url, { hooks: engine.hooks });\n if (metadata) {\n return {\n server: body.server_name,\n url: body.url,\n transport: \"pending_oauth\",\n tools: [],\n resources: null,\n requires_oauth: true,\n };\n }\n throw new HandlerError(\n 502,\n `MCP server returned ${statusMatch?.[1] ?? \"401/403\"}. No OAuth endpoint found — provide a Bearer token instead.`,\n );\n }\n if (exc instanceof MCPError) throw new HandlerError(502, `MCP protocol error: ${exc}`);\n throw new HandlerError(502, `Cannot reach MCP server: ${exc}`);\n } finally {\n await mcp.shutdown();\n }\n },\n\n async mcpOauthStart(body: {\n server_url: string;\n tool_id?: string | null;\n client_id?: string | null;\n client_secret?: string | null;\n scopes?: string | null;\n }): Promise<Record<string, unknown>> {\n if (!redirectUri) {\n throw new HandlerError(500, \"redirectBaseUrl is required to start MCP OAuth\");\n }\n const metadata = await discoverOauthMetadata(body.server_url, { hooks: engine.hooks });\n if (!metadata) {\n throw new HandlerError(502, \"MCP server does not support OAuth — no authorization endpoint found\");\n }\n let clientId = body.client_id ?? null;\n let clientSecret = body.client_secret ?? null;\n if (!clientId && metadata.registration_endpoint) {\n try {\n const reg = await registerOauthClient(\n String(metadata.registration_endpoint),\n redirectUri,\n \"Promptev Context Engine\",\n { hooks: engine.hooks },\n );\n clientId = (reg.client_id as string | undefined) ?? null;\n clientSecret = (reg.client_secret as string | undefined) || clientSecret;\n } catch {\n /* DCR optional */\n }\n }\n try {\n return await buildAuthorizeUrl(metadata, body.server_url, body.tool_id || \"\", redirectUri, store, {\n clientId,\n clientSecret,\n scopes: body.scopes,\n });\n } catch (exc) {\n throw new HandlerError(400, String(exc));\n }\n },\n\n async mcpOauthCallback(query: {\n code?: string | null;\n state?: string | null;\n error?: string | null;\n error_description?: string | null;\n }): Promise<{ html: string; contentType: string }> {\n const html = (success: boolean, message: string, token: Record<string, unknown> | null = null) =>\n popupCloseHtml(success, message, targetOrigin, token);\n if (query.error) {\n return { html: html(false, query.error_description || query.error), contentType: \"text/html\" };\n }\n if (!query.code || !query.state) {\n return { html: html(false, \"Missing code or state parameter\"), contentType: \"text/html\" };\n }\n try {\n const tokenResult = await exchangeCodeForToken(query.state, query.code, store, {\n hooks: engine.hooks,\n });\n return {\n html: html(true, \"Connected successfully\", {\n access_token: tokenResult.access_token,\n refresh_token: tokenResult.refresh_token,\n token_type: tokenResult.token_type ?? \"Bearer\",\n expires_in: tokenResult.expires_in,\n scope: tokenResult.scope,\n tool_id: tokenResult.tool_id,\n }),\n contentType: \"text/html\",\n };\n } catch (exc) {\n return { html: html(false, String(exc)), contentType: \"text/html\" };\n }\n },\n\n async listApprovalsRoute(\n query: { status?: string | null; source_id?: string | null },\n principals: unknown,\n ): Promise<Record<string, unknown>> {\n const caller = resolveCaller(principals, \"GET /approvals\");\n const records = await listApprovals(engine, {\n status: query.status,\n sourceId: query.source_id,\n principals: caller,\n });\n return { approvals: records.map(recordToDict) };\n },\n\n async resolveApprovalRoute(\n approvalId: string,\n body: { decision: \"approved\" | \"rejected\"; approver: string; meta?: Record<string, unknown> | null },\n principals: unknown,\n ): Promise<Record<string, unknown>> {\n const caller = resolveCaller(principals, \"POST /approvals/{approval_id}/resolve\");\n const parsedId = coerceUuid(approvalId);\n try {\n const record = await resolveApproval(\n engine,\n parsedId,\n body.decision,\n body.approver,\n body.meta ?? null,\n {\n principals: caller,\n },\n );\n return recordToDict(record);\n } catch (exc) {\n if (exc instanceof ApprovalNotPending) {\n throw new HandlerError(404, `approval not pending: ${exc.message}`);\n }\n if (exc instanceof ApprovalExpired) {\n throw new HandlerError(409, \"approval expired\");\n }\n throw exc;\n }\n },\n };\n}\n\nexport type ToolsHandlers = ReturnType<typeof createToolsHandlers>;\n","export function aclVisible(\n acl: string[] | null | undefined,\n principals: string[] | null | undefined,\n): boolean {\n if (principals === null) return true;\n if (acl == null) return true;\n if (!acl.length) return false;\n const held = new Set(principals ?? []);\n return acl.some((p) => held.has(p));\n}\n","import { randomUUID } from \"node:crypto\";\nimport { ApprovalExpired, ApprovalNotPending } from \"../errors.js\";\nimport { aclVisible } from \"./acl.js\";\nimport type { CanonicalTool } from \"./registry.js\";\n\nexport { ApprovalExpired, ApprovalNotPending };\n\nexport const DEFAULT_TIMEOUT_MINUTES = 60;\nexport const DEFAULT_LIST_LIMIT = 50;\nexport const MAX_LIST_LIMIT = 200;\n\nconst CONDITION_RE = /^\\s*(?<field>[A-Za-z_][A-Za-z0-9_.]*)\\s*(?<op>>=|<=|==|!=|>|<)\\s*(?<value>.+?)\\s*$/;\n\nexport interface ApprovalRecord {\n id: string;\n toolName: string;\n toolArgsFrozen: Record<string, unknown>;\n sourceId: string | null;\n principals: unknown;\n status: string;\n approver: string | null;\n approverMeta: Record<string, unknown> | null;\n expiresAt: Date | null;\n resolvedAt: Date | null;\n createdAt: Date | null;\n}\n\ntype EngineLike = {\n pool: {\n query: (\n sql: string,\n params?: unknown[],\n ) => Promise<{ rows: Array<Record<string, unknown>>; rowCount?: number | null }>;\n };\n};\n\nfunction coerceValue(raw: string): unknown {\n const trimmed = raw.trim();\n if (\n trimmed.length >= 2 &&\n trimmed[0] === trimmed[trimmed.length - 1] &&\n (trimmed[0] === \"'\" || trimmed[0] === '\"')\n ) {\n return trimmed.slice(1, -1);\n }\n if (/^-?\\d+$/.test(trimmed)) return Number.parseInt(trimmed, 10);\n if (/^-?\\d+\\.\\d+$/.test(trimmed)) return Number.parseFloat(trimmed);\n return trimmed;\n}\n\nfunction evaluateCondition(condition: unknown, args: Record<string, unknown>): boolean {\n if (typeof condition !== \"string\") return true;\n const match = CONDITION_RE.exec(condition);\n if (!match?.groups) return true;\n const fieldName = match.groups.field!;\n const op = match.groups.op!;\n if (!(fieldName in args)) return true;\n const left = args[fieldName];\n const right = coerceValue(match.groups.value!);\n try {\n switch (op) {\n case \">\":\n return (left as number) > (right as number);\n case \">=\":\n return (left as number) >= (right as number);\n case \"<\":\n return (left as number) < (right as number);\n case \"<=\":\n return (left as number) <= (right as number);\n case \"==\":\n return left === right;\n case \"!=\":\n return left !== right;\n default:\n return true;\n }\n } catch {\n return true;\n }\n}\n\nexport function shouldRequireApproval(\n ct: Pick<CanonicalTool, \"requiresApproval\" | \"approvalPolicy\">,\n args: Record<string, unknown>,\n): boolean {\n if (ct.requiresApproval) return true;\n const policy = ct.approvalPolicy ?? {};\n const condition = policy.condition;\n if (!condition) return false;\n return evaluateCondition(condition, args ?? {});\n}\n\nfunction rowToRecord(row: Record<string, unknown>): ApprovalRecord {\n return {\n id: String(row.id),\n toolName: String(row.tool_name),\n toolArgsFrozen: (row.tool_args_frozen as Record<string, unknown>) ?? {},\n sourceId: (row.source_id as string | null) ?? null,\n principals: row.principals,\n status: String(row.status),\n approver: (row.approver as string | null) ?? null,\n approverMeta: (row.approver_meta as Record<string, unknown> | null) ?? null,\n expiresAt: row.expires_at ? new Date(String(row.expires_at)) : null,\n resolvedAt: row.resolved_at ? new Date(String(row.resolved_at)) : null,\n createdAt: row.created_at ? new Date(String(row.created_at)) : null,\n };\n}\n\nfunction visibilitySql(principals: string[] | null, paramIndex: number): { sql: string; params: unknown[] } {\n if (principals === null) return { sql: \"TRUE\", params: [] };\n if (!principals.length) {\n return { sql: `(principals IS NULL OR principals = 'null'::jsonb)`, params: [] };\n }\n return {\n sql: `(principals IS NULL OR principals = 'null'::jsonb OR principals ?| $${paramIndex}::text[])`,\n params: [principals],\n };\n}\n\nexport async function createPending(\n engine: EngineLike,\n opts: {\n toolName: string;\n args: Record<string, unknown>;\n sourceId?: string | null;\n principals?: unknown;\n policy?: Record<string, unknown>;\n now?: Date;\n },\n): Promise<ApprovalRecord> {\n const policy = opts.policy ?? {};\n const frozen = structuredClone(opts.args);\n const createdAt = opts.now ?? new Date();\n const timeout = Number(policy.timeout_minutes ?? DEFAULT_TIMEOUT_MINUTES);\n const expiresAt = new Date(createdAt.getTime() + timeout * 60_000);\n const id = randomUUID();\n await engine.pool.query(\n `INSERT INTO context_engine_tool_approvals\n (id, tool_name, tool_args_frozen, source_id, principals, status, expires_at, created_at)\n VALUES ($1,$2,$3::jsonb,$4,$5::jsonb,'pending',$6,$7)`,\n [\n id,\n opts.toolName,\n JSON.stringify(frozen),\n opts.sourceId ?? null,\n opts.principals === undefined ? null : JSON.stringify(opts.principals),\n expiresAt,\n createdAt,\n ],\n );\n return {\n id,\n toolName: opts.toolName,\n toolArgsFrozen: frozen,\n sourceId: opts.sourceId ?? null,\n principals: opts.principals ?? null,\n status: \"pending\",\n approver: null,\n approverMeta: null,\n expiresAt,\n resolvedAt: null,\n createdAt,\n };\n}\n\nexport async function resolveApproval(\n engine: EngineLike,\n approvalId: string,\n decision: \"approved\" | \"rejected\",\n approver: string,\n meta: Record<string, unknown> | null = null,\n opts: { principals?: string[] | null } = {},\n): Promise<ApprovalRecord> {\n if (decision !== \"approved\" && decision !== \"rejected\") {\n throw new Error(`invalid decision: ${JSON.stringify(decision)} (expected 'approved' or 'rejected')`);\n }\n const principals = opts.principals === undefined ? null : opts.principals;\n const vis = visibilitySql(principals, 5);\n const result = await engine.pool.query(\n `UPDATE context_engine_tool_approvals\n SET status = $1, approver = $2, approver_meta = $3::jsonb, resolved_at = now()\n WHERE id = $4 AND status = 'pending'\n AND (expires_at IS NULL OR expires_at > now())\n AND ${vis.sql}\n RETURNING *`,\n [decision, approver, JSON.stringify(meta ?? {}), approvalId, ...vis.params],\n );\n if (result.rowCount === 1) return rowToRecord(result.rows[0]!);\n\n const existing = await engine.pool.query(`SELECT * FROM context_engine_tool_approvals WHERE id = $1`, [\n approvalId,\n ]);\n const row = existing.rows[0];\n const rowPrincipals =\n row?.principals == null || row.principals === null ? null : (row.principals as string[]);\n if (!row || !aclVisible(Array.isArray(rowPrincipals) ? rowPrincipals : null, principals)) {\n throw new ApprovalNotPending(\"not_found\");\n }\n if (row.status === \"pending\") {\n await engine.pool.query(\n `UPDATE context_engine_tool_approvals SET status = 'expired' WHERE id = $1 AND status = 'pending'`,\n [approvalId],\n );\n throw new ApprovalExpired();\n }\n throw new ApprovalNotPending(String(row.status));\n}\n\nexport async function getApproval(engine: EngineLike, approvalId: string): Promise<ApprovalRecord | null> {\n const result = await engine.pool.query(`SELECT * FROM context_engine_tool_approvals WHERE id = $1`, [\n approvalId,\n ]);\n return result.rows[0] ? rowToRecord(result.rows[0]) : null;\n}\n\nexport async function listApprovals(\n engine: EngineLike,\n opts: {\n status?: string | null;\n sourceId?: string | null;\n limit?: number;\n principals?: string[] | null;\n } = {},\n): Promise<ApprovalRecord[]> {\n const limit = Math.max(1, Math.min(Number(opts.limit || DEFAULT_LIST_LIMIT), MAX_LIST_LIMIT));\n const principals = opts.principals === undefined ? null : opts.principals;\n const params: unknown[] = [];\n const clauses: string[] = [];\n if (opts.status != null) {\n params.push(opts.status);\n clauses.push(`status = $${params.length}`);\n }\n if (opts.sourceId != null) {\n params.push(opts.sourceId);\n clauses.push(`source_id = $${params.length}`);\n }\n const vis = visibilitySql(principals, params.length + 1);\n clauses.push(vis.sql);\n params.push(...vis.params);\n params.push(limit);\n const result = await engine.pool.query(\n `SELECT * FROM context_engine_tool_approvals\n WHERE ${clauses.join(\" AND \")}\n ORDER BY created_at DESC\n LIMIT $${params.length}`,\n params,\n );\n return result.rows.map(rowToRecord);\n}\n","export type ToolKind = \"http\" | \"db\" | \"mcp\" | \"function\";\n\nconst KINDS: readonly ToolKind[] = [\"http\", \"db\", \"mcp\", \"function\"];\n\nexport interface ToolConfigInit {\n id?: string | null;\n name: string;\n kind: ToolKind;\n description?: string;\n config?: Record<string, unknown>;\n sourceId?: string | null;\n source_id?: string | null;\n acl?: string[] | null;\n requiresApproval?: boolean;\n requires_approval?: boolean;\n approvalPolicy?: Record<string, unknown>;\n approval_policy?: Record<string, unknown>;\n enabled?: boolean;\n}\n\n/**\n * Caller-facing shape for registering a tool. Kind-specific `config` is\n * opaque here and encrypted at rest by governance when it holds secrets.\n */\nexport class ToolConfig {\n id: string | null;\n name: string;\n kind: ToolKind;\n description: string;\n config: Record<string, unknown>;\n sourceId: string | null;\n acl: string[] | null;\n requiresApproval: boolean;\n approvalPolicy: Record<string, unknown>;\n enabled: boolean;\n\n constructor(init: ToolConfigInit) {\n this.id = init.id ?? null;\n this.name = init.name;\n this.kind = init.kind;\n this.description = init.description ?? \"\";\n this.config = init.config ?? {};\n this.sourceId = init.sourceId ?? init.source_id ?? null;\n this.acl = init.acl ?? null;\n this.requiresApproval = init.requiresApproval ?? init.requires_approval ?? false;\n this.approvalPolicy = init.approvalPolicy ?? init.approval_policy ?? {};\n this.enabled = init.enabled ?? true;\n }\n\n static fromUnknown(body: unknown): ToolConfig {\n if (!body || typeof body !== \"object\" || Array.isArray(body)) {\n throw new Error(\"tool config must be an object\");\n }\n const b = body as Record<string, unknown>;\n const kind = String(b.kind ?? \"\") as ToolKind;\n if (!KINDS.includes(kind)) {\n throw new Error(`canonicalFromConfig does not support kind=${JSON.stringify(b.kind)}`);\n }\n const name = String(b.name ?? \"\").trim();\n if (!name) throw new Error(\"name is required\");\n return new ToolConfig({\n id: b.id != null ? String(b.id) : null,\n name,\n kind,\n description: b.description != null ? String(b.description) : \"\",\n config: (b.config as Record<string, unknown> | undefined) ?? {},\n sourceId: (b.sourceId ?? b.source_id) as string | null | undefined,\n acl: (b.acl as string[] | null | undefined) ?? null,\n requiresApproval: Boolean(b.requiresApproval ?? b.requires_approval ?? false),\n approvalPolicy: (b.approvalPolicy ?? b.approval_policy ?? {}) as Record<string, unknown>,\n enabled: b.enabled === undefined ? true : Boolean(b.enabled),\n });\n }\n}\n\nconst SCHEMAS: Record<ToolKind, Record<string, unknown>> = {\n http: {\n type: \"object\",\n properties: {\n url: { type: \"string\", description: \"Endpoint URL, may contain {path} params\" },\n method: {\n type: \"string\",\n enum: [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"],\n default: \"GET\",\n },\n headers: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n writeOnly: true,\n },\n parameters: {\n type: \"object\",\n description: \"Static/user-fixed parameters sent on every call\",\n },\n llmParameters: {\n type: \"object\",\n description: \"JSON-Schema-shaped parameters the LLM fills in per call\",\n },\n llmQueryParameters: {\n type: \"object\",\n description: \"LLM-filled parameters sent as the query string\",\n },\n },\n required: [\"url\", \"method\"],\n },\n db: {\n type: \"object\",\n properties: {\n engine: {\n type: \"string\",\n enum: [\"postgresql\", \"mysql\", \"mariadb\", \"mssql\", \"sqlite\", \"oracle\", \"clickhouse\", \"snowflake\"],\n },\n host: { type: \"string\" },\n port: { type: \"integer\" },\n database: { type: \"string\" },\n username: { type: \"string\" },\n password: { type: \"string\", writeOnly: true },\n access_mode: {\n type: \"string\",\n enum: [\"readonly\", \"readwrite\", \"full\"],\n default: \"readonly\",\n },\n max_rows: { type: \"integer\", default: 1000 },\n selected_tables: { type: \"array\", items: { type: \"string\" } },\n },\n required: [\"engine\", \"database\"],\n },\n mcp: {\n type: \"object\",\n properties: {\n url: { type: \"string\" },\n transport: { type: \"string\", enum: [\"sse\", \"http\", \"websocket\"] },\n oauth: {\n type: \"object\",\n description: \"Discovered OAuth config, if any\",\n writeOnly: true,\n },\n headers: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n writeOnly: true,\n },\n },\n required: [\"url\", \"transport\"],\n },\n function: {\n type: \"object\",\n properties: {},\n },\n};\n\nexport function configSchema(kind: ToolKind): Record<string, unknown> {\n const schema = SCHEMAS[kind];\n if (!schema) throw new Error(`unknown tool kind: ${JSON.stringify(kind)}`);\n return schema;\n}\n","/** Bumped by CI on every main merge; 0.0.0 = pre-first-release. */\nexport const __version__ = \"0.0.0\";\n","import { __version__ } from \"../../version.js\";\n\nexport class MCPError extends Error {\n code: number;\n data: unknown;\n constructor(code: number, message: string, data: unknown = null) {\n super(`[${code}] ${message}`);\n this.name = \"MCPError\";\n this.code = code;\n this.data = data;\n }\n static fromJsonrpc(err: Record<string, unknown>): MCPError {\n return new MCPError(Number(err.code ?? -32000), String(err.message ?? \"MCP error\"), err.data);\n }\n}\n\ninterface Transport {\n kind: string;\n connect(): Promise<void>;\n close(): Promise<void>;\n send(msg: Record<string, unknown>): Promise<void>;\n recv(): Promise<Record<string, unknown>>;\n request?(msg: Record<string, unknown>): Promise<Record<string, unknown>>;\n}\n\nfunction parseSseBuffer(raw: string): Record<string, unknown> | null {\n const dataLines = raw\n .split(\"\\n\")\n .filter((ln) => ln.startsWith(\"data:\"))\n .map((ln) => ln.slice(5).trimStart());\n if (!dataLines.length) return null;\n try {\n const payload = JSON.parse(dataLines.join(\"\\n\"));\n if (payload && typeof payload === \"object\" && (\"result\" in payload || \"error\" in payload)) {\n return payload as Record<string, unknown>;\n }\n } catch {\n /* ignore */\n }\n return null;\n}\n\nclass HttpTransport implements Transport {\n kind = \"http\";\n url: string;\n private baseHeaders: Record<string, string>;\n private sessionId: string | null = null;\n\n constructor(url: string, headers: Record<string, string>) {\n this.url = url;\n this.baseHeaders = {\n ...headers,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json, text/event-stream\",\n };\n }\n\n async connect(): Promise<void> {\n /* stateless HTTP */\n }\n\n async close(): Promise<void> {\n this.sessionId = null;\n }\n\n private buildHeaders(): Record<string, string> {\n const hdrs = { ...this.baseHeaders };\n if (this.sessionId) hdrs[\"Mcp-Session-Id\"] = this.sessionId;\n return hdrs;\n }\n\n async request(msg: Record<string, unknown>): Promise<Record<string, unknown>> {\n const resp = await fetch(this.url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(msg),\n });\n const sid = resp.headers.get(\"Mcp-Session-Id\");\n if (sid) this.sessionId = sid;\n if (resp.status >= 400) {\n const body = await resp.text();\n console.error(`[HTTP Transport] ${resp.status} from ${this.url}: ${body.slice(0, 300)}`);\n throw new Error(`HTTP ${resp.status}: ${body.slice(0, 300)}`);\n }\n const contentType = resp.headers.get(\"Content-Type\") ?? \"\";\n if (contentType.includes(\"text/event-stream\")) {\n const text = await resp.text();\n let result: Record<string, unknown> = {};\n for (const frame of text.split(/\\r?\\n\\r?\\n/)) {\n const parsed = parseSseBuffer(frame);\n if (parsed) result = parsed;\n }\n return result;\n }\n return (await resp.json()) as Record<string, unknown>;\n }\n\n async send(msg: Record<string, unknown>): Promise<void> {\n await this.request(msg);\n }\n\n async recv(): Promise<Record<string, unknown>> {\n return {};\n }\n\n getBaseHeaders(): Record<string, string> {\n return { ...this.baseHeaders };\n }\n}\n\nclass SseTransport implements Transport {\n kind = \"sse\";\n eventsUrl: string;\n baseUrl: string;\n headers: Record<string, string>;\n private postUrl: string | null = null;\n private queue: Array<Record<string, unknown>> = [];\n private waiters: Array<(v: Record<string, unknown>) => void> = [];\n private abort: AbortController | null = null;\n\n constructor(url: string, headers: Record<string, string>) {\n this.eventsUrl = url.replace(/\\/$/, \"\");\n if (url.endsWith(\"/events\")) this.baseUrl = url.slice(0, -7);\n else if (url.endsWith(\"/sse\")) this.baseUrl = url.slice(0, -4);\n else this.baseUrl = url.replace(/\\/$/, \"\");\n this.headers = { ...headers };\n }\n\n private enqueue(msg: Record<string, unknown>): void {\n const waiter = this.waiters.shift();\n if (waiter) waiter(msg);\n else this.queue.push(msg);\n }\n\n async connect(): Promise<void> {\n this.abort = new AbortController();\n void this.listen();\n }\n\n private async listen(): Promise<void> {\n const resp = await fetch(this.eventsUrl, {\n headers: { ...this.headers, Accept: \"text/event-stream\" },\n signal: this.abort?.signal,\n });\n if (!resp.ok) throw new Error(`SSE ${resp.status}`);\n if (!resp.body) throw new Error(\"SSE response has no body\");\n const reader = resp.body.getReader();\n const decoder = new TextDecoder();\n let buf = \"\";\n let eventType: string | null = null;\n const frame: string[] = [];\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split(/\\n/);\n buf = lines.pop() ?? \"\";\n for (const line of lines) {\n if (line === \"\" || line === \"\\r\") {\n this.dispatchFrame(frame, eventType);\n frame.length = 0;\n eventType = null;\n continue;\n }\n const stripped = line.replace(/\\r$/, \"\");\n if (stripped.startsWith(\"event:\")) eventType = stripped.slice(6).trim();\n frame.push(stripped);\n }\n }\n }\n\n private dispatchFrame(buf: string[], eventType: string | null): void {\n const dataLines = buf.filter((l) => l.startsWith(\"data:\")).map((l) => l.slice(5).trimStart());\n if (!dataLines.length) return;\n const payload = dataLines.join(\"\\n\");\n if (eventType === \"endpoint\") {\n const endpoint = payload.trim();\n this.postUrl = endpoint.startsWith(\"/\") ? `${this.baseUrl}${endpoint}` : endpoint;\n return;\n }\n try {\n this.enqueue(JSON.parse(payload) as Record<string, unknown>);\n } catch {\n /* non-JSON frame */\n }\n }\n\n async close(): Promise<void> {\n this.abort?.abort();\n }\n\n async send(msg: Record<string, unknown>): Promise<void> {\n if (!this.postUrl) {\n for (let i = 0; i < 30; i++) {\n if (this.postUrl) break;\n await new Promise((r) => setTimeout(r, 100));\n }\n }\n const postUrl = this.postUrl || this.baseUrl;\n const resp = await fetch(postUrl, {\n method: \"POST\",\n headers: { ...this.headers, \"Content-Type\": \"application/json\" },\n body: JSON.stringify(msg),\n });\n if (!resp.ok) throw new Error(`SSE POST ${resp.status}`);\n try {\n const data = (await resp.json()) as Record<string, unknown>;\n if (data && typeof data === \"object\" && (\"result\" in data || \"error\" in data)) {\n this.enqueue(data);\n }\n } catch {\n /* response will come via SSE stream */\n }\n }\n\n async recv(): Promise<Record<string, unknown>> {\n if (this.queue.length) return this.queue.shift()!;\n return new Promise((resolve) => this.waiters.push(resolve));\n }\n}\n\nclass WsTransport implements Transport {\n kind = \"websocket\";\n url: string;\n headers: Record<string, string>;\n private ws: WebSocket | null = null;\n private queue: Array<Record<string, unknown>> = [];\n private waiters: Array<(v: Record<string, unknown>) => void> = [];\n\n constructor(url: string, headers: Record<string, string>) {\n this.url = url;\n this.headers = headers;\n }\n\n async connect(): Promise<void> {\n const WS = globalThis.WebSocket;\n if (!WS) throw new Error(\"WebSocket is not available in this runtime\");\n this.ws = new WS(this.url);\n this.ws.addEventListener(\"message\", (ev) => {\n try {\n const data = JSON.parse(String((ev as MessageEvent).data)) as Record<string, unknown>;\n const waiter = this.waiters.shift();\n if (waiter) waiter(data);\n else this.queue.push(data);\n } catch {\n /* ignore */\n }\n });\n await new Promise<void>((resolve, reject) => {\n this.ws!.addEventListener(\"open\", () => resolve());\n this.ws!.addEventListener(\"error\", () => reject(new Error(\"WebSocket error\")));\n });\n }\n\n async close(): Promise<void> {\n this.ws?.close();\n this.ws = null;\n }\n\n async send(msg: Record<string, unknown>): Promise<void> {\n if (!this.ws) throw new Error(\"Not connected\");\n this.ws.send(JSON.stringify(msg));\n }\n\n async recv(): Promise<Record<string, unknown>> {\n if (this.queue.length) return this.queue.shift()!;\n return new Promise((resolve) => this.waiters.push(resolve));\n }\n}\n\nexport class MCPClient {\n url: string;\n transport: Transport;\n connected = false;\n private id = 0;\n private pending = new Map<\n string,\n { resolve: (v: Record<string, unknown>) => void; reject: (e: unknown) => void }\n >();\n capabilities: Record<string, unknown> = {};\n tools: Array<Record<string, unknown>> = [];\n resources: Array<Record<string, unknown>> = [];\n private headers: Record<string, string>;\n\n constructor(url: string, headers: Record<string, string> | null = null) {\n this.url = url;\n this.headers = headers ?? {};\n this.transport = MCPClient.createTransport(url, this.headers);\n }\n\n static createTransport(url: string, headers: Record<string, string>): Transport {\n if (url.startsWith(\"stdio:\") || url === \"stdio\") {\n throw new Error(\"stdio MCP transport is not supported (cloud deployments use SSE/HTTP/WebSocket)\");\n }\n if (url.startsWith(\"ws://\") || url.startsWith(\"wss://\")) return new WsTransport(url, headers);\n if (\n url.startsWith(\"sse+http://\") ||\n url.startsWith(\"sse+https://\") ||\n url.endsWith(\"/events\") ||\n url.endsWith(\"/sse\")\n ) {\n const clean = url.replace(\"sse+http://\", \"http://\").replace(\"sse+https://\", \"https://\");\n return new SseTransport(clean, headers);\n }\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\")) return new HttpTransport(url, headers);\n throw new Error(`Unsupported URL: ${url} (use http(s)://, ws(s)://, or .../sse)`);\n }\n\n private nextId(): string {\n this.id += 1;\n return String(this.id);\n }\n\n private async recvLoop(): Promise<void> {\n while (this.connected) {\n const msg = await this.transport.recv();\n if (!msg) continue;\n const mid = msg.id != null ? String(msg.id) : null;\n if (mid && (\"result\" in msg || \"error\" in msg)) {\n const fut = this.pending.get(mid);\n this.pending.delete(mid);\n fut?.resolve(msg);\n }\n }\n }\n\n private async rpc(\n method: string,\n params: Record<string, unknown> | null = null,\n timeout = 60_000,\n ): Promise<unknown> {\n const mid = this.nextId();\n const payload = { jsonrpc: \"2.0\", id: mid, method, params: params ?? {} };\n if (this.transport instanceof HttpTransport) {\n const msg = await this.transport.request(payload);\n if (msg.error) throw MCPError.fromJsonrpc(msg.error as Record<string, unknown>);\n return msg.result ?? {};\n }\n const msg = await new Promise<Record<string, unknown>>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(mid);\n reject(new Error(`MCP RPC '${method}' timed out after ${timeout}ms`));\n }, timeout);\n this.pending.set(mid, {\n resolve: (v) => {\n clearTimeout(timer);\n resolve(v);\n },\n reject,\n });\n void this.transport.send(payload).catch((e) => {\n clearTimeout(timer);\n this.pending.delete(mid);\n reject(e);\n });\n });\n if (msg.error) throw MCPError.fromJsonrpc(msg.error as Record<string, unknown>);\n return msg.result ?? {};\n }\n\n private async notify(method: string, params: Record<string, unknown> | null = null): Promise<void> {\n await this.transport.send({ jsonrpc: \"2.0\", method, params: params ?? {} });\n }\n\n async connect(): Promise<void> {\n await this.transport.connect();\n if (!(this.transport instanceof HttpTransport)) {\n this.connected = true;\n void this.recvLoop();\n }\n try {\n const init = (await this.rpc(\"initialize\", {\n protocolVersion: \"2024-11-05\",\n capabilities: { roots: { listChanged: true }, sampling: {} },\n clientInfo: { name: \"context-engine\", version: __version__ },\n })) as Record<string, unknown>;\n this.capabilities = (init.capabilities as Record<string, unknown>) ?? {};\n await this.notify(\"notifications/initialized\");\n this.connected = true;\n } catch (e) {\n await this.close();\n throw e;\n }\n }\n\n async close(): Promise<void> {\n this.connected = false;\n for (const [, fut] of this.pending) fut.reject(new Error(\"closed\"));\n this.pending.clear();\n try {\n await this.transport.close();\n } catch {\n /* ignore */\n }\n }\n\n async listTools(): Promise<Array<Record<string, unknown>>> {\n const res = (await this.rpc(\"tools/list\")) as Record<string, unknown>;\n this.tools = (res.tools as Array<Record<string, unknown>>) ?? [];\n return this.tools;\n }\n\n async listResources(): Promise<Array<Record<string, unknown>>> {\n try {\n const res = (await this.rpc(\"resources/list\", null, 10_000)) as Record<string, unknown>;\n this.resources = (res.resources as Array<Record<string, unknown>>) ?? [];\n } catch {\n this.resources = [];\n }\n return this.resources;\n }\n\n async callTool(toolName: string, arguments_: Record<string, unknown>, timeout = 120_000): Promise<unknown> {\n return this.rpc(\"tools/call\", { name: toolName, arguments: arguments_ }, timeout);\n }\n\n async ping(): Promise<boolean> {\n try {\n await this.rpc(\"ping\", {}, 10_000);\n return true;\n } catch {\n return false;\n }\n }\n\n async callToolWithReconnect(\n toolName: string,\n arguments_: Record<string, unknown>,\n timeout = 120_000,\n ): Promise<unknown> {\n try {\n if (!this.connected) throw new Error(\"Not connected\");\n return await this.callTool(toolName, arguments_, timeout);\n } catch (e) {\n console.warn(`[MCP] Connection issue during call_tool(${toolName}), reconnecting:`, e);\n try {\n await this.reconnect();\n return await this.callTool(toolName, arguments_, timeout);\n } catch (retryErr) {\n throw new Error(`Reconnect failed: ${retryErr}`, { cause: e });\n }\n }\n }\n\n async reconnect(): Promise<void> {\n const url = this.url;\n let headers: Record<string, string> = {};\n if (this.transport instanceof HttpTransport) {\n headers = this.transport.getBaseHeaders();\n delete headers[\"Content-Type\"];\n delete headers.Accept;\n } else if (this.transport instanceof SseTransport || this.transport instanceof WsTransport) {\n headers = { ...this.transport.headers };\n }\n try {\n await this.close();\n } catch {\n /* ignore */\n }\n this.id = 0;\n this.pending.clear();\n this.transport = MCPClient.createTransport(url, headers);\n await this.connect();\n await this.listTools();\n }\n}\n\nexport class MCPRegistry {\n private clients = new Map<string, MCPClient>();\n private healthTask: ReturnType<typeof setInterval> | null = null;\n\n async connect(\n name: string,\n url: string,\n headers: Record<string, string> | null = null,\n token: string | null = null,\n ): Promise<void> {\n this.clients.delete(name);\n const hdrs = { ...(headers ?? {}) };\n if (token) hdrs.Authorization = hdrs.Authorization ?? `Bearer ${token}`;\n const client = new MCPClient(url, hdrs);\n await client.connect();\n await client.listTools();\n this.clients.set(name, client);\n if (!this.healthTask) {\n this.healthTask = setInterval(() => void this.healthLoopOnce(), 60_000);\n }\n }\n\n private async healthLoopOnce(): Promise<void> {\n for (const [name, client] of [...this.clients.entries()]) {\n if (!client.connected) continue;\n try {\n const alive = await client.ping();\n if (!alive) await client.reconnect();\n } catch (e) {\n console.warn(`[MCP Health] ${name} health check error:`, e);\n try {\n await client.reconnect();\n } catch {\n this.clients.delete(name);\n }\n }\n }\n }\n\n get(name: string): MCPClient {\n const c = this.clients.get(name);\n if (!c) throw new Error(`Unknown MCP server: '${name}'`);\n return c;\n }\n\n has(name: string): boolean {\n return this.clients.has(name);\n }\n\n async disconnect(name: string): Promise<void> {\n const c = this.clients.get(name);\n this.clients.delete(name);\n if (c) {\n try {\n await c.close();\n } catch {\n /* ignore */\n }\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.healthTask) {\n clearInterval(this.healthTask);\n this.healthTask = null;\n }\n for (const name of [...this.clients.keys()]) await this.disconnect(name);\n }\n}\n\nexport class PromptevMCP {\n clients = new MCPRegistry();\n\n async addServer(\n name: string,\n url: string,\n opts: { token?: string | null; headers?: Record<string, string> | null } = {},\n ): Promise<void> {\n await this.clients.connect(name, url, opts.headers ?? null, opts.token ?? null);\n }\n\n async shutdown(): Promise<void> {\n await this.clients.shutdown();\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { Pool } from \"pg\";\nimport type { ContextEngineConfig } from \"../config.js\";\nimport { EngineActionError } from \"../errors.js\";\nimport { emitUsage, type Hooks } from \"../hooks.js\";\nimport { applyRedaction, type RedactionPolicy } from \"../redaction.js\";\nimport type { UsageEvent } from \"../usage.js\";\nimport { aclVisible } from \"./acl.js\";\nimport { createPending, shouldRequireApproval } from \"./approval.js\";\nimport { logToolCall, ToolCallTimer } from \"./audit.js\";\nimport { ToolConfig } from \"./config.js\";\nimport { decryptDict, encryptDict, getSecretKey } from \"./crypto.js\";\nimport { executeDb, getSchemaText } from \"./executors/db.js\";\nimport { executeHttp, type ToolHttpClient } from \"./executors/http.js\";\nimport { PromptevMCP } from \"./executors/mcp-client.js\";\nimport { type CanonicalTool, canonicalFromConfig, findTool } from \"./registry.js\";\n\nexport const RESULT_MAX_CHARS = 8_000;\nexport const RESULT_MAX_ROWS = 100;\n\nconst UPDATABLE_COLUMNS = new Set([\n \"name\",\n \"kind\",\n \"description\",\n \"sourceId\",\n \"source_id\",\n \"acl\",\n \"requiresApproval\",\n \"requires_approval\",\n \"approvalPolicy\",\n \"approval_policy\",\n \"enabled\",\n]);\n\nexport type ToolEngine = {\n pool: Pool;\n config: ContextEngineConfig;\n hooks?: Hooks | null;\n _functionTools?: Record<string, CanonicalTool>;\n _toolHttpClient?: ToolHttpClient | null;\n};\n\nexport function toolVisible(ct: CanonicalTool, principals: string[] | null | undefined): boolean {\n return aclVisible(ct.acl, principals);\n}\n\nexport function stripUnderscoreArgs(\n args: Record<string, unknown> | null | undefined,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(args ?? {})) {\n if (!String(k).startsWith(\"_\")) out[k] = v;\n }\n return out;\n}\n\nexport function shapeResult(\n result: unknown,\n opts: { maxChars?: number; maxRows?: number } = {},\n): [unknown, boolean] {\n const maxChars = opts.maxChars ?? RESULT_MAX_CHARS;\n const maxRows = opts.maxRows ?? RESULT_MAX_ROWS;\n let truncated = false;\n let shaped = result;\n\n if (\n result &&\n typeof result === \"object\" &&\n Array.isArray((result as { rows?: unknown }).rows) &&\n (result as { rows: unknown[] }).rows.length > maxRows\n ) {\n const rows = (result as { rows: unknown[] }).rows;\n const kept = rows.slice(0, maxRows);\n shaped = {\n ...(result as object),\n rows: kept,\n _result_shaping: { rows_returned: kept.length, rows_omitted: rows.length - kept.length },\n };\n truncated = true;\n }\n\n let serialized: string;\n try {\n serialized = JSON.stringify(shaped);\n } catch {\n serialized = JSON.stringify(String(shaped));\n }\n if (serialized.length > maxChars) {\n return [\n {\n _truncated: serialized.slice(0, maxChars),\n _original_size: serialized.length,\n _note: \"tool result exceeded the context budget and was truncated\",\n },\n true,\n ];\n }\n return [shaped, truncated];\n}\n\nexport function redactToolResult(\n result: unknown,\n policy: RedactionPolicy,\n opts: {\n principals?: readonly string[] | null;\n secretKey?: string | Buffer | null;\n hooks?: Hooks | null;\n },\n): [unknown, Record<string, unknown>] {\n if (policy.isEmpty()) return [result, {}];\n const fired: string[] = [];\n const failed: string[] = [];\n let total = 0;\n\n const walk = (node: unknown): unknown => {\n if (typeof node === \"string\") {\n const [text, note] = applyRedaction(node, policy, {\n phase: \"output\",\n principals: opts.principals ?? null,\n secretKey: opts.secretKey,\n hooks: opts.hooks,\n });\n if (note && Object.keys(note).length) {\n total += note.spans ?? 0;\n for (const name of note.rules_fired ?? []) {\n if (!fired.includes(name)) fired.push(name);\n }\n for (const name of note.rules_failed ?? []) {\n if (!failed.includes(name)) failed.push(name);\n }\n }\n return text;\n }\n if (node && typeof node === \"object\") {\n if (Array.isArray(node)) return node.map(walk);\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) out[k] = walk(v);\n return out;\n }\n return node;\n };\n\n const redacted = walk(result);\n if (!fired.length && !failed.length) return [redacted, {}];\n const note: Record<string, unknown> = { rules_fired: fired, spans: total };\n if (failed.length) note.rules_failed = failed;\n return [redacted, note];\n}\n\nfunction rowToToolConfig(row: Record<string, unknown>, engine: ToolEngine): ToolConfig {\n let config: Record<string, unknown> = {};\n if (row.config_encrypted) {\n config = decryptDict(String(row.config_encrypted), getSecretKey(engine.config));\n }\n return new ToolConfig({\n id: String(row.id),\n name: String(row.name),\n kind: row.kind as ToolConfig[\"kind\"],\n description: String(row.description ?? \"\"),\n config,\n sourceId: (row.source_id as string | null) ?? null,\n acl: row.acl != null ? [...(row.acl as string[])] : null,\n requiresApproval: Boolean(row.requires_approval),\n approvalPolicy: (row.approval_policy as Record<string, unknown>) ?? {},\n enabled: Boolean(row.enabled),\n });\n}\n\nasync function loadPersistedCanonicals(\n engine: ToolEngine,\n sourceId: string | null,\n): Promise<CanonicalTool[]> {\n const params: unknown[] = [];\n let sql = `SELECT * FROM context_engine_tools WHERE enabled IS TRUE`;\n if (sourceId != null) {\n params.push(sourceId);\n sql += ` AND source_id = $1`;\n }\n const result = await engine.pool.query(sql, params);\n const canonicals: CanonicalTool[] = [];\n for (const row of result.rows) {\n canonicals.push(...canonicalFromConfig(rowToToolConfig(row, engine)));\n }\n return canonicals;\n}\n\nasync function mergedTools(engine: ToolEngine, sourceId: string | null): Promise<CanonicalTool[]> {\n const persisted = await loadPersistedCanonicals(engine, sourceId);\n const functions = Object.values(engine._functionTools ?? {});\n return [...persisted, ...functions];\n}\n\nfunction canonicalToPublic(ct: CanonicalTool): Record<string, unknown> {\n return {\n name: ct.callName,\n kind: ct.kind,\n description: ct.description,\n params_schema: ct.paramsSchema,\n };\n}\n\nexport async function registerTool(engine: ToolEngine, tc: ToolConfig): Promise<string> {\n canonicalFromConfig(tc);\n const config = tc.config ?? {};\n const configEncrypted = Object.keys(config).length\n ? encryptDict(config, getSecretKey(engine.config))\n : null;\n const id = randomUUID();\n await engine.pool.query(\n `INSERT INTO context_engine_tools\n (id, name, kind, description, source_id, acl, config_encrypted,\n requires_approval, approval_policy, enabled)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::jsonb, $10)`,\n [\n id,\n tc.name,\n tc.kind,\n tc.description || \"\",\n tc.sourceId,\n tc.acl,\n configEncrypted,\n tc.requiresApproval,\n JSON.stringify(tc.approvalPolicy ?? {}),\n tc.enabled,\n ],\n );\n return id;\n}\n\nexport async function updateTool(\n engine: ToolEngine,\n id: string,\n opts: { principals?: string[] | null } & Record<string, unknown>,\n): Promise<ToolConfig> {\n const { principals = null, ...fields } = opts;\n const existing = await engine.pool.query(`SELECT * FROM context_engine_tools WHERE id = $1`, [id]);\n const row = existing.rows[0];\n if (!row || !aclVisible(row.acl != null ? [...row.acl] : null, principals)) {\n throw new EngineActionError(`tool not found: ${id}`);\n }\n const sets: string[] = [];\n const params: unknown[] = [];\n let i = 1;\n for (const [key, value] of Object.entries(fields)) {\n if (key === \"config\") {\n sets.push(`config_encrypted = $${i++}`);\n params.push(value ? encryptDict(value as Record<string, unknown>, getSecretKey(engine.config)) : null);\n } else if (UPDATABLE_COLUMNS.has(key)) {\n const col =\n key === \"sourceId\"\n ? \"source_id\"\n : key === \"requiresApproval\"\n ? \"requires_approval\"\n : key === \"approvalPolicy\"\n ? \"approval_policy\"\n : key;\n sets.push(`${col} = $${i++}`);\n params.push(col === \"approval_policy\" ? JSON.stringify(value ?? {}) : value);\n }\n }\n sets.push(`updated_at = now()`);\n params.push(id);\n const updated = await engine.pool.query(\n `UPDATE context_engine_tools SET ${sets.join(\", \")} WHERE id = $${i} RETURNING *`,\n params,\n );\n return rowToToolConfig(updated.rows[0], engine);\n}\n\nexport async function deleteTool(\n engine: ToolEngine,\n id: string,\n opts: { principals?: string[] | null } = {},\n): Promise<void> {\n const existing = await engine.pool.query(`SELECT * FROM context_engine_tools WHERE id = $1`, [id]);\n const row = existing.rows[0];\n if (!row || !aclVisible(row.acl != null ? [...row.acl] : null, opts.principals ?? null)) {\n throw new EngineActionError(`tool not found: ${id}`);\n }\n await engine.pool.query(`DELETE FROM context_engine_tools WHERE id = $1`, [id]);\n}\n\nexport async function listTools(\n engine: ToolEngine,\n opts: { sourceId?: string | null; principals?: string[] | null } = {},\n): Promise<Array<Record<string, unknown>>> {\n const tools = await mergedTools(engine, opts.sourceId ?? null);\n return tools.filter((ct) => toolVisible(ct, opts.principals ?? null)).map(canonicalToPublic);\n}\n\nexport async function searchTools(\n engine: ToolEngine,\n query: string,\n opts: { sourceId?: string | null; principals?: string[] | null; limit?: number } = {},\n): Promise<Array<Record<string, unknown>>> {\n const listed = await listTools(engine, { sourceId: opts.sourceId, principals: opts.principals });\n const limit = opts.limit ?? 10;\n const normalized = (query || \"\").toLowerCase().trim();\n if (!normalized) return listed.slice(0, limit);\n const terms = normalized.split(/\\s+/);\n const scored: Array<[number, Record<string, unknown>]> = [];\n for (const tool of listed) {\n const haystack = `${tool.name} ${tool.description}`.toLowerCase();\n const score = terms.reduce((n, term) => n + (haystack.includes(term) ? 1 : 0), 0);\n if (score > 0) scored.push([score, tool]);\n }\n scored.sort((a, b) => b[0] - a[0]);\n return scored.slice(0, limit).map(([, t]) => t);\n}\n\nconst PROBE_AUTH = [\n \"authentication failed\",\n \"pg_hba\",\n \"permission denied\",\n \"access denied\",\n \"password\",\n \"unauthorized\",\n \"forbidden\",\n \"401\",\n \"403\",\n \"invalid credentials\",\n];\nconst PROBE_UNREACHABLE = [\n \"connection refused\",\n \"could not connect\",\n \"name or service not known\",\n \"nodename nor servname\",\n \"no route to host\",\n \"network is unreachable\",\n \"temporary failure in name resolution\",\n \"getaddrinfo\",\n \"connection reset\",\n \"fetch failed\",\n \"econnrefused\",\n \"enotfound\",\n];\nconst PROBE_TIMEOUT = [\"timed out\", \"timeout\", \"aborted\"];\nconst PROBE_MISCONFIGURED = [\n \"does not exist\",\n \"invalid\",\n \"unknown database\",\n \"syntax error\",\n \"no such\",\n \"missing\",\n \"not supported\",\n \"unsupported\",\n];\n\nfunction classifyProbeError(exc: unknown): string {\n if (exc instanceof DOMException && exc.name === \"TimeoutError\") return \"timeout\";\n const name = exc instanceof Error ? exc.name : \"\";\n if (name.includes(\"Timeout\")) return \"timeout\";\n if ([\"ConnectError\", \"ConnectionError\", \"NetworkError\", \"TypeError\"].some((t) => name.includes(t))) {\n if (name === \"TypeError\" && !String(exc).toLowerCase().includes(\"fetch\")) {\n /* fall through */\n } else if (name !== \"TypeError\") return \"unreachable\";\n }\n if ([\"Auth\", \"Permission\", \"Forbidden\", \"Unauthorized\"].some((t) => name.includes(t))) return \"auth_failed\";\n const text = String(exc).toLowerCase();\n if (PROBE_TIMEOUT.some((t) => text.includes(t))) return \"timeout\";\n if (PROBE_AUTH.some((t) => text.includes(t))) return \"auth_failed\";\n if (PROBE_UNREACHABLE.some((t) => text.includes(t))) return \"unreachable\";\n if (PROBE_MISCONFIGURED.some((t) => text.includes(t))) return \"misconfigured\";\n return \"error\";\n}\n\nfunction probeFailure(exc: unknown, kind: string): Record<string, unknown> {\n const category = classifyProbeError(exc);\n console.warn(`test_tool(kind=${kind}) failed:`, exc, \"->\", category);\n return { ok: false, error: category };\n}\n\nexport async function testTool(_engine: ToolEngine, tc: ToolConfig): Promise<Record<string, unknown>> {\n const kind = tc.kind;\n const config = tc.config ?? {};\n if (kind === \"http\") {\n const url = config.url as string | undefined;\n if (!url) return { ok: false, error: \"http config missing 'url'\" };\n try {\n const resp = await fetch(url, {\n method: \"HEAD\",\n headers: (config.headers as Record<string, string>) ?? {},\n redirect: \"follow\",\n signal: AbortSignal.timeout(10_000),\n });\n return { ok: resp.status < 500, status_code: resp.status };\n } catch (exc) {\n return probeFailure(exc, \"http\");\n }\n }\n if (kind === \"db\") {\n try {\n const { testConnection } = await import(\"./executors/db.js\");\n const result = await testConnection(config);\n return { ok: Boolean(result.success ?? result.ok), ...result };\n } catch (exc) {\n return probeFailure(exc, \"db\");\n }\n }\n if (kind === \"mcp\") {\n const url = config.url as string | undefined;\n if (!url) return { ok: false, error: \"mcp config missing 'url'\" };\n const token = (config.oauth_token ?? config.bearer ?? config.access_token) as string | undefined;\n const mcp = new PromptevMCP();\n try {\n await mcp.addServer(tc.name, url, { token: token ?? null });\n const client = mcp.clients.get(tc.name);\n return { ok: true, tools: client.tools.map((t) => t.name) };\n } catch (exc) {\n return probeFailure(exc, \"mcp\");\n } finally {\n await mcp.shutdown();\n }\n }\n return { ok: false, error: `test_tool does not support kind=${JSON.stringify(kind)}` };\n}\n\nasync function findAndClaimApproved(\n engine: ToolEngine,\n toolName: string,\n args: Record<string, unknown>,\n sourceId: string | null,\n): Promise<string | null> {\n const claimedAt = new Date();\n const candidates = await engine.pool.query(\n `SELECT * FROM context_engine_tool_approvals WHERE tool_name = $1 AND status = 'approved'`,\n [toolName],\n );\n for (const row of candidates.rows) {\n if ((row.source_id ?? null) !== (sourceId ?? null)) continue;\n const frozen = row.tool_args_frozen ?? {};\n if (JSON.stringify(frozen) !== JSON.stringify(args)) continue;\n const result = await engine.pool.query(\n `UPDATE context_engine_tool_approvals\n SET status = 'executed', resolved_at = $1\n WHERE id = $2 AND status = 'approved'\n RETURNING id`,\n [claimedAt, row.id],\n );\n if (result.rowCount === 1) return String(row.id);\n }\n return null;\n}\n\nasync function dispatchMcp(\n ct: CanonicalTool,\n config: Record<string, unknown>,\n args: Record<string, unknown>,\n): Promise<unknown> {\n const url = config.url as string | undefined;\n if (!url) throw new EngineActionError(`mcp tool ${ct.callName} config missing 'url'`);\n const headers = { ...((config.headers as Record<string, string>) ?? {}) };\n const token = (config.oauth_token ?? config.bearer ?? config.access_token) as string | undefined;\n const apiKey = config.api_key as string | undefined;\n if (token) headers.Authorization = `Bearer ${token}`;\n else if (apiKey) headers.Authorization = `Bearer ${apiKey}`;\n const toolName = String(ct.raw?.tool_name ?? ct.displayName);\n const mcp = new PromptevMCP();\n try {\n await mcp.addServer(ct.callName, url, { headers: Object.keys(headers).length ? headers : null });\n const client = mcp.clients.get(ct.callName);\n return await client.callToolWithReconnect(toolName, args);\n } finally {\n await mcp.shutdown();\n }\n}\n\nasync function dispatch(\n engine: ToolEngine,\n ct: CanonicalTool,\n config: Record<string, unknown>,\n args: Record<string, unknown>,\n): Promise<unknown> {\n if (ct.kind === \"http\") {\n return executeHttp(config, args, { client: engine._toolHttpClient ?? null });\n }\n if (ct.kind === \"db\") {\n const query = String(args.query ?? \"\");\n if (query.trim().toLowerCase().startsWith(\"describe:\")) {\n const tables = query\n .slice(query.indexOf(\":\") + 1)\n .split(\",\")\n .map((t) => t.trim())\n .filter(Boolean);\n const schemaText = await getSchemaText(config, tables.length ? tables : null);\n return { success: true, schema: schemaText };\n }\n const result = await executeDb(config, query);\n if (result && typeof result === \"object\" && result.success === false) {\n throw new EngineActionError(String(result.error || \"database query failed\"));\n }\n return result;\n }\n if (ct.kind === \"mcp\") return dispatchMcp(ct, config, args);\n if (ct.kind === \"function\") {\n const fn = ct.raw?.callable as ((...a: unknown[]) => unknown) | undefined;\n if (!fn) throw new EngineActionError(`function tool ${ct.callName} has no callable`);\n return await fn(...namedArgs(fn, args));\n }\n throw new EngineActionError(`unsupported tool kind: ${JSON.stringify(ct.kind)}`);\n}\n\nfunction namedArgs(fn: (...a: unknown[]) => unknown, args: Record<string, unknown>): unknown[] {\n const src = Function.prototype.toString.call(fn);\n const match = src.match(/\\(([^)]*)\\)/);\n const names = (match?.[1] ?? \"\")\n .split(\",\")\n .map((p) => p.trim().split(/\\s*=/)[0]?.trim())\n .filter(Boolean);\n if (!names.length) return Object.values(args);\n return names.map((n) => args[n!]);\n}\n\nasync function decryptCtConfig(engine: ToolEngine, toolId: string): Promise<Record<string, unknown>> {\n const result = await engine.pool.query(`SELECT config_encrypted FROM context_engine_tools WHERE id = $1`, [\n toolId,\n ]);\n const row = result.rows[0];\n if (!row?.config_encrypted) return {};\n return decryptDict(String(row.config_encrypted), getSecretKey(engine.config));\n}\n\nexport async function executeTool(\n engine: ToolEngine,\n callName: string,\n args: Record<string, unknown> | null | undefined,\n opts: {\n sourceId?: string | null;\n principals?: string[] | null;\n actor?: { type?: string; id?: unknown } | null;\n source?: string;\n } = {},\n): Promise<Record<string, unknown>> {\n const runtimeArgs = args ?? {};\n const ct = findTool(await mergedTools(engine, opts.sourceId ?? null), callName);\n if (!ct) throw new EngineActionError(`tool not found: ${callName}`);\n if (!toolVisible(ct, opts.principals ?? null)) {\n throw new EngineActionError(`tool not found: ${callName}`);\n }\n\n const publicArgs = stripUnderscoreArgs(runtimeArgs);\n let approvalId: string | null = null;\n if (shouldRequireApproval(ct, publicArgs)) {\n approvalId = await findAndClaimApproved(engine, ct.callName, publicArgs, opts.sourceId ?? null);\n if (approvalId == null) {\n const record = await createPending(engine, {\n toolName: ct.callName,\n args: publicArgs,\n sourceId: opts.sourceId ?? null,\n principals: opts.principals ?? null,\n policy: ct.approvalPolicy ?? {},\n });\n const reason = ct.requiresApproval\n ? \"tool requires approval\"\n : `approval policy condition met: ${ct.approvalPolicy?.condition}`;\n return {\n approval_required: {\n approval_id: String(record.id),\n tool_name: ct.callName,\n args: publicArgs,\n reason,\n },\n };\n }\n }\n\n let config: Record<string, unknown> = {};\n if (ct.kind !== \"function\" && ct.id != null) {\n config = await decryptCtConfig(engine, ct.id);\n }\n\n const actorType = opts.actor?.type ?? null;\n const actorId = opts.actor?.id ?? null;\n let rawResult: unknown = null;\n let exc: unknown = null;\n const timer = new ToolCallTimer().start();\n try {\n rawResult = await dispatch(engine, ct, config, publicArgs);\n } catch (e) {\n exc = e;\n }\n timer.stop();\n\n let success = exc == null;\n let shaped: unknown = null;\n let truncated = false;\n if (success) {\n try {\n const [redacted] = redactToolResult(rawResult, engine.config.redaction, {\n principals: opts.principals ?? null,\n secretKey: engine.config.secretKey,\n hooks: engine.hooks,\n });\n rawResult = redacted;\n [shaped, truncated] = shapeResult(rawResult);\n } catch (e) {\n exc = e;\n success = false;\n }\n }\n\n await logToolCall(engine, {\n toolId: ct.id,\n toolName: ct.callName,\n kind: ct.kind,\n actorType,\n actorId,\n source: opts.source ?? \"api\",\n inputArgs: publicArgs,\n outputResult: success ? rawResult : null,\n success,\n error: exc,\n durationMs: timer.durationMs,\n units: success ? 1 : 0,\n approvalId,\n });\n\n if (!success) {\n throw new EngineActionError(`tool execution failed: ${ct.callName}: ${exc}`);\n }\n\n const usage: UsageEvent = {\n kind: \"tool\",\n units: 1,\n detail: { tool_name: ct.callName, kind: ct.kind, truncated },\n };\n emitUsage(engine.hooks, usage);\n\n return {\n result: shaped,\n usage: { units: 1, kind: \"tool\", tool_name: ct.callName, truncated },\n };\n}\n","import type { UsageEvent } from \"./usage.js\";\n\nconst log = {\n warn: (...args: unknown[]) => console.warn(\"[context-engine]\", ...args),\n error: (...args: unknown[]) => console.error(\"[context-engine]\", ...args),\n};\n\nexport interface Hooks {\n onUsage?: ((event: UsageEvent) => void) | null;\n onError?: ((exc: unknown, ctx: Record<string, unknown>) => void) | null;\n onToolCall?: ((event: Record<string, unknown>) => void) | null;\n}\n\nexport function emitUsage(hooks: Hooks | null | undefined, event: UsageEvent): void {\n if (!hooks?.onUsage) return;\n try {\n hooks.onUsage(event);\n } catch {\n log.warn(\"onUsage callback raised; swallowing\");\n }\n}\n\nexport function emitError(hooks: Hooks | null | undefined, exc: unknown, ctx: Record<string, unknown>): void {\n log.error(\"context_engine error:\", exc, \"| ctx=\", ctx);\n if (!hooks?.onError) return;\n try {\n hooks.onError(exc, ctx);\n } catch {\n log.warn(\"onError callback raised; swallowing\");\n }\n}\n\nexport function emitToolCall(hooks: Hooks | null | undefined, event: Record<string, unknown>): void {\n if (!hooks?.onToolCall) return;\n try {\n hooks.onToolCall(event);\n } catch {\n log.warn(\"onToolCall callback raised; swallowing\");\n }\n}\n","import { createCipheriv, createDecipheriv, createHmac, randomBytes } from \"node:crypto\";\n\n/**\n * AES-256-GCM crypto seam. Wire format is a compatibility promise with the\n * Python library and promptev-connectors:\n * base64(nonce[12] || AES-256-GCM ciphertext+tag)\n */\n\nexport function encryptDict(data: Record<string, unknown>, key: Buffer): string {\n const nonce = randomBytes(12);\n const cipher = createCipheriv(\"aes-256-gcm\", key, nonce);\n const plaintext = Buffer.from(JSON.stringify(data), \"utf8\");\n const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const tag = cipher.getAuthTag();\n return Buffer.concat([nonce, ciphertext, tag]).toString(\"base64\");\n}\n\nexport function decryptDict(token: string, key: Buffer): Record<string, unknown> {\n const raw = Buffer.from(token, \"base64\");\n const nonce = raw.subarray(0, 12);\n const tag = raw.subarray(raw.length - 16);\n const ciphertext = raw.subarray(12, raw.length - 16);\n const decipher = createDecipheriv(\"aes-256-gcm\", key, nonce);\n decipher.setAuthTag(tag);\n const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return JSON.parse(plaintext.toString(\"utf8\")) as Record<string, unknown>;\n}\n\nexport function getSecretKey(config: { secretKey?: string | null }): Buffer {\n const secretKey = config.secretKey;\n if (!secretKey) {\n throw new Error(\n \"ContextEngineConfig.secretKey (env CE_SECRET_KEY) is not configured — \" +\n \"a base64url-encoded 32-byte AES key is required to encrypt/decrypt \" +\n \"tool configs that hold secrets.\",\n );\n }\n return Buffer.from(secretKey, \"base64url\");\n}\n\nexport function hmacSha256Hex(key: string | Buffer, value: string): string {\n const k = typeof key === \"string\" ? Buffer.from(key) : key;\n return createHmac(\"sha256\", k).update(value, \"utf8\").digest(\"hex\");\n}\n","import { hmacSha256Hex } from \"./crypto.js\";\nimport { emitError, type Hooks } from \"./hooks.js\";\n\nexport type Span = [number, number];\nexport type DetectorFn = (text: string) => Span[];\nexport type RedactionAction = \"mask\" | \"hash\" | \"remove\";\nexport type ApplyAt = \"ingest\" | \"output\" | \"both\";\nexport type RedactionPhase = \"ingest\" | \"output\";\n\nexport const BUILTIN_DETECTOR_NAMES = new Set([\"email\", \"phone\", \"ssn\", \"credit_card\", \"iban\", \"api_key\"]);\n\nexport interface RedactionRuleInit {\n name: string;\n detector?: string | null;\n pattern?: string | null;\n field?: string | null;\n action?: RedactionAction;\n placeholder?: string | null;\n applyAt?: ApplyAt;\n unless?: string[];\n}\n\nexport class RedactionRule {\n name: string;\n detector: string | null;\n pattern: string | null;\n field: string | null;\n action: RedactionAction;\n placeholder: string | null;\n applyAt: ApplyAt;\n unless: string[];\n private compiled: RegExp | null = null;\n\n constructor(init: RedactionRuleInit) {\n this.name = init.name;\n this.detector = init.detector ?? null;\n this.pattern = init.pattern ?? null;\n this.field = init.field ?? null;\n this.action = init.action ?? \"mask\";\n this.placeholder = init.placeholder ?? null;\n this.applyAt = init.applyAt ?? \"output\";\n this.unless = init.unless ?? [];\n this.validate();\n }\n\n private validate(): void {\n if (this.field !== null) {\n throw new Error(\n `rule '${this.name}': field-targeted rules are not implemented yet; use detector or pattern instead`,\n );\n }\n const targets = [this.detector, this.pattern].filter((t) => t !== null);\n if (targets.length !== 1) {\n throw new Error(`rule '${this.name}': exactly one of detector/pattern must be set`);\n }\n if (this.pattern !== null) {\n try {\n this.compiled = new RegExp(this.pattern, \"g\");\n } catch (exc) {\n throw new Error(`rule '${this.name}': invalid regex: ${exc}`);\n }\n }\n if (this.unless.length && this.applyAt === \"ingest\") {\n throw new Error(\n `rule '${this.name}': unless is output-time only and cannot be set on an applyAt='ingest' rule`,\n );\n }\n }\n\n patternRe(): RegExp | null {\n return this.compiled;\n }\n\n effectivePlaceholder(): string {\n return this.placeholder || `[${this.name.toUpperCase()}]`;\n }\n}\n\nexport interface RedactionPolicyInit {\n rules?: RedactionRule[] | RedactionRuleInit[];\n customDetectors?: Record<string, DetectorFn>;\n}\n\nexport class RedactionPolicy {\n rules: RedactionRule[];\n customDetectors: Record<string, DetectorFn>;\n\n constructor(init: RedactionPolicyInit = {}) {\n this.rules = (init.rules ?? []).map((r) => (r instanceof RedactionRule ? r : new RedactionRule(r)));\n this.customDetectors = init.customDetectors ?? {};\n const seen = new Set<string>();\n for (const rule of this.rules) {\n if (seen.has(rule.name)) throw new Error(`duplicate rule name: '${rule.name}'`);\n seen.add(rule.name);\n if (rule.detector !== null) {\n const known = BUILTIN_DETECTOR_NAMES.has(rule.detector) || rule.detector in this.customDetectors;\n if (!known) {\n throw new Error(\n `rule '${rule.name}': unknown detector '${rule.detector}' (not built-in and not in customDetectors)`,\n );\n }\n }\n }\n }\n\n isEmpty(): boolean {\n return this.rules.length === 0;\n }\n}\n\nconst EMAIL_RE = /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}/g;\nconst PHONE_RE = /\\+\\d[\\d\\s-]{7,17}\\d/g;\nconst SSN_RE = /(?<!\\d)\\d{3}-\\d{2}-\\d{4}(?!\\d)/g;\nconst CARD_RE = /(?<!\\d)(?:\\d[ -]?){12,18}\\d(?!\\d)/g;\nconst IBAN_RE = /(?<![A-Za-z0-9])[A-Z]{2}\\d{2}[A-Z0-9]{10,30}(?![A-Za-z0-9])/g;\nconst API_KEY_ALNUM = \"A-Za-z0-9_\\\\-+/=\";\nconst API_KEY_PREFIX_RE = new RegExp(\n `(?<![${API_KEY_ALNUM}])(?:(?:AKIA|ASIA)[0-9A-Z]{16}|sk-[A-Za-z0-9]{20,}|gh[opsu]_[A-Za-z0-9]{20,}|xox[baprs]-[A-Za-z0-9\\\\-]{10,}|AIza[0-9A-Za-z_\\\\-]{35})(?![${API_KEY_ALNUM}])`,\n \"g\",\n);\nconst API_KEY_GENERIC_RE = new RegExp(\n `(?<![${API_KEY_ALNUM}])[${API_KEY_ALNUM}]{24,}(?![${API_KEY_ALNUM}])`,\n \"g\",\n);\nconst UUID_RE = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;\n\nfunction spansFrom(re: RegExp, text: string): Span[] {\n const out: Span[] = [];\n re.lastIndex = 0;\n let m = re.exec(text);\n while (m !== null) {\n out.push([m.index, m.index + m[0].length]);\n if (m[0].length === 0) re.lastIndex++;\n m = re.exec(text);\n }\n return out;\n}\n\nfunction luhnOk(digits: string): boolean {\n let total = 0;\n const rev = [...digits].reverse();\n for (let i = 0; i < rev.length; i++) {\n let d = Number(rev[i]);\n if (i % 2 === 1) {\n d *= 2;\n if (d > 9) d -= 9;\n }\n total += d;\n }\n return total % 10 === 0;\n}\n\nfunction detectCreditCard(text: string): Span[] {\n const spans: Span[] = [];\n for (const [start, end] of spansFrom(CARD_RE, text)) {\n const digits = text.slice(start, end).replace(/[ -]/g, \"\");\n if (digits.length >= 13 && digits.length <= 19 && luhnOk(digits)) {\n spans.push([start, end]);\n }\n }\n return spans;\n}\n\nfunction looksLikeGenericSecret(token: string): boolean {\n if (UUID_RE.test(token)) return false;\n let hasUpper = false;\n let hasLower = false;\n let hasDigit = false;\n for (const c of token) {\n if (c >= \"A\" && c <= \"Z\") hasUpper = true;\n else if (c >= \"a\" && c <= \"z\") hasLower = true;\n else if (c >= \"0\" && c <= \"9\") hasDigit = true;\n }\n return hasUpper && hasLower && hasDigit;\n}\n\nfunction detectApiKey(text: string): Span[] {\n const spans = spansFrom(API_KEY_PREFIX_RE, text);\n for (const [start, end] of spansFrom(API_KEY_GENERIC_RE, text)) {\n if (spans.some(([s, e]) => start < e && s < end)) continue;\n if (looksLikeGenericSecret(text.slice(start, end))) spans.push([start, end]);\n }\n return spans;\n}\n\nconst BUILTIN: Record<string, DetectorFn> = {\n email: (t) => spansFrom(EMAIL_RE, t),\n phone: (t) => spansFrom(PHONE_RE, t),\n ssn: (t) => spansFrom(SSN_RE, t),\n credit_card: detectCreditCard,\n iban: (t) => spansFrom(IBAN_RE, t),\n api_key: detectApiKey,\n};\n\nexport function detectBuiltin(name: string, text: string): Span[] {\n const detector = BUILTIN[name];\n if (!detector) throw new Error(`unknown built-in detector: ${name}`);\n if (!text) return [];\n return detector(text).sort((a, b) => a[0] - b[0]);\n}\n\nexport function ruleApplies(\n rule: RedactionRule,\n opts: { phase: RedactionPhase; principals: readonly string[] | null },\n): boolean {\n if (rule.applyAt !== \"both\" && rule.applyAt !== opts.phase) return false;\n if (opts.phase === \"ingest\") return true;\n if (!rule.unless.length) return true;\n if (opts.principals === null) return false;\n const held = new Set(opts.principals);\n return !rule.unless.some((p) => held.has(p));\n}\n\nfunction spansForRule(rule: RedactionRule, text: string, policy: RedactionPolicy): Span[] {\n if (rule.pattern !== null) {\n const re = rule.patternRe() ?? new RegExp(rule.pattern, \"g\");\n return spansFrom(re, text);\n }\n if (rule.detector !== null) {\n const custom = policy.customDetectors[rule.detector];\n if (custom) return [...custom(text)];\n return detectBuiltin(rule.detector, text);\n }\n return [];\n}\n\nconst HASH_TOKEN_CHARS = 16;\n\nfunction hashToken(value: string, secretKey: string | Buffer | null | undefined): string {\n const key = Buffer.isBuffer(secretKey) ? secretKey : Buffer.from(String(secretKey ?? \"\"));\n return hmacSha256Hex(key, value).slice(0, HASH_TOKEN_CHARS);\n}\n\nexport interface RedactionNote {\n rules_fired?: string[];\n spans?: number;\n rules_failed?: string[];\n}\n\nexport function applyRedaction(\n text: string,\n policy: RedactionPolicy,\n opts: {\n phase: RedactionPhase;\n principals?: readonly string[] | null;\n secretKey?: string | Buffer | null;\n hooks?: Hooks | null;\n },\n): [string, RedactionNote] {\n if (!text || policy.isEmpty()) return [text, {}];\n const principals = opts.principals ?? null;\n const collected: Array<[number, number, RedactionRule]> = [];\n const fired: string[] = [];\n const failed: string[] = [];\n\n for (const rule of policy.rules) {\n if (!ruleApplies(rule, { phase: opts.phase, principals })) continue;\n if (rule.action === \"hash\" && !opts.secretKey) {\n throw new Error(\n `rule '${rule.name}': action='hash' requires a non-empty secretKey ` +\n `(an unkeyed HMAC is a reversible pseudonym, not a redaction)`,\n );\n }\n try {\n const raw = spansForRule(rule, text, policy);\n const ruleSpans: Span[] = [];\n let invalid = false;\n for (const item of raw) {\n const start = item?.[0];\n const end = item?.[1];\n if (typeof start !== \"number\" || typeof end !== \"number\") {\n invalid = true;\n continue;\n }\n if (!(start >= 0 && start < end && end <= text.length)) {\n invalid = true;\n continue;\n }\n ruleSpans.push([start, end]);\n }\n if (invalid) failed.push(rule.name);\n for (const [s, e] of ruleSpans) collected.push([s, e, rule]);\n } catch (exc) {\n failed.push(rule.name);\n if (opts.hooks) emitError(opts.hooks, exc, { stage: \"redaction\", rule: rule.name });\n }\n }\n\n if (!collected.length) {\n if (failed.length) return [text, { rules_fired: [], spans: 0, rules_failed: failed }];\n return [text, {}];\n }\n\n collected.sort((a, b) => a[0] - b[0] || b[1] - b[0] - (a[1] - a[0]));\n const merged: Array<[number, number, RedactionRule]> = [];\n for (const [start, end, rule] of collected) {\n const last = merged[merged.length - 1];\n if (last && start < last[1]) {\n if (end > last[1]) last[1] = end;\n continue;\n }\n merged.push([start, end, rule]);\n }\n\n const out: string[] = [];\n let cursor = 0;\n for (const [start, end, rule] of merged) {\n out.push(text.slice(cursor, start));\n const original = text.slice(start, end);\n if (rule.action === \"mask\") out.push(rule.effectivePlaceholder());\n else if (rule.action === \"hash\") {\n out.push(`[${rule.name.toUpperCase()}:${hashToken(original, opts.secretKey)}]`);\n }\n if (!fired.includes(rule.name)) fired.push(rule.name);\n cursor = end;\n }\n out.push(text.slice(cursor));\n\n const note: RedactionNote = { rules_fired: fired, spans: merged.length };\n if (failed.length) note.rules_failed = failed;\n return [out.join(\"\"), note];\n}\n","import { randomUUID } from \"node:crypto\";\nimport { emitToolCall, type Hooks } from \"../hooks.js\";\n\nexport const MAX_OUTPUT_SIZE = 50_000;\nexport const MAX_ERROR_MESSAGE_SIZE = 2_000;\n\ntype EngineLike = {\n pool: { query: (sql: string, params?: unknown[]) => Promise<unknown> };\n hooks?: Hooks | null;\n};\n\nexport class ToolCallTimer {\n private started: number | null = null;\n private ended: number | null = null;\n\n start(): this {\n this.started = Date.now();\n return this;\n }\n\n stop(): this {\n this.ended = Date.now();\n return this;\n }\n\n get durationMs(): number | null {\n if (this.started == null || this.ended == null) return null;\n return this.ended - this.started;\n }\n}\n\nfunction sanitize(obj: unknown): unknown {\n if (obj == null) return obj;\n try {\n return JSON.parse(JSON.stringify(obj, (_k, v) => (typeof v === \"bigint\" ? String(v) : v)));\n } catch {\n return { _raw: String(obj) };\n }\n}\n\nfunction truncateOutput(outputResult: unknown): [unknown, boolean] {\n if (outputResult == null) return [null, false];\n let serialized: string;\n try {\n serialized = JSON.stringify(outputResult);\n } catch {\n serialized = JSON.stringify(String(outputResult));\n }\n if (serialized.length <= MAX_OUTPUT_SIZE) {\n try {\n return [JSON.parse(serialized), false];\n } catch {\n return [outputResult, false];\n }\n }\n return [{ _truncated: serialized.slice(0, MAX_OUTPUT_SIZE), _original_size: serialized.length }, true];\n}\n\nfunction errorMessage(error: unknown): string | null {\n if (error == null) return null;\n const text = error instanceof Error ? error.message : String(error);\n return text.slice(0, MAX_ERROR_MESSAGE_SIZE);\n}\n\nexport async function logToolCall(\n engine: EngineLike,\n row: {\n toolId?: string | null;\n toolName: string;\n kind: string;\n actorType?: string | null;\n actorId?: unknown;\n source?: string | null;\n inputArgs?: Record<string, unknown> | null;\n outputResult?: unknown;\n success?: boolean | null;\n error?: unknown;\n durationMs?: number | null;\n units?: number | null;\n approvalId?: string | null;\n },\n): Promise<void> {\n const event = {\n tool_id: row.toolId != null ? String(row.toolId) : null,\n tool_name: row.toolName,\n kind: row.kind,\n actor_type: row.actorType ?? null,\n actor_id: row.actorId != null ? String(row.actorId) : null,\n source: row.source ?? null,\n input_args: row.inputArgs ?? {},\n output_result: row.outputResult,\n success: row.success ?? null,\n error: row.error != null ? String(row.error) : null,\n duration_ms: row.durationMs ?? null,\n units: row.units ?? null,\n approval_id: row.approvalId ?? null,\n };\n try {\n emitToolCall(engine.hooks, event);\n } catch {\n /* hook must not skip the row */\n }\n try {\n const [stored, truncated] = truncateOutput(row.outputResult);\n const args = sanitize(row.inputArgs ?? {}) ?? {};\n await engine.pool.query(\n `INSERT INTO context_engine_tool_calls\n (id, tool_id, tool_name, kind, actor_type, actor_id, source, input_args, output_result,\n output_truncated, success, error_message, duration_ms, units, approval_id)\n VALUES ($1,$2,$3,$4,$5,$6,$7,$8::jsonb,$9::jsonb,$10,$11,$12,$13,$14,$15)`,\n [\n randomUUID(),\n row.toolId ?? null,\n row.toolName,\n row.kind,\n row.actorType ?? null,\n row.actorId != null ? String(row.actorId) : null,\n row.source ?? \"api\",\n JSON.stringify(args),\n JSON.stringify(stored),\n truncated,\n row.success ?? null,\n errorMessage(row.error),\n row.durationMs ?? null,\n row.units ?? 1,\n row.approvalId ?? null,\n ],\n );\n } catch {\n /* never raises */\n }\n}\n","const TIMEOUT_MS = 30_000;\n\nconst SENSITIVE_RESPONSE_HEADERS = new Set([\n \"set-cookie\",\n \"set-cookie2\",\n \"authorization\",\n \"proxy-authenticate\",\n \"www-authenticate\",\n]);\n\nfunction percentEncode(value: string): string {\n return encodeURIComponent(value).replace(\n /[!'()*]/g,\n (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`,\n );\n}\n\nfunction extract(\n schema: Record<string, unknown> | null | undefined,\n args: Record<string, unknown>,\n): Record<string, unknown> {\n if (!schema) return {};\n const properties = (schema.properties as Record<string, unknown> | undefined) ?? {};\n const required = (schema.required as unknown[] | undefined) ?? [];\n const values: Record<string, unknown> = {};\n for (const key of Object.keys(properties)) {\n const value = args[key];\n if (required.includes(key) && (value === undefined || value === null || value === \"\")) {\n throw new Error(`Missing required LLM parameter: ${key}`);\n }\n if (value !== undefined && value !== null) values[key] = value;\n }\n return values;\n}\n\nexport type ToolHttpClient = {\n request(init: {\n method: string;\n url: string;\n headers?: Record<string, string>;\n params?: Record<string, unknown>;\n json?: unknown;\n content?: string;\n }): Promise<{\n status: number;\n headers: Record<string, string>;\n json(): Promise<unknown>;\n text(): Promise<string>;\n }>;\n};\n\nfunction withQuery(url: string, params: Record<string, unknown>): string {\n const usp = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v === undefined || v === null) continue;\n usp.set(k, String(v));\n }\n const q = usp.toString();\n if (!q) return url;\n return url.includes(\"?\") ? `${url}&${q}` : `${url}?${q}`;\n}\n\nasync function defaultRequest(init: {\n method: string;\n url: string;\n headers?: Record<string, string>;\n params?: Record<string, unknown>;\n json?: unknown;\n content?: string;\n}): Promise<{\n status: number;\n headers: Record<string, string>;\n json(): Promise<unknown>;\n text(): Promise<string>;\n}> {\n let url = init.url;\n if (init.params) url = withQuery(url, init.params);\n const headers: Record<string, string> = { ...(init.headers ?? {}) };\n let body: string | undefined;\n if (init.json !== undefined) {\n headers[\"Content-Type\"] = headers[\"Content-Type\"] ?? headers[\"content-type\"] ?? \"application/json\";\n body = JSON.stringify(init.json);\n } else if (init.content !== undefined) {\n body = init.content;\n }\n const resp = await fetch(url, {\n method: init.method,\n headers,\n body,\n redirect: \"follow\",\n signal: AbortSignal.timeout(TIMEOUT_MS),\n });\n const respHeaders: Record<string, string> = {};\n resp.headers.forEach((v, k) => {\n respHeaders[k] = v;\n });\n const text = await resp.text();\n return {\n status: resp.status,\n headers: respHeaders,\n async json() {\n return JSON.parse(text);\n },\n async text() {\n return text;\n },\n };\n}\n\nexport async function executeHttp(\n config: Record<string, unknown>,\n args: Record<string, unknown>,\n opts: { client?: ToolHttpClient | null } = {},\n): Promise<Record<string, unknown>> {\n const method = String(config.method ?? \"GET\").toUpperCase();\n let url = config.url as string | undefined;\n const headers = { ...((config.headers as Record<string, string> | undefined) ?? {}) };\n const staticParams = { ...((config.parameters as Record<string, unknown> | undefined) ?? {}) };\n const body = config.body;\n const runtimeArgs = args ?? {};\n\n const queryValues = extract(config.llmQueryParameters as Record<string, unknown> | undefined, runtimeArgs);\n const bodyValues = extract(config.llmParameters as Record<string, unknown> | undefined, runtimeArgs);\n\n if (url?.includes(\"{{\")) {\n for (const source of [queryValues, bodyValues]) {\n for (const key of Object.keys(source)) {\n const placeholder = `{{${key}}}`;\n if (url.includes(placeholder)) {\n url = url.replaceAll(placeholder, percentEncode(String(source[key])));\n delete source[key];\n }\n }\n }\n }\n\n const requestInit: Parameters<ToolHttpClient[\"request\"]>[0] = {\n method,\n url: url ?? \"\",\n headers,\n };\n\n if (method === \"GET\" || method === \"DELETE\") {\n const query = { ...staticParams, ...queryValues, ...bodyValues };\n if (Object.keys(query).length) requestInit.params = query;\n } else {\n const query = { ...staticParams, ...queryValues };\n if (Object.keys(query).length) requestInit.params = query;\n\n let jsonBody: Record<string, unknown> = {};\n if (body !== undefined && body !== null) {\n if (typeof body === \"object\" && !Array.isArray(body)) {\n jsonBody = { ...(body as Record<string, unknown>) };\n } else if (typeof body === \"string\") {\n try {\n const parsed = JSON.parse(body);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n jsonBody = parsed as Record<string, unknown>;\n }\n } catch {\n /* raw string body */\n }\n }\n }\n Object.assign(jsonBody, bodyValues);\n if (Object.keys(jsonBody).length) {\n requestInit.json = jsonBody;\n } else if (body !== undefined && body !== null) {\n const contentType = headers[\"Content-Type\"] ?? headers[\"content-type\"] ?? \"\";\n if (typeof body === \"string\" && !contentType.includes(\"application/json\")) {\n requestInit.content = body;\n }\n }\n }\n\n const client = opts.client;\n const resp = client ? await client.request(requestInit) : await defaultRequest(requestInit);\n const contentType = resp.headers[\"content-type\"] ?? resp.headers[\"Content-Type\"] ?? \"\";\n let data: unknown;\n try {\n data = contentType.includes(\"application/json\") ? await resp.json() : await resp.text();\n } catch {\n data = await resp.text();\n }\n\n const safeHeaders: Record<string, string> = {};\n for (const [k, v] of Object.entries(resp.headers)) {\n if (!SENSITIVE_RESPONSE_HEADERS.has(k.toLowerCase())) safeHeaders[k] = v;\n }\n\n return {\n status_code: resp.status,\n headers: safeHeaders,\n data,\n };\n}\n","import type { ToolConfig, ToolKind } from \"./config.js\";\n\nexport interface CanonicalTool {\n id: string | null;\n kind: ToolKind;\n callName: string;\n displayName: string;\n description: string;\n paramsSchema: Record<string, unknown>;\n requiresApproval: boolean;\n approvalPolicy: Record<string, unknown>;\n sourceId: string | null;\n acl: string[] | null;\n raw: Record<string, unknown>;\n}\n\nfunction httpParamsSchema(config: Record<string, unknown>): Record<string, unknown> {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const key of [\"llmParameters\", \"llmQueryParameters\"]) {\n const src = (config[key] as Record<string, unknown> | undefined) ?? {};\n if (!src || typeof src !== \"object\") continue;\n Object.assign(properties, (src.properties as Record<string, unknown> | undefined) ?? {});\n const req = src.required;\n if (Array.isArray(req)) required.push(...req.map(String));\n }\n return { type: \"object\", properties, required };\n}\n\nfunction expandMcpTools(tc: ToolConfig): CanonicalTool[] {\n const config = tc.config ?? {};\n const discovered = (config.discovered_tools as Array<Record<string, unknown>> | undefined) ?? [];\n if (!discovered.length) {\n return [\n {\n id: tc.id ?? null,\n kind: \"mcp\",\n callName: `mcp_${tc.name}`,\n displayName: tc.name,\n description: tc.description || \"MCP tool\",\n paramsSchema: { type: \"object\", properties: {}, required: [] },\n requiresApproval: tc.requiresApproval,\n approvalPolicy: tc.approvalPolicy,\n sourceId: tc.sourceId,\n acl: tc.acl,\n raw: config,\n },\n ];\n }\n const tools: CanonicalTool[] = [];\n for (const dt of discovered) {\n if (dt.enabled === false) continue;\n const name = String(dt.name ?? \"unknown\");\n const schema = (dt.inputSchema as Record<string, unknown> | undefined) ??\n (dt.input_schema as Record<string, unknown> | undefined) ?? {\n type: \"object\",\n properties: {},\n required: [],\n };\n const toolApproval = dt.requires_approval as boolean | undefined;\n const toolApprovalPolicy = dt.approval_policy as Record<string, unknown> | undefined;\n tools.push({\n id: tc.id ?? null,\n kind: \"mcp\",\n callName: `mcp_${name}`,\n displayName: name,\n description: String(dt.description ?? `MCP tool: ${name}`),\n paramsSchema: schema,\n requiresApproval: toolApproval !== undefined ? Boolean(toolApproval) : tc.requiresApproval,\n approvalPolicy: toolApprovalPolicy ?? tc.approvalPolicy,\n sourceId: tc.sourceId,\n acl: tc.acl,\n raw: { ...config, tool_name: name },\n });\n }\n return tools;\n}\n\nexport function canonicalFromConfig(tc: ToolConfig): CanonicalTool[] {\n if (tc.kind === \"http\") {\n return [\n {\n id: tc.id ?? null,\n kind: \"http\",\n callName: `http_${tc.name}`,\n displayName: tc.name,\n description: tc.description || `Execute HTTP request: ${tc.name}`,\n paramsSchema: httpParamsSchema(tc.config ?? {}),\n requiresApproval: tc.requiresApproval,\n approvalPolicy: tc.approvalPolicy,\n sourceId: tc.sourceId,\n acl: tc.acl,\n raw: tc.config ?? {},\n },\n ];\n }\n if (tc.kind === \"db\") {\n return [\n {\n id: tc.id ?? null,\n kind: \"db\",\n callName: `db_${tc.name}`,\n displayName: tc.name,\n description: tc.description || `Query database: ${tc.name}`,\n paramsSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Either 'describe:table1,table2' to get column details, or a SQL query to execute\",\n },\n },\n required: [\"query\"],\n },\n requiresApproval: tc.requiresApproval,\n approvalPolicy: tc.approvalPolicy,\n sourceId: tc.sourceId,\n acl: tc.acl,\n raw: tc.config ?? {},\n },\n ];\n }\n if (tc.kind === \"mcp\") return expandMcpTools(tc);\n throw new Error(\n `canonicalFromConfig does not support kind=${JSON.stringify(tc.kind)}; function ` +\n \"tools have no serializable config — build them with functionTool(fn) instead\",\n );\n}\n\nexport function findTool(tools: CanonicalTool[], callName: string): CanonicalTool | undefined {\n return tools.find((t) => t.callName === callName);\n}\n","import { createHash, randomBytes } from \"node:crypto\";\nimport type { Pool } from \"pg\";\nimport { emitError, type Hooks } from \"../hooks.js\";\n\nexport const STATE_TTL_SECONDS = 600;\nconst DISCOVERY_TIMEOUT_MS = 10_000;\nconst TOKEN_TIMEOUT_MS = 15_000;\nconst PROBE_TIMEOUT_MS = 5_000;\nconst REGISTER_TIMEOUT_MS = 10_000;\n\nfunction report(hooks: Hooks | null | undefined, exc: unknown, ctx: Record<string, unknown>): void {\n if (hooks) emitError(hooks, exc, ctx);\n else console.error(\"[context-engine] mcp_oauth error:\", exc, \"| ctx=\", ctx);\n}\n\nexport interface PendingStore {\n put(state: string, data: Record<string, unknown>, ttlSeconds?: number): void | Promise<void>;\n pop(state: string): Record<string, unknown> | null | Promise<Record<string, unknown> | null>;\n}\n\nexport class InMemoryPendingStore implements PendingStore {\n private store = new Map<string, { data: Record<string, unknown>; expiresAt: number }>();\n\n private cleanupExpired(): void {\n const now = Date.now() / 1000;\n for (const [k, v] of this.store) {\n if (v.expiresAt <= now) this.store.delete(k);\n }\n }\n\n put(state: string, data: Record<string, unknown>, ttlSeconds: number = STATE_TTL_SECONDS): void {\n this.cleanupExpired();\n this.store.set(state, { data, expiresAt: Date.now() / 1000 + ttlSeconds });\n }\n\n pop(state: string): Record<string, unknown> | null {\n this.cleanupExpired();\n const entry = this.store.get(state);\n this.store.delete(state);\n if (!entry) return null;\n if (entry.expiresAt <= Date.now() / 1000) return null;\n return entry.data;\n }\n}\n\nexport class PostgresPendingStore implements PendingStore {\n constructor(private pool: Pool) {}\n\n private async reapExpired(): Promise<void> {\n await this.pool.query(\"DELETE FROM context_engine_oauth_pending WHERE expires_at < now()\");\n }\n\n async put(\n state: string,\n data: Record<string, unknown>,\n ttlSeconds: number = STATE_TTL_SECONDS,\n ): Promise<void> {\n await this.reapExpired();\n const expiresAt = new Date(Date.now() + ttlSeconds * 1000);\n await this.pool.query(\n `INSERT INTO context_engine_oauth_pending (state, data, expires_at)\n VALUES ($1, $2::jsonb, $3)\n ON CONFLICT (state) DO UPDATE SET data = EXCLUDED.data, expires_at = EXCLUDED.expires_at`,\n [state, JSON.stringify(data), expiresAt],\n );\n }\n\n async pop(state: string): Promise<Record<string, unknown> | null> {\n await this.reapExpired();\n const result = await this.pool.query(\n `DELETE FROM context_engine_oauth_pending WHERE state = $1 RETURNING data, expires_at`,\n [state],\n );\n const row = result.rows[0];\n if (!row) return null;\n const expiresAt = new Date(row.expires_at);\n if (expiresAt.getTime() <= Date.now()) return null;\n return row.data as Record<string, unknown>;\n }\n}\n\nasync function fetchJson(\n url: string,\n opts: {\n method?: string;\n timeout?: number;\n headers?: Record<string, string>;\n body?: string | Buffer | Uint8Array | URLSearchParams | null;\n redirect?: \"follow\" | \"error\" | \"manual\";\n } = {},\n): Promise<{ status: number; json: () => Promise<unknown>; text: () => Promise<string> }> {\n const resp = await fetch(url, {\n method: opts.method ?? \"GET\",\n headers: opts.headers,\n body: opts.body,\n redirect: opts.redirect ?? \"follow\",\n signal: AbortSignal.timeout(opts.timeout ?? DISCOVERY_TIMEOUT_MS),\n });\n return {\n status: resp.status,\n json: () => resp.json(),\n text: () => resp.text(),\n };\n}\n\nexport async function discoverOauthMetadata(\n serverUrl: string,\n opts: { hooks?: Hooks | null } = {},\n): Promise<Record<string, unknown> | null> {\n const parsed = new URL(serverUrl);\n const base = `${parsed.protocol}//${parsed.host}`;\n\n const wellKnownUrl = `${base}/.well-known/oauth-authorization-server`;\n try {\n const resp = await fetchJson(wellKnownUrl, { timeout: DISCOVERY_TIMEOUT_MS });\n if (resp.status === 200) {\n const data = (await resp.json()) as Record<string, unknown>;\n if (data.authorization_endpoint && data.token_endpoint) {\n return {\n authorization_endpoint: data.authorization_endpoint,\n token_endpoint: data.token_endpoint,\n registration_endpoint: data.registration_endpoint,\n scopes_supported: data.scopes_supported ?? [],\n response_types_supported: data.response_types_supported ?? [],\n code_challenge_methods_supported: data.code_challenge_methods_supported ?? [\"S256\"],\n issuer: data.issuer ?? base,\n };\n }\n }\n } catch (e) {\n if (!(e instanceof TypeError) && !(e instanceof DOMException)) {\n report(opts.hooks, e, { stage: \"discover_oauth_metadata_8414\", url: wellKnownUrl });\n }\n }\n\n const oidcUrl = `${base}/.well-known/openid-configuration`;\n try {\n const resp = await fetchJson(oidcUrl, { timeout: DISCOVERY_TIMEOUT_MS });\n if (resp.status === 200) {\n const data = (await resp.json()) as Record<string, unknown>;\n if (data.authorization_endpoint && data.token_endpoint) {\n return {\n authorization_endpoint: data.authorization_endpoint,\n token_endpoint: data.token_endpoint,\n registration_endpoint: data.registration_endpoint,\n scopes_supported: data.scopes_supported ?? [],\n code_challenge_methods_supported: data.code_challenge_methods_supported ?? [\"S256\"],\n issuer: data.issuer ?? base,\n };\n }\n }\n } catch {\n /* continue */\n }\n\n for (const [authPath, tokenPath] of [\n [\"/oauth/authorize\", \"/oauth/token\"],\n [\"/authorize\", \"/token\"],\n [\"/oauth2/authorize\", \"/oauth2/token\"],\n ] as const) {\n try {\n const resp = await fetchJson(`${base}${authPath}`, {\n timeout: PROBE_TIMEOUT_MS,\n redirect: \"manual\",\n });\n if ([200, 302, 303, 400].includes(resp.status)) {\n return {\n authorization_endpoint: `${base}${authPath}`,\n token_endpoint: `${base}${tokenPath}`,\n issuer: base,\n scopes_supported: [],\n code_challenge_methods_supported: [\"S256\"],\n };\n }\n } catch {}\n }\n return null;\n}\n\nexport async function registerOauthClient(\n registrationEndpoint: string,\n redirectUri: string,\n clientName = \"Promptev Context Engine\",\n opts: { hooks?: Hooks | null } = {},\n): Promise<Record<string, unknown>> {\n const payload = {\n client_name: clientName,\n redirect_uris: [redirectUri],\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n token_endpoint_auth_method: \"none\",\n };\n let resp: Awaited<ReturnType<typeof fetchJson>>;\n try {\n resp = await fetchJson(registrationEndpoint, {\n method: \"POST\",\n timeout: REGISTER_TIMEOUT_MS,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n } catch (e) {\n report(opts.hooks, e, { stage: \"register_oauth_client\", registration_endpoint: registrationEndpoint });\n throw new Error(`Cannot reach registration endpoint: ${e}`);\n }\n if (resp.status !== 200 && resp.status !== 201) {\n const error = new Error(`Client registration failed: ${resp.status}`);\n report(opts.hooks, error, {\n stage: \"register_oauth_client\",\n registration_endpoint: registrationEndpoint,\n status_code: resp.status,\n });\n throw error;\n }\n return (await resp.json()) as Record<string, unknown>;\n}\n\nexport async function buildAuthorizeUrl(\n metadata: Record<string, unknown>,\n serverUrl: string,\n toolId: string,\n redirectUri: string,\n store: PendingStore,\n opts: {\n clientId?: string | null;\n clientSecret?: string | null;\n scopes?: string | null;\n ttlSeconds?: number;\n } = {},\n): Promise<{ authorize_url: string; state: string }> {\n const authEndpoint = metadata.authorization_endpoint as string | undefined;\n const tokenEndpoint = metadata.token_endpoint as string | undefined;\n if (!authEndpoint) throw new Error(\"OAuth metadata missing 'authorization_endpoint'\");\n if (!tokenEndpoint) throw new Error(\"OAuth metadata missing 'token_endpoint'\");\n\n const codeVerifier = randomBytes(64).toString(\"base64url\").slice(0, 128);\n const digest = createHash(\"sha256\").update(codeVerifier, \"ascii\").digest();\n const codeChallenge = digest.toString(\"base64url\");\n const state = randomBytes(32).toString(\"base64url\");\n\n await Promise.resolve(\n store.put(\n state,\n {\n server_url: serverUrl,\n code_verifier: codeVerifier,\n tool_id: toolId,\n redirect_uri: redirectUri,\n token_endpoint: tokenEndpoint,\n client_id: opts.clientId ?? null,\n client_secret: opts.clientSecret ?? null,\n },\n opts.ttlSeconds ?? STATE_TTL_SECONDS,\n ),\n );\n\n const params = new URLSearchParams({\n response_type: \"code\",\n state,\n redirect_uri: redirectUri,\n code_challenge: codeChallenge,\n code_challenge_method: \"S256\",\n });\n if (opts.clientId) params.set(\"client_id\", opts.clientId);\n if (opts.scopes) params.set(\"scope\", opts.scopes);\n\n return { authorize_url: `${authEndpoint}?${params.toString()}`, state };\n}\n\nexport async function exchangeCodeForToken(\n state: string,\n code: string,\n store: PendingStore,\n opts: { clientSecret?: string | null; hooks?: Hooks | null } = {},\n): Promise<Record<string, unknown>> {\n const pending = await Promise.resolve(store.pop(state));\n if (!pending) throw new Error(\"Invalid or expired OAuth state — please try connecting again\");\n const tokenEndpoint = pending.token_endpoint as string | undefined;\n if (!tokenEndpoint) throw new Error(\"No token_endpoint in stored OAuth state\");\n\n const body = new URLSearchParams({\n grant_type: \"authorization_code\",\n code,\n redirect_uri: String(pending.redirect_uri),\n code_verifier: String(pending.code_verifier),\n });\n if (pending.client_id) body.set(\"client_id\", String(pending.client_id));\n const secret = opts.clientSecret || (pending.client_secret as string | null);\n if (secret) body.set(\"client_secret\", String(secret));\n\n let resp: Awaited<ReturnType<typeof fetchJson>>;\n try {\n resp = await fetchJson(tokenEndpoint, {\n method: \"POST\",\n timeout: TOKEN_TIMEOUT_MS,\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body,\n });\n } catch (e) {\n report(opts.hooks, e, { stage: \"exchange_code_for_token\", token_endpoint: tokenEndpoint });\n throw new Error(`Could not reach token endpoint: ${e}`);\n }\n if (resp.status !== 200) {\n const error = new Error(`Token exchange failed: ${resp.status}`);\n report(opts.hooks, error, {\n stage: \"exchange_code_for_token\",\n token_endpoint: tokenEndpoint,\n status_code: resp.status,\n });\n throw error;\n }\n\n let tokenData: Record<string, unknown>;\n try {\n tokenData = (await resp.json()) as Record<string, unknown>;\n } catch {\n const text = await resp.text();\n tokenData = Object.fromEntries(new URLSearchParams(text));\n }\n const accessToken = tokenData.access_token;\n if (!accessToken) {\n const error = new Error(\"Token response missing access_token\");\n report(opts.hooks, error, { stage: \"exchange_code_for_token\", token_endpoint: tokenEndpoint });\n throw error;\n }\n return {\n access_token: accessToken,\n refresh_token: tokenData.refresh_token,\n token_type: tokenData.token_type ?? \"Bearer\",\n expires_in: tokenData.expires_in,\n scope: tokenData.scope,\n tool_id: pending.tool_id,\n server_url: pending.server_url,\n };\n}\n\nexport async function refreshAccessToken(\n tokenEndpoint: string,\n refreshToken: string,\n opts: { clientId?: string | null; clientSecret?: string | null; hooks?: Hooks | null } = {},\n): Promise<Record<string, unknown>> {\n const body = new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n });\n if (opts.clientId) body.set(\"client_id\", opts.clientId);\n if (opts.clientSecret) body.set(\"client_secret\", opts.clientSecret);\n\n let resp: Awaited<ReturnType<typeof fetchJson>>;\n try {\n resp = await fetchJson(tokenEndpoint, {\n method: \"POST\",\n timeout: TOKEN_TIMEOUT_MS,\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body,\n });\n } catch (e) {\n report(opts.hooks, e, { stage: \"refresh_access_token\", token_endpoint: tokenEndpoint });\n throw new Error(`Could not reach token endpoint: ${e}`);\n }\n if (resp.status !== 200) {\n const error = new Error(`Token refresh failed: ${resp.status}`);\n report(opts.hooks, error, {\n stage: \"refresh_access_token\",\n token_endpoint: tokenEndpoint,\n status_code: resp.status,\n });\n throw error;\n }\n const tokenData = (await resp.json()) as Record<string, unknown>;\n if (!tokenData.access_token) {\n const error = new Error(\"Refresh response missing access_token\");\n report(opts.hooks, error, { stage: \"refresh_access_token\", token_endpoint: tokenEndpoint });\n throw error;\n }\n return {\n access_token: tokenData.access_token,\n refresh_token: tokenData.refresh_token ?? refreshToken,\n expires_in: tokenData.expires_in,\n };\n}\n"]}