@nick3/copilot-api 1.9.15 → 1.10.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/README.zh-CN.md +3 -1
- package/dist/{account-DjCbqJ2Q.js → account-COtMmvzU.js} +2 -2
- package/dist/{account-DjCbqJ2Q.js.map → account-COtMmvzU.js.map} +1 -1
- package/dist/admin/assets/{index-BRnD4-DB.js → index-DG4TRVMu.js} +36 -36
- package/dist/admin/index.html +1 -1
- package/dist/{auth--I1utaB6.js → auth-B0y-2njL.js} +3 -3
- package/dist/{auth--I1utaB6.js.map → auth-B0y-2njL.js.map} +1 -1
- package/dist/{check-usage-DHvjdha4.js → check-usage-DdevqHE5.js} +3 -3
- package/dist/{check-usage-DHvjdha4.js.map → check-usage-DdevqHE5.js.map} +1 -1
- package/dist/{get-copilot-token-ZbmbVF0I.js → get-copilot-token-8Rm-rVsp.js} +2 -2
- package/dist/{get-copilot-token-ZbmbVF0I.js.map → get-copilot-token-8Rm-rVsp.js.map} +1 -1
- package/dist/main.js +3 -3
- package/dist/{poll-access-token-CIPDXrcm.js → poll-access-token-BAgM2-7k.js} +62 -6
- package/dist/poll-access-token-BAgM2-7k.js.map +1 -0
- package/dist/{quota-refresh-scheduler-runtime-XD2fDa2K.js → proxy-BwmADhKh.js} +67 -8
- package/dist/proxy-BwmADhKh.js.map +1 -0
- package/dist/{request-outbound-Cy6huWjK.js → request-outbound-BJjWS_jF.js} +1 -1
- package/dist/{request-outbound-CxvpSkOn.js → request-outbound-Pu1kp2x8.js} +3 -1
- package/dist/request-outbound-Pu1kp2x8.js.map +1 -0
- package/dist/{server-BDCnb3Ao.js → server-DxQsi1x2.js} +429 -43
- package/dist/server-DxQsi1x2.js.map +1 -0
- package/dist/{start-DkBnp9d8.js → start-8QHzPrcg.js} +5 -52
- package/dist/start-8QHzPrcg.js.map +1 -0
- package/package.json +1 -1
- package/dist/poll-access-token-CIPDXrcm.js.map +0 -1
- package/dist/quota-refresh-scheduler-runtime-XD2fDa2K.js.map +0 -1
- package/dist/request-outbound-CxvpSkOn.js.map +0 -1
- package/dist/server-BDCnb3Ao.js.map +0 -1
- package/dist/start-DkBnp9d8.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-outbound-CxvpSkOn.js","names":[],"sources":["../src/lib/admin-db.ts","../src/lib/request-outbound.ts"],"sourcesContent":["import { Database } from \"bun:sqlite\"\nimport consola from \"consola\"\nimport path from \"node:path\"\n\nimport { PATHS } from \"./paths\"\n\nconst ADMIN_DB_FILENAME = \"admin.sqlite\"\nconst DEFAULT_DB_PATH = path.join(PATHS.APP_DIR, ADMIN_DB_FILENAME)\n\nlet sharedDb: Database | null = null\nlet initialized = false\n\nconst INIT_WARN_THROTTLE_MS = 30_000\n\nlet lastInitWarnAtMs = 0\nlet suppressedInitWarnCount = 0\n\nfunction warnAdminDbInitFailure(error: unknown): void {\n const now = Date.now()\n\n if (now - lastInitWarnAtMs < INIT_WARN_THROTTLE_MS) {\n suppressedInitWarnCount++\n return\n }\n\n const suppressed = suppressedInitWarnCount\n suppressedInitWarnCount = 0\n lastInitWarnAtMs = now\n\n const suffix =\n suppressed > 0 ? ` (suppressed ${suppressed} similar errors)` : \"\"\n consola.warn(\n `Failed to initialize admin DB; admin features disabled${suffix}`,\n error,\n )\n}\n\nexport function getAdminDbPath(): string {\n return DEFAULT_DB_PATH\n}\n\nexport function openAdminDb(filePath: string = DEFAULT_DB_PATH): Database {\n return new Database(filePath)\n}\n\nexport function initAdminDb(db: Database): void {\n // Pragmas: prefer WAL for concurrent reads, keep writes fast.\n // Note: journal_mode=WAL is per-database and persists in the DB file.\n db.run(\"PRAGMA journal_mode = WAL;\")\n db.run(\"PRAGMA synchronous = NORMAL;\")\n db.run(\"PRAGMA busy_timeout = 3000;\")\n db.run(\"PRAGMA foreign_keys = ON;\")\n\n migrateAdminDb(db)\n}\n\nexport function getAdminDb(): Database {\n if (!sharedDb) {\n sharedDb = openAdminDb()\n }\n if (!initialized) {\n try {\n initAdminDb(sharedDb)\n initialized = true\n } catch (error) {\n // Admin DB is a best-effort feature; server should continue to run.\n warnAdminDbInitFailure(error)\n }\n }\n return sharedDb\n}\n\nexport function getAdminDbUserVersion(db: Database = getAdminDb()): number {\n try {\n const row = db.query(\"PRAGMA user_version;\").get() as {\n user_version?: number\n } | null\n return row?.user_version ?? 0\n } catch {\n return 0\n }\n}\n\nfunction hasRequestLogColumn(db: Database, columnName: string): boolean {\n return db\n .query(\"PRAGMA table_info(request_log);\")\n .all()\n .some((row) => (row as { name?: string }).name === columnName)\n}\n\nfunction migrateV1(db: Database): void {\n db.run(`\n CREATE TABLE IF NOT EXISTS request_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n request_id TEXT NOT NULL UNIQUE,\n\n started_at_ms INTEGER NOT NULL,\n finished_at_ms INTEGER,\n duration_ms INTEGER,\n ttfb_ms INTEGER,\n\n method TEXT NOT NULL,\n path TEXT NOT NULL,\n upstream_endpoint TEXT,\n stream INTEGER NOT NULL DEFAULT 0,\n\n account_id TEXT,\n account_type TEXT,\n cost_units REAL,\n client_model TEXT,\n upstream_model TEXT,\n\n client_ip TEXT,\n client_ip_source TEXT,\n user_agent TEXT,\n\n tokens_input INTEGER,\n tokens_output INTEGER,\n tokens_total INTEGER,\n tokens_cached_input INTEGER,\n usage_json TEXT,\n\n premium_remaining_before REAL,\n premium_remaining_after REAL,\n premium_remaining_diff REAL,\n premium_unlimited_before INTEGER,\n premium_unlimited_after INTEGER,\n\n http_status INTEGER,\n error_name TEXT,\n error_status INTEGER,\n error_message TEXT,\n selection_failure_reason TEXT\n );\n\n CREATE INDEX IF NOT EXISTS idx_request_log_started_at\n ON request_log(started_at_ms DESC);\n CREATE INDEX IF NOT EXISTS idx_request_log_account_started_at\n ON request_log(account_id, started_at_ms DESC);\n CREATE INDEX IF NOT EXISTS idx_request_log_model_started_at\n ON request_log(upstream_model, started_at_ms DESC);\n CREATE INDEX IF NOT EXISTS idx_request_log_endpoint_started_at\n ON request_log(upstream_endpoint, started_at_ms DESC);\n CREATE INDEX IF NOT EXISTS idx_request_log_status_started_at\n ON request_log(http_status, started_at_ms DESC);\n\n PRAGMA user_version = 1;\n `)\n}\n\nfunction migrateV9(db: Database): void {\n db.run(`\n CREATE TABLE IF NOT EXISTS daily_premium_stats (\n date TEXT NOT NULL,\n account_id TEXT NOT NULL,\n request_count INTEGER NOT NULL DEFAULT 0,\n cost_units_sum REAL NOT NULL DEFAULT 0,\n tokens_total INTEGER NOT NULL DEFAULT 0,\n error_count INTEGER NOT NULL DEFAULT 0,\n updated_at_ms INTEGER NOT NULL,\n PRIMARY KEY (date, account_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_daily_premium_stats_date\n ON daily_premium_stats(date);\n `)\n\n // Backfill from existing request_log (guard: table may not exist in edge cases)\n const hasRequestLog = db\n .query(\n \"SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'request_log' LIMIT 1;\",\n )\n .get()\n\n if (hasRequestLog) {\n const nowMs = Date.now()\n db.run(\n `INSERT INTO daily_premium_stats\n (date, account_id, request_count, cost_units_sum, tokens_total, error_count, updated_at_ms)\n SELECT\n date(started_at_ms / 1000, 'unixepoch', 'localtime') AS date,\n account_id,\n COUNT(*) AS request_count,\n SUM(cost_units) AS cost_units_sum,\n COALESCE(SUM(tokens_total), 0) AS tokens_total,\n SUM(CASE WHEN error_name IS NOT NULL THEN 1 ELSE 0 END) AS error_count,\n ? AS updated_at_ms\n FROM request_log\n WHERE cost_units > 0\n AND account_id IS NOT NULL\n GROUP BY 1, 2\n ON CONFLICT(date, account_id) DO UPDATE SET\n request_count = excluded.request_count,\n cost_units_sum = excluded.cost_units_sum,\n tokens_total = excluded.tokens_total,\n error_count = excluded.error_count,\n updated_at_ms = excluded.updated_at_ms;`,\n [nowMs],\n )\n }\n\n db.run(\"PRAGMA user_version = 9;\")\n}\n\nfunction migrateV8(db: Database): void {\n db.run(`\n CREATE TABLE IF NOT EXISTS session_affinity (\n cache_key TEXT PRIMARY KEY,\n account_id TEXT NOT NULL,\n created_at_ms INTEGER NOT NULL,\n last_confirmed_at_ms INTEGER NOT NULL,\n last_used_at_ms INTEGER NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_session_affinity_last_used\n ON session_affinity(last_used_at_ms);\n\n CREATE INDEX IF NOT EXISTS idx_session_affinity_account\n ON session_affinity(account_id);\n\n PRAGMA user_version = 8;\n `)\n}\n\nfunction migrateV10(db: Database): void {\n db.run(`\n CREATE TABLE IF NOT EXISTS quota_snapshots (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n account_id TEXT NOT NULL,\n snapshot_at_ms INTEGER NOT NULL,\n remaining INTEGER NOT NULL,\n entitlement INTEGER NOT NULL,\n unlimited INTEGER NOT NULL DEFAULT 0,\n source TEXT NOT NULL DEFAULT 'refresh'\n );\n\n CREATE INDEX IF NOT EXISTS idx_quota_snapshots_account_time\n ON quota_snapshots(account_id, snapshot_at_ms);\n\n CREATE INDEX IF NOT EXISTS idx_quota_snapshots_time\n ON quota_snapshots(snapshot_at_ms);\n `)\n\n const hasRequestLog = db\n .query(\n \"SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'request_log' LIMIT 1;\",\n )\n .get()\n\n if (hasRequestLog) {\n db.run(`\n INSERT INTO quota_snapshots\n (account_id, snapshot_at_ms, remaining, entitlement, unlimited, source)\n SELECT\n account_id,\n finished_at_ms,\n CAST(premium_remaining_after AS INTEGER),\n 0,\n COALESCE(premium_unlimited_after, 0),\n 'backfill'\n FROM request_log\n WHERE premium_remaining_after IS NOT NULL\n AND account_id IS NOT NULL\n AND finished_at_ms IS NOT NULL\n ORDER BY finished_at_ms;\n `)\n }\n\n db.run(\"PRAGMA user_version = 10;\")\n}\n\nfunction migrateV11(db: Database): void {\n const outboundHeaderColumns = [\n \"outbound_x_request_id\",\n \"outbound_x_agent_task_id\",\n \"outbound_x_interaction_type\",\n \"outbound_openai_intent\",\n \"outbound_user_agent\",\n ] as const\n\n for (const columnName of outboundHeaderColumns) {\n if (!hasRequestLogColumn(db, columnName)) {\n db.run(`ALTER TABLE request_log ADD COLUMN ${columnName} TEXT;`)\n }\n }\n\n db.run(`\n CREATE TABLE IF NOT EXISTS request_outbound (\n request_id TEXT PRIMARY KEY,\n captured_at_ms INTEGER NOT NULL,\n http_status INTEGER NOT NULL,\n\n upstream_url TEXT NOT NULL,\n upstream_method TEXT NOT NULL,\n\n request_headers TEXT NOT NULL,\n request_body TEXT,\n request_body_kind TEXT NOT NULL,\n\n response_status INTEGER NOT NULL,\n response_headers TEXT NOT NULL,\n response_body TEXT,\n response_body_kind TEXT NOT NULL,\n\n FOREIGN KEY (request_id) REFERENCES request_log(request_id) ON DELETE CASCADE\n );\n\n CREATE INDEX IF NOT EXISTS idx_request_outbound_captured_at\n ON request_outbound(captured_at_ms DESC);\n\n PRAGMA user_version = 11;\n `)\n}\n\nfunction migrateV12(db: Database): void {\n if (!hasRequestLogColumn(db, \"outbound_x_interaction_id\")) {\n db.run(\"ALTER TABLE request_log ADD COLUMN outbound_x_interaction_id TEXT;\")\n }\n\n db.run(\"PRAGMA user_version = 12;\")\n}\n\nfunction migrateV13(db: Database): void {\n if (!hasRequestLogColumn(db, \"responses_item_owner_lookup_keys_json\")) {\n db.run(\n \"ALTER TABLE request_log ADD COLUMN responses_item_owner_lookup_keys_json TEXT;\",\n )\n }\n\n if (!hasRequestLogColumn(db, \"responses_item_owner_recorded_keys_json\")) {\n db.run(\n \"ALTER TABLE request_log ADD COLUMN responses_item_owner_recorded_keys_json TEXT;\",\n )\n }\n\n db.run(\"PRAGMA user_version = 13;\")\n}\n\nfunction migrateV8ToV13(db: Database, current: number): void {\n if (current < 8) {\n migrateV8(db)\n }\n\n if (current < 9) {\n migrateV9(db)\n }\n\n if (current < 10) {\n migrateV10(db)\n }\n\n if (current < 11) {\n migrateV11(db)\n }\n\n if (current < 12) {\n migrateV12(db)\n }\n\n if (current < 13) {\n migrateV13(db)\n }\n}\n\n// eslint-disable-next-line complexity -- migration chain grows with each version\nfunction migrateAdminDb(db: Database): void {\n const row = db.query(\"PRAGMA user_version;\").get() as {\n user_version?: number\n } | null\n const current = row?.user_version ?? 0\n\n if (current >= 13) {\n if (current === 13) migrateV13(db)\n return\n }\n\n if (current === 12) {\n migrateV12(db)\n }\n\n if (current === 11) {\n migrateV11(db)\n }\n\n if (current < 1) {\n migrateV1(db)\n }\n\n if (current < 2) {\n // v2: request_log session correlation fields\n db.run(`\n ALTER TABLE request_log ADD COLUMN user_id TEXT;\n ALTER TABLE request_log ADD COLUMN safety_identifier TEXT;\n ALTER TABLE request_log ADD COLUMN prompt_cache_key TEXT;\n ALTER TABLE request_log ADD COLUMN initiator TEXT;\n ALTER TABLE request_log ADD COLUMN upstream_request_id TEXT;\n\n PRAGMA user_version = 2;\n `)\n }\n\n if (current < 3) {\n // v3: index for session lookup\n db.run(`\n CREATE INDEX IF NOT EXISTS idx_request_log_session_finished\n ON request_log(\n prompt_cache_key,\n safety_identifier,\n finished_at_ms DESC\n )\n WHERE finished_at_ms IS NOT NULL\n AND tokens_input IS NOT NULL;\n\n PRAGMA user_version = 3;\n `)\n }\n\n if (current < 4) {\n // v4: index for session lookup by client model\n db.run(`\n CREATE INDEX IF NOT EXISTS idx_request_log_session_finished_by_client_model\n ON request_log(\n prompt_cache_key,\n safety_identifier,\n client_model,\n finished_at_ms DESC\n )\n WHERE finished_at_ms IS NOT NULL\n AND tokens_input IS NOT NULL;\n\n PRAGMA user_version = 4;\n `)\n }\n\n if (current < 5) {\n // v5: account affinity tracking columns\n db.run(`\n ALTER TABLE request_log ADD COLUMN affinity_hit INTEGER;\n ALTER TABLE request_log ADD COLUMN affinity_cache_key TEXT;\n\n PRAGMA user_version = 5;\n `)\n }\n\n if (current < 6) {\n // v6: explicit subagent request tracking column\n if (!hasRequestLogColumn(db, \"is_subagent\")) {\n db.run(\"ALTER TABLE request_log ADD COLUMN is_subagent INTEGER;\")\n }\n\n db.run(\"PRAGMA user_version = 6;\")\n }\n\n if (current < 7) {\n // v7: request-level affinity and upstream error observability columns\n if (!hasRequestLogColumn(db, \"affinity_key_used\")) {\n db.run(\"ALTER TABLE request_log ADD COLUMN affinity_key_used TEXT;\")\n }\n\n if (!hasRequestLogColumn(db, \"affinity_key_source\")) {\n db.run(\"ALTER TABLE request_log ADD COLUMN affinity_key_source TEXT;\")\n }\n\n if (!hasRequestLogColumn(db, \"selection_reason\")) {\n db.run(\"ALTER TABLE request_log ADD COLUMN selection_reason TEXT;\")\n }\n\n if (!hasRequestLogColumn(db, \"upstream_error_message_raw\")) {\n db.run(\n \"ALTER TABLE request_log ADD COLUMN upstream_error_message_raw TEXT;\",\n )\n }\n\n db.run(\"PRAGMA user_version = 7;\")\n }\n\n migrateV8ToV13(db, current)\n}\n","import type { Database } from \"bun:sqlite\"\n\nimport consola from \"consola\"\n\nimport { getAdminDb, getAdminDbPath, getAdminDbUserVersion } from \"./admin-db\"\n\nconst INSERT_WARN_THROTTLE_MS = 30_000\nconst STORE_INIT_WARN_THROTTLE_MS = 30_000\nconst STORE_INIT_RETRY_DELAY_MS = 30_000\n\nlet lastInsertWarnAtMs = 0\nlet suppressedInsertWarnCount = 0\nlet lastStoreInitWarnAtMs = 0\nlet suppressedStoreInitWarnCount = 0\nlet nextStoreRetryAtMs = 0\n\nexport const SENSITIVE_HEADER_PATTERNS = [\n /^authorization$/i,\n /^x-github-token$/i,\n /^cookie$/i,\n /^set-cookie$/i,\n /^proxy-authorization$/i,\n /^x-api-key$/i,\n /-token$/i,\n /-secret$/i,\n] as const\n\nfunction warnInsertFailure(error: unknown): void {\n const now = Date.now()\n\n if (now - lastInsertWarnAtMs < INSERT_WARN_THROTTLE_MS) {\n suppressedInsertWarnCount++\n return\n }\n\n const suppressed = suppressedInsertWarnCount\n suppressedInsertWarnCount = 0\n lastInsertWarnAtMs = now\n\n const suffix =\n suppressed > 0 ? ` (suppressed ${suppressed} similar errors)` : \"\"\n consola.warn(`Failed to insert request outbound${suffix}`, error)\n}\n\nfunction warnStoreInitFailure(error: unknown): void {\n const now = Date.now()\n\n if (now - lastStoreInitWarnAtMs < STORE_INIT_WARN_THROTTLE_MS) {\n suppressedStoreInitWarnCount++\n return\n }\n\n const suppressed = suppressedStoreInitWarnCount\n suppressedStoreInitWarnCount = 0\n lastStoreInitWarnAtMs = now\n\n const suffix =\n suppressed > 0 ? ` (suppressed ${suppressed} similar errors)` : \"\"\n consola.warn(`Request outbound store is disabled${suffix}`, error)\n}\n\ntype HeaderMap = Record<string, string>\n\nfunction shouldRedactHeader(key: string): boolean {\n return SENSITIVE_HEADER_PATTERNS.some((pattern) => pattern.test(key))\n}\n\nexport function getRedactedHeaderKeys(headers: HeaderMap): Array<string> {\n return Object.keys(headers).filter((key) => shouldRedactHeader(key))\n}\n\nexport function redactHeaders(headers: HeaderMap): HeaderMap {\n const redacted: HeaderMap = {}\n\n for (const [key, value] of Object.entries(headers)) {\n redacted[key] = shouldRedactHeader(key) ? \"***\" : value\n }\n\n return redacted\n}\n\nexport type OutboundCaptureInput = {\n requestId: string\n httpStatus: number\n upstreamUrl: string\n upstreamMethod: string\n requestHeaders: HeaderMap\n requestBody: string | null\n requestBodyKind: string\n responseStatus: number\n responseHeaders: HeaderMap\n responseBody: string | null\n responseBodyKind: string\n}\n\nexport type OutboundCaptureRow = OutboundCaptureInput & {\n capturedAtMs: number\n}\n\nexport type RequestOutboundStoreApi = {\n insert(input: OutboundCaptureInput): void\n getByRequestId(requestId: string): OutboundCaptureRow | null\n hasOutboundForIds(requestIds: Array<string>): Set<string>\n cleanupOrphans(): void\n meta(): {\n dbPath: string\n userVersion: number\n }\n}\n\nclass RequestOutboundStore implements RequestOutboundStoreApi {\n private readonly db: Database\n private readonly insertStmt: ReturnType<Database[\"query\"]>\n private readonly getByRequestIdStmt: ReturnType<Database[\"query\"]>\n private readonly cleanupOrphansStmt: ReturnType<Database[\"query\"]>\n\n constructor(db: Database) {\n this.db = db\n this.insertStmt = db.query(`\n INSERT OR REPLACE INTO request_outbound (\n request_id,\n captured_at_ms,\n http_status,\n upstream_url,\n upstream_method,\n request_headers,\n request_body,\n request_body_kind,\n response_status,\n response_headers,\n response_body,\n response_body_kind\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);\n `)\n this.getByRequestIdStmt = db.query(`\n SELECT\n request_id,\n captured_at_ms,\n http_status,\n upstream_url,\n upstream_method,\n request_headers,\n request_body,\n request_body_kind,\n response_status,\n response_headers,\n response_body,\n response_body_kind\n FROM request_outbound\n WHERE request_id = ?\n LIMIT 1;\n `)\n this.cleanupOrphansStmt = db.query(`\n DELETE FROM request_outbound\n WHERE NOT EXISTS (\n SELECT 1\n FROM request_log\n WHERE request_log.request_id = request_outbound.request_id\n );\n `)\n }\n\n insert(input: OutboundCaptureInput): void {\n try {\n this.insertStmt.run(\n input.requestId,\n Date.now(),\n input.httpStatus,\n input.upstreamUrl,\n input.upstreamMethod,\n JSON.stringify(redactHeaders(input.requestHeaders)),\n input.requestBody,\n input.requestBodyKind,\n input.responseStatus,\n JSON.stringify(input.responseHeaders),\n input.responseBody,\n input.responseBodyKind,\n )\n } catch (error) {\n warnInsertFailure(error)\n }\n }\n\n getByRequestId(requestId: string): OutboundCaptureRow | null {\n try {\n const row = this.getByRequestIdStmt.get(requestId) as\n | {\n request_id: string\n captured_at_ms: number\n http_status: number\n upstream_url: string\n upstream_method: string\n request_headers: string\n request_body: string | null\n request_body_kind: string\n response_status: number\n response_headers: string\n response_body: string | null\n response_body_kind: string\n }\n | null\n | undefined\n\n if (!row) {\n return null\n }\n\n return {\n requestId: row.request_id,\n capturedAtMs: row.captured_at_ms,\n httpStatus: row.http_status,\n upstreamUrl: row.upstream_url,\n upstreamMethod: row.upstream_method,\n requestHeaders: JSON.parse(row.request_headers) as HeaderMap,\n requestBody: row.request_body,\n requestBodyKind: row.request_body_kind,\n responseStatus: row.response_status,\n responseHeaders: JSON.parse(row.response_headers) as HeaderMap,\n responseBody: row.response_body,\n responseBodyKind: row.response_body_kind,\n }\n } catch (error) {\n consola.debug(\"Failed to fetch request outbound by request_id\", error)\n return null\n }\n }\n\n hasOutboundForIds(requestIds: Array<string>): Set<string> {\n if (requestIds.length === 0) return new Set()\n try {\n const placeholders = requestIds.map(() => \"?\").join(\", \")\n const stmt = this.db.query(\n `SELECT request_id FROM request_outbound WHERE request_id IN (${placeholders})`,\n )\n const rows = stmt.all(...requestIds) as Array<{ request_id: string }>\n return new Set(rows.map((r) => r.request_id))\n } catch (error) {\n consola.debug(\"Failed to batch-check request outbound ids\", error)\n return new Set()\n }\n }\n\n cleanupOrphans(): void {\n try {\n this.cleanupOrphansStmt.run()\n } catch (error) {\n consola.debug(\"Failed to cleanup request_outbound orphans\", error)\n }\n }\n\n meta(): { dbPath: string; userVersion: number } {\n return {\n dbPath: getAdminDbPath(),\n userVersion: getAdminDbUserVersion(this.db),\n }\n }\n}\n\nexport function createRequestOutboundStore(\n db: Database,\n): RequestOutboundStoreApi {\n return new RequestOutboundStore(db)\n}\n\nconst disabledStore: RequestOutboundStoreApi = {\n insert: () => {},\n getByRequestId: () => null,\n hasOutboundForIds: () => new Set(),\n cleanupOrphans: () => {},\n meta: () => ({\n dbPath: getAdminDbPath(),\n userVersion: 0,\n }),\n}\n\nlet sharedStore: RequestOutboundStoreApi | null = null\n\nexport function getRequestOutboundStore(): RequestOutboundStoreApi {\n if (sharedStore) {\n return sharedStore\n }\n\n const now = Date.now()\n if (now < nextStoreRetryAtMs) {\n return disabledStore\n }\n\n try {\n sharedStore = createRequestOutboundStore(getAdminDb())\n return sharedStore\n } catch (error) {\n nextStoreRetryAtMs = now + STORE_INIT_RETRY_DELAY_MS\n warnStoreInitFailure(error)\n return disabledStore\n }\n}\n"],"mappings":"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"}
|