@panorama-ai/gateway 2.30.176 → 2.30.194
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/database.types.d.ts +136 -28
- package/dist/database.types.d.ts.map +1 -1
- package/dist/database.types.js +0 -3
- package/dist/database.types.js.map +1 -1
- package/dist/gateway-job-store.d.ts.map +1 -1
- package/dist/gateway-job-store.js.map +1 -1
- package/dist/index.js.map +2 -2
- package/package.json +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../shared/dist/utils.js", "../../shared/dist/gateway/liveness.js", "../../shared/dist/gateway/capabilities.js", "../src/index.ts", "../src/cli-args.ts", "../src/cli-env.ts", "../src/cli-output.ts", "../src/gateway-cli-commands.ts", "../src/gateway-doctor.ts", "../src/gateway-provider-health.ts", "../src/gateway-pairing.ts", "../src/prod-defaults.generated.ts", "../src/supabase-config.ts", "../src/gateway-command-runner.ts", "../src/child-process-env.ts", "../src/runtime-paths.ts", "../src/process-output-capture.ts", "../src/stream-json-collector.ts", "../src/process-control.ts", "../src/local-security.ts", "../src/gateway-state.ts", "../src/gateway-run-helpers.ts", "../../shared/dist/crypto.js", "../../shared/dist/overflow/contract.js", "../../shared/dist/subagents/contract.js", "../src/subagent-adapters/types.ts", "../src/subagent-run-helpers.ts", "../src/subagent-run-events.ts", "../src/subagent-run-store.ts", "../src/gateway-execution-support.ts", "../src/gateway-control-plane.ts", "../src/gateway-job-handlers.ts", "../src/debug-redaction.ts", "../src/cli-providers/claude.ts", "../src/cli-providers/types.ts", "../src/subagent-adapters/claude-support.ts", "../src/cli-providers/claude-utils.ts", "../src/provider-runtime-utils.ts", "../src/cli-provider-commands.ts", "../src/cli-command-discovery.ts", "../src/cli-providers/codex.ts", "../src/cli-providers/codex-schema.ts", "../src/cli-providers/gemini.ts", "../src/cli-providers/registry.ts", "../src/gateway-jobs.ts", "../src/gateway-job-store.ts", "../src/gateway-job-processor.ts", "../src/gateway-model-run.ts", "../src/gateway-shell-exec.ts", "../src/remote-shell-resource.ts", "../../shared/dist/subagents/provider-hosted.js", "../../shared/dist/subagents/registry.js", "../src/gateway-subagent-run-job.ts", "../src/subagent-run-job.ts", "../src/subagent-run-execution.ts", "../src/finalize-subagent-run.ts", "../src/gateway-subagent-run-finalizer.ts", "../src/subagent-adapters/utils.ts", "../src/subagent-adapters/claude-code.ts", "../src/subagent-adapters/output-format.ts", "../src/subagent-adapters/codex.ts", "../src/subagent-adapters/gemini.ts", "../src/subagent-adapters/registry.ts", "../src/subagent-full-control.ts", "../src/gateway-subagent-run-target.ts", "../../shared/dist/subagents/cancel-orchestrator.js", "../src/subagent-cancel-job.ts", "../src/subagent-failure.ts", "../src/gateway-provider-runtime.ts", "../src/gateway-provider-capabilities.ts", "../src/gateway-capability-services.ts", "../src/gateway-operational-status.ts", "../src/gateway-runtime-provider-health.ts", "../src/gateway-start-command.ts", "../src/gateway-daemon.ts", "../src/gateway-local-runtime.ts", "../src/job-queue.ts", "../src/gateway-job-controller.ts", "../src/local-runtime/runtime-utils.ts", "../src/local-runtime/heartbeat-supervisor.ts", "../src/local-runtime/restart-supervisor.ts", "../src/gateway-lifecycle.ts", "../src/gateway-restart.ts", "../src/subagent-shutdown-cancellation.ts", "../src/local-runtime/shutdown-supervisor.ts", "../src/gateway-runtime-state.ts", "../src/managed-runtime.ts", "../../shared/dist/linux-host-control/contract.js", "../../shared/dist/tools/execution-contract.js", "../src/managed-runtime/config.ts", "../../shared/dist/linux-host-session/contract.js", "../src/managed-runtime/runtime-utils.ts", "../src/managed-runtime/control-client.ts", "../src/managed-runtime/realtime.ts", "../src/managed-runtime/host-state.ts", "../../shared/dist/control-signals.js", "../src/managed-runtime/shell-execution.ts", "../src/managed-runtime/dependencies.ts", "../src/managed-runtime/execution-dispatcher.ts", "../../shared/dist/cycle-step-artifacts.js", "../src/managed-runtime/step-result.ts", "../src/managed-runtime/heartbeat.ts", "../src/managed-runtime/wake-signal.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Shared utility functions\n */\n// Default truncation limit - 100k characters for individual logs\nconst DEFAULT_TRUNCATION_LIMIT = 100_000;\n/**\n * Constant-time string comparison to reduce timing side-channel leakage.\n */\nexport function constantTimeEquals(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n let result = 0;\n for (let i = 0; i < a.length; i += 1) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return result === 0;\n}\n/**\n * Escapes special characters in a string for safe use in PostgREST filter values.\n *\n * PostgREST filter syntax uses these characters with special meaning:\n * - Commas (,) to separate OR conditions\n * - Parentheses () for grouping\n * - Periods (.) as syntax delimiters\n * - Percent (%) and underscore (_) as ilike wildcards\n * - Backslash (\\) for escaping\n *\n * Without escaping, user input containing these characters can break filter\n * parsing (causing 400/500 errors) or potentially inject additional filter conditions.\n *\n * @param value The user-provided string to escape\n * @returns The escaped string safe for interpolation into PostgREST filters\n *\n * @example\n * // Safe usage in .or() filter:\n * const escaped = escapePostgrestFilterValue(searchText)\n * query.or(`field.ilike.%${escaped}%`)\n */\nexport function escapePostgrestFilterValue(value) {\n if (!value)\n return value;\n // Escape backslashes first (so we don't double-escape later escapes)\n // Then escape: comma, parentheses, period, ilike wildcards\n return value\n .replace(/\\\\/g, '\\\\\\\\') // Backslash -> \\\\\n .replace(/,/g, '\\\\,') // Comma -> \\,\n .replace(/\\(/g, '\\\\(') // ( -> \\(\n .replace(/\\)/g, '\\\\)') // ) -> \\)\n .replace(/%/g, '\\\\%') // % -> \\%\n .replace(/_/g, '\\\\_') // _ -> \\_\n .replace(/\\./g, '\\\\.'); // . -> \\.\n}\n/**\n * Truncate a string to a specified length, adding ellipsis if truncated\n * @param text The text to truncate\n * @param maxLength Maximum length (default: 100,000 chars)\n * @returns Truncated text with ellipsis if needed\n */\nexport function truncateText(text, maxLength = DEFAULT_TRUNCATION_LIMIT) {\n if (!text || text.length <= maxLength) {\n return text;\n }\n return text.substring(0, maxLength) + '...';\n}\n/**\n * Truncate text and return both the truncated text and a warning if truncated\n * @param text The text to truncate\n * @param maxLength Maximum length\n * @returns Object with truncated text and truncation warning\n */\nexport function truncateWithWarning(text, maxLength = DEFAULT_TRUNCATION_LIMIT) {\n if (!text || text.length <= maxLength) {\n return { text, truncated: false };\n }\n return {\n text: text.substring(0, maxLength) + '...',\n truncated: true,\n originalLength: text.length,\n };\n}\n/**\n * Truncate text for log summaries (shorter default)\n * @param text The text to truncate\n * @param maxLength Maximum length (default: 200 chars for summaries)\n * @returns Truncated text with ellipsis if needed\n */\nexport function truncateForSummary(text, maxLength = 200) {\n return truncateText(text, maxLength);\n}\n/**\n * Configuration for truncation limits\n */\nexport const TRUNCATION_LIMITS = {\n // Full content - 100k characters for individual logs\n FULL_CONTENT: DEFAULT_TRUNCATION_LIMIT,\n // Log summaries - reasonable for UI display\n LOG_SUMMARY: 200,\n // Tool parameters in console logs only\n TOOL_PARAMS: 100,\n // Context logs - 100k characters\n CONTEXT_LOGS: DEFAULT_TRUNCATION_LIMIT,\n // Individual log content - 100k characters\n LOG_CONTENT: DEFAULT_TRUNCATION_LIMIT,\n // AI-generated summaries from query_logs_summary tool - 100k characters\n AI_SUMMARY: DEFAULT_TRUNCATION_LIMIT,\n};\nfunction normalizeAndTruncateEventString(value, maxLength) {\n const normalized = normalizeEventText(value);\n if (normalized.length <= maxLength) {\n return { value: normalized, truncated: false };\n }\n return {\n value: `${normalized.substring(0, maxLength)}...`,\n truncated: true,\n originalLength: normalized.length,\n };\n}\nfunction isDisallowedControlChar(codePoint) {\n return ((codePoint >= 0x00 && codePoint <= 0x08) ||\n codePoint === 0x0b ||\n codePoint === 0x0c ||\n (codePoint >= 0x0e && codePoint <= 0x1f) ||\n codePoint === 0x7f);\n}\nfunction normalizeEventText(value) {\n const withNormalizedLineEndings = value.replace(/\\r\\n|\\r/g, '\\n');\n let output = '';\n for (let index = 0; index < withNormalizedLineEndings.length; index += 1) {\n const codePoint = withNormalizedLineEndings.charCodeAt(index);\n if (isDisallowedControlChar(codePoint))\n continue;\n output += withNormalizedLineEndings[index];\n }\n return output;\n}\n/**\n * Truncate all string values in an object recursively with warnings\n * @param obj The object to process\n * @param maxLength Maximum length for string values\n * @returns Processed object with truncation warnings\n */\nexport function truncateEventData(obj, maxLength = DEFAULT_TRUNCATION_LIMIT) {\n if (!obj || typeof obj !== 'object') {\n if (typeof obj === 'string') {\n const normalized = normalizeAndTruncateEventString(obj, maxLength);\n if (normalized.truncated) {\n return {\n value: normalized.value,\n truncation_warning: `Truncated from ${normalized.originalLength} to ${maxLength} characters`,\n };\n }\n return normalized.value;\n }\n return obj;\n }\n if (Array.isArray(obj)) {\n // Handle arrays\n return obj.map((item) => truncateEventData(item, maxLength));\n }\n // Handle objects\n const result = {};\n const warnings = {};\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === 'string') {\n const normalized = normalizeAndTruncateEventString(value, maxLength);\n result[key] = normalized.value;\n if (normalized.truncated) {\n warnings[key] = `Truncated from ${normalized.originalLength} to ${maxLength} characters`;\n }\n }\n else if (typeof value === 'object' && value !== null) {\n const processed = truncateEventData(value, maxLength);\n result[key] = processed;\n }\n else {\n result[key] = value;\n }\n }\n // Add warnings if any truncation occurred\n if (Object.keys(warnings).length > 0) {\n result.truncation_warning = warnings;\n }\n return result;\n}\n/**\n * Create a standardized event log entry with automatic truncation\n * @param eventType The type of event\n * @param data The event data\n * @param options Optional settings\n * @returns Formatted event data ready for storage\n */\nexport function createEventLogEntry(eventType, data, options) {\n const event = {\n event_type: eventType,\n };\n // Add optional fields\n if (options?.toolName) {\n event.tool_name = options.toolName;\n }\n if (options?.actor) {\n event.actor = options.actor;\n }\n if (options?.error) {\n const normalizedError = normalizeAndTruncateEventString(options.error, DEFAULT_TRUNCATION_LIMIT);\n event.error = normalizedError.value;\n }\n // Truncate all string data in the event\n event.data = truncateEventData(data);\n return event;\n}\n/**\n * Format a relative timestamp for display (e.g., \"2 minutes ago\")\n * @param date The date to format\n * @param now The current date for comparison (defaults to new Date())\n * @returns Formatted relative timestamp string\n */\nexport function formatRelativeTimestamp(date, now = new Date()) {\n const seconds = Math.floor((now.getTime() - date.getTime()) / 1000);\n if (seconds < 60) {\n return seconds === 1 ? '1 second ago' : `${seconds} seconds ago`;\n }\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n return minutes === 1 ? '1 minute ago' : `${minutes} minutes ago`;\n }\n const hours = Math.floor(minutes / 60);\n if (hours < 24) {\n return hours === 1 ? '1 hour ago' : `${hours} hours ago`;\n }\n const days = Math.floor(hours / 24);\n return days === 1 ? '1 day ago' : `${days} days ago`;\n}\nexport function normalizeSubscriptionPath(path) {\n const raw = (path ?? '').trim();\n if (!raw)\n return '/';\n const withLeadingSlash = raw.startsWith('/') ? raw : `/${raw}`;\n const collapsed = withLeadingSlash.replace(/\\/{2,}/g, '/');\n if (collapsed.length > 1 && collapsed.endsWith('/')) {\n return collapsed.slice(0, -1);\n }\n return collapsed;\n}\n/**\n * Match a subscription path glob against an event's resource_path.\n *\n * Supports:\n * - `/` => matches all paths\n * - `*` => matches a single path segment\n * - `**` => matches across segments (including `/`)\n *\n * Examples:\n * - subscription `/` matches `/` and `/threads/123`\n * - subscription `/threads/*` matches `/threads/123`\n * - subscription `/threads/**` matches `/threads/123/messages/456`\n */\n/**\n * Type guard: returns true if `value` is a non-null, non-array object.\n */\nexport function isRecord(value) {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n/**\n * Returns `value` as a record if it is a non-null, non-array object, or null otherwise.\n */\nexport function asRecord(value) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n return value;\n}\n/**\n * Returns `value` as a trimmed string if non-empty, or null otherwise.\n */\nexport function readString(value) {\n return typeof value === 'string' && value.trim().length > 0 ? value : null;\n}\nexport function matchSubscriptionPath(subscriptionPath, resourcePath) {\n const pattern = normalizeSubscriptionPath(subscriptionPath);\n const path = normalizeSubscriptionPath(resourcePath);\n if (pattern === '/')\n return true;\n // Build a regex from the glob pattern.\n // - `**` -> `.*`\n // - `*` -> `[^/]+`\n let regexSource = '^';\n for (let index = 0; index < pattern.length; index++) {\n const ch = pattern[index];\n if (ch === '*') {\n const next = pattern[index + 1];\n if (next === '*') {\n regexSource += '.*';\n index++;\n }\n else {\n regexSource += '[^/]+';\n }\n continue;\n }\n // Escape regex metacharacters.\n const regexMetacharacters = '\\\\^$.*+?()[]{}|';\n if (regexMetacharacters.includes(ch)) {\n regexSource += `\\\\${ch}`;\n }\n else {\n regexSource += ch;\n }\n }\n regexSource += '$';\n return new RegExp(regexSource).test(path);\n}\n", "import { isGatewayHostAvailable, validateGatewayCapabilitiesV1 } from './capabilities.js';\nexport const GATEWAY_HEARTBEAT_STALE_MS = 90_000;\nexport const GATEWAY_RUNTIME_STATUSES = ['pending', 'ready', 'offline', 'error'];\nconst GATEWAY_RUNTIME_STATUS_SET = new Set(GATEWAY_RUNTIME_STATUSES);\nexport function normalizeGatewayRuntimeStatus(value) {\n if (typeof value !== 'string')\n return null;\n const normalized = value.trim().toLowerCase();\n if (!GATEWAY_RUNTIME_STATUS_SET.has(normalized)) {\n return null;\n }\n return normalized;\n}\nexport function isGatewayHeartbeatFresh(lastSeenAt, options) {\n if (!lastSeenAt)\n return false;\n const lastSeenMs = Date.parse(lastSeenAt);\n if (!Number.isFinite(lastSeenMs))\n return false;\n const nowMs = options?.nowMs ?? Date.now();\n const staleMs = options?.staleMs ?? GATEWAY_HEARTBEAT_STALE_MS;\n return nowMs - lastSeenMs <= staleMs;\n}\nexport function getGatewayHostAvailability(capabilities) {\n const parsed = validateGatewayCapabilitiesV1(capabilities ?? null);\n if (!parsed.ok)\n return null;\n return isGatewayHostAvailable(parsed.value);\n}\nexport function deriveGatewayLiveness(params) {\n const rawStatus = normalizeGatewayRuntimeStatus(params.status);\n const heartbeatFresh = isGatewayHeartbeatFresh(params.lastSeenAt ?? null, {\n nowMs: params.nowMs,\n staleMs: params.staleMs,\n });\n const hostAvailable = getGatewayHostAvailability(params.capabilities ?? null);\n const online = rawStatus === 'ready' && heartbeatFresh && hostAvailable === true;\n const effectiveStatus = rawStatus === 'ready' ? (online ? 'ready' : 'offline') : rawStatus;\n return {\n rawStatus,\n effectiveStatus,\n heartbeatFresh,\n hostAvailable,\n online,\n };\n}\n", "import { isRecord } from '../utils.js';\nimport { deriveGatewayLiveness } from './liveness.js';\nexport const GATEWAY_CAPABILITIES_SCHEMA_VERSION = 'v1';\nexport const GATEWAY_PROVIDER_IDS = ['claude_code', 'codex', 'gemini'];\nexport const GATEWAY_SERVICE_IDS = [\n 'model_execution',\n 'remote_shell',\n 'machine_control',\n];\nexport function createEmptyGatewayCapabilitiesV1(params) {\n const providers = Object.fromEntries(GATEWAY_PROVIDER_IDS.map((id) => [\n id,\n {\n available: false,\n supports: {\n output_schema: false,\n stream_json: false,\n tool_disable: false,\n },\n },\n ]));\n const host = {\n kind: 'gateway',\n available: params?.hostAvailable ?? true,\n };\n if (params?.hostLabel) {\n host.label = params.hostLabel;\n }\n return {\n schema_version: GATEWAY_CAPABILITIES_SCHEMA_VERSION,\n providers,\n hosts: { gateway: host },\n services: {\n model_execution: { ready: false },\n remote_shell: { ready: host.available },\n machine_control: { ready: false },\n },\n };\n}\nexport function validateGatewayCapabilitiesV1(value) {\n if (!isRecord(value)) {\n return { ok: false, error: 'capabilities must be an object' };\n }\n if (value.schema_version !== GATEWAY_CAPABILITIES_SCHEMA_VERSION) {\n return {\n ok: false,\n error: `schema_version must be \"${GATEWAY_CAPABILITIES_SCHEMA_VERSION}\"`,\n };\n }\n const providers = value.providers;\n if (!isRecord(providers)) {\n return { ok: false, error: 'providers must be an object' };\n }\n for (const key of Object.keys(providers)) {\n if (!GATEWAY_PROVIDER_IDS.includes(key)) {\n return { ok: false, error: `providers.${key} is not supported` };\n }\n }\n for (const providerId of GATEWAY_PROVIDER_IDS) {\n const entry = providers[providerId];\n if (!isRecord(entry)) {\n return { ok: false, error: `providers.${providerId} must be an object` };\n }\n if (typeof entry.available !== 'boolean') {\n return { ok: false, error: `providers.${providerId}.available must be boolean` };\n }\n const supports = entry.supports;\n if (!isRecord(supports)) {\n return { ok: false, error: `providers.${providerId}.supports must be an object` };\n }\n const requiredSupports = [\n 'output_schema',\n 'stream_json',\n 'tool_disable',\n ];\n for (const supportKey of requiredSupports) {\n if (typeof supports[supportKey] !== 'boolean') {\n return {\n ok: false,\n error: `providers.${providerId}.supports.${supportKey} must be boolean`,\n };\n }\n }\n if (entry.supported_flags !== undefined && !isBooleanRecord(entry.supported_flags)) {\n return {\n ok: false,\n error: `providers.${providerId}.supported_flags must be a boolean map`,\n };\n }\n if (entry.extensions !== undefined && !isStringArray(entry.extensions)) {\n return { ok: false, error: `providers.${providerId}.extensions must be string[]` };\n }\n if (entry.health !== undefined) {\n const health = entry.health;\n if (!isRecord(health)) {\n return { ok: false, error: `providers.${providerId}.health must be an object` };\n }\n if (!isGatewayHealthStatus(health.status)) {\n return { ok: false, error: `providers.${providerId}.health.status is invalid` };\n }\n if (!isGatewayHealthCheckType(health.check_type)) {\n return { ok: false, error: `providers.${providerId}.health.check_type is invalid` };\n }\n if (typeof health.checked_at !== 'string') {\n return { ok: false, error: `providers.${providerId}.health.checked_at must be string` };\n }\n if (health.last_full_checked_at !== undefined && typeof health.last_full_checked_at !== 'string') {\n return {\n ok: false,\n error: `providers.${providerId}.health.last_full_checked_at must be string`,\n };\n }\n if (health.last_full_status !== undefined && !isGatewayHealthStatus(health.last_full_status)) {\n return { ok: false, error: `providers.${providerId}.health.last_full_status is invalid` };\n }\n if (health.error !== undefined && typeof health.error !== 'string') {\n return { ok: false, error: `providers.${providerId}.health.error must be string` };\n }\n if (health.model !== undefined && typeof health.model !== 'string') {\n return { ok: false, error: `providers.${providerId}.health.model must be string` };\n }\n if (health.duration_ms !== undefined && typeof health.duration_ms !== 'number') {\n return { ok: false, error: `providers.${providerId}.health.duration_ms must be number` };\n }\n }\n }\n const hosts = value.hosts;\n if (!isRecord(hosts)) {\n return { ok: false, error: 'hosts must be an object' };\n }\n if (!isRecord(hosts.gateway)) {\n return { ok: false, error: 'hosts.gateway must be an object' };\n }\n const gatewayHost = hosts.gateway;\n if (gatewayHost.kind !== 'gateway') {\n return { ok: false, error: 'hosts.gateway.kind must be \"gateway\"' };\n }\n if (typeof gatewayHost.available !== 'boolean') {\n return { ok: false, error: 'hosts.gateway.available must be boolean' };\n }\n if (gatewayHost.label !== undefined && typeof gatewayHost.label !== 'string') {\n return { ok: false, error: 'hosts.gateway.label must be string' };\n }\n if (gatewayHost.error !== undefined && typeof gatewayHost.error !== 'string') {\n return { ok: false, error: 'hosts.gateway.error must be string' };\n }\n if (gatewayHost.last_checked_at !== undefined && typeof gatewayHost.last_checked_at !== 'string') {\n return { ok: false, error: 'hosts.gateway.last_checked_at must be string' };\n }\n if (gatewayHost.metadata !== undefined && !isRecord(gatewayHost.metadata)) {\n return { ok: false, error: 'hosts.gateway.metadata must be an object' };\n }\n const services = value.services;\n if (!isRecord(services)) {\n return { ok: false, error: 'services must be an object' };\n }\n for (const serviceId of GATEWAY_SERVICE_IDS) {\n const entry = services[serviceId];\n if (!isRecord(entry)) {\n return { ok: false, error: `services.${serviceId} must be an object` };\n }\n if (typeof entry.ready !== 'boolean') {\n return { ok: false, error: `services.${serviceId}.ready must be boolean` };\n }\n if (entry.reason !== undefined && typeof entry.reason !== 'string') {\n return { ok: false, error: `services.${serviceId}.reason must be string` };\n }\n }\n if (value.runtime !== undefined) {\n const runtime = value.runtime;\n if (!isRecord(runtime)) {\n return { ok: false, error: 'runtime must be an object' };\n }\n if (typeof runtime.platform !== 'string') {\n return { ok: false, error: 'runtime.platform must be string' };\n }\n if (typeof runtime.arch !== 'string') {\n return { ok: false, error: 'runtime.arch must be string' };\n }\n if (typeof runtime.node_version !== 'string') {\n return { ok: false, error: 'runtime.node_version must be string' };\n }\n if (runtime.gateway_version !== undefined && typeof runtime.gateway_version !== 'string') {\n return { ok: false, error: 'runtime.gateway_version must be string' };\n }\n }\n return { ok: true, value: value };\n}\nexport function isGatewayHostAvailable(capabilities) {\n return capabilities?.hosts?.gateway?.available === true;\n}\nexport function getGatewayServiceCapability(capabilities, serviceId) {\n const services = capabilities?.services;\n if (!services || typeof services !== 'object') {\n return null;\n }\n const service = services[serviceId];\n if (!service || typeof service !== 'object') {\n return null;\n }\n return service;\n}\nexport function isGatewayServiceReady(capabilities, serviceId) {\n return getGatewayServiceCapability(capabilities, serviceId)?.ready === true;\n}\nexport const GATEWAY_MACHINE_CONTROL_REASONS = {\n resource_disabled: 'Resource machine control is disabled. Set full_control=true on the resource before running host commands.',\n gateway_disabled: 'Gateway machine control is disabled in Team Integrations.',\n install_disabled: 'Gateway host machine control is disabled. Run \"panorama-gateway full-control enable\" on the host.',\n service_unavailable: 'Gateway machine control service is unavailable.',\n};\nfunction normalizeOptionalBoolean(value) {\n return typeof value === 'boolean' ? value : null;\n}\nexport function deriveGatewayMachineControlState(params) {\n const resourceEnabled = normalizeOptionalBoolean(params.resourceEnabled);\n const gatewayEnabled = normalizeOptionalBoolean(params.gatewayEnabled);\n const installEnabled = normalizeOptionalBoolean(params.installEnabled);\n const serviceReady = normalizeOptionalBoolean(params.serviceReady);\n const resourceRequired = params.resourceEnabled !== undefined;\n const serviceRequired = params.serviceReady !== undefined;\n const failedReasonCode = resourceRequired && resourceEnabled !== true\n ? 'resource_disabled'\n : gatewayEnabled !== true\n ? 'gateway_disabled'\n : installEnabled !== true\n ? 'install_disabled'\n : serviceRequired && serviceReady !== true\n ? 'service_unavailable'\n : null;\n return {\n resourceEnabled,\n gatewayEnabled,\n installEnabled,\n serviceReady,\n effective: failedReasonCode == null,\n reasonCode: failedReasonCode,\n reason: failedReasonCode ? GATEWAY_MACHINE_CONTROL_REASONS[failedReasonCode] : null,\n };\n}\nexport class RemoteShellAdmissionError extends Error {\n code;\n parameter;\n constructor(params) {\n super(params.message, params.cause ? { cause: params.cause } : undefined);\n this.name = 'RemoteShellAdmissionError';\n this.code = params.code;\n this.parameter = params.parameter;\n }\n}\nfunction isPlainObject(value) {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\nfunction normalizeOptionalString(value) {\n if (typeof value !== 'string')\n return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\nfunction normalizeTimeoutMs(value, fallbackMs, maxMs) {\n const parsed = typeof value === 'number'\n ? value\n : typeof value === 'string'\n ? Number.parseInt(value, 10)\n : Number.NaN;\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return fallbackMs;\n }\n return Math.max(1, Math.min(maxMs, Math.round(parsed)));\n}\nfunction parseInstallFullControlFlag(capabilities) {\n if (!isPlainObject(capabilities))\n return null;\n const hosts = capabilities.hosts;\n if (!isPlainObject(hosts))\n return null;\n const gateway = hosts.gateway;\n if (!isPlainObject(gateway))\n return null;\n const metadata = gateway.metadata;\n if (!isPlainObject(metadata))\n return null;\n return typeof metadata.install_full_control_enabled === 'boolean'\n ? metadata.install_full_control_enabled\n : null;\n}\nexport function normalizeRemoteShellExecTimeout(value, fallbackMs, options) {\n return normalizeTimeoutMs(value, fallbackMs, options?.maxMs ?? 10 * 60_000);\n}\nexport function extractRemoteShellMetadata(resource) {\n const metadata = isPlainObject(resource.metadata) ? resource.metadata : {};\n const gatewayId = normalizeOptionalString(metadata.gateway_id);\n const vmId = normalizeOptionalString(metadata.vm_id);\n if (!gatewayId && !vmId) {\n throw new RemoteShellAdmissionError({\n code: 'invalid_parameter',\n parameter: 'resource_uri',\n message: 'Remote shell resource is missing metadata.gateway_id or metadata.vm_id',\n });\n }\n return {\n gatewayId,\n vmId,\n fullControl: metadata.full_control === true,\n };\n}\nexport async function resolveRemoteShellGatewayTarget(serviceClient, teamId, metadata) {\n if (metadata.vmId) {\n const { data, error } = await serviceClient\n .from('team_gateways')\n .select('id, vm_id')\n .eq('team_id', teamId)\n .eq('vm_id', metadata.vmId)\n .order('updated_at', { ascending: false })\n .limit(1)\n .maybeSingle();\n if (error) {\n throw new RemoteShellAdmissionError({\n code: 'database_error',\n message: 'Failed to resolve VM-backed remote shell gateway target',\n cause: error,\n });\n }\n if (!data?.id) {\n throw new RemoteShellAdmissionError({\n code: 'not_found',\n message: 'Remote shell gateway',\n });\n }\n return {\n gatewayId: data.id,\n vmId: normalizeOptionalString(data.vm_id),\n };\n }\n if (!metadata.gatewayId) {\n throw new RemoteShellAdmissionError({\n code: 'invalid_parameter',\n parameter: 'resource_uri',\n message: 'Remote shell resource is missing metadata.gateway_id',\n });\n }\n return {\n gatewayId: metadata.gatewayId,\n vmId: null,\n };\n}\nexport async function loadReadyRemoteShellGateway(serviceClient, teamId, target, options) {\n const { data, error } = await serviceClient\n .from('team_gateways')\n .select('id, status, last_seen_at, full_control_enabled, capabilities, vm_id')\n .eq('team_id', teamId)\n .eq('id', target.gatewayId)\n .maybeSingle();\n if (error) {\n throw new RemoteShellAdmissionError({\n code: 'database_error',\n message: 'Failed to load remote shell gateway',\n cause: error,\n });\n }\n if (!data) {\n throw new RemoteShellAdmissionError({\n code: 'not_found',\n message: 'Remote shell gateway',\n });\n }\n if (target.vmId && data.vm_id !== target.vmId) {\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: 'Remote shell VM guest gateway target changed during resolution',\n });\n }\n const liveness = deriveGatewayLiveness({\n status: data.status,\n lastSeenAt: data.last_seen_at,\n capabilities: data.capabilities,\n });\n if (liveness.rawStatus === 'offline') {\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: 'Remote shell gateway is offline or heartbeat is stale',\n });\n }\n if (liveness.rawStatus === 'error') {\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: 'Remote shell gateway is unavailable',\n });\n }\n if (liveness.rawStatus !== 'ready' || !liveness.online) {\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: 'Remote shell gateway is not ready yet',\n });\n }\n const parsedCapabilities = validateGatewayCapabilitiesV1(data.capabilities ?? null);\n if (!parsedCapabilities.ok) {\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: `Gateway capabilities invalid: ${parsedCapabilities.error}`,\n });\n }\n if (!isGatewayServiceReady(parsedCapabilities.value, 'remote_shell')) {\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: 'Remote shell service is unavailable on the selected gateway',\n });\n }\n const installFullControlEnabled = parseInstallFullControlFlag(data.capabilities);\n if (options?.requireFullControl === true) {\n const machineControl = deriveGatewayMachineControlState({\n gatewayEnabled: data.full_control_enabled === true,\n installEnabled: installFullControlEnabled,\n serviceReady: isGatewayServiceReady(parsedCapabilities.value, 'machine_control'),\n });\n if (!machineControl.effective) {\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: machineControl.reason ?? GATEWAY_MACHINE_CONTROL_REASONS.service_unavailable,\n });\n }\n }\n return {\n id: data.id,\n status: data.status,\n lastSeenAt: data.last_seen_at,\n fullControlEnabled: data.full_control_enabled === true,\n installFullControlEnabled,\n vmId: normalizeOptionalString(data.vm_id),\n };\n}\nexport async function admitRemoteShellExec(params) {\n const resourceTeamId = typeof params.resource.team_id === 'string' && params.resource.team_id.trim().length > 0\n ? params.resource.team_id\n : params.resolvedContext.teamId;\n if (resourceTeamId !== params.resolvedContext.teamId) {\n throw new RemoteShellAdmissionError({\n code: 'not_found',\n message: 'Remote shell resource',\n });\n }\n if (params.resource.resource_type !== 'remote_shell') {\n throw new RemoteShellAdmissionError({\n code: 'invalid_parameter',\n parameter: 'resource_uri',\n message: `Resource is not a remote shell target (found ${params.resource.resource_type})`,\n });\n }\n if (params.resolvedContext.scope === 'agent') {\n if (params.resource.scope !== 'agent' ||\n params.resource.owner_agent_id !== params.resolvedContext.ownerAgentId) {\n throw new RemoteShellAdmissionError({\n code: 'not_found',\n message: 'Remote shell resource',\n });\n }\n }\n else if (params.resource.scope !== 'team') {\n throw new RemoteShellAdmissionError({\n code: 'not_found',\n message: 'Remote shell resource',\n });\n }\n if (params.resource.max_access_level === 'viewer') {\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: 'Remote shell resource is configured for viewer access. Full access is required for this action.',\n });\n }\n const metadata = extractRemoteShellMetadata(params.resource);\n if (!metadata.fullControl) {\n const machineControl = deriveGatewayMachineControlState({\n resourceEnabled: metadata.fullControl,\n gatewayEnabled: true,\n installEnabled: true,\n serviceReady: true,\n });\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: machineControl.reason ?? GATEWAY_MACHINE_CONTROL_REASONS.resource_disabled,\n });\n }\n const target = await resolveRemoteShellGatewayTarget(params.serviceClient, params.resolvedContext.teamId, metadata);\n const gateway = await loadReadyRemoteShellGateway(params.serviceClient, params.resolvedContext.teamId, target, { requireFullControl: true });\n return {\n teamId: params.resolvedContext.teamId,\n gatewayId: gateway.id,\n vmId: target.vmId,\n resourceId: params.resource.id,\n resourceUri: params.resourceUri,\n command: params.command,\n timeoutMs: normalizeRemoteShellExecTimeout(params.timeoutMs, 30_000),\n requestedByUserId: params.resolvedContext.requestedByUserId,\n requestedByAgentId: params.resolvedContext.ownerAgentId,\n };\n}\nexport function buildRemoteShellExecGatewayJobInsert(params) {\n return {\n team_id: params.admission.teamId,\n gateway_id: params.admission.gatewayId,\n status: 'queued',\n job_type: 'shell_exec',\n requested_by_user_id: params.admission.requestedByUserId ?? undefined,\n requested_by_agent_id: params.admission.requestedByAgentId ?? undefined,\n requested_via: params.requestedVia,\n payload: {\n resource_id: params.admission.resourceId,\n resource_uri: params.admission.resourceUri,\n command: params.admission.command,\n timeout_ms: params.admission.timeoutMs,\n requested_at: params.requestedAt ?? new Date().toISOString(),\n },\n };\n}\nfunction isStringArray(value) {\n return Array.isArray(value) && value.every((item) => typeof item === 'string');\n}\nfunction isBooleanRecord(value) {\n if (!isRecord(value))\n return false;\n return Object.values(value).every((entry) => typeof entry === 'boolean');\n}\nfunction isGatewayHealthStatus(value) {\n return value === 'healthy' || value === 'unhealthy' || value === 'unknown' || value === 'unavailable';\n}\nfunction isGatewayHealthCheckType(value) {\n return value === 'full' || value === 'light';\n}\n", "#!/usr/bin/env node\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport { GATEWAY_CAPABILITIES_SCHEMA_VERSION } from '@panorama/shared/gateway/capabilities'\nimport dotenv from 'dotenv'\nimport { execFile } from 'node:child_process'\nimport { randomUUID } from 'node:crypto'\nimport fsSync from 'node:fs'\nimport fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { promisify } from 'node:util'\nimport {\n getStringOption,\n parseArgs,\n resolveGatewayRuntimeMode,\n type ParsedArgs,\n} from './cli-args.js'\nimport {\n applyOptionEnvOverrides,\n normalizeEnvName,\n} from './cli-env.js'\nimport {\n GatewayCliError,\n cliError as writeCliError,\n cliInfo as writeCliInfo,\n cliSuccess as writeCliSuccess,\n cliWarn as writeCliWarn,\n describeError,\n formatPathForDisplay,\n type CliDetail,\n} from './cli-output.js'\nimport {\n fullControlGatewayCommand,\n showGatewayLogsCommand,\n statusGatewayCommand,\n stopGatewayCommand,\n type GatewayCliCommandDependencies,\n} from './gateway-cli-commands.js'\nimport {\n doctorGatewayCommand,\n type GatewayDoctorDependencies,\n} from './gateway-doctor.js'\nimport {\n pairGatewayCommand,\n type GatewayPairingDependencies,\n} from './gateway-pairing.js'\nimport type { Database } from './database.types.js'\nimport { createGatewayExecutionSupport } from './gateway-execution-support.js'\nimport { createGatewayControlPlane } from './gateway-control-plane.js'\nimport { createGatewayJobHandlers } from './gateway-job-handlers.js'\nimport { createGatewayProviderRuntime } from './gateway-provider-runtime.js'\nimport { startGatewayCommand } from './gateway-start-command.js'\nimport { startGatewayDaemonIfRequested } from './gateway-daemon.js'\nimport {\n ensureGatewayStatePermissions,\n isProcessAlive,\n loadGatewayConfig,\n readPidFile as readPidFileBase,\n removePidFile as removePidFileBase,\n resolveGatewayPaths as resolveGatewayPathsBase,\n saveGatewayConfig,\n writePidFile as writePidFileBase,\n type GatewayConfig,\n type GatewayPaths,\n} from './gateway-state.js'\nimport { createGatewayRuntimeState } from './gateway-runtime-state.js'\nimport {\n ensureOwnerOnlyDirectory,\n ensureOwnerOnlyFile,\n writeOwnerOnlyFile,\n} from './local-security.js'\nimport { startManagedGatewayRuntime } from './managed-runtime.js'\nimport { finalizeGatewaySubagentRunOnBackend } from './finalize-subagent-run.js'\nimport {\n startGatewayLocalRuntime,\n type GatewayLocalRuntimeConfigResolution,\n type GatewayLocalRuntimeEventPayload,\n} from './gateway-local-runtime.js'\n\nconst execFileAsync = promisify(execFile)\n\nconst DEFAULT_CLAUDE_TIMEOUT_MS = 10_000\nconst DEFAULT_REMOTE_SHELL_EXEC_TIMEOUT_MS = 30_000\nconst DEFAULT_SUBAGENT_TIMEOUT_MS = 30 * 60_000\nconst DEFAULT_MODEL_RUN_TIMEOUT_MS = 110_000\nconst SUBAGENT_CANCEL_KILL_TIMEOUT_MS = 5_000\nconst PROCESS_KILL_GRACE_MS = 2_000\n\ntype GatewaySupabaseClient = SupabaseClient<Database>\n\ntype GatewayEventPayload = GatewayLocalRuntimeEventPayload\n\ntype GatewayConfigDirResolution = GatewayLocalRuntimeConfigResolution\n\nconst runtimeState = createGatewayRuntimeState<GatewayEventPayload>()\nconst activeSubagentRuns = runtimeState.activeSubagentRuns\nconst activeModelRuns = runtimeState.activeModelRuns\nconst activeShellExecRuns = runtimeState.activeShellExecRuns\n\nlet ACTIVE_OPTIONS: ParsedArgs['options'] | null = null\n\nconst executionSupport = createGatewayExecutionSupport({\n runtimeState,\n subagentCancelKillTimeoutMs: SUBAGENT_CANCEL_KILL_TIMEOUT_MS,\n getActiveOptions,\n logError,\n})\nconst ensureGatewayTmpDir = executionSupport.ensureGatewayTmpDir\nconst buildGatewayChildEnv = executionSupport.buildGatewayChildEnv\nconst runGatewayCommandWithLogging = executionSupport.runCommand\nconst runGatewayStreamingCommandWithLogging = executionSupport.runStreamingCommand\nconst getNextRunSequence = executionSupport.getNextRunSequence\nconst getNextSubagentRunEventSequence = executionSupport.getNextSubagentRunEventSequence\nconst insertSubagentRunEvent = executionSupport.insertSubagentRunEvent\nconst requestChildTerminationWithLogging = executionSupport.requestChildTermination\nconst requestSubagentCancel = executionSupport.requestSubagentCancel\nconst resolvePendingCancel = executionSupport.resolvePendingCancel\nconst consumePendingCancelFromQueue = executionSupport.consumePendingCancelFromQueue\nconst clearPendingCancel = executionSupport.clearPendingCancel\nconst resolveSubagentWorkdirRoot = executionSupport.resolveSubagentWorkdirRoot\n\nconst controlPlane = createGatewayControlPlane({\n runtimeState,\n loadConfig,\n logInfo,\n logError,\n})\nconst createGatewayEventClient = controlPlane.createGatewayEventClient\nconst emitGatewayEvent = controlPlane.emitGatewayEvent\nconst flushGatewayEvents = controlPlane.flushGatewayEvents\nconst sendHeartbeat = controlPlane.sendHeartbeat\nconst loadGatewayControlState = controlPlane.loadGatewayControlState\nconst isHeartbeatFresh = controlPlane.isHeartbeatFresh\nconst refreshRuntimeInstallFullControl = controlPlane.refreshRuntimeInstallFullControl\n\nconst providerRuntime = createGatewayProviderRuntime({\n runtimeState,\n getActiveOptions,\n isVerbose,\n buildGatewayChildEnv,\n runCommand: runGatewayCommandWithLogging,\n readGatewayVersion: getGatewayVersion,\n saveConfig,\n sendHeartbeat,\n emitGatewayEvent,\n cliWarn,\n logInfo,\n logWarn,\n logError,\n expectedCapabilitiesSchemaVersion: GATEWAY_CAPABILITIES_SCHEMA_VERSION,\n})\nconst resolveClaudeCommand = providerRuntime.resolveClaudeCommand\nconst resolveCodexCommand = providerRuntime.resolveCodexCommand\nconst resolveGeminiCommand = providerRuntime.resolveGeminiCommand\nconst discoverGatewayCliCommands = providerRuntime.discoverCliCommands\nconst buildCapabilities = providerRuntime.buildCapabilities\nconst updateRuntimeProviderHealth = providerRuntime.updateRuntimeProviderHealth\nconst emitProviderHealthEvents = providerRuntime.emitProviderHealthEvents\n\nfunction printHelp(): void {\n console.log(\n `\\nPanorama Gateway\\n\\nUsage:\\n panorama-gateway pair <PAIRING_CODE> [--device-name \\\"My Mac\\\"]\\n panorama-gateway start [--device-name \\\"My Mac\\\"] [--foreground|--daemon] [--mode local|managed]\\n panorama-gateway stop\\n panorama-gateway status\\n panorama-gateway logs [--lines 200] [--no-follow]\\n panorama-gateway doctor\\n panorama-gateway full-control <enable|disable|status>\\n\\nNotes:\\n Pair automatically starts the gateway when possible.\\n Start runs in the background by default for the built CLI. Use --foreground to keep it attached.\\n Managed mode runs in the foreground and uses Panorama-managed runtime credentials from the environment.\\n\\nOutput options:\\n --verbose, -v Show technical details (paths, IDs, PIDs)\\n\\nEnvironment options:\\n --env <local|dev|test|stage|prod> Load .env.<env> from repo root (defaults to .env)\\n --env-file <path> Load a specific env file\\n --mode <local|managed> Runtime mode for start (default: local)\\n PANORAMA_ENV Same as --env\\n PANORAMA_ENV_FILE Same as --env-file\\n PANORAMA_GATEWAY_MODE Same as --mode for start\\n\\nCLI overrides:\\n --config-dir <path> Override config directory (default: ~/.panorama/gateway)\\n --config-path <path> Override gateway config file\\n --log-path <path> Override gateway log file\\n --pid-path <path> Override gateway pid file\\n --claude-cli <path> Override Claude CLI command\\n --codex-cli <path> Override Codex CLI command\\n --gemini-cli <path> Override Gemini CLI command\\n\\nEnvironment overrides:\\n PANORAMA_GATEWAY_CONFIG_DIR\\n PANORAMA_GATEWAY_CONFIG_PATH\\n PANORAMA_GATEWAY_LOG_PATH\\n PANORAMA_GATEWAY_PID_PATH\\n PANORAMA_CLAUDE_CLI or CLAUDE_CLI\\n PANORAMA_CODEX_CLI or CODEX_CLI\\n PANORAMA_GEMINI_CLI or GEMINI_CLI\\n PANORAMA_GATEWAY_AUTO_RESTART (default: on for built CLI, off for dev)\\n PANORAMA_GATEWAY_RESTART_CHECK_MS (default: 30000)\\n PANORAMA_GATEWAY_RESTART_MAX_WAIT_MS (optional)\\n`\n )\n}\n\nfunction getActiveOptions(options?: ParsedArgs['options']): ParsedArgs['options'] {\n return options ?? ACTIVE_OPTIONS ?? {}\n}\n\nfunction isVerbose(options?: ParsedArgs['options']): boolean {\n const resolvedOptions = getActiveOptions(options)\n return resolvedOptions.verbose === true || resolvedOptions.v === true\n}\n\nfunction resolveGatewayPaths(options?: ParsedArgs['options']): GatewayPaths {\n return resolveGatewayPathsBase(getActiveOptions(options))\n}\n\nfunction resolveGatewayFallbackConfigDir(): string {\n if (process.platform === 'darwin') {\n return path.join(os.homedir(), 'Library', 'Application Support', 'Panorama Gateway')\n }\n if (process.platform === 'win32') {\n const base = process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming')\n return path.join(base, 'Panorama Gateway')\n }\n const dataHome = process.env.XDG_DATA_HOME || path.join(os.homedir(), '.local', 'share')\n return path.join(dataHome, 'panorama-gateway')\n}\n\nasync function ensureWritableDirectory(dir: string): Promise<{ ok: boolean; error?: string }> {\n try {\n await ensureOwnerOnlyDirectory(dir)\n const probe = path.join(dir, `.panorama-write-${randomUUID()}`)\n await writeOwnerOnlyFile(probe, 'ok')\n await fs.unlink(probe)\n return { ok: true }\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) }\n }\n}\n\nasync function prepareGatewayConfigDir(\n options: ParsedArgs['options'],\n allowFallback: boolean\n): Promise<GatewayConfigDirResolution> {\n const resolvedOptions = getActiveOptions(options)\n const overrideDir =\n getStringOption(resolvedOptions, 'config-dir') || process.env.PANORAMA_GATEWAY_CONFIG_DIR\n const overridePath =\n getStringOption(resolvedOptions, 'config-path') || process.env.PANORAMA_GATEWAY_CONFIG_PATH\n const explicitOverride = Boolean(overrideDir || overridePath)\n\n const { configDir, configPath, logPath, pidPath } = resolveGatewayPaths(resolvedOptions)\n const writable = await ensureWritableDirectory(configDir)\n if (writable.ok) {\n process.env.PANORAMA_GATEWAY_CONFIG_DIR = configDir\n process.env.PANORAMA_GATEWAY_CONFIG_PATH = configPath\n process.env.PANORAMA_GATEWAY_LOG_PATH = logPath\n process.env.PANORAMA_GATEWAY_PID_PATH = pidPath\n try {\n await ensureGatewayStatePermissions({ configDir, configPath, logPath, pidPath })\n } catch (error) {\n const details = error instanceof Error ? error.message : String(error)\n throw new GatewayCliError(\n 'Gateway state permissions could not be secured.',\n `${details} Ensure the gateway directory is owned by this user and writable.`\n )\n }\n return { configDir, configPath }\n }\n\n if (explicitOverride || !allowFallback) {\n throw new GatewayCliError(\n 'Gateway config directory is not writable.',\n writable.error ??\n `Unable to write to ${configDir}. Set --config-dir or PANORAMA_GATEWAY_CONFIG_DIR to a writable location.`\n )\n }\n\n const fallbackDir = resolveGatewayFallbackConfigDir()\n const fallbackWritable = await ensureWritableDirectory(fallbackDir)\n if (!fallbackWritable.ok) {\n throw new GatewayCliError(\n 'Gateway config directory is not writable.',\n fallbackWritable.error ?? `Unable to write to ${configDir} or fallback ${fallbackDir}.`\n )\n }\n\n const fallbackOptions = { ...resolvedOptions, 'config-dir': fallbackDir }\n const fallbackPaths = resolveGatewayPaths(fallbackOptions)\n if (configPath !== fallbackPaths.configPath && fsSync.existsSync(configPath)) {\n try {\n await ensureOwnerOnlyDirectory(path.dirname(fallbackPaths.configPath))\n await fs.copyFile(configPath, fallbackPaths.configPath)\n await ensureOwnerOnlyFile(fallbackPaths.configPath)\n } catch (error) {\n logError('Failed to migrate gateway config to fallback directory', {\n from: configPath,\n to: fallbackPaths.configPath,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n resolvedOptions['config-dir'] = fallbackDir\n process.env.PANORAMA_GATEWAY_CONFIG_DIR = fallbackDir\n process.env.PANORAMA_GATEWAY_CONFIG_PATH = fallbackPaths.configPath\n process.env.PANORAMA_GATEWAY_LOG_PATH = fallbackPaths.logPath\n process.env.PANORAMA_GATEWAY_PID_PATH = fallbackPaths.pidPath\n try {\n await ensureGatewayStatePermissions(fallbackPaths)\n } catch (error) {\n const details = error instanceof Error ? error.message : String(error)\n throw new GatewayCliError(\n 'Gateway state permissions could not be secured.',\n `${details} Ensure the fallback directory is owned by this user and writable.`\n )\n }\n cliWarn('Gateway config directory not writable; using fallback location.', resolvedOptions, [\n { label: 'Fallback', value: formatPathForDisplay(fallbackDir), verboseOnly: true },\n { label: 'Previous', value: formatPathForDisplay(configDir), verboseOnly: true },\n ])\n\n return {\n configDir: fallbackPaths.configDir,\n configPath: fallbackPaths.configPath,\n migratedFrom: configDir,\n }\n}\n\nfunction cliSuccess(message: string, options?: ParsedArgs['options'], details?: CliDetail[]): void {\n writeCliSuccess(message, isVerbose(options), details)\n}\n\nfunction cliInfo(message: string, options?: ParsedArgs['options'], details?: CliDetail[]): void {\n writeCliInfo(message, isVerbose(options), details)\n}\n\nfunction cliWarn(message: string, options?: ParsedArgs['options'], details?: CliDetail[]): void {\n writeCliWarn(message, isVerbose(options), details)\n}\n\nfunction cliError(message: string, options?: ParsedArgs['options'], details?: CliDetail[]): void {\n writeCliError(message, isVerbose(options), details)\n}\n\nasync function getGatewayVersion(): Promise<string | null> {\n try {\n const raw = await fs.readFile(new URL('../package.json', import.meta.url), 'utf-8')\n const parsed = JSON.parse(raw) as { version?: string }\n return parsed.version ?? null\n } catch {\n return null\n }\n}\n\nfunction formatUptime(etime: string): string | null {\n const trimmed = etime.trim()\n if (!trimmed) return null\n const [dayPart, timePart] = trimmed.includes('-') ? trimmed.split('-') : [null, trimmed]\n const segments = timePart.split(':').map((segment) => Number.parseInt(segment, 10))\n if (segments.some((segment) => !Number.isFinite(segment))) return trimmed\n\n let hours = 0\n let minutes = 0\n let seconds = 0\n\n if (segments.length === 3) {\n ;[hours, minutes, seconds] = segments\n } else if (segments.length === 2) {\n ;[minutes, seconds] = segments\n } else if (segments.length === 1) {\n ;[seconds] = segments\n }\n\n if (dayPart) {\n const days = Number.parseInt(dayPart, 10)\n if (Number.isFinite(days)) {\n hours += days * 24\n }\n }\n\n const parts: string[] = []\n if (hours > 0) parts.push(`${hours}h`)\n if (minutes > 0 || hours > 0) parts.push(`${minutes}m`)\n if (hours === 0 && minutes === 0) parts.push(`${seconds}s`)\n\n return parts.join(' ')\n}\n\nasync function getProcessUptime(pid: number): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync('ps', ['-p', String(pid), '-o', 'etime='])\n const trimmed = stdout.trim()\n if (!trimmed) return null\n return formatUptime(trimmed) ?? trimmed\n } catch {\n return null\n }\n}\n\nfunction findRepoRoot(startDir: string): string | null {\n let current = startDir\n while (true) {\n if (fsSync.existsSync(path.join(current, 'pnpm-workspace.yaml'))) {\n return current\n }\n const parent = path.dirname(current)\n if (parent === current) return null\n current = parent\n }\n}\n\nfunction loadEnvironment(options: ParsedArgs['options']): void {\n const envFileOption =\n getStringOption(options, 'env-file') ||\n process.env.PANORAMA_ENV_FILE ||\n process.env.PANORAMA_ENV_PATH\n const envNameOption =\n getStringOption(options, 'env') || process.env.PANORAMA_ENV || process.env.ENVIRONMENT\n const envName = normalizeEnvName(envNameOption) ?? 'local'\n\n const envPath = envFileOption\n ? path.resolve(envFileOption)\n : path.join(\n findRepoRoot(process.cwd()) ?? process.cwd(),\n envName === 'local' ? '.env' : `.env.${envName}`\n )\n\n if (!fsSync.existsSync(envPath)) {\n if (envFileOption || envNameOption) {\n throw new GatewayCliError('Environment file not found.', `Path: ${envPath}`)\n }\n return\n }\n\n dotenv.config({ path: envPath })\n}\n\nasync function loadConfig(options?: ParsedArgs['options']): Promise<GatewayConfig> {\n return loadGatewayConfig(getActiveOptions(options))\n}\n\nasync function saveConfig(config: GatewayConfig, options?: ParsedArgs['options']): Promise<void> {\n await saveGatewayConfig(config, getActiveOptions(options))\n}\n\nfunction shouldEmitDebugOutput(stream: NodeJS.WriteStream): boolean {\n if (!stream.isTTY) return true\n return isVerbose()\n}\n\nfunction logInfo(message: string, data?: Record<string, unknown>): void {\n if (!shouldEmitDebugOutput(process.stdout)) return\n if (data) {\n console.log(`[gateway] ${message}`, data)\n } else {\n console.log(`[gateway] ${message}`)\n }\n}\n\nfunction logError(message: string, data?: Record<string, unknown>): void {\n if (!shouldEmitDebugOutput(process.stderr)) return\n if (data) {\n console.error(`[gateway] ${message}`, data)\n } else {\n console.error(`[gateway] ${message}`)\n }\n}\n\nfunction logWarn(message: string, data?: Record<string, unknown>): void {\n if (!shouldEmitDebugOutput(process.stderr)) return\n if (data) {\n console.warn(`[gateway] ${message}`, data)\n } else {\n console.warn(`[gateway] ${message}`)\n }\n}\n\nfunction readPidFile(options?: ParsedArgs['options']): number | null {\n return readPidFileBase(getActiveOptions(options))\n}\n\nasync function writePidFile(pid: number, options?: ParsedArgs['options']): Promise<void> {\n await writePidFileBase(pid, getActiveOptions(options))\n}\n\nasync function removePidFile(options?: ParsedArgs['options']): Promise<void> {\n await removePidFileBase(getActiveOptions(options))\n}\n\nfunction buildGatewayJobHandlers() {\n return createGatewayJobHandlers({\n activeSubagentRuns,\n activeModelRuns,\n activeShellExecRuns,\n getProviderCapabilities: providerRuntime.getProviderCapabilities,\n getClaudeSupport: providerRuntime.getClaudeSupport,\n defaultClaudeTimeoutMs: DEFAULT_CLAUDE_TIMEOUT_MS,\n defaultRemoteShellExecTimeoutMs: DEFAULT_REMOTE_SHELL_EXEC_TIMEOUT_MS,\n defaultSubagentTimeoutMs: DEFAULT_SUBAGENT_TIMEOUT_MS,\n defaultModelRunTimeoutMs: DEFAULT_MODEL_RUN_TIMEOUT_MS,\n subagentCancelKillTimeoutMs: SUBAGENT_CANCEL_KILL_TIMEOUT_MS,\n processKillGraceMs: PROCESS_KILL_GRACE_MS,\n buildGatewayChildEnv,\n resolveClaudeCommand,\n resolveCodexCommand,\n resolveGeminiCommand,\n refreshRuntimeInstallFullControl,\n loadGatewayControlState,\n isHeartbeatFresh,\n requestSubagentCancel,\n getNextRunSequence,\n getNextSubagentRunEventSequence,\n insertSubagentRunEvent,\n resolvePendingCancel,\n consumePendingCancelFromQueue,\n clearPendingCancel,\n resolveSubagentWorkdirRoot,\n runCommand: runGatewayCommandWithLogging,\n runStreamingCommand: runGatewayStreamingCommandWithLogging,\n updateRuntimeProviderHealth,\n requestChildTermination: requestChildTerminationWithLogging,\n logInfo,\n logError,\n })\n}\n\nfunction buildGatewayStartDependencies() {\n return {\n runtimeState,\n resolveGatewayPaths,\n readPidFile,\n writePidFile,\n removePidFile,\n isProcessAlive,\n loadConfig,\n saveConfig,\n buildGatewayJobHandlers,\n buildCapabilities,\n ensureGatewayTmpDir,\n discoverGatewayCliCommands,\n refreshRuntimeInstallFullControl,\n emitGatewayEvent,\n flushGatewayEvents,\n emitProviderHealthEvents,\n sendHeartbeat,\n getNextSubagentRunEventSequence,\n insertSubagentRunEvent,\n requestChildTermination: requestChildTerminationWithLogging,\n startGatewayDaemonIfRequested,\n startGatewayLocalRuntime,\n logInfo,\n logError,\n cliInfo,\n cliSuccess,\n }\n}\n\nfunction buildGatewayCliCommandDependencies(): GatewayCliCommandDependencies {\n return {\n resolveGatewayPaths,\n readPidFile,\n isProcessAlive,\n removePidFile,\n loadConfig,\n saveConfig,\n getGatewayVersion,\n getProcessUptime,\n onFullControlChanged: (config, enabled) => {\n if (runtimeState.currentConfig && runtimeState.currentConfig.gatewayId === config.gatewayId) {\n runtimeState.currentConfig.full_control_enabled = enabled\n }\n },\n cliSuccess,\n cliInfo,\n cliWarn,\n cliError,\n }\n}\n\nfunction buildGatewayPairingDependencies(): GatewayPairingDependencies<GatewaySupabaseClient> {\n return {\n resolveGatewayPaths,\n loadConfig,\n saveConfig,\n discoverGatewayCliCommands,\n buildCapabilities,\n createGatewayEventClient,\n flushGatewayEvents,\n emitGatewayEvent,\n emitProviderHealthEvents,\n logError,\n cliSuccess,\n cliInfo,\n cliWarn,\n }\n}\n\nfunction buildGatewayDoctorDependencies(): GatewayDoctorDependencies<GatewaySupabaseClient> {\n return {\n resolveGatewayPaths,\n loadConfig,\n saveConfig,\n discoverGatewayCliCommands,\n buildCapabilities,\n createGatewayEventClient,\n flushGatewayEvents,\n emitGatewayEvent,\n emitProviderHealthEvents,\n cliInfo,\n cliWarn,\n }\n}\n\nasync function run(): Promise<void> {\n const parsed = parseArgs(process.argv.slice(2))\n ACTIVE_OPTIONS = parsed.options\n applyOptionEnvOverrides(parsed.options)\n\n if (parsed.options.h || parsed.options.help || parsed.command === null) {\n printHelp()\n return\n }\n\n if (parsed.command === 'pair') {\n loadEnvironment(parsed.options)\n const configResolution = await prepareGatewayConfigDir(parsed.options, true)\n applyOptionEnvOverrides(parsed.options)\n const code = getStringOption(parsed.options, 'code') || parsed.positional[0]\n if (!code) {\n throw new Error('Pairing code is required')\n }\n await pairGatewayCommand(\n code,\n parsed.options,\n configResolution,\n buildGatewayPairingDependencies()\n )\n const entryPath = process.argv[1] || ''\n if (entryPath.endsWith('.ts')) {\n cliInfo(\n 'Auto-start skipped in dev mode; run \"panorama-gateway start\" when ready.',\n parsed.options\n )\n return\n }\n try {\n await startGatewayCommand(parsed.options, configResolution, buildGatewayStartDependencies())\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n cliWarn('Auto-start failed; run \"panorama-gateway start\" to retry.', parsed.options, [\n { label: 'Error', value: message, verboseOnly: true },\n ])\n }\n return\n }\n\n if (parsed.command === 'start') {\n loadEnvironment(parsed.options)\n if (resolveGatewayRuntimeMode(parsed.options) === 'managed') {\n applyOptionEnvOverrides(parsed.options)\n await startManagedGatewayRuntime()\n return\n }\n const configResolution = await prepareGatewayConfigDir(parsed.options, true)\n applyOptionEnvOverrides(parsed.options)\n await startGatewayCommand(parsed.options, configResolution, buildGatewayStartDependencies())\n return\n }\n\n if (parsed.command === 'full-control') {\n await fullControlGatewayCommand(\n parsed.options,\n parsed.positional,\n buildGatewayCliCommandDependencies()\n )\n return\n }\n\n if (parsed.command === 'stop') {\n await stopGatewayCommand(parsed.options, buildGatewayCliCommandDependencies())\n return\n }\n\n if (parsed.command === 'status') {\n await statusGatewayCommand(parsed.options, buildGatewayCliCommandDependencies())\n return\n }\n\n if (parsed.command === 'logs') {\n await showGatewayLogsCommand(parsed.options, buildGatewayCliCommandDependencies())\n return\n }\n\n if (parsed.command === 'doctor') {\n loadEnvironment(parsed.options)\n const configResolution = await prepareGatewayConfigDir(parsed.options, true)\n applyOptionEnvOverrides(parsed.options)\n await doctorGatewayCommand(\n parsed.options,\n configResolution,\n buildGatewayDoctorDependencies()\n )\n return\n }\n\n printHelp()\n process.exitCode = 1\n}\n\nrun().catch((error) => {\n const { message, details } = describeError(error)\n const detailItems: CliDetail[] = []\n if (details) {\n detailItems.push({ label: 'Details', value: details, verboseOnly: true })\n }\n cliError(message, ACTIVE_OPTIONS ?? undefined, detailItems)\n process.exitCode = 1\n})\n", "export interface ParsedArgs {\n command: string | null\n positional: string[]\n options: Record<string, string | boolean>\n}\n\nexport type GatewayRuntimeMode = 'local' | 'managed'\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const normalizedArgv = argv[0] === '--' ? argv.slice(1) : argv\n const positional: string[] = []\n const options: Record<string, string | boolean> = {}\n\n for (let i = 0; i < normalizedArgv.length; i += 1) {\n const arg = normalizedArgv[i]\n if (!arg) continue\n\n if (arg === '--') {\n positional.push(...normalizedArgv.slice(i + 1))\n break\n }\n\n if (arg.startsWith('--')) {\n const [flag, inlineValue] = arg.slice(2).split('=')\n if (inlineValue !== undefined) {\n options[flag] = inlineValue\n continue\n }\n\n const next = normalizedArgv[i + 1]\n if (next && !next.startsWith('--')) {\n options[flag] = next\n i += 1\n } else {\n options[flag] = true\n }\n continue\n }\n\n if (arg.startsWith('-') && arg.length > 1) {\n options[arg.slice(1)] = true\n continue\n }\n\n positional.push(arg)\n }\n\n const command = positional.shift() ?? null\n return { command, positional, options }\n}\n\nexport function getStringOption(options: ParsedArgs['options'], key: string): string | undefined {\n const value = options[key]\n if (typeof value === 'string') return value\n return undefined\n}\n\nexport function resolveGatewayRuntimeMode(\n options: ParsedArgs['options'],\n env: NodeJS.ProcessEnv = process.env\n): GatewayRuntimeMode {\n const rawMode = getStringOption(options, 'mode') || env.PANORAMA_GATEWAY_MODE || 'local'\n const mode = rawMode.trim().toLowerCase()\n if (mode === 'local' || mode === 'managed') {\n return mode\n }\n throw new Error(`Unsupported gateway mode: ${rawMode}`)\n}\n\nexport function parseBooleanInput(value: unknown): boolean | null {\n if (typeof value === 'boolean') return value\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase()\n if (\n normalized === 'true' ||\n normalized === '1' ||\n normalized === 'yes' ||\n normalized === 'on'\n ) {\n return true\n }\n if (\n normalized === 'false' ||\n normalized === '0' ||\n normalized === 'no' ||\n normalized === 'off'\n ) {\n return false\n }\n }\n return null\n}\n", "import { getStringOption, type ParsedArgs } from './cli-args.js'\n\nconst VALID_ENVIRONMENTS = new Set(['local', 'dev', 'test', 'stage', 'prod'])\n\nexport function applyOptionEnvOverrides(\n options: ParsedArgs['options'],\n env: NodeJS.ProcessEnv = process.env\n): void {\n const setValue = (key: string, value: string | undefined): void => {\n if (!value) return\n env[key] = value\n }\n\n setValue('PANORAMA_GATEWAY_CONFIG_DIR', getStringOption(options, 'config-dir'))\n setValue('PANORAMA_GATEWAY_CONFIG_PATH', getStringOption(options, 'config-path'))\n setValue('PANORAMA_GATEWAY_LOG_PATH', getStringOption(options, 'log-path'))\n setValue('PANORAMA_GATEWAY_PID_PATH', getStringOption(options, 'pid-path'))\n setValue('PANORAMA_CLAUDE_CLI', getStringOption(options, 'claude-cli'))\n setValue('PANORAMA_CODEX_CLI', getStringOption(options, 'codex-cli'))\n setValue('PANORAMA_GEMINI_CLI', getStringOption(options, 'gemini-cli'))\n}\n\nexport function buildGatewayEnvOverrides(options: ParsedArgs['options']): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {}\n const configDir = getStringOption(options, 'config-dir')\n const configPath = getStringOption(options, 'config-path')\n const logPath = getStringOption(options, 'log-path')\n const pidPath = getStringOption(options, 'pid-path')\n const claudeCli = getStringOption(options, 'claude-cli')\n const codexCli = getStringOption(options, 'codex-cli')\n const geminiCli = getStringOption(options, 'gemini-cli')\n const supabaseUrl = getStringOption(options, 'supabase-url')\n const supabaseAnonKey = getStringOption(options, 'anon-key')\n\n if (configDir) env.PANORAMA_GATEWAY_CONFIG_DIR = configDir\n if (configPath) env.PANORAMA_GATEWAY_CONFIG_PATH = configPath\n if (logPath) env.PANORAMA_GATEWAY_LOG_PATH = logPath\n if (pidPath) env.PANORAMA_GATEWAY_PID_PATH = pidPath\n if (claudeCli) env.PANORAMA_CLAUDE_CLI = claudeCli\n if (codexCli) env.PANORAMA_CODEX_CLI = codexCli\n if (geminiCli) env.PANORAMA_GEMINI_CLI = geminiCli\n if (supabaseUrl) env.PANORAMA_SUPABASE_URL = supabaseUrl\n if (supabaseAnonKey) env.PANORAMA_SUPABASE_ANON_KEY = supabaseAnonKey\n\n return env\n}\n\nexport function normalizeEnvName(raw: string | undefined): string | null {\n if (!raw) return null\n const value = raw.trim().toLowerCase()\n if (!value) return null\n if (value === 'production') return 'prod'\n if (value === 'development') return 'local'\n if (VALID_ENVIRONMENTS.has(value)) return value\n return null\n}\n\nexport function parseBooleanEnv(value: string | undefined, fallback: boolean): boolean {\n if (value === undefined) return fallback\n const normalized = value.trim().toLowerCase()\n if (normalized === '1' || normalized === 'true' || normalized === 'yes' || normalized === 'on') {\n return true\n }\n if (normalized === '0' || normalized === 'false' || normalized === 'no' || normalized === 'off') {\n return false\n }\n return fallback\n}\n\nexport function parseNumberEnv(value: string | undefined, fallback: number): number {\n if (!value) return fallback\n const parsed = Number.parseInt(value, 10)\n if (!Number.isFinite(parsed)) return fallback\n return parsed\n}\n", "import os from 'node:os'\nimport path from 'node:path'\n\nexport type CliDetail = {\n label: string\n value: string | number | null | undefined\n verboseOnly?: boolean\n}\n\nexport class GatewayCliError extends Error {\n readonly details?: string\n\n constructor(message: string, details?: string) {\n super(message)\n this.name = 'GatewayCliError'\n this.details = details\n }\n}\n\nexport function formatCliValue(value: CliDetail['value']): string | null {\n if (value === null || value === undefined) return null\n if (typeof value === 'number' && !Number.isFinite(value)) return null\n if (typeof value === 'string' && value.trim() === '') return null\n return String(value)\n}\n\nexport function formatPathForDisplay(\n value: string | null | undefined,\n homeDir: string = os.homedir()\n): string | null {\n if (!value) return null\n if (value === homeDir) return '~'\n if (value.startsWith(`${homeDir}${path.sep}`)) {\n return `~${value.slice(homeDir.length)}`\n }\n return value\n}\n\nexport function truncateText(value: string, maxLength: number): string {\n if (value.length <= maxLength) return value\n return `${value.slice(0, maxLength)}...`\n}\n\nexport function formatCliDetails(details: CliDetail[] | undefined, verbose: boolean): string[] {\n if (!details || details.length === 0) return []\n const lines: string[] = []\n for (const detail of details) {\n if (detail.verboseOnly && !verbose) continue\n const formatted = formatCliValue(detail.value)\n if (!formatted) continue\n const formattedLines = formatted.split('\\n')\n lines.push(` ${detail.label}: ${formattedLines[0]}`)\n for (const line of formattedLines.slice(1)) {\n lines.push(` ${line}`)\n }\n }\n return lines\n}\n\nexport function writeCliDetails(\n details: CliDetail[] | undefined,\n verbose: boolean,\n writer: (line: string) => void\n): void {\n for (const line of formatCliDetails(details, verbose)) {\n writer(line)\n }\n}\n\nexport function cliSuccess(message: string, verbose: boolean, details?: CliDetail[]): void {\n console.log(`OK ${message}`)\n writeCliDetails(details, verbose, console.log)\n}\n\nexport function cliInfo(message: string, verbose: boolean, details?: CliDetail[]): void {\n console.log(message)\n writeCliDetails(details, verbose, console.log)\n}\n\nexport function cliWarn(message: string, verbose: boolean, details?: CliDetail[]): void {\n console.warn(`WARN ${message}`)\n writeCliDetails(details, verbose, console.warn)\n}\n\nexport function cliError(message: string, verbose: boolean, details?: CliDetail[]): void {\n console.error(`ERROR ${message}`)\n writeCliDetails(details, verbose, console.error)\n}\n\nexport function describeError(error: unknown): { message: string; details?: string } {\n if (error instanceof GatewayCliError) {\n return { message: error.message, details: error.details }\n }\n if (error instanceof Error) {\n return {\n message: error.message || 'Unexpected error',\n details: error.stack ?? undefined,\n }\n }\n return { message: String(error) }\n}\n", "import fsSync from 'node:fs'\nimport fs from 'node:fs/promises'\nimport process from 'node:process'\nimport { getStringOption, type ParsedArgs } from './cli-args.js'\nimport {\n GatewayCliError,\n formatPathForDisplay,\n type CliDetail,\n} from './cli-output.js'\nimport type { GatewayConfig, GatewayPaths } from './gateway-state.js'\n\ntype CliReporter = (\n message: string,\n options?: ParsedArgs['options'],\n details?: CliDetail[]\n) => void\n\nexport interface GatewayCliCommandDependencies {\n resolveGatewayPaths: (options?: ParsedArgs['options']) => GatewayPaths\n readPidFile: (options?: ParsedArgs['options']) => number | null\n isProcessAlive: (pid: number) => boolean\n removePidFile: (options?: ParsedArgs['options']) => Promise<void>\n loadConfig: (options?: ParsedArgs['options']) => Promise<GatewayConfig>\n saveConfig: (config: GatewayConfig, options?: ParsedArgs['options']) => Promise<void>\n getGatewayVersion: () => Promise<string | null>\n getProcessUptime: (pid: number) => Promise<string | null>\n onFullControlChanged?: (config: GatewayConfig, enabled: boolean) => void\n cliSuccess: CliReporter\n cliInfo: CliReporter\n cliWarn: CliReporter\n cliError: CliReporter\n}\n\nexport async function stopGatewayCommand(\n options: ParsedArgs['options'],\n dependencies: GatewayCliCommandDependencies\n): Promise<void> {\n const { pidPath } = dependencies.resolveGatewayPaths(options)\n const pid = dependencies.readPidFile(options)\n if (!pid) {\n dependencies.cliInfo('Gateway is not running', options, [\n { label: 'PID file', value: formatPathForDisplay(pidPath), verboseOnly: true },\n ])\n return\n }\n\n if (!dependencies.isProcessAlive(pid)) {\n await dependencies.removePidFile(options)\n dependencies.cliInfo('Gateway is not running (stale PID removed)', options, [\n { label: 'PID', value: pid, verboseOnly: true },\n ])\n return\n }\n\n try {\n process.kill(pid, 'SIGTERM')\n } catch (error) {\n dependencies.cliError('Failed to stop gateway process', options, [\n { label: 'PID', value: pid, verboseOnly: true },\n {\n label: 'Error',\n value: error instanceof Error ? error.message : String(error),\n verboseOnly: true,\n },\n ])\n return\n }\n\n dependencies.cliInfo('Stopping gateway...', options, [\n { label: 'PID', value: pid, verboseOnly: true },\n ])\n\n const timeoutMs = 5000\n const start = Date.now()\n while (Date.now() - start < timeoutMs) {\n if (!dependencies.isProcessAlive(pid)) {\n await dependencies.removePidFile(options)\n dependencies.cliSuccess('Gateway stopped', options, [\n { label: 'PID', value: pid, verboseOnly: true },\n ])\n return\n }\n await new Promise((resolve) => setTimeout(resolve, 200))\n }\n\n dependencies.cliWarn('Gateway stop is still draining active work; process remains running', options, [\n { label: 'PID', value: pid, verboseOnly: true },\n ])\n}\n\nexport async function statusGatewayCommand(\n options: ParsedArgs['options'],\n dependencies: GatewayCliCommandDependencies\n): Promise<void> {\n const { pidPath, logPath, configPath } = dependencies.resolveGatewayPaths(options)\n const pid = dependencies.readPidFile(options)\n const configExists = fsSync.existsSync(configPath)\n\n let configSummary: {\n gatewayId?: string\n teamId?: string\n deviceName?: string\n fullControlEnabled?: boolean\n } | null = null\n if (configExists) {\n try {\n const config = await dependencies.loadConfig(options)\n configSummary = {\n gatewayId: config.gatewayId,\n teamId: config.teamId,\n deviceName: config.deviceName ?? undefined,\n fullControlEnabled: config.full_control_enabled === true,\n }\n } catch {\n configSummary = null\n }\n }\n\n const alive = pid ? dependencies.isProcessAlive(pid) : false\n const statusLabel = alive ? 'Running' : 'Stopped'\n const version = await dependencies.getGatewayVersion()\n const uptime = alive && pid ? await dependencies.getProcessUptime(pid) : null\n\n dependencies.cliInfo(`Gateway Status: ${statusLabel}`, options, [\n { label: 'Version', value: version ?? undefined },\n { label: 'Uptime', value: uptime ?? undefined },\n { label: 'Paired', value: configExists ? 'Yes' : 'No' },\n {\n label: 'Host machine control',\n value:\n configSummary == null\n ? undefined\n : configSummary.fullControlEnabled\n ? 'Enabled'\n : 'Disabled',\n },\n { label: 'Device', value: configSummary?.deviceName ?? undefined, verboseOnly: true },\n { label: 'Gateway ID', value: configSummary?.gatewayId ?? undefined, verboseOnly: true },\n { label: 'Team ID', value: configSummary?.teamId ?? undefined, verboseOnly: true },\n { label: 'PID', value: pid ?? undefined, verboseOnly: true },\n { label: 'Stale PID', value: pid && !alive ? pid : undefined, verboseOnly: true },\n { label: 'Config Path', value: formatPathForDisplay(configPath), verboseOnly: true },\n { label: 'Log Path', value: formatPathForDisplay(logPath), verboseOnly: true },\n { label: 'PID Path', value: formatPathForDisplay(pidPath), verboseOnly: true },\n ])\n}\n\nexport async function fullControlGatewayCommand(\n options: ParsedArgs['options'],\n positional: string[],\n dependencies: GatewayCliCommandDependencies\n): Promise<void> {\n const action = (positional[0] ?? 'status').trim().toLowerCase()\n let config: GatewayConfig\n try {\n config = await dependencies.loadConfig(options)\n } catch (error) {\n const details = error instanceof Error ? error.message : String(error)\n throw new GatewayCliError('Gateway config not found. Run \"pair\" first.', details)\n }\n\n if (action === 'status') {\n dependencies.cliInfo('Gateway host machine control', options, [\n { label: 'Enabled', value: config.full_control_enabled ? 'Yes' : 'No' },\n { label: 'Gateway ID', value: config.gatewayId, verboseOnly: true },\n ])\n return\n }\n\n const enabled = action === 'enable' || action === 'on' || action === 'true'\n const disabled = action === 'disable' || action === 'off' || action === 'false'\n if (!enabled && !disabled) {\n throw new GatewayCliError(\n 'Unknown full-control command.',\n 'Use one of: enable, disable, status'\n )\n }\n\n const nextValue = enabled\n if (config.full_control_enabled === nextValue) {\n dependencies.cliInfo(\n `Gateway host machine control already ${nextValue ? 'enabled' : 'disabled'}.`,\n options\n )\n return\n }\n\n config.full_control_enabled = nextValue\n await dependencies.saveConfig(config, options)\n dependencies.onFullControlChanged?.(config, nextValue)\n dependencies.cliSuccess(\n `Gateway host machine control ${nextValue ? 'enabled' : 'disabled'}.`,\n options,\n [{ label: 'Gateway ID', value: config.gatewayId, verboseOnly: true }]\n )\n}\n\nexport async function showGatewayLogsCommand(\n options: ParsedArgs['options'],\n dependencies: GatewayCliCommandDependencies\n): Promise<void> {\n const linesRaw = getStringOption(options, 'lines')\n const lines = linesRaw ? Number.parseInt(linesRaw, 10) : 200\n const follow = options['no-follow'] !== true\n const { logPath } = dependencies.resolveGatewayPaths(options)\n\n try {\n const content = await fs.readFile(logPath, 'utf-8')\n const allLines = content.split(/\\r?\\n/)\n const tail = Number.isFinite(lines) && lines > 0 ? allLines.slice(-lines) : allLines\n const displayLines = Number.isFinite(lines) && lines > 0 ? lines : allLines.length\n const header = follow\n ? 'Following gateway logs (press Ctrl+C to stop)'\n : `Showing last ${displayLines} lines of gateway logs`\n dependencies.cliInfo(header, options, [\n { label: 'Log path', value: formatPathForDisplay(logPath), verboseOnly: true },\n ])\n process.stdout.write(`${tail.join('\\n')}\\n`)\n } catch (error) {\n dependencies.cliError('Unable to read gateway log file', options, [\n { label: 'Log path', value: formatPathForDisplay(logPath), verboseOnly: true },\n {\n label: 'Error',\n value: error instanceof Error ? error.message : String(error),\n verboseOnly: true,\n },\n ])\n return\n }\n\n if (!follow) return\n\n let position = 0\n try {\n const stat = await fs.stat(logPath)\n position = stat.size\n } catch {\n position = 0\n }\n\n fsSync.watch(logPath, { persistent: true }, async (event) => {\n if (event !== 'change') return\n try {\n const stat = await fs.stat(logPath)\n if (stat.size < position) {\n position = 0\n }\n const handle = await fs.open(logPath, 'r')\n const length = stat.size - position\n if (length > 0) {\n const buffer = Buffer.alloc(length)\n await handle.read(buffer, 0, length, position)\n position = stat.size\n process.stdout.write(buffer.toString('utf-8'))\n }\n await handle.close()\n } catch (error) {\n dependencies.cliError('Failed to tail gateway logs', options, [\n { label: 'Log path', value: formatPathForDisplay(logPath), verboseOnly: true },\n {\n label: 'Error',\n value: error instanceof Error ? error.message : String(error),\n verboseOnly: true,\n },\n ])\n }\n })\n\n await new Promise(() => undefined)\n}\n", "import fsSync from 'node:fs'\nimport { getStringOption, type ParsedArgs } from './cli-args.js'\nimport {\n formatPathForDisplay,\n truncateText,\n type CliDetail,\n} from './cli-output.js'\nimport type {\n GatewayProviderHealth,\n GatewayProviderId,\n} from './cli-providers/types.js'\nimport {\n formatProviderLabel,\n formatProviderProgressLine,\n} from './gateway-provider-health.js'\nimport type { GatewayProviderCapabilityProgressEvent } from './gateway-provider-capabilities.js'\nimport type { GatewayConfig, GatewayPaths } from './gateway-state.js'\n\ntype CliReporter = (\n message: string,\n options?: ParsedArgs['options'],\n details?: CliDetail[]\n) => void\n\nexport interface GatewayDoctorConfigResolution {\n configDir: string\n configPath: string\n migratedFrom?: string\n}\n\nexport interface GatewayDoctorEventPayload {\n level: 'info' | 'warn' | 'error'\n code?: string\n message: string\n provider?: string\n details?: Record<string, unknown>\n}\n\nexport interface GatewayDoctorDependencies<EventClient = unknown> {\n resolveGatewayPaths: (options?: ParsedArgs['options']) => GatewayPaths\n loadConfig: (options?: ParsedArgs['options']) => Promise<GatewayConfig>\n saveConfig: (config: GatewayConfig, options?: ParsedArgs['options']) => Promise<void>\n discoverGatewayCliCommands: (options?: ParsedArgs['options']) => Promise<void>\n buildCapabilities: (params?: {\n validationMode?: 'full' | 'light' | 'auto'\n previousHealth?: Partial<Record<GatewayProviderId, GatewayProviderHealth>>\n deviceName?: string | null\n installFullControlEnabled?: boolean\n onProgress?: (event: GatewayProviderCapabilityProgressEvent) => void\n }) => Promise<{\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>\n anyProviderReady: boolean\n }>\n createGatewayEventClient: (config: GatewayConfig) => Promise<EventClient | null>\n flushGatewayEvents: (client: EventClient, config: GatewayConfig) => Promise<void>\n emitGatewayEvent: (\n client: EventClient,\n config: GatewayConfig,\n payload: GatewayDoctorEventPayload\n ) => Promise<void>\n emitProviderHealthEvents: (\n client: EventClient,\n config: GatewayConfig,\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>,\n context: string\n ) => Promise<void>\n outputLine?: (line: string) => void\n configExists?: (path: string) => boolean\n cliInfo: CliReporter\n cliWarn: CliReporter\n}\n\nexport async function doctorGatewayCommand<EventClient = unknown>(\n options: ParsedArgs['options'],\n configResolution: GatewayDoctorConfigResolution | undefined,\n dependencies: GatewayDoctorDependencies<EventClient>\n): Promise<void> {\n const { configPath, configDir } = dependencies.resolveGatewayPaths(options)\n const configExists = dependencies.configExists ?? fsSync.existsSync\n const outputLine = dependencies.outputLine ?? console.log\n const paired = configExists(configPath)\n\n let config: GatewayConfig | null = null\n if (paired) {\n try {\n config = await dependencies.loadConfig(options)\n } catch (error) {\n dependencies.cliWarn('Unable to read gateway config.', options, [\n { label: 'Config path', value: formatPathForDisplay(configPath), verboseOnly: true },\n {\n label: 'Error',\n value: error instanceof Error ? error.message : String(error),\n verboseOnly: true,\n },\n ])\n }\n }\n\n dependencies.cliInfo('Gateway doctor report', options, [\n { label: 'Config dir', value: formatPathForDisplay(configDir) },\n { label: 'Paired', value: paired ? 'Yes' : 'No' },\n {\n label: 'Host machine control',\n value: config == null ? undefined : config.full_control_enabled ? 'Enabled' : 'Disabled',\n },\n { label: 'Gateway ID', value: config?.gatewayId ?? undefined, verboseOnly: true },\n { label: 'Team ID', value: config?.teamId ?? undefined, verboseOnly: true },\n ])\n\n dependencies.cliInfo('Validating providers...', options)\n await dependencies.discoverGatewayCliCommands(options)\n const { providerHealth, anyProviderReady } = await dependencies.buildCapabilities({\n validationMode: 'full',\n previousHealth: config?.providerHealth,\n installFullControlEnabled: config?.full_control_enabled === true,\n onProgress: (event) => {\n if (event.stage === 'start') {\n dependencies.cliInfo(` ${formatProviderLabel(event.providerId)}...`, options)\n return\n }\n dependencies.cliInfo(` ${formatProviderProgressLine(event)}`, options)\n },\n })\n\n if (config) {\n config.providerHealth = providerHealth\n await dependencies.saveConfig(config, options)\n }\n\n const providerEntries = Object.entries(providerHealth) as Array<\n [GatewayProviderId, GatewayProviderHealth]\n >\n\n outputLine('Provider status:')\n for (const [providerId, health] of providerEntries) {\n const error = health.error ? ` (${truncateText(health.error, 200)})` : ''\n outputLine(` - ${providerId}: ${health.status}${error}`)\n }\n\n if (!anyProviderReady) {\n dependencies.cliWarn(\n 'No providers passed validation. Install/authenticate a provider before starting the gateway.',\n options\n )\n }\n\n if (!config) return\n\n const eventClient = await dependencies.createGatewayEventClient(config)\n if (!eventClient) return\n\n await dependencies.flushGatewayEvents(eventClient, config)\n if (configResolution?.migratedFrom) {\n await dependencies.emitGatewayEvent(eventClient, config, {\n level: 'warn',\n code: 'config_dir_fallback',\n message: 'Gateway config directory was not writable; using fallback location.',\n details: {\n previous: configResolution.migratedFrom,\n current: configResolution.configDir,\n },\n })\n }\n await dependencies.emitProviderHealthEvents(eventClient, config, providerHealth, 'doctor')\n}\n", "import { truncateText } from './cli-output.js'\nimport type {\n GatewayHealthStatus,\n GatewayProviderHealth,\n GatewayProviderId,\n} from './cli-providers/types.js'\n\nexport function formatProviderLabel(providerId: GatewayProviderId): string {\n switch (providerId) {\n case 'claude_code':\n return 'Claude'\n case 'gemini':\n return 'Gemini'\n case 'codex':\n return 'Codex'\n default:\n return providerId\n }\n}\n\nexport function formatDurationMs(durationMs?: number): string | null {\n if (durationMs === undefined || durationMs === null) return null\n if (!Number.isFinite(durationMs)) return null\n if (durationMs < 1000) return `${Math.round(durationMs)}ms`\n return `${(durationMs / 1000).toFixed(1)}s`\n}\n\nexport function formatProviderProgressLine(params: {\n providerId: GatewayProviderId\n status?: GatewayHealthStatus\n durationMs?: number\n error?: string\n}): string {\n const label = formatProviderLabel(params.providerId)\n const status = params.status ?? 'unknown'\n const duration = formatDurationMs(params.durationMs)\n const suffixParts = []\n if (duration) suffixParts.push(duration)\n if (params.error) suffixParts.push(normalizeProviderErrorSummary(params.error, 120))\n const suffix = suffixParts.length > 0 ? ` (${suffixParts.join(' \u2022 ')})` : ''\n return `${label}: ${status}${suffix}`\n}\n\nexport function buildProviderHealthEventPayloads(\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>,\n context: string\n): Array<{\n level: 'warn' | 'error'\n code: string\n provider: GatewayProviderId\n message: string\n details: Record<string, unknown>\n}> {\n const entries = Object.entries(providerHealth) as Array<\n [GatewayProviderId, GatewayProviderHealth]\n >\n const payloads: Array<{\n level: 'warn' | 'error'\n code: string\n provider: GatewayProviderId\n message: string\n details: Record<string, unknown>\n }> = []\n for (const [providerId, health] of entries) {\n if (health.status === 'healthy') continue\n const error = typeof health.error === 'string' ? health.error : undefined\n const errorSummary = error ? normalizeProviderErrorSummary(error, 500) : undefined\n const message = errorSummary\n ? `${providerId} validation failed: ${errorSummary}`\n : `${providerId} validation status: ${health.status}`\n payloads.push({\n level: health.status === 'unhealthy' ? 'error' : 'warn',\n code: 'provider_validation',\n provider: providerId,\n message,\n details: {\n context,\n status: health.status,\n check_type: health.check_type,\n error: errorSummary ?? null,\n duration_ms: health.duration_ms ?? null,\n },\n })\n }\n return payloads\n}\n\nexport function normalizeProviderErrorSummary(\n message: string | null | undefined,\n maxLength = 500\n): string | undefined {\n if (!message) return undefined\n const normalized = message.replace(/\\s+/g, ' ').trim()\n if (!normalized) return undefined\n return truncateText(normalized, maxLength)\n}\n\nexport function buildProviderFailureMessage(\n providerId: GatewayProviderId,\n detail?: string | null\n): string {\n const label = formatProviderLabel(providerId)\n const detailSuffix = detail ? ` Details: ${detail}` : ''\n return `Gateway provider ${label} is unhealthy. Try another provider or run \"panorama-gateway doctor\".${detailSuffix}`\n}\n", "import os from 'node:os'\nimport process from 'node:process'\nimport {\n getStringOption,\n parseBooleanInput,\n type ParsedArgs,\n} from './cli-args.js'\nimport {\n GatewayCliError,\n formatPathForDisplay,\n type CliDetail,\n} from './cli-output.js'\nimport type {\n GatewayProviderHealth,\n GatewayProviderId,\n} from './cli-providers/types.js'\nimport {\n formatProviderLabel,\n formatProviderProgressLine,\n} from './gateway-provider-health.js'\nimport type { GatewayProviderCapabilityProgressEvent } from './gateway-provider-capabilities.js'\nimport type { GatewayConfig, GatewayPaths } from './gateway-state.js'\nimport {\n buildMissingSupabaseConfigError,\n resolveSupabaseConfig,\n} from './supabase-config.js'\n\ntype CliReporter = (\n message: string,\n options?: ParsedArgs['options'],\n details?: CliDetail[]\n) => void\n\ntype GatewayPairingFetchResponse = {\n ok: boolean\n status: number\n json: () => Promise<unknown>\n}\n\ntype GatewayPairingFetch = (\n url: string,\n init: {\n method: 'POST'\n headers: Record<string, string>\n body: string\n }\n) => Promise<GatewayPairingFetchResponse>\n\nexport interface GatewayPairingConfigResolution {\n configDir: string\n configPath: string\n migratedFrom?: string\n}\n\nexport interface GatewayPairingEventPayload {\n level: 'info' | 'warn' | 'error'\n code?: string\n message: string\n provider?: string\n details?: Record<string, unknown>\n}\n\nexport interface GatewayPairingDependencies<EventClient = unknown> {\n resolveGatewayPaths: (options?: ParsedArgs['options']) => GatewayPaths\n loadConfig: (options?: ParsedArgs['options']) => Promise<GatewayConfig>\n saveConfig: (config: GatewayConfig, options?: ParsedArgs['options']) => Promise<void>\n discoverGatewayCliCommands: (options?: ParsedArgs['options']) => Promise<void>\n buildCapabilities: (params?: {\n validationMode?: 'full' | 'light' | 'auto'\n previousHealth?: Partial<Record<GatewayProviderId, GatewayProviderHealth>>\n deviceName?: string | null\n installFullControlEnabled?: boolean\n onProgress?: (event: GatewayProviderCapabilityProgressEvent) => void\n }) => Promise<{\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>\n anyProviderReady: boolean\n }>\n createGatewayEventClient: (config: GatewayConfig) => Promise<EventClient | null>\n flushGatewayEvents: (client: EventClient, config: GatewayConfig) => Promise<void>\n emitGatewayEvent: (\n client: EventClient,\n config: GatewayConfig,\n payload: GatewayPairingEventPayload\n ) => Promise<void>\n emitProviderHealthEvents: (\n client: EventClient,\n config: GatewayConfig,\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>,\n context: string\n ) => Promise<void>\n fetchPairingCode?: GatewayPairingFetch\n env?: NodeJS.ProcessEnv\n hostname?: () => string\n logError: (message: string, data?: Record<string, unknown>) => void\n cliSuccess: CliReporter\n cliInfo: CliReporter\n cliWarn: CliReporter\n}\n\nasync function safeJson(response: { json: () => Promise<unknown> }): Promise<Record<string, unknown> | null> {\n try {\n const value = await response.json()\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : null\n } catch {\n return null\n }\n}\n\nfunction readRequiredPairingField(body: Record<string, unknown> | null, field: string): string {\n const value = body?.[field]\n return typeof value === 'string' && value.trim().length > 0 ? value : ''\n}\n\nexport async function pairGatewayCommand<EventClient = unknown>(\n code: string,\n options: ParsedArgs['options'],\n configResolution: GatewayPairingConfigResolution | undefined,\n dependencies: GatewayPairingDependencies<EventClient>\n): Promise<void> {\n dependencies.cliInfo('Pairing with team...', options)\n const env = dependencies.env ?? process.env\n const resolvedSupabaseConfig = resolveSupabaseConfig({\n cliSupabaseUrl: getStringOption(options, 'supabase-url'),\n cliAnonKey: getStringOption(options, 'anon-key'),\n env,\n })\n\n if (resolvedSupabaseConfig.missingFields.length > 0) {\n const { message, details } = buildMissingSupabaseConfigError(\n 'pair',\n resolvedSupabaseConfig.missingFields\n )\n throw new GatewayCliError(message, details)\n }\n\n const { supabaseUrl, supabaseAnonKey } = resolvedSupabaseConfig\n const deviceName =\n getStringOption(options, 'device-name') ||\n env.PANORAMA_GATEWAY_DEVICE_NAME ||\n dependencies.hostname?.() ||\n os.hostname()\n\n const url = `${supabaseUrl.replace(/\\/$/, '')}/functions/v1/exchange-gateway-pairing-code`\n const fetchPairingCode =\n dependencies.fetchPairingCode ??\n ((requestUrl, init) => fetch(requestUrl, init) as Promise<GatewayPairingFetchResponse>)\n const response = await fetchPairingCode(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n apikey: supabaseAnonKey,\n Authorization: `Bearer ${supabaseAnonKey}`,\n },\n body: JSON.stringify({\n code: code.trim(),\n device_name: deviceName,\n }),\n })\n\n const body = await safeJson(response)\n\n if (!response.ok || body?.success === false) {\n const message =\n typeof body?.error === 'string' ? body.error : `Pairing failed with status ${response.status}`\n throw new Error(message)\n }\n\n const accessToken = readRequiredPairingField(body, 'access_token')\n const refreshToken = readRequiredPairingField(body, 'refresh_token')\n const gatewayId = readRequiredPairingField(body, 'gateway_id')\n const teamId = readRequiredPairingField(body, 'team_id')\n if (!accessToken || !refreshToken || !gatewayId || !teamId) {\n throw new Error('Pairing response missing required fields')\n }\n\n const requestedFullControl = parseBooleanInput(options['full-control'])\n let existingConfig: GatewayConfig | null = null\n try {\n existingConfig = await dependencies.loadConfig(options)\n } catch {\n existingConfig = null\n }\n const installFullControlEnabled =\n requestedFullControl ?? existingConfig?.full_control_enabled ?? false\n\n const config: GatewayConfig = {\n supabaseUrl,\n supabaseAnonKey,\n accessToken,\n refreshToken,\n gatewayId,\n teamId,\n full_control_enabled: installFullControlEnabled,\n deviceName,\n }\n\n await dependencies.saveConfig(config, options)\n\n let providerHealthSummary: string | null = null\n let anyProviderReady = false\n let providerHealth: Record<GatewayProviderId, GatewayProviderHealth> | null = null\n try {\n dependencies.cliInfo('Validating providers...', options)\n await dependencies.discoverGatewayCliCommands(options)\n const { providerHealth: resolvedHealth, anyProviderReady: ready } =\n await dependencies.buildCapabilities({\n validationMode: 'full',\n installFullControlEnabled: config.full_control_enabled,\n onProgress: (event) => {\n if (event.stage === 'start') {\n dependencies.cliInfo(`Validating ${formatProviderLabel(event.providerId)}...`, options)\n return\n }\n dependencies.cliInfo(formatProviderProgressLine(event), options)\n },\n })\n config.providerHealth = resolvedHealth\n providerHealth = resolvedHealth\n await dependencies.saveConfig(config, options)\n providerHealthSummary = Object.entries(providerHealth)\n .map(([id, health]) => `${id}:${health.status}`)\n .join(', ')\n anyProviderReady = ready\n } catch (error) {\n dependencies.logError('Gateway provider validation failed during pairing', {\n error: error instanceof Error ? error.message : String(error),\n })\n }\n\n const { configPath } = dependencies.resolveGatewayPaths(options)\n dependencies.cliSuccess('Paired to team successfully', options, [\n { label: 'Config saved', value: formatPathForDisplay(configPath) },\n { label: 'Gateway ID', value: gatewayId, verboseOnly: true },\n { label: 'Team ID', value: teamId, verboseOnly: true },\n { label: 'Device', value: deviceName, verboseOnly: true },\n {\n label: 'Host machine control',\n value: installFullControlEnabled ? 'Enabled' : 'Disabled',\n verboseOnly: true,\n },\n ...(providerHealthSummary\n ? [{ label: 'Provider health', value: providerHealthSummary, verboseOnly: true }]\n : []),\n ])\n\n if (providerHealthSummary && !anyProviderReady) {\n dependencies.cliWarn(\n 'No gateway providers passed validation. Install/authenticate a provider before starting the gateway.',\n options,\n [{ label: 'Provider health', value: providerHealthSummary, verboseOnly: true }]\n )\n }\n\n const eventClient = await dependencies.createGatewayEventClient(config)\n if (!eventClient) return\n\n await dependencies.flushGatewayEvents(eventClient, config)\n if (configResolution?.migratedFrom) {\n await dependencies.emitGatewayEvent(eventClient, config, {\n level: 'warn',\n code: 'config_dir_fallback',\n message: 'Gateway config directory was not writable; using fallback location.',\n details: {\n previous: configResolution.migratedFrom,\n current: configResolution.configDir,\n },\n })\n }\n\n if (providerHealth) {\n await dependencies.emitProviderHealthEvents(eventClient, config, providerHealth, 'pairing')\n }\n}\n", "// Auto-generated by scripts/generate-prod-defaults.mjs\nexport const PROD_SUPABASE_URL = \"https://api.panorama.app\"\nexport const PROD_SUPABASE_ANON_KEY = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImF0aHp3Y2ZkbHVzZGpraHl4amllIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTcyNzg4ODIsImV4cCI6MjA3Mjg1NDg4Mn0.PKDawoNKeeblcCuOEdlwO57YOodwDL2ey1UmqThiJdc\"\n", "import { PROD_SUPABASE_ANON_KEY, PROD_SUPABASE_URL } from './prod-defaults.generated.js'\n\ntype MissingSupabaseField = 'supabaseUrl' | 'supabaseAnonKey'\ntype SupabaseValueSource = 'cli' | 'env' | 'config' | 'default' | 'missing'\n\ntype SupabaseValueCandidate = {\n source: Exclude<SupabaseValueSource, 'missing'>\n value: string | null | undefined\n}\n\nexport interface ResolveSupabaseConfigInput {\n cliSupabaseUrl?: string\n cliAnonKey?: string\n configSupabaseUrl?: string | null\n configAnonKey?: string | null\n env?: NodeJS.ProcessEnv\n}\n\nexport interface ResolvedSupabaseConfig {\n supabaseUrl: string\n supabaseAnonKey: string\n urlSource: SupabaseValueSource\n anonKeySource: SupabaseValueSource\n missingFields: MissingSupabaseField[]\n}\n\ninterface MissingSupabaseErrorContext {\n configPath?: string\n}\n\nfunction normalizeSupabaseValue(value: string | null | undefined): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction resolveSupabaseValue(candidates: readonly SupabaseValueCandidate[]): {\n value: string\n source: SupabaseValueSource\n} {\n for (const candidate of candidates) {\n const normalized = normalizeSupabaseValue(candidate.value)\n if (normalized) {\n return { value: normalized, source: candidate.source }\n }\n }\n\n return { value: '', source: 'missing' }\n}\n\nexport function resolveSupabaseConfig(input: ResolveSupabaseConfigInput): ResolvedSupabaseConfig {\n const env = input.env ?? process.env\n const url = resolveSupabaseValue([\n { source: 'cli', value: input.cliSupabaseUrl },\n { source: 'env', value: env.PANORAMA_SUPABASE_URL },\n { source: 'env', value: env.SUPABASE_URL },\n { source: 'config', value: input.configSupabaseUrl },\n { source: 'default', value: PROD_SUPABASE_URL },\n ])\n const anonKey = resolveSupabaseValue([\n { source: 'cli', value: input.cliAnonKey },\n { source: 'env', value: env.PANORAMA_SUPABASE_ANON_KEY },\n { source: 'env', value: env.SUPABASE_ANON_KEY },\n { source: 'env', value: env.SUPABASE_PUBLISHABLE_KEY },\n { source: 'config', value: input.configAnonKey },\n { source: 'default', value: PROD_SUPABASE_ANON_KEY },\n ])\n\n const missingFields: MissingSupabaseField[] = []\n if (!url.value) missingFields.push('supabaseUrl')\n if (!anonKey.value) missingFields.push('supabaseAnonKey')\n\n return {\n supabaseUrl: url.value,\n supabaseAnonKey: anonKey.value,\n urlSource: url.source,\n anonKeySource: anonKey.source,\n missingFields,\n }\n}\n\nfunction formatMissingFields(missingFields: readonly MissingSupabaseField[]): string {\n const labels = missingFields.map((field) =>\n field === 'supabaseUrl' ? 'Supabase URL' : 'Supabase anon key'\n )\n if (labels.length <= 1) return labels[0] ?? 'Supabase configuration'\n return `${labels.slice(0, -1).join(', ')} and ${labels[labels.length - 1]}`\n}\n\nexport function buildMissingSupabaseConfigError(\n action: 'pair' | 'start',\n missingFields: readonly MissingSupabaseField[],\n context: MissingSupabaseErrorContext = {}\n): { message: string; details: string } {\n const missingSummary = formatMissingFields(missingFields)\n const message =\n action === 'pair'\n ? 'Missing Supabase configuration for pairing.'\n : 'Missing Supabase configuration for gateway start.'\n\n const guidance =\n 'Install or reinstall @panorama-ai/gateway to refresh built-in backend configuration, or set PANORAMA_SUPABASE_URL and PANORAMA_SUPABASE_ANON_KEY via --env / --env-file for development overrides.'\n\n const configPathDetail =\n action === 'start' && context.configPath\n ? ` Existing config path: ${context.configPath}.`\n : ''\n\n return {\n message,\n details: `${missingSummary} not found.${configPathDetail} ${guidance}`.trim(),\n }\n}\n", "import { spawn, type ChildProcess } from 'node:child_process'\nimport process from 'node:process'\nimport { buildGatewayChildProcessEnv } from './child-process-env.js'\nimport { resolveGatewayTmpDir } from './runtime-paths.js'\nimport { StreamJsonCollector } from './stream-json-collector.js'\nimport { requestChildTermination, type TerminationOptions } from './process-control.js'\nimport { BoundedOutputCapture } from './process-output-capture.js'\nimport type { SubagentStreamEvent } from './subagent-adapters/types.js'\n\nexport const DEFAULT_GATEWAY_COMMAND_TIMEOUT_MS = 30 * 60_000\nexport const DEFAULT_GATEWAY_COMMAND_OUTPUT_BYTES = 5_000_000\nexport const DEFAULT_GATEWAY_STREAM_EVENTS = 2000\nexport const DEFAULT_GATEWAY_STREAM_BUFFER_CHARS = 200_000\nexport const DEFAULT_GATEWAY_COMMAND_TERMINATION_GRACE_MS = 2_000\n\nexport interface GatewayCommandEnvOptions {\n baseEnv?: NodeJS.ProcessEnv\n overrides?: NodeJS.ProcessEnv\n tmpDir?: string\n}\n\nexport interface GatewayCommandRunOptions {\n timeoutMs?: number\n cwd?: string\n env?: NodeJS.ProcessEnv\n onStart?: (child: ChildProcess) => void\n outputLimitBytes?: number\n terminationGraceMs?: number\n timeoutContext?: string\n baseEnv?: NodeJS.ProcessEnv\n tmpDir?: string\n onTerminationError?: (phase: 'sigterm' | 'sigkill', error: unknown, context: string) => void\n terminateChild?: (child: ChildProcess, options: TerminationOptions) => void\n}\n\nexport interface GatewayStreamingCommandRunOptions extends GatewayCommandRunOptions {\n maxStreamEvents?: number\n maxStreamBufferChars?: number\n}\n\nexport interface GatewayCommandResult {\n ok: boolean\n stdout: string\n stderr: string\n exitCode: number | null\n durationMs: number\n timedOut: boolean\n stdoutTruncated: boolean\n stderrTruncated: boolean\n error?: string\n}\n\nexport interface GatewayStreamingCommandResult extends GatewayCommandResult {\n events: SubagentStreamEvent[]\n}\n\nexport function buildGatewayCommandEnv(\n options: GatewayCommandEnvOptions = {}\n): NodeJS.ProcessEnv {\n return buildGatewayChildProcessEnv({\n baseEnv: options.baseEnv ?? process.env,\n tmpDir: options.tmpDir ?? resolveGatewayTmpDir(),\n overrides: options.overrides,\n })\n}\n\nfunction resolveCommandTimeoutMs(timeoutMs: number | undefined): number {\n return timeoutMs ?? DEFAULT_GATEWAY_COMMAND_TIMEOUT_MS\n}\n\nfunction requestTimedOutChildTermination(\n child: ChildProcess,\n options: GatewayCommandRunOptions\n): void {\n const context = options.timeoutContext ?? 'runGatewayCommand'\n const terminate = options.terminateChild ?? requestChildTermination\n terminate(child, {\n reason: 'process_timeout',\n graceMs: options.terminationGraceMs ?? DEFAULT_GATEWAY_COMMAND_TERMINATION_GRACE_MS,\n onError: (phase, error) => options.onTerminationError?.(phase, error, context),\n })\n}\n\nexport async function runGatewayCommand(\n command: string,\n args: string[],\n options: GatewayCommandRunOptions = {}\n): Promise<GatewayCommandResult> {\n const start = Date.now()\n const timeoutMs = resolveCommandTimeoutMs(options.timeoutMs)\n const outputLimitBytes = options.outputLimitBytes ?? DEFAULT_GATEWAY_COMMAND_OUTPUT_BYTES\n\n return await new Promise((resolve) => {\n const stdoutOutput = new BoundedOutputCapture(outputLimitBytes)\n const stderrOutput = new BoundedOutputCapture(outputLimitBytes)\n let timedOut = false\n\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: buildGatewayCommandEnv({\n baseEnv: options.baseEnv,\n tmpDir: options.tmpDir,\n overrides: options.env,\n }),\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n options.onStart?.(child)\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdoutOutput.append(chunk)\n })\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderrOutput.append(chunk)\n })\n\n const timer =\n timeoutMs && Number.isFinite(timeoutMs)\n ? setTimeout(() => {\n timedOut = true\n requestTimedOutChildTermination(child, options)\n }, timeoutMs)\n : null\n\n const finalize = (exitCode: number | null, error?: string) => {\n if (timer) clearTimeout(timer)\n const durationMs = Date.now() - start\n const stdout = stdoutOutput.readText()\n const stderr = stderrOutput.readText()\n const ok = !timedOut && exitCode === 0 && !error\n resolve({\n ok,\n stdout,\n stderr,\n exitCode,\n durationMs,\n timedOut,\n stdoutTruncated: stdoutOutput.truncated,\n stderrTruncated: stderrOutput.truncated,\n error,\n })\n }\n\n child.on('error', (error) => {\n finalize(null, error.message)\n })\n\n child.on('close', (code) => {\n finalize(code ?? null)\n })\n })\n}\n\nexport async function runGatewayStreamingCommand(\n command: string,\n args: string[],\n options: GatewayStreamingCommandRunOptions = {}\n): Promise<GatewayStreamingCommandResult> {\n const start = Date.now()\n const timeoutMs = resolveCommandTimeoutMs(options.timeoutMs)\n const outputLimitBytes = options.outputLimitBytes ?? DEFAULT_GATEWAY_COMMAND_OUTPUT_BYTES\n\n return await new Promise((resolve) => {\n const stderrOutput = new BoundedOutputCapture(outputLimitBytes)\n let timedOut = false\n const collector = new StreamJsonCollector({\n maxOutputBytes: outputLimitBytes,\n maxEvents: options.maxStreamEvents ?? DEFAULT_GATEWAY_STREAM_EVENTS,\n maxBufferChars: options.maxStreamBufferChars ?? DEFAULT_GATEWAY_STREAM_BUFFER_CHARS,\n })\n\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: buildGatewayCommandEnv({\n baseEnv: options.baseEnv,\n tmpDir: options.tmpDir,\n overrides: options.env,\n }),\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n options.onStart?.(child)\n\n child.stdout?.on('data', (chunk: Buffer) => {\n collector.append(chunk)\n })\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderrOutput.append(chunk)\n })\n\n const timer =\n timeoutMs && Number.isFinite(timeoutMs)\n ? setTimeout(() => {\n timedOut = true\n requestTimedOutChildTermination(child, {\n ...options,\n timeoutContext: options.timeoutContext ?? 'runGatewayStreamingCommand',\n })\n }, timeoutMs)\n : null\n\n const finalize = (exitCode: number | null, error?: string) => {\n if (timer) clearTimeout(timer)\n const streamResult = collector.finalize()\n const durationMs = Date.now() - start\n const stderr = stderrOutput.readText()\n const ok = !timedOut && exitCode === 0 && !error\n resolve({\n ok,\n stdout: streamResult.stdout,\n stderr,\n exitCode,\n durationMs,\n timedOut,\n stdoutTruncated: streamResult.stdoutTruncated || streamResult.eventsTruncated,\n stderrTruncated: stderrOutput.truncated,\n events: streamResult.events,\n error,\n })\n }\n\n child.on('error', (error) => {\n finalize(null, error.message)\n })\n\n child.on('close', (code) => {\n finalize(code ?? null)\n })\n })\n}\n", "import process from 'node:process'\n\nconst GATEWAY_CHILD_ENV_BLOCKED_KEYS = new Set([\n 'DATABASE_URL',\n 'DATABASE_CA_CERT',\n 'SUPABASE_URL',\n 'SUPABASE_ANON_KEY',\n 'SUPABASE_PUBLISHABLE_KEY',\n 'SUPABASE_SERVICE_ROLE_KEY',\n 'SUPABASE_SECRET_KEY',\n 'PANORAMA_SUPABASE_URL',\n 'PANORAMA_SUPABASE_ANON_KEY',\n 'PANORAMA_ENV',\n 'PANORAMA_ENV_FILE',\n 'PANORAMA_ENV_PATH',\n 'OPENROUTER_API_KEY',\n 'BRAVE_SEARCH_API_KEY',\n])\n\nconst GATEWAY_CHILD_ENV_BLOCKED_PREFIXES = ['PANORAMA_GATEWAY_']\n\nexport function isGatewayInternalEnvVar(key: string): boolean {\n if (!key) return false\n if (GATEWAY_CHILD_ENV_BLOCKED_KEYS.has(key)) return true\n return GATEWAY_CHILD_ENV_BLOCKED_PREFIXES.some((prefix) => key.startsWith(prefix))\n}\n\nexport function scrubGatewayInternalEnv(\n baseEnv: NodeJS.ProcessEnv = process.env\n): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {}\n for (const [key, value] of Object.entries(baseEnv)) {\n if (value === undefined) continue\n if (isGatewayInternalEnvVar(key)) continue\n env[key] = value\n }\n return env\n}\n\nexport function buildGatewayChildProcessEnv(params?: {\n baseEnv?: NodeJS.ProcessEnv\n tmpDir?: string\n overrides?: NodeJS.ProcessEnv\n}): NodeJS.ProcessEnv {\n const baseEnv = params?.baseEnv ?? process.env\n const env = scrubGatewayInternalEnv(baseEnv)\n const tmpDir = params?.tmpDir\n if (tmpDir) {\n env.TMPDIR = tmpDir\n env.TMP = tmpDir\n env.TEMP = tmpDir\n }\n const overrides = params?.overrides\n if (overrides) {\n for (const [key, value] of Object.entries(overrides)) {\n if (value === undefined) {\n delete env[key]\n } else {\n env[key] = value\n }\n }\n }\n return env\n}\n", "import os from 'node:os'\nimport path from 'node:path'\n\nexport const DEFAULT_GATEWAY_CONFIG_DIR = path.join(os.homedir(), '.panorama', 'gateway')\n\nexport function resolveGatewayConfigDir(rawOverride?: string | null): string {\n const raw = rawOverride ?? process.env.PANORAMA_GATEWAY_CONFIG_DIR ?? DEFAULT_GATEWAY_CONFIG_DIR\n return path.resolve(raw)\n}\n\nexport function resolveGatewayConfigPath(\n configDir: string = resolveGatewayConfigDir(),\n rawOverride?: string | null\n): string {\n const raw = rawOverride ?? process.env.PANORAMA_GATEWAY_CONFIG_PATH\n return raw ? path.resolve(raw) : path.join(configDir, 'gateway.json')\n}\n\nexport function resolveGatewayLogPath(\n configPath: string = resolveGatewayConfigPath(),\n rawOverride?: string | null\n): string {\n const raw = rawOverride ?? process.env.PANORAMA_GATEWAY_LOG_PATH\n return raw ? path.resolve(raw) : path.join(path.dirname(configPath), 'gateway.log')\n}\n\nexport function resolveGatewayPidPath(\n configPath: string = resolveGatewayConfigPath(),\n rawOverride?: string | null\n): string {\n const raw = rawOverride ?? process.env.PANORAMA_GATEWAY_PID_PATH\n return raw ? path.resolve(raw) : path.join(path.dirname(configPath), 'gateway.pid')\n}\n\nexport function resolveGatewayTmpDir(configDir: string = resolveGatewayConfigDir()): string {\n return path.join(configDir, 'tmp')\n}\n\nexport function resolveGatewayWorkdirRoot(configDir: string = resolveGatewayConfigDir()): string {\n return path.join(configDir, 'work')\n}\n\nexport function resolveSubagentWorkdirRoot(configDir: string = resolveGatewayConfigDir()): string {\n return path.join(resolveGatewayWorkdirRoot(configDir), 'subagents')\n}\n\nexport function resolveModelWorkdirRoot(configDir: string = resolveGatewayConfigDir()): string {\n return path.join(resolveGatewayWorkdirRoot(configDir), 'model-runs')\n}\n\nexport function resolveValidationWorkdirRoot(configDir: string = resolveGatewayConfigDir()): string {\n return path.join(resolveGatewayWorkdirRoot(configDir), 'validation')\n}\n", "export interface BoundedOutputCaptureSnapshot {\n text: string\n observedBytes: number\n capturedBytes: number\n truncated: boolean\n}\n\nexport class BoundedOutputCapture {\n private readonly chunks: Buffer[] = []\n private observedByteCount = 0\n private capturedByteCount = 0\n private wasTruncated = false\n\n constructor(private readonly maxBytes: number) {}\n\n append(chunk: Buffer): void {\n this.observedByteCount += chunk.length\n\n if (this.capturedByteCount >= this.maxBytes) {\n this.wasTruncated = true\n return\n }\n\n const remainingBytes = this.maxBytes - this.capturedByteCount\n if (chunk.length > remainingBytes) {\n this.chunks.push(Buffer.from(chunk.subarray(0, remainingBytes)))\n this.capturedByteCount = this.maxBytes\n this.wasTruncated = true\n return\n }\n\n this.chunks.push(Buffer.from(chunk))\n this.capturedByteCount += chunk.length\n }\n\n get observedBytes(): number {\n return this.observedByteCount\n }\n\n get capturedBytes(): number {\n return this.capturedByteCount\n }\n\n get truncated(): boolean {\n return this.wasTruncated\n }\n\n readText(): string {\n return Buffer.concat(this.chunks, this.capturedByteCount).toString('utf8')\n }\n\n snapshot(): BoundedOutputCaptureSnapshot {\n return {\n text: this.readText(),\n observedBytes: this.observedByteCount,\n capturedBytes: this.capturedByteCount,\n truncated: this.wasTruncated,\n }\n }\n}\n", "import type { SubagentStreamEvent } from './subagent-adapters/types.js'\nimport { BoundedOutputCapture } from './process-output-capture.js'\n\nexport interface StreamJsonCollectorOptions {\n maxOutputBytes: number\n maxEvents: number\n maxBufferChars: number\n}\n\nexport interface StreamJsonCollectorResult {\n stdout: string\n stdoutBytes: number\n stdoutTruncated: boolean\n events: SubagentStreamEvent[]\n eventsTruncated: boolean\n}\n\nexport class StreamJsonCollector {\n private readonly stdoutOutput: BoundedOutputCapture\n private readonly events: SubagentStreamEvent[] = []\n private stdoutTruncated = false\n private eventsTruncated = false\n private buffer = ''\n private nextSequence = 0\n\n constructor(private readonly options: StreamJsonCollectorOptions) {\n this.stdoutOutput = new BoundedOutputCapture(options.maxOutputBytes)\n }\n\n append(chunk: Buffer): void {\n this.captureStdout(chunk)\n this.buffer += chunk.toString('utf-8')\n if (this.buffer.length > this.options.maxBufferChars) {\n this.buffer = this.buffer.slice(-this.options.maxBufferChars)\n this.stdoutTruncated = true\n }\n\n let newlineIndex = this.buffer.indexOf('\\n')\n while (newlineIndex >= 0) {\n const line = this.buffer.slice(0, newlineIndex)\n this.buffer = this.buffer.slice(newlineIndex + 1)\n this.captureLine(line)\n newlineIndex = this.buffer.indexOf('\\n')\n }\n }\n\n finalize(): StreamJsonCollectorResult {\n if (this.buffer.trim().length > 0) {\n this.captureLine(this.buffer)\n this.buffer = ''\n }\n\n return {\n stdout: this.stdoutOutput.readText(),\n stdoutBytes: this.stdoutOutput.capturedBytes,\n stdoutTruncated: this.stdoutOutput.truncated || this.stdoutTruncated,\n events: [...this.events],\n eventsTruncated: this.eventsTruncated,\n }\n }\n\n private captureStdout(chunk: Buffer): void {\n this.stdoutOutput.append(chunk)\n }\n\n private captureLine(line: string): void {\n const trimmed = line.trim()\n if (!trimmed) return\n\n let event: Record<string, unknown> | null = null\n try {\n event = JSON.parse(trimmed) as Record<string, unknown>\n } catch {\n event = null\n }\n\n this.events.push({\n sequence: this.nextSequence,\n raw: trimmed,\n event,\n })\n this.nextSequence += 1\n\n if (this.events.length > this.options.maxEvents) {\n this.events.splice(0, this.events.length - this.options.maxEvents)\n this.eventsTruncated = true\n }\n }\n}\n", "import type { ChildProcess } from 'node:child_process'\n\ntype KillSignal = NodeJS.Signals | number\n\nexport interface TerminationOptions {\n graceMs: number\n reason: string\n onError?: (phase: 'sigterm' | 'sigkill', error: unknown) => void\n}\n\nexport function isChildProcessRunning(child: ChildProcess | undefined): boolean {\n if (!child) return false\n return child.exitCode === null && child.signalCode === null\n}\n\nexport function requestChildTermination(\n child: ChildProcess | undefined,\n options: TerminationOptions\n): void {\n if (!child) return\n if (!isChildProcessRunning(child)) return\n\n try {\n child.kill('SIGTERM' as KillSignal)\n } catch (error) {\n options.onError?.('sigterm', error)\n return\n }\n\n const killTimer = setTimeout(() => {\n if (!isChildProcessRunning(child)) return\n try {\n child.kill('SIGKILL' as KillSignal)\n } catch (error) {\n options.onError?.('sigkill', error)\n }\n }, options.graceMs)\n\n if (typeof killTimer.unref === 'function') {\n killTimer.unref()\n }\n}\n", "import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport process from 'node:process'\n\nexport const OWNER_ONLY_DIRECTORY_MODE = 0o700\nexport const OWNER_ONLY_FILE_MODE = 0o600\n\nfunction normalizeMode(mode: number): number {\n return mode & 0o777\n}\n\nexport function shouldEnforceOwnerOnlyPermissions(): boolean {\n return process.platform !== 'win32'\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n return (error as NodeJS.ErrnoException)?.code === 'ENOENT'\n}\n\nexport async function ensureOwnerOnlyDirectory(dirPath: string): Promise<void> {\n if (shouldEnforceOwnerOnlyPermissions()) {\n await fs.mkdir(dirPath, { recursive: true, mode: OWNER_ONLY_DIRECTORY_MODE })\n const stat = await fs.stat(dirPath)\n if (!stat.isDirectory()) {\n throw new Error(`Expected directory at ${dirPath}`)\n }\n if (normalizeMode(stat.mode) !== OWNER_ONLY_DIRECTORY_MODE) {\n await fs.chmod(dirPath, OWNER_ONLY_DIRECTORY_MODE)\n }\n return\n }\n\n await fs.mkdir(dirPath, { recursive: true })\n}\n\nexport async function ensureOwnerOnlyFile(filePath: string): Promise<void> {\n if (!shouldEnforceOwnerOnlyPermissions()) return\n\n let stat\n try {\n stat = await fs.stat(filePath)\n } catch (error) {\n if (isNotFoundError(error)) return\n throw error\n }\n\n if (!stat.isFile()) {\n throw new Error(`Expected regular file at ${filePath}`)\n }\n\n if (normalizeMode(stat.mode) !== OWNER_ONLY_FILE_MODE) {\n await fs.chmod(filePath, OWNER_ONLY_FILE_MODE)\n }\n}\n\nexport async function writeOwnerOnlyFile(\n filePath: string,\n contents: string\n): Promise<void> {\n await ensureOwnerOnlyDirectory(path.dirname(filePath))\n if (shouldEnforceOwnerOnlyPermissions()) {\n await fs.writeFile(filePath, contents, { encoding: 'utf-8', mode: OWNER_ONLY_FILE_MODE })\n await ensureOwnerOnlyFile(filePath)\n return\n }\n\n await fs.writeFile(filePath, contents, { encoding: 'utf-8' })\n}\n", "import fsSync from 'node:fs'\nimport fs from 'node:fs/promises'\nimport type { ParsedArgs } from './cli-args.js'\nimport {\n ensureOwnerOnlyDirectory,\n ensureOwnerOnlyFile,\n writeOwnerOnlyFile,\n} from './local-security.js'\nimport {\n resolveGatewayConfigDir,\n resolveGatewayConfigPath,\n resolveGatewayLogPath,\n resolveGatewayPidPath,\n resolveGatewayTmpDir,\n resolveGatewayWorkdirRoot,\n resolveSubagentWorkdirRoot as resolveSubagentWorkdirRootBase,\n} from './runtime-paths.js'\nimport type { GatewayProviderHealth, GatewayProviderId } from './cli-providers/types.js'\n\nexport interface GatewayConfig {\n supabaseUrl: string\n supabaseAnonKey: string\n accessToken: string\n refreshToken: string\n gatewayId: string\n teamId: string\n full_control_enabled: boolean\n deviceName?: string | null\n providerHealth?: Record<GatewayProviderId, GatewayProviderHealth>\n}\n\nexport type GatewayPaths = {\n configDir: string\n configPath: string\n logPath: string\n pidPath: string\n}\n\nexport function resolveGatewayPaths(\n options: ParsedArgs['options'] = {},\n env: NodeJS.ProcessEnv = process.env\n): GatewayPaths {\n const configDirRaw =\n typeof options['config-dir'] === 'string'\n ? options['config-dir']\n : env.PANORAMA_GATEWAY_CONFIG_DIR || null\n const configDir = resolveGatewayConfigDir(configDirRaw)\n\n const configPathRaw =\n typeof options['config-path'] === 'string'\n ? options['config-path']\n : env.PANORAMA_GATEWAY_CONFIG_PATH || null\n const configPath = resolveGatewayConfigPath(configDir, configPathRaw)\n\n const logPathRaw =\n typeof options['log-path'] === 'string' ? options['log-path'] : env.PANORAMA_GATEWAY_LOG_PATH || null\n const logPath = resolveGatewayLogPath(configPath, logPathRaw)\n\n const pidPathRaw =\n typeof options['pid-path'] === 'string' ? options['pid-path'] : env.PANORAMA_GATEWAY_PID_PATH || null\n const pidPath = resolveGatewayPidPath(configPath, pidPathRaw)\n\n if (!env.PANORAMA_GATEWAY_CONFIG_DIR) {\n env.PANORAMA_GATEWAY_CONFIG_DIR = configDir\n }\n if (!env.PANORAMA_GATEWAY_CONFIG_PATH) {\n env.PANORAMA_GATEWAY_CONFIG_PATH = configPath\n }\n if (!env.PANORAMA_GATEWAY_LOG_PATH) {\n env.PANORAMA_GATEWAY_LOG_PATH = logPath\n }\n if (!env.PANORAMA_GATEWAY_PID_PATH) {\n env.PANORAMA_GATEWAY_PID_PATH = pidPath\n }\n\n return { configDir, configPath, logPath, pidPath }\n}\n\nexport async function ensureGatewayStatePermissions(paths: GatewayPaths): Promise<void> {\n await ensureOwnerOnlyDirectory(paths.configDir)\n await ensureOwnerOnlyDirectory(resolveGatewayTmpDir(paths.configDir))\n await ensureOwnerOnlyDirectory(resolveGatewayWorkdirRoot(paths.configDir))\n await ensureOwnerOnlyFile(paths.configPath)\n await ensureOwnerOnlyFile(paths.logPath)\n await ensureOwnerOnlyFile(paths.pidPath)\n}\n\nexport function resolveGatewaySubagentWorkdirRoot(\n options: ParsedArgs['options'] = {},\n env: NodeJS.ProcessEnv = process.env\n): string {\n const { configDir } = resolveGatewayPaths(options, env)\n return resolveSubagentWorkdirRootBase(configDir)\n}\n\nexport async function loadGatewayConfig(\n options: ParsedArgs['options'] = {},\n env: NodeJS.ProcessEnv = process.env\n): Promise<GatewayConfig> {\n const { configPath } = resolveGatewayPaths(options, env)\n await ensureOwnerOnlyFile(configPath)\n const raw = await fs.readFile(configPath, 'utf-8')\n const parsed = JSON.parse(raw) as Partial<GatewayConfig> | null\n return {\n ...(parsed ?? {}),\n supabaseUrl: parsed?.supabaseUrl ?? '',\n supabaseAnonKey: parsed?.supabaseAnonKey ?? '',\n accessToken: parsed?.accessToken ?? '',\n refreshToken: parsed?.refreshToken ?? '',\n gatewayId: parsed?.gatewayId ?? '',\n teamId: parsed?.teamId ?? '',\n full_control_enabled: parsed?.full_control_enabled === true,\n }\n}\n\nexport async function saveGatewayConfig(\n config: GatewayConfig,\n options: ParsedArgs['options'] = {},\n env: NodeJS.ProcessEnv = process.env\n): Promise<void> {\n const { configPath } = resolveGatewayPaths(options, env)\n await writeOwnerOnlyFile(configPath, JSON.stringify(config, null, 2))\n}\n\nexport function readPidFile(\n options: ParsedArgs['options'] = {},\n env: NodeJS.ProcessEnv = process.env\n): number | null {\n const { pidPath } = resolveGatewayPaths(options, env)\n try {\n const raw = fsSync.readFileSync(pidPath, 'utf-8').trim()\n const pid = Number.parseInt(raw, 10)\n return Number.isFinite(pid) ? pid : null\n } catch {\n return null\n }\n}\n\nexport async function writePidFile(\n pid: number,\n options: ParsedArgs['options'] = {},\n env: NodeJS.ProcessEnv = process.env\n): Promise<void> {\n const { pidPath } = resolveGatewayPaths(options, env)\n await writeOwnerOnlyFile(pidPath, `${pid}\\n`)\n}\n\nexport async function removePidFile(\n options: ParsedArgs['options'] = {},\n env: NodeJS.ProcessEnv = process.env\n): Promise<void> {\n const { pidPath } = resolveGatewayPaths(options, env)\n try {\n await fs.unlink(pidPath)\n } catch {\n // ignore missing pid\n }\n}\n\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch {\n return false\n }\n}\n", "import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport type { Json } from './database.types.js'\nimport { ensureOwnerOnlyDirectory, writeOwnerOnlyFile } from './local-security.js'\n\nexport const DEFAULT_GATEWAY_LOG_BYTES = 200_000\n\nexport function isPathWithin(root: string, target: string): boolean {\n const relative = path.relative(root, target)\n if (!relative) return true\n return !relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative)\n}\n\nexport function sanitizeWorkSegment(value: string, label: string): string {\n const trimmed = value.trim()\n if (!trimmed) {\n throw new Error(`${label} is required`)\n }\n if (trimmed === '.' || trimmed === '..') {\n throw new Error(`${label} contains invalid path segments`)\n }\n if (trimmed.includes('/') || trimmed.includes('\\\\')) {\n throw new Error(`${label} contains path separators`)\n }\n return trimmed\n}\n\nexport function buildWorkDirPath(\n root: string,\n segments: Array<{ value: string; label: string }>\n): string {\n const cleaned = segments.map((segment) => sanitizeWorkSegment(segment.value, segment.label))\n return path.join(root, ...cleaned)\n}\n\nexport async function createWorkDir(\n root: string,\n segments: Array<{ value: string; label: string }>\n): Promise<string> {\n const dir = buildWorkDirPath(root, segments)\n await ensureOwnerOnlyDirectory(dir)\n return dir\n}\n\nexport async function cleanupWorkDir(workDir: string, root: string): Promise<void> {\n const resolvedRoot = path.resolve(root)\n const resolvedWorkDir = path.resolve(workDir)\n try {\n await fs.rm(resolvedWorkDir, { recursive: true, force: true })\n } catch {\n return\n }\n let current = path.dirname(resolvedWorkDir)\n while (current !== resolvedRoot && isPathWithin(resolvedRoot, current)) {\n try {\n const entries = await fs.readdir(current)\n if (entries.length > 0) return\n await fs.rmdir(current)\n current = path.dirname(current)\n } catch {\n return\n }\n }\n}\n\nexport function resolveSafeWorkPath(workDir: string, relativePath: string, label: string): string {\n const trimmed = relativePath.trim()\n if (!trimmed) {\n throw new Error(`${label} path is required`)\n }\n if (path.isAbsolute(trimmed)) {\n throw new Error(`${label} path must be relative`)\n }\n const normalized = path.normalize(trimmed)\n if (normalized === '..' || normalized.startsWith(`..${path.sep}`)) {\n throw new Error(`${label} path must stay within work directory`)\n }\n const resolved = path.resolve(workDir, normalized)\n if (!isPathWithin(path.resolve(workDir), resolved)) {\n throw new Error(`${label} path must stay within work directory`)\n }\n return resolved\n}\n\nexport async function writeRunPlanFiles(\n workDir: string,\n files: Array<{ path: string; contents: string }> | undefined\n): Promise<void> {\n if (!files || files.length === 0) return\n for (const file of files) {\n const filePath = resolveSafeWorkPath(workDir, file.path, 'Run plan file')\n await writeOwnerOnlyFile(filePath, file.contents)\n }\n}\n\nexport function assertSafeOutputPath(workDir: string, outputPath: string | undefined): void {\n if (!outputPath) return\n resolveSafeWorkPath(workDir, outputPath, 'Run plan output')\n}\n\nexport function resolveRunPlanEnv(\n env: NodeJS.ProcessEnv | undefined,\n workDir: string\n): NodeJS.ProcessEnv | undefined {\n if (!env) return undefined\n return Object.fromEntries(\n Object.entries(env).map(([key, value]) => {\n if (typeof value === 'string' && value.includes('{WORKDIR}')) {\n return [key, value.replace(/\\{WORKDIR\\}/g, workDir)]\n }\n return [key, value]\n })\n )\n}\n\nexport function truncateLog(\n value: string,\n maxBytes = DEFAULT_GATEWAY_LOG_BYTES\n): { value: string; truncated: boolean; originalBytes: number } {\n if (!value) {\n return { value: '', truncated: false, originalBytes: 0 }\n }\n if (value.length <= maxBytes) {\n return { value, truncated: false, originalBytes: value.length }\n }\n return {\n value: value.slice(0, maxBytes),\n truncated: true,\n originalBytes: value.length,\n }\n}\n\nexport function extractFirstJsonObject(text: string): Record<string, unknown> | null {\n let inString = false\n let escape = false\n for (let i = 0; i < text.length; i += 1) {\n const char = text[i]\n if (escape) {\n escape = false\n continue\n }\n if (char === '\\\\') {\n if (inString) escape = true\n continue\n }\n if (char === '\"') {\n inString = !inString\n continue\n }\n if (inString) continue\n if (char !== '{') continue\n let depth = 0\n let innerInString = false\n let innerEscape = false\n for (let j = i; j < text.length; j += 1) {\n const inner = text[j]\n if (innerEscape) {\n innerEscape = false\n continue\n }\n if (inner === '\\\\') {\n if (innerInString) innerEscape = true\n continue\n }\n if (inner === '\"') {\n innerInString = !innerInString\n continue\n }\n if (innerInString) continue\n if (inner === '{') depth += 1\n if (inner === '}') {\n depth -= 1\n if (depth === 0) {\n const candidate = text.slice(i, j + 1)\n try {\n return JSON.parse(candidate) as Record<string, unknown>\n } catch {\n break\n }\n }\n }\n }\n }\n return null\n}\n\nexport function extractGatewayErrorSummary(\n stderr: string\n): { message?: string; type?: string; code?: string; param?: string } | null {\n if (!stderr) return null\n const parsed = extractFirstJsonObject(stderr)\n if (!parsed) return null\n const error = (parsed as { error?: Record<string, unknown> }).error\n if (error && typeof error === 'object') {\n return {\n message: typeof error.message === 'string' ? error.message : undefined,\n type: typeof error.type === 'string' ? error.type : undefined,\n code: typeof error.code === 'string' ? error.code : undefined,\n param: typeof error.param === 'string' ? error.param : undefined,\n }\n }\n return {\n message: typeof parsed.message === 'string' ? parsed.message : undefined,\n type:\n typeof (parsed as Record<string, unknown>).type === 'string'\n ? String(parsed.type)\n : undefined,\n code:\n typeof (parsed as Record<string, unknown>).code === 'string'\n ? String(parsed.code)\n : undefined,\n }\n}\n\nexport async function sleep(ms: number): Promise<void> {\n if (!ms || ms <= 0) return\n await new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function asJson(value: unknown): Json {\n return value as Json\n}\n", "const textEncoder = new globalThis.TextEncoder();\nexport async function sha256Hex(value) {\n const bytes = textEncoder.encode(value);\n const digest = await globalThis.crypto.subtle.digest('SHA-256', bytes);\n const parts = Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, '0'));\n return parts.join('');\n}\n", "import { sha256Hex } from '../crypto.js';\nexport const OVERFLOW_STORAGE_BUCKET = 'overflow-artifacts';\nexport const MAX_OVERFLOW_ARTIFACT_BYTES = 20 * 1024 * 1024;\nexport const DEFAULT_OVERFLOW_PREVIEW_CHARS = 2_000;\nexport const OVERFLOW_READ_MAX_CHARS = 12_000;\nexport const OVERFLOW_PERSIST_THRESHOLD_CHARS = 6_000;\nexport const SUBAGENT_OUTPUT_OVERFLOW_THRESHOLD_CHARS = OVERFLOW_PERSIST_THRESHOLD_CHARS;\nexport const OVERFLOW_LIST_DEFAULT_LIMIT = 25;\nexport const OVERFLOW_LIST_MAX_LIMIT = 100;\nexport const OVERFLOW_ARTIFACT_SOURCE_CONFLICT_CODE = 'OVERFLOW_ARTIFACT_SOURCE_CONFLICT';\nconst NORMALIZE_LINE_ENDINGS_PATTERN = /\\r\\n|\\r/g;\nfunction formatUuidFromHex(hex) {\n const normalized = hex.slice(0, 32).padEnd(32, '0');\n const timeLow = normalized.slice(0, 8);\n const timeMid = normalized.slice(8, 12);\n const timeHiAndVersion = `5${normalized.slice(13, 16)}`;\n const clockSeqHi = ((parseInt(normalized.slice(16, 18), 16) & 0x3f) | 0x80)\n .toString(16)\n .padStart(2, '0');\n const clockSeqLow = normalized.slice(18, 20);\n const node = normalized.slice(20, 32);\n return `${timeLow}-${timeMid}-${timeHiAndVersion}-${clockSeqHi}${clockSeqLow}-${node}`;\n}\nfunction normalizeMimeType(mimeType) {\n if (typeof mimeType !== 'string')\n return 'text/plain';\n const trimmed = mimeType.trim();\n return trimmed.length > 0 ? trimmed : 'text/plain';\n}\nexport function normalizeOverflowText(text) {\n return text.replace(NORMALIZE_LINE_ENDINGS_PATTERN, '\\n');\n}\nexport function countOverflowLines(text) {\n if (!text)\n return 0;\n return normalizeOverflowText(text).split('\\n').length;\n}\nexport function computeOverflowByteSize(text) {\n return new globalThis.TextEncoder().encode(text).byteLength;\n}\nexport function buildOverflowPreview(text, maxChars = DEFAULT_OVERFLOW_PREVIEW_CHARS) {\n const normalized = normalizeOverflowText(text);\n if (normalized.length <= maxChars)\n return normalized;\n const marker = '\\n[... overflow preview truncated ...]\\n';\n const available = Math.max(maxChars - marker.length, 0);\n const headChars = Math.ceil(available / 2);\n const tailChars = Math.max(available - headChars, 0);\n const head = normalized.slice(0, headChars);\n const tail = normalized.slice(-tailChars);\n return `${head}${marker}${tail}`;\n}\nexport async function buildDeterministicOverflowArtifactId(params) {\n const sourceId = params.sourceId?.trim();\n if (!sourceId) {\n return null;\n }\n const digest = await sha256Hex(`overflow-artifact:${params.agentId}:${params.sourceType}:${sourceId}`);\n return formatUuidFromHex(digest);\n}\nexport async function buildOverflowContentSha256(text) {\n return sha256Hex(text);\n}\nexport function preparePersistedText(text, mimeType) {\n const normalizedText = normalizeOverflowText(text);\n return {\n normalized_text: normalizedText,\n preview_text: buildOverflowPreview(normalizedText),\n size_bytes: computeOverflowByteSize(normalizedText),\n line_count: countOverflowLines(normalizedText),\n mime_type: normalizeMimeType(mimeType),\n encoding: 'utf-8',\n };\n}\nexport function shouldPersistTextAsOverflow(text, thresholdChars = OVERFLOW_PERSIST_THRESHOLD_CHARS) {\n const normalizedText = normalizeOverflowText(text);\n return normalizedText.length > thresholdChars;\n}\nexport function buildInlinePersistedTextOutput(text, mimeType) {\n const prepared = preparePersistedText(text, mimeType);\n return {\n storage_mode: 'inline',\n inline_text: prepared.normalized_text,\n preview_text: prepared.preview_text,\n size_bytes: prepared.size_bytes,\n line_count: prepared.line_count,\n mime_type: prepared.mime_type,\n encoding: prepared.encoding,\n };\n}\nexport function buildOverflowPersistedTextOutput(params) {\n const prepared = preparePersistedText(params.text, params.mimeType);\n return {\n storage_mode: 'overflow',\n inline_text: null,\n preview_text: prepared.preview_text,\n size_bytes: prepared.size_bytes,\n line_count: prepared.line_count,\n mime_type: prepared.mime_type,\n encoding: prepared.encoding,\n overflow_artifact: params.pointer,\n };\n}\nexport function buildPreviewOnlyPersistedTextOutput(params) {\n const prepared = preparePersistedText(params.text, params.mimeType);\n return {\n storage_mode: 'preview_only',\n inline_text: null,\n preview_text: prepared.preview_text,\n size_bytes: prepared.size_bytes,\n line_count: prepared.line_count,\n mime_type: prepared.mime_type,\n encoding: prepared.encoding,\n omission_reason: params.omissionReason,\n };\n}\nexport function normalizeOverflowPreview(preview, fallbackText = '') {\n if (typeof preview === 'string' && preview.length > 0) {\n return preview;\n }\n return buildOverflowPreview(fallbackText);\n}\nfunction readString(value) {\n if (typeof value !== 'string')\n return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\nfunction readNumber(value) {\n if (typeof value === 'number' && Number.isFinite(value))\n return value;\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed)\n return undefined;\n const parsed = Number(trimmed);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n}\nexport function coerceOverflowArtifactPointer(value) {\n if (!value || typeof value !== 'object' || Array.isArray(value))\n return undefined;\n const record = value;\n const ref = readString(record.ref);\n if (!ref)\n return undefined;\n return {\n ref,\n mime_type: readString(record.mime_type) ?? 'text/plain',\n encoding: readString(record.encoding) ?? 'utf-8',\n size_bytes: readNumber(record.size_bytes) ?? 0,\n line_count: readNumber(record.line_count) ?? undefined,\n preview: normalizeOverflowPreview(record.preview),\n created_at: readString(record.created_at),\n source_type: readString(record.source_type),\n };\n}\nexport function encodeOverflowListCursor(cursor) {\n return `${cursor.created_at}|${cursor.ref}`;\n}\nexport function decodeOverflowListCursor(value) {\n if (typeof value !== 'string')\n return undefined;\n const trimmed = value.trim();\n if (!trimmed)\n return undefined;\n const separatorIndex = trimmed.lastIndexOf('|');\n if (separatorIndex <= 0 || separatorIndex >= trimmed.length - 1) {\n return undefined;\n }\n const created_at = trimmed.slice(0, separatorIndex).trim();\n const ref = trimmed.slice(separatorIndex + 1).trim();\n if (!created_at || !ref)\n return undefined;\n return { created_at, ref };\n}\nexport function buildOverflowAccessNotice(params) {\n const subject = params.subject?.trim() || 'output';\n if (params.exactContentState === 'preview_only') {\n return [\n `Only a preview of ${subject} is available.`,\n params.omissionReason === 'overflow_artifact_too_large'\n ? 'The exact output exceeded Panorama\u2019s overflow artifact size limit.'\n : 'The exact output could not be persisted into overflow storage.',\n 'No overflow artifact is available for reread. Save or use the preview only if it is sufficient.',\n ].join('\\n');\n }\n const pointer = params.overflowArtifact;\n if (!pointer?.ref || params.exactContentState !== 'overflow') {\n return null;\n }\n const lines = [\n `Full ${subject} stored as overflow artifact ${pointer.ref}.`,\n 'Use overflow.describe or overflow.read to inspect narrower slices.',\n ];\n if (params.includeDeleteInstruction) {\n lines.push('Delete it with overflow.delete when it is no longer useful.');\n }\n if (pointer.size_bytes > 0) {\n lines.push(`Artifact size: ${pointer.size_bytes.toLocaleString()} bytes.`);\n }\n return lines.join('\\n');\n}\n", "import { coerceOverflowArtifactPointer, } from '../overflow/contract.js';\nexport const SUBAGENT_SCHEMA_VERSION = 1;\n// Default tool allowlist for internal subagents.\n// Expanding this list is the only enforcement mechanism for subagent tool access.\nexport const SUBAGENT_SAFE_TOOL_ALLOWLIST = [\n 'read_todos',\n 'write_todos',\n 'ls',\n 'read_file',\n 'write_file',\n 'edit_file',\n 'glob',\n 'grep',\n 'web.search',\n 'web.read_content',\n 'web.read_html',\n 'web.summarize',\n 'resources.list_available',\n 'resources.search',\n 'overflow.describe',\n 'overflow.list',\n 'overflow.read',\n 'drive.list_entries',\n 'drive.get_entry',\n 'drive.read_file',\n 'notes.read',\n 'notes.read_lines',\n 'notes.search',\n 'wikis.list_pages',\n 'wikis.read_page',\n 'wikis.search',\n 'google_docs_markdown.read_lines',\n 'google_sheets.read',\n 'google_sheets.get_metadata',\n 'notion.get_schema',\n 'notion.get_pages',\n 'notion.get_pages_by_ids',\n 'airtable.list_bases',\n 'airtable.list_tables',\n 'airtable.get_schema',\n];\nexport const SUBAGENT_RUN_STATUS_VALUES = ['running', 'completed', 'failed', 'cancelled'];\nexport const SUBAGENT_RUN_TERMINAL_STATUSES = ['completed', 'failed', 'cancelled'];\nconst RUN_STATUS_SET = new Set(SUBAGENT_RUN_STATUS_VALUES);\nconst TERMINAL_RUN_STATUS_SET = new Set(SUBAGENT_RUN_TERMINAL_STATUSES);\nexport function isSubagentRunStatus(value) {\n if (typeof value !== 'string')\n return false;\n return RUN_STATUS_SET.has(value);\n}\nexport function coerceSubagentRunStatus(value, fallback = 'running') {\n if (typeof value !== 'string')\n return fallback;\n const normalized = value.trim().toLowerCase();\n if (!RUN_STATUS_SET.has(normalized))\n return fallback;\n return normalized;\n}\nexport function isTerminalSubagentRunStatus(status) {\n return TERMINAL_RUN_STATUS_SET.has(status);\n}\nexport const SUBAGENT_CANCEL_STATE_VALUES = [\n 'none',\n 'requested',\n 'acknowledged',\n 'rejected',\n];\nconst CANCEL_STATE_SET = new Set(SUBAGENT_CANCEL_STATE_VALUES);\nexport function coerceSubagentCancelState(value, fallback = 'none') {\n if (typeof value !== 'string')\n return fallback;\n const normalized = value.trim().toLowerCase();\n if (!CANCEL_STATE_SET.has(normalized))\n return fallback;\n return normalized;\n}\nexport const SUBAGENT_RUN_EVENT_TYPE_VALUES = [\n 'message',\n 'system',\n 'tool_call',\n 'tool_result',\n 'run_started',\n 'run_progress',\n 'cancellation_requested',\n 'cancellation_acknowledged',\n 'run_completed',\n 'run_failed',\n 'run_cancelled',\n];\nconst RUN_EVENT_TYPE_SET = new Set(SUBAGENT_RUN_EVENT_TYPE_VALUES);\nexport function isSubagentRunEventType(value) {\n if (typeof value !== 'string')\n return false;\n return RUN_EVENT_TYPE_SET.has(value);\n}\nexport function coerceSubagentRunEventType(value, fallback = 'system') {\n if (typeof value !== 'string')\n return fallback;\n const normalized = value.trim().toLowerCase();\n if (!RUN_EVENT_TYPE_SET.has(normalized))\n return fallback;\n return normalized;\n}\nconst CONTENT_TYPES = new Set(['markdown', 'text', 'json']);\nconst EXACT_CONTENT_STATE_VALUES = ['inline', 'overflow', 'preview_only'];\nconst EXACT_CONTENT_STATE_SET = new Set(EXACT_CONTENT_STATE_VALUES);\nconst OMITTED_CONTENT_REASON_SET = new Set([\n 'overflow_artifact_too_large',\n 'overflow_persistence_failed',\n]);\nfunction normalizeContentType(value) {\n if (typeof value !== 'string')\n return null;\n const trimmed = value.trim().toLowerCase();\n if (!CONTENT_TYPES.has(trimmed))\n return null;\n return trimmed;\n}\nfunction normalizeExactContentState(value) {\n if (typeof value !== 'string')\n return null;\n const trimmed = value.trim().toLowerCase();\n if (!EXACT_CONTENT_STATE_SET.has(trimmed))\n return null;\n return trimmed;\n}\nfunction normalizePersistedTextUnavailableReason(value) {\n if (typeof value !== 'string')\n return undefined;\n const trimmed = value.trim();\n if (!OMITTED_CONTENT_REASON_SET.has(trimmed))\n return undefined;\n return trimmed;\n}\nfunction inferExactContentState(params) {\n const explicitState = normalizeExactContentState(params.explicitState);\n if (explicitState)\n return explicitState;\n if (params.overflowArtifact)\n return 'overflow';\n if (params.omissionReason)\n return 'preview_only';\n return 'inline';\n}\nfunction normalizeStringList(value) {\n if (!value)\n return undefined;\n if (Array.isArray(value)) {\n const list = value.map((item) => String(item).trim()).filter((item) => item.length > 0);\n return list.length > 0 ? list : undefined;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed)\n return undefined;\n const list = trimmed\n .split(',')\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n return list.length > 0 ? list : undefined;\n }\n return undefined;\n}\nfunction inferContentType(value) {\n if (value && typeof value === 'object')\n return 'json';\n return 'text';\n}\nfunction extractSummary(value) {\n const summary = value.summary ?? value.overview;\n return typeof summary === 'string' && summary.trim().length > 0 ? summary.trim() : undefined;\n}\nfunction extractSources(value) {\n return normalizeStringList(value.sources);\n}\nfunction extractOriginalContentType(value) {\n return normalizeContentType(value.original_content_type) ?? undefined;\n}\nexport function isSubagentOutputEnvelope(value) {\n if (!value || typeof value !== 'object')\n return false;\n const record = value;\n if (!('content' in record) || !('content_type' in record))\n return false;\n const contentType = normalizeContentType(record.content_type);\n return !!contentType;\n}\nexport function coerceSubagentOutputEnvelope(value, options) {\n const fallbackContentType = options?.fallbackContentType ?? 'markdown';\n if (isSubagentOutputEnvelope(value)) {\n const record = value;\n const overflowArtifact = coerceOverflowArtifactPointer(record.overflow_artifact);\n const omissionReason = normalizePersistedTextUnavailableReason(record.omission_reason);\n return {\n ...record,\n schema_version: typeof record.schema_version === 'number' ? record.schema_version : SUBAGENT_SCHEMA_VERSION,\n content_type: normalizeContentType(record.content_type) ?? inferContentType(record.content),\n original_content_type: normalizeContentType(record.original_content_type) ?? undefined,\n exact_content_state: inferExactContentState({\n explicitState: record.exact_content_state,\n overflowArtifact,\n omissionReason,\n }),\n omission_reason: omissionReason,\n summary: record.summary?.trim() || undefined,\n sources: normalizeStringList(record.sources),\n errors: normalizeStringList(record.errors),\n overflow_artifact: overflowArtifact,\n };\n }\n if (value && typeof value === 'object') {\n const record = value;\n if ('content' in record) {\n const content = record.content;\n const contentType = normalizeContentType(record.content_type) ?? inferContentType(content);\n const overflowArtifact = coerceOverflowArtifactPointer(record.overflow_artifact);\n const omissionReason = normalizePersistedTextUnavailableReason(record.omission_reason);\n return {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n content,\n content_type: contentType,\n original_content_type: extractOriginalContentType(record),\n exact_content_state: inferExactContentState({\n explicitState: record.exact_content_state,\n overflowArtifact,\n omissionReason,\n }),\n omission_reason: omissionReason,\n summary: extractSummary(record),\n sources: extractSources(record),\n errors: normalizeStringList(record.errors),\n overflow_artifact: overflowArtifact,\n };\n }\n if (typeof record.result === 'string' && record.result.trim().length > 0) {\n return {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n content: record.result.trim(),\n content_type: 'markdown',\n exact_content_state: 'inline',\n summary: extractSummary(record),\n sources: extractSources(record),\n };\n }\n if (typeof record.text === 'string' && record.text.trim().length > 0) {\n return {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n content: record.text.trim(),\n content_type: 'markdown',\n exact_content_state: 'inline',\n summary: extractSummary(record),\n sources: extractSources(record),\n };\n }\n return {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n content: record,\n content_type: 'json',\n exact_content_state: 'inline',\n };\n }\n if (typeof value === 'string') {\n return {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n content: value.trim(),\n content_type: fallbackContentType,\n exact_content_state: 'inline',\n };\n }\n return {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n content: value == null ? '' : String(value),\n content_type: 'text',\n exact_content_state: 'inline',\n };\n}\n", "import type { OverflowArtifactPointer } from '@panorama/shared'\nimport type { SubagentSchemaVersion } from '@panorama/shared/subagents/contract'\n\nexport const SUBAGENT_SCHEMA_VERSION: SubagentSchemaVersion = 1\n\nexport type SubagentOutputContentType = 'markdown' | 'text' | 'json'\nexport type SubagentRunOutputFormat = 'json' | 'text' | 'stream-json'\n\nexport interface SubagentStreamEvent {\n sequence: number\n raw: string\n event: Record<string, unknown> | null\n}\n\nexport interface NormalizedRunEvent {\n event_type: string\n payload: Record<string, unknown>\n}\n\nexport interface SubagentOutputEnvelope {\n schema_version: number\n content: unknown\n content_type: SubagentOutputContentType\n original_content_type?: SubagentOutputContentType\n summary?: string\n sources?: string[]\n errors?: string[]\n overflow_artifact?: OverflowArtifactPointer\n}\n\nexport interface SubagentRunPlan {\n command: string\n args: string[]\n outputFormat: SubagentRunOutputFormat\n timeoutMs: number | null\n env?: NodeJS.ProcessEnv\n files?: Array<{ path: string; contents: string }>\n}\n\nexport interface SubagentNormalizeResult {\n output: SubagentOutputEnvelope\n metadata: Record<string, unknown>\n rawResponse?: Record<string, unknown> | null\n parseError?: string | null\n}\n\nexport interface SubagentAdapterContext {\n prompt: string\n config: Record<string, unknown>\n command: string\n support: Record<string, boolean>\n fullControl: boolean\n resumeSessionId?: string | null\n}\n\nexport interface SubagentAdapter {\n id: string\n label: string\n supportsContinuation: boolean\n buildRunPlan(context: SubagentAdapterContext): SubagentRunPlan\n normalizeRunResult(params: {\n stdout: string\n outputFormat: 'json' | 'text'\n }): SubagentNormalizeResult\n normalizeStreamingResult?: (params: {\n events: SubagentStreamEvent[]\n rawOutput: string\n }) => SubagentNormalizeResult\n normalizeStreamEvents?: (events: SubagentStreamEvent[]) => NormalizedRunEvent[]\n}\n", "import { coerceSubagentRunEventType } from '@panorama/shared/subagents/contract'\nimport { SUBAGENT_SCHEMA_VERSION } from './subagent-adapters/types.js'\n\nexport const DEFAULT_SUBAGENT_EVENT_PAYLOAD_BYTES = 200_000\n\nexport type SubagentRetryConfig = {\n maxAttempts: number\n backoffMs: number\n maxBackoffMs: number\n retryOnCapacity: boolean\n retryOnTimeout: boolean\n retryOnNetwork: boolean\n retryOnParse: boolean\n}\n\nexport function buildErrorOutput(message: string): Record<string, unknown> {\n return {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n content: message,\n content_type: 'text',\n errors: [message],\n }\n}\n\nexport function extractSubagentPrompt(input: Record<string, unknown> | null): string | null {\n if (!input) return null\n const raw =\n (typeof input.prompt === 'string' && input.prompt) ||\n (typeof input.query === 'string' && input.query) ||\n (typeof input.task === 'string' && input.task)\n if (!raw) return null\n const trimmed = raw.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nexport function isUuid(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\n}\n\nexport function trimEventPayload(\n event: Record<string, unknown>,\n maxPayloadBytes = DEFAULT_SUBAGENT_EVENT_PAYLOAD_BYTES\n): Record<string, unknown> {\n try {\n const raw = JSON.stringify(event)\n if (raw.length <= maxPayloadBytes) return event\n return {\n truncated: true,\n original_bytes: raw.length,\n preview: raw.slice(0, maxPayloadBytes),\n }\n } catch {\n return event\n }\n}\n\nexport function computeRetryDelayMs(\n attempt: number,\n baseMs: number,\n maxMs: number,\n random: () => number = Math.random\n): number {\n const exponent = Math.max(0, attempt - 1)\n const raw = Math.min(maxMs, baseMs * Math.pow(2, exponent))\n const jitter = 0.7 + random() * 0.6\n return Math.round(raw * jitter)\n}\n\nexport function classifySubagentRetryable(params: {\n result: {\n ok: boolean\n timedOut: boolean\n exitCode: number | null\n error?: string\n stderr?: string\n stdoutTruncated?: boolean\n stderrTruncated?: boolean\n }\n parseError: string | null\n parseStrict: boolean\n config: SubagentRetryConfig\n}): { retryable: boolean; reason: string } | null {\n const { result, parseError, parseStrict, config } = params\n if (parseStrict && parseError && config.retryOnParse) {\n return { retryable: true, reason: 'parse_error' }\n }\n if (!result.ok) {\n if (result.timedOut && config.retryOnTimeout) {\n return { retryable: true, reason: 'timeout' }\n }\n const message = `${result.error ?? ''}\\n${result.stderr ?? ''}`.toLowerCase()\n if (config.retryOnCapacity) {\n if (\n message.includes('resource_exhausted') ||\n message.includes('capacity') ||\n message.includes('rate limit') ||\n message.includes('too many requests') ||\n message.includes('429')\n ) {\n return { retryable: true, reason: 'capacity' }\n }\n }\n if (config.retryOnNetwork) {\n if (\n message.includes('econnreset') ||\n message.includes('etimedout') ||\n message.includes('enotfound') ||\n message.includes('eai_again') ||\n message.includes('socket hang up') ||\n message.includes('network')\n ) {\n return { retryable: true, reason: 'network' }\n }\n }\n }\n return null\n}\n\nexport function normalizeSubagentRunEventType(value: unknown, fallback = 'system'): string {\n return coerceSubagentRunEventType(value, coerceSubagentRunEventType(fallback))\n}\n\nexport function mergeMetadata(\n base: Record<string, unknown> | null | undefined,\n update: Record<string, unknown>\n): Record<string, unknown> {\n return {\n ...(base ?? {}),\n ...update,\n }\n}\n", "import type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from './database.types.js'\nimport { asJson } from './gateway-run-helpers.js'\nimport { normalizeSubagentRunEventType, trimEventPayload } from './subagent-run-helpers.js'\n\nexport type SubagentRunEventClient = SupabaseClient<Database>\nexport type SubagentRunEventLogger = (\n message: string,\n data?: Record<string, unknown>\n) => void\n\nconst noopLogger: SubagentRunEventLogger = () => {}\n\nexport async function getNextSubagentRunEventSequence(\n supabase: SubagentRunEventClient,\n runId: string,\n logError: SubagentRunEventLogger = noopLogger\n): Promise<number> {\n const { data, error } = await supabase\n .from('subagent_run_events')\n .select('sequence')\n .eq('run_id', runId)\n .order('sequence', { ascending: false })\n .limit(1)\n .maybeSingle()\n\n if (error) {\n logError('Failed to fetch subagent run event sequence; defaulting to 0', {\n runId,\n error: error.message,\n })\n return 0\n }\n\n if (!data || typeof data.sequence !== 'number' || !Number.isFinite(data.sequence)) {\n return 0\n }\n\n return data.sequence + 1\n}\n\nexport async function insertSubagentRunEvent(params: {\n supabase: SubagentRunEventClient\n runId: string\n subagentId: string\n teamId: string\n gatewayId: string | null\n sequence: number\n eventType: string\n payload: Record<string, unknown>\n logError?: SubagentRunEventLogger\n}): Promise<number | null> {\n const logError = params.logError ?? noopLogger\n const normalizedType = normalizeSubagentRunEventType(params.eventType, 'system')\n\n const insertWithSequence = async (sequence: number) =>\n params.supabase.from('subagent_run_events').insert({\n run_id: params.runId,\n subagent_id: params.subagentId,\n team_id: params.teamId,\n gateway_id: params.gatewayId,\n sequence,\n event_type: normalizedType,\n payload: asJson(trimEventPayload(params.payload)),\n })\n\n const { error } = await insertWithSequence(params.sequence)\n if (!error) return params.sequence\n\n if (error.code === '23505') {\n const retrySequence = await getNextSubagentRunEventSequence(\n params.supabase,\n params.runId,\n logError\n )\n const { error: retryError } = await insertWithSequence(retrySequence)\n if (!retryError) return retrySequence\n\n logError('Failed to insert subagent run event after retry', {\n runId: params.runId,\n subagentId: params.subagentId,\n event_type: normalizedType,\n error: retryError.message,\n })\n return null\n }\n\n logError('Failed to insert subagent run event', {\n runId: params.runId,\n subagentId: params.subagentId,\n event_type: normalizedType,\n error: error.message,\n })\n return null\n}\n", "import type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from './database.types.js'\n\nexport type SubagentRunStoreClient = SupabaseClient<Database>\nexport type SubagentRunStoreLogger = (\n message: string,\n data?: Record<string, unknown>\n) => void\n\nexport async function getNextSubagentRunSequence(\n supabase: SubagentRunStoreClient,\n subagentId: string,\n logError: SubagentRunStoreLogger = () => {}\n): Promise<number> {\n const { data, error } = await supabase.rpc('allocate_subagent_run_sequence', {\n p_subagent_id: subagentId,\n })\n\n if (error) {\n logError('Failed to allocate subagent run sequence; falling back to read-based sequence', {\n subagentId,\n error: error.message,\n })\n const { data: fallback } = await supabase\n .from('subagent_runs')\n .select('run_sequence')\n .eq('subagent_id', subagentId)\n .order('run_sequence', { ascending: false })\n .limit(1)\n .maybeSingle()\n\n const lastSequence =\n fallback && typeof fallback.run_sequence === 'number' ? fallback.run_sequence : 0\n return lastSequence + 1\n }\n\n return typeof data === 'number' && Number.isFinite(data) ? data : 1\n}\n", "import type { SupabaseClient } from '@supabase/supabase-js'\nimport type { ChildProcess } from 'node:child_process'\nimport {\n buildGatewayCommandEnv,\n runGatewayCommand,\n runGatewayStreamingCommand,\n type GatewayCommandRunOptions,\n type GatewayCommandResult,\n type GatewayStreamingCommandResult,\n} from './gateway-command-runner.js'\nimport type { Database } from './database.types.js'\nimport type { GatewayRuntimeState } from './gateway-runtime-state.js'\nimport type { ParsedArgs } from './cli-args.js'\nimport { ensureOwnerOnlyDirectory } from './local-security.js'\nimport { requestChildTermination as requestChildTerminationBase } from './process-control.js'\nimport { resolveGatewayTmpDir } from './runtime-paths.js'\nimport { resolveGatewaySubagentWorkdirRoot } from './gateway-state.js'\nimport type { GatewaySubagentRunEventInsert } from './gateway-subagent-run-types.js'\nimport {\n getNextSubagentRunEventSequence as getNextSubagentRunEventSequenceBase,\n insertSubagentRunEvent as insertSubagentRunEventBase,\n} from './subagent-run-events.js'\nimport { getNextSubagentRunSequence as getNextSubagentRunSequenceBase } from './subagent-run-store.js'\n\ntype GatewaySupabaseClient = SupabaseClient<Database>\n\ntype GatewayChildTerminator = (\n child: ChildProcess | undefined,\n options: { reason: string; graceMs: number; context: string }\n) => void\n\ntype GatewayCommandRunner = (\n command: string,\n args: string[],\n options: GatewayCommandRunOptions\n) => Promise<GatewayCommandResult>\n\ntype GatewayStreamingCommandRunner = (\n command: string,\n args: string[],\n options: GatewayCommandRunOptions\n) => Promise<GatewayStreamingCommandResult>\n\nexport interface GatewayExecutionSupportDependencies {\n runtimeState: GatewayRuntimeState<unknown>\n subagentCancelKillTimeoutMs: number\n getActiveOptions: (options?: ParsedArgs['options']) => ParsedArgs['options']\n logError: (message: string, data?: Record<string, unknown>) => void\n buildCommandEnv?: (options?: { baseEnv?: NodeJS.ProcessEnv }) => NodeJS.ProcessEnv\n runCommandBase?: GatewayCommandRunner\n runStreamingCommandBase?: GatewayStreamingCommandRunner\n ensureOwnerOnlyDirectory?: (path: string) => Promise<void>\n resolveGatewayTmpDir?: () => string\n requestChildTerminationBase?: typeof requestChildTerminationBase\n resolveSubagentWorkdirRootBase?: (options?: ParsedArgs['options']) => string\n getNextRunSequenceBase?: (\n supabase: GatewaySupabaseClient,\n subagentId: string,\n logError: (message: string, data?: Record<string, unknown>) => void\n ) => Promise<number>\n getNextSubagentRunEventSequenceBase?: (\n supabase: GatewaySupabaseClient,\n runId: string,\n logError: (message: string, data?: Record<string, unknown>) => void\n ) => Promise<number>\n insertSubagentRunEventBase?: (\n params: GatewaySubagentRunEventInsert & {\n logError: (message: string, data?: Record<string, unknown>) => void\n }\n ) => Promise<number | null>\n}\n\nexport interface GatewayExecutionSupport {\n ensureGatewayTmpDir: () => Promise<void>\n buildGatewayChildEnv: (baseEnv?: NodeJS.ProcessEnv) => NodeJS.ProcessEnv\n runCommand: GatewayCommandRunner\n runStreamingCommand: GatewayStreamingCommandRunner\n getNextRunSequence: (supabase: GatewaySupabaseClient, subagentId: string) => Promise<number>\n getNextSubagentRunEventSequence: (\n supabase: GatewaySupabaseClient,\n runId: string\n ) => Promise<number>\n insertSubagentRunEvent: (params: GatewaySubagentRunEventInsert) => Promise<number | null>\n requestChildTermination: GatewayChildTerminator\n requestSubagentCancel: (\n subagentId: string,\n runId: string | null,\n reason: string\n ) => { active: boolean }\n resolvePendingCancel: (\n subagentId: string,\n runId: string,\n metadata: Record<string, unknown>\n ) => string | null\n consumePendingCancelFromQueue: (subagentId: string, runId: string) => string | null\n clearPendingCancel: (subagentId: string, runId: string) => void\n resolveSubagentWorkdirRoot: () => string\n}\n\nexport function createGatewayExecutionSupport(\n dependencies: GatewayExecutionSupportDependencies\n): GatewayExecutionSupport {\n const buildCommandEnv =\n dependencies.buildCommandEnv ??\n ((options?: { baseEnv?: NodeJS.ProcessEnv }) =>\n buildGatewayCommandEnv({ baseEnv: options?.baseEnv }))\n const runCommandBase = dependencies.runCommandBase ?? runGatewayCommand\n const runStreamingCommandBase =\n dependencies.runStreamingCommandBase ?? runGatewayStreamingCommand\n const ensureDirectory = dependencies.ensureOwnerOnlyDirectory ?? ensureOwnerOnlyDirectory\n const resolveTmpDir = dependencies.resolveGatewayTmpDir ?? resolveGatewayTmpDir\n const requestChildTerminationImpl =\n dependencies.requestChildTerminationBase ?? requestChildTerminationBase\n const resolveSubagentWorkdirRootBase =\n dependencies.resolveSubagentWorkdirRootBase ?? resolveGatewaySubagentWorkdirRoot\n const getNextRunSequenceBase =\n dependencies.getNextRunSequenceBase ?? getNextSubagentRunSequenceBase\n const getNextSubagentRunEventSequenceImpl =\n dependencies.getNextSubagentRunEventSequenceBase ?? getNextSubagentRunEventSequenceBase\n const insertSubagentRunEventImpl =\n dependencies.insertSubagentRunEventBase ?? insertSubagentRunEventBase\n\n const buildGatewayChildEnv = (baseEnv?: NodeJS.ProcessEnv): NodeJS.ProcessEnv => {\n return buildCommandEnv({ baseEnv })\n }\n\n const ensureGatewayTmpDir = async (): Promise<void> => {\n await ensureDirectory(resolveTmpDir())\n }\n\n const withGatewayCommandLogging = <T extends GatewayCommandRunOptions>(\n options: T,\n context: string\n ): T => {\n return {\n ...options,\n timeoutContext: context,\n onTerminationError: (phase, error, timeoutContext) => {\n dependencies.logError('Failed to send child process termination signal', {\n context: timeoutContext,\n reason: 'process_timeout',\n phase,\n error: error instanceof Error ? error.message : String(error),\n })\n },\n }\n }\n\n const runCommand = async (\n command: string,\n args: string[],\n options: GatewayCommandRunOptions\n ): Promise<GatewayCommandResult> => {\n return await runCommandBase(\n command,\n args,\n withGatewayCommandLogging(options, 'runGatewayCommand')\n )\n }\n\n const runStreamingCommand = async (\n command: string,\n args: string[],\n options: GatewayCommandRunOptions\n ): Promise<GatewayStreamingCommandResult> => {\n return await runStreamingCommandBase(\n command,\n args,\n withGatewayCommandLogging(options, 'runGatewayStreamingCommand')\n )\n }\n\n const getNextRunSequence = async (\n supabase: GatewaySupabaseClient,\n subagentId: string\n ): Promise<number> => {\n return await getNextRunSequenceBase(supabase, subagentId, dependencies.logError)\n }\n\n const getNextSubagentRunEventSequence = async (\n supabase: GatewaySupabaseClient,\n runId: string\n ): Promise<number> => {\n return await getNextSubagentRunEventSequenceImpl(supabase, runId, dependencies.logError)\n }\n\n const insertSubagentRunEventWithLogging = async (\n params: GatewaySubagentRunEventInsert\n ): Promise<number | null> => {\n return await insertSubagentRunEventImpl({ ...params, logError: dependencies.logError })\n }\n\n const requestChildTermination: GatewayChildTerminator = (child, options) => {\n requestChildTerminationImpl(child, {\n reason: options.reason,\n graceMs: options.graceMs,\n onError: (phase, error) => {\n dependencies.logError('Failed to send child process termination signal', {\n context: options.context,\n reason: options.reason,\n phase,\n error: error instanceof Error ? error.message : String(error),\n })\n },\n })\n }\n\n const requestSubagentCancel = (\n subagentId: string,\n runId: string | null,\n reason: string\n ): { active: boolean } => {\n const activeRun = dependencies.runtimeState.activeSubagentRuns.get(subagentId)\n if (activeRun && (!runId || activeRun.runId === runId)) {\n activeRun.cancelled = true\n activeRun.cancelReason = reason\n requestChildTermination(activeRun.child, {\n reason,\n graceMs: dependencies.subagentCancelKillTimeoutMs,\n context: 'gateway_cancel_request',\n })\n return { active: true }\n }\n\n if (runId) {\n dependencies.runtimeState.pendingCancelByRunId.set(runId, { reason })\n } else {\n dependencies.runtimeState.pendingCancelBySubagentId.set(subagentId, { reason })\n }\n\n return { active: false }\n }\n\n const resolvePendingCancelFromQueue = (subagentId: string, runId: string): string | null => {\n const pendingByRun = dependencies.runtimeState.pendingCancelByRunId.get(runId)\n if (pendingByRun) return pendingByRun.reason\n\n const pendingBySubagent = dependencies.runtimeState.pendingCancelBySubagentId.get(subagentId)\n if (pendingBySubagent) return pendingBySubagent.reason\n\n return null\n }\n\n const clearPendingCancel = (subagentId: string, runId: string): void => {\n dependencies.runtimeState.pendingCancelByRunId.delete(runId)\n dependencies.runtimeState.pendingCancelBySubagentId.delete(subagentId)\n }\n\n const resolvePendingCancel = (\n subagentId: string,\n runId: string,\n metadata: Record<string, unknown>\n ): string | null => {\n const cancelRunId = typeof metadata.cancel_run_id === 'string' ? metadata.cancel_run_id : null\n if (cancelRunId && cancelRunId === runId) {\n return typeof metadata.cancel_reason === 'string' ? metadata.cancel_reason : 'Cancelled'\n }\n return resolvePendingCancelFromQueue(subagentId, runId)\n }\n\n const consumePendingCancelFromQueue = (subagentId: string, runId: string): string | null => {\n const reason = resolvePendingCancelFromQueue(subagentId, runId)\n if (!reason) return null\n clearPendingCancel(subagentId, runId)\n return reason\n }\n\n const resolveSubagentWorkdirRoot = (): string => {\n return resolveSubagentWorkdirRootBase(dependencies.getActiveOptions())\n }\n\n return {\n ensureGatewayTmpDir,\n buildGatewayChildEnv,\n runCommand,\n runStreamingCommand,\n getNextRunSequence,\n getNextSubagentRunEventSequence,\n insertSubagentRunEvent: insertSubagentRunEventWithLogging,\n requestChildTermination,\n requestSubagentCancel,\n resolvePendingCancel,\n consumePendingCancelFromQueue,\n clearPendingCancel,\n resolveSubagentWorkdirRoot,\n }\n}\n", "import {\n validateGatewayCapabilitiesV1,\n type GatewayCapabilitiesV1,\n} from '@panorama/shared/gateway/capabilities'\nimport { createClient, type SupabaseClient } from '@supabase/supabase-js'\nimport type { ParsedArgs } from './cli-args.js'\nimport { truncateText } from './cli-output.js'\nimport type { Database } from './database.types.js'\nimport type { GatewayRuntimeState } from './gateway-runtime-state.js'\nimport type { GatewayConfig } from './gateway-state.js'\n\nconst DEFAULT_MAX_GATEWAY_EVENT_MESSAGE_CHARS = 2000\nconst DEFAULT_GATEWAY_HEARTBEAT_STALE_MS = 90_000\n\ntype GatewaySupabaseClient = SupabaseClient<Database>\ntype GatewayStatus = 'pending' | 'ready' | 'offline' | 'error'\n\nexport interface GatewayControlPlaneEventPayload {\n level: 'info' | 'warn' | 'error'\n code?: string\n message: string\n provider?: string\n details?: Record<string, unknown>\n}\n\nexport interface GatewayControlState {\n full_control_enabled: boolean\n status: string\n last_seen_at: string | null\n capabilities: GatewayCapabilitiesV1 | null\n}\n\nexport interface GatewayControlPlaneDependencies {\n runtimeState: GatewayRuntimeState<GatewayControlPlaneEventPayload>\n loadConfig: (options?: ParsedArgs['options']) => Promise<GatewayConfig>\n createSupabaseClient?: (\n supabaseUrl: string,\n supabaseAnonKey: string\n ) => GatewaySupabaseClient\n maxEventMessageChars?: number\n heartbeatStaleMs?: number\n now?: () => number\n logInfo: (message: string, data?: Record<string, unknown>) => void\n logError: (message: string, data?: Record<string, unknown>) => void\n}\n\nexport interface GatewayControlPlane {\n createGatewayEventClient: (config: GatewayConfig) => Promise<GatewaySupabaseClient | null>\n emitGatewayEvent: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n payload: GatewayControlPlaneEventPayload\n ) => Promise<void>\n queueGatewayEvent: (payload: GatewayControlPlaneEventPayload) => void\n flushGatewayEvents: (supabase: GatewaySupabaseClient, config: GatewayConfig) => Promise<void>\n sendHeartbeat: (\n supabase: GatewaySupabaseClient,\n status: GatewayStatus,\n capabilities: GatewayCapabilitiesV1,\n deviceName?: string | null\n ) => Promise<void>\n loadGatewayControlState: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig\n ) => Promise<GatewayControlState | null>\n isHeartbeatFresh: (lastSeenAt: string | null) => boolean\n refreshRuntimeInstallFullControl: (config: GatewayConfig) => Promise<boolean>\n}\n\nfunction createDefaultSupabaseClient(\n supabaseUrl: string,\n supabaseAnonKey: string\n): GatewaySupabaseClient {\n return createClient<Database>(supabaseUrl, supabaseAnonKey, {\n auth: {\n persistSession: false,\n autoRefreshToken: false,\n detectSessionInUrl: false,\n },\n })\n}\n\nexport function createGatewayControlPlane(\n dependencies: GatewayControlPlaneDependencies\n): GatewayControlPlane {\n const createSupabaseClient = dependencies.createSupabaseClient ?? createDefaultSupabaseClient\n const maxEventMessageChars =\n dependencies.maxEventMessageChars ?? DEFAULT_MAX_GATEWAY_EVENT_MESSAGE_CHARS\n const heartbeatStaleMs = dependencies.heartbeatStaleMs ?? DEFAULT_GATEWAY_HEARTBEAT_STALE_MS\n const now = dependencies.now ?? Date.now\n\n const createGatewayEventClient = async (\n config: GatewayConfig\n ): Promise<GatewaySupabaseClient | null> => {\n if (!config.supabaseUrl || !config.supabaseAnonKey) return null\n const supabase = createSupabaseClient(config.supabaseUrl, config.supabaseAnonKey)\n\n const { data: sessionData, error: sessionError } = await supabase.auth.setSession({\n access_token: config.accessToken,\n refresh_token: config.refreshToken,\n })\n\n if (sessionError || !sessionData?.session) {\n dependencies.logError('Failed to authenticate gateway event session', {\n error: sessionError?.message || 'No session returned',\n })\n return null\n }\n\n return supabase\n }\n\n const emitGatewayEvent = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n payload: GatewayControlPlaneEventPayload\n ): Promise<void> => {\n if (!config.gatewayId || !config.teamId) return\n const message = truncateText(payload.message, maxEventMessageChars)\n const details = payload.details ?? {}\n const { error } = await supabase.from('gateway_events' as any).insert({\n gateway_id: config.gatewayId,\n team_id: config.teamId,\n provider: payload.provider ?? null,\n level: payload.level,\n code: payload.code ?? null,\n message,\n details,\n })\n\n if (error) {\n dependencies.logError('Failed to record gateway event', {\n error: error.message,\n code: payload.code ?? null,\n provider: payload.provider ?? null,\n })\n }\n }\n\n const queueGatewayEvent = (payload: GatewayControlPlaneEventPayload): void => {\n dependencies.runtimeState.pendingGatewayEvents.push(payload)\n }\n\n const flushGatewayEvents = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig\n ): Promise<void> => {\n if (dependencies.runtimeState.pendingGatewayEvents.length === 0) return\n const queued = dependencies.runtimeState.pendingGatewayEvents.splice(\n 0,\n dependencies.runtimeState.pendingGatewayEvents.length\n )\n for (const payload of queued) {\n await emitGatewayEvent(supabase, config, payload)\n }\n }\n\n const sendHeartbeat = async (\n supabase: GatewaySupabaseClient,\n status: GatewayStatus,\n capabilities: GatewayCapabilitiesV1,\n deviceName?: string | null\n ): Promise<void> => {\n const { error } = await supabase.functions.invoke('gateway-heartbeat', {\n body: {\n status,\n capabilities,\n device_name: deviceName,\n },\n })\n\n if (error) {\n dependencies.logError('Failed to send gateway heartbeat', { error: error.message })\n }\n }\n\n const loadGatewayControlState = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig\n ): Promise<GatewayControlState | null> => {\n const { data, error } = await supabase\n .from('team_gateways')\n .select('full_control_enabled, status, last_seen_at, capabilities')\n .eq('id', config.gatewayId)\n .eq('team_id', config.teamId)\n .maybeSingle()\n\n if (error) {\n dependencies.logError('Failed to load gateway control state', {\n gatewayId: config.gatewayId,\n teamId: config.teamId,\n error: error.message,\n })\n return null\n }\n\n if (!data) return null\n\n const parsedCapabilities = validateGatewayCapabilitiesV1(data.capabilities ?? null)\n\n return {\n full_control_enabled: data.full_control_enabled === true,\n status: typeof data.status === 'string' ? data.status : 'unknown',\n last_seen_at: typeof data.last_seen_at === 'string' ? data.last_seen_at : null,\n capabilities: parsedCapabilities.ok ? parsedCapabilities.value : null,\n }\n }\n\n const isHeartbeatFresh = (lastSeenAt: string | null): boolean => {\n if (!lastSeenAt) return false\n const parsed = Date.parse(lastSeenAt)\n if (!Number.isFinite(parsed)) return false\n return now() - parsed <= heartbeatStaleMs\n }\n\n const refreshRuntimeInstallFullControl = async (config: GatewayConfig): Promise<boolean> => {\n const options = dependencies.runtimeState.currentRuntimeOptions ?? undefined\n try {\n const latestConfig = await dependencies.loadConfig(options)\n const nextValue = latestConfig.full_control_enabled === true\n if (config.full_control_enabled !== nextValue) {\n config.full_control_enabled = nextValue\n if (dependencies.runtimeState.currentConfig) {\n dependencies.runtimeState.currentConfig.full_control_enabled = nextValue\n }\n dependencies.logInfo('Reloaded gateway host machine-control setting', {\n enabled: nextValue,\n })\n }\n } catch (error) {\n dependencies.logError('Failed to refresh gateway host machine-control setting', {\n error: error instanceof Error ? error.message : String(error),\n })\n }\n return config.full_control_enabled === true\n }\n\n return {\n createGatewayEventClient,\n emitGatewayEvent,\n queueGatewayEvent,\n flushGatewayEvents,\n sendHeartbeat,\n loadGatewayControlState,\n isHeartbeatFresh,\n refreshRuntimeInstallFullControl,\n }\n}\n", "import {\n deriveGatewayMachineControlState,\n isGatewayServiceReady,\n type GatewayCapabilitiesV1,\n} from '@panorama/shared/gateway/capabilities'\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport { execFile, type ChildProcess } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport type {\n GatewayHealthStatus,\n GatewayProviderCapabilities,\n GatewayProviderId,\n} from './cli-providers/types.js'\nimport type { Database } from './database.types.js'\nimport {\n claimGatewayJob,\n completeGatewayJob,\n findGatewayJobIdempotencyConflict,\n loadGatewayJobStatus,\n updateGatewayJobDebug,\n} from './gateway-job-store.js'\nimport { processGatewayJob } from './gateway-job-processor.js'\nimport type { GatewayJobRow, GatewayJobStatus } from './gateway-jobs.js'\nimport {\n handleGatewayModelRunJob,\n type ActiveModelRun,\n} from './gateway-model-run.js'\nimport {\n handleGatewayShellExecJob,\n type ActiveShellExecRun,\n} from './gateway-shell-exec.js'\nimport { handleGatewaySubagentRunJob } from './gateway-subagent-run-job.js'\nimport type {\n GatewaySubagentRunControlState,\n GatewaySubagentRunEventInsert,\n} from './gateway-subagent-run-types.js'\nimport type { ActiveSubagentRun } from './gateway-runtime-state.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport { handleSubagentCancelJob as handleSubagentCancelJobBase } from './subagent-cancel-job.js'\nimport { failSubagentRun as failSubagentRunBase } from './subagent-failure.js'\nimport type { ClaudeSupport } from './subagent-adapters/claude-support.js'\nimport type {\n SubagentCommandRunner,\n SubagentStreamingCommandRunner,\n} from './subagent-run-execution.js'\n\nconst execFileAsync = promisify(execFile)\n\ntype GatewaySupabaseClient = SupabaseClient<Database>\n\ntype GatewayChildTerminator = (\n child: ChildProcess | undefined,\n options: { reason: string; graceMs: number; context: string }\n) => void\n\nexport interface CreateGatewayJobHandlersParams {\n activeSubagentRuns: Map<string, ActiveSubagentRun>\n activeModelRuns: Map<string, ActiveModelRun>\n activeShellExecRuns: Map<string, ActiveShellExecRun>\n getProviderCapabilities: () => Record<GatewayProviderId, GatewayProviderCapabilities> | null\n getClaudeSupport: () => ClaudeSupport | null\n defaultClaudeTimeoutMs: number\n defaultRemoteShellExecTimeoutMs: number\n defaultSubagentTimeoutMs: number\n defaultModelRunTimeoutMs: number\n subagentCancelKillTimeoutMs: number\n processKillGraceMs: number\n buildGatewayChildEnv: () => NodeJS.ProcessEnv\n resolveClaudeCommand: () => string\n resolveCodexCommand: () => string\n resolveGeminiCommand: () => string\n refreshRuntimeInstallFullControl: (config: GatewayConfig) => Promise<boolean>\n loadGatewayControlState: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig\n ) => Promise<GatewaySubagentRunControlState | null>\n isHeartbeatFresh: (lastSeenAt: string | null) => boolean\n requestSubagentCancel: (\n subagentId: string,\n runId: string | null,\n reason: string\n ) => { active: boolean }\n getNextRunSequence: (supabase: GatewaySupabaseClient, subagentId: string) => Promise<number>\n getNextSubagentRunEventSequence: (\n supabase: GatewaySupabaseClient,\n runId: string\n ) => Promise<number>\n insertSubagentRunEvent: (params: GatewaySubagentRunEventInsert) => Promise<number | null>\n resolvePendingCancel: (\n subagentId: string,\n runId: string,\n metadata: Record<string, unknown>\n ) => string | null\n consumePendingCancelFromQueue: (subagentId: string, runId: string) => string | null\n clearPendingCancel: (subagentId: string, runId: string) => void\n resolveSubagentWorkdirRoot: () => string\n runCommand: SubagentCommandRunner\n runStreamingCommand: SubagentStreamingCommandRunner\n updateRuntimeProviderHealth: (params: {\n supabase: GatewaySupabaseClient\n providerId: GatewayProviderId\n status: GatewayHealthStatus\n error?: string | null\n context: string\n jobId?: string\n runId?: string\n }) => Promise<void>\n requestChildTermination: GatewayChildTerminator\n logInfo: (message: string, data?: Record<string, unknown>) => void\n logError: (message: string, data?: Record<string, unknown>) => void\n}\n\nexport interface GatewayJobHandlers {\n claimJob: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ) => Promise<GatewayJobRow | null>\n processJob: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ) => Promise<void>\n handleSubagentCancelJob: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ) => Promise<{ ok: boolean; result: Record<string, unknown>; error?: string }>\n completeJob: (\n supabase: GatewaySupabaseClient,\n jobId: string,\n status: GatewayJobStatus,\n result: Record<string, unknown> | null,\n errorMessage?: string\n ) => Promise<void>\n failSubagentRun: (\n supabase: GatewaySupabaseClient,\n job: GatewayJobRow,\n errorMessage: string\n ) => Promise<void>\n}\n\nasync function runClaudeVersionDiagnostic(params: {\n resolveClaudeCommand: () => string\n buildGatewayChildEnv: () => NodeJS.ProcessEnv\n timeoutMs: number\n}): Promise<{\n ok: boolean\n stdout: string\n stderr: string\n exitCode: number | null\n durationMs: number\n error?: string\n version?: string\n}> {\n const start = Date.now()\n const command = params.resolveClaudeCommand()\n try {\n const { stdout, stderr } = await execFileAsync(command, ['--version'], {\n timeout: params.timeoutMs,\n env: params.buildGatewayChildEnv(),\n })\n\n const durationMs = Date.now() - start\n const stdoutText = String(stdout)\n const trimmed = stdoutText.trim()\n return {\n ok: true,\n stdout: stdoutText,\n stderr: String(stderr),\n exitCode: 0,\n durationMs,\n version: trimmed || undefined,\n }\n } catch (error) {\n const durationMs = Date.now() - start\n const err = error as NodeJS.ErrnoException & { stdout?: string; stderr?: string; code?: number }\n return {\n ok: false,\n stdout: err.stdout ? String(err.stdout) : '',\n stderr: err.stderr ? String(err.stderr) : '',\n exitCode: typeof err.code === 'number' ? err.code : null,\n durationMs,\n error: err.message,\n }\n }\n}\n\nasync function validateMachineControlState(params: {\n supabase: GatewaySupabaseClient\n config: GatewayConfig\n refreshRuntimeInstallFullControl: (config: GatewayConfig) => Promise<boolean>\n loadGatewayControlState: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig\n ) => Promise<{\n full_control_enabled: boolean\n status: string\n last_seen_at: string | null\n capabilities: GatewayCapabilitiesV1 | null\n } | null>\n isHeartbeatFresh: (lastSeenAt: string | null) => boolean\n}): Promise<{ ok: boolean; message?: string }> {\n const installFullControlEnabled = await params.refreshRuntimeInstallFullControl(params.config)\n const gatewayControlState = await params.loadGatewayControlState(params.supabase, params.config)\n if (!gatewayControlState) {\n return {\n ok: false,\n message: 'Gateway control state unavailable',\n }\n }\n\n if (!params.isHeartbeatFresh(gatewayControlState.last_seen_at)) {\n return {\n ok: false,\n message: 'Gateway is offline or heartbeat is stale',\n }\n }\n\n const machineControl = deriveGatewayMachineControlState({\n gatewayEnabled: gatewayControlState.full_control_enabled,\n installEnabled: installFullControlEnabled,\n serviceReady: gatewayControlState.capabilities\n ? isGatewayServiceReady(gatewayControlState.capabilities, 'machine_control')\n : false,\n })\n if (!machineControl.effective) {\n return {\n ok: false,\n message: machineControl.reason ?? 'Gateway machine control is unavailable',\n }\n }\n\n return { ok: true }\n}\n\nexport function createGatewayJobHandlers(\n params: CreateGatewayJobHandlersParams\n): GatewayJobHandlers {\n const claimJob = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ): Promise<GatewayJobRow | null> => {\n return await claimGatewayJob(supabase, config, job, params.logError)\n }\n\n const findIdempotencyConflict = async (\n supabase: GatewaySupabaseClient,\n job: GatewayJobRow\n ): Promise<GatewayJobRow | null> => {\n return await findGatewayJobIdempotencyConflict(supabase, job, params.logError)\n }\n\n const completeJob = async (\n supabase: GatewaySupabaseClient,\n jobId: string,\n status: GatewayJobStatus,\n result: Record<string, unknown> | null,\n errorMessage?: string\n ): Promise<void> => {\n await completeGatewayJob(supabase, jobId, status, result, errorMessage, params.logError)\n }\n\n const updateJobDebug = async (\n supabase: GatewaySupabaseClient,\n jobId: string,\n debug: Record<string, unknown>\n ): Promise<void> => {\n await updateGatewayJobDebug(supabase, jobId, debug, params.logError)\n }\n\n const handleDiagnosticJob = async (): Promise<{\n ok: boolean\n result: Record<string, unknown>\n error?: string\n }> => {\n const output = await runClaudeVersionDiagnostic({\n resolveClaudeCommand: params.resolveClaudeCommand,\n buildGatewayChildEnv: params.buildGatewayChildEnv,\n timeoutMs: params.defaultClaudeTimeoutMs,\n })\n const command = params.resolveClaudeCommand()\n if (!output.ok) {\n return {\n ok: false,\n result: {\n command: `${command} --version`,\n stdout: output.stdout,\n stderr: output.stderr,\n exit_code: output.exitCode,\n duration_ms: output.durationMs,\n error: output.error,\n },\n error: output.error || 'Claude CLI check failed',\n }\n }\n\n return {\n ok: true,\n result: {\n command: `${command} --version`,\n stdout: output.stdout,\n stderr: output.stderr,\n exit_code: output.exitCode,\n duration_ms: output.durationMs,\n version: output.version,\n },\n }\n }\n\n const handleSubagentCancelJob = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ): Promise<{ ok: boolean; result: Record<string, unknown>; error?: string }> => {\n return await handleSubagentCancelJobBase({\n supabase,\n config,\n job,\n requestSubagentCancel: params.requestSubagentCancel,\n logError: params.logError,\n })\n }\n\n const handleSubagentRunJob = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ): Promise<{\n ok: boolean\n result: Record<string, unknown>\n jobStatus?: GatewayJobStatus\n skipSubagentFailure?: boolean\n error?: string\n }> => {\n return await handleGatewaySubagentRunJob({\n supabase,\n config,\n job,\n activeSubagentRuns: params.activeSubagentRuns,\n providerCapabilities: params.getProviderCapabilities(),\n claudeSupport: params.getClaudeSupport(),\n defaultTimeoutMs: params.defaultSubagentTimeoutMs,\n cancelKillTimeoutMs: params.subagentCancelKillTimeoutMs,\n refreshRuntimeInstallFullControl: params.refreshRuntimeInstallFullControl,\n loadGatewayControlState: params.loadGatewayControlState,\n isHeartbeatFresh: params.isHeartbeatFresh,\n resolveClaudeCommand: params.resolveClaudeCommand,\n resolveCodexCommand: params.resolveCodexCommand,\n resolveGeminiCommand: params.resolveGeminiCommand,\n getNextRunSequence: params.getNextRunSequence,\n getNextSubagentRunEventSequence: params.getNextSubagentRunEventSequence,\n insertSubagentRunEvent: params.insertSubagentRunEvent,\n resolvePendingCancel: params.resolvePendingCancel,\n consumePendingCancelFromQueue: params.consumePendingCancelFromQueue,\n clearPendingCancel: params.clearPendingCancel,\n resolveSubagentWorkdirRoot: params.resolveSubagentWorkdirRoot,\n runCommand: params.runCommand,\n runStreamingCommand: params.runStreamingCommand,\n updateRuntimeProviderHealth: params.updateRuntimeProviderHealth,\n requestChildTermination: params.requestChildTermination,\n logInfo: params.logInfo,\n logError: params.logError,\n })\n }\n\n const handleModelRunJob = async (\n supabase: GatewaySupabaseClient,\n job: GatewayJobRow\n ): Promise<{ ok: boolean; result: Record<string, unknown>; error?: string }> => {\n return await handleGatewayModelRunJob({\n job,\n defaultTimeoutMs: params.defaultModelRunTimeoutMs,\n processKillGraceMs: params.processKillGraceMs,\n activeModelRuns: params.activeModelRuns,\n runCommand: params.runCommand,\n updateJobDebug: (jobId, debug) => updateJobDebug(supabase, jobId, debug),\n updateProviderHealth: (providerId, status, errorMessage) =>\n params.updateRuntimeProviderHealth({\n supabase,\n providerId,\n status,\n error: errorMessage ?? null,\n context: 'model_run',\n jobId: job.id,\n }),\n requestChildTermination: params.requestChildTermination,\n })\n }\n\n const isGatewayJobCancelled = async (\n supabase: GatewaySupabaseClient,\n jobId: string\n ): Promise<boolean> => {\n const status = await loadGatewayJobStatus(supabase, jobId, params.logError)\n return status === 'cancelled'\n }\n\n const handleShellExecJob = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ): Promise<{ ok: boolean; result: Record<string, unknown>; error?: string }> => {\n return await handleGatewayShellExecJob({\n supabase,\n config,\n job,\n defaultTimeoutMs: params.defaultRemoteShellExecTimeoutMs,\n activeShellExecRuns: params.activeShellExecRuns,\n runCommand: params.runCommand,\n isJobCancelled: (jobId) => isGatewayJobCancelled(supabase, jobId),\n validateMachineControlState: () =>\n validateMachineControlState({\n supabase,\n config,\n refreshRuntimeInstallFullControl: params.refreshRuntimeInstallFullControl,\n loadGatewayControlState: params.loadGatewayControlState,\n isHeartbeatFresh: params.isHeartbeatFresh,\n }),\n processKillGraceMs: params.processKillGraceMs,\n requestChildTermination: params.requestChildTermination,\n logError: params.logError,\n })\n }\n\n const failSubagentRun = async (\n supabase: GatewaySupabaseClient,\n job: GatewayJobRow,\n errorMessage: string\n ): Promise<void> => {\n await failSubagentRunBase({\n supabase,\n job,\n errorMessage,\n logError: params.logError,\n })\n }\n\n const processJob = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ): Promise<void> => {\n await processGatewayJob(job, {\n claimJob: (nextJob) => claimJob(supabase, config, nextJob),\n findIdempotencyConflict: (claimedJob) => findIdempotencyConflict(supabase, claimedJob),\n completeJob: (jobId, status, result, errorMessage) =>\n completeJob(supabase, jobId, status, result, errorMessage),\n failSubagentRun: (claimedJob, errorMessage) =>\n failSubagentRun(supabase, claimedJob, errorMessage),\n handleDiagnosticJob,\n handleSubagentRunJob: (claimedJob) => handleSubagentRunJob(supabase, config, claimedJob),\n handleModelRunJob: (claimedJob) => handleModelRunJob(supabase, claimedJob),\n handleSubagentCancelJob: (claimedJob) =>\n handleSubagentCancelJob(supabase, config, claimedJob),\n handleShellExecJob: (claimedJob) => handleShellExecJob(supabase, config, claimedJob),\n logInfo: params.logInfo,\n })\n }\n\n return {\n claimJob,\n processJob,\n handleSubagentCancelJob,\n completeJob,\n failSubagentRun,\n }\n}\n", "const REDACTED_MARKER = '[REDACTED]'\nconst MAX_DEBUG_TEXT_CHARS = 200_000\nconst MAX_DEBUG_SHORT_TEXT_CHARS = 2_000\nconst MAX_DEBUG_COMMAND_CHARS = 512\nconst MAX_DEBUG_PATH_CHARS = 1024\nconst MAX_DEBUG_ARG_CHARS = 256\nconst MAX_DEBUG_ARGS = 128\nconst MAX_DEBUG_FILES = 128\nconst DEFAULT_SENSITIVE_VALUE_FLAGS = new Set([\n '-p',\n '--prompt',\n '--json-schema',\n '--system-prompt',\n '--append-system-prompt',\n])\n\nconst ALLOWED_DEBUG_FIELDS = new Set([\n 'provider_id',\n 'command',\n 'args',\n 'command_line',\n 'work_dir',\n 'prompt_chars',\n 'json_schema_chars',\n 'timeout_ms',\n 'output_mode',\n 'output_path',\n 'files',\n 'stdout',\n 'stdout_truncated',\n 'stdout_bytes',\n 'stderr',\n 'stderr_truncated',\n 'stderr_bytes',\n 'exit_code',\n 'duration_ms',\n 'timed_out',\n 'error_summary',\n])\n\nconst SENSITIVE_FIELD_KEY_PATTERN =\n /(?:access[_-]?token|refresh[_-]?token|api[_-]?key|service[_-]?role[_-]?key|secret|password|authorization|cookie|session(?:[_-]?id)?|(?:^|[_-])token(?:$|[_-])|prompt)/i\n\nconst SENSITIVE_ARG_FLAG_PATTERN =\n /^-{1,2}[a-z0-9][a-z0-9_-]*(?:token|key|secret|password|authorization|cookie|session|prompt)[a-z0-9_-]*$/i\nconst SENSITIVE_ARG_FLAG_WITH_VALUE_PATTERN =\n /^(-{1,2}[a-z0-9][a-z0-9_-]*(?:token|key|secret|password|authorization|cookie|session|prompt)[a-z0-9_-]*)(=)(.*)$/i\n\nconst OPENAI_KEY_PATTERN = /\\bsk-[a-z0-9]{16,}\\b/gi\nconst JWT_PATTERN = /\\beyJ[a-z0-9_-]{8,}\\.[a-z0-9_-]{8,}\\.[a-z0-9_-]{8,}\\b/gi\nconst BEARER_PATTERN = /\\bBearer\\s+[a-z0-9._~+/-]+=*/gi\nconst OPENAI_KEY_MATCH_PATTERN = /\\bsk-[a-z0-9]{16,}\\b/i\nconst JWT_MATCH_PATTERN = /\\beyJ[a-z0-9_-]{8,}\\.[a-z0-9_-]{8,}\\.[a-z0-9_-]{8,}\\b/i\nconst BEARER_MATCH_PATTERN = /\\bBearer\\s+[a-z0-9._~+/-]+=*/i\nconst SECRET_JSON_VALUE_PATTERN =\n /(\"(?:access[_-]?token|refresh[_-]?token|api[_-]?key|service[_-]?role[_-]?key|secret|password|authorization|cookie|session(?:[_-]?id)?|token)\"\\s*:\\s*\")([^\"]*)(\")/gi\nconst SECRET_PAIR_PATTERN =\n /(\\b(?:access[_-]?token|refresh[_-]?token|api[_-]?key|service[_-]?role[_-]?key|secret|password|authorization|cookie|session(?:[_-]?id)?|token)\\b\\s*[:=]\\s*)(?:\"[^\"]*\"|'[^']*'|[^\\s,;]+)/gi\n\nconst OUTPUT_MODE_ALLOWLIST = new Set(['stdout-json', 'file-json', 'stream-json'])\n\nexport interface SafeGatewayCommandDescriptorOptions {\n redactArgIndexes?: Iterable<number>\n redactLastArg?: boolean\n sensitiveValueFlags?: Iterable<string>\n}\n\nexport interface SafeGatewayCommandDescriptor {\n command: string\n args: string[]\n commandLine: string\n}\n\nfunction truncateText(value: string, limit: number): string {\n if (value.length <= limit) return value\n return value.slice(0, limit)\n}\n\nfunction sanitizeText(value: string, limit: number): string {\n if (!value) return ''\n\n let sanitized = value\n sanitized = sanitized.replace(SECRET_JSON_VALUE_PATTERN, `$1${REDACTED_MARKER}$3`)\n sanitized = sanitized.replace(SECRET_PAIR_PATTERN, `$1${REDACTED_MARKER}`)\n sanitized = sanitized.replace(BEARER_PATTERN, `Bearer ${REDACTED_MARKER}`)\n sanitized = sanitized.replace(JWT_PATTERN, REDACTED_MARKER)\n sanitized = sanitized.replace(OPENAI_KEY_PATTERN, REDACTED_MARKER)\n return truncateText(sanitized, limit)\n}\n\nfunction isSensitiveFieldKey(key: string): boolean {\n return SENSITIVE_FIELD_KEY_PATTERN.test(key)\n}\n\nfunction sanitizeBoolean(value: unknown): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined\n}\n\nfunction sanitizeFiniteNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction sanitizeStringValue(value: unknown, limit: number): string | undefined {\n return typeof value === 'string' ? sanitizeText(value, limit) : undefined\n}\n\nfunction sanitizePathValue(value: unknown): string | null | undefined {\n if (value === null) return null\n return sanitizeStringValue(value, MAX_DEBUG_PATH_CHARS)\n}\n\nfunction shouldRedactPositionalArg(arg: string): boolean {\n if (!arg.trim()) return false\n if (SENSITIVE_FIELD_KEY_PATTERN.test(arg)) return true\n if (OPENAI_KEY_MATCH_PATTERN.test(arg)) return true\n if (JWT_MATCH_PATTERN.test(arg)) return true\n if (BEARER_MATCH_PATTERN.test(arg)) return true\n if (/\\s/.test(arg)) return true\n if (arg.length > MAX_DEBUG_ARG_CHARS) return true\n return false\n}\n\nfunction sanitizeArgValue(arg: string): string {\n const matchesSensitiveFlagWithValue = arg.match(SENSITIVE_ARG_FLAG_WITH_VALUE_PATTERN)\n if (matchesSensitiveFlagWithValue) {\n return `${matchesSensitiveFlagWithValue[1]}=${REDACTED_MARKER}`\n }\n if (shouldRedactPositionalArg(arg)) {\n return `[REDACTED_CONTENT:${arg.length}]`\n }\n return sanitizeText(arg, MAX_DEBUG_ARG_CHARS)\n}\n\nfunction normalizeSensitiveValueFlags(options?: SafeGatewayCommandDescriptorOptions): Set<string> {\n const flags = new Set(DEFAULT_SENSITIVE_VALUE_FLAGS)\n for (const flag of options?.sensitiveValueFlags ?? []) {\n flags.add(flag)\n }\n return flags\n}\n\nfunction sanitizeArgs(\n value: unknown,\n options?: SafeGatewayCommandDescriptorOptions\n): string[] | undefined {\n if (!Array.isArray(value)) return undefined\n\n const sanitized: string[] = []\n let redactNextValue = false\n const sensitiveValueFlags = normalizeSensitiveValueFlags(options)\n const redactArgIndexes = new Set(options?.redactArgIndexes ?? [])\n const entries = value.slice(0, MAX_DEBUG_ARGS)\n for (const [index, entry] of entries.entries()) {\n if (typeof entry !== 'string') {\n sanitized.push('[INVALID_ARG]')\n redactNextValue = false\n continue\n }\n\n if (\n redactNextValue ||\n redactArgIndexes.has(index) ||\n (options?.redactLastArg === true && index === entries.length - 1)\n ) {\n sanitized.push(REDACTED_MARKER)\n redactNextValue = false\n continue\n }\n\n const trimmed = entry.trim()\n if (SENSITIVE_ARG_FLAG_PATTERN.test(trimmed) || sensitiveValueFlags.has(trimmed)) {\n sanitized.push(sanitizeText(trimmed, MAX_DEBUG_ARG_CHARS))\n redactNextValue = true\n continue\n }\n\n sanitized.push(sanitizeArgValue(entry))\n }\n\n return sanitized\n}\n\nfunction sanitizeFiles(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined\n const files = value\n .filter((entry): entry is string => typeof entry === 'string')\n .slice(0, MAX_DEBUG_FILES)\n .map((entry) => sanitizeText(entry, MAX_DEBUG_PATH_CHARS))\n return files\n}\n\nfunction sanitizeErrorSummaryValue(value: unknown, depth = 0): unknown {\n if (value === null || typeof value === 'boolean') return value\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined\n if (typeof value === 'string') return sanitizeText(value, MAX_DEBUG_SHORT_TEXT_CHARS)\n if (depth >= 2) return '[REDACTED_NESTED]'\n if (Array.isArray(value)) {\n return value.slice(0, 20).map((entry) => sanitizeErrorSummaryValue(entry, depth + 1))\n }\n if (typeof value === 'object') {\n const output: Record<string, unknown> = {}\n for (const [key, nestedValue] of Object.entries(value as Record<string, unknown>)) {\n if (isSensitiveFieldKey(key)) {\n output[key] = REDACTED_MARKER\n } else {\n const cleaned = sanitizeErrorSummaryValue(nestedValue, depth + 1)\n if (cleaned !== undefined) {\n output[key] = cleaned\n }\n }\n }\n return output\n }\n return undefined\n}\n\nfunction sanitizeErrorSummary(value: unknown): Record<string, unknown> | null | undefined {\n if (value === null) return null\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined\n\n const output: Record<string, unknown> = {}\n for (const [key, nestedValue] of Object.entries(value as Record<string, unknown>)) {\n if (isSensitiveFieldKey(key)) {\n output[key] = REDACTED_MARKER\n continue\n }\n const cleaned = sanitizeErrorSummaryValue(nestedValue, 0)\n if (cleaned !== undefined) {\n output[key] = cleaned\n }\n }\n return output\n}\n\nfunction sanitizeCommandLine(command: string | undefined, args: string[] | undefined, fallback: unknown): string | undefined {\n if (command && args) {\n const joined = args.length > 0 ? `${command} ${args.join(' ')}` : command\n return sanitizeText(joined, MAX_DEBUG_TEXT_CHARS)\n }\n return sanitizeStringValue(fallback, MAX_DEBUG_TEXT_CHARS)\n}\n\nexport function buildSafeGatewayCommandDescriptor(\n command: string,\n args: readonly string[],\n options?: SafeGatewayCommandDescriptorOptions\n): SafeGatewayCommandDescriptor {\n const sanitizedCommand = sanitizeStringValue(command, MAX_DEBUG_COMMAND_CHARS) ?? ''\n const sanitizedArgs = sanitizeArgs([...args], options) ?? []\n const commandLine =\n sanitizeCommandLine(sanitizedCommand, sanitizedArgs, null) ?? sanitizedCommand\n\n return {\n command: sanitizedCommand,\n args: sanitizedArgs,\n commandLine,\n }\n}\n\nexport function sanitizeGatewayDebugPayload(debug: Record<string, unknown>): Record<string, unknown> {\n const sanitized: Record<string, unknown> = {}\n\n const args = sanitizeArgs(debug.args)\n const command = sanitizeStringValue(debug.command, MAX_DEBUG_COMMAND_CHARS)\n const commandLine = sanitizeCommandLine(command, args, debug.command_line)\n\n for (const [key, rawValue] of Object.entries(debug)) {\n if (!ALLOWED_DEBUG_FIELDS.has(key)) {\n continue\n }\n\n switch (key) {\n case 'provider_id':\n if (typeof rawValue === 'string') {\n sanitized.provider_id = sanitizeText(rawValue, MAX_DEBUG_SHORT_TEXT_CHARS)\n }\n break\n case 'command':\n if (command !== undefined) {\n sanitized.command = command\n }\n break\n case 'args':\n if (args !== undefined) {\n sanitized.args = args\n }\n break\n case 'command_line':\n if (commandLine !== undefined) {\n sanitized.command_line = commandLine\n }\n break\n case 'work_dir':\n case 'output_path': {\n const cleaned = sanitizePathValue(rawValue)\n if (cleaned !== undefined) {\n sanitized[key] = cleaned\n }\n break\n }\n case 'files': {\n const files = sanitizeFiles(rawValue)\n if (files !== undefined) {\n sanitized.files = files\n }\n break\n }\n case 'prompt_chars':\n case 'json_schema_chars':\n case 'timeout_ms':\n case 'stdout_bytes':\n case 'stderr_bytes':\n case 'exit_code':\n case 'duration_ms': {\n const numberValue = sanitizeFiniteNumber(rawValue)\n if (numberValue !== undefined) {\n sanitized[key] = numberValue\n }\n break\n }\n case 'stdout':\n case 'stderr': {\n const cleaned = sanitizeStringValue(rawValue, MAX_DEBUG_TEXT_CHARS)\n if (cleaned !== undefined) {\n sanitized[key] = cleaned\n }\n break\n }\n case 'stdout_truncated':\n case 'stderr_truncated':\n case 'timed_out': {\n const boolValue = sanitizeBoolean(rawValue)\n if (boolValue !== undefined) {\n sanitized[key] = boolValue\n }\n break\n }\n case 'output_mode':\n if (typeof rawValue === 'string' && OUTPUT_MODE_ALLOWLIST.has(rawValue)) {\n sanitized.output_mode = rawValue\n }\n break\n case 'error_summary': {\n const errorSummary = sanitizeErrorSummary(rawValue)\n if (errorSummary !== undefined) {\n sanitized.error_summary = errorSummary\n }\n break\n }\n default:\n break\n }\n }\n\n return sanitized\n}\n", "import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport {\n DEFAULT_MODEL_SENTINEL,\n type GatewayCliProvider,\n type GatewayProviderCapabilities,\n type GatewayModelRunPlan,\n} from './types.js'\nimport {\n DEFAULT_CLAUDE_SUPPORT,\n parseClaudeSupport,\n toFlagRecord,\n type ClaudeSupport,\n} from '../subagent-adapters/claude-support.js'\nimport { normalizeGatewayModelOutput, parseClaudeJsonOutput } from './claude-utils.js'\nimport {\n buildProviderChildProcessEnv,\n resolveClaudeProviderCommand,\n} from '../provider-runtime-utils.js'\n\nconst execFileAsync = promisify(execFile)\n\nconst DEFAULT_CLAUDE_TIMEOUT_MS = 10_000\n\nasync function execClaudeHelp(): Promise<{ ok: boolean; stdout: string; stderr: string; error?: string } > {\n const command = resolveClaudeProviderCommand()\n try {\n const { stdout, stderr } = await execFileAsync(command, ['--help'], {\n timeout: DEFAULT_CLAUDE_TIMEOUT_MS,\n env: buildProviderChildProcessEnv(),\n })\n return { ok: true, stdout: String(stdout ?? ''), stderr: String(stderr ?? '') }\n } catch (error) {\n const err = error as NodeJS.ErrnoException & { stdout?: string; stderr?: string }\n return {\n ok: false,\n stdout: err.stdout ? String(err.stdout) : '',\n stderr: err.stderr ? String(err.stderr) : '',\n error: err.message,\n }\n }\n}\n\nasync function execClaudeVersion(): Promise<{ ok: boolean; version: string | null; error?: string } > {\n const command = resolveClaudeProviderCommand()\n try {\n const { stdout } = await execFileAsync(command, ['--version'], {\n timeout: DEFAULT_CLAUDE_TIMEOUT_MS,\n env: buildProviderChildProcessEnv(),\n })\n const version = String(stdout ?? '').trim()\n return { ok: true, version: version || null }\n } catch (error) {\n const err = error as NodeJS.ErrnoException\n return { ok: false, version: null, error: err.message }\n }\n}\n\nasync function detectClaudeSupport(): Promise<ClaudeSupport> {\n const help = await execClaudeHelp()\n if (!help.ok) return DEFAULT_CLAUDE_SUPPORT\n return parseClaudeSupport(`${help.stdout}\\n${help.stderr}`)\n}\n\nfunction appendClaudeIsolationArgs(args: string[], support: ClaudeSupport): void {\n if (support.settingSourcesFlag) {\n args.push('--setting-sources', 'local')\n }\n if (support.disableSlashCommandsFlag) {\n args.push('--disable-slash-commands')\n }\n}\n\nexport function createClaudeCliProvider(): GatewayCliProvider {\n let cachedSupport: ClaudeSupport | null = null\n\n return {\n id: 'claude_code',\n label: 'Claude Code',\n async detectCapabilities(): Promise<GatewayProviderCapabilities> {\n const versionInfo = await execClaudeVersion()\n const support = await detectClaudeSupport()\n cachedSupport = support\n return {\n available: versionInfo.ok,\n version: versionInfo.version ?? undefined,\n error: versionInfo.ok ? undefined : versionInfo.error,\n supported_flags: toFlagRecord(support),\n supports: {\n output_schema: support.jsonSchemaFlag,\n stream_json: support.outputFormatFlag && support.streamJsonFlag,\n tool_disable: support.toolsFlag || support.allowedToolsFlag,\n },\n }\n },\n buildModelRunPlan(context) {\n const support = cachedSupport ?? DEFAULT_CLAUDE_SUPPORT\n const command = resolveClaudeProviderCommand()\n const args: string[] = [\n '--print',\n '--output-format',\n 'json',\n '--json-schema',\n JSON.stringify(context.jsonSchema),\n ]\n\n if (context.model !== DEFAULT_MODEL_SENTINEL) {\n args.splice(1, 0, '--model', context.model)\n }\n\n if (support.toolsFlag) {\n args.push('--tools', '')\n } else if (support.allowedToolsFlag) {\n args.push('--allowedTools', '')\n }\n\n if (support.inputFormatFlag) {\n args.push('--input-format', 'text')\n }\n if (support.noSessionPersistenceFlag) {\n args.push('--no-session-persistence')\n }\n if (support.permissionModeFlag) {\n args.push('--permission-mode', 'dontAsk')\n }\n\n appendClaudeIsolationArgs(args, support)\n\n if (context.appendSystemPrompt) {\n if (support.systemPromptFlag) {\n args.push('--system-prompt', context.appendSystemPrompt)\n } else if (support.appendSystemPromptFlag) {\n args.push('--append-system-prompt', context.appendSystemPrompt)\n }\n }\n\n args.push(context.prompt)\n\n return {\n command,\n args,\n env: buildProviderChildProcessEnv(),\n outputFormat: 'json',\n outputMode: 'stdout-json',\n timeoutMs: typeof context.timeoutMs === 'number' ? context.timeoutMs : null,\n debug: {\n command,\n args,\n prompt_chars: context.prompt.length,\n },\n }\n },\n normalizeModelRunResult({ stdout }) {\n const parsed = parseClaudeJsonOutput(stdout)\n if (!parsed.parsed) {\n throw new Error(parsed.error ?? 'Failed to parse Claude output')\n }\n const normalized = normalizeGatewayModelOutput(parsed.parsed)\n return {\n output: normalized.output,\n raw: parsed.parsed,\n usage: normalized.usage,\n model: normalized.model,\n }\n },\n }\n}\n", "import type {\n GatewayHealthCheckType,\n GatewayHealthStatus,\n GatewayProviderCapabilities,\n GatewayProviderHealth,\n GatewayProviderId,\n GatewayProviderSupports,\n} from '@panorama/shared/gateway/capabilities'\nimport type { ReasoningMode } from '@panorama/shared'\n\nexport type {\n GatewayHealthCheckType,\n GatewayHealthStatus,\n GatewayProviderCapabilities,\n GatewayProviderHealth,\n GatewayProviderId,\n GatewayProviderSupports,\n}\n\nexport type GatewayModelOutputMode = 'stdout-json' | 'file-json' | 'stream-json'\n\nexport const DEFAULT_MODEL_SENTINEL = '__default__' as const\n\nexport interface GatewayModelRunContext {\n model: string\n prompt: string\n jsonSchema: Record<string, unknown>\n appendSystemPrompt?: string\n reasoningEffort?: Exclude<ReasoningMode, 'none'>\n timeoutMs?: number\n}\n\nexport interface GatewaySchemaNormalization {\n schema: Record<string, unknown>\n promptSuffix?: string\n}\n\nexport interface GatewayModelRunPlan {\n command: string\n args: string[]\n env?: NodeJS.ProcessEnv\n outputFormat: 'json' | 'text' | 'stream-json'\n outputMode: GatewayModelOutputMode\n outputPath?: string\n files?: Array<{ path: string; contents: string }>\n timeoutMs: number | null\n debug?: Record<string, unknown>\n}\n\nexport interface GatewayModelRunNormalized {\n output: Record<string, unknown>\n raw: Record<string, unknown>\n usage: Record<string, unknown> | null\n model: string | null\n}\n\nexport interface GatewayCliProvider {\n id: GatewayProviderId\n label: string\n detectCapabilities: () => Promise<GatewayProviderCapabilities>\n normalizeSchema?: (schema: Record<string, unknown>) => GatewaySchemaNormalization\n buildModelRunPlan: (context: GatewayModelRunContext) => GatewayModelRunPlan\n normalizeModelRunResult: (params: {\n stdout: string\n outputFormat: GatewayModelRunPlan['outputFormat']\n outputMode: GatewayModelRunPlan['outputMode']\n outputPath?: string\n workDir: string\n }) => GatewayModelRunNormalized\n}\n", "export interface ClaudeSupport {\n toolsFlag: boolean\n allowedToolsFlag: boolean\n disallowedToolsFlag: boolean\n outputFormatFlag: boolean\n streamJsonFlag: boolean\n modelFlag: boolean\n jsonSchemaFlag: boolean\n appendSystemPromptFlag: boolean\n systemPromptFlag: boolean\n includePartialMessagesFlag: boolean\n permissionModeFlag: boolean\n maxBudgetFlag: boolean\n inputFormatFlag: boolean\n betasFlag: boolean\n noSessionPersistenceFlag: boolean\n sessionIdFlag: boolean\n resumeFlag: boolean\n verboseFlag: boolean\n settingsFlag: boolean\n settingSourcesFlag: boolean\n disableSlashCommandsFlag: boolean\n strictMcpConfigFlag: boolean\n mcpConfigFlag: boolean\n pluginDirFlag: boolean\n dangerouslySkipPermissionsFlag: boolean\n allowDangerouslySkipPermissionsFlag: boolean\n}\n\nexport const DEFAULT_CLAUDE_SUPPORT: ClaudeSupport = {\n toolsFlag: false,\n allowedToolsFlag: true,\n disallowedToolsFlag: true,\n outputFormatFlag: true,\n streamJsonFlag: false,\n modelFlag: false,\n jsonSchemaFlag: false,\n appendSystemPromptFlag: false,\n systemPromptFlag: true,\n includePartialMessagesFlag: false,\n permissionModeFlag: false,\n maxBudgetFlag: false,\n inputFormatFlag: false,\n betasFlag: false,\n noSessionPersistenceFlag: false,\n sessionIdFlag: false,\n resumeFlag: false,\n verboseFlag: false,\n settingsFlag: false,\n settingSourcesFlag: false,\n disableSlashCommandsFlag: false,\n strictMcpConfigFlag: false,\n mcpConfigFlag: false,\n pluginDirFlag: false,\n dangerouslySkipPermissionsFlag: false,\n allowDangerouslySkipPermissionsFlag: false,\n}\n\nexport function coerceClaudeSupport(flags?: Record<string, boolean> | null): ClaudeSupport {\n if (!flags) return DEFAULT_CLAUDE_SUPPORT\n return {\n ...DEFAULT_CLAUDE_SUPPORT,\n ...flags,\n }\n}\n\nexport function toFlagRecord(flags: ClaudeSupport): Record<string, boolean> {\n return Object.fromEntries(\n Object.entries(flags).map(([key, value]) => [key, Boolean(value)])\n )\n}\n\nexport function parseClaudeSupport(helpText: string): ClaudeSupport {\n const text = helpText.toLowerCase()\n const hasFlag = (flag: string) => text.includes(flag.toLowerCase())\n\n return {\n ...DEFAULT_CLAUDE_SUPPORT,\n toolsFlag: hasFlag('--tools'),\n allowedToolsFlag: hasFlag('--allowedtools') || hasFlag('--allowed-tools'),\n disallowedToolsFlag: hasFlag('--disallowedtools') || hasFlag('--disallowed-tools'),\n outputFormatFlag: hasFlag('--output-format'),\n streamJsonFlag: text.includes('stream-json'),\n modelFlag: hasFlag('--model'),\n jsonSchemaFlag: hasFlag('--json-schema'),\n appendSystemPromptFlag: hasFlag('--append-system-prompt'),\n systemPromptFlag: hasFlag('--system-prompt'),\n includePartialMessagesFlag: hasFlag('--include-partial-messages'),\n permissionModeFlag: hasFlag('--permission-mode'),\n maxBudgetFlag: hasFlag('--max-budget-usd'),\n inputFormatFlag: hasFlag('--input-format'),\n betasFlag: hasFlag('--betas'),\n noSessionPersistenceFlag: hasFlag('--no-session-persistence'),\n sessionIdFlag: hasFlag('--session-id'),\n resumeFlag: hasFlag('--resume'),\n verboseFlag: hasFlag('--verbose'),\n settingsFlag: hasFlag('--settings'),\n settingSourcesFlag: hasFlag('--setting-sources'),\n disableSlashCommandsFlag: hasFlag('--disable-slash-commands'),\n strictMcpConfigFlag: hasFlag('--strict-mcp-config'),\n mcpConfigFlag: hasFlag('--mcp-config'),\n pluginDirFlag: hasFlag('--plugin-dir'),\n dangerouslySkipPermissionsFlag: hasFlag('--dangerously-skip-permissions'),\n allowDangerouslySkipPermissionsFlag: hasFlag('--allow-dangerously-skip-permissions'),\n }\n}\n", "export function parseClaudeJsonOutput(stdout: string): { parsed: Record<string, unknown> | null; error?: string } {\n if (!stdout) return { parsed: null, error: 'Empty Claude output' }\n const trimmed = stdout.trim()\n if (!trimmed) return { parsed: null, error: 'Empty Claude output' }\n\n const tryParse = (value: string): Record<string, unknown> | null => {\n try {\n const parsed = JSON.parse(value) as Record<string, unknown>\n return parsed\n } catch {\n return null\n }\n }\n\n const direct = tryParse(trimmed)\n if (direct) return { parsed: direct }\n\n const lines = trimmed\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n for (const line of lines) {\n const parsed = tryParse(line)\n if (parsed) return { parsed }\n }\n\n const firstBrace = trimmed.indexOf('{')\n const lastBrace = trimmed.lastIndexOf('}')\n if (firstBrace !== -1 && lastBrace !== -1 && lastBrace > firstBrace) {\n const slice = trimmed.slice(firstBrace, lastBrace + 1)\n const parsed = tryParse(slice)\n if (parsed) return { parsed }\n }\n\n return {\n parsed: null,\n error: 'Failed to parse Claude JSON output',\n }\n}\n\nexport function normalizeGatewayModelOutput(parsed: Record<string, unknown>): {\n output: Record<string, unknown>\n usage: Record<string, unknown> | null\n model: string | null\n} {\n let outputCandidate =\n (parsed.structured_output ??\n parsed.structuredOutput ??\n parsed.output ??\n parsed.tool_call ??\n parsed.toolCall) ??\n null\n\n if (!outputCandidate && typeof parsed.result === 'string') {\n try {\n outputCandidate = JSON.parse(parsed.result) as Record<string, unknown>\n } catch {\n outputCandidate = null\n }\n }\n\n if (!outputCandidate || typeof outputCandidate !== 'object') {\n throw new Error('Claude output missing structured JSON payload')\n }\n\n const usage =\n (parsed.usage as Record<string, unknown> | undefined) ??\n (parsed.usage_metadata as Record<string, unknown> | undefined) ??\n null\n\n const model =\n typeof parsed.model === 'string'\n ? parsed.model\n : typeof parsed.provider_model === 'string'\n ? parsed.provider_model\n : null\n\n return {\n output: outputCandidate as Record<string, unknown>,\n usage,\n model,\n }\n}\n", "import path from 'node:path'\nimport process from 'node:process'\nimport { buildGatewayChildProcessEnv } from './child-process-env.js'\nimport {\n resolveClaudeCommand,\n resolveCodexCommand,\n resolveGeminiCommand,\n type ResolveProviderCommandOptions,\n} from './cli-provider-commands.js'\nimport { resolveGatewayTmpDir } from './runtime-paths.js'\n\nexport interface ProviderChildProcessEnvOptions {\n baseEnv?: NodeJS.ProcessEnv\n tmpDir?: string\n overrides?: NodeJS.ProcessEnv\n}\n\nexport interface GeminiProviderChildProcessEnvOptions extends ProviderChildProcessEnvOptions {\n systemPromptPath?: string\n commandPath?: string\n}\n\nexport interface ParseProviderJsonFromTextOptions {\n stripCodeFence?: boolean\n errorMessage?: string\n}\n\nexport function resolveClaudeProviderCommand(\n options: ResolveProviderCommandOptions = {}\n): string {\n return resolveClaudeCommand(options)\n}\n\nexport function resolveCodexProviderCommand(options: ResolveProviderCommandOptions = {}): string {\n return resolveCodexCommand(options)\n}\n\nexport function resolveGeminiProviderCommand(options: ResolveProviderCommandOptions = {}): string {\n return resolveGeminiCommand(options)\n}\n\nexport function buildProviderChildProcessEnv(\n options: ProviderChildProcessEnvOptions = {}\n): NodeJS.ProcessEnv {\n return buildGatewayChildProcessEnv({\n baseEnv: options.baseEnv,\n tmpDir: options.tmpDir ?? resolveGatewayTmpDir(),\n overrides: options.overrides,\n })\n}\n\nexport function withProviderPathEntries(current: string | undefined, entries: string[]): string {\n const parts = (current ?? '')\n .split(path.delimiter)\n .map((entry) => entry.trim())\n .filter(Boolean)\n const seen = new Set(parts)\n for (const entry of entries) {\n if (!entry || seen.has(entry)) continue\n parts.unshift(entry)\n seen.add(entry)\n }\n return parts.join(path.delimiter)\n}\n\nexport function ensureNodeAndCommandPath(env: NodeJS.ProcessEnv, commandPath: string): void {\n const entries: string[] = []\n const nodeDir = path.dirname(process.execPath)\n if (nodeDir) entries.push(nodeDir)\n if (commandPath && path.isAbsolute(commandPath)) {\n entries.push(path.dirname(commandPath))\n }\n if (entries.length > 0) {\n env.PATH = withProviderPathEntries(env.PATH, entries)\n }\n}\n\nexport function buildGeminiProviderChildProcessEnv(\n options: GeminiProviderChildProcessEnvOptions = {}\n): NodeJS.ProcessEnv {\n const env = buildProviderChildProcessEnv(options)\n if (options.systemPromptPath) {\n env.GEMINI_SYSTEM_MD = options.systemPromptPath\n }\n const commandPath =\n options.commandPath ??\n resolveGeminiProviderCommand({ env: options.baseEnv ?? process.env })\n ensureNodeAndCommandPath(env, commandPath)\n return env\n}\n\nexport function stripProviderCodeFence(text: string): string {\n const trimmed = text.trim()\n if (trimmed.startsWith('```')) {\n return trimmed.replace(/^```(?:json)?\\n?/i, '').replace(/```$/i, '').trim()\n }\n return trimmed\n}\n\nexport function parseProviderJsonFromText(\n text: string,\n options: ParseProviderJsonFromTextOptions = {}\n): Record<string, unknown> {\n const cleaned = options.stripCodeFence ? stripProviderCodeFence(text) : text.trim()\n const tryParse = (value: string): Record<string, unknown> | null => {\n try {\n return JSON.parse(value) as Record<string, unknown>\n } catch {\n return null\n }\n }\n\n const direct = tryParse(cleaned)\n if (direct) return direct\n\n const lines = cleaned\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n for (const line of lines) {\n const parsed = tryParse(line)\n if (parsed) return parsed\n }\n\n const firstBrace = cleaned.indexOf('{')\n const lastBrace = cleaned.lastIndexOf('}')\n if (firstBrace !== -1 && lastBrace > firstBrace) {\n const slice = cleaned.slice(firstBrace, lastBrace + 1)\n const parsed = tryParse(slice)\n if (parsed) return parsed\n }\n\n throw new Error(options.errorMessage ?? 'Failed to parse JSON output')\n}\n", "import { execFile } from 'node:child_process'\nimport fsSync from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { promisify } from 'node:util'\nimport { getStringOption, type ParsedArgs } from './cli-args.js'\nimport {\n collectCommandCandidates,\n compareVersions,\n extractVersion,\n resolveClaudeFallbackCommand,\n type CommandDiscoveryOptions,\n} from './cli-command-discovery.js'\n\nconst execFileAsync = promisify(execFile)\nconst DEFAULT_COMMAND_PROBE_TIMEOUT_MS = 5_000\nconst DEFAULT_SHELL_RESOLUTION_TIMEOUT_MS = 2_000\n\nexport type ProviderCommandSource = 'override' | 'detected' | 'fallback'\n\nexport interface CommandVersionProbeResult {\n ok: boolean\n version: string | null\n error?: string\n}\n\nexport interface ShellCommandResolution {\n kind: 'alias' | 'function' | 'path'\n detail: string\n path?: string\n}\n\nexport type CommandProbeExec = (\n command: string,\n args: string[],\n options: { timeout: number; env?: NodeJS.ProcessEnv }\n) => Promise<{ stdout?: unknown; stderr?: unknown }>\n\nexport type ProviderCommandLogger = (\n message: string,\n data?: Record<string, unknown>\n) => void\n\nexport interface ProbeCommandVersionOptions {\n env?: NodeJS.ProcessEnv\n timeoutMs?: number\n execFile?: CommandProbeExec\n}\n\nexport interface ProbeShellResolutionOptions {\n shell?: string\n timeoutMs?: number\n execFile?: CommandProbeExec\n}\n\nexport interface ResolveProviderCommandOptions {\n options?: ParsedArgs['options']\n env?: NodeJS.ProcessEnv\n homeDir?: string\n defaultClaudePath?: string\n logInfo?: ProviderCommandLogger\n}\n\nexport interface SelectBestCommandOptions {\n label: string\n command: string\n override?: string\n extraCandidates?: string[]\n discoveryOptions?: CommandDiscoveryOptions\n probeCommand?: (command: string) => Promise<CommandVersionProbeResult>\n logInfo?: ProviderCommandLogger\n}\n\nlet claudeWrapperFallbackLogged = false\n\nfunction toOutputString(value: unknown): string {\n if (value === null || value === undefined) return ''\n return String(value)\n}\n\nexport function getDefaultClaudePath(homeDir: string = os.homedir()): string {\n return path.join(homeDir, '.claude', 'local', 'claude')\n}\n\nfunction logClaudeWrapperFallbackOnce(\n wrapper: string,\n fallback: string,\n logInfo?: ProviderCommandLogger\n): void {\n if (claudeWrapperFallbackLogged) return\n claudeWrapperFallbackLogged = true\n logInfo?.('Claude CLI wrapper missing target; falling back to alternate command', {\n wrapper,\n fallback,\n })\n}\n\nexport function resolveClaudeCommand(params: ResolveProviderCommandOptions = {}): string {\n const env = params.env ?? process.env\n const options = params.options ?? {}\n const homeDir = params.homeDir ?? os.homedir()\n const defaultClaudePath = params.defaultClaudePath ?? getDefaultClaudePath(homeDir)\n const discoveryOptions: CommandDiscoveryOptions = { env, homeDir }\n const override =\n getStringOption(options, 'claude-cli') || env.PANORAMA_CLAUDE_CLI || env.CLAUDE_CLI\n\n if (override) {\n const fallback = resolveClaudeFallbackCommand(override, discoveryOptions)\n if (fallback) {\n logClaudeWrapperFallbackOnce(override, fallback, params.logInfo)\n return fallback\n }\n return override\n }\n\n if (fsSync.existsSync(defaultClaudePath)) {\n const fallback = resolveClaudeFallbackCommand(defaultClaudePath, discoveryOptions)\n if (fallback) {\n logClaudeWrapperFallbackOnce(defaultClaudePath, fallback, params.logInfo)\n return fallback\n }\n return defaultClaudePath\n }\n\n return 'claude'\n}\n\nexport function resolveCodexCommand(params: ResolveProviderCommandOptions = {}): string {\n const env = params.env ?? process.env\n const options = params.options ?? {}\n return getStringOption(options, 'codex-cli') || env.PANORAMA_CODEX_CLI || env.CODEX_CLI || 'codex'\n}\n\nexport function resolveGeminiCommand(params: ResolveProviderCommandOptions = {}): string {\n const env = params.env ?? process.env\n const options = params.options ?? {}\n return (\n getStringOption(options, 'gemini-cli') || env.PANORAMA_GEMINI_CLI || env.GEMINI_CLI || 'gemini'\n )\n}\n\nexport async function probeCommandVersion(\n command: string,\n options: ProbeCommandVersionOptions = {}\n): Promise<CommandVersionProbeResult> {\n const exec = options.execFile ?? execFileAsync\n try {\n const { stdout, stderr } = await exec(command, ['--version'], {\n timeout: options.timeoutMs ?? DEFAULT_COMMAND_PROBE_TIMEOUT_MS,\n env: options.env,\n })\n const output = `${toOutputString(stdout)}\\n${toOutputString(stderr)}`\n return { ok: true, version: extractVersion(output) }\n } catch (error) {\n const err = error as NodeJS.ErrnoException\n return { ok: false, version: null, error: err.message }\n }\n}\n\nexport async function probeShellResolution(\n command: string,\n options: ProbeShellResolutionOptions = {}\n): Promise<ShellCommandResolution | null> {\n const shell = options.shell ?? process.env.SHELL\n if (!shell) return null\n\n const exec = options.execFile ?? execFileAsync\n try {\n const { stdout, stderr } = await exec(shell, ['-lc', `type -a ${command}`], {\n timeout: options.timeoutMs ?? DEFAULT_SHELL_RESOLUTION_TIMEOUT_MS,\n })\n const output = `${toOutputString(stdout)}\\n${toOutputString(stderr)}`.trim()\n if (!output) return null\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n\n for (const line of lines) {\n const lower = line.toLowerCase()\n if (lower.includes('alias')) {\n return { kind: 'alias', detail: line }\n }\n }\n\n for (const line of lines) {\n const lower = line.toLowerCase()\n if (lower.includes('function')) {\n return { kind: 'function', detail: line }\n }\n }\n\n for (const line of lines) {\n const match = line.match(/\\bis\\s+(\\/\\S+)/)\n if (match) {\n return { kind: 'path', detail: line, path: match[1] }\n }\n }\n } catch {\n return null\n }\n\n return null\n}\n\nexport async function selectBestCommand(options: SelectBestCommandOptions): Promise<{\n command: string\n version: string | null\n source: ProviderCommandSource\n}> {\n const { label, command, override } = options\n const extraCandidates = options.extraCandidates ?? []\n const probeCommand = options.probeCommand ?? ((candidate) => probeCommandVersion(candidate))\n\n if (override) {\n const result = await probeCommand(override)\n if (!result.ok) {\n options.logInfo?.(`${label} CLI override failed version check`, {\n command: override,\n error: result.error,\n })\n }\n return { command: override, version: result.version, source: 'override' }\n }\n\n const candidates = collectCommandCandidates(\n command,\n extraCandidates,\n options.discoveryOptions ?? {}\n )\n let best: { command: string; version: string | null } | null = null\n\n for (const candidate of candidates) {\n const result = await probeCommand(candidate)\n if (!result.ok) continue\n if (!best) {\n best = { command: candidate, version: result.version }\n continue\n }\n if (result.version && !best.version) {\n best = { command: candidate, version: result.version }\n continue\n }\n if (result.version && best.version && compareVersions(result.version, best.version) > 0) {\n best = { command: candidate, version: result.version }\n }\n }\n\n if (best) {\n return { command: best.command, version: best.version, source: 'detected' }\n }\n\n return { command, version: null, source: 'fallback' }\n}\n", "import fsSync from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\n\nconst DEFAULT_MAX_CLAUDE_WRAPPER_BYTES = 4096\n\nexport interface CommandDiscoveryOptions {\n env?: NodeJS.ProcessEnv\n homeDir?: string\n platform?: NodeJS.Platform\n maxClaudeWrapperBytes?: number\n}\n\nfunction resolveOptions(options: CommandDiscoveryOptions = {}): Required<CommandDiscoveryOptions> {\n return {\n env: options.env ?? process.env,\n homeDir: options.homeDir ?? os.homedir(),\n platform: options.platform ?? process.platform,\n maxClaudeWrapperBytes: options.maxClaudeWrapperBytes ?? DEFAULT_MAX_CLAUDE_WRAPPER_BYTES,\n }\n}\n\nexport function expandHomePath(value: string, homeDir: string = os.homedir()): string {\n if (value.startsWith('~/')) {\n return path.join(homeDir, value.slice(2))\n }\n return value\n}\n\nexport function extractClaudeWrapperTarget(\n commandPath: string,\n options: CommandDiscoveryOptions = {}\n): string | null {\n const { homeDir, maxClaudeWrapperBytes } = resolveOptions(options)\n try {\n const stat = fsSync.statSync(commandPath)\n if (!stat.isFile() || stat.size > maxClaudeWrapperBytes) return null\n const raw = fsSync.readFileSync(commandPath, 'utf8')\n const match = raw.match(/exec\\s+(?:\"([^\"]+)\"|'([^']+)'|([^\\s]+))/)\n const target = match?.[1] ?? match?.[2] ?? match?.[3]\n if (!target) return null\n return expandHomePath(target, homeDir)\n } catch {\n return null\n }\n}\n\nexport function isBrokenClaudeWrapper(\n commandPath: string,\n options: CommandDiscoveryOptions = {}\n): boolean {\n const target = extractClaudeWrapperTarget(commandPath, options)\n if (!target) return false\n try {\n return !fsSync.existsSync(target)\n } catch {\n return false\n }\n}\n\nexport function isExecutableCandidate(\n candidate: string,\n platform: NodeJS.Platform = process.platform\n): boolean {\n try {\n const stat = fsSync.statSync(candidate)\n if (!stat.isFile()) return false\n if (platform === 'win32') return true\n fsSync.accessSync(candidate, fsSync.constants.X_OK)\n return true\n } catch {\n return false\n }\n}\n\nexport function collectBinDirs(options: CommandDiscoveryOptions = {}): string[] {\n const { env, homeDir, platform } = resolveOptions(options)\n const dirs = new Set<string>()\n\n const addDir = (dir?: string | null) => {\n if (!dir) return\n const resolved = expandHomePath(dir, homeDir)\n if (!resolved) return\n dirs.add(path.resolve(resolved))\n }\n\n const addPrefixBin = (prefix?: string | null) => {\n if (!prefix) return\n const resolved = expandHomePath(prefix, homeDir)\n if (!resolved) return\n dirs.add(path.resolve(resolved, 'bin'))\n }\n\n addDir(env.PNPM_HOME)\n addPrefixBin(env.NPM_CONFIG_PREFIX)\n addPrefixBin(env.npm_config_prefix)\n addDir(env.VOLTA_HOME ? path.join(env.VOLTA_HOME, 'bin') : null)\n addDir(env.BUN_INSTALL ? path.join(env.BUN_INSTALL, 'bin') : null)\n addPrefixBin(env.HOMEBREW_PREFIX)\n addPrefixBin(env.BREW_PREFIX)\n if (env.ASDF_DATA_DIR) {\n addDir(path.join(env.ASDF_DATA_DIR, 'shims'))\n }\n\n if (platform === 'darwin') {\n addDir('/opt/homebrew/bin')\n addDir('/usr/local/bin')\n addDir(path.join(homeDir, 'Library', 'pnpm'))\n }\n\n if (platform !== 'win32') {\n addDir('/usr/local/bin')\n addDir('/usr/bin')\n addDir('/bin')\n addDir(path.join(homeDir, '.local', 'bin'))\n addDir(path.join(homeDir, 'bin'))\n addDir(path.join(homeDir, '.npm-global', 'bin'))\n addDir(path.join(homeDir, '.nvm', 'versions', 'node', 'current', 'bin'))\n addDir(path.join(homeDir, '.asdf', 'shims'))\n addDir(path.join(homeDir, '.nix-profile', 'bin'))\n }\n\n const pathDelimiter = platform === 'win32' ? ';' : ':'\n const pathEntries = (env.PATH ?? '')\n .split(pathDelimiter)\n .map((entry) => entry.trim())\n .filter(Boolean)\n for (const entry of pathEntries) {\n addDir(entry)\n }\n\n return Array.from(dirs)\n}\n\nexport function expandCommandExtensions(\n command: string,\n options: Pick<CommandDiscoveryOptions, 'env' | 'platform'> = {}\n): string[] {\n const env = options.env ?? process.env\n const platform = options.platform ?? process.platform\n if (platform !== 'win32') return [command]\n const extList = (env.PATHEXT ?? '.EXE;.CMD;.BAT')\n .split(';')\n .map((entry) => entry.trim())\n .filter(Boolean)\n return extList.map((ext) => `${command}${ext.toLowerCase()}`)\n}\n\nexport function collectCommandCandidates(\n command: string,\n extraCandidates: string[],\n options: CommandDiscoveryOptions = {}\n): string[] {\n const resolvedOptions = resolveOptions(options)\n const candidates = new Set<string>()\n\n const addCandidate = (value: string) => {\n if (!value) return\n const resolved = expandHomePath(value, resolvedOptions.homeDir)\n candidates.add(resolved)\n }\n\n extraCandidates.forEach(addCandidate)\n\n const binDirs = collectBinDirs(resolvedOptions)\n const extensions = expandCommandExtensions(command, resolvedOptions)\n for (const dir of binDirs) {\n for (const extCommand of extensions) {\n const candidate = path.join(dir, extCommand)\n if (isExecutableCandidate(candidate, resolvedOptions.platform)) {\n candidates.add(candidate)\n }\n }\n }\n\n candidates.add(command)\n\n return Array.from(candidates)\n}\n\nexport function resolveClaudeFallbackCommand(\n commandPath: string,\n options: CommandDiscoveryOptions = {}\n): string | null {\n const resolvedOptions = resolveOptions(options)\n if (!isBrokenClaudeWrapper(commandPath, resolvedOptions)) return null\n\n const excluded = new Set<string>()\n const addExcluded = (value: string) => {\n if (!value) return\n excluded.add(path.resolve(value))\n try {\n excluded.add(fsSync.realpathSync(value))\n } catch {\n // ignore realpath errors\n }\n }\n\n addExcluded(commandPath)\n\n const candidates = [path.join(resolvedOptions.homeDir, '.claude', 'claude')]\n for (const candidate of candidates) {\n if (excluded.has(path.resolve(candidate))) continue\n if (isExecutableCandidate(candidate, resolvedOptions.platform)) return candidate\n }\n\n const extensions = expandCommandExtensions('claude', resolvedOptions)\n for (const dir of collectBinDirs(resolvedOptions)) {\n for (const extCommand of extensions) {\n const candidate = path.join(dir, extCommand)\n if (excluded.has(path.resolve(candidate))) continue\n if (isExecutableCandidate(candidate, resolvedOptions.platform)) return candidate\n }\n }\n\n return null\n}\n\nexport function extractVersion(text: string): string | null {\n const normalized = text.trim()\n if (!normalized) return null\n const match = normalized.match(/v?(\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?)/)\n if (match?.[1]) return match[1]\n const fallback = normalized.match(/v?(\\d+\\.\\d+)/)\n if (fallback?.[1]) return `${fallback[1]}.0`\n return null\n}\n\nexport function compareVersions(a: string, b: string): number {\n const parse = (value: string) => {\n const cleaned = value.replace(/^v/i, '')\n const [main, pre] = cleaned.split('-', 2)\n const parts = main.split('.').map((part) => Number.parseInt(part, 10))\n if (parts.some((part) => Number.isNaN(part))) return null\n return { parts, pre: pre ?? null }\n }\n\n const parsedA = parse(a)\n const parsedB = parse(b)\n if (!parsedA || !parsedB) return 0\n\n const length = Math.max(parsedA.parts.length, parsedB.parts.length)\n for (let i = 0; i < length; i += 1) {\n const left = parsedA.parts[i] ?? 0\n const right = parsedB.parts[i] ?? 0\n if (left !== right) return left > right ? 1 : -1\n }\n\n if (parsedA.pre && !parsedB.pre) return -1\n if (!parsedA.pre && parsedB.pre) return 1\n if (parsedA.pre && parsedB.pre) {\n if (parsedA.pre === parsedB.pre) return 0\n return parsedA.pre > parsedB.pre ? 1 : -1\n }\n\n return 0\n}\n", "import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport path from 'node:path'\nimport fsSync from 'node:fs'\nimport {\n DEFAULT_MODEL_SENTINEL,\n type GatewayCliProvider,\n type GatewayProviderCapabilities,\n type GatewayModelRunPlan,\n} from './types.js'\nimport {\n enforceCodexStrictSchema,\n normalizeCodexArgsPayload,\n normalizeCodexToolSchema,\n} from './codex-schema.js'\nimport {\n buildProviderChildProcessEnv,\n parseProviderJsonFromText,\n resolveCodexProviderCommand,\n} from '../provider-runtime-utils.js'\n\nconst execFileAsync = promisify(execFile)\n\nconst DEFAULT_CODEX_TIMEOUT_MS = 10_000\n\nasync function execCodexHelp(): Promise<{ ok: boolean; stdout: string; stderr: string; error?: string } > {\n const command = resolveCodexProviderCommand()\n try {\n const { stdout, stderr } = await execFileAsync(command, ['exec', '--help'], {\n timeout: DEFAULT_CODEX_TIMEOUT_MS,\n env: buildProviderChildProcessEnv(),\n })\n return { ok: true, stdout: String(stdout ?? ''), stderr: String(stderr ?? '') }\n } catch (error) {\n const err = error as NodeJS.ErrnoException & { stdout?: string; stderr?: string }\n return {\n ok: false,\n stdout: err.stdout ? String(err.stdout) : '',\n stderr: err.stderr ? String(err.stderr) : '',\n error: err.message,\n }\n }\n}\n\nasync function execCodexVersion(): Promise<{ ok: boolean; version: string | null; error?: string } > {\n const command = resolveCodexProviderCommand()\n try {\n const { stdout } = await execFileAsync(command, ['--version'], {\n timeout: DEFAULT_CODEX_TIMEOUT_MS,\n env: buildProviderChildProcessEnv(),\n })\n const version = String(stdout ?? '').trim()\n return { ok: true, version: version || null }\n } catch (error) {\n const err = error as NodeJS.ErrnoException\n return { ok: false, version: null, error: err.message }\n }\n}\n\nfunction parseHelpFlags(helpText: string): Record<string, boolean> {\n const text = helpText.toLowerCase()\n const has = (flag: string) => text.includes(flag.toLowerCase())\n return {\n outputSchemaFlag: has('--output-schema'),\n outputLastMessageFlag: has('--output-last-message') || has('-o, --output-last-message'),\n jsonFlag: has('--json'),\n modelFlag: has('--model'),\n sandboxFlag: has('--sandbox'),\n skipGitRepoCheckFlag: has('--skip-git-repo-check'),\n configFlag: has('-c, --config') || has('--config <key=value>'),\n dangerouslyBypassApprovalsAndSandboxFlag: has('--dangerously-bypass-approvals-and-sandbox'),\n }\n}\n\nfunction parseJsonFromText(text: string): Record<string, unknown> {\n return parseProviderJsonFromText(text, { stripCodeFence: true })\n}\n\nfunction parseJsonlForOutput(stdout: string): { output?: Record<string, unknown>; usage?: Record<string, unknown> } {\n const lines = stdout.split(/\\r?\\n/).map((line) => line.trim()).filter(Boolean)\n let outputText: string | null = null\n let usage: Record<string, unknown> | null = null\n for (const line of lines) {\n try {\n const event = JSON.parse(line) as Record<string, unknown>\n if (event.type === 'item.completed') {\n const item = event.item as Record<string, unknown>\n if (item?.type === 'agent_message' && typeof item.text === 'string') {\n outputText = item.text\n }\n }\n if (event.type === 'turn.completed' && event.usage && typeof event.usage === 'object') {\n usage = event.usage as Record<string, unknown>\n }\n } catch {\n // ignore\n }\n }\n if (!outputText) return {}\n return { output: parseJsonFromText(outputText), usage: usage ?? undefined }\n}\n\nexport function createCodexCliProvider(): GatewayCliProvider {\n let cachedFlags: Record<string, boolean> = {}\n\n return {\n id: 'codex',\n label: 'OpenAI Codex',\n normalizeSchema(schema) {\n return normalizeCodexToolSchema(schema)\n },\n async detectCapabilities(): Promise<GatewayProviderCapabilities> {\n let versionInfo = await execCodexVersion()\n let helpInfo = await execCodexHelp()\n\n if (helpInfo.ok) {\n cachedFlags = parseHelpFlags(`${helpInfo.stdout}\\n${helpInfo.stderr}`)\n } else {\n cachedFlags = {}\n }\n return {\n available: versionInfo.ok,\n version: versionInfo.version ?? undefined,\n error: versionInfo.ok ? undefined : versionInfo.error,\n supported_flags: cachedFlags,\n supports: {\n output_schema: !!(cachedFlags.outputSchemaFlag && cachedFlags.outputLastMessageFlag),\n stream_json: !!cachedFlags.jsonFlag,\n tool_disable: !!cachedFlags.configFlag,\n },\n }\n },\n buildModelRunPlan(context): GatewayModelRunPlan {\n let prompt = context.prompt\n const args: string[] = ['exec', '--sandbox', 'read-only', '--skip-git-repo-check']\n if (context.model !== DEFAULT_MODEL_SENTINEL) {\n args.push('--model', context.model)\n }\n\n const files: Array<{ path: string; contents: string }> = []\n\n if (cachedFlags.configFlag) {\n if (context.reasoningEffort) {\n args.push('-c', `model_reasoning_effort=\"${context.reasoningEffort}\"`)\n }\n args.push('-c', 'features.shell_tool=false')\n args.push('-c', 'features.web_search_request=false')\n }\n\n let outputMode: GatewayModelRunPlan['outputMode'] = 'stdout-json'\n let outputPath: string | undefined\n if (cachedFlags.outputSchemaFlag && cachedFlags.outputLastMessageFlag) {\n const schemaPath = 'schema.json'\n outputPath = 'output.json'\n const codexSchema = enforceCodexStrictSchema(context.jsonSchema)\n files.push({ path: schemaPath, contents: JSON.stringify(codexSchema) })\n args.push('--output-schema', schemaPath)\n args.push('-o', outputPath)\n outputMode = 'file-json'\n } else if (cachedFlags.jsonFlag) {\n args.push('--json')\n outputMode = 'stream-json'\n } else {\n // fallback: embed schema in prompt\n const schemaInline = JSON.stringify(enforceCodexStrictSchema(context.jsonSchema))\n prompt = `${prompt}\\n\\nReturn STRICT JSON matching this schema:\\n${schemaInline}`\n }\n\n if (context.appendSystemPrompt) {\n prompt = `${prompt}\\n\\n${context.appendSystemPrompt}`\n }\n\n args.push(prompt)\n\n return {\n command: resolveCodexProviderCommand(),\n args,\n env: buildProviderChildProcessEnv(),\n outputFormat: outputMode === 'stream-json' ? 'stream-json' : 'text',\n outputMode,\n outputPath,\n files,\n timeoutMs: typeof context.timeoutMs === 'number' ? context.timeoutMs : null,\n }\n },\n normalizeModelRunResult({ stdout, outputMode, outputPath, workDir }) {\n if (outputMode === 'file-json') {\n if (!outputPath) {\n throw new Error('Codex output file path missing')\n }\n const filePath = path.join(workDir, outputPath)\n if (!fsSync.existsSync(filePath)) {\n throw new Error('Codex output file not found')\n }\n const fileContents = fsSync.readFileSync(filePath, 'utf-8')\n const parsed = JSON.parse(fileContents) as Record<string, unknown>\n const normalized = normalizeCodexArgsPayload(parsed)\n return { output: normalized.output, raw: normalized.raw, usage: null, model: null }\n }\n\n if (outputMode === 'stream-json') {\n const parsed = parseJsonlForOutput(stdout)\n if (!parsed.output) {\n throw new Error('Codex JSONL output missing agent message')\n }\n const normalized = normalizeCodexArgsPayload(parsed.output)\n return {\n output: normalized.output,\n raw: normalized.raw,\n usage: parsed.usage ?? null,\n model: null,\n }\n }\n\n const parsed = parseJsonFromText(stdout)\n const normalized = normalizeCodexArgsPayload(parsed)\n return { output: normalized.output, raw: normalized.raw, usage: null, model: null }\n },\n }\n}\n", "export function enforceCodexStrictSchema<T>(schema: T): T {\n const seen = new WeakMap<object, unknown>()\n\n const visit = (value: unknown): unknown => {\n if (value === null || typeof value !== 'object') {\n return value\n }\n if (Array.isArray(value)) {\n return value.map((entry) => visit(entry))\n }\n if (seen.has(value)) {\n return seen.get(value) as unknown\n }\n\n const input = value as Record<string, unknown>\n const output: Record<string, unknown> = {}\n seen.set(value, output)\n\n for (const [key, entry] of Object.entries(input)) {\n output[key] = visit(entry)\n }\n\n const typeValue = output.type\n const isObjectType =\n typeValue === 'object' ||\n (Array.isArray(typeValue) && typeValue.includes('object')) ||\n typeof output.properties === 'object' ||\n typeof output.patternProperties === 'object'\n\n if (isObjectType) {\n // Codex requires additionalProperties explicitly set to false on object nodes.\n if (output.additionalProperties !== false) {\n output.additionalProperties = false\n }\n }\n\n return output\n }\n\n return visit(schema) as T\n}\n\nexport function normalizeCodexToolSchema(schema: Record<string, unknown>): {\n schema: Record<string, unknown>\n promptSuffix?: string\n} {\n const properties = schema.properties\n if (!properties || typeof properties !== 'object') {\n return { schema }\n }\n\n const props = properties as Record<string, unknown>\n if (!props.name || !props.args) {\n return { schema }\n }\n\n const nameSchema = props.name as Record<string, unknown>\n const codexSchema: Record<string, unknown> = {\n type: 'object',\n required: ['name', 'args_json'],\n properties: {\n name: nameSchema,\n args_json: { type: 'string' },\n },\n additionalProperties: false,\n }\n\n return {\n schema: codexSchema,\n promptSuffix: 'Set args_json to a JSON-encoded string containing the arguments object.',\n }\n}\n\nexport function normalizeCodexArgsPayload(\n payload: Record<string, unknown>\n): { output: Record<string, unknown>; raw: Record<string, unknown> } {\n const raw = payload\n const argsJson = payload.args_json ?? payload.argsJson\n if (typeof argsJson === 'string') {\n try {\n const parsedArgs = JSON.parse(argsJson) as Record<string, unknown>\n const output: Record<string, unknown> = { ...payload }\n output.args = parsedArgs\n delete output.args_json\n delete output.argsJson\n return { output, raw }\n } catch (error) {\n throw new Error(\n `Codex args_json is not valid JSON: ${\n error instanceof Error ? error.message : 'unknown error'\n }`\n )\n }\n }\n return { output: payload, raw }\n}\n", "import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport path from 'node:path'\nimport {\n DEFAULT_MODEL_SENTINEL,\n type GatewayCliProvider,\n type GatewayProviderCapabilities,\n type GatewayModelRunPlan,\n} from './types.js'\nimport {\n buildGeminiProviderChildProcessEnv,\n parseProviderJsonFromText,\n resolveGeminiProviderCommand,\n stripProviderCodeFence,\n} from '../provider-runtime-utils.js'\n\nconst execFileAsync = promisify(execFile)\n\nconst DEFAULT_GEMINI_TIMEOUT_MS = 10_000\n\nasync function execGeminiHelp(): Promise<{ ok: boolean; stdout: string; stderr: string; error?: string } > {\n const command = resolveGeminiProviderCommand()\n try {\n const { stdout, stderr } = await execFileAsync(command, ['--help'], {\n timeout: DEFAULT_GEMINI_TIMEOUT_MS,\n env: buildGeminiProviderChildProcessEnv({ commandPath: command }),\n })\n return { ok: true, stdout: String(stdout ?? ''), stderr: String(stderr ?? '') }\n } catch (error) {\n const err = error as NodeJS.ErrnoException & { stdout?: string; stderr?: string }\n return {\n ok: false,\n stdout: err.stdout ? String(err.stdout) : '',\n stderr: err.stderr ? String(err.stderr) : '',\n error: err.message,\n }\n }\n}\n\nasync function execGeminiVersion(): Promise<{ ok: boolean; version: string | null; error?: string } > {\n const command = resolveGeminiProviderCommand()\n try {\n const { stdout } = await execFileAsync(command, ['--version'], {\n timeout: DEFAULT_GEMINI_TIMEOUT_MS,\n env: buildGeminiProviderChildProcessEnv({ commandPath: command }),\n })\n const version = String(stdout ?? '').trim()\n return { ok: true, version: version || null }\n } catch (error) {\n const err = error as NodeJS.ErrnoException\n return { ok: false, version: null, error: err.message }\n }\n}\n\nasync function execGeminiExtensions(): Promise<{ ok: boolean; list: string[]; error?: string } > {\n const command = resolveGeminiProviderCommand()\n try {\n const { stdout } = await execFileAsync(command, ['--list-extensions'], {\n timeout: DEFAULT_GEMINI_TIMEOUT_MS,\n env: buildGeminiProviderChildProcessEnv({ commandPath: command }),\n })\n const lines = String(stdout ?? '')\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && line.toLowerCase() !== 'installed extensions:')\n return { ok: true, list: lines }\n } catch (error) {\n const err = error as NodeJS.ErrnoException\n return { ok: false, list: [], error: err.message }\n }\n}\n\nfunction parseJsonFromText(text: string): Record<string, unknown> {\n return parseProviderJsonFromText(text, { errorMessage: 'Failed to parse Gemini JSON output' })\n}\n\nexport function createGeminiCliProvider(): GatewayCliProvider {\n let outputFormatSupported = true\n let modelFlagSupported = true\n let approvalModeSupported = false\n let yoloFlagSupported = false\n let sandboxFlagSupported = false\n let extensions: string[] = []\n let extensionsCheckOk = true\n\n return {\n id: 'gemini',\n label: 'Gemini CLI',\n async detectCapabilities(): Promise<GatewayProviderCapabilities> {\n const versionInfo = await execGeminiVersion()\n const helpInfo = await execGeminiHelp()\n const extensionInfo = await execGeminiExtensions()\n extensions = extensionInfo.list\n extensionsCheckOk = extensionInfo.ok\n if (!helpInfo.ok) {\n outputFormatSupported = true\n modelFlagSupported = true\n approvalModeSupported = false\n yoloFlagSupported = false\n sandboxFlagSupported = false\n } else {\n const text = `${helpInfo.stdout}\\n${helpInfo.stderr}`.toLowerCase()\n outputFormatSupported = text.includes('--output-format')\n modelFlagSupported = text.includes('--model')\n approvalModeSupported = text.includes('--approval-mode')\n yoloFlagSupported = text.includes('--yolo')\n sandboxFlagSupported = text.includes('--sandbox')\n }\n const toolDisableSupported = extensionsCheckOk ? extensions.length === 0 : false\n return {\n available: versionInfo.ok,\n version: versionInfo.version ?? undefined,\n error: versionInfo.ok ? undefined : versionInfo.error,\n supported_flags: {\n outputFormatFlag: outputFormatSupported,\n modelFlag: modelFlagSupported,\n extensionsFlag: true,\n approvalModeFlag: approvalModeSupported,\n yoloFlag: yoloFlagSupported,\n sandboxFlag: sandboxFlagSupported,\n },\n supports: {\n output_schema: false,\n stream_json: outputFormatSupported,\n tool_disable: toolDisableSupported,\n },\n extensions,\n }\n },\n buildModelRunPlan(context): GatewayModelRunPlan {\n const prompt = context.prompt\n const schemaString = JSON.stringify(context.jsonSchema)\n const systemPrompt =\n context.appendSystemPrompt && context.appendSystemPrompt.trim().length > 0\n ? `${context.appendSystemPrompt}\\nReturn STRICT JSON only. Do not wrap in code fences.\\nSchema:\\n${schemaString}`\n : `Return STRICT JSON only. Do not wrap in code fences.\\nSchema:\\n${schemaString}`\n\n const files: Array<{ path: string; contents: string }> = [\n { path: 'system.md', contents: systemPrompt },\n ]\n\n const args: string[] = ['--output-format', 'json']\n if (context.model !== DEFAULT_MODEL_SENTINEL) {\n args.push('--model', context.model)\n }\n args.push(prompt)\n const command = resolveGeminiProviderCommand()\n\n return {\n command,\n args,\n env: buildGeminiProviderChildProcessEnv({\n systemPromptPath: path.join('{WORKDIR}', 'system.md'),\n commandPath: command,\n }),\n outputFormat: 'json',\n outputMode: 'stdout-json',\n files,\n timeoutMs: typeof context.timeoutMs === 'number' ? context.timeoutMs : null,\n }\n },\n normalizeModelRunResult({ stdout }) {\n const parsed = parseJsonFromText(stdout)\n const response = typeof parsed.response === 'string' ? parsed.response : ''\n const cleaned = stripProviderCodeFence(response)\n const output = JSON.parse(cleaned) as Record<string, unknown>\n const stats = parsed.stats && typeof parsed.stats === 'object' ? (parsed.stats as Record<string, unknown>) : null\n let model: string | null = null\n const models = stats && typeof stats.models === 'object' ? (stats.models as Record<string, unknown>) : null\n if (models) {\n const first = Object.keys(models)[0]\n if (first) model = first\n }\n return { output, raw: parsed, usage: stats, model }\n },\n }\n}\n", "import type { GatewayCliProvider, GatewayProviderId } from './types.js'\nimport { createClaudeCliProvider } from './claude.js'\nimport { createCodexCliProvider } from './codex.js'\nimport { createGeminiCliProvider } from './gemini.js'\n\nconst PROVIDERS: Record<GatewayProviderId, GatewayCliProvider> = {\n claude_code: createClaudeCliProvider(),\n codex: createCodexCliProvider(),\n gemini: createGeminiCliProvider(),\n}\n\nexport function getGatewayCliProvider(id: GatewayProviderId): GatewayCliProvider {\n return PROVIDERS[id]\n}\n\nexport function listGatewayCliProviders(): GatewayCliProvider[] {\n return Object.values(PROVIDERS)\n}\n\nexport function inferGatewayProviderFromModel(model: string): GatewayProviderId {\n const lowered = model.toLowerCase()\n if (lowered.startsWith('openai/') || lowered.startsWith('gpt-') || lowered.includes('codex')) {\n return 'codex'\n }\n if (lowered.startsWith('google/') || lowered.startsWith('gemini')) {\n return 'gemini'\n }\n return 'claude_code'\n}\n", "import { inferGatewayProviderFromModel } from './cli-providers/registry.js'\n\nexport type GatewayJobStatus = 'queued' | 'running' | 'completed' | 'failed' | 'cancelled'\n\nexport interface GatewayJobRow {\n id: string\n team_id: string\n gateway_id: string | null\n status: GatewayJobStatus\n job_type: string\n payload: Record<string, unknown>\n result: Record<string, unknown> | null\n error: string | null\n idempotency_key?: string | null\n attempt?: number | null\n retry_of_job_id?: string | null\n created_at: string\n updated_at: string\n completed_at: string | null\n}\n\nexport type GatewayJobDescriptionInput = {\n job_type: string\n payload?: Record<string, unknown> | null\n}\n\nexport function inferProviderFromSubagentType(\n subagentType: string | null | undefined\n): string | null {\n if (!subagentType) return null\n const lowered = subagentType.toLowerCase()\n if (lowered.includes('claude')) return 'claude_code'\n if (lowered.includes('codex')) return 'codex'\n if (lowered.includes('gemini')) return 'gemini'\n return null\n}\n\nexport function describeGatewayJob(job: GatewayJobDescriptionInput): {\n job_kind: string\n provider?: string | null\n model?: string | null\n subagent_type?: string | null\n} {\n if (job.job_type === 'model_run') {\n const payload = job.payload ?? {}\n const model = typeof payload.model === 'string' ? payload.model : null\n const provider =\n typeof payload.provider === 'string'\n ? payload.provider\n : model\n ? inferGatewayProviderFromModel(model)\n : null\n return { job_kind: 'cycle', provider, model }\n }\n\n if (job.job_type === 'subagent_run') {\n const payload = job.payload ?? {}\n const subagentType = typeof payload.subagent_type === 'string' ? payload.subagent_type : null\n const provider = inferProviderFromSubagentType(subagentType)\n return { job_kind: 'subagent', provider, subagent_type: subagentType }\n }\n\n if (job.job_type === 'subagent_cancel') {\n return { job_kind: 'subagent_cancel' }\n }\n\n if (job.job_type === 'shell_exec') {\n return { job_kind: 'shell_exec' }\n }\n\n return { job_kind: job.job_type }\n}\n\nexport function isJobTargeted(job: GatewayJobRow, gatewayId: string): boolean {\n return job.gateway_id === gatewayId\n}\n\nexport function resolveJobSubagentId(job: GatewayJobRow): string | null {\n if (job.job_type !== 'subagent_run') return null\n const payload = job.payload ?? {}\n return typeof payload.subagent_id === 'string'\n ? payload.subagent_id\n : typeof payload.subagentId === 'string'\n ? payload.subagentId\n : null\n}\n", "import type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from './database.types.js'\nimport { sanitizeGatewayDebugPayload } from './debug-redaction.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport { asJson } from './gateway-run-helpers.js'\nimport {\n isJobTargeted,\n type GatewayJobRow,\n type GatewayJobStatus,\n} from './gateway-jobs.js'\n\nexport type GatewayJobStoreClient = SupabaseClient<Database>\nexport type GatewayJobStoreLogger = (message: string, data?: Record<string, unknown>) => void\n\nconst noopLogger: GatewayJobStoreLogger = () => {}\n\nexport function coerceGatewayJobStatus(value: unknown): GatewayJobStatus | null {\n if (\n value === 'queued' ||\n value === 'running' ||\n value === 'completed' ||\n value === 'failed' ||\n value === 'cancelled'\n ) {\n return value\n }\n\n return null\n}\n\nexport async function claimGatewayJob(\n supabase: GatewayJobStoreClient,\n config: GatewayConfig,\n job: GatewayJobRow,\n logError: GatewayJobStoreLogger = noopLogger\n): Promise<GatewayJobRow | null> {\n if (!isJobTargeted(job, config.gatewayId)) {\n return null\n }\n\n const { data, error } = await supabase\n .from('gateway_jobs')\n .update({\n status: 'running',\n gateway_id: config.gatewayId,\n started_at: new Date().toISOString(),\n })\n .eq('id', job.id)\n .eq('team_id', config.teamId)\n .eq('status', 'queued')\n .eq('gateway_id', config.gatewayId)\n .select('*')\n .maybeSingle()\n\n if (error) {\n logError('Failed to claim gateway job', { error: error.message, jobId: job.id })\n return null\n }\n\n if (!data) {\n return null\n }\n\n return data as GatewayJobRow\n}\n\nexport async function findGatewayJobIdempotencyConflict(\n supabase: GatewayJobStoreClient,\n job: GatewayJobRow,\n logError: GatewayJobStoreLogger = noopLogger\n): Promise<GatewayJobRow | null> {\n if (!job.idempotency_key) return null\n const attempt = typeof job.attempt === 'number' && Number.isFinite(job.attempt) ? job.attempt : 1\n const { data, error } = await supabase\n .from('gateway_jobs')\n .select('id, status, result, error')\n .eq('team_id', job.team_id)\n .eq('idempotency_key', job.idempotency_key)\n .eq('attempt', attempt)\n .in('status', ['running', 'completed'])\n .neq('id', job.id)\n .order('created_at', { ascending: true })\n .limit(1)\n .maybeSingle()\n\n if (error) {\n logError('Failed to check gateway job idempotency', { error: error.message, jobId: job.id })\n return null\n }\n\n return data ? (data as GatewayJobRow) : null\n}\n\nexport async function completeGatewayJob(\n supabase: GatewayJobStoreClient,\n jobId: string,\n status: GatewayJobStatus,\n result: Record<string, unknown> | null,\n errorMessage?: string,\n logError: GatewayJobStoreLogger = noopLogger\n): Promise<void> {\n const updates: Record<string, unknown> = {\n status,\n result: result ? asJson(result) : null,\n error: errorMessage || null,\n completed_at: new Date().toISOString(),\n }\n\n const { error } = await supabase\n .from('gateway_jobs')\n .update(updates)\n .eq('id', jobId)\n .eq('status', 'running')\n\n if (error) {\n logError('Failed to update gateway job result', { error: error.message, jobId })\n }\n}\n\nexport async function updateGatewayJobDebug(\n supabase: GatewayJobStoreClient,\n jobId: string,\n debug: Record<string, unknown>,\n logError: GatewayJobStoreLogger = noopLogger\n): Promise<void> {\n const sanitizedDebug = sanitizeGatewayDebugPayload(debug)\n const { error } = await supabase\n .from('gateway_jobs')\n .update({ debug: asJson(sanitizedDebug) })\n .eq('id', jobId)\n\n if (error) {\n logError('Failed to update gateway job debug info', { error: error.message, jobId })\n }\n}\n\nexport async function loadGatewayJobStatus(\n supabase: GatewayJobStoreClient,\n jobId: string,\n logError: GatewayJobStoreLogger = noopLogger\n): Promise<GatewayJobStatus | null> {\n const { data, error } = await supabase\n .from('gateway_jobs')\n .select('status')\n .eq('id', jobId)\n .maybeSingle()\n\n if (error) {\n logError('Failed to fetch gateway job status', {\n jobId,\n error: error.message,\n })\n return null\n }\n\n if (!data || typeof data.status !== 'string') {\n return null\n }\n\n return coerceGatewayJobStatus(data.status)\n}\n", "import {\n describeGatewayJob,\n type GatewayJobRow,\n type GatewayJobStatus,\n} from './gateway-jobs.js'\n\nexport interface GatewayJobHandlerResult {\n ok: boolean\n result: Record<string, unknown>\n error?: string\n}\n\nexport interface GatewaySubagentRunHandlerResult extends GatewayJobHandlerResult {\n jobStatus?: GatewayJobStatus\n skipSubagentFailure?: boolean\n}\n\nexport interface GatewayJobProcessorDependencies {\n claimJob: (job: GatewayJobRow) => Promise<GatewayJobRow | null>\n findIdempotencyConflict: (job: GatewayJobRow) => Promise<GatewayJobRow | null>\n completeJob: (\n jobId: string,\n status: GatewayJobStatus,\n result: Record<string, unknown> | null,\n errorMessage?: string\n ) => Promise<void>\n failSubagentRun: (job: GatewayJobRow, errorMessage: string) => Promise<void>\n handleDiagnosticJob: () => Promise<GatewayJobHandlerResult>\n handleSubagentRunJob: (job: GatewayJobRow) => Promise<GatewaySubagentRunHandlerResult>\n handleModelRunJob: (job: GatewayJobRow) => Promise<GatewayJobHandlerResult>\n handleSubagentCancelJob: (job: GatewayJobRow) => Promise<GatewayJobHandlerResult>\n handleShellExecJob: (job: GatewayJobRow) => Promise<GatewayJobHandlerResult>\n logInfo: (message: string, data?: Record<string, unknown>) => void\n}\n\nexport async function processGatewayJob(\n job: GatewayJobRow,\n dependencies: GatewayJobProcessorDependencies\n): Promise<void> {\n const claimed = await dependencies.claimJob(job)\n if (!claimed) {\n return\n }\n\n const idempotencyConflict = await dependencies.findIdempotencyConflict(claimed)\n if (idempotencyConflict) {\n const conflictMessage = 'Duplicate gateway job idempotency key; skipping execution'\n dependencies.logInfo('Skipping duplicate gateway job', {\n jobId: claimed.id,\n conflict_job_id: idempotencyConflict.id,\n idempotency_key: claimed.idempotency_key ?? null,\n attempt: claimed.attempt ?? 1,\n })\n await dependencies.completeJob(\n claimed.id,\n 'cancelled',\n {\n message: conflictMessage,\n idempotency_key: claimed.idempotency_key,\n attempt: claimed.attempt,\n },\n conflictMessage\n )\n return\n }\n\n const jobDetails = describeGatewayJob(claimed)\n dependencies.logInfo('Processing gateway job', {\n jobId: claimed.id,\n jobType: claimed.job_type,\n jobKind: jobDetails.job_kind,\n provider: jobDetails.provider ?? undefined,\n model: jobDetails.model ?? undefined,\n subagentType: jobDetails.subagent_type ?? undefined,\n })\n\n if (claimed.job_type === 'diagnostic') {\n const diagnostic = await dependencies.handleDiagnosticJob()\n if (diagnostic.ok) {\n await dependencies.completeJob(claimed.id, 'completed', diagnostic.result)\n } else {\n await dependencies.completeJob(claimed.id, 'failed', diagnostic.result, diagnostic.error)\n }\n return\n }\n\n if (claimed.job_type === 'subagent_run') {\n const result = await dependencies.handleSubagentRunJob(claimed)\n if (result.ok) {\n await dependencies.completeJob(claimed.id, 'completed', result.result)\n } else {\n await dependencies.completeJob(\n claimed.id,\n result.jobStatus ?? 'failed',\n result.result,\n result.error\n )\n if (!result.skipSubagentFailure) {\n await dependencies.failSubagentRun(claimed, result.error ?? 'Subagent run failed')\n }\n }\n return\n }\n\n if (claimed.job_type === 'model_run') {\n const result = await dependencies.handleModelRunJob(claimed)\n if (result.ok) {\n await dependencies.completeJob(claimed.id, 'completed', result.result)\n } else {\n await dependencies.completeJob(claimed.id, 'failed', result.result, result.error)\n }\n return\n }\n\n if (claimed.job_type === 'subagent_cancel') {\n const result = await dependencies.handleSubagentCancelJob(claimed)\n if (result.ok) {\n await dependencies.completeJob(claimed.id, 'completed', result.result)\n } else {\n await dependencies.completeJob(claimed.id, 'failed', result.result, result.error)\n }\n return\n }\n\n if (claimed.job_type === 'shell_exec') {\n const result = await dependencies.handleShellExecJob(claimed)\n if (result.ok) {\n await dependencies.completeJob(claimed.id, 'completed', result.result)\n } else {\n await dependencies.completeJob(claimed.id, 'failed', result.result, result.error)\n }\n return\n }\n\n await dependencies.completeJob(\n claimed.id,\n 'failed',\n {\n message: 'Unsupported job type',\n job_type: claimed.job_type,\n },\n `Unsupported job type: ${claimed.job_type}`\n )\n}\n", "import type { ChildProcess } from 'node:child_process'\nimport type {\n GatewayCommandResult,\n GatewayCommandRunOptions,\n} from './gateway-command-runner.js'\nimport {\n getGatewayCliProvider,\n inferGatewayProviderFromModel,\n} from './cli-providers/registry.js'\nimport type { GatewayHealthStatus, GatewayProviderId } from './cli-providers/types.js'\nimport {\n assertSafeOutputPath,\n cleanupWorkDir,\n createWorkDir,\n extractGatewayErrorSummary,\n resolveRunPlanEnv,\n truncateLog,\n writeRunPlanFiles,\n} from './gateway-run-helpers.js'\nimport { resolveModelWorkdirRoot } from './runtime-paths.js'\nimport type { GatewayJobRow } from './gateway-jobs.js'\nimport { buildSafeGatewayCommandDescriptor } from './debug-redaction.js'\nimport {\n buildProviderFailureMessage,\n normalizeProviderErrorSummary,\n} from './gateway-provider-health.js'\n\nexport type ActiveModelRun = {\n child?: ChildProcess\n shutdownRequested: boolean\n shutdownReason?: string\n}\n\nexport type GatewayModelRunResult = {\n ok: boolean\n result: Record<string, unknown>\n error?: string\n}\n\nexport type GatewayModelRunCommandRunner = (\n command: string,\n args: string[],\n options: GatewayCommandRunOptions\n) => Promise<GatewayCommandResult>\n\nexport interface GatewayModelRunPayload {\n prompt: string\n model: string\n jsonSchema: Record<string, unknown>\n appendSystemPrompt?: string\n reasoningEffort?: 'low' | 'medium' | 'high'\n timeoutMs: number\n providerId: GatewayProviderId\n}\n\nexport function parseGatewayModelRunPayload(\n payload: Record<string, unknown>,\n defaultTimeoutMs: number\n):\n | { ok: true; value: GatewayModelRunPayload }\n | { ok: false; result: Record<string, unknown>; error: string } {\n const prompt = typeof payload.prompt === 'string' ? payload.prompt : null\n const model = typeof payload.model === 'string' ? payload.model : null\n const jsonSchema =\n payload.json_schema && typeof payload.json_schema === 'object'\n ? (payload.json_schema as Record<string, unknown>)\n : null\n const appendSystemPrompt =\n typeof payload.append_system_prompt === 'string' ? payload.append_system_prompt : undefined\n const reasoningEffort =\n payload.reasoning_effort === 'low' ||\n payload.reasoning_effort === 'medium' ||\n payload.reasoning_effort === 'high'\n ? payload.reasoning_effort\n : undefined\n const timeoutMs =\n typeof payload.timeout_ms === 'number' && payload.timeout_ms > 0\n ? payload.timeout_ms\n : defaultTimeoutMs\n\n if (!prompt || !model) {\n return {\n ok: false,\n result: { message: 'Missing prompt or model for gateway model run' },\n error: 'Missing prompt or model',\n }\n }\n\n if (!jsonSchema) {\n return {\n ok: false,\n result: { message: 'Missing json_schema for gateway model run' },\n error: 'Missing json_schema',\n }\n }\n\n const providerFromPayload = typeof payload.provider === 'string' ? payload.provider : null\n const providerId =\n providerFromPayload === 'claude_code' ||\n providerFromPayload === 'codex' ||\n providerFromPayload === 'gemini'\n ? (providerFromPayload as GatewayProviderId)\n : inferGatewayProviderFromModel(model)\n\n return {\n ok: true,\n value: {\n prompt,\n model,\n jsonSchema,\n appendSystemPrompt,\n reasoningEffort,\n timeoutMs,\n providerId,\n },\n }\n}\n\nexport async function handleGatewayModelRunJob(params: {\n job: GatewayJobRow\n defaultTimeoutMs: number\n processKillGraceMs: number\n activeModelRuns: Map<string, ActiveModelRun>\n runCommand: GatewayModelRunCommandRunner\n updateJobDebug: (jobId: string, debug: Record<string, unknown>) => Promise<void>\n updateProviderHealth: (\n providerId: GatewayProviderId,\n status: GatewayHealthStatus,\n errorMessage?: string | null\n ) => Promise<void>\n requestChildTermination: (\n child: ChildProcess | undefined,\n options: { reason: string; graceMs: number; context: string }\n ) => void\n workRoot?: string\n}): Promise<GatewayModelRunResult> {\n const {\n job,\n defaultTimeoutMs,\n processKillGraceMs,\n activeModelRuns,\n runCommand,\n updateJobDebug,\n updateProviderHealth,\n requestChildTermination,\n workRoot = resolveModelWorkdirRoot(),\n } = params\n const parsedPayload = parseGatewayModelRunPayload(job.payload ?? {}, defaultTimeoutMs)\n if (!parsedPayload.ok) return parsedPayload\n\n const {\n prompt,\n model,\n jsonSchema,\n appendSystemPrompt,\n reasoningEffort,\n timeoutMs,\n providerId,\n } = parsedPayload.value\n const provider = getGatewayCliProvider(providerId)\n let normalizedPrompt = prompt\n let normalizedSchema = jsonSchema\n if (provider.normalizeSchema) {\n const normalized = provider.normalizeSchema(jsonSchema)\n normalizedSchema = normalized.schema\n if (normalized.promptSuffix) {\n normalizedPrompt = `${normalizedPrompt}\\n\\n${normalized.promptSuffix}`\n }\n }\n\n const runPlan = provider.buildModelRunPlan({\n model,\n prompt: normalizedPrompt,\n jsonSchema: normalizedSchema,\n appendSystemPrompt,\n reasoningEffort,\n timeoutMs,\n })\n\n let workDir = ''\n const activeModelRun: ActiveModelRun = {\n shutdownRequested: false,\n }\n activeModelRuns.set(job.id, activeModelRun)\n\n try {\n workDir = await createWorkDir(workRoot, [{ value: job.id, label: 'job id' }])\n assertSafeOutputPath(workDir, runPlan.outputPath)\n await writeRunPlanFiles(workDir, runPlan.files)\n\n const resolvedEnv = resolveRunPlanEnv(runPlan.env, workDir)\n\n const commandDescriptor = buildSafeGatewayCommandDescriptor(runPlan.command, runPlan.args, {\n redactLastArg: true,\n })\n const debugInfo: Record<string, unknown> = {\n provider_id: providerId,\n command: commandDescriptor.command,\n args: commandDescriptor.args,\n command_line: commandDescriptor.commandLine,\n work_dir: workDir,\n prompt_chars: prompt.length,\n json_schema_chars: JSON.stringify(normalizedSchema).length,\n reasoning_effort: reasoningEffort ?? null,\n timeout_ms: timeoutMs,\n output_mode: runPlan.outputMode,\n output_path: runPlan.outputPath ?? null,\n }\n\n if (runPlan.files && runPlan.files.length > 0) {\n debugInfo.files = runPlan.files.map((file) => file.path)\n }\n\n await updateJobDebug(job.id, debugInfo)\n\n const runResult = await runCommand(runPlan.command, runPlan.args, {\n timeoutMs: runPlan.timeoutMs ?? defaultTimeoutMs,\n cwd: workDir,\n env: resolvedEnv,\n onStart: (child) => {\n activeModelRun.child = child\n if (activeModelRun.shutdownRequested) {\n requestChildTermination(child, {\n reason: activeModelRun.shutdownReason ?? 'Gateway shutting down',\n graceMs: processKillGraceMs,\n context: 'model_run_shutdown',\n })\n }\n },\n })\n\n const stdoutInfo = truncateLog(runResult.stdout)\n const stderrInfo = truncateLog(runResult.stderr)\n const errorSummary = extractGatewayErrorSummary(stderrInfo.value)\n debugInfo.stdout = stdoutInfo.value\n debugInfo.stdout_truncated = stdoutInfo.truncated\n debugInfo.stdout_bytes = stdoutInfo.originalBytes\n debugInfo.stderr = stderrInfo.value\n debugInfo.stderr_truncated = stderrInfo.truncated\n debugInfo.stderr_bytes = stderrInfo.originalBytes\n debugInfo.exit_code = runResult.exitCode\n debugInfo.duration_ms = runResult.durationMs\n debugInfo.timed_out = runResult.timedOut\n if (errorSummary) {\n debugInfo.error_summary = errorSummary\n }\n\n await updateJobDebug(job.id, debugInfo)\n\n if (!runResult.ok) {\n const summary = normalizeProviderErrorSummary(\n errorSummary?.message ?? runResult.error ?? 'Gateway model run failed'\n )\n await updateProviderHealth(providerId, 'unhealthy', summary ?? 'Gateway model run failed')\n const failureMessage = buildProviderFailureMessage(providerId, summary)\n return {\n ok: false,\n result: {\n message: failureMessage,\n exit_code: runResult.exitCode,\n stderr: stderrInfo.value,\n stdout: stdoutInfo.value,\n command: commandDescriptor.commandLine,\n error_summary: errorSummary ?? null,\n },\n error: failureMessage,\n }\n }\n\n let normalized\n try {\n normalized = provider.normalizeModelRunResult({\n stdout: runResult.stdout,\n outputFormat: runPlan.outputFormat,\n outputMode: runPlan.outputMode,\n outputPath: runPlan.outputPath,\n workDir,\n })\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to normalize gateway output'\n const summary = normalizeProviderErrorSummary(message)\n await updateProviderHealth(providerId, 'unhealthy', summary ?? message)\n const failureMessage = buildProviderFailureMessage(providerId, summary ?? message)\n return {\n ok: false,\n result: {\n message: failureMessage,\n stdout: stdoutInfo.value,\n stderr: stderrInfo.value,\n command: commandDescriptor.commandLine,\n },\n error: failureMessage,\n }\n }\n\n await updateProviderHealth(providerId, 'healthy')\n return {\n ok: true,\n result: {\n output: normalized.output,\n raw: normalized.raw,\n usage: normalized.usage,\n model: normalized.model,\n duration_ms: runResult.durationMs,\n exit_code: runResult.exitCode,\n stdout_truncated: runResult.stdoutTruncated,\n stderr_truncated: runResult.stderrTruncated,\n command: commandDescriptor.commandLine,\n },\n }\n } finally {\n activeModelRuns.delete(job.id)\n if (workDir) {\n await cleanupWorkDir(workDir, workRoot)\n }\n }\n}\n", "import type { ChildProcess } from 'node:child_process'\nimport fsSync from 'node:fs'\nimport process from 'node:process'\nimport type {\n GatewayCommandResult,\n GatewayCommandRunOptions,\n} from './gateway-command-runner.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport type { GatewayJobRow } from './gateway-jobs.js'\nimport { loadValidatedRemoteShellResource } from './remote-shell-resource.js'\nimport type { GatewayJobStoreClient } from './gateway-job-store.js'\n\nexport type ActiveShellExecRun = {\n child?: ChildProcess\n shutdownRequested: boolean\n shutdownReason?: string\n}\n\nexport type GatewayShellExecResult = {\n ok: boolean\n result: Record<string, unknown>\n error?: string\n}\n\nexport type GatewayShellExecCommandRunner = (\n command: string,\n args: string[],\n options: GatewayCommandRunOptions\n) => Promise<GatewayCommandResult>\n\nexport function coercePositiveInteger(\n value: unknown,\n fallback: number,\n options?: { min?: number; max?: number }\n): number {\n const min = options?.min ?? 1\n const max = options?.max ?? Number.MAX_SAFE_INTEGER\n const parsed =\n typeof value === 'number' ? value : typeof value === 'string' ? Number.parseInt(value, 10) : NaN\n if (!Number.isFinite(parsed)) return fallback\n return Math.max(min, Math.min(max, Math.trunc(parsed)))\n}\n\nexport function resolveRemoteShellExecShellCommand(\n options: {\n existsSync?: (path: string) => boolean\n shellEnv?: string | undefined\n } = {}\n): string {\n const existsSync = options.existsSync ?? fsSync.existsSync\n if (existsSync('/bin/bash')) {\n return '/bin/bash'\n }\n if (existsSync('/bin/sh')) {\n return '/bin/sh'\n }\n const shellEnv = options.shellEnv ?? process.env.SHELL\n if (typeof shellEnv === 'string' && shellEnv.trim().length > 0) {\n return shellEnv.trim()\n }\n return '/bin/bash'\n}\n\nexport async function handleGatewayShellExecJob(params: {\n supabase: GatewayJobStoreClient\n config: GatewayConfig\n job: GatewayJobRow\n defaultTimeoutMs: number\n activeShellExecRuns: Map<string, ActiveShellExecRun>\n runCommand: GatewayShellExecCommandRunner\n isJobCancelled: (jobId: string) => Promise<boolean>\n validateMachineControlState: () => Promise<{ ok: boolean; message?: string }>\n processKillGraceMs: number\n requestChildTermination: (\n child: ChildProcess | undefined,\n options: { reason: string; graceMs: number; context: string }\n ) => void\n logError?: (message: string, data?: Record<string, unknown>) => void\n resolveShellCommand?: () => string\n}): Promise<GatewayShellExecResult> {\n const {\n supabase,\n config,\n job,\n defaultTimeoutMs,\n activeShellExecRuns,\n runCommand,\n isJobCancelled,\n validateMachineControlState,\n processKillGraceMs,\n requestChildTermination,\n logError,\n resolveShellCommand = resolveRemoteShellExecShellCommand,\n } = params\n\n if (await isJobCancelled(job.id)) {\n const message = 'Gateway remote shell exec job was cancelled before execution'\n return {\n ok: false,\n result: { message, cancelled: true },\n error: message,\n }\n }\n\n const controlValidation = await validateMachineControlState()\n if (!controlValidation.ok) {\n const message = controlValidation.message ?? 'Gateway machine control unavailable'\n return {\n ok: false,\n result: { message },\n error: message,\n }\n }\n\n const payload = job.payload ?? {}\n const resourceId =\n typeof payload.resource_id === 'string' && payload.resource_id.trim().length > 0\n ? payload.resource_id.trim()\n : null\n\n if (!resourceId) {\n return {\n ok: false,\n result: { message: 'Missing resource_id in payload' },\n error: 'Missing resource_id in payload',\n }\n }\n\n const resourceValidation = await loadValidatedRemoteShellResource(\n supabase,\n config,\n resourceId,\n 'write',\n logError\n )\n if (!resourceValidation.ok) {\n return {\n ok: false,\n result: { message: resourceValidation.message, resource_id: resourceId },\n error: resourceValidation.message,\n }\n }\n\n const command =\n typeof payload.command === 'string' && payload.command.trim().length > 0\n ? payload.command\n : null\n if (!command) {\n return {\n ok: false,\n result: { message: 'Missing command in payload', resource_id: resourceId },\n error: 'Missing command in payload',\n }\n }\n\n const timeoutMs = coercePositiveInteger(payload.timeout_ms, defaultTimeoutMs, {\n min: 1,\n max: 10 * 60_000,\n })\n const shell = resolveShellCommand()\n const activeExecRun: ActiveShellExecRun = {\n shutdownRequested: false,\n }\n activeShellExecRuns.set(job.id, activeExecRun)\n\n try {\n const execResult = await runCommand(shell, ['-lc', command], {\n cwd: '/',\n timeoutMs,\n onStart: (child) => {\n activeExecRun.child = child\n if (activeExecRun.shutdownRequested) {\n requestChildTermination(child, {\n reason: activeExecRun.shutdownReason ?? 'Gateway shutting down',\n graceMs: processKillGraceMs,\n context: 'shell_exec_shutdown',\n })\n }\n },\n })\n const message = execResult.ok\n ? 'Remote shell command completed'\n : execResult.timedOut\n ? 'Remote shell command timed out'\n : execResult.error\n ? 'Remote shell command failed to start'\n : 'Remote shell command completed with a non-zero exit status'\n\n return {\n ok: true,\n result: {\n message,\n resource_id: resourceId,\n command,\n shell,\n cwd: '/',\n stdout: execResult.stdout,\n stderr: execResult.stderr,\n exit_code: execResult.exitCode,\n duration_ms: execResult.durationMs,\n timed_out: execResult.timedOut,\n success: execResult.ok,\n stdout_truncated: execResult.stdoutTruncated,\n stderr_truncated: execResult.stderrTruncated,\n output_truncated: execResult.stdoutTruncated || execResult.stderrTruncated,\n error: execResult.error ?? null,\n },\n }\n } finally {\n activeShellExecRuns.delete(job.id)\n }\n}\n", "import type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from './database.types.js'\nimport type { GatewayConfig } from './gateway-state.js'\n\nexport interface RemoteShellResourceRow {\n id: string\n team_id: string\n resource_type: string\n max_access_level: string | null\n metadata: unknown\n}\n\nexport interface RemoteShellResourceValidationOptions {\n teamId: string\n gatewayId: string\n gatewayVmId?: string | null\n requiredAccess: 'read' | 'write'\n}\n\nexport type RemoteShellResourceLogger = (\n message: string,\n data?: Record<string, unknown>\n) => void\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction normalizeOptionalString(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nexport function validateRemoteShellResourceRow(\n resource: RemoteShellResourceRow | null,\n options: RemoteShellResourceValidationOptions\n): { ok: true } | { ok: false; message: string } {\n if (!resource) {\n return { ok: false, message: 'Remote shell resource not found' }\n }\n\n if (resource.team_id !== options.teamId) {\n return { ok: false, message: 'Remote shell resource belongs to another team' }\n }\n\n if (resource.resource_type !== 'remote_shell') {\n return {\n ok: false,\n message: `Resource is not a remote shell target (found ${resource.resource_type})`,\n }\n }\n\n if (options.requiredAccess === 'write' && resource.max_access_level === 'viewer') {\n return {\n ok: false,\n message:\n 'Remote shell resource is configured for viewer access. Full access is required for this action.',\n }\n }\n\n const metadata = isPlainObject(resource.metadata) ? resource.metadata : {}\n const vmId = normalizeOptionalString(metadata.vm_id)\n if (vmId) {\n if (!options.gatewayVmId || options.gatewayVmId !== vmId) {\n return {\n ok: false,\n message: 'Remote shell resource targets a different VM-backed gateway',\n }\n }\n } else {\n const gatewayId = normalizeOptionalString(metadata.gateway_id)\n if (!gatewayId) {\n return {\n ok: false,\n message: 'Remote shell resource is missing metadata.gateway_id or metadata.vm_id',\n }\n }\n\n if (gatewayId !== options.gatewayId) {\n return {\n ok: false,\n message: 'Remote shell resource targets a different gateway',\n }\n }\n }\n\n if (metadata.full_control !== true) {\n return {\n ok: false,\n message: 'Remote shell resource machine control is disabled',\n }\n }\n\n return { ok: true }\n}\n\nexport async function loadValidatedRemoteShellResource(\n supabase: SupabaseClient<Database>,\n config: GatewayConfig,\n resourceId: string,\n requiredAccess: 'read' | 'write',\n logError: RemoteShellResourceLogger = () => {}\n): Promise<{ ok: true } | { ok: false; message: string }> {\n const [{ data: resourceData, error: resourceError }, { data: gatewayData, error: gatewayError }] =\n await Promise.all([\n supabase\n .from('team_resources')\n .select('id, team_id, resource_type, max_access_level, metadata')\n .eq('id', resourceId)\n .eq('team_id', config.teamId)\n .maybeSingle(),\n supabase\n .from('team_gateways')\n .select('vm_id')\n .eq('id', config.gatewayId)\n .eq('team_id', config.teamId)\n .maybeSingle(),\n ])\n\n if (resourceError) {\n logError('Failed to load remote shell resource for gateway validation', {\n resourceId,\n gatewayId: config.gatewayId,\n teamId: config.teamId,\n error: resourceError.message,\n })\n return { ok: false, message: 'Failed to load remote shell resource' }\n }\n\n if (gatewayError) {\n logError('Failed to load gateway identity for remote shell resource validation', {\n resourceId,\n gatewayId: config.gatewayId,\n teamId: config.teamId,\n error: gatewayError.message,\n })\n return { ok: false, message: 'Failed to load gateway identity for remote shell resource' }\n }\n\n if (!gatewayData) {\n return { ok: false, message: 'Gateway identity is missing' }\n }\n\n return validateRemoteShellResourceRow(\n (resourceData as RemoteShellResourceRow | null) ?? null,\n {\n teamId: config.teamId,\n gatewayId: config.gatewayId,\n gatewayVmId: typeof gatewayData.vm_id === 'string' ? gatewayData.vm_id : null,\n requiredAccess,\n }\n )\n}\n", "export const PROVIDER_HOSTED_COMMON_CONFIG_KEYS = [\n 'model',\n 'output_format',\n 'system_prompt',\n 'append_system_prompt',\n 'json_schema',\n 'max_budget_usd',\n 'timeout_ms',\n 'max_poll_attempts',\n];\nexport const PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS = ['provider_options'];\nexport const PROVIDER_HOSTED_NORMALIZED_SEMANTICS = {\n statuses: {\n running: 'running',\n completed: 'completed',\n failed: 'failed',\n cancelled: 'cancelled',\n },\n events: {\n started: 'run_started',\n progress: 'run_progress',\n completed: 'run_completed',\n failed: 'run_failed',\n cancelled: 'run_cancelled',\n },\n output: {\n envelope: 'SubagentOutputEnvelope',\n overflow: 'overflow_artifact',\n },\n cost: 'Resolve and persist provider usage/cost before billing. Production-enabled provider-hosted lanes require provider-reported total cost. Provider/model pricing tables are implementation guardrails for disabled or experimental lanes, and unavailable cost charges the configured emergency fallback instead of dropping usage to zero.',\n error: 'Map provider terminal errors into failed/cancelled subagent status plus a durable error output envelope.',\n};\nconst ASYNC_POLL_TERMINAL_STATUSES = ['COMPLETED', 'FAILED', 'CANCELLED'];\nconst ASYNC_POLL_IN_PROGRESS_STATUSES = ['CREATED', 'IN_PROGRESS', 'QUEUED', 'RUNNING'];\nconst PERPLEXITY_ASYNC_TERMINAL_STATUSES = ['COMPLETED', 'FAILED'];\nconst PERPLEXITY_ASYNC_IN_PROGRESS_STATUSES = ['CREATED', 'IN_PROGRESS'];\nconst GOOGLE_INTERACTIONS_TERMINAL_STATUSES = ['COMPLETED', 'FAILED', 'CANCELLED'];\nconst GOOGLE_INTERACTIONS_IN_PROGRESS_STATUSES = ['IN_PROGRESS', 'QUEUED', 'CREATED'];\nconst ANTHROPIC_MANAGED_AGENTS_TERMINAL_STATUSES = ['IDLE', 'TERMINATED'];\nconst ANTHROPIC_MANAGED_AGENTS_IN_PROGRESS_STATUSES = ['RUNNING', 'RESCHEDULING'];\nexport const OPENAI_PROVIDER_HOSTED_CAPABILITIES = {\n lifecycle: {\n mode: 'async_stream_poll',\n create: { support: 'supported', notes: 'Creates a background Responses request.' },\n stream: {\n support: 'supported',\n notes: 'Streams Responses events for progress, hosted tool activity, text deltas, and terminal completion, with polling as a fallback.',\n },\n poll: {\n support: 'supported',\n notes: 'Polls the Responses request by provider response ID as a recovery/fallback path when streaming is unavailable or interrupted.',\n },\n cancel: {\n support: 'supported',\n notes: 'Cancels background Responses requests through the provider cancellation endpoint.',\n },\n terminalStatuses: [...ASYNC_POLL_TERMINAL_STATUSES, 'INCOMPLETE'],\n inProgressStatuses: [...ASYNC_POLL_IN_PROGRESS_STATUSES],\n },\n hostedTools: {\n support: 'supported',\n configurable: true,\n knownTools: [\n 'web_search',\n 'web_search_2025_08_26',\n 'web_search_preview',\n 'file_search',\n 'code_interpreter',\n 'mcp',\n ],\n notes: 'The adapter defaults to hosted web search plus code interpreter, and validates/forwards explicit hosted Responses tools. Function, shell/apply-patch, image generation, and computer-use tools are intentionally not enabled in this subagent lane.',\n },\n continuation: {\n support: 'supported',\n notes: 'Panorama re-prompts automatically continue the provider thread by wiring the saved response anchor into previous_response_id for the next run.',\n },\n structuredOutput: {\n support: 'supported',\n modes: ['json_schema', 'json_object', 'text'],\n notes: 'JSON output uses Responses text.format json_schema when a schema is configured, otherwise json_object.',\n },\n usage: {\n support: 'supported',\n usageTokens: 'supported',\n costUsd: 'unsupported',\n notes: 'Token usage is preserved when returned. OpenAI Responses does not return an authoritative per-response total cost, so this provider-hosted lane is disabled until reliable provider-reported run cost is available.',\n },\n citations: {\n support: 'supported',\n sourcesField: 'sources',\n notes: 'Sources are extracted from Responses output annotations when present.',\n },\n providerTrace: {\n support: 'supported',\n metadataFields: [\n 'external_request_id',\n 'provider_request_id',\n 'provider_previous_request_id',\n 'provider_continuation_request_id',\n 'openai_response_id',\n 'openai_previous_response_id',\n 'openai_status',\n 'openai_model',\n 'openai_tools',\n 'openai_tool_calls',\n 'openai_stream_fallback_reason',\n ],\n },\n};\nexport const PERPLEXITY_PROVIDER_HOSTED_CAPABILITIES = {\n lifecycle: {\n mode: 'async_poll',\n create: { support: 'supported', notes: 'Creates an async Sonar request.' },\n poll: { support: 'supported', notes: 'Polls the async Sonar request by Perplexity ID.' },\n cancel: {\n support: 'unsupported',\n notes: 'The documented async Sonar API exposes create, list, and get endpoints but no provider-side cancel endpoint; Panorama cancellation is local best-effort and stops polling on the next worker check.',\n },\n terminalStatuses: [...PERPLEXITY_ASYNC_TERMINAL_STATUSES],\n inProgressStatuses: [...PERPLEXITY_ASYNC_IN_PROGRESS_STATUSES],\n },\n hostedTools: {\n support: 'unsupported',\n configurable: false,\n knownTools: ['web_search'],\n notes: 'Search behavior is provider-managed through model/search options rather than Panorama-hosted tool selection.',\n },\n continuation: {\n support: 'unsupported',\n notes: 'The current provider API path has no continuation anchor; create a new subagent for another Perplexity async request.',\n },\n structuredOutput: {\n support: 'supported',\n modes: ['provider_default', 'text'],\n notes: 'JSON behavior is prompt-guided by Panorama system prompt/schema text. Provider reasoning markup is stripped before output persistence.',\n },\n usage: {\n support: 'supported',\n usageTokens: 'supported',\n costUsd: 'supported',\n notes: 'Provider usage is preserved when returned; total cost is extracted from response.usage.cost.total_cost when present.',\n },\n citations: {\n support: 'supported',\n sourcesField: 'citations',\n },\n providerTrace: {\n support: 'supported',\n metadataFields: [\n 'external_request_id',\n 'perplexity_request_id',\n 'perplexity_status',\n 'perplexity_reasoning_content_removed',\n 'perplexity_reasoning_content_truncated',\n 'citations',\n ],\n },\n};\nexport const GOOGLE_PROVIDER_HOSTED_CAPABILITIES = {\n lifecycle: {\n mode: 'async_stream_poll',\n create: {\n support: 'supported',\n notes: 'Creates a background Gemini Deep Research Interaction.',\n },\n stream: {\n support: 'supported',\n notes: 'Streams Gemini Interactions events for progress, thought summaries, tool activity, text deltas, and rich-media output metadata, with polling as a fallback.',\n },\n poll: {\n support: 'supported',\n notes: 'Polls the Interaction by provider interaction ID as the durable fallback/recovery path.',\n },\n cancel: {\n support: 'supported',\n notes: 'Cancels running background Interactions through the provider cancellation endpoint.',\n },\n terminalStatuses: [...GOOGLE_INTERACTIONS_TERMINAL_STATUSES],\n inProgressStatuses: [...GOOGLE_INTERACTIONS_IN_PROGRESS_STATUSES],\n },\n hostedTools: {\n support: 'supported',\n configurable: true,\n knownTools: ['google_search', 'url_context', 'code_execution', 'file_search', 'mcp_server'],\n notes: 'Deep Research includes Google Search, URL context, and code execution defaults. Rich media generation is off by default and can be requested explicitly through visualization/response_modalities. The adapter exposes explicit tool selection/restriction plus provider-side File Search and remote MCP server configuration; local Panorama tools and Google Computer Use are intentionally not enabled.',\n },\n continuation: {\n support: 'supported',\n notes: 'Panorama follow-up prompts continue from the saved completed Interaction via previous_interaction_id.',\n },\n structuredOutput: {\n support: 'unsupported',\n modes: ['text', 'provider_default'],\n notes: 'Gemini Deep Research currently does not support provider-enforced structured outputs. JSON output is prompt-guided only.',\n },\n usage: {\n support: 'supported',\n usageTokens: 'supported',\n costUsd: 'unsupported',\n notes: 'Interaction token usage is preserved when returned. Gemini Interactions does not return an authoritative per-interaction total cost, so this provider-hosted lane is disabled until reliable provider-reported run cost is available.',\n },\n citations: {\n support: 'supported',\n sourcesField: 'annotations',\n notes: 'Sources are extracted from Interaction output annotations and citation-like source fields when present.',\n },\n providerTrace: {\n support: 'supported',\n metadataFields: [\n 'external_request_id',\n 'provider_request_id',\n 'provider_previous_request_id',\n 'provider_continuation_request_id',\n 'google_interaction_id',\n 'google_previous_interaction_id',\n 'google_status',\n 'google_agent',\n 'google_model',\n 'google_tools',\n 'google_agent_config',\n 'google_output_types',\n 'google_rich_outputs',\n 'google_last_event_id',\n 'google_streamed',\n 'google_stream_fallback_reason',\n 'google_citations',\n ],\n },\n};\nexport const ANTHROPIC_PROVIDER_HOSTED_CAPABILITIES = {\n lifecycle: {\n mode: 'async_stream_poll',\n create: {\n support: 'supported',\n notes: 'Creates or resumes a Claude Managed Agents session and sends work through session events.',\n },\n stream: {\n support: 'supported',\n notes: 'Streams Managed Agents session events for progress, hosted tool activity, text deltas, and terminal completion, with session polling as a recovery path.',\n },\n poll: {\n support: 'supported',\n notes: 'Retrieves the Managed Agents session and persisted session events by session ID as a recovery path.',\n },\n cancel: {\n support: 'supported',\n notes: 'Interrupts active Managed Agents sessions with a provider-side user.interrupt event.',\n },\n terminalStatuses: [...ANTHROPIC_MANAGED_AGENTS_TERMINAL_STATUSES],\n inProgressStatuses: [...ANTHROPIC_MANAGED_AGENTS_IN_PROGRESS_STATUSES],\n },\n hostedTools: {\n support: 'supported',\n configurable: true,\n knownTools: [\n 'web_search',\n 'web_fetch',\n 'bash',\n 'read',\n 'write',\n 'edit',\n 'glob',\n 'grep',\n 'mcp_server',\n 'skills',\n ],\n notes: 'Claude Managed Agents run in Anthropic-managed cloud containers. The adapter defaults to the provider full built-in toolset with provider-side execution auto-approved: web search/fetch plus remote bash and file tools. It exposes explicit narrowing plus MCP servers, skills, packages, vaults, and environment networking through configuration.',\n },\n continuation: {\n support: 'supported',\n notes: 'A Panorama subagent maps to one Anthropic session; follow-up prompts send new user.message events to the saved session ID.',\n },\n structuredOutput: {\n support: 'supported',\n modes: ['provider_default', 'text'],\n notes: 'Managed Agents output is normalized from agent.message events. JSON output remains prompt-guided in this adapter.',\n },\n usage: {\n support: 'supported',\n usageTokens: 'supported',\n costUsd: 'planned',\n notes: 'Session usage exposes cumulative token statistics when available; exact synchronous Managed Agents cost collection still needs provider support. If exact cost is unavailable after a run, billing uses the marked external-provider emergency fallback rather than zero cost.',\n },\n citations: {\n support: 'supported',\n sourcesField: 'session_events',\n notes: 'Sources are extracted opportunistically from session event content, hosted web tool results, and citation-like URL fields when present.',\n },\n providerTrace: {\n support: 'supported',\n metadataFields: [\n 'external_request_id',\n 'provider_request_id',\n 'provider_previous_request_id',\n 'provider_continuation_request_id',\n 'anthropic_session_id',\n 'anthropic_agent_id',\n 'anthropic_environment_id',\n 'anthropic_user_event_id',\n 'anthropic_status',\n 'anthropic_model',\n 'anthropic_tools',\n 'anthropic_output_types',\n 'anthropic_cumulative_usage',\n 'anthropic_stream_fallback_reason',\n ],\n },\n};\nexport const PROVIDER_HOSTED_CAPABILITY_DOCUMENTS = {\n openai: {\n provider: 'openai',\n implementationTicket: 'PAN-412',\n implementationStatus: 'partial',\n capabilityDiscovery: 'complete',\n summary: 'OpenAI provider-hosted subagent infrastructure uses the Responses API with background mode, SSE progress streaming, hosted tool configuration, provider-side continuation, provider cancellation, and normalized run tracking, but the lane is not production-enabled because Responses does not return authoritative per-run total cost.',\n notes: [\n 'The canonical subagent type is openai_provider_hosted.',\n 'This lane is disabled in production surfaces until OpenAI provides reliable provider-reported total cost for the completed run or an equivalent per-run cost reconciliation mechanism.',\n 'OpenAI deep research behavior is a provider-side model/tool configuration, not a separate Panorama subagent architecture.',\n 'Hosted tools that require a separate execution loop or unsafe local action surface are not passed through by this adapter.',\n ],\n },\n perplexity: {\n provider: 'perplexity',\n implementationTicket: 'PAN-744',\n implementationStatus: 'implemented',\n capabilityDiscovery: 'complete',\n summary: 'Perplexity provider-hosted subagents use the async Sonar API with provider-managed research/search behavior, normalized run tracking, citations, usage, and local best-effort cancellation.',\n notes: [\n 'The canonical subagent type is perplexity_provider_hosted.',\n 'This is a premium external managed-agent lane; broad search-heavy Sonar research can cost materially more than internal delegation and may be roughly dollar-scale.',\n 'The async Sonar path does not expose a provider-side continuation anchor; create a new subagent for another Perplexity provider run.',\n 'The documented async Sonar API does not expose provider-side cancellation; Panorama cancellation is local best-effort.',\n 'Provider reasoning markup is stripped before output persistence; runs fail safely if no final answer remains after stripping.',\n ],\n },\n google: {\n provider: 'google',\n implementationTicket: 'PAN-413',\n implementationStatus: 'partial',\n capabilityDiscovery: 'complete',\n summary: 'Google provider-hosted subagent infrastructure uses the Gemini Interactions API with the Deep Research managed agent, background execution, streaming plus polling fallback, provider cancellation, continuation via previous_interaction_id, configurable provider-hosted tools, and normalized run tracking, but the lane is not production-enabled because Interactions does not return authoritative per-run total cost.',\n notes: [\n 'The canonical subagent type is google_provider_hosted.',\n 'This lane is disabled in production surfaces until Google provides reliable provider-reported total cost for the completed Interaction or an equivalent per-run cost reconciliation mechanism.',\n 'Google Search, URL context, and code execution are provider-managed defaults for Deep Research when no explicit tools array is sent.',\n 'Rich media generation is off by default; use visualization/response_modalities explicitly when chart, image, audio, video, or document outputs are wanted.',\n 'Explicit hosted_tools/tool_choice config can restrict provider tools, including custom-data-only file search or no-tool modes.',\n 'Provider-side File Search and remote MCP servers are configuration-gated; local Panorama tooling and Google Computer Use are intentionally not enabled in this lane.',\n 'Gemini Deep Research currently does not expose provider-enforced structured output; JSON remains prompt-guided.',\n ],\n },\n};\n", "import { SUBAGENT_SAFE_TOOL_ALLOWLIST, } from './contract.js';\nimport { ANTHROPIC_PROVIDER_HOSTED_CAPABILITIES, GOOGLE_PROVIDER_HOSTED_CAPABILITIES, OPENAI_PROVIDER_HOSTED_CAPABILITIES, PERPLEXITY_PROVIDER_HOSTED_CAPABILITIES, PROVIDER_HOSTED_CAPABILITY_DOCUMENTS, PROVIDER_HOSTED_COMMON_CONFIG_KEYS, PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS, PROVIDER_HOSTED_NORMALIZED_SEMANTICS, } from './provider-hosted.js';\nconst CLAUDE_CODE_ALLOWED_KEYS = [\n 'allowed_tools',\n 'disallowed_tools',\n 'full_control',\n 'model',\n 'output_format',\n 'system_prompt',\n 'append_system_prompt',\n 'json_schema',\n 'permission_mode',\n 'max_budget_usd',\n 'input_format',\n 'betas',\n 'no_session_persistence',\n 'session_id',\n 'resume_session_id',\n 'timeout_ms',\n 'include_partial_messages',\n];\nconst CLAUDE_CODE_ALIASES = {\n allowedTools: 'allowed_tools',\n disallowedTools: 'disallowed_tools',\n fullControl: 'full_control',\n outputFormat: 'output_format',\n systemPrompt: 'system_prompt',\n appendSystemPrompt: 'append_system_prompt',\n jsonSchema: 'json_schema',\n permissionMode: 'permission_mode',\n maxBudgetUsd: 'max_budget_usd',\n inputFormat: 'input_format',\n noSessionPersistence: 'no_session_persistence',\n sessionId: 'session_id',\n resumeSessionId: 'resume_session_id',\n timeoutMs: 'timeout_ms',\n includePartialMessages: 'include_partial_messages',\n tools: 'allowed_tools',\n};\nconst CLAUDE_CODE_DEFAULTS = {\n output_format: 'json',\n full_control: false,\n include_partial_messages: false,\n allowed_tools: ['WebSearch'],\n permission_mode: 'dontAsk',\n append_system_prompt: 'You cannot write or interact with files in this environment. ' +\n 'Include a brief \"Approach Summary\" describing the key steps, tools, or sources you used (do not reveal chain-of-thought). ' +\n 'If you output JSON, include a \"summary\" field and a \"sources\" array when applicable.',\n};\nconst CODEX_ALLOWED_KEYS = [...CLAUDE_CODE_ALLOWED_KEYS, 'reasoning_effort'];\nconst CODEX_ALIASES = {\n ...CLAUDE_CODE_ALIASES,\n reasoningEffort: 'reasoning_effort',\n};\nconst CODEX_DEFAULTS = {\n output_format: 'json',\n full_control: false,\n allowed_tools: ['WebSearch'],\n reasoning_effort: 'high',\n append_system_prompt: 'You cannot write or interact with files in this environment. ' +\n 'Include a brief \"Approach Summary\" describing the key steps, tools, or sources you used (do not reveal chain-of-thought). ' +\n 'If you output JSON, include a \"summary\" field and a \"sources\" array when applicable.',\n};\nconst GEMINI_ALLOWED_KEYS = [...CLAUDE_CODE_ALLOWED_KEYS, 'extensions'];\nconst GEMINI_ALIASES = {\n ...CLAUDE_CODE_ALIASES,\n extensions: 'extensions',\n};\nconst GEMINI_DEFAULTS = {\n output_format: 'json',\n full_control: false,\n allowed_tools: ['WebSearch'],\n append_system_prompt: 'You cannot write or interact with files in this environment. ' +\n 'Include a brief \"Approach Summary\" describing the key steps, tools, or sources you used (do not reveal chain-of-thought). ' +\n 'If you output JSON, include a \"summary\" field and a \"sources\" array when applicable.',\n};\nconst PERPLEXITY_ALLOWED_KEYS = [\n ...PROVIDER_HOSTED_COMMON_CONFIG_KEYS,\n 'reasoning_effort',\n 'search_mode',\n 'search_context_size',\n 'search_domain_filter',\n 'search_recency_filter',\n 'web_search_options',\n 'max_tokens',\n ...PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS,\n];\nconst PERPLEXITY_ALIASES = {\n outputFormat: 'output_format',\n systemPrompt: 'system_prompt',\n appendSystemPrompt: 'append_system_prompt',\n jsonSchema: 'json_schema',\n maxBudgetUsd: 'max_budget_usd',\n timeoutMs: 'timeout_ms',\n reasoningEffort: 'reasoning_effort',\n searchMode: 'search_mode',\n searchContextSize: 'search_context_size',\n searchDomainFilter: 'search_domain_filter',\n searchRecencyFilter: 'search_recency_filter',\n webSearchOptions: 'web_search_options',\n maxTokens: 'max_tokens',\n maxPollAttempts: 'max_poll_attempts',\n providerOptions: 'provider_options',\n};\nconst PERPLEXITY_DEFAULTS = {\n output_format: 'json',\n reasoning_effort: 'high',\n search_context_size: 'high',\n append_system_prompt: 'You cannot write or interact with files in this environment. ' +\n 'Return a self-contained text or JSON answer by default. Do not make the final answer depend on generated files, images, charts, or documents unless the user explicitly asks for artifacts. ' +\n 'Include a brief \"Approach Summary\" describing the key steps, tools, or sources you used (do not reveal chain-of-thought). ' +\n 'If you output JSON, include a \"summary\" field and a \"sources\" array when applicable.',\n};\nconst PERPLEXITY_PROVIDER_HOSTED_SPEC = {\n provider: 'perplexity',\n adapterId: 'perplexity',\n runtime: 'perplexity_async_sonar',\n contractVersion: 1,\n capabilities: PERPLEXITY_PROVIDER_HOSTED_CAPABILITIES,\n config: {\n commonKeys: [...PROVIDER_HOSTED_COMMON_CONFIG_KEYS],\n providerSpecificKeys: [\n 'reasoning_effort',\n 'search_mode',\n 'search_context_size',\n 'search_domain_filter',\n 'search_recency_filter',\n 'web_search_options',\n 'max_tokens',\n ],\n escapeHatchKeys: [...PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS],\n },\n normalizedSemantics: PROVIDER_HOSTED_NORMALIZED_SEMANTICS,\n};\nconst GOOGLE_ALLOWED_KEYS = [\n ...PROVIDER_HOSTED_COMMON_CONFIG_KEYS,\n 'agent',\n 'hosted_tools',\n 'tool_choice',\n 'file_search_store_names',\n 'file_search_top_k',\n 'mcp_servers',\n 'thinking_summaries',\n 'visualization',\n 'collaborative_planning',\n 'previous_interaction_id',\n 'response_modalities',\n 'service_tier',\n 'input_parts',\n ...PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS,\n];\nconst GOOGLE_ALIASES = {\n agent: 'agent',\n hostedTools: 'hosted_tools',\n toolChoice: 'tool_choice',\n outputFormat: 'output_format',\n systemPrompt: 'system_prompt',\n appendSystemPrompt: 'append_system_prompt',\n jsonSchema: 'json_schema',\n maxBudgetUsd: 'max_budget_usd',\n timeoutMs: 'timeout_ms',\n fileSearchStoreNames: 'file_search_store_names',\n fileSearchTopK: 'file_search_top_k',\n mcpServers: 'mcp_servers',\n thinkingSummaries: 'thinking_summaries',\n collaborativePlanning: 'collaborative_planning',\n previousInteractionId: 'previous_interaction_id',\n responseModalities: 'response_modalities',\n serviceTier: 'service_tier',\n inputParts: 'input_parts',\n maxPollAttempts: 'max_poll_attempts',\n providerOptions: 'provider_options',\n};\nconst GOOGLE_DEFAULTS = {\n output_format: 'text',\n thinking_summaries: 'auto',\n visualization: 'off',\n collaborative_planning: false,\n append_system_prompt: 'You cannot write or interact with local files or local computers in this environment. ' +\n 'Use only Google Deep Research provider-hosted research, code execution, file search, and remote MCP capabilities available to this managed run. ' +\n 'Return self-contained text or JSON output matching the requested output format by default. Do not generate or attach charts, images, audio, video, PDFs, documents, or other files unless the user explicitly asks for rich media or artifacts. ' +\n 'Include a brief \"Approach Summary\" describing the provider-managed sources or tools used (do not reveal chain-of-thought). ' +\n 'Include source URLs when available.',\n};\nconst GOOGLE_PROVIDER_HOSTED_SPEC = {\n provider: 'google',\n adapterId: 'google',\n runtime: 'google_interactions_deep_research',\n contractVersion: 1,\n capabilities: GOOGLE_PROVIDER_HOSTED_CAPABILITIES,\n config: {\n commonKeys: [...PROVIDER_HOSTED_COMMON_CONFIG_KEYS],\n providerSpecificKeys: [\n 'agent',\n 'hosted_tools',\n 'tool_choice',\n 'file_search_store_names',\n 'file_search_top_k',\n 'mcp_servers',\n 'thinking_summaries',\n 'visualization',\n 'collaborative_planning',\n 'previous_interaction_id',\n 'response_modalities',\n 'service_tier',\n 'input_parts',\n ],\n escapeHatchKeys: [...PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS],\n },\n normalizedSemantics: PROVIDER_HOSTED_NORMALIZED_SEMANTICS,\n};\nconst ANTHROPIC_ALLOWED_KEYS = [\n ...PROVIDER_HOSTED_COMMON_CONFIG_KEYS,\n 'agent_id',\n 'agent_name',\n 'environment_id',\n 'environment_name',\n 'session_id',\n 'title',\n 'enabled_tools',\n 'disabled_tools',\n 'agent_toolset',\n 'tool_configs',\n 'permission_policy',\n 'mcp_servers',\n 'skills',\n 'environment',\n 'networking',\n 'packages',\n 'vault_ids',\n 'anthropic_beta',\n 'metadata',\n ...PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS,\n];\nconst ANTHROPIC_ALIASES = {\n agentId: 'agent_id',\n agentName: 'agent_name',\n environmentId: 'environment_id',\n environmentName: 'environment_name',\n sessionId: 'session_id',\n outputFormat: 'output_format',\n systemPrompt: 'system_prompt',\n appendSystemPrompt: 'append_system_prompt',\n jsonSchema: 'json_schema',\n maxBudgetUsd: 'max_budget_usd',\n timeoutMs: 'timeout_ms',\n enabledTools: 'enabled_tools',\n disabledTools: 'disabled_tools',\n agentToolset: 'agent_toolset',\n toolConfigs: 'tool_configs',\n permissionPolicy: 'permission_policy',\n mcpServers: 'mcp_servers',\n vaultIds: 'vault_ids',\n anthropicBeta: 'anthropic_beta',\n maxPollAttempts: 'max_poll_attempts',\n providerOptions: 'provider_options',\n};\nconst ANTHROPIC_DEFAULTS = {\n output_format: 'text',\n append_system_prompt: 'You are running in Anthropic Claude Managed Agents, not in Panorama local infrastructure. ' +\n 'Use only provider-hosted tools and container state available in the Anthropic session. ' +\n 'Return self-contained text or JSON output matching the requested output format by default. You may use provider-hosted scratch files internally, but do not make the final answer depend on generated files, images, charts, or documents unless the user explicitly asks for artifacts. ' +\n 'Include a brief \"Approach Summary\" describing the provider-managed tools or sources used (do not reveal chain-of-thought). ' +\n 'Include source URLs when available.',\n};\nconst ANTHROPIC_PROVIDER_HOSTED_SPEC = {\n provider: 'anthropic',\n adapterId: 'anthropic',\n runtime: 'anthropic_managed_agents',\n contractVersion: 1,\n capabilities: ANTHROPIC_PROVIDER_HOSTED_CAPABILITIES,\n config: {\n commonKeys: [...PROVIDER_HOSTED_COMMON_CONFIG_KEYS],\n providerSpecificKeys: [\n 'agent_id',\n 'agent_name',\n 'environment_id',\n 'environment_name',\n 'session_id',\n 'title',\n 'enabled_tools',\n 'disabled_tools',\n 'agent_toolset',\n 'tool_configs',\n 'permission_policy',\n 'mcp_servers',\n 'skills',\n 'environment',\n 'networking',\n 'packages',\n 'vault_ids',\n 'anthropic_beta',\n 'metadata',\n ],\n escapeHatchKeys: [...PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS],\n },\n normalizedSemantics: PROVIDER_HOSTED_NORMALIZED_SEMANTICS,\n};\nconst OPENAI_ALLOWED_KEYS = [\n ...PROVIDER_HOSTED_COMMON_CONFIG_KEYS,\n 'reasoning_effort',\n 'max_output_tokens',\n 'hosted_tools',\n 'tool_choice',\n 'parallel_tool_calls',\n 'max_tool_calls',\n 'metadata',\n 'previous_response_id',\n 'store',\n 'include',\n ...PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS,\n];\nconst OPENAI_ALIASES = {\n hostedTools: 'hosted_tools',\n outputFormat: 'output_format',\n systemPrompt: 'system_prompt',\n appendSystemPrompt: 'append_system_prompt',\n jsonSchema: 'json_schema',\n maxBudgetUsd: 'max_budget_usd',\n timeoutMs: 'timeout_ms',\n reasoningEffort: 'reasoning_effort',\n maxOutputTokens: 'max_output_tokens',\n toolChoice: 'tool_choice',\n parallelToolCalls: 'parallel_tool_calls',\n maxToolCalls: 'max_tool_calls',\n previousResponseId: 'previous_response_id',\n maxPollAttempts: 'max_poll_attempts',\n providerOptions: 'provider_options',\n};\nconst OPENAI_DEFAULTS = {\n output_format: 'json',\n reasoning_effort: 'high',\n hosted_tools: [{ type: 'web_search' }, { type: 'code_interpreter' }],\n tool_choice: 'auto',\n append_system_prompt: 'You cannot write or interact with local Panorama files or local computers in this environment. ' +\n 'Use only provider-hosted OpenAI tools available to this managed run. ' +\n 'Return self-contained text or JSON output matching the requested output format by default. You may use code interpreter for analysis, but do not make the final answer depend on generated charts, images, documents, or files unless the user explicitly asks for artifacts. ' +\n 'Include a brief \"Approach Summary\" describing the key steps, tools, or sources you used (do not reveal chain-of-thought). ' +\n 'If you output JSON, include a \"summary\" field and a \"sources\" array when applicable.',\n};\nconst PANORAMA_INTERNAL_ALLOWED_KEYS = [\n 'allowed_tools',\n 'disallowed_tools',\n 'model',\n 'output_format',\n 'system_prompt',\n 'append_system_prompt',\n 'json_schema',\n 'max_budget_usd',\n 'timeout_ms',\n 'max_tool_steps',\n];\nconst PANORAMA_INTERNAL_ALIASES = {\n allowedTools: 'allowed_tools',\n disallowedTools: 'disallowed_tools',\n outputFormat: 'output_format',\n systemPrompt: 'system_prompt',\n appendSystemPrompt: 'append_system_prompt',\n jsonSchema: 'json_schema',\n maxBudgetUsd: 'max_budget_usd',\n timeoutMs: 'timeout_ms',\n maxToolSteps: 'max_tool_steps',\n tools: 'allowed_tools',\n};\nconst PANORAMA_INTERNAL_DEFAULTS = {\n allowed_tools: [...SUBAGENT_SAFE_TOOL_ALLOWLIST],\n};\nconst GATEWAY_CANCEL_ADAPTER = {\n supported: true,\n support: 'gateway',\n scope: 'gateway',\n request_mode: 'gateway_job',\n};\nconst LOCAL_BEST_EFFORT_CANCEL_ADAPTER = {\n supported: true,\n support: 'best_effort_local',\n scope: 'local',\n request_mode: 'cooperative_local',\n};\nconst UNSUPPORTED_CANCEL_ADAPTER = {\n supported: false,\n support: null,\n scope: null,\n request_mode: 'cooperative_local',\n};\nexport const SUBAGENT_TYPE_DEFINITIONS = {\n anthropic_provider_hosted: {\n id: 'anthropic_provider_hosted',\n label: 'Anthropic Provider-Hosted',\n runner: 'external',\n adapter_id: 'anthropic',\n enabled: false,\n disabledReason: 'Anthropic provider-hosted subagents are not enabled because exact synchronous Managed Agents cost accounting is not complete.',\n supports_continuation: true,\n cancel: {\n supported: true,\n support: 'provider',\n scope: 'provider',\n request_mode: 'provider_request',\n },\n config: {\n allowedKeys: [...ANTHROPIC_ALLOWED_KEYS],\n aliases: ANTHROPIC_ALIASES,\n defaults: ANTHROPIC_DEFAULTS,\n },\n provider_hosted: ANTHROPIC_PROVIDER_HOSTED_SPEC,\n },\n claude_code_gateway: {\n id: 'claude_code_gateway',\n label: 'Claude Code (Gateway)',\n runner: 'gateway',\n adapter_id: 'claude_code',\n supports_continuation: true,\n cancel: GATEWAY_CANCEL_ADAPTER,\n config: {\n allowedKeys: [...CLAUDE_CODE_ALLOWED_KEYS],\n aliases: CLAUDE_CODE_ALIASES,\n defaults: CLAUDE_CODE_DEFAULTS,\n },\n },\n codex_gateway: {\n id: 'codex_gateway',\n label: 'Codex (Gateway)',\n runner: 'gateway',\n adapter_id: 'codex',\n supports_continuation: false,\n cancel: GATEWAY_CANCEL_ADAPTER,\n config: {\n allowedKeys: [...CODEX_ALLOWED_KEYS],\n aliases: CODEX_ALIASES,\n defaults: CODEX_DEFAULTS,\n },\n },\n gemini_gateway: {\n id: 'gemini_gateway',\n label: 'Gemini CLI (Gateway)',\n runner: 'gateway',\n adapter_id: 'gemini',\n supports_continuation: false,\n cancel: GATEWAY_CANCEL_ADAPTER,\n config: {\n allowedKeys: [...GEMINI_ALLOWED_KEYS],\n aliases: GEMINI_ALIASES,\n defaults: GEMINI_DEFAULTS,\n },\n },\n google_provider_hosted: {\n id: 'google_provider_hosted',\n label: 'Google Provider-Hosted',\n runner: 'external',\n adapter_id: 'google',\n enabled: false,\n disabledReason: 'Google provider-hosted subagents are not enabled because Gemini Interactions does not return authoritative per-run total cost.',\n supports_continuation: true,\n cancel: {\n supported: true,\n support: 'provider',\n scope: 'provider',\n request_mode: 'provider_request',\n },\n config: {\n allowedKeys: [...GOOGLE_ALLOWED_KEYS],\n aliases: GOOGLE_ALIASES,\n defaults: GOOGLE_DEFAULTS,\n },\n provider_hosted: GOOGLE_PROVIDER_HOSTED_SPEC,\n },\n perplexity_provider_hosted: {\n id: 'perplexity_provider_hosted',\n label: 'Perplexity Provider-Hosted',\n runner: 'external',\n adapter_id: 'perplexity',\n supports_continuation: false,\n cancel: LOCAL_BEST_EFFORT_CANCEL_ADAPTER,\n config: {\n allowedKeys: [...PERPLEXITY_ALLOWED_KEYS],\n aliases: PERPLEXITY_ALIASES,\n defaults: PERPLEXITY_DEFAULTS,\n },\n provider_hosted: {\n ...PERPLEXITY_PROVIDER_HOSTED_SPEC,\n },\n },\n openai_provider_hosted: {\n id: 'openai_provider_hosted',\n label: 'OpenAI Provider-Hosted',\n runner: 'external',\n adapter_id: 'openai',\n enabled: false,\n disabledReason: 'OpenAI provider-hosted subagents are not enabled because Responses does not return authoritative per-run total cost.',\n supports_continuation: true,\n cancel: {\n supported: true,\n support: 'provider',\n scope: 'provider',\n request_mode: 'provider_request',\n },\n config: {\n allowedKeys: [...OPENAI_ALLOWED_KEYS],\n aliases: OPENAI_ALIASES,\n defaults: OPENAI_DEFAULTS,\n },\n provider_hosted: {\n provider: 'openai',\n adapterId: 'openai',\n runtime: 'openai_responses_background',\n contractVersion: 1,\n capabilities: OPENAI_PROVIDER_HOSTED_CAPABILITIES,\n config: {\n commonKeys: [...PROVIDER_HOSTED_COMMON_CONFIG_KEYS],\n providerSpecificKeys: [\n 'reasoning_effort',\n 'max_output_tokens',\n 'hosted_tools',\n 'tool_choice',\n 'parallel_tool_calls',\n 'max_tool_calls',\n 'metadata',\n 'previous_response_id',\n 'store',\n 'include',\n ],\n escapeHatchKeys: [...PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS],\n },\n normalizedSemantics: PROVIDER_HOSTED_NORMALIZED_SEMANTICS,\n },\n },\n panorama_internal: {\n id: 'panorama_internal',\n label: 'Panorama (Internal)',\n runner: 'worker',\n adapter_id: 'panorama',\n supports_continuation: false,\n cancel: LOCAL_BEST_EFFORT_CANCEL_ADAPTER,\n config: {\n allowedKeys: [...PANORAMA_INTERNAL_ALLOWED_KEYS],\n aliases: PANORAMA_INTERNAL_ALIASES,\n defaults: PANORAMA_INTERNAL_DEFAULTS,\n },\n },\n};\nfunction normalizeStringList(value, options) {\n if (value == null)\n return undefined;\n if (Array.isArray(value)) {\n const list = value.map((item) => String(item).trim()).filter((item) => item.length > 0);\n if (list.length > 0)\n return list;\n return options?.allowEmpty ? [] : undefined;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed)\n return options?.allowEmpty ? [] : undefined;\n const list = trimmed\n .split(',')\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n if (list.length > 0)\n return list;\n return options?.allowEmpty ? [] : undefined;\n }\n return undefined;\n}\nfunction normalizeNumber(value) {\n if (typeof value === 'number' && Number.isFinite(value))\n return value;\n if (typeof value === 'string') {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n}\nfunction normalizeBoolean(value) {\n if (typeof value === 'boolean')\n return value;\n if (typeof value === 'string') {\n const trimmed = value.trim().toLowerCase();\n if (trimmed === 'true')\n return true;\n if (trimmed === 'false')\n return false;\n }\n return undefined;\n}\nfunction normalizeConfigValue(key, value) {\n if (key === 'allowed_tools' ||\n key === 'disallowed_tools' ||\n key === 'file_search_store_names' ||\n key === 'enabled_tools' ||\n key === 'disabled_tools' ||\n key === 'vault_ids' ||\n key === 'anthropic_beta' ||\n key === 'response_modalities') {\n return normalizeStringList(value, { allowEmpty: true });\n }\n if (key === 'betas' || key === 'extensions') {\n return normalizeStringList(value);\n }\n if (key === 'max_tool_steps' || key === 'file_search_top_k') {\n const numeric = normalizeNumber(value);\n if (!numeric || numeric <= 0)\n return undefined;\n return Math.max(1, Math.round(numeric));\n }\n if (key === 'max_budget_usd' || key === 'timeout_ms') {\n return normalizeNumber(value);\n }\n if (key === 'no_session_persistence' ||\n key === 'include_partial_messages' ||\n key === 'full_control' ||\n key === 'parallel_tool_calls' ||\n key === 'store' ||\n key === 'collaborative_planning') {\n return normalizeBoolean(value);\n }\n if (key === 'output_format') {\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n if (normalized === 'json' || normalized === 'text') {\n return normalized;\n }\n if (normalized === 'stream-json' || normalized === 'stream_json' || normalized === 'stream') {\n return 'stream-json';\n }\n }\n return undefined;\n }\n if (key === 'reasoning_effort') {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n return undefined;\n }\n if (key === 'search_context_size' ||\n key === 'search_mode' ||\n key === 'search_recency_filter' ||\n key === 'agent' ||\n key === 'agent_id' ||\n key === 'agent_name' ||\n key === 'environment_id' ||\n key === 'environment_name' ||\n key === 'session_id' ||\n key === 'title' ||\n key === 'agent_toolset' ||\n key === 'thinking_summaries' ||\n key === 'visualization' ||\n key === 'previous_interaction_id' ||\n key === 'service_tier') {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n return undefined;\n }\n if (key === 'max_tokens' || key === 'max_output_tokens') {\n return normalizeNumber(value);\n }\n if (key === 'max_poll_attempts' || key === 'max_tool_calls') {\n const numeric = normalizeNumber(value);\n if (numeric === undefined || numeric <= 0)\n return undefined;\n return Math.max(1, Math.round(numeric));\n }\n if (key === 'hosted_tools') {\n if (Array.isArray(value)) {\n return value;\n }\n const list = normalizeStringList(value);\n return list && list.length > 0 ? list : undefined;\n }\n if (key === 'include') {\n if (Array.isArray(value)) {\n return value.length > 0 ? value : undefined;\n }\n const list = normalizeStringList(value);\n return list && list.length > 0 ? list : undefined;\n }\n if (key === 'mcp_servers' || key === 'skills' || key === 'tool_configs') {\n return Array.isArray(value) && value.length > 0 ? value : undefined;\n }\n if (key === 'input_parts') {\n return Array.isArray(value) && value.length > 0 ? value : undefined;\n }\n if (key === 'tool_choice') {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value;\n }\n return undefined;\n }\n if (key === 'metadata' ||\n key === 'environment' ||\n key === 'networking' ||\n key === 'packages' ||\n key === 'permission_policy') {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value;\n }\n return undefined;\n }\n if (key === 'previous_response_id') {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n return undefined;\n }\n if (key === 'provider_options') {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value;\n }\n return undefined;\n }\n if (value === undefined)\n return undefined;\n return value;\n}\nexport function getSubagentTypeDefinition(id) {\n return SUBAGENT_TYPE_DEFINITIONS[id] ?? null;\n}\nexport function getSubagentCancelAdapter(id) {\n const definition = getSubagentTypeDefinition(id);\n if (!definition)\n return UNSUPPORTED_CANCEL_ADAPTER;\n return definition.cancel;\n}\nexport function isProviderHostedSubagentDefinition(definition) {\n return definition?.runner === 'external' && !!definition.provider_hosted;\n}\nexport function getProviderHostedSubagentDefinitions() {\n return Object.values(SUBAGENT_TYPE_DEFINITIONS).filter((definition) => isProviderHostedSubagentDefinition(definition) && definition.enabled !== false);\n}\nexport function getProviderHostedProviderDocument(provider) {\n return PROVIDER_HOSTED_CAPABILITY_DOCUMENTS[provider];\n}\nexport function getSubagentExecutionContext(definition) {\n switch (definition.runner) {\n case 'gateway':\n return {\n execution_lane: 'cloud',\n execution_bridge: 'gateway',\n execution_substrate: 'gateway_host',\n trust_zone: 'user_delegated_host',\n delegate_kind: 'gateway_cli',\n };\n case 'external':\n return {\n execution_lane: 'cloud',\n execution_bridge: 'worker',\n execution_substrate: 'provider_service',\n trust_zone: 'provider_hosted',\n delegate_kind: 'provider_service',\n };\n case 'worker':\n default:\n return {\n execution_lane: 'cloud',\n execution_bridge: 'worker',\n execution_substrate: 'panorama_cloud',\n trust_zone: 'panorama_managed',\n delegate_kind: 'panorama_internal',\n };\n }\n}\nexport function normalizeSubagentConfig(definition, rawConfig) {\n const normalized = {\n ...(definition.config.defaults ?? {}),\n };\n const warnings = [];\n if (!rawConfig || typeof rawConfig !== 'object' || Array.isArray(rawConfig)) {\n return { config: normalized, warnings };\n }\n for (const [rawKey, rawValue] of Object.entries(rawConfig)) {\n const mappedKey = definition.config.aliases[rawKey] ?? rawKey;\n if (!definition.config.allowedKeys.includes(mappedKey)) {\n warnings.push(`Unsupported config key ignored: ${rawKey}`);\n continue;\n }\n const normalizedValue = normalizeConfigValue(mappedKey, rawValue);\n if (normalizedValue === undefined || normalizedValue === null) {\n if (rawValue !== undefined && rawValue !== null) {\n warnings.push(`Invalid value for ${rawKey} ignored`);\n }\n continue;\n }\n normalized[mappedKey] = normalizedValue;\n }\n return { config: normalized, warnings };\n}\n", "import { getSubagentExecutionContext } from '@panorama/shared/subagents/registry'\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport { randomUUID } from 'node:crypto'\nimport type { Database } from './database.types.js'\nimport { asJson } from './gateway-run-helpers.js'\nimport type { ActiveSubagentRun } from './gateway-runtime-state.js'\nimport {\n SUBAGENT_SCHEMA_VERSION,\n type SubagentRunPlan,\n} from './subagent-adapters/types.js'\nimport { buildErrorOutput, mergeMetadata } from './subagent-run-helpers.js'\nimport {\n resolveProviderCommand,\n resolveSubagentRunId,\n} from './subagent-run-job.js'\nimport {\n executeSubagentRunPlan,\n} from './subagent-run-execution.js'\nimport { finalizeExecutedSubagentRun } from './gateway-subagent-run-finalizer.js'\nimport {\n loadSubagentRunTarget,\n resolveSubagentRunPolicy,\n} from './gateway-subagent-run-target.js'\nimport type {\n GatewaySubagentRunJobResult,\n HandleGatewaySubagentRunJobParams,\n SubagentRunEventEmitter,\n SubagentRunRow,\n} from './gateway-subagent-run-types.js'\n\nexport type {\n GatewaySubagentRunControlState,\n GatewaySubagentRunEventInsert,\n GatewaySubagentRunJobResult,\n HandleGatewaySubagentRunJobParams,\n} from './gateway-subagent-run-types.js'\n\nfunction createSubagentRunEventEmitter(params: {\n handlerParams: HandleGatewaySubagentRunJobParams\n supabase: SupabaseClient<Database>\n runId: string\n subagentId: string\n teamId: string\n gatewayId: string | null\n}): SubagentRunEventEmitter {\n let nextEventSequence: number | null = null\n\n return async (eventType, eventPayload) => {\n if (nextEventSequence == null) {\n nextEventSequence = await params.handlerParams.getNextSubagentRunEventSequence(\n params.supabase,\n params.runId\n )\n }\n const insertedSequence = await params.handlerParams.insertSubagentRunEvent({\n supabase: params.supabase,\n runId: params.runId,\n subagentId: params.subagentId,\n teamId: params.teamId,\n gatewayId: params.gatewayId,\n sequence: nextEventSequence,\n eventType,\n payload: eventPayload,\n })\n if (typeof insertedSequence === 'number') {\n nextEventSequence = insertedSequence + 1\n }\n }\n}\n\nasync function recordPendingCancelledRun(params: {\n handlerParams: HandleGatewaySubagentRunJobParams\n supabase: SupabaseClient<Database>\n subagent: SubagentRunRow\n subagentId: string\n resolvedRunId: string\n runSequence: number\n prompt: string\n runMetadata: Record<string, unknown>\n pendingCancelReason: string\n emitRunEvent: SubagentRunEventEmitter\n}): Promise<GatewaySubagentRunJobResult> {\n const {\n handlerParams,\n supabase,\n subagent,\n subagentId,\n resolvedRunId,\n runSequence,\n prompt,\n runMetadata,\n pendingCancelReason,\n emitRunEvent,\n } = params\n handlerParams.clearPendingCancel(subagentId, resolvedRunId)\n const nowIso = new Date().toISOString()\n const cancelledOutput = buildErrorOutput(pendingCancelReason)\n\n const { error: cancelInsertError } = await supabase.from('subagent_runs').insert({\n id: resolvedRunId,\n subagent_id: subagentId,\n team_id: subagent.team_id,\n gateway_id: subagent.gateway_id,\n run_sequence: runSequence,\n status: 'cancelled',\n prompt,\n output: asJson(cancelledOutput),\n error: pendingCancelReason,\n started_at: nowIso,\n completed_at: nowIso,\n metadata: asJson({\n ...runMetadata,\n cancel_reason: pendingCancelReason,\n cancel_support: 'gateway',\n cancel_state: 'acknowledged',\n cancellation_scope: 'gateway',\n cancelled: true,\n }),\n })\n\n if (cancelInsertError) {\n return {\n ok: false,\n result: { message: 'Failed to record cancelled run', subagent_id: subagentId },\n error: cancelInsertError.message,\n }\n }\n\n await emitRunEvent('cancellation_requested', {\n reason: pendingCancelReason,\n source: 'pending_cancel',\n stage: 'before_start',\n })\n await emitRunEvent('cancellation_acknowledged', {\n reason: pendingCancelReason,\n source: 'gateway',\n cancellation_scope: 'gateway',\n })\n await emitRunEvent('run_cancelled', {\n reason: pendingCancelReason,\n source: 'gateway',\n cancellation_scope: 'gateway',\n })\n\n return {\n ok: true,\n result: {\n subagent_id: subagentId,\n status: 'cancelled',\n output: cancelledOutput,\n error: pendingCancelReason,\n },\n }\n}\n\nasync function insertRunningSubagentRun(params: {\n supabase: SupabaseClient<Database>\n subagent: SubagentRunRow\n subagentId: string\n resolvedRunId: string\n runSequence: number\n prompt: string\n startedAt: string\n runMetadata: Record<string, unknown>\n}): Promise<GatewaySubagentRunJobResult | null> {\n const {\n supabase,\n subagent,\n subagentId,\n resolvedRunId,\n runSequence,\n prompt,\n startedAt,\n runMetadata,\n } = params\n const { error: runInsertError } = await supabase.from('subagent_runs').insert({\n id: resolvedRunId,\n subagent_id: subagentId,\n team_id: subagent.team_id,\n gateway_id: subagent.gateway_id,\n run_sequence: runSequence,\n status: 'running',\n prompt,\n started_at: startedAt,\n metadata: asJson(runMetadata),\n })\n\n if (!runInsertError) {\n return null\n }\n\n if (runInsertError.code === '23505') {\n const { data: existingRunningRun, error: existingRunningRunError } = await supabase\n .from('subagent_runs')\n .select('id, status')\n .eq('subagent_id', subagentId)\n .eq('status', 'running')\n .order('run_sequence', { ascending: false })\n .limit(1)\n .maybeSingle()\n\n if (existingRunningRunError) {\n return {\n ok: false,\n result: {\n message: 'Failed to resolve conflicting subagent run after insert conflict',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n },\n error: existingRunningRunError.message,\n }\n }\n\n if (existingRunningRun?.id && existingRunningRun.id !== resolvedRunId) {\n return {\n ok: false,\n result: {\n message: 'Skipped duplicate subagent job because another run is already active',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n active_run_id: existingRunningRun.id,\n },\n jobStatus: 'cancelled',\n skipSubagentFailure: true,\n error: 'Another subagent run is already active',\n }\n }\n }\n\n return {\n ok: false,\n result: { message: 'Failed to create subagent run', subagent_id: subagentId },\n error: runInsertError.message,\n }\n}\n\nasync function markSubagentRunStarted(params: {\n handlerParams: HandleGatewaySubagentRunJobParams\n supabase: SupabaseClient<Database>\n subagentId: string\n resolvedRunId: string\n runSequence: number\n startedAt: string\n metadata: Record<string, unknown>\n}): Promise<GatewaySubagentRunJobResult | null> {\n const {\n handlerParams,\n supabase,\n subagentId,\n resolvedRunId,\n runSequence,\n startedAt,\n metadata,\n } = params\n const { data: startedSubagent, error: startSubagentUpdateError } = await supabase\n .from('subagents')\n .update({\n status: 'running',\n started_at: startedAt,\n metadata: asJson(\n mergeMetadata(metadata, {\n current_run_id: resolvedRunId,\n current_run_sequence: runSequence,\n })\n ),\n })\n .eq('id', subagentId)\n .eq('status', 'running')\n .select('id')\n .maybeSingle()\n\n if (startSubagentUpdateError) {\n handlerParams.activeSubagentRuns.delete(subagentId)\n return {\n ok: false,\n result: {\n message: 'Failed to mark subagent as running',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n },\n error: startSubagentUpdateError.message,\n }\n }\n if (!startedSubagent?.id) {\n handlerParams.activeSubagentRuns.delete(subagentId)\n return {\n ok: false,\n result: {\n message: 'Subagent status changed before gateway execution could start',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n },\n jobStatus: 'cancelled',\n skipSubagentFailure: true,\n error: 'Subagent status changed before gateway execution could start',\n }\n }\n\n return null\n}\n\nexport async function handleGatewaySubagentRunJob(\n params: HandleGatewaySubagentRunJobParams\n): Promise<GatewaySubagentRunJobResult> {\n const { supabase, job } = params\n const targetResult = await loadSubagentRunTarget(params)\n if (!targetResult.ok) return targetResult.result\n const target = targetResult.target\n const policyResult = await resolveSubagentRunPolicy(params, target)\n if (!policyResult.ok) return policyResult.result\n const {\n subagent,\n subagentId,\n payloadRunId,\n adapter,\n subagentType,\n prompt,\n inputRunId,\n inputRunSequence,\n configPayload,\n metadata,\n subagentFullControlRequested,\n resumeSessionId,\n } = target\n const {\n adapterId,\n providerSupport,\n effectiveFullControl,\n fullControlDeniedReason,\n retryConfig,\n } = policyResult.policy\n\n const resolvedRunId = resolveSubagentRunId(\n payloadRunId,\n inputRunId,\n params.createRunId ?? randomUUID\n )\n const nowIso = new Date().toISOString()\n const runSequence =\n inputRunSequence ?? (await params.getNextRunSequence(supabase, subagentId))\n const executionContext = getSubagentExecutionContext({\n runner: 'gateway',\n })\n const runMetadata: Record<string, unknown> = {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n runner: 'gateway',\n adapter_id: adapterId,\n subagent_type: subagentType,\n run_id: resolvedRunId,\n run_sequence: runSequence,\n cancel_state: 'none',\n full_control_requested: subagentFullControlRequested,\n full_control_effective: effectiveFullControl,\n full_control_denied_reason: fullControlDeniedReason,\n ...executionContext,\n }\n\n const emitRunEvent = createSubagentRunEventEmitter({\n handlerParams: params,\n supabase,\n runId: resolvedRunId,\n subagentId,\n teamId: subagent.team_id,\n gatewayId: subagent.gateway_id,\n })\n\n const pendingCancelReason = params.resolvePendingCancel(subagentId, resolvedRunId, metadata)\n if (pendingCancelReason) {\n return await recordPendingCancelledRun({\n handlerParams: params,\n supabase,\n subagent,\n subagentId,\n resolvedRunId,\n runSequence,\n prompt,\n runMetadata,\n pendingCancelReason,\n emitRunEvent,\n })\n }\n\n const insertErrorResult = await insertRunningSubagentRun({\n supabase,\n subagent,\n subagentId,\n resolvedRunId,\n runSequence,\n prompt,\n startedAt: nowIso,\n runMetadata,\n })\n if (insertErrorResult) return insertErrorResult\n\n const activeRun: ActiveSubagentRun = {\n runId: resolvedRunId,\n cancelled: false,\n }\n params.activeSubagentRuns.set(subagentId, activeRun)\n\n const latePendingCancelReason = params.consumePendingCancelFromQueue(subagentId, resolvedRunId)\n if (latePendingCancelReason) {\n activeRun.cancelled = true\n activeRun.cancelReason = latePendingCancelReason\n }\n\n const startErrorResult = await markSubagentRunStarted({\n handlerParams: params,\n supabase,\n subagentId,\n resolvedRunId,\n runSequence,\n startedAt: nowIso,\n metadata,\n })\n if (startErrorResult) return startErrorResult\n\n await emitRunEvent('run_started', {\n runner: 'gateway',\n adapter_id: adapterId,\n ...executionContext,\n subagent_type: subagentType,\n run_id: resolvedRunId,\n run_sequence: runSequence,\n })\n\n const failRun = async (\n message: string,\n options?: { metadata?: Record<string, unknown> }\n ): Promise<{\n ok: false\n result: Record<string, unknown>\n error: string\n }> => {\n const failureOutput = buildErrorOutput(message)\n const completedAt = new Date().toISOString()\n const metadataUpdate = mergeMetadata(runMetadata, options?.metadata ?? {})\n\n const { error: runFailureUpdateError } = await supabase\n .from('subagent_runs')\n .update({\n status: 'failed',\n output: asJson(failureOutput),\n error: message,\n completed_at: completedAt,\n metadata: asJson(metadataUpdate),\n })\n .eq('id', resolvedRunId)\n .eq('status', 'running')\n\n if (runFailureUpdateError) {\n params.logError('Failed to persist failed subagent run state', {\n subagentId,\n runId: resolvedRunId,\n error: runFailureUpdateError.message,\n })\n }\n\n const { error: subagentFailureUpdateError } = await supabase\n .from('subagents')\n .update({\n status: 'failed',\n output: asJson(failureOutput),\n error: message,\n completed_at: completedAt,\n metadata: asJson(mergeMetadata(metadata, options?.metadata ?? {})),\n })\n .eq('id', subagentId)\n .eq('status', 'running')\n\n if (subagentFailureUpdateError) {\n params.logError('Failed to persist failed subagent state', {\n subagentId,\n runId: resolvedRunId,\n error: subagentFailureUpdateError.message,\n })\n }\n\n await emitRunEvent('run_failed', {\n reason: message,\n source: 'gateway',\n stage: 'pre_execution',\n })\n\n params.activeSubagentRuns.delete(subagentId)\n\n const persistenceErrors = [\n runFailureUpdateError ? `run update: ${runFailureUpdateError.message}` : null,\n subagentFailureUpdateError ? `subagent update: ${subagentFailureUpdateError.message}` : null,\n ].filter((value): value is string => !!value)\n const error =\n persistenceErrors.length > 0\n ? `${message} (persistence errors: ${persistenceErrors.join('; ')})`\n : message\n\n return {\n ok: false,\n result: { message, subagent_id: subagentId },\n error,\n }\n }\n\n if (subagentFullControlRequested && !effectiveFullControl) {\n const deniedReason = fullControlDeniedReason ?? 'Gateway elevated provider mode is unavailable.'\n return await failRun(deniedReason, {\n metadata: {\n full_control_requested: true,\n full_control_effective: false,\n full_control_denied_reason: deniedReason,\n },\n })\n }\n\n let runPlan: SubagentRunPlan\n\n try {\n const command = resolveProviderCommand({\n providerId: adapterId,\n resolveClaudeCommand: params.resolveClaudeCommand,\n resolveCodexCommand: params.resolveCodexCommand,\n resolveGeminiCommand: params.resolveGeminiCommand,\n })\n\n runPlan = adapter.buildRunPlan({\n prompt,\n config: configPayload,\n command,\n support: providerSupport as Record<string, boolean>,\n fullControl: effectiveFullControl,\n resumeSessionId,\n })\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to build subagent run plan'\n return await failRun(message)\n }\n\n if (runPlan.outputFormat === 'stream-json') {\n if (!adapter.normalizeStreamingResult || !adapter.normalizeStreamEvents) {\n return await failRun('Subagent adapter does not support normalized streaming output')\n }\n }\n\n try {\n const executionResult = await executeSubagentRunPlan({\n runPlan,\n adapter,\n retryConfig,\n workRoot: params.resolveSubagentWorkdirRoot(),\n workSegments: [\n { value: subagentId, label: 'subagent id' },\n { value: resolvedRunId, label: 'run id' },\n ],\n defaultTimeoutMs: params.defaultTimeoutMs,\n runCommand: params.runCommand,\n runStreamingCommand: params.runStreamingCommand,\n emitRunEvent,\n logInfo: params.logInfo,\n logContext: { subagentId, runId: resolvedRunId },\n isCancelled: () => activeRun.cancelled,\n onStart: (child, context) => {\n activeRun.child = child\n if (activeRun.cancelled) {\n params.requestChildTermination(child, {\n reason: activeRun.cancelReason ?? 'Cancelled',\n graceMs: params.cancelKillTimeoutMs,\n context,\n })\n }\n },\n })\n return await finalizeExecutedSubagentRun({\n handlerParams: params,\n supabase,\n job,\n adapter,\n subagentId,\n subagentType,\n resolvedRunId,\n runSequence,\n runPlan,\n activeRun,\n executionResult,\n retryConfig,\n executionContext,\n subagentFullControlRequested,\n effectiveFullControl,\n emitRunEvent,\n })\n } finally {\n params.activeSubagentRuns.delete(subagentId)\n }\n}\n", "import { deriveGatewayMachineControlState } from '@panorama/shared/gateway/capabilities'\nimport { randomUUID } from 'node:crypto'\nimport type { GatewayProviderId } from './cli-providers/types.js'\nimport type { FullControlSupportResult } from './subagent-full-control.js'\nimport {\n extractSubagentPrompt,\n isUuid,\n type SubagentRetryConfig,\n} from './subagent-run-helpers.js'\n\nexport interface ParsedSubagentRunPayload {\n subagentId: string | null\n payloadRunId: string | null\n}\n\nexport interface ParsedSubagentRunInput {\n prompt: string | null\n inputRunId: string | null\n inputRunSequence: number | null\n}\n\nexport interface ResolvedSubagentFullControlState {\n effectiveFullControl: boolean\n deniedReason: string | null\n}\n\nexport function parseSubagentRunPayload(payload: Record<string, unknown>): ParsedSubagentRunPayload {\n const payloadRunId =\n typeof payload.run_id === 'string'\n ? payload.run_id.trim()\n : typeof payload.runId === 'string'\n ? payload.runId.trim()\n : null\n const subagentId =\n typeof payload.subagent_id === 'string'\n ? payload.subagent_id\n : typeof payload.subagentId === 'string'\n ? payload.subagentId\n : null\n\n return { subagentId, payloadRunId }\n}\n\nexport function parseSubagentRunInput(input: Record<string, unknown>): ParsedSubagentRunInput {\n const inputRunId = typeof input.run_id === 'string' ? input.run_id.trim() : null\n const rawRunSequence =\n typeof input.run_sequence === 'number'\n ? input.run_sequence\n : typeof input.runSequence === 'number'\n ? input.runSequence\n : typeof input.run_sequence === 'string'\n ? Number.parseInt(input.run_sequence, 10)\n : typeof input.runSequence === 'string'\n ? Number.parseInt(input.runSequence, 10)\n : NaN\n const inputRunSequence = Number.isFinite(rawRunSequence) ? rawRunSequence : null\n\n return {\n prompt: extractSubagentPrompt(input),\n inputRunId,\n inputRunSequence,\n }\n}\n\nexport function buildDefaultSubagentRetryConfig(): SubagentRetryConfig {\n return {\n maxAttempts: 1,\n backoffMs: 0,\n maxBackoffMs: 0,\n retryOnCapacity: false,\n retryOnTimeout: false,\n retryOnNetwork: false,\n retryOnParse: false,\n }\n}\n\nexport function resolveSubagentRunId(\n payloadRunId: string | null,\n inputRunId: string | null,\n createId: () => string = randomUUID\n): string {\n if (payloadRunId && isUuid(payloadRunId)) return payloadRunId\n if (inputRunId && isUuid(inputRunId)) return inputRunId\n return createId()\n}\n\nexport function resolveSubagentFullControlState(params: {\n requested: boolean\n installFullControlEnabled: boolean\n gatewayFullControlEnabled: boolean\n providerFullControlSupport: FullControlSupportResult\n}): ResolvedSubagentFullControlState {\n const machineControl = deriveGatewayMachineControlState({\n gatewayEnabled: params.gatewayFullControlEnabled,\n installEnabled: params.installFullControlEnabled,\n })\n const effectiveFullControl =\n params.requested && machineControl.effective && params.providerFullControlSupport.supported\n\n if (!params.requested || effectiveFullControl) {\n return { effectiveFullControl, deniedReason: null }\n }\n\n const deniedReason =\n machineControl.reason ??\n params.providerFullControlSupport.reason ??\n 'Gateway elevated provider mode is unavailable.'\n\n return { effectiveFullControl, deniedReason }\n}\n\nexport function resolveProviderCommand(params: {\n providerId: GatewayProviderId\n resolveClaudeCommand: () => string\n resolveCodexCommand: () => string\n resolveGeminiCommand: () => string\n}): string {\n if (params.providerId === 'codex') return params.resolveCodexCommand()\n if (params.providerId === 'gemini') return params.resolveGeminiCommand()\n return params.resolveClaudeCommand()\n}\n", "import type { ChildProcess } from 'node:child_process'\nimport type {\n GatewayCommandResult,\n GatewayCommandRunOptions,\n GatewayStreamingCommandResult,\n} from './gateway-command-runner.js'\nimport type {\n SubagentAdapter,\n SubagentNormalizeResult,\n SubagentRunPlan,\n} from './subagent-adapters/types.js'\nimport {\n cleanupWorkDir,\n createWorkDir,\n resolveRunPlanEnv,\n sleep,\n writeRunPlanFiles,\n} from './gateway-run-helpers.js'\nimport {\n buildErrorOutput,\n classifySubagentRetryable,\n computeRetryDelayMs,\n type SubagentRetryConfig,\n} from './subagent-run-helpers.js'\n\nexport type SubagentCommandStartContext = 'subagent_run_on_start' | 'subagent_run_streaming_on_start'\nexport type SubagentCommandRunOptions = GatewayCommandRunOptions\nexport type SubagentCommandResult = GatewayCommandResult\nexport type SubagentStreamingCommandResult = GatewayStreamingCommandResult\n\nexport type SubagentCommandRunner = (\n command: string,\n args: string[],\n options: SubagentCommandRunOptions\n) => Promise<SubagentCommandResult>\n\nexport type SubagentStreamingCommandRunner = (\n command: string,\n args: string[],\n options: SubagentCommandRunOptions\n) => Promise<SubagentStreamingCommandResult>\n\nexport interface ExecuteSubagentRunPlanOptions {\n runPlan: SubagentRunPlan\n adapter: Pick<\n SubagentAdapter,\n 'normalizeRunResult' | 'normalizeStreamingResult' | 'normalizeStreamEvents'\n >\n retryConfig: SubagentRetryConfig\n workRoot: string\n workSegments: Array<{ value: string; label: string }>\n defaultTimeoutMs: number\n runCommand: SubagentCommandRunner\n runStreamingCommand: SubagentStreamingCommandRunner\n emitRunEvent: (eventType: string, payload: Record<string, unknown>) => Promise<void>\n logInfo?: (message: string, data?: Record<string, unknown>) => void\n logContext?: Record<string, unknown>\n isCancelled?: () => boolean\n onStart?: (child: ChildProcess, context: SubagentCommandStartContext) => void\n sleepFn?: (ms: number) => Promise<void>\n computeRetryDelayMsFn?: (attempt: number, baseMs: number, maxMs: number) => number\n}\n\nexport interface ExecuteSubagentRunPlanResult {\n activeResult: SubagentCommandResult\n streamResult: SubagentStreamingCommandResult | null\n normalized: SubagentNormalizeResult\n attempt: number\n retryReasons: string[]\n}\n\nfunction buildExecutionFailureResult(message: string): SubagentCommandResult {\n return {\n ok: false,\n stdout: '',\n stderr: message,\n exitCode: null,\n durationMs: 0,\n timedOut: false,\n stdoutTruncated: false,\n stderrTruncated: false,\n error: message,\n }\n}\n\nfunction buildExecutionFailureNormalization(message: string): SubagentNormalizeResult {\n return {\n output: buildErrorOutput(message) as unknown as SubagentNormalizeResult['output'],\n metadata: {},\n parseError: null,\n }\n}\n\nexport async function executeSubagentRunPlan(\n options: ExecuteSubagentRunPlanOptions\n): Promise<ExecuteSubagentRunPlanResult> {\n const {\n runPlan,\n adapter,\n retryConfig,\n workRoot,\n workSegments,\n defaultTimeoutMs,\n runCommand,\n runStreamingCommand,\n emitRunEvent,\n } = options\n const isCancelled = options.isCancelled ?? (() => false)\n const sleepFn = options.sleepFn ?? sleep\n const computeDelay = options.computeRetryDelayMsFn ?? computeRetryDelayMs\n const retryReasons: string[] = []\n let workDir = ''\n\n try {\n workDir = await createWorkDir(workRoot, workSegments)\n await writeRunPlanFiles(workDir, runPlan.files)\n const resolvedEnv = resolveRunPlanEnv(runPlan.env, workDir)\n let runResult: SubagentCommandResult | null = null\n let streamResult: SubagentStreamingCommandResult | null = null\n let activeResult: SubagentCommandResult | null = null\n let normalized: SubagentNormalizeResult | null = null\n let attempt = 0\n\n while (attempt < retryConfig.maxAttempts) {\n attempt += 1\n runResult = null\n streamResult = null\n activeResult = null\n normalized = null\n let executionError: string | null = null\n\n await emitRunEvent('run_progress', {\n phase: 'attempt_started',\n attempt,\n max_attempts: retryConfig.maxAttempts,\n })\n\n try {\n if (runPlan.outputFormat === 'stream-json') {\n streamResult = await runStreamingCommand(runPlan.command, runPlan.args, {\n timeoutMs: runPlan.timeoutMs ?? defaultTimeoutMs,\n cwd: workDir,\n env: resolvedEnv,\n onStart: (child) => options.onStart?.(child, 'subagent_run_streaming_on_start'),\n })\n } else {\n runResult = await runCommand(runPlan.command, runPlan.args, {\n timeoutMs: runPlan.timeoutMs ?? defaultTimeoutMs,\n cwd: workDir,\n env: resolvedEnv,\n onStart: (child) => options.onStart?.(child, 'subagent_run_on_start'),\n })\n }\n } catch (error) {\n executionError = error instanceof Error ? error.message : 'Subagent run failed'\n }\n\n activeResult =\n streamResult ?? runResult ?? buildExecutionFailureResult(executionError ?? 'Subagent run failed')\n\n if (streamResult || runResult) {\n normalized =\n runPlan.outputFormat === 'stream-json' && adapter.normalizeStreamingResult\n ? adapter.normalizeStreamingResult({\n events: streamResult?.events ?? [],\n rawOutput: streamResult?.stdout ?? '',\n })\n : adapter.normalizeRunResult({\n stdout: runResult?.stdout ?? '',\n outputFormat:\n runPlan.outputFormat === 'stream-json' ? 'json' : runPlan.outputFormat,\n })\n } else {\n normalized = buildExecutionFailureNormalization(executionError ?? 'Subagent run failed')\n }\n\n const parseStrict = runPlan.outputFormat === 'json'\n const parseError = normalized.parseError ?? null\n const retryDecision = classifySubagentRetryable({\n result: {\n ok: activeResult.ok,\n timedOut: activeResult.timedOut,\n exitCode: activeResult.exitCode,\n error: activeResult.error,\n stderr: activeResult.stderr,\n stdoutTruncated: activeResult.stdoutTruncated,\n stderrTruncated: activeResult.stderrTruncated,\n },\n parseError,\n parseStrict,\n config: retryConfig,\n })\n\n if (retryDecision && attempt < retryConfig.maxAttempts && !isCancelled()) {\n retryReasons.push(retryDecision.reason)\n const delayMs = computeDelay(attempt, retryConfig.backoffMs, retryConfig.maxBackoffMs)\n options.logInfo?.('Retrying subagent run', {\n ...(options.logContext ?? {}),\n attempt,\n maxAttempts: retryConfig.maxAttempts,\n reason: retryDecision.reason,\n delay_ms: delayMs,\n })\n await emitRunEvent('run_progress', {\n phase: 'retry_scheduled',\n attempt,\n max_attempts: retryConfig.maxAttempts,\n reason: retryDecision.reason,\n delay_ms: delayMs,\n })\n await sleepFn(delayMs)\n continue\n }\n break\n }\n\n if (!activeResult || !normalized) {\n activeResult = buildExecutionFailureResult('Subagent run failed')\n normalized = buildExecutionFailureNormalization('Subagent run failed')\n }\n\n return {\n activeResult,\n streamResult,\n normalized,\n attempt,\n retryReasons,\n }\n } finally {\n if (workDir) {\n await cleanupWorkDir(workDir, workRoot)\n }\n }\n}\n", "import type {\n FinalizeGatewaySubagentRunRequest,\n FinalizeGatewaySubagentRunResponse,\n SubagentOutputEnvelope,\n} from '@panorama/shared'\n\ninterface EdgeInvokeError {\n message?: string\n}\n\ntype InvokeBody =\n | string\n | Record<string, unknown>\n | ArrayBuffer\n | InstanceType<typeof globalThis.File>\n | InstanceType<typeof globalThis.Blob>\n | InstanceType<typeof globalThis.FormData>\n | globalThis.ReadableStream<Uint8Array>\n\ninterface FunctionsInvokeClient {\n functions: {\n invoke: (\n functionName: string,\n options?: {\n body?: InvokeBody\n }\n ) => Promise<{\n data: unknown\n error: EdgeInvokeError | null\n }>\n }\n}\n\nfunction extractFunctionError(error: EdgeInvokeError | null): string | null {\n if (!error) return null\n if (typeof error.message === 'string' && error.message.trim().length > 0) {\n return error.message.trim()\n }\n return 'Edge Function invocation failed'\n}\n\nasync function finalizeGatewaySubagentRunViaEdge(\n client: FunctionsInvokeClient,\n body: FinalizeGatewaySubagentRunRequest\n): Promise<FinalizeGatewaySubagentRunResponse> {\n const { data, error } = await client.functions.invoke('finalize-gateway-subagent-run', {\n body: body as unknown as Record<string, unknown>,\n })\n if (error) {\n throw new Error(extractFunctionError(error) ?? 'Failed to finalize gateway subagent run')\n }\n return (data as FinalizeGatewaySubagentRunResponse | null) ?? {\n success: false,\n error: 'Unexpected response from finalize-gateway-subagent-run',\n }\n}\n\nexport async function finalizeGatewaySubagentRunOnBackend(\n client: FunctionsInvokeClient,\n params: {\n subagentId: string\n runId: string\n finalStatus: 'completed' | 'failed' | 'cancelled'\n output?: SubagentOutputEnvelope\n failureOutput?: Record<string, unknown> | null\n finalError?: string | null\n completedAt: string\n stderr?: string | null\n metadataPatch?: Record<string, unknown>\n }\n): Promise<FinalizeGatewaySubagentRunResponse> {\n return finalizeGatewaySubagentRunViaEdge(client, {\n subagent_id: params.subagentId,\n run_id: params.runId,\n final_status: params.finalStatus,\n output: params.output,\n failure_output: params.failureOutput ?? undefined,\n final_error: params.finalError ?? undefined,\n completed_at: params.completedAt,\n stderr: params.stderr ?? undefined,\n metadata_patch: params.metadataPatch,\n })\n}\n", "import type { SupabaseClient } from '@supabase/supabase-js'\nimport type { GatewayProviderId } from './cli-providers/types.js'\nimport type { Database } from './database.types.js'\nimport { buildSafeGatewayCommandDescriptor } from './debug-redaction.js'\nimport { finalizeGatewaySubagentRunOnBackend } from './finalize-subagent-run.js'\nimport {\n buildProviderFailureMessage,\n normalizeProviderErrorSummary,\n} from './gateway-provider-health.js'\nimport type { GatewayJobRow } from './gateway-jobs.js'\nimport {\n extractGatewayErrorSummary,\n truncateLog,\n} from './gateway-run-helpers.js'\nimport type { ActiveSubagentRun } from './gateway-runtime-state.js'\nimport {\n SUBAGENT_SCHEMA_VERSION,\n type SubagentAdapter,\n type SubagentOutputEnvelope,\n type SubagentRunPlan,\n} from './subagent-adapters/types.js'\nimport {\n buildErrorOutput,\n mergeMetadata,\n type SubagentRetryConfig,\n} from './subagent-run-helpers.js'\nimport type { ExecuteSubagentRunPlanResult } from './subagent-run-execution.js'\nimport type {\n GatewaySubagentRunJobResult,\n HandleGatewaySubagentRunJobParams,\n SubagentRunEventEmitter,\n} from './gateway-subagent-run-types.js'\n\nexport async function finalizeExecutedSubagentRun(params: {\n handlerParams: HandleGatewaySubagentRunJobParams\n supabase: SupabaseClient<Database>\n job: GatewayJobRow\n adapter: SubagentAdapter\n subagentId: string\n subagentType: string\n resolvedRunId: string\n runSequence: number\n runPlan: SubagentRunPlan\n activeRun: ActiveSubagentRun\n executionResult: ExecuteSubagentRunPlanResult\n retryConfig: SubagentRetryConfig\n executionContext: object\n subagentFullControlRequested: boolean\n effectiveFullControl: boolean\n emitRunEvent: SubagentRunEventEmitter\n}): Promise<GatewaySubagentRunJobResult> {\n const {\n handlerParams,\n supabase,\n job,\n adapter,\n subagentId,\n subagentType,\n resolvedRunId,\n runSequence,\n runPlan,\n activeRun,\n executionResult,\n retryConfig,\n executionContext,\n subagentFullControlRequested,\n effectiveFullControl,\n emitRunEvent,\n } = params\n const { activeResult, streamResult, normalized, attempt, retryReasons } = executionResult\n\n const { data: cancellationRow, error: cancellationError } = await supabase\n .from('subagent_runs')\n .select('status')\n .eq('id', resolvedRunId)\n .maybeSingle()\n\n if (cancellationError) {\n handlerParams.logError('Failed to check subagent run cancellation', {\n error: cancellationError.message,\n subagentId,\n runId: resolvedRunId,\n })\n }\n\n const dbCancelled = cancellationRow?.status === 'cancelled'\n const wasCancelled = activeRun.cancelled || dbCancelled\n const cancelReason =\n activeRun.cancelReason && activeRun.cancelReason.trim().length > 0\n ? activeRun.cancelReason\n : 'Cancelled'\n\n const output = normalized.output\n const parseError = normalized.parseError ?? null\n const retryCount = Math.max(0, attempt - 1)\n\n const completedAt = new Date().toISOString()\n const parseStrict = runPlan.outputFormat === 'json'\n const shouldFail = !activeResult.ok || (parseStrict && !!parseError)\n const effectiveShouldFail = !wasCancelled && shouldFail\n const stderrMessage =\n activeResult.stderr && activeResult.stderr.trim().length > 0\n ? activeResult.stderr.trim()\n : null\n const exitCodeMessage =\n activeResult.exitCode === null\n ? 'Subagent process did not exit cleanly'\n : `Subagent exited with code ${activeResult.exitCode}`\n let errorMessage = !activeResult.ok\n ? (activeResult.error ?? stderrMessage ?? exitCodeMessage)\n : (parseError ?? null)\n\n const providerId = adapter.id as GatewayProviderId\n if (!wasCancelled) {\n if (effectiveShouldFail) {\n const stderrInfo = truncateLog(activeResult.stderr ?? '')\n const stdoutInfo = truncateLog(activeResult.stdout ?? '')\n handlerParams.logError('Subagent run failed', {\n subagentId,\n runId: resolvedRunId,\n provider: providerId,\n exit_code: activeResult.exitCode,\n timed_out: activeResult.timedOut,\n parse_error: parseError ?? null,\n error: activeResult.error ?? null,\n stderr: stderrInfo.value || null,\n stderr_truncated: stderrInfo.truncated,\n stderr_bytes: stderrInfo.originalBytes,\n stdout: parseError ? stdoutInfo.value || null : null,\n stdout_truncated: parseError ? stdoutInfo.truncated : null,\n stdout_bytes: parseError ? stdoutInfo.originalBytes : null,\n })\n const parsed = activeResult.stderr\n ? extractGatewayErrorSummary(activeResult.stderr)?.message\n : null\n const providerSummary = normalizeProviderErrorSummary(parsed ?? errorMessage ?? null)\n await handlerParams.updateRuntimeProviderHealth({\n supabase,\n providerId,\n status: 'unhealthy',\n error: providerSummary ?? errorMessage,\n context: 'subagent_run',\n jobId: job.id,\n runId: resolvedRunId,\n })\n errorMessage = buildProviderFailureMessage(providerId, providerSummary ?? errorMessage)\n } else {\n await handlerParams.updateRuntimeProviderHealth({\n supabase,\n providerId,\n status: 'healthy',\n context: 'subagent_run',\n jobId: job.id,\n runId: resolvedRunId,\n })\n }\n }\n\n const failureOutput = buildErrorOutput(\n wasCancelled ? cancelReason : (errorMessage ?? 'Subagent run failed')\n )\n const finalStatus = wasCancelled ? 'cancelled' : effectiveShouldFail ? 'failed' : 'completed'\n let finalOutput: Record<string, unknown> | SubagentOutputEnvelope =\n wasCancelled || effectiveShouldFail ? failureOutput : output\n const finalError = wasCancelled ? cancelReason : effectiveShouldFail ? errorMessage : null\n\n const commandDescriptor = buildSafeGatewayCommandDescriptor(runPlan.command, runPlan.args, {\n redactLastArg: true,\n })\n const metadataPatch: Record<string, unknown> = {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n runner: 'gateway',\n adapter_id: adapter.id,\n subagent_type: subagentType,\n run_id: resolvedRunId,\n run_sequence: runSequence,\n last_run_at: completedAt,\n command: commandDescriptor.commandLine,\n exit_code: activeResult.exitCode,\n duration_ms: activeResult.durationMs,\n timed_out: activeResult.timedOut,\n stdout_truncated: activeResult.stdoutTruncated,\n stderr_truncated: activeResult.stderrTruncated,\n output_format: runPlan.outputFormat,\n parse_error: parseError,\n retry_count: retryCount,\n retry_reasons: retryReasons,\n retry_max_attempts: retryConfig.maxAttempts,\n cancel_run_id: null,\n cancel_requested_at: null,\n cancel_reason: wasCancelled ? cancelReason : null,\n cancelled: wasCancelled,\n cancel_state: wasCancelled ? 'acknowledged' : 'none',\n cancel_support: wasCancelled ? 'gateway' : null,\n cancellation_scope: wasCancelled ? 'gateway' : null,\n full_control_requested: subagentFullControlRequested,\n full_control_effective: effectiveFullControl,\n full_control_denied_reason: null,\n ...executionContext,\n }\n const finalizationPayload = await finalizeGatewaySubagentRunOnBackend(supabase, {\n subagentId,\n runId: resolvedRunId,\n finalStatus,\n output: finalStatus === 'completed' ? output : undefined,\n failureOutput: finalStatus === 'completed' ? null : failureOutput,\n finalError,\n completedAt,\n stderr: activeResult.stderr ?? null,\n metadataPatch: mergeMetadata(normalized.metadata, metadataPatch),\n })\n\n if (!finalizationPayload.success) {\n handlerParams.activeSubagentRuns.delete(subagentId)\n return {\n ok: false,\n result: {\n message: 'Failed to persist terminal subagent run state',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n },\n error: finalizationPayload.error ?? 'Failed to persist terminal subagent run state',\n }\n }\n\n finalOutput = finalizationPayload.output ?? finalOutput\n\n if (streamResult?.events?.length && adapter.normalizeStreamEvents) {\n const normalizedEvents = adapter.normalizeStreamEvents(streamResult.events)\n for (const entry of normalizedEvents) {\n await emitRunEvent(entry.event_type, entry.payload)\n }\n }\n\n if (wasCancelled) {\n await emitRunEvent('cancellation_acknowledged', {\n reason: cancelReason,\n source: 'gateway',\n cancellation_scope: 'gateway',\n })\n await emitRunEvent('run_cancelled', {\n reason: cancelReason,\n source: 'gateway',\n cancellation_scope: 'gateway',\n duration_ms: activeResult.durationMs,\n })\n } else if (effectiveShouldFail) {\n await emitRunEvent('run_failed', {\n reason: errorMessage ?? 'Subagent run failed',\n duration_ms: activeResult.durationMs,\n parse_error: parseError,\n })\n } else {\n await emitRunEvent('run_completed', {\n duration_ms: activeResult.durationMs,\n parse_error: parseError,\n retry_count: retryCount,\n })\n }\n\n handlerParams.activeSubagentRuns.delete(subagentId)\n\n return {\n ok: !effectiveShouldFail,\n result: {\n subagent_id: subagentId,\n status: finalStatus,\n output: effectiveShouldFail ? null : finalOutput,\n error: finalError,\n },\n error: effectiveShouldFail ? (errorMessage ?? 'Subagent run failed') : undefined,\n }\n}\n", "import { SUBAGENT_SCHEMA_VERSION, type SubagentOutputContentType, type SubagentOutputEnvelope } from './types.js'\n\nexport function normalizeStringList(value: unknown): string[] | null {\n if (Array.isArray(value)) {\n const items = value.map((item) => String(item).trim()).filter((item) => item.length > 0)\n return items.length > 0 ? items : null\n }\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return null\n const items = trimmed\n .split(',')\n .map((item) => item.trim())\n .filter((item) => item.length > 0)\n return items.length > 0 ? items : null\n }\n return null\n}\n\nexport function toOutputEnvelope(\n content: unknown,\n contentType: SubagentOutputContentType,\n options?: { summary?: string | null; sources?: string[] | null }\n): SubagentOutputEnvelope {\n const output: SubagentOutputEnvelope = {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n content,\n content_type: contentType,\n }\n\n const summary = options?.summary\n if (typeof summary === 'string' && summary.trim().length > 0) {\n output.summary = summary.trim()\n }\n\n const sources = options?.sources\n if (Array.isArray(sources) && sources.length > 0) {\n output.sources = sources\n }\n\n return output\n}\n\nexport function stripCodeFence(text: string): string {\n const trimmed = text.trim()\n if (trimmed.startsWith('```')) {\n return trimmed.replace(/^```(?:json)?\\n?/i, '').replace(/```$/i, '').trim()\n }\n return trimmed\n}\n\nexport function tryParseJson(text: string): { ok: true; value: unknown } | { ok: false } {\n try {\n const parsed = JSON.parse(text) as unknown\n return { ok: true, value: parsed }\n } catch {\n return { ok: false }\n }\n}\n\nexport function extractJsonCandidate(text: string): { candidate: string; looksLikeJson: boolean } {\n const trimmed = text.trim()\n const fenceMatch = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i)\n if (fenceMatch) {\n return { candidate: fenceMatch[1].trim(), looksLikeJson: true }\n }\n const firstObject = trimmed.indexOf('{')\n const lastObject = trimmed.lastIndexOf('}')\n if (firstObject !== -1 && lastObject > firstObject) {\n return { candidate: trimmed.slice(firstObject, lastObject + 1).trim(), looksLikeJson: true }\n }\n const firstArray = trimmed.indexOf('[')\n const lastArray = trimmed.lastIndexOf(']')\n if (firstArray !== -1 && lastArray > firstArray) {\n return { candidate: trimmed.slice(firstArray, lastArray + 1).trim(), looksLikeJson: true }\n }\n return {\n candidate: stripCodeFence(trimmed),\n looksLikeJson: trimmed.startsWith('{') || trimmed.startsWith('['),\n }\n}\n\nexport function extractJsonFromText(\n text: string,\n options?: { strict?: boolean }\n): { output: SubagentOutputEnvelope; parseError?: string } {\n const { candidate, looksLikeJson } = extractJsonCandidate(text)\n const parsed = tryParseJson(candidate)\n if (parsed.ok) {\n return { output: toOutputEnvelope(parsed.value, 'json') }\n }\n if (options?.strict || looksLikeJson) {\n return {\n output: toOutputEnvelope(text.trim(), 'markdown'),\n parseError: 'Failed to parse JSON output',\n }\n }\n return { output: toOutputEnvelope(text.trim(), 'markdown') }\n}\n", "import type {\n SubagentAdapter,\n SubagentAdapterContext,\n SubagentNormalizeResult,\n SubagentOutputEnvelope,\n SubagentOutputContentType,\n SubagentRunPlan,\n SubagentRunOutputFormat,\n SubagentStreamEvent,\n NormalizedRunEvent,\n} from './types.js'\nimport { coerceClaudeSupport, type ClaudeSupport } from './claude-support.js'\nimport { normalizeStringList, toOutputEnvelope } from './utils.js'\nimport { asRecord } from '@panorama/shared/utils'\n\nconst SAFE_MODE_APPEND_SYSTEM_PROMPT_PREFIX =\n 'You cannot write or interact with files in this environment.'\n\nfunction normalizeClaudeToolName(name: string): string | null {\n const trimmed = name.trim()\n if (!trimmed) return null\n const lower = trimmed.toLowerCase()\n if (lower === 'web__search' || lower === 'web_search' || lower === 'websearch') {\n return 'WebSearch'\n }\n return trimmed\n}\n\nfunction normalizeClaudeToolList(value: unknown): string[] | null {\n const list = normalizeStringList(value)\n if (!list) return null\n const normalized = list\n .map((tool) => normalizeClaudeToolName(tool))\n .filter((tool): tool is string => !!tool && tool.length > 0)\n return normalized.length > 0 ? normalized : null\n}\n\nfunction stringifyJsonSchema(value: unknown): string | null {\n if (!value) return null\n if (typeof value === 'string') {\n return value.trim().length > 0 ? value : null\n }\n try {\n return JSON.stringify(value)\n } catch {\n return null\n }\n}\n\nfunction normalizePermissionMode(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction appendIsolationArgs(args: string[], support: ClaudeSupport): void {\n if (support.settingSourcesFlag) {\n args.push('--setting-sources', 'local')\n }\n if (support.disableSlashCommandsFlag) {\n args.push('--disable-slash-commands')\n }\n}\n\nfunction isDefaultSafeAppendPrompt(value: string): boolean {\n return value.includes(SAFE_MODE_APPEND_SYSTEM_PROMPT_PREFIX)\n}\n\nfunction isDefaultSafeAllowedTools(value: string[] | null): boolean {\n if (!value || value.length !== 1) return false\n return value[0]?.trim().toLowerCase() === 'websearch'\n}\n\nfunction extractSummaryAndSources(value: unknown): { summary?: string; sources?: string[] } {\n if (!value || typeof value !== 'object') return {}\n const obj = value as Record<string, unknown>\n const summary =\n typeof obj.summary === 'string'\n ? obj.summary\n : typeof obj.overview === 'string'\n ? obj.overview\n : undefined\n const sources =\n Array.isArray(obj.sources) && obj.sources.every((item) => typeof item === 'string')\n ? (obj.sources as string[])\n : undefined\n return { summary, sources }\n}\n\nfunction buildClaudeArgs(\n prompt: string,\n config: Record<string, unknown>,\n support: ClaudeSupport,\n fullControl: boolean,\n resumeSessionId?: string | null\n): { args: string[]; outputFormat: SubagentRunOutputFormat; timeoutMs: number | null } {\n const safeMode = !fullControl\n let effectivePrompt = prompt\n const args: string[] = []\n\n const rawOutputFormat =\n typeof config.output_format === 'string' ? config.output_format.trim().toLowerCase() : ''\n const desiredOutputFormat: SubagentRunOutputFormat =\n rawOutputFormat === 'text'\n ? 'text'\n : rawOutputFormat === 'stream-json' ||\n rawOutputFormat === 'stream_json' ||\n rawOutputFormat === 'stream'\n ? 'stream-json'\n : 'json'\n const outputFormat: SubagentRunOutputFormat = desiredOutputFormat\n const cliOutputFormat =\n outputFormat === 'stream-json' && support.streamJsonFlag\n ? 'stream-json'\n : outputFormat === 'text'\n ? 'text'\n : 'json'\n args.push('--print')\n if (support.outputFormatFlag) {\n args.push('--output-format', cliOutputFormat)\n }\n\n const model = typeof config.model === 'string' ? config.model.trim() : ''\n if (model && support.modelFlag) {\n args.push('--model', model)\n }\n\n let allowedTools = normalizeClaudeToolList(config.allowed_tools)\n if (fullControl && isDefaultSafeAllowedTools(allowedTools)) {\n allowedTools = null\n } else if (safeMode && !allowedTools) {\n allowedTools = ['WebSearch']\n }\n if (allowedTools && support.allowedToolsFlag) {\n args.push('--allowedTools', allowedTools.join(','))\n } else if (allowedTools && support.toolsFlag) {\n args.push('--tools', allowedTools.join(','))\n }\n\n const disallowedTools = normalizeClaudeToolList(config.disallowed_tools)\n if (disallowedTools && support.disallowedToolsFlag) {\n args.push('--disallowedTools', disallowedTools.join(','))\n }\n\n const appendSystemPromptRaw =\n typeof config.append_system_prompt === 'string'\n ? config.append_system_prompt.trim()\n : ''\n const appendSystemPrompt = fullControl && isDefaultSafeAppendPrompt(appendSystemPromptRaw)\n ? ''\n : appendSystemPromptRaw\n if (appendSystemPrompt) {\n if (support.appendSystemPromptFlag) {\n args.push('--append-system-prompt', appendSystemPrompt)\n } else {\n effectivePrompt = `${effectivePrompt}\\n\\n${appendSystemPrompt}`\n }\n }\n\n const systemPrompt =\n typeof config.system_prompt === 'string'\n ? config.system_prompt.trim()\n : ''\n if (systemPrompt && support.systemPromptFlag) {\n args.push('--system-prompt', systemPrompt)\n }\n\n const jsonSchema = stringifyJsonSchema(config.json_schema)\n if (jsonSchema) {\n if (support.jsonSchemaFlag) {\n args.push('--json-schema', jsonSchema)\n } else {\n effectivePrompt = `${effectivePrompt}\\n\\nReturn STRICT JSON matching this schema:\\n${jsonSchema}`\n }\n }\n\n const configuredPermissionMode = normalizePermissionMode(config.permission_mode)\n const effectivePermissionMode =\n fullControl && (!configuredPermissionMode || configuredPermissionMode.toLowerCase() === 'dontask')\n ? 'bypassPermissions'\n : configuredPermissionMode\n if (effectivePermissionMode && support.permissionModeFlag) {\n args.push('--permission-mode', effectivePermissionMode)\n }\n if (fullControl && support.dangerouslySkipPermissionsFlag) {\n args.push('--dangerously-skip-permissions')\n }\n\n const maxBudget =\n typeof config.max_budget_usd === 'number'\n ? config.max_budget_usd\n : typeof config.max_budget_usd === 'string'\n ? Number.parseFloat(config.max_budget_usd)\n : NaN\n if (Number.isFinite(maxBudget) && support.maxBudgetFlag) {\n args.push('--max-budget-usd', String(maxBudget))\n }\n\n const inputFormat =\n typeof config.input_format === 'string'\n ? config.input_format.trim()\n : ''\n if (inputFormat && support.inputFormatFlag) {\n args.push('--input-format', inputFormat)\n }\n\n const betas = normalizeStringList(config.betas)\n if (betas && betas.length > 0 && support.betasFlag) {\n args.push('--betas', ...betas)\n }\n\n const noSessionPersistence =\n config.no_session_persistence === true && support.noSessionPersistenceFlag\n if (noSessionPersistence) {\n args.push('--no-session-persistence')\n }\n\n const sessionId =\n typeof config.session_id === 'string'\n ? config.session_id.trim()\n : ''\n if (sessionId && support.sessionIdFlag) {\n args.push('--session-id', sessionId)\n }\n\n const explicitResume =\n typeof config.resume_session_id === 'string'\n ? config.resume_session_id.trim()\n : ''\n\n const resumeId = explicitResume || (resumeSessionId ?? '')\n if (resumeId) {\n if (!support.resumeFlag) {\n throw new Error('Claude CLI does not support session continuation (--resume)')\n }\n args.push('--resume', resumeId)\n }\n\n if (safeMode) {\n appendIsolationArgs(args, support)\n }\n\n const timeoutMs =\n typeof config.timeout_ms === 'number'\n ? config.timeout_ms\n : null\n\n args.push('-p', effectivePrompt)\n\n return {\n args,\n outputFormat,\n timeoutMs: Number.isFinite(timeoutMs) ? timeoutMs : null,\n }\n}\n\nfunction normalizeOutputFromJson(parsed: Record<string, unknown>): {\n output: SubagentOutputEnvelope\n metadata: Record<string, unknown>\n} {\n const metadata: Record<string, unknown> = {\n adapter_id: 'claude_code',\n }\n\n if (typeof parsed.session_id === 'string') {\n metadata.session_id = parsed.session_id\n }\n if (typeof parsed.total_cost_usd === 'number') {\n metadata.total_cost_usd = parsed.total_cost_usd\n }\n if (parsed.usage) {\n metadata.usage = parsed.usage\n }\n if (parsed.modelUsage) {\n metadata.model_usage = parsed.modelUsage\n }\n if (parsed.permission_denials) {\n metadata.permission_denials = parsed.permission_denials\n }\n\n const structured = parsed.structured_output\n if (structured && typeof structured === 'object') {\n const { summary, sources } = extractSummaryAndSources(structured)\n return {\n output: toOutputEnvelope(structured, 'json', { summary, sources }),\n metadata,\n }\n }\n\n const result = parsed.result\n if (typeof result === 'string') {\n const { summary, sources } = extractSummaryAndSources(parsed)\n return {\n output: toOutputEnvelope(result, 'markdown', { summary, sources }),\n metadata,\n }\n }\n\n if (result !== undefined) {\n const contentType: SubagentOutputContentType =\n result && typeof result === 'object' ? 'json' : 'text'\n const { summary, sources } = extractSummaryAndSources(result)\n return {\n output: toOutputEnvelope(result, contentType, { summary, sources }),\n metadata,\n }\n }\n\n const { summary, sources } = extractSummaryAndSources(parsed)\n return {\n output: toOutputEnvelope(parsed, 'json', { summary, sources }),\n metadata,\n }\n}\n\nfunction extractStringValue(value: unknown): string | null {\n if (!value) return null\n if (typeof value === 'string') {\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n }\n return null\n}\n\nfunction extractAssistantContent(event: Record<string, unknown>): string | null {\n const direct =\n extractStringValue(event.content) ??\n extractStringValue(event.message) ??\n extractStringValue(event.result) ??\n extractStringValue(event.output)\n if (direct) return direct\n\n const message = event.message\n if (message && typeof message === 'object') {\n const msgObj = message as Record<string, unknown>\n const content = msgObj.content\n if (typeof content === 'string') {\n return extractStringValue(content)\n }\n if (Array.isArray(content)) {\n const textChunks = content\n .map((item) => {\n if (!item || typeof item !== 'object') return null\n const part = item as Record<string, unknown>\n return extractStringValue(part.text) ?? extractStringValue(part.content)\n })\n .filter((item): item is string => !!item)\n if (textChunks.length > 0) {\n return textChunks.join('')\n }\n }\n }\n\n return null\n}\n\nfunction extractMetadataFromEvents(events: SubagentStreamEvent[]): Record<string, unknown> {\n const metadata: Record<string, unknown> = { adapter_id: 'claude_code' }\n for (const entry of events) {\n const event = entry.event\n if (!event) continue\n if (typeof event.session_id === 'string' && event.session_id.trim().length > 0) {\n metadata.session_id = event.session_id\n }\n if (typeof event.total_cost_usd === 'number') {\n metadata.total_cost_usd = event.total_cost_usd\n }\n if (event.usage) {\n metadata.usage = event.usage\n }\n if (event.modelUsage) {\n metadata.model_usage = event.modelUsage\n }\n }\n return metadata\n}\n\nfunction normalizeStreamEvents(events: SubagentStreamEvent[]): NormalizedRunEvent[] {\n const normalized: NormalizedRunEvent[] = []\n const assistantIndexById = new Map<string, number>()\n const toolNameByUseId = new Map<string, string>()\n const toolCallSeen = new Set<string>()\n const toolResultSeen = new Set<string>()\n\n const upsertAssistantMessage = (messageId: string | null, payload: Record<string, unknown>) => {\n if (messageId && assistantIndexById.has(messageId)) {\n const index = assistantIndexById.get(messageId)\n if (index !== undefined) {\n normalized[index] = { event_type: 'message', payload }\n }\n return\n }\n normalized.push({ event_type: 'message', payload })\n if (messageId) {\n assistantIndexById.set(messageId, normalized.length - 1)\n }\n }\n\n for (const entry of events) {\n const event = entry.event\n if (!event || typeof event.type !== 'string') continue\n\n const eventType = event.type\n if (eventType === 'result') continue\n\n if (eventType === 'system') {\n continue\n }\n\n if (eventType === 'assistant') {\n const message = getMessageFromEvent(event)\n const messageId = message && typeof message.id === 'string' ? message.id : null\n const model = message && typeof message.model === 'string' ? message.model : ''\n const stopReason =\n message && typeof message.stop_reason === 'string' ? message.stop_reason : ''\n\n if (message) {\n const contentParts = getContentParts(message)\n const textParts: string[] = []\n const toolParts: Record<string, unknown>[] = []\n\n for (const part of contentParts) {\n const partType = typeof part.type === 'string' ? part.type : ''\n if (partType === 'tool_use') {\n toolParts.push(part)\n continue\n }\n\n const text = extractStringValue(part.text) ?? extractStringValue(part.content)\n if (text) {\n textParts.push(text)\n }\n }\n\n const combinedText = trimText(textParts.join(''))\n if (combinedText) {\n const payload: Record<string, unknown> = {\n role: 'assistant',\n content: combinedText,\n }\n if (messageId) payload.message_id = messageId\n if (model) payload.model = model\n if (stopReason) payload.stop_reason = stopReason\n upsertAssistantMessage(messageId, payload)\n }\n\n for (const part of toolParts) {\n const toolUseId =\n typeof part.id === 'string'\n ? part.id\n : typeof part.tool_use_id === 'string'\n ? part.tool_use_id\n : null\n const toolName = typeof part.name === 'string' ? part.name.trim() : ''\n if (toolUseId && !toolCallSeen.has(toolUseId)) {\n toolCallSeen.add(toolUseId)\n if (toolName) {\n toolNameByUseId.set(toolUseId, toolName)\n }\n const toolInput = part.input ?? null\n normalized.push({\n event_type: 'tool_call',\n payload: {\n tool_name: toolName || null,\n tool_use_id: toolUseId,\n tool_input: toolInput,\n summary: buildToolInputSummary(toolInput),\n message_id: messageId,\n },\n })\n }\n }\n continue\n }\n\n const fallbackText = extractAssistantContent(event)\n if (fallbackText) {\n upsertAssistantMessage(messageId, {\n role: 'assistant',\n content: trimText(fallbackText),\n })\n }\n continue\n }\n\n if (eventType === 'user') {\n const message = getMessageFromEvent(event)\n const messageId = message && typeof message.id === 'string' ? message.id : null\n if (!message) continue\n const contentParts = getContentParts(message)\n for (const part of contentParts) {\n const partType = typeof part.type === 'string' ? part.type : ''\n if (partType !== 'tool_result') continue\n const toolUseId =\n typeof part.tool_use_id === 'string'\n ? part.tool_use_id\n : typeof part.id === 'string'\n ? part.id\n : null\n if (toolUseId && toolResultSeen.has(toolUseId)) continue\n if (toolUseId) toolResultSeen.add(toolUseId)\n const content = stringifyContent(part.content)\n const trimmedContent = trimText(content)\n if (!trimmedContent) continue\n normalized.push({\n event_type: 'tool_result',\n payload: {\n tool_use_id: toolUseId,\n tool_name: toolUseId ? toolNameByUseId.get(toolUseId) ?? null : null,\n content: trimmedContent,\n is_error: part.is_error === true,\n message_id: messageId,\n },\n })\n }\n continue\n }\n }\n\n return normalized\n}\n\nfunction getMessageFromEvent(event: Record<string, unknown>): Record<string, unknown> | null {\n const message = event.message\n return asRecord(message)\n}\n\nfunction getContentParts(message: Record<string, unknown>): Record<string, unknown>[] {\n const content = message.content\n if (Array.isArray(content)) {\n return content.filter((item) => !!item && typeof item === 'object') as Record<string, unknown>[]\n }\n if (typeof content === 'string') {\n return [{ type: 'text', text: content }]\n }\n return []\n}\n\nfunction stringifyContent(value: unknown): string {\n if (typeof value === 'string') return value\n if (value === null || value === undefined) return ''\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return String(value)\n }\n}\n\nfunction trimText(value: string): string {\n return value.replace(/\\s+$/, '')\n}\n\nfunction buildToolInputSummary(input: unknown): string | null {\n if (!input) return null\n if (typeof input === 'string') {\n const trimmed = input.trim()\n return trimmed.length > 0 ? trimmed : null\n }\n if (typeof input === 'object') {\n const record = input as Record<string, unknown>\n const query = typeof record.query === 'string' ? record.query.trim() : ''\n if (query) return `Query: ${query}`\n const text = typeof record.text === 'string' ? record.text.trim() : ''\n if (text) return text\n }\n return null\n}\n\nexport function createClaudeCodeAdapter(): SubagentAdapter {\n return {\n id: 'claude_code',\n label: 'Claude Code',\n supportsContinuation: true,\n buildRunPlan(context: SubagentAdapterContext): SubagentRunPlan {\n const support = coerceClaudeSupport(context.support as Record<string, boolean> | undefined)\n const { args, outputFormat, timeoutMs } = buildClaudeArgs(\n context.prompt,\n context.config,\n support,\n context.fullControl,\n context.resumeSessionId\n )\n\n return {\n command: context.command,\n args,\n outputFormat,\n timeoutMs,\n }\n },\n normalizeRunResult({\n stdout,\n outputFormat,\n }: {\n stdout: string\n outputFormat: 'json' | 'text'\n }): SubagentNormalizeResult {\n if (outputFormat === 'json') {\n try {\n const parsed = JSON.parse(stdout) as Record<string, unknown>\n const normalized = normalizeOutputFromJson(parsed)\n return {\n ...normalized,\n rawResponse: parsed,\n }\n } catch (error) {\n const parseError = error instanceof Error ? error.message : 'Failed to parse JSON output'\n return {\n output: toOutputEnvelope(stdout.trim(), 'text'),\n metadata: { adapter_id: 'claude_code' },\n parseError,\n }\n }\n }\n\n return {\n output: toOutputEnvelope(stdout.trim(), 'text'),\n metadata: { adapter_id: 'claude_code' },\n }\n },\n normalizeStreamingResult({ events, rawOutput }): SubagentNormalizeResult {\n const resultEvent = [...events]\n .reverse()\n .find((entry) => entry.event && entry.event.type === 'result')\n\n if (resultEvent?.event) {\n const normalized = normalizeOutputFromJson(resultEvent.event)\n return {\n ...normalized,\n rawResponse: resultEvent.event,\n }\n }\n\n const assistantEvent = [...events]\n .reverse()\n .find((entry) => entry.event && typeof entry.event.type === 'string')\n\n const assistantText =\n (assistantEvent?.event ? extractAssistantContent(assistantEvent.event) : null) ??\n rawOutput.trim()\n\n return {\n output: toOutputEnvelope(assistantText.trim(), 'markdown'),\n metadata: extractMetadataFromEvents(events),\n }\n },\n normalizeStreamEvents,\n }\n}\n", "import type { SubagentRunOutputFormat } from './types.js'\n\nexport function parseSubagentRunOutputFormat(value: unknown): SubagentRunOutputFormat {\n if (typeof value !== 'string') return 'json'\n const normalized = value.trim().toLowerCase()\n if (normalized === 'text') return 'text'\n if (normalized === 'stream-json' || normalized === 'stream_json' || normalized === 'stream') {\n return 'stream-json'\n }\n return 'json'\n}\n", "import type {\n SubagentAdapter,\n SubagentAdapterContext,\n SubagentNormalizeResult,\n SubagentRunPlan,\n SubagentStreamEvent,\n NormalizedRunEvent,\n} from './types.js'\nimport { parseSubagentRunOutputFormat } from './output-format.js'\nimport { extractJsonFromText, normalizeStringList, toOutputEnvelope } from './utils.js'\nimport {\n buildProviderChildProcessEnv,\n resolveCodexProviderCommand,\n} from '../provider-runtime-utils.js'\n\nconst SAFE_MODE_APPEND_SYSTEM_PROMPT_PREFIX =\n 'You cannot write or interact with files in this environment.'\n\nfunction includesWebSearch(value: unknown): boolean {\n const list = normalizeStringList(value)\n if (!list) return false\n return list.some((item) => item.toLowerCase().replace(/[^a-z]/g, '') === 'websearch')\n}\n\nfunction isDefaultSafeAppendPrompt(value: string): boolean {\n return value.includes(SAFE_MODE_APPEND_SYSTEM_PROMPT_PREFIX)\n}\n\nfunction findLastAgentMessage(events: SubagentStreamEvent[]): string | null {\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i].event\n if (!event || typeof event !== 'object') continue\n if (event.type === 'item.completed') {\n const item = (event as Record<string, unknown>).item as Record<string, unknown> | undefined\n if (item && item.type === 'agent_message' && typeof item.text === 'string') {\n return item.text\n }\n }\n }\n return null\n}\n\nfunction extractUsage(events: SubagentStreamEvent[]): Record<string, unknown> | null {\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i].event\n if (!event || typeof event !== 'object') continue\n if (event.type === 'turn.completed' && typeof (event as Record<string, unknown>).usage === 'object') {\n return (event as Record<string, unknown>).usage as Record<string, unknown>\n }\n }\n return null\n}\n\nfunction normalizeStreamEvents(events: SubagentStreamEvent[]): NormalizedRunEvent[] {\n const normalized: NormalizedRunEvent[] = []\n for (const entry of events) {\n const event = entry.event\n if (!event || typeof event !== 'object') continue\n const type = (event as Record<string, unknown>).type\n if (type === 'item.completed') {\n const item = (event as Record<string, unknown>).item as Record<string, unknown> | undefined\n if (!item) continue\n if (item.type === 'agent_message' && typeof item.text === 'string') {\n normalized.push({\n event_type: 'message',\n payload: { role: 'assistant', content: item.text },\n })\n }\n if (item.type === 'reasoning' && typeof item.text === 'string') {\n normalized.push({\n event_type: 'message',\n payload: { role: 'assistant', content: item.text, kind: 'reasoning' },\n })\n }\n }\n }\n return normalized\n}\n\nfunction parseJsonlEvents(output: string): SubagentStreamEvent[] {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n const events: SubagentStreamEvent[] = []\n let sequence = 0\n for (const line of lines) {\n let event: Record<string, unknown> | null = null\n try {\n event = JSON.parse(line) as Record<string, unknown>\n } catch {\n event = null\n }\n events.push({ sequence, raw: line, event })\n sequence += 1\n }\n return events\n}\n\nfunction normalizeCodexStreamResult(\n events: SubagentStreamEvent[],\n rawOutput: string\n): SubagentNormalizeResult {\n const outputText = findLastAgentMessage(events) ?? rawOutput.trim()\n const { output, parseError } = extractJsonFromText(outputText, { strict: false })\n const metadata: Record<string, unknown> = { adapter_id: 'codex' }\n const usage = extractUsage(events)\n if (usage) metadata.usage = usage\n return { output, metadata, parseError: parseError ?? undefined }\n}\n\nexport function createCodexAdapter(): SubagentAdapter {\n return {\n id: 'codex',\n label: 'OpenAI Codex',\n supportsContinuation: false,\n buildRunPlan(context: SubagentAdapterContext): SubagentRunPlan {\n const config = context.config ?? {}\n const fullControl = context.fullControl === true\n const outputFormat = parseSubagentRunOutputFormat(config.output_format)\n const supportFlags = context.support ?? {}\n\n const args: string[] = ['exec', '--skip-git-repo-check']\n if (!fullControl) {\n if (supportFlags.sandboxFlag !== false) {\n args.push('--sandbox', 'read-only')\n }\n } else if (supportFlags.dangerouslyBypassApprovalsAndSandboxFlag === true) {\n args.push('--dangerously-bypass-approvals-and-sandbox')\n } else if (supportFlags.sandboxFlag !== false) {\n args.push('--sandbox', 'danger-full-access')\n }\n\n const model = typeof config.model === 'string' ? config.model.trim() : ''\n if (model) {\n args.push('--model', model)\n }\n\n if (supportFlags.configFlag !== false) {\n const effort = typeof config.reasoning_effort === 'string' ? config.reasoning_effort : 'high'\n args.push('-c', `model_reasoning_effort=\"${effort}\"`)\n if (!fullControl) {\n args.push('-c', 'features.shell_tool=false')\n const enableSearch = includesWebSearch(config.allowed_tools)\n args.push('-c', `features.web_search_request=${enableSearch ? 'true' : 'false'}`)\n } else {\n args.push('-c', 'features.shell_tool=true')\n args.push('-c', 'features.web_search_request=true')\n }\n }\n\n if (outputFormat !== 'text') {\n args.push('--json')\n }\n\n let prompt = context.prompt\n const appendSystemPromptRaw =\n typeof config.append_system_prompt === 'string' ? config.append_system_prompt.trim() : ''\n const appendSystemPrompt =\n fullControl && isDefaultSafeAppendPrompt(appendSystemPromptRaw)\n ? ''\n : appendSystemPromptRaw\n if (appendSystemPrompt) {\n prompt = `${prompt}\\n\\n${appendSystemPrompt}`\n }\n\n args.push(prompt)\n\n return {\n command: context.command || resolveCodexProviderCommand(),\n args,\n outputFormat,\n timeoutMs: typeof config.timeout_ms === 'number' ? config.timeout_ms : null,\n env: buildProviderChildProcessEnv(),\n }\n },\n normalizeRunResult({ stdout, outputFormat }): SubagentNormalizeResult {\n if (outputFormat === 'json') {\n try {\n const parsed = JSON.parse(stdout) as Record<string, unknown>\n return { output: toOutputEnvelope(parsed, 'json'), metadata: { adapter_id: 'codex' }, rawResponse: parsed }\n } catch (error) {\n const events = parseJsonlEvents(stdout)\n if (events.some((entry) => entry.event)) {\n return normalizeCodexStreamResult(events, stdout)\n }\n const parseError = error instanceof Error ? error.message : 'Failed to parse JSON output'\n return {\n output: toOutputEnvelope(stdout.trim(), 'text'),\n metadata: { adapter_id: 'codex' },\n parseError,\n }\n }\n }\n return { output: toOutputEnvelope(stdout.trim(), 'text'), metadata: { adapter_id: 'codex' } }\n },\n normalizeStreamingResult({ events, rawOutput }): SubagentNormalizeResult {\n return normalizeCodexStreamResult(events, rawOutput)\n },\n normalizeStreamEvents,\n }\n}\n", "import type {\n SubagentAdapter,\n SubagentAdapterContext,\n SubagentNormalizeResult,\n SubagentRunPlan,\n SubagentStreamEvent,\n NormalizedRunEvent,\n} from './types.js'\nimport { parseSubagentRunOutputFormat } from './output-format.js'\nimport { extractJsonFromText, normalizeStringList, toOutputEnvelope } from './utils.js'\nimport path from 'node:path'\nimport {\n buildGeminiProviderChildProcessEnv,\n resolveGeminiProviderCommand,\n} from '../provider-runtime-utils.js'\n\nconst SAFE_MODE_APPEND_SYSTEM_PROMPT_PREFIX =\n 'You cannot write or interact with files in this environment.'\n\nfunction findLastAssistantMessage(events: SubagentStreamEvent[]): string | null {\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i].event\n if (!event || typeof event !== 'object') continue\n if ((event as Record<string, unknown>).type === 'message') {\n const role = (event as Record<string, unknown>).role\n const content = (event as Record<string, unknown>).content\n if (role === 'assistant' && typeof content === 'string') {\n return content\n }\n }\n }\n return null\n}\n\nfunction concatenateAssistantMessages(events: SubagentStreamEvent[]): string | null {\n const chunks: string[] = []\n for (const entry of events) {\n const event = entry.event\n if (!event || typeof event !== 'object') continue\n if ((event as Record<string, unknown>).type === 'message') {\n const role = (event as Record<string, unknown>).role\n const content = (event as Record<string, unknown>).content\n if (role === 'assistant' && typeof content === 'string') {\n chunks.push(content)\n }\n }\n }\n if (chunks.length === 0) return null\n return chunks.join('').trim()\n}\n\nfunction extractUsage(events: SubagentStreamEvent[]): Record<string, unknown> | null {\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i].event\n if (!event || typeof event !== 'object') continue\n if ((event as Record<string, unknown>).type === 'result') {\n const stats = (event as Record<string, unknown>).stats\n if (stats && typeof stats === 'object') {\n return stats as Record<string, unknown>\n }\n }\n }\n return null\n}\n\nfunction normalizeStreamEvents(events: SubagentStreamEvent[]): NormalizedRunEvent[] {\n const normalized: NormalizedRunEvent[] = []\n for (const entry of events) {\n const event = entry.event\n if (!event || typeof event !== 'object') continue\n if ((event as Record<string, unknown>).type === 'message') {\n const role = (event as Record<string, unknown>).role\n const content = (event as Record<string, unknown>).content\n if (typeof role === 'string' && typeof content === 'string') {\n normalized.push({ event_type: 'message', payload: { role, content } })\n }\n }\n }\n return normalized\n}\n\nfunction isDefaultSafeAppendPrompt(value: string): boolean {\n return value.includes(SAFE_MODE_APPEND_SYSTEM_PROMPT_PREFIX)\n}\n\nexport function createGeminiAdapter(): SubagentAdapter {\n return {\n id: 'gemini',\n label: 'Gemini CLI',\n supportsContinuation: false,\n buildRunPlan(context: SubagentAdapterContext): SubagentRunPlan {\n const config = context.config ?? {}\n const fullControl = context.fullControl === true\n const outputFormat = parseSubagentRunOutputFormat(config.output_format)\n const supportFlags = context.support ?? {}\n\n const command = context.command || resolveGeminiProviderCommand()\n const args: string[] = ['--output-format', outputFormat === 'text' ? 'text' : 'json']\n\n if (supportFlags.approvalModeFlag === true) {\n args.push('--approval-mode', fullControl ? 'yolo' : 'plan')\n } else if (fullControl && supportFlags.yoloFlag === true) {\n args.push('--yolo')\n }\n if (!fullControl && supportFlags.sandboxFlag === true) {\n args.push('--sandbox')\n }\n\n const model = typeof config.model === 'string' ? config.model.trim() : ''\n if (model) {\n args.push('--model', model)\n }\n\n const extensions = normalizeStringList(config.extensions)\n if (extensions && extensions.length > 0) {\n args.push('--extensions', extensions.join(','))\n }\n\n let prompt = context.prompt\n const systemPrompt = typeof config.system_prompt === 'string' ? config.system_prompt.trim() : ''\n const appendSystemPromptRaw =\n typeof config.append_system_prompt === 'string' ? config.append_system_prompt.trim() : ''\n const appendSystemPrompt =\n fullControl && isDefaultSafeAppendPrompt(appendSystemPromptRaw)\n ? ''\n : appendSystemPromptRaw\n const finalSystemPrompt = [systemPrompt, appendSystemPrompt]\n .map((value) => value.trim())\n .filter((value) => value.length > 0)\n .join('\\n')\n\n const jsonOnly = outputFormat === 'json'\n const systemContents = finalSystemPrompt\n ? jsonOnly\n ? `${finalSystemPrompt}\\nReturn STRICT JSON only. Do not wrap in code fences.`\n : finalSystemPrompt\n : jsonOnly\n ? 'Return STRICT JSON only. Do not wrap in code fences.'\n : ''\n\n const files: Array<{ path: string; contents: string }> = systemContents\n ? [{ path: 'system.md', contents: systemContents }]\n : []\n\n args.push(prompt)\n\n return {\n command,\n args,\n outputFormat,\n timeoutMs: typeof config.timeout_ms === 'number' ? config.timeout_ms : null,\n env: systemContents\n ? buildGeminiProviderChildProcessEnv({\n systemPromptPath: path.join('{WORKDIR}', 'system.md'),\n commandPath: command,\n })\n : buildGeminiProviderChildProcessEnv({ commandPath: command }),\n files,\n }\n },\n normalizeRunResult({ stdout, outputFormat }): SubagentNormalizeResult {\n if (outputFormat === 'json') {\n try {\n const parsed = JSON.parse(stdout) as Record<string, unknown>\n const response = typeof parsed.response === 'string' ? parsed.response : ''\n const { output, parseError } = extractJsonFromText(response)\n return { output, metadata: { adapter_id: 'gemini' }, parseError }\n } catch (error) {\n const parseError = error instanceof Error ? error.message : 'Failed to parse JSON output'\n return {\n output: toOutputEnvelope(stdout.trim(), 'text'),\n metadata: { adapter_id: 'gemini' },\n parseError,\n }\n }\n }\n return { output: toOutputEnvelope(stdout.trim(), 'text'), metadata: { adapter_id: 'gemini' } }\n },\n normalizeStreamingResult({ events, rawOutput }): SubagentNormalizeResult {\n const outputText =\n concatenateAssistantMessages(events) ?? findLastAssistantMessage(events) ?? rawOutput.trim()\n const { output, parseError } = extractJsonFromText(outputText, { strict: false })\n const metadata: Record<string, unknown> = { adapter_id: 'gemini' }\n const usage = extractUsage(events)\n if (usage) metadata.usage = usage\n return { output, metadata, parseError: parseError ?? undefined }\n },\n normalizeStreamEvents,\n }\n}\n", "import type { SubagentAdapter } from './types.js'\nimport { createClaudeCodeAdapter } from './claude-code.js'\nimport { createCodexAdapter } from './codex.js'\nimport { createGeminiAdapter } from './gemini.js'\n\nconst claudeAdapter = createClaudeCodeAdapter()\nconst codexAdapter = createCodexAdapter()\nconst geminiAdapter = createGeminiAdapter()\n\nconst SUBAGENT_ADAPTERS: Record<string, SubagentAdapter> = {\n claude_code_gateway: claudeAdapter,\n codex_gateway: codexAdapter,\n gemini_gateway: geminiAdapter,\n}\n\nexport function getSubagentAdapter(subagentType: string): SubagentAdapter | null {\n return SUBAGENT_ADAPTERS[subagentType] ?? null\n}\n\nexport function listSubagentAdapters(): SubagentAdapter[] {\n return Array.from(new Set(Object.values(SUBAGENT_ADAPTERS)))\n}\n", "import type { GatewayProviderId } from './cli-providers/types.js'\n\nexport interface FullControlSupportResult {\n supported: boolean\n reason: string | null\n}\n\nfunction readFlag(flags: Record<string, unknown>, key: string): boolean | null {\n if (!Object.prototype.hasOwnProperty.call(flags, key)) return null\n const value = flags[key]\n return typeof value === 'boolean' ? value : null\n}\n\nexport function evaluateGatewayProviderFullControlSupport(\n providerId: GatewayProviderId,\n supportedFlags: Record<string, unknown> | null | undefined\n): FullControlSupportResult {\n const flags = supportedFlags ?? {}\n\n switch (providerId) {\n case 'claude_code': {\n const permissionMode = readFlag(flags, 'permissionModeFlag')\n const dangerousSkip = readFlag(flags, 'dangerouslySkipPermissionsFlag')\n if (permissionMode === true || dangerousSkip === true) {\n return { supported: true, reason: null }\n }\n return {\n supported: false,\n reason:\n 'Claude CLI does not expose elevated permission flags on this host (missing --permission-mode bypassPermissions and --dangerously-skip-permissions).',\n }\n }\n case 'codex': {\n const dangerousBypass = readFlag(flags, 'dangerouslyBypassApprovalsAndSandboxFlag')\n const sandbox = readFlag(flags, 'sandboxFlag')\n if (dangerousBypass === true || sandbox === true) {\n return { supported: true, reason: null }\n }\n return {\n supported: false,\n reason:\n 'Codex CLI does not expose elevated permission flags on this host (missing --dangerously-bypass-approvals-and-sandbox and --sandbox danger-full-access).',\n }\n }\n case 'gemini': {\n const approvalMode = readFlag(flags, 'approvalModeFlag')\n const yolo = readFlag(flags, 'yoloFlag')\n if (approvalMode === true || yolo === true) {\n return { supported: true, reason: null }\n }\n return {\n supported: false,\n reason:\n 'Gemini CLI does not expose elevated approval flags on this host (missing --approval-mode yolo and --yolo).',\n }\n }\n default:\n return {\n supported: false,\n reason: `Unsupported gateway provider for elevated provider mode: ${providerId}`,\n }\n }\n}\n", "import { isGatewayServiceReady } from '@panorama/shared/gateway/capabilities'\nimport { parseBooleanInput } from './cli-args.js'\nimport type { GatewayProviderId } from './cli-providers/types.js'\nimport { inferProviderFromSubagentType } from './gateway-jobs.js'\nimport {\n DEFAULT_CLAUDE_SUPPORT,\n toFlagRecord,\n} from './subagent-adapters/claude-support.js'\nimport { getSubagentAdapter } from './subagent-adapters/registry.js'\nimport { evaluateGatewayProviderFullControlSupport } from './subagent-full-control.js'\nimport {\n buildDefaultSubagentRetryConfig,\n parseSubagentRunInput,\n parseSubagentRunPayload,\n resolveSubagentFullControlState,\n} from './subagent-run-job.js'\nimport type {\n GatewaySubagentRunJobResult,\n HandleGatewaySubagentRunJobParams,\n SubagentRunPolicy,\n SubagentRunRow,\n SubagentRunTarget,\n} from './gateway-subagent-run-types.js'\n\nexport async function loadSubagentRunTarget(\n params: HandleGatewaySubagentRunJobParams\n): Promise<\n | { ok: true; target: SubagentRunTarget }\n | { ok: false; result: GatewaySubagentRunJobResult }\n> {\n const { supabase, config, job } = params\n const payload = job.payload ?? {}\n const { subagentId, payloadRunId } = parseSubagentRunPayload(payload)\n\n if (!subagentId) {\n return {\n ok: false,\n result: {\n ok: false,\n result: { message: 'Missing subagent_id in payload' },\n error: 'Missing subagent_id in payload',\n },\n }\n }\n\n const { data: loadedSubagent, error: subagentError } = await supabase\n .from('subagents')\n .select('id, team_id, gateway_id, owner_agent_id, subagent_type, status, config, input, metadata')\n .eq('id', subagentId)\n .maybeSingle()\n const subagent = loadedSubagent as SubagentRunRow | null\n\n if (subagentError || !subagent) {\n return {\n ok: false,\n result: {\n ok: false,\n result: { message: 'Subagent not found', subagent_id: subagentId },\n jobStatus: 'cancelled',\n skipSubagentFailure: true,\n error: subagentError?.message ?? 'Subagent not found',\n },\n }\n }\n\n if (subagent.gateway_id !== config.gatewayId) {\n const message = 'Subagent is assigned to a different gateway'\n return {\n ok: false,\n result: {\n ok: false,\n result: {\n message,\n subagent_id: subagentId,\n assigned_gateway_id: subagent.gateway_id,\n gateway_id: config.gatewayId,\n },\n jobStatus: 'cancelled',\n skipSubagentFailure: true,\n error: message,\n },\n }\n }\n\n const metadata = (subagent.metadata ?? {}) as Record<string, unknown>\n const currentRunId = typeof metadata.current_run_id === 'string' ? metadata.current_run_id : null\n if (subagent.status !== 'running') {\n const message = `Subagent status changed before queued job execution (status=${subagent.status})`\n return {\n ok: false,\n result: {\n ok: false,\n result: {\n message,\n subagent_id: subagentId,\n expected_run_id: payloadRunId,\n current_run_id: currentRunId,\n },\n jobStatus: 'cancelled',\n skipSubagentFailure: true,\n error: message,\n },\n }\n }\n\n if (payloadRunId && currentRunId && payloadRunId !== currentRunId) {\n const message = 'Queued subagent job no longer matches the subagent current_run_id'\n return {\n ok: false,\n result: {\n ok: false,\n result: {\n message,\n subagent_id: subagentId,\n expected_run_id: payloadRunId,\n current_run_id: currentRunId,\n },\n jobStatus: 'cancelled',\n skipSubagentFailure: true,\n error: message,\n },\n }\n }\n\n const subagentType = subagent.subagent_type\n const adapter = getSubagentAdapter(subagentType)\n if (!adapter) {\n return {\n ok: false,\n result: {\n ok: false,\n result: { message: 'Unsupported subagent type', subagent_type: subagentType },\n error: `Unsupported subagent type: ${subagentType}`,\n },\n }\n }\n\n params.logInfo('Processing subagent run', {\n jobId: job.id,\n subagentId,\n subagentType,\n provider: inferProviderFromSubagentType(subagentType),\n })\n\n const inputPayload = (subagent.input ?? {}) as Record<string, unknown>\n const { prompt, inputRunId, inputRunSequence } = parseSubagentRunInput(inputPayload)\n if (!prompt) {\n return {\n ok: false,\n result: {\n ok: false,\n result: { message: 'Missing prompt in subagent input', subagent_id: subagentId },\n error: 'Missing prompt in subagent input',\n },\n }\n }\n\n const configPayload = (subagent.config ?? {}) as Record<string, unknown>\n const subagentFullControlRequested =\n parseBooleanInput(configPayload.full_control) ??\n parseBooleanInput(configPayload.fullControl) ??\n false\n const resumeSessionId =\n typeof metadata.session_id === 'string' ? metadata.session_id.trim() : null\n\n if (resumeSessionId && !adapter.supportsContinuation) {\n return {\n ok: false,\n result: {\n ok: false,\n result: { message: 'Subagent does not support continuation', subagent_id: subagentId },\n error: 'Subagent provider does not support continuation',\n },\n }\n }\n\n return {\n ok: true,\n target: {\n subagent,\n subagentId,\n payloadRunId,\n adapter,\n subagentType,\n prompt,\n inputRunId,\n inputRunSequence,\n configPayload,\n metadata,\n subagentFullControlRequested,\n resumeSessionId,\n },\n }\n}\n\nexport async function resolveSubagentRunPolicy(\n params: HandleGatewaySubagentRunJobParams,\n target: SubagentRunTarget\n): Promise<\n | { ok: true; policy: SubagentRunPolicy }\n | { ok: false; result: GatewaySubagentRunJobResult }\n> {\n const { supabase, config, job } = params\n const installFullControlEnabled = await params.refreshRuntimeInstallFullControl(config)\n const gatewayControlState = await params.loadGatewayControlState(supabase, config)\n if (!gatewayControlState) {\n return {\n ok: false,\n result: {\n ok: false,\n result: {\n message: 'Gateway control state unavailable',\n subagent_id: target.subagentId,\n },\n error: 'Gateway control state unavailable',\n },\n }\n }\n if (!params.isHeartbeatFresh(gatewayControlState.last_seen_at)) {\n return {\n ok: false,\n result: {\n ok: false,\n result: {\n message: 'Gateway is offline or heartbeat is stale',\n subagent_id: target.subagentId,\n },\n error: 'Gateway is offline or heartbeat is stale',\n },\n }\n }\n if (\n !gatewayControlState.capabilities ||\n !isGatewayServiceReady(gatewayControlState.capabilities, 'model_execution')\n ) {\n const modelServiceReason =\n gatewayControlState.capabilities?.services.model_execution.reason ??\n 'Gateway AI model providers are unavailable'\n return {\n ok: false,\n result: {\n ok: false,\n result: {\n message: modelServiceReason,\n subagent_id: target.subagentId,\n },\n error: modelServiceReason,\n },\n }\n }\n\n const adapterId = target.adapter.id as GatewayProviderId\n const providerSupport: Record<string, unknown> =\n params.providerCapabilities?.[adapterId]?.supported_flags ??\n (adapterId === 'claude_code'\n ? toFlagRecord(params.claudeSupport ?? DEFAULT_CLAUDE_SUPPORT)\n : {})\n const providerFullControlSupport = evaluateGatewayProviderFullControlSupport(\n adapterId,\n providerSupport\n )\n const { effectiveFullControl, deniedReason: fullControlDeniedReason } =\n resolveSubagentFullControlState({\n requested: target.subagentFullControlRequested,\n installFullControlEnabled,\n gatewayFullControlEnabled: gatewayControlState.full_control_enabled,\n providerFullControlSupport,\n })\n\n params.logInfo('Resolved subagent elevated provider state', {\n jobId: job.id,\n subagentId: target.subagentId,\n providerId: adapterId,\n fullControlRequested: target.subagentFullControlRequested,\n installFullControlEnabled,\n gatewayFullControlEnabled: gatewayControlState.full_control_enabled,\n providerFullControlSupported: providerFullControlSupport.supported,\n fullControlDeniedReason,\n fullControlEffective: effectiveFullControl,\n })\n\n return {\n ok: true,\n policy: {\n adapterId,\n providerSupport,\n effectiveFullControl,\n fullControlDeniedReason,\n retryConfig: buildDefaultSubagentRetryConfig(),\n },\n }\n}\n", "const TERMINAL_STATUSES = new Set(['completed', 'failed', 'cancelled']);\nfunction normalizeStatus(value) {\n if (typeof value !== 'string')\n return 'unknown';\n const normalized = value.trim().toLowerCase();\n return normalized.length > 0 ? normalized : 'unknown';\n}\nfunction normalizeRunId(value) {\n if (typeof value !== 'string')\n return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\nfunction buildStatusMessage(status) {\n if (TERMINAL_STATUSES.has(status)) {\n return `Subagent run is already terminal (status: ${status}).`;\n }\n if (status === 'idle') {\n return 'No active subagent run to cancel.';\n }\n return `Subagent is not running (status: ${status}).`;\n}\nexport function resolveCancelRequest(input) {\n const status = normalizeStatus(input.subagent_status);\n const requestedRunId = normalizeRunId(input.requested_run_id);\n const activeRunId = normalizeRunId(input.active_run_id);\n if (!input.cancel_supported) {\n return {\n accepted: false,\n cancel_result: 'rejected',\n cancel_state: 'rejected',\n status,\n resolved_run_id: null,\n message: 'Cancellation request rejected for this subagent.',\n };\n }\n if (status !== 'running') {\n const cancelResult = TERMINAL_STATUSES.has(status)\n ? 'already_terminal'\n : status === 'idle'\n ? 'no_active_run'\n : 'rejected';\n return {\n accepted: false,\n cancel_result: cancelResult,\n cancel_state: 'none',\n status,\n resolved_run_id: null,\n message: buildStatusMessage(status),\n };\n }\n if (!activeRunId) {\n return {\n accepted: false,\n cancel_result: 'no_active_run',\n cancel_state: 'none',\n status,\n resolved_run_id: null,\n message: 'No active subagent run to cancel.',\n };\n }\n if (requestedRunId && requestedRunId !== activeRunId) {\n return {\n accepted: false,\n cancel_result: 'no_active_run',\n cancel_state: 'none',\n status,\n resolved_run_id: null,\n message: 'Requested run_id is not the active running subagent run.',\n };\n }\n return {\n accepted: true,\n cancel_result: 'accepted',\n cancel_state: 'requested',\n status,\n resolved_run_id: activeRunId,\n message: 'Cancel requested.',\n };\n}\nexport function buildRequestedCancelMetadata(input) {\n const base = input.base ?? {};\n return {\n ...base,\n cancel_run_id: input.run_id,\n cancel_requested_at: input.requested_at,\n cancel_reason: input.reason,\n cancel_state: 'requested',\n cancel_support: input.cancel_support ?? null,\n cancellation_scope: input.cancellation_scope ?? null,\n };\n}\n", "import {\n buildRequestedCancelMetadata,\n resolveCancelRequest,\n} from '@panorama/shared/subagents/cancel-orchestrator'\nimport { getSubagentCancelAdapter } from '@panorama/shared/subagents/registry'\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from './database.types.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport type { GatewayJobRow } from './gateway-jobs.js'\nimport { asJson } from './gateway-run-helpers.js'\nimport {\n getNextSubagentRunEventSequence,\n insertSubagentRunEvent,\n type SubagentRunEventLogger,\n} from './subagent-run-events.js'\n\nexport type SubagentCancelJobResult = {\n ok: boolean\n result: Record<string, unknown>\n error?: string\n}\n\nexport function parseSubagentCancelPayload(payload: Record<string, unknown>): {\n subagentId: string | null\n runId: string | null\n reason: string\n} {\n const subagentId =\n typeof payload.subagent_id === 'string'\n ? payload.subagent_id\n : typeof payload.subagentId === 'string'\n ? payload.subagentId\n : null\n const runId =\n typeof payload.run_id === 'string'\n ? payload.run_id\n : typeof payload.runId === 'string'\n ? payload.runId\n : null\n const reason =\n typeof payload.reason === 'string' && payload.reason.trim().length > 0\n ? payload.reason.trim()\n : 'Cancelled'\n\n return { subagentId, runId, reason }\n}\n\nexport async function handleSubagentCancelJob(params: {\n supabase: SupabaseClient<Database>\n config: GatewayConfig\n job: GatewayJobRow\n requestSubagentCancel: (\n subagentId: string,\n runId: string | null,\n reason: string\n ) => { active: boolean }\n logError?: SubagentRunEventLogger\n}): Promise<SubagentCancelJobResult> {\n const { supabase, config, job, requestSubagentCancel, logError } = params\n const payload = job.payload ?? {}\n const { subagentId, runId, reason } = parseSubagentCancelPayload(payload)\n\n if (!subagentId) {\n return {\n ok: false,\n result: { message: 'Missing subagent_id in payload' },\n error: 'Missing subagent_id in payload',\n }\n }\n\n const { data: subagent, error: subagentError } = await supabase\n .from('subagents')\n .select('id, team_id, gateway_id, subagent_type, status, metadata')\n .eq('id', subagentId)\n .maybeSingle()\n\n if (subagentError) {\n return {\n ok: false,\n result: { message: 'Failed to load subagent for cancellation', subagent_id: subagentId },\n error: subagentError.message,\n }\n }\n\n if (!subagent) {\n return {\n ok: true,\n result: {\n subagent_id: subagentId,\n run_id: runId,\n cancelled_active_run: false,\n reason,\n cancel_result: 'no_active_run',\n cancel_state: 'none',\n cancel_supported: false,\n status: 'not_found',\n message: 'Subagent not found; no active run to cancel.',\n },\n }\n }\n\n if (subagent.gateway_id !== config.gatewayId) {\n return {\n ok: true,\n result: {\n subagent_id: subagentId,\n run_id: runId,\n cancelled_active_run: false,\n reason,\n cancel_result: 'no_active_run',\n cancel_state: 'none',\n cancel_supported: false,\n status: 'running',\n message: 'Subagent is assigned to another gateway; skipping stale cancel request.',\n },\n }\n }\n\n const metadata = (subagent.metadata ?? {}) as Record<string, unknown>\n const status = typeof subagent.status === 'string' ? subagent.status : 'unknown'\n const hasGateway = !!subagent.gateway_id\n const cancelAdapter = getSubagentCancelAdapter(subagent.subagent_type)\n const cancelSupported =\n cancelAdapter.supported && (cancelAdapter.support !== 'gateway' || hasGateway)\n const cancelSupportMode = cancelAdapter.support\n const cancellationScope = cancelAdapter.scope\n\n let activeRun: { id: string; metadata: Record<string, unknown> | null } | null = null\n if (status === 'running') {\n const { data: runningRun, error: runningRunError } = await supabase\n .from('subagent_runs')\n .select('id, metadata')\n .eq('subagent_id', subagentId)\n .eq('status', 'running')\n .order('run_sequence', { ascending: false })\n .limit(1)\n .maybeSingle()\n\n if (runningRunError) {\n return {\n ok: false,\n result: {\n message: 'Failed to resolve active subagent run for cancellation',\n subagent_id: subagentId,\n },\n error: runningRunError.message,\n }\n }\n\n activeRun = runningRun as { id: string; metadata: Record<string, unknown> | null } | null\n }\n\n const resolution = resolveCancelRequest({\n subagent_status: status,\n requested_run_id: runId,\n active_run_id: activeRun?.id ?? null,\n cancel_supported: cancelSupported,\n })\n\n if (!resolution.accepted) {\n return {\n ok: true,\n result: {\n subagent_id: subagentId,\n run_id: resolution.resolved_run_id,\n active_run_id: activeRun?.id ?? null,\n cancelled_active_run: false,\n reason,\n cancel_result: resolution.cancel_result,\n cancel_state: resolution.cancel_state,\n cancel_supported: cancelSupported,\n status: resolution.status,\n message: resolution.message,\n },\n }\n }\n\n const resolvedRunId = resolution.resolved_run_id\n if (!resolvedRunId) {\n return {\n ok: false,\n result: {\n message: 'Cancel accepted without an active run_id',\n subagent_id: subagentId,\n },\n error: 'Cancel accepted without an active run_id',\n }\n }\n\n const nowIso = new Date().toISOString()\n const mergedMetadata = buildRequestedCancelMetadata({\n base: metadata,\n run_id: resolvedRunId,\n reason,\n requested_at: nowIso,\n cancel_support: cancelSupportMode,\n cancellation_scope: cancellationScope,\n })\n\n const { data: updatedSubagent, error: subagentUpdateError } = await supabase\n .from('subagents')\n .update({\n metadata: asJson(mergedMetadata),\n })\n .eq('status', 'running')\n .eq('id', subagentId)\n .select('id')\n .maybeSingle()\n\n if (subagentUpdateError) {\n return {\n ok: false,\n result: {\n message: 'Failed to persist subagent cancellation metadata',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n },\n error: subagentUpdateError.message,\n }\n }\n\n if (!updatedSubagent) {\n const { data: latestSubagent, error: latestSubagentError } = await supabase\n .from('subagents')\n .select('status')\n .eq('id', subagentId)\n .maybeSingle()\n\n if (latestSubagentError) {\n return {\n ok: false,\n result: {\n message: 'Failed to refresh subagent status after cancel race',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n },\n error: latestSubagentError.message,\n }\n }\n\n const latestStatus = typeof latestSubagent?.status === 'string' ? latestSubagent.status : status\n let latestActiveRunId: string | null = null\n if (latestStatus === 'running') {\n const { data: latestRunningRun, error: latestRunningRunError } = await supabase\n .from('subagent_runs')\n .select('id')\n .eq('subagent_id', subagentId)\n .eq('status', 'running')\n .order('run_sequence', { ascending: false })\n .limit(1)\n .maybeSingle()\n\n if (latestRunningRunError) {\n return {\n ok: false,\n result: {\n message: 'Failed to refresh active subagent run after cancel race',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n },\n error: latestRunningRunError.message,\n }\n }\n\n latestActiveRunId = latestRunningRun?.id ?? null\n }\n\n const latestResolution = resolveCancelRequest({\n subagent_status: latestStatus,\n requested_run_id: runId,\n active_run_id: latestActiveRunId,\n cancel_supported: cancelSupported,\n })\n\n return {\n ok: true,\n result: {\n subagent_id: subagentId,\n run_id: latestResolution.resolved_run_id,\n cancelled_active_run: false,\n reason,\n cancel_result: latestResolution.cancel_result,\n cancel_state: latestResolution.cancel_state,\n cancel_supported: cancelSupported,\n status: latestResolution.status,\n message: latestResolution.message,\n },\n }\n }\n\n if (activeRun) {\n const runMetadata = (activeRun.metadata ?? {}) as Record<string, unknown>\n const { error: runUpdateError } = await supabase\n .from('subagent_runs')\n .update({\n metadata: asJson(\n buildRequestedCancelMetadata({\n base: runMetadata,\n run_id: resolvedRunId,\n reason,\n requested_at: nowIso,\n cancel_support: cancelSupportMode,\n cancellation_scope: cancellationScope,\n })\n ),\n })\n .eq('id', resolvedRunId)\n .eq('status', 'running')\n\n if (runUpdateError) {\n return {\n ok: false,\n result: {\n message: 'Failed to persist run cancellation metadata',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n },\n error: runUpdateError.message,\n }\n }\n }\n\n const { active } = requestSubagentCancel(subagentId, resolvedRunId, reason)\n\n if (activeRun) {\n const nextEventSequence = await getNextSubagentRunEventSequence(\n supabase,\n resolvedRunId,\n logError\n )\n await insertSubagentRunEvent({\n supabase,\n runId: resolvedRunId,\n subagentId,\n teamId: subagent.team_id,\n gatewayId: subagent.gateway_id,\n sequence: nextEventSequence,\n eventType: 'cancellation_requested',\n payload: {\n reason,\n source: 'gateway_cancel_job',\n active_process: active,\n cancel_state: 'requested',\n },\n logError,\n })\n }\n\n return {\n ok: true,\n result: {\n subagent_id: subagentId,\n run_id: resolvedRunId,\n cancelled_active_run: active,\n reason,\n cancel_result: 'accepted',\n cancel_state: 'requested',\n cancel_supported: cancelSupported,\n status: resolution.status,\n message:\n cancelSupportMode === 'gateway'\n ? 'Cancel requested and forwarded to gateway.'\n : 'Cancel requested. Worker will stop the run on its next cancellation check.',\n },\n }\n}\n", "import {\n getSubagentExecutionContext,\n getSubagentTypeDefinition,\n} from '@panorama/shared/subagents/registry'\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from './database.types.js'\nimport { asJson } from './gateway-run-helpers.js'\nimport type { GatewayJobRow } from './gateway-jobs.js'\nimport { SUBAGENT_SCHEMA_VERSION } from './subagent-adapters/types.js'\nimport { getNextSubagentRunEventSequence, insertSubagentRunEvent } from './subagent-run-events.js'\nimport { buildErrorOutput, mergeMetadata } from './subagent-run-helpers.js'\n\nexport type SubagentFailureLogger = (\n message: string,\n data?: Record<string, unknown>\n) => void\n\nexport async function failSubagentRun(params: {\n supabase: SupabaseClient<Database>\n job: GatewayJobRow\n errorMessage: string\n logError?: SubagentFailureLogger\n}): Promise<void> {\n const { supabase, job, errorMessage, logError = () => {} } = params\n const payload = job.payload ?? {}\n const subagentId =\n typeof payload.subagent_id === 'string'\n ? payload.subagent_id\n : typeof payload.subagentId === 'string'\n ? payload.subagentId\n : null\n\n if (!subagentId) return\n\n const { data: subagent } = await supabase\n .from('subagents')\n .select('id, status, subagent_type, metadata, team_id, gateway_id')\n .eq('id', subagentId)\n .maybeSingle()\n\n if (!subagent) return\n if (subagent.status !== 'running') return\n\n const nowIso = new Date().toISOString()\n const definition = getSubagentTypeDefinition(subagent.subagent_type)\n const executionContext = definition\n ? getSubagentExecutionContext(definition)\n : getSubagentExecutionContext({ runner: 'gateway' })\n const metadataUpdate: Record<string, unknown> = {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n runner: 'gateway',\n subagent_type: subagent.subagent_type,\n last_run_at: nowIso,\n gateway_error: errorMessage,\n ...executionContext,\n }\n\n const mergedMetadata = mergeMetadata(\n (subagent.metadata ?? {}) as Record<string, unknown>,\n metadataUpdate\n )\n const failureOutput = buildErrorOutput(errorMessage)\n\n const { data: runningRun } = await supabase\n .from('subagent_runs')\n .select('id, run_sequence')\n .eq('subagent_id', subagent.id)\n .eq('status', 'running')\n .order('run_sequence', { ascending: false })\n .limit(1)\n .maybeSingle()\n\n if (runningRun?.id) {\n const { error: runFailUpdateError } = await supabase\n .from('subagent_runs')\n .update({\n status: 'failed',\n error: errorMessage,\n output: asJson(failureOutput),\n completed_at: nowIso,\n metadata: asJson(mergedMetadata),\n })\n .eq('id', runningRun.id)\n .eq('status', 'running')\n\n if (runFailUpdateError) {\n logError('Failed to mark running subagent run as failed after gateway error', {\n subagentId,\n runId: runningRun.id,\n error: runFailUpdateError.message,\n })\n }\n\n if (subagent.gateway_id) {\n const nextSequence = await getNextSubagentRunEventSequence(\n supabase,\n runningRun.id,\n logError\n )\n await insertSubagentRunEvent({\n supabase,\n runId: runningRun.id,\n subagentId: subagent.id,\n teamId: subagent.team_id,\n gatewayId: subagent.gateway_id,\n sequence: nextSequence,\n eventType: 'run_failed',\n payload: { reason: errorMessage, source: 'gateway_job_failure' },\n logError,\n })\n }\n }\n\n const { error } = await supabase\n .from('subagents')\n .update({\n status: 'failed',\n error: errorMessage,\n completed_at: nowIso,\n output: asJson(failureOutput),\n metadata: asJson(mergedMetadata),\n })\n .eq('id', subagent.id)\n\n if (error) {\n logError('Failed to mark subagent as failed after gateway error', {\n subagentId,\n error: error.message,\n })\n }\n}\n", "import {\n GATEWAY_CAPABILITIES_SCHEMA_VERSION as DEFAULT_GATEWAY_CAPABILITIES_SCHEMA_VERSION,\n type GatewayCapabilitiesV1,\n} from '@panorama/shared/gateway/capabilities'\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport os from 'node:os'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { getStringOption, type ParsedArgs } from './cli-args.js'\nimport {\n getDefaultClaudePath,\n probeCommandVersion,\n probeShellResolution,\n selectBestCommand,\n} from './cli-provider-commands.js'\nimport type {\n GatewayHealthStatus,\n GatewayProviderCapabilities,\n GatewayProviderHealth,\n GatewayProviderId,\n} from './cli-providers/types.js'\nimport type { CliDetail } from './cli-output.js'\nimport type { Database } from './database.types.js'\nimport {\n buildGatewayProviderCapabilities,\n type GatewayProviderCapabilityProgressEvent,\n type GatewayProviderValidationCommandRunner,\n type ProviderValidationMode,\n} from './gateway-provider-capabilities.js'\nimport { buildProviderHealthEventPayloads } from './gateway-provider-health.js'\nimport { updateRuntimeProviderHealth as updateRuntimeProviderHealthBase } from './gateway-runtime-provider-health.js'\nimport {\n resolveClaudeProviderCommand,\n resolveCodexProviderCommand,\n resolveGeminiProviderCommand,\n} from './provider-runtime-utils.js'\nimport type { GatewayRuntimeState } from './gateway-runtime-state.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport type { ClaudeSupport } from './subagent-adapters/claude-support.js'\n\ntype GatewaySupabaseClient = SupabaseClient<Database>\ntype GatewayStatus = 'pending' | 'ready' | 'offline' | 'error'\n\nexport interface GatewayProviderRuntimeEventPayload {\n level: 'info' | 'warn' | 'error'\n code?: string\n message: string\n provider?: string\n details?: Record<string, unknown>\n}\n\nexport interface GatewayProviderRuntimeBuildCapabilitiesParams {\n validationMode?: ProviderValidationMode\n previousHealth?: Partial<Record<GatewayProviderId, GatewayProviderHealth>>\n deviceName?: string | null\n installFullControlEnabled?: boolean\n onProgress?: (event: GatewayProviderCapabilityProgressEvent) => void\n}\n\nexport interface GatewayProviderRuntimeBuildCapabilitiesResult {\n capabilities: GatewayCapabilitiesV1\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>\n anyProviderReady: boolean\n}\n\nexport interface GatewayProviderRuntimeDependencies {\n runtimeState: GatewayRuntimeState<GatewayProviderRuntimeEventPayload>\n getActiveOptions: (options?: ParsedArgs['options']) => ParsedArgs['options']\n isVerbose: (options?: ParsedArgs['options']) => boolean\n buildGatewayChildEnv: () => NodeJS.ProcessEnv\n runCommand: GatewayProviderValidationCommandRunner\n readGatewayVersion: () => Promise<string | null>\n saveConfig: (config: GatewayConfig) => Promise<void>\n sendHeartbeat: (\n supabase: GatewaySupabaseClient,\n status: GatewayStatus,\n capabilities: GatewayCapabilitiesV1,\n deviceName?: string | null\n ) => Promise<void>\n emitGatewayEvent: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n payload: GatewayProviderRuntimeEventPayload\n ) => Promise<void>\n cliWarn: (\n message: string,\n options?: ParsedArgs['options'],\n details?: CliDetail[]\n ) => void\n logInfo: (message: string, data?: Record<string, unknown>) => void\n logWarn: (message: string, data?: Record<string, unknown>) => void\n logError: (message: string, data?: Record<string, unknown>) => void\n expectedCapabilitiesSchemaVersion?: typeof DEFAULT_GATEWAY_CAPABILITIES_SCHEMA_VERSION\n buildProviderCapabilities?: typeof buildGatewayProviderCapabilities\n env?: NodeJS.ProcessEnv\n homeDir?: () => string\n}\n\nexport interface GatewayProviderRuntime {\n resolveClaudeCommand: (options?: ParsedArgs['options']) => string\n resolveCodexCommand: (options?: ParsedArgs['options']) => string\n resolveGeminiCommand: (options?: ParsedArgs['options']) => string\n discoverCliCommands: (options?: ParsedArgs['options']) => Promise<void>\n buildCapabilities: (\n params?: GatewayProviderRuntimeBuildCapabilitiesParams\n ) => Promise<GatewayProviderRuntimeBuildCapabilitiesResult>\n updateRuntimeProviderHealth: (params: {\n supabase: GatewaySupabaseClient\n providerId: GatewayProviderId\n status: GatewayHealthStatus\n error?: string | null\n context: string\n jobId?: string\n runId?: string\n }) => Promise<void>\n emitProviderHealthEvents: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>,\n context: string\n ) => Promise<void>\n getProviderCapabilities: () => Record<GatewayProviderId, GatewayProviderCapabilities> | null\n getClaudeSupport: () => ClaudeSupport | null\n}\n\nexport function createGatewayProviderRuntime(\n dependencies: GatewayProviderRuntimeDependencies\n): GatewayProviderRuntime {\n const buildProviderCapabilities =\n dependencies.buildProviderCapabilities ?? buildGatewayProviderCapabilities\n const expectedCapabilitiesSchemaVersion =\n dependencies.expectedCapabilitiesSchemaVersion ?? DEFAULT_GATEWAY_CAPABILITIES_SCHEMA_VERSION\n const env = dependencies.env ?? process.env\n const homeDir = dependencies.homeDir ?? os.homedir\n let providerCapabilities: Record<GatewayProviderId, GatewayProviderCapabilities> | null = null\n let claudeSupport: ClaudeSupport | null = null\n\n const resolveClaudeCommand = (options?: ParsedArgs['options']): string => {\n return resolveClaudeProviderCommand({\n options: dependencies.getActiveOptions(options),\n env,\n homeDir: homeDir(),\n logInfo: dependencies.logInfo,\n })\n }\n\n const resolveCodexCommand = (options?: ParsedArgs['options']): string => {\n return resolveCodexProviderCommand({\n options: dependencies.getActiveOptions(options),\n env,\n })\n }\n\n const resolveGeminiCommand = (options?: ParsedArgs['options']): string => {\n return resolveGeminiProviderCommand({\n options: dependencies.getActiveOptions(options),\n env,\n })\n }\n\n const discoverCliCommands = async (options?: ParsedArgs['options']): Promise<void> => {\n const resolvedOptions = dependencies.getActiveOptions(options)\n const warnShellResolution = async (\n label: string,\n command: string,\n envKey: string,\n cliFlag: string,\n source: 'override' | 'detected' | 'fallback',\n override?: string\n ): Promise<void> => {\n if (override || source !== 'fallback') return\n const resolution = await probeShellResolution(command, { shell: env.SHELL })\n if (!resolution) return\n const hint =\n resolution.kind === 'path'\n ? `Your shell resolves \"${command}\" to ${resolution.path}, but the gateway could not find it in PATH.`\n : `Your shell defines \"${command}\" as a ${resolution.kind}, but the gateway does not load shell aliases.`\n dependencies.cliWarn(`${label} CLI not found in PATH. ${hint}`, resolvedOptions, [\n { label: 'Shell', value: env.SHELL ?? 'unknown', verboseOnly: true },\n { label: 'Shell resolution', value: resolution.detail, verboseOnly: true },\n { label: 'Fix', value: `Set ${envKey} or pass ${cliFlag}.` },\n ])\n }\n\n const claudeOverride =\n getStringOption(resolvedOptions, 'claude-cli') ||\n env.PANORAMA_CLAUDE_CLI ||\n env.CLAUDE_CLI\n const codexOverride =\n getStringOption(resolvedOptions, 'codex-cli') ||\n env.PANORAMA_CODEX_CLI ||\n env.CODEX_CLI\n const geminiOverride =\n getStringOption(resolvedOptions, 'gemini-cli') ||\n env.PANORAMA_GEMINI_CLI ||\n env.GEMINI_CLI\n\n const probeGatewayCommandVersion = (command: string) =>\n probeCommandVersion(command, { env: dependencies.buildGatewayChildEnv() })\n const selectGatewayCommand = (params: {\n label: string\n command: string\n override?: string\n extraCandidates?: string[]\n }) =>\n selectBestCommand({\n ...params,\n discoveryOptions: { env, homeDir: homeDir() },\n probeCommand: probeGatewayCommandVersion,\n logInfo: dependencies.logInfo,\n })\n\n const claudeResult = await selectGatewayCommand({\n label: 'Claude',\n command: 'claude',\n override: claudeOverride,\n extraCandidates: [getDefaultClaudePath(homeDir()), path.join(homeDir(), '.claude', 'claude')],\n })\n const codexResult = await selectGatewayCommand({\n label: 'Codex',\n command: 'codex',\n override: codexOverride,\n })\n const geminiResult = await selectGatewayCommand({\n label: 'Gemini',\n command: 'gemini',\n override: geminiOverride,\n })\n\n await warnShellResolution(\n 'Claude',\n 'claude',\n 'PANORAMA_CLAUDE_CLI',\n '--claude-cli <path>',\n claudeResult.source,\n claudeOverride\n )\n await warnShellResolution(\n 'Codex',\n 'codex',\n 'PANORAMA_CODEX_CLI',\n '--codex-cli <path>',\n codexResult.source,\n codexOverride\n )\n await warnShellResolution(\n 'Gemini',\n 'gemini',\n 'PANORAMA_GEMINI_CLI',\n '--gemini-cli <path>',\n geminiResult.source,\n geminiOverride\n )\n\n if (!claudeOverride) {\n env.PANORAMA_CLAUDE_CLI = claudeResult.command\n }\n if (!codexOverride) {\n env.PANORAMA_CODEX_CLI = codexResult.command\n }\n if (!geminiOverride) {\n env.PANORAMA_GEMINI_CLI = geminiResult.command\n }\n\n if (dependencies.isVerbose(resolvedOptions)) {\n dependencies.logInfo('Gateway CLI discovery results', {\n claude: claudeResult,\n codex: codexResult,\n gemini: geminiResult,\n })\n }\n }\n\n const buildCapabilities = async (\n params?: GatewayProviderRuntimeBuildCapabilitiesParams\n ): Promise<GatewayProviderRuntimeBuildCapabilitiesResult> => {\n const result = await buildProviderCapabilities({\n ...params,\n runCommand: dependencies.runCommand,\n readGatewayVersion: dependencies.readGatewayVersion,\n })\n providerCapabilities = result.providerCapabilities\n if (result.claudeSupport) {\n claudeSupport = result.claudeSupport\n }\n if (result.capabilities.schema_version !== expectedCapabilitiesSchemaVersion) {\n dependencies.logWarn('Gateway capability schema version mismatch', {\n expected: expectedCapabilitiesSchemaVersion,\n actual: result.capabilities.schema_version,\n })\n }\n return {\n capabilities: result.capabilities,\n providerHealth: result.providerHealth,\n anyProviderReady: result.anyProviderReady,\n }\n }\n\n const updateRuntimeProviderHealth = async (params: {\n supabase: GatewaySupabaseClient\n providerId: GatewayProviderId\n status: GatewayHealthStatus\n error?: string | null\n context: string\n jobId?: string\n runId?: string\n }): Promise<void> => {\n await updateRuntimeProviderHealthBase({\n state: dependencies.runtimeState,\n providerCapabilities,\n providerId: params.providerId,\n status: params.status,\n error: params.error,\n context: params.context,\n jobId: params.jobId,\n runId: params.runId,\n saveConfig: dependencies.saveConfig,\n sendHeartbeat: (status, capabilities, deviceName) =>\n dependencies.sendHeartbeat(params.supabase, status, capabilities, deviceName),\n emitGatewayEvent: (config, payload) =>\n dependencies.emitGatewayEvent(params.supabase, config, payload),\n logError: dependencies.logError,\n })\n }\n\n const emitProviderHealthEvents = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>,\n context: string\n ): Promise<void> => {\n const payloads = buildProviderHealthEventPayloads(providerHealth, context)\n for (const payload of payloads) {\n await dependencies.emitGatewayEvent(supabase, config, {\n level: payload.level,\n code: payload.code,\n provider: payload.provider,\n message: payload.message,\n details: payload.details,\n })\n }\n }\n\n return {\n resolveClaudeCommand,\n resolveCodexCommand,\n resolveGeminiCommand,\n discoverCliCommands,\n buildCapabilities,\n updateRuntimeProviderHealth,\n emitProviderHealthEvents,\n getProviderCapabilities: () => providerCapabilities,\n getClaudeSupport: () => claudeSupport,\n }\n}\n", "import {\n GATEWAY_CAPABILITIES_SCHEMA_VERSION,\n type GatewayCapabilitiesV1,\n type GatewayHostCapabilities,\n type GatewayRuntimeInfo,\n} from '@panorama/shared/gateway/capabilities'\nimport { randomUUID } from 'node:crypto'\nimport process from 'node:process'\nimport { listGatewayCliProviders } from './cli-providers/registry.js'\nimport {\n DEFAULT_MODEL_SENTINEL,\n type GatewayCliProvider,\n type GatewayHealthStatus,\n type GatewayProviderCapabilities,\n type GatewayProviderHealth,\n type GatewayProviderId,\n} from './cli-providers/types.js'\nimport {\n deriveGatewayServiceCapabilities,\n hasReadyGatewayModelProvider,\n} from './gateway-capability-services.js'\nimport {\n runGatewayCommand,\n type GatewayCommandRunOptions,\n type GatewayCommandResult,\n} from './gateway-command-runner.js'\nimport {\n assertSafeOutputPath,\n cleanupWorkDir,\n createWorkDir,\n resolveRunPlanEnv,\n writeRunPlanFiles,\n} from './gateway-run-helpers.js'\nimport { resolveValidationWorkdirRoot } from './runtime-paths.js'\nimport {\n coerceClaudeSupport,\n type ClaudeSupport,\n} from './subagent-adapters/claude-support.js'\n\nconst PROVIDER_VALIDATION_TIMEOUT_MS = 30_000\nconst PROVIDER_VALIDATION_PROMPT = 'Say hi.'\nconst PROVIDER_VALIDATION_SCHEMA = {\n type: 'object',\n required: ['message'],\n properties: {\n message: { type: 'string' },\n },\n additionalProperties: false,\n}\nconst PROVIDER_VALIDATION_MODEL = DEFAULT_MODEL_SENTINEL\n\nexport type ProviderValidationMode = 'full' | 'light' | 'auto'\n\nexport interface GatewayProviderCapabilityProgressEvent {\n stage: 'start' | 'complete'\n providerId: GatewayProviderId\n status?: GatewayHealthStatus\n durationMs?: number\n error?: string\n}\n\nexport type GatewayProviderValidationCommandRunner = (\n command: string,\n args: string[],\n options: GatewayCommandRunOptions\n) => Promise<GatewayCommandResult>\n\nexport interface GatewayProviderCapabilitiesResult {\n capabilities: GatewayCapabilitiesV1\n providerCapabilities: Record<GatewayProviderId, GatewayProviderCapabilities>\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>\n anyProviderReady: boolean\n claudeSupport: ClaudeSupport | null\n}\n\nexport function coerceGatewayHealthStatus(\n value: GatewayHealthStatus | undefined\n): GatewayHealthStatus {\n if (\n value === 'healthy' ||\n value === 'unhealthy' ||\n value === 'unknown' ||\n value === 'unavailable'\n ) {\n return value\n }\n return 'unknown'\n}\n\nexport async function runProviderValidation(params: {\n provider: GatewayCliProvider\n model?: string\n runCommand?: GatewayProviderValidationCommandRunner\n workRoot?: string\n createRunId?: () => string\n}): Promise<{ ok: boolean; durationMs: number; error?: string }> {\n const {\n provider,\n model = PROVIDER_VALIDATION_MODEL,\n runCommand = runGatewayCommand,\n workRoot = resolveValidationWorkdirRoot(),\n createRunId = randomUUID,\n } = params\n const workDir = await createWorkDir(workRoot, [\n { value: provider.id, label: 'provider id' },\n { value: createRunId(), label: 'validation run id' },\n ])\n\n try {\n const runPlan = provider.buildModelRunPlan({\n model,\n prompt: PROVIDER_VALIDATION_PROMPT,\n jsonSchema: PROVIDER_VALIDATION_SCHEMA,\n timeoutMs: PROVIDER_VALIDATION_TIMEOUT_MS,\n })\n\n assertSafeOutputPath(workDir, runPlan.outputPath)\n await writeRunPlanFiles(workDir, runPlan.files)\n\n const runResult = await runCommand(runPlan.command, runPlan.args, {\n timeoutMs: runPlan.timeoutMs ?? PROVIDER_VALIDATION_TIMEOUT_MS,\n cwd: workDir,\n env: resolveRunPlanEnv(runPlan.env, workDir),\n })\n\n if (!runResult.ok) {\n return {\n ok: false,\n durationMs: runResult.durationMs,\n error: runResult.error || runResult.stderr || 'Provider validation failed',\n }\n }\n\n try {\n provider.normalizeModelRunResult({\n stdout: runResult.stdout,\n outputFormat: runPlan.outputFormat,\n outputMode: runPlan.outputMode,\n outputPath: runPlan.outputPath,\n workDir,\n })\n } catch (error) {\n return {\n ok: false,\n durationMs: runResult.durationMs,\n error: error instanceof Error ? error.message : 'Failed to parse validation output',\n }\n }\n\n return { ok: true, durationMs: runResult.durationMs }\n } finally {\n await cleanupWorkDir(workDir, workRoot)\n }\n}\n\nexport async function resolveProviderHealth(params: {\n provider: GatewayCliProvider\n capability: GatewayProviderCapabilities\n mode: ProviderValidationMode\n previous?: GatewayProviderHealth\n runValidation?: (\n provider: GatewayCliProvider,\n model: string\n ) => Promise<{ ok: boolean; durationMs: number; error?: string }>\n now?: () => Date\n}): Promise<GatewayProviderHealth> {\n const { provider, capability, mode, previous } = params\n const now = (params.now ?? (() => new Date()))().toISOString()\n const lastFullCheckedAt = previous?.last_full_checked_at\n const lastFullStatus = previous?.last_full_status\n\n if (!capability.available) {\n return {\n status: 'unavailable',\n check_type: mode === 'full' ? 'full' : 'light',\n checked_at: now,\n last_full_checked_at: lastFullCheckedAt,\n last_full_status: lastFullStatus,\n error: capability.error ?? previous?.error,\n }\n }\n\n const shouldRunFull =\n mode === 'full' || (mode === 'auto' && (!lastFullCheckedAt || !lastFullStatus))\n\n if (shouldRunFull) {\n const model = PROVIDER_VALIDATION_MODEL\n const validation = await (params.runValidation ?? ((nextProvider, nextModel) =>\n runProviderValidation({ provider: nextProvider, model: nextModel })))(provider, model)\n const status: GatewayHealthStatus = validation.ok ? 'healthy' : 'unhealthy'\n return {\n status,\n check_type: 'full',\n checked_at: now,\n last_full_checked_at: now,\n last_full_status: status,\n error: validation.ok ? undefined : validation.error,\n model: model === DEFAULT_MODEL_SENTINEL ? undefined : model,\n duration_ms: validation.durationMs,\n }\n }\n\n const fallbackStatus = coerceGatewayHealthStatus(lastFullStatus)\n const previousStatus = previous?.status ? coerceGatewayHealthStatus(previous.status) : undefined\n\n return {\n status: previousStatus ?? fallbackStatus,\n check_type: 'light',\n checked_at: now,\n last_full_checked_at: lastFullCheckedAt,\n last_full_status: lastFullStatus,\n error: capability.error ?? previous?.error,\n }\n}\n\nexport async function buildGatewayProviderCapabilities(params?: {\n validationMode?: ProviderValidationMode\n previousHealth?: Partial<Record<GatewayProviderId, GatewayProviderHealth>>\n deviceName?: string | null\n installFullControlEnabled?: boolean\n onProgress?: (event: GatewayProviderCapabilityProgressEvent) => void\n providers?: GatewayCliProvider[]\n runCommand?: GatewayProviderValidationCommandRunner\n readGatewayVersion?: () => Promise<string | null>\n now?: () => Date\n platform?: string\n arch?: string\n nodeVersion?: string\n}): Promise<GatewayProviderCapabilitiesResult> {\n const validationMode = params?.validationMode ?? 'light'\n const previousHealth =\n params?.previousHealth ?? ({} as Partial<Record<GatewayProviderId, GatewayProviderHealth>>)\n const providers = params?.providers ?? listGatewayCliProviders()\n const progress = params?.onProgress\n const entries = await Promise.all(\n providers.map(async (provider) => {\n progress?.({ stage: 'start', providerId: provider.id })\n const startedAt = Date.now()\n try {\n const capability = await provider.detectCapabilities()\n const health = await resolveProviderHealth({\n provider,\n capability,\n mode: validationMode,\n previous: previousHealth[provider.id],\n runValidation: (nextProvider, model) =>\n runProviderValidation({\n provider: nextProvider,\n model,\n runCommand: params?.runCommand,\n }),\n now: params?.now,\n })\n progress?.({\n stage: 'complete',\n providerId: provider.id,\n status: health.status,\n durationMs: Date.now() - startedAt,\n error: health.error,\n })\n return [provider.id, { ...capability, health }] as const\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n progress?.({\n stage: 'complete',\n providerId: provider.id,\n status: 'unavailable',\n durationMs: Date.now() - startedAt,\n error: message,\n })\n return [\n provider.id,\n {\n available: false,\n error: message,\n supports: { output_schema: false, stream_json: false, tool_disable: false },\n health: {\n status: 'unavailable',\n check_type: validationMode === 'full' ? 'full' : 'light',\n checked_at: (params?.now ?? (() => new Date()))().toISOString(),\n error: message,\n },\n } satisfies GatewayProviderCapabilities,\n ] as const\n }\n })\n )\n\n const providerCapabilities = entries.reduce(\n (acc, [id, capability]) => {\n acc[id] = capability\n return acc\n },\n {} as Record<GatewayProviderId, GatewayProviderCapabilities>\n )\n\n const providerHealth = Object.fromEntries(\n Object.entries(providerCapabilities).map(([id, capability]) => [\n id,\n capability.health ??\n ({\n status: 'unknown',\n check_type: validationMode === 'full' ? 'full' : 'light',\n checked_at: (params?.now ?? (() => new Date()))().toISOString(),\n } as GatewayProviderHealth),\n ])\n ) as Record<GatewayProviderId, GatewayProviderHealth>\n\n const claudeCapabilities = providerCapabilities.claude_code\n const claudeSupport = claudeCapabilities?.supported_flags\n ? coerceClaudeSupport(\n claudeCapabilities.supported_flags as Record<string, boolean> | undefined\n )\n : null\n\n const anyProviderReady = hasReadyGatewayModelProvider(providerCapabilities)\n const gatewayVersion = await (params?.readGatewayVersion?.() ?? Promise.resolve(null))\n\n const runtime: GatewayRuntimeInfo = {\n platform: params?.platform ?? process.platform,\n arch: params?.arch ?? process.arch,\n node_version: params?.nodeVersion ?? process.version,\n ...(gatewayVersion ? { gateway_version: gatewayVersion } : {}),\n }\n\n const host: GatewayHostCapabilities = {\n kind: 'gateway',\n available: true,\n }\n\n if (params?.deviceName) {\n host.label = params.deviceName\n }\n host.metadata = {\n install_full_control_enabled: params?.installFullControlEnabled === true,\n }\n\n return {\n capabilities: {\n schema_version: GATEWAY_CAPABILITIES_SCHEMA_VERSION,\n providers: providerCapabilities,\n hosts: { gateway: host },\n services: deriveGatewayServiceCapabilities({\n providers: providerCapabilities,\n host,\n installFullControlEnabled: params?.installFullControlEnabled === true,\n }),\n runtime,\n },\n providerCapabilities,\n providerHealth,\n anyProviderReady,\n claudeSupport,\n }\n}\n", "import type { GatewayCapabilitiesV1 } from '@panorama/shared/gateway/capabilities'\nimport type { GatewayProviderCapabilities } from './cli-providers/types.js'\n\nexport function isGatewayProviderReady(entry?: GatewayProviderCapabilities): boolean {\n if (!entry) return false\n if (entry.health?.status === 'healthy') return true\n if (!entry.available) return false\n if (!entry.health) return true\n return entry.health.status !== 'unavailable' && entry.health.status !== 'unhealthy'\n}\n\nexport function hasReadyGatewayModelProvider(\n providers: Record<string, GatewayProviderCapabilities>\n): boolean {\n return Object.values(providers).some((entry) => isGatewayProviderReady(entry))\n}\n\nexport function deriveGatewayServiceCapabilities(params: {\n providers: Record<string, GatewayProviderCapabilities>\n host: GatewayCapabilitiesV1['hosts']['gateway']\n installFullControlEnabled?: boolean\n}): GatewayCapabilitiesV1['services'] {\n const anyProviderReady = hasReadyGatewayModelProvider(params.providers)\n const installFullControlEnabled =\n params.installFullControlEnabled ??\n (params.host.metadata?.install_full_control_enabled === true)\n\n return {\n model_execution: {\n ready: anyProviderReady,\n reason: anyProviderReady ? undefined : 'No gateway AI model provider is healthy',\n },\n remote_shell: {\n ready: params.host.available,\n reason: params.host.available\n ? undefined\n : (params.host.error ?? 'Gateway host is unavailable'),\n },\n machine_control: {\n ready: params.host.available && installFullControlEnabled,\n reason:\n params.host.available && installFullControlEnabled\n ? undefined\n : !params.host.available\n ? (params.host.error ?? 'Gateway host is unavailable')\n : 'Gateway host machine control is disabled',\n },\n }\n}\n", "import {\n isGatewayHostAvailable,\n type GatewayCapabilitiesV1,\n} from '@panorama/shared/gateway/capabilities'\nimport type { GatewayProviderCapabilities } from './cli-providers/types.js'\nimport { isGatewayProviderReady } from './gateway-capability-services.js'\n\nexport interface GatewayJobIngressState {\n pending: boolean\n ready: boolean\n}\n\nexport type GatewayOperationalStatus = 'pending' | 'ready' | 'error'\n\nexport function isProviderReady(entry?: GatewayProviderCapabilities): boolean {\n return isGatewayProviderReady(entry)\n}\n\nexport function computeGatewayStatusFromCapabilities(\n providers: Record<string, GatewayProviderCapabilities>\n): GatewayOperationalStatus {\n const anyReady = Object.values(providers).some((entry) => isProviderReady(entry))\n return anyReady ? 'ready' : 'error'\n}\n\nexport function computeGatewayOperationalStatus(params: {\n capabilities: GatewayCapabilitiesV1 | null\n jobIngressState: GatewayJobIngressState | null\n acceptingJobs: boolean\n}): GatewayOperationalStatus {\n if (!params.capabilities) return 'pending'\n\n if (!isGatewayHostAvailable(params.capabilities)) {\n return 'error'\n }\n\n if (!params.acceptingJobs) {\n return 'pending'\n }\n\n if (!params.jobIngressState || params.jobIngressState.pending) {\n return 'pending'\n }\n\n return params.jobIngressState.ready ? 'ready' : 'error'\n}\n", "import type { GatewayCapabilitiesV1 } from '@panorama/shared/gateway/capabilities'\nimport type {\n GatewayHealthStatus,\n GatewayProviderCapabilities,\n GatewayProviderHealth,\n GatewayProviderId,\n} from './cli-providers/types.js'\nimport { computeGatewayOperationalStatus } from './gateway-operational-status.js'\nimport { deriveGatewayServiceCapabilities } from './gateway-capability-services.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport {\n formatProviderLabel,\n normalizeProviderErrorSummary,\n} from './gateway-provider-health.js'\nimport type { GatewayRuntimeState } from './gateway-runtime-state.js'\n\nexport type GatewayRuntimeProviderHealthEvent = {\n level: 'info' | 'warn' | 'error'\n code?: string\n message: string\n provider?: string\n details?: Record<string, unknown>\n}\n\nexport function resolveRuntimeProviderHealth(params: {\n state: GatewayRuntimeState<unknown>\n providerCapabilities: Record<GatewayProviderId, GatewayProviderCapabilities> | null\n providerId: GatewayProviderId\n}): GatewayProviderHealth | undefined {\n const { state, providerCapabilities, providerId } = params\n if (state.currentProviderHealth && state.currentProviderHealth[providerId]) {\n return state.currentProviderHealth[providerId]\n }\n const fromConfig = state.currentConfig?.providerHealth?.[providerId]\n if (fromConfig) return fromConfig\n return providerCapabilities?.[providerId]?.health\n}\n\nexport async function updateRuntimeProviderHealth(params: {\n state: GatewayRuntimeState<unknown>\n providerCapabilities: Record<GatewayProviderId, GatewayProviderCapabilities> | null\n providerId: GatewayProviderId\n status: GatewayHealthStatus\n error?: string | null\n context: string\n jobId?: string\n runId?: string\n saveConfig: (config: GatewayConfig) => Promise<void>\n sendHeartbeat: (\n status: 'pending' | 'ready' | 'offline' | 'error',\n capabilities: GatewayCapabilitiesV1,\n deviceName?: string | null\n ) => Promise<void>\n emitGatewayEvent: (\n config: GatewayConfig,\n payload: GatewayRuntimeProviderHealthEvent\n ) => Promise<void>\n logError: (message: string, data?: Record<string, unknown>) => void\n}): Promise<void> {\n const { state, providerCapabilities } = params\n if (!providerCapabilities || !providerCapabilities[params.providerId]) return\n\n const previous = resolveRuntimeProviderHealth({\n state,\n providerCapabilities,\n providerId: params.providerId,\n })\n const nextStatus = params.status\n const errorSummary = normalizeProviderErrorSummary(params.error)\n const nowIso = new Date().toISOString()\n\n const nextHealth: GatewayProviderHealth = {\n status: nextStatus,\n check_type: 'light',\n checked_at: nowIso,\n last_full_checked_at: previous?.last_full_checked_at,\n last_full_status: previous?.last_full_status,\n error: nextStatus === 'healthy' ? undefined : (errorSummary ?? previous?.error),\n }\n\n providerCapabilities[params.providerId] = {\n ...providerCapabilities[params.providerId],\n health: nextHealth,\n }\n\n if (state.currentCapabilities) {\n const providers: Record<GatewayProviderId, GatewayProviderCapabilities> = {\n ...state.currentCapabilities.providers,\n }\n if (providers[params.providerId]) {\n providers[params.providerId] = {\n ...providers[params.providerId],\n health: nextHealth,\n }\n }\n state.currentCapabilities = {\n ...state.currentCapabilities,\n providers,\n services: deriveGatewayServiceCapabilities({\n providers,\n host: state.currentCapabilities.hosts.gateway,\n }),\n }\n }\n\n if (state.currentConfig) {\n if (!state.currentConfig.providerHealth) {\n state.currentConfig.providerHealth = {} as Record<GatewayProviderId, GatewayProviderHealth>\n }\n state.currentConfig.providerHealth[params.providerId] = nextHealth\n void params.saveConfig(state.currentConfig).catch((error) => {\n params.logError('Failed to persist gateway provider health', {\n error: error instanceof Error ? error.message : String(error),\n provider: params.providerId,\n })\n })\n }\n\n state.currentProviderHealth = {\n ...(state.currentProviderHealth ?? {}),\n [params.providerId]: nextHealth,\n }\n\n const nextStatusOverall = computeGatewayOperationalStatus({\n capabilities: state.currentCapabilities,\n jobIngressState: state.currentJobIngressState,\n acceptingJobs: state.currentAcceptingJobs,\n })\n if (state.currentCapabilities && state.currentDeviceName) {\n await params.sendHeartbeat(\n nextStatusOverall,\n state.currentCapabilities,\n state.currentDeviceName\n )\n }\n\n const statusChanged = previous?.status !== nextStatus\n if (statusChanged && nextStatus !== 'healthy' && state.currentConfig) {\n const label = formatProviderLabel(params.providerId)\n await params.emitGatewayEvent(state.currentConfig, {\n level: nextStatus === 'unhealthy' ? 'error' : 'warn',\n code: 'provider_unhealthy',\n provider: params.providerId,\n message: `${label} provider marked ${nextStatus}.`,\n details: {\n context: params.context,\n status: nextStatus,\n error: errorSummary ?? null,\n job_id: params.jobId ?? null,\n run_id: params.runId ?? null,\n },\n })\n }\n}\n", "import os from 'node:os'\nimport process from 'node:process'\nimport { getStringOption, type ParsedArgs } from './cli-args.js'\nimport { GatewayCliError, type CliDetail } from './cli-output.js'\nimport { startGatewayDaemonIfRequested as startGatewayDaemonIfRequestedBase } from './gateway-daemon.js'\nimport type { GatewayJobHandlers } from './gateway-job-handlers.js'\nimport {\n startGatewayLocalRuntime as startGatewayLocalRuntimeBase,\n type GatewayLocalRuntimeConfigResolution,\n type GatewayLocalRuntimeEventPayload,\n type StartGatewayLocalRuntimeParams,\n} from './gateway-local-runtime.js'\nimport type { GatewayRuntimeState } from './gateway-runtime-state.js'\nimport type { GatewayConfig, GatewayPaths } from './gateway-state.js'\nimport { buildMissingSupabaseConfigError, resolveSupabaseConfig } from './supabase-config.js'\n\ntype CliReporter = (\n message: string,\n options?: ParsedArgs['options'],\n details?: CliDetail[]\n) => void\n\nexport type GatewayStartCommandDependencies = Pick<\n StartGatewayLocalRuntimeParams,\n | 'buildCapabilities'\n | 'ensureGatewayTmpDir'\n | 'discoverGatewayCliCommands'\n | 'refreshRuntimeInstallFullControl'\n | 'emitGatewayEvent'\n | 'flushGatewayEvents'\n | 'emitProviderHealthEvents'\n | 'sendHeartbeat'\n | 'getNextSubagentRunEventSequence'\n | 'insertSubagentRunEvent'\n | 'requestChildTermination'\n | 'logInfo'\n | 'logError'\n> & {\n runtimeState: GatewayRuntimeState<GatewayLocalRuntimeEventPayload>\n resolveGatewayPaths: (options?: ParsedArgs['options']) => GatewayPaths\n readPidFile: (options?: ParsedArgs['options']) => number | null\n writePidFile: (pid: number, options?: ParsedArgs['options']) => Promise<void>\n removePidFile: (options?: ParsedArgs['options']) => Promise<void>\n isProcessAlive: (pid: number) => boolean\n loadConfig: (options?: ParsedArgs['options']) => Promise<GatewayConfig>\n saveConfig: (config: GatewayConfig, options?: ParsedArgs['options']) => Promise<void>\n buildGatewayJobHandlers: () => GatewayJobHandlers\n cliInfo: CliReporter\n cliSuccess: CliReporter\n startGatewayDaemonIfRequested?: typeof startGatewayDaemonIfRequestedBase\n startGatewayLocalRuntime?: typeof startGatewayLocalRuntimeBase\n env?: NodeJS.ProcessEnv\n hostname?: () => string\n}\n\nexport async function startGatewayCommand(\n options: ParsedArgs['options'],\n configResolution: GatewayLocalRuntimeConfigResolution | undefined,\n dependencies: GatewayStartCommandDependencies\n): Promise<void> {\n const paths = dependencies.resolveGatewayPaths(options)\n const foregroundRequested = options.foreground === true\n const explicitDaemon = options.daemon === true || options.background === true\n const startGatewayDaemonIfRequested =\n dependencies.startGatewayDaemonIfRequested ?? startGatewayDaemonIfRequestedBase\n const daemonResult = await startGatewayDaemonIfRequested({\n options,\n paths,\n foregroundRequested,\n explicitDaemon,\n dependencies: {\n readPidFile: dependencies.readPidFile,\n writePidFile: dependencies.writePidFile,\n isProcessAlive: dependencies.isProcessAlive,\n cliInfo: dependencies.cliInfo,\n cliSuccess: dependencies.cliSuccess,\n },\n })\n if (daemonResult.started) return\n\n dependencies.cliInfo('Starting gateway...', options)\n dependencies.runtimeState.currentRuntimeOptions = options\n let config: GatewayConfig\n try {\n config = await dependencies.loadConfig(options)\n } catch (error) {\n const details = error instanceof Error ? error.message : String(error)\n throw new GatewayCliError(\n 'Gateway config not found. Run \"pair\" first or set --config-path / PANORAMA_GATEWAY_CONFIG_PATH.',\n details\n )\n }\n\n const env = dependencies.env ?? process.env\n const resolvedSupabaseConfig = resolveSupabaseConfig({\n cliSupabaseUrl: getStringOption(options, 'supabase-url'),\n cliAnonKey: getStringOption(options, 'anon-key'),\n configSupabaseUrl: config.supabaseUrl,\n configAnonKey: config.supabaseAnonKey,\n env,\n })\n\n if (resolvedSupabaseConfig.missingFields.length > 0) {\n const { message, details } = buildMissingSupabaseConfigError(\n 'start',\n resolvedSupabaseConfig.missingFields,\n {\n configPath: paths.configPath,\n }\n )\n throw new GatewayCliError(message, details)\n }\n\n const { supabaseUrl, supabaseAnonKey } = resolvedSupabaseConfig\n const deviceName =\n getStringOption(options, 'device-name') ||\n config.deviceName ||\n env.PANORAMA_GATEWAY_DEVICE_NAME ||\n (dependencies.hostname ?? os.hostname)()\n\n config = {\n ...config,\n supabaseUrl,\n supabaseAnonKey,\n deviceName,\n }\n\n await dependencies.saveConfig(config, options)\n dependencies.runtimeState.currentConfig = config\n dependencies.runtimeState.currentDeviceName = deviceName\n\n const gatewayJobHandlers = dependencies.buildGatewayJobHandlers()\n const startGatewayLocalRuntime =\n dependencies.startGatewayLocalRuntime ?? startGatewayLocalRuntimeBase\n await startGatewayLocalRuntime({\n options,\n config,\n supabaseUrl,\n supabaseAnonKey,\n deviceName,\n runtimeState: dependencies.runtimeState,\n configResolution,\n buildCapabilities: dependencies.buildCapabilities,\n saveConfig: dependencies.saveConfig,\n ensureGatewayTmpDir: dependencies.ensureGatewayTmpDir,\n discoverGatewayCliCommands: dependencies.discoverGatewayCliCommands,\n refreshRuntimeInstallFullControl: dependencies.refreshRuntimeInstallFullControl,\n emitGatewayEvent: dependencies.emitGatewayEvent,\n flushGatewayEvents: dependencies.flushGatewayEvents,\n emitProviderHealthEvents: dependencies.emitProviderHealthEvents,\n sendHeartbeat: dependencies.sendHeartbeat,\n writePidFile: dependencies.writePidFile,\n removePidFile: dependencies.removePidFile,\n claimJob: gatewayJobHandlers.claimJob,\n processJob: gatewayJobHandlers.processJob,\n handleSubagentCancelJob: gatewayJobHandlers.handleSubagentCancelJob,\n completeJob: gatewayJobHandlers.completeJob,\n failSubagentRun: gatewayJobHandlers.failSubagentRun,\n getNextSubagentRunEventSequence: dependencies.getNextSubagentRunEventSequence,\n insertSubagentRunEvent: dependencies.insertSubagentRunEvent,\n requestChildTermination: dependencies.requestChildTermination,\n logInfo: dependencies.logInfo,\n logError: dependencies.logError,\n cliInfo: dependencies.cliInfo,\n cliSuccess: dependencies.cliSuccess,\n })\n}\n", "import { spawn, type ChildProcess, type SpawnOptions } from 'node:child_process'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { getStringOption, type ParsedArgs } from './cli-args.js'\nimport { buildGatewayEnvOverrides } from './cli-env.js'\nimport { formatPathForDisplay, type CliDetail } from './cli-output.js'\nimport type { GatewayPaths } from './gateway-state.js'\nimport {\n ensureOwnerOnlyDirectory,\n ensureOwnerOnlyFile,\n shouldEnforceOwnerOnlyPermissions,\n} from './local-security.js'\n\ntype CliReporter = (\n message: string,\n options?: ParsedArgs['options'],\n details?: CliDetail[]\n) => void\n\ntype SpawnProcess = (command: string, args: string[], options: SpawnOptions) => ChildProcess\n\ninterface GatewayDaemonDependencies {\n readPidFile: (options?: ParsedArgs['options']) => number | null\n writePidFile: (pid: number, options?: ParsedArgs['options']) => Promise<void>\n isProcessAlive: (pid: number) => boolean\n cliInfo: CliReporter\n cliSuccess: CliReporter\n spawnProcess?: SpawnProcess\n openLogFile?: typeof fs.open\n ensureOwnerOnlyDirectory?: typeof ensureOwnerOnlyDirectory\n ensureOwnerOnlyFile?: typeof ensureOwnerOnlyFile\n shouldEnforceOwnerOnlyPermissions?: typeof shouldEnforceOwnerOnlyPermissions\n buildGatewayEnvOverrides?: typeof buildGatewayEnvOverrides\n formatPathForDisplay?: typeof formatPathForDisplay\n entryPath?: string\n execPath?: string\n env?: NodeJS.ProcessEnv\n}\n\ninterface StartGatewayDaemonParams {\n options: ParsedArgs['options']\n paths: GatewayPaths\n foregroundRequested: boolean\n explicitDaemon: boolean\n dependencies: GatewayDaemonDependencies\n}\n\nexport type StartGatewayDaemonResult = { started: true } | { started: false }\n\nexport async function startGatewayDaemonIfRequested(\n params: StartGatewayDaemonParams\n): Promise<StartGatewayDaemonResult> {\n if (params.foregroundRequested) {\n return { started: false }\n }\n\n const {\n readPidFile,\n writePidFile,\n isProcessAlive,\n cliInfo,\n cliSuccess,\n spawnProcess = spawn,\n openLogFile = fs.open,\n env = process.env,\n } = params.dependencies\n const secureDirectory =\n params.dependencies.ensureOwnerOnlyDirectory ?? ensureOwnerOnlyDirectory\n const secureFile = params.dependencies.ensureOwnerOnlyFile ?? ensureOwnerOnlyFile\n const enforceOwnerOnlyPermissions =\n params.dependencies.shouldEnforceOwnerOnlyPermissions ?? shouldEnforceOwnerOnlyPermissions\n const buildEnvOverrides =\n params.dependencies.buildGatewayEnvOverrides ?? buildGatewayEnvOverrides\n const displayPath = params.dependencies.formatPathForDisplay ?? formatPathForDisplay\n\n const existingPid = readPidFile(params.options)\n if (existingPid && isProcessAlive(existingPid)) {\n cliInfo('Gateway already running', params.options, [\n { label: 'PID', value: existingPid, verboseOnly: true },\n ])\n return { started: true }\n }\n\n const entryPath = params.dependencies.entryPath ?? process.argv[1] ?? ''\n if (entryPath.endsWith('.ts')) {\n if (!params.explicitDaemon) {\n cliInfo('Gateway running in foreground (dev mode detected)', params.options)\n return { started: false }\n }\n throw new Error('Daemon mode requires the built gateway. Run \"pnpm gateway:start -- --daemon\".')\n }\n\n await secureDirectory(path.dirname(params.paths.logPath))\n await secureFile(params.paths.logPath)\n const logHandle = await openLogFile(\n params.paths.logPath,\n 'a',\n enforceOwnerOnlyPermissions() ? 0o600 : undefined\n )\n await secureFile(params.paths.logPath)\n\n const childArgs = [entryPath, 'start', '--foreground']\n const deviceName =\n getStringOption(params.options, 'device-name') || env.PANORAMA_GATEWAY_DEVICE_NAME\n if (deviceName) {\n childArgs.push('--device-name', deviceName)\n }\n\n let child: ChildProcess\n try {\n child = spawnProcess(params.dependencies.execPath ?? process.execPath, childArgs, {\n detached: true,\n stdio: ['ignore', logHandle.fd, logHandle.fd],\n env: {\n ...env,\n ...buildEnvOverrides(params.options),\n },\n })\n\n child.unref()\n } finally {\n await logHandle.close()\n }\n if (!child.pid) {\n throw new Error('Failed to determine gateway process id')\n }\n\n await writePidFile(child.pid, params.options)\n cliSuccess('Gateway started', params.options, [\n { label: 'Logs', value: displayPath(params.paths.logPath) },\n { label: 'PID', value: child.pid, verboseOnly: true },\n { label: 'Config', value: displayPath(params.paths.configPath), verboseOnly: true },\n ])\n return { started: true }\n}\n", "import type { GatewayCapabilitiesV1 } from '@panorama/shared/gateway/capabilities'\nimport process from 'node:process'\nimport type { ParsedArgs } from './cli-args.js'\nimport { GatewayCliError } from './cli-output.js'\nimport type {\n GatewayProviderCapabilities,\n GatewayProviderHealth,\n GatewayProviderId,\n} from './cli-providers/types.js'\nimport { computeGatewayOperationalStatus } from './gateway-operational-status.js'\nimport {\n formatProviderLabel,\n formatProviderProgressLine,\n} from './gateway-provider-health.js'\nimport type { GatewayProviderCapabilityProgressEvent } from './gateway-provider-capabilities.js'\nimport { GatewayJobController } from './gateway-job-controller.js'\nimport type {\n GatewayJobRow,\n GatewayJobStatus,\n} from './gateway-jobs.js'\nimport type {\n GatewayActiveWorkRegistries,\n GatewayChildTerminator,\n} from './gateway-lifecycle.js'\nimport type { GatewayRuntimeState } from './gateway-runtime-state.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport type { GatewaySubagentRunEventInsert } from './gateway-subagent-run-types.js'\nimport { createLocalHeartbeatSupervisor } from './local-runtime/heartbeat-supervisor.js'\nimport { createGatewayRestartSupervisor, type GatewayRestartSupervisor } from './local-runtime/restart-supervisor.js'\nimport {\n createGatewaySupabaseClient,\n DEFAULT_HEARTBEAT_INTERVAL_MS,\n DEFAULT_JOB_CHANNEL_RECONNECT_MS,\n DEFAULT_JOB_RECONCILE_INTERVAL_MS,\n isGatewayDevRuntimeModule,\n readCurrentModulePath,\n resolveGatewayConcurrency,\n} from './local-runtime/runtime-utils.js'\nimport { createGatewayShutdownCoordinator, type GatewayShutdownCoordinator } from './local-runtime/shutdown-supervisor.js'\nimport type {\n CliReporter,\n GatewayLocalRuntimeConfigResolution,\n GatewayLocalRuntimeEventPayload,\n GatewayStatus,\n GatewaySupabaseClient,\n SpawnProcess,\n} from './local-runtime/types.js'\n\nexport {\n isGatewayDevRuntimeModule,\n resolveGatewayConcurrency,\n} from './local-runtime/runtime-utils.js'\nexport type {\n GatewayLocalRuntimeConfigResolution,\n GatewayLocalRuntimeEventPayload,\n} from './local-runtime/types.js'\n\nexport interface StartGatewayLocalRuntimeParams {\n options: ParsedArgs['options']\n config: GatewayConfig\n supabaseUrl: string\n supabaseAnonKey: string\n deviceName: string\n runtimeState: GatewayRuntimeState<GatewayLocalRuntimeEventPayload>\n configResolution?: GatewayLocalRuntimeConfigResolution\n buildCapabilities: (params?: {\n validationMode?: 'full' | 'light' | 'auto'\n previousHealth?: Partial<Record<GatewayProviderId, GatewayProviderHealth>>\n deviceName?: string | null\n installFullControlEnabled?: boolean\n onProgress?: (event: GatewayProviderCapabilityProgressEvent) => void\n }) => Promise<{\n capabilities: GatewayCapabilitiesV1\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>\n anyProviderReady: boolean\n }>\n saveConfig: (config: GatewayConfig, options?: ParsedArgs['options']) => Promise<void>\n ensureGatewayTmpDir: () => Promise<void>\n discoverGatewayCliCommands: (options?: ParsedArgs['options']) => Promise<void>\n refreshRuntimeInstallFullControl: (config: GatewayConfig) => Promise<boolean>\n emitGatewayEvent: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n payload: GatewayLocalRuntimeEventPayload\n ) => Promise<void>\n flushGatewayEvents: (supabase: GatewaySupabaseClient, config: GatewayConfig) => Promise<void>\n emitProviderHealthEvents: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>,\n context: string\n ) => Promise<void>\n sendHeartbeat: (\n supabase: GatewaySupabaseClient,\n status: GatewayStatus,\n capabilities: GatewayCapabilitiesV1,\n deviceName?: string | null\n ) => Promise<void>\n writePidFile: (pid: number, options?: ParsedArgs['options']) => Promise<void>\n removePidFile: (options?: ParsedArgs['options']) => Promise<void>\n claimJob: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ) => Promise<GatewayJobRow | null>\n processJob: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ) => Promise<void>\n handleSubagentCancelJob: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ) => Promise<{ ok: boolean; result: Record<string, unknown>; error?: string }>\n completeJob: (\n supabase: GatewaySupabaseClient,\n jobId: string,\n status: GatewayJobStatus,\n result: Record<string, unknown> | null,\n errorMessage?: string\n ) => Promise<void>\n failSubagentRun: (\n supabase: GatewaySupabaseClient,\n job: GatewayJobRow,\n errorMessage: string\n ) => Promise<void>\n getNextSubagentRunEventSequence: (\n supabase: GatewaySupabaseClient,\n runId: string\n ) => Promise<number>\n insertSubagentRunEvent: (params: GatewaySubagentRunEventInsert) => Promise<number | null>\n requestChildTermination: GatewayChildTerminator\n logInfo: (message: string, data?: Record<string, unknown>) => void\n logError: (message: string, data?: Record<string, unknown>) => void\n cliInfo: CliReporter\n cliSuccess: CliReporter\n env?: NodeJS.ProcessEnv\n entryPath?: string\n modulePath?: string\n processArgs?: string[]\n execPath?: string\n spawnProcess?: SpawnProcess\n exitProcess?: (code: number) => void\n registerSignalHandlers?: boolean\n}\n\nexport async function startGatewayLocalRuntime(\n params: StartGatewayLocalRuntimeParams\n): Promise<void> {\n const {\n options,\n config,\n supabaseUrl,\n supabaseAnonKey,\n deviceName,\n runtimeState,\n configResolution,\n buildCapabilities,\n saveConfig,\n ensureGatewayTmpDir,\n discoverGatewayCliCommands,\n refreshRuntimeInstallFullControl,\n emitGatewayEvent,\n flushGatewayEvents,\n emitProviderHealthEvents,\n sendHeartbeat,\n writePidFile,\n removePidFile,\n claimJob,\n processJob,\n handleSubagentCancelJob,\n completeJob,\n failSubagentRun,\n getNextSubagentRunEventSequence,\n insertSubagentRunEvent,\n requestChildTermination,\n logInfo,\n logError,\n cliInfo,\n cliSuccess,\n env = process.env,\n entryPath = process.argv[1] || '',\n modulePath = readCurrentModulePath(),\n processArgs = process.argv.slice(1),\n execPath = process.execPath,\n spawnProcess,\n exitProcess = (code) => process.exit(code),\n registerSignalHandlers = true,\n } = params\n\n const supabase = createGatewaySupabaseClient({ supabaseUrl, supabaseAnonKey })\n\n const { data: sessionData, error: sessionError } = await supabase.auth.setSession({\n access_token: config.accessToken,\n refresh_token: config.refreshToken,\n })\n\n if (sessionError || !sessionData?.session) {\n const details = sessionError?.message || 'No session returned'\n throw new GatewayCliError('Failed to authenticate gateway session.', details)\n }\n\n config.accessToken = sessionData.session.access_token\n config.refreshToken = sessionData.session.refresh_token\n await saveConfig(config, options)\n\n supabase.auth.onAuthStateChange((event, session) => {\n if (!session) return\n if (event === 'TOKEN_REFRESHED' || event === 'SIGNED_IN') {\n config.accessToken = session.access_token\n config.refreshToken = session.refresh_token\n void saveConfig(config, options)\n .then(() => logInfo('Gateway session refreshed'))\n .catch((error) => {\n logError('Failed to persist refreshed gateway session', {\n error: error instanceof Error ? error.message : String(error),\n })\n })\n }\n })\n\n await ensureGatewayTmpDir()\n await discoverGatewayCliCommands(options)\n\n cliInfo('Validating providers...', options)\n const { capabilities: initialCapabilities, providerHealth } = await buildCapabilities({\n validationMode: 'auto',\n previousHealth: config.providerHealth,\n deviceName,\n installFullControlEnabled: config.full_control_enabled,\n onProgress: (event) => {\n if (event.stage === 'start') {\n cliInfo(` ${formatProviderLabel(event.providerId)}...`, options)\n return\n }\n cliInfo(` ${formatProviderProgressLine(event)}`, options)\n },\n })\n config.providerHealth = providerHealth\n if (Object.values(providerHealth).some((health) => health.check_type === 'full')) {\n await saveConfig(config, options)\n }\n\n runtimeState.currentCapabilities = initialCapabilities\n runtimeState.currentProviderHealth = providerHealth\n runtimeState.currentJobIngressState = {\n pending: true,\n ready: false,\n }\n\n const providerStatus = initialCapabilities.providers as Record<string, GatewayProviderCapabilities>\n const getCurrentCapabilities = (): GatewayCapabilitiesV1 => {\n return runtimeState.currentCapabilities ?? initialCapabilities\n }\n const initialStatus = computeGatewayOperationalStatus({\n capabilities: getCurrentCapabilities(),\n jobIngressState: runtimeState.currentJobIngressState,\n acceptingJobs: runtimeState.currentAcceptingJobs,\n })\n\n const gatewayConcurrency = resolveGatewayConcurrency(env)\n logInfo('Gateway capabilities loaded', {\n providers: Object.fromEntries(\n Object.entries(providerStatus).map(([id, entry]) => [\n id,\n {\n available: entry.available,\n version: entry.version ?? null,\n health: entry.health?.status ?? 'unknown',\n },\n ])\n ),\n concurrency: gatewayConcurrency,\n })\n\n if (configResolution?.migratedFrom) {\n await emitGatewayEvent(supabase, config, {\n level: 'warn',\n code: 'config_dir_fallback',\n message: 'Gateway config directory was not writable; using fallback location.',\n details: {\n previous: configResolution.migratedFrom,\n current: configResolution.configDir,\n },\n })\n }\n\n await flushGatewayEvents(supabase, config)\n\n const ranFullValidation = Object.values(providerHealth).some(\n (health) => health.check_type === 'full'\n )\n if (ranFullValidation) {\n await emitProviderHealthEvents(supabase, config, providerHealth, 'startup')\n }\n\n const heartbeatSupervisor = createLocalHeartbeatSupervisor({\n supabase,\n config,\n runtimeState,\n deviceName,\n initialCapabilities,\n initialProviderHealth: providerHealth,\n initialStatus,\n buildCapabilities,\n refreshRuntimeInstallFullControl,\n sendHeartbeat,\n logInfo,\n logError,\n })\n await heartbeatSupervisor.sendCurrentHeartbeat()\n await writePidFile(process.pid, options)\n heartbeatSupervisor.start()\n\n runtimeState.currentAcceptingJobs = true\n const activeWorkRegistries: GatewayActiveWorkRegistries = {\n activeSubagentRuns: runtimeState.activeSubagentRuns,\n activeModelRuns: runtimeState.activeModelRuns,\n activeShellExecRuns: runtimeState.activeShellExecRuns,\n }\n\n let restartSupervisor: GatewayRestartSupervisor | null = null\n let shutdownCoordinator: GatewayShutdownCoordinator | null = null\n const jobController = new GatewayJobController({\n supabase,\n config,\n concurrency: gatewayConcurrency,\n reconcileIntervalMs: DEFAULT_JOB_RECONCILE_INTERVAL_MS,\n channelReconnectMs: DEFAULT_JOB_CHANNEL_RECONNECT_MS,\n claimJob: (job) => claimJob(supabase, config, job),\n processJob: (job) => processJob(supabase, config, job),\n handleSubagentCancelJob: (job) => handleSubagentCancelJob(supabase, config, job),\n completeJob: (jobId, status, result, errorMessage) =>\n completeJob(supabase, jobId, status, result, errorMessage),\n failSubagentRun: (job, errorMessage) => failSubagentRun(supabase, job, errorMessage),\n onIngressStateChange: (state) => {\n runtimeState.currentJobIngressState = state\n },\n onAcceptingJobsChange: (accepting) => {\n runtimeState.currentAcceptingJobs = accepting\n },\n syncOperationalHeartbeatIfChanged: heartbeatSupervisor.syncOperationalHeartbeatIfChanged,\n onIdle: async () => {\n await restartSupervisor?.maybeRestart()\n },\n logInfo,\n logError,\n })\n\n restartSupervisor = createGatewayRestartSupervisor({\n env,\n entryPath,\n modulePath,\n execPath,\n processArgs,\n jobController,\n activeWorkRegistries,\n spawnProcess,\n exitProcess,\n performShutdown: (signal, mode) =>\n shutdownCoordinator?.performShutdown(signal, mode) ?? Promise.resolve(),\n isShutdownInProgress: () => shutdownCoordinator?.isShutdownInProgress() ?? false,\n syncOperationalHeartbeatIfChanged: heartbeatSupervisor.syncOperationalHeartbeatIfChanged,\n logInfo,\n })\n\n shutdownCoordinator = createGatewayShutdownCoordinator({\n supabase,\n options,\n runtimeState,\n jobController,\n activeWorkRegistries,\n requestChildTermination,\n syncOperationalHeartbeatIfChanged: heartbeatSupervisor.syncOperationalHeartbeatIfChanged,\n stopHeartbeat: heartbeatSupervisor.stop,\n stopRestart: restartSupervisor.stop,\n sendOfflineHeartbeat: heartbeatSupervisor.sendOfflineHeartbeat,\n removePidFile,\n completeJob,\n getNextSubagentRunEventSequence,\n insertSubagentRunEvent,\n logInfo,\n logError,\n exitProcess,\n })\n\n await jobController.start('startup')\n restartSupervisor.start()\n\n if (registerSignalHandlers) {\n process.on('SIGINT', () => void shutdownCoordinator?.shutdown('SIGINT'))\n process.on('SIGTERM', () => void shutdownCoordinator?.shutdown('SIGTERM'))\n }\n\n logInfo('Gateway running', {\n gatewayId: config.gatewayId,\n teamId: config.teamId,\n deviceName,\n installFullControlEnabled: config.full_control_enabled,\n heartbeatIntervalMs: DEFAULT_HEARTBEAT_INTERVAL_MS,\n concurrency: gatewayConcurrency,\n })\n\n cliSuccess('Gateway running', options, [\n { label: 'Mode', value: 'Foreground' },\n { label: 'Device', value: deviceName },\n { label: 'Host machine control', value: config.full_control_enabled ? 'Enabled' : 'Disabled' },\n { label: 'Gateway ID', value: config.gatewayId, verboseOnly: true },\n { label: 'Team ID', value: config.teamId, verboseOnly: true },\n ])\n}\n", "export interface QueueJobLike {\n id: string\n}\n\nexport interface DequeuedGatewayJob<T extends QueueJobLike> {\n job: T\n reservedSubagentId: string | null\n}\n\nexport class GatewayJobQueue<T extends QueueJobLike> {\n private readonly pendingJobs: T[] = []\n private readonly queuedJobIds = new Set<string>()\n private readonly activeJobIds = new Set<string>()\n private readonly reservedSubagentIds = new Set<string>()\n\n constructor(\n private readonly resolveSubagentId: (job: T) => string | null\n ) {}\n\n enqueue(job: T): boolean {\n if (this.queuedJobIds.has(job.id) || this.activeJobIds.has(job.id)) {\n return false\n }\n\n this.pendingJobs.push(job)\n this.queuedJobIds.add(job.id)\n return true\n }\n\n takeAvailable(maxActiveJobs: number): DequeuedGatewayJob<T>[] {\n const ready: DequeuedGatewayJob<T>[] = []\n let deferredForReservedSubagent = 0\n\n while (this.activeJobIds.size < maxActiveJobs && this.pendingJobs.length > 0) {\n const nextJob = this.pendingJobs.shift()\n if (!nextJob) break\n\n this.queuedJobIds.delete(nextJob.id)\n const reservedSubagentId = this.resolveSubagentId(nextJob)\n if (reservedSubagentId && this.reservedSubagentIds.has(reservedSubagentId)) {\n this.pendingJobs.push(nextJob)\n this.queuedJobIds.add(nextJob.id)\n deferredForReservedSubagent += 1\n if (deferredForReservedSubagent >= this.pendingJobs.length) {\n break\n }\n continue\n }\n\n deferredForReservedSubagent = 0\n if (this.activeJobIds.has(nextJob.id)) {\n continue\n }\n\n this.activeJobIds.add(nextJob.id)\n if (reservedSubagentId) {\n this.reservedSubagentIds.add(reservedSubagentId)\n }\n ready.push({ job: nextJob, reservedSubagentId })\n }\n\n return ready\n }\n\n markDone(jobId: string, reservedSubagentId?: string | null): void {\n this.activeJobIds.delete(jobId)\n if (reservedSubagentId) {\n this.reservedSubagentIds.delete(reservedSubagentId)\n }\n }\n\n clearPending(): void {\n this.pendingJobs.length = 0\n this.queuedJobIds.clear()\n }\n\n clearAll(): void {\n this.clearPending()\n this.activeJobIds.clear()\n this.reservedSubagentIds.clear()\n }\n\n activeCount(): number {\n return this.activeJobIds.size\n }\n\n pendingCount(): number {\n return this.pendingJobs.length\n }\n}\n", "import type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from './database.types.js'\nimport type { GatewayJobIngressState } from './gateway-operational-status.js'\nimport {\n isJobTargeted,\n resolveJobSubagentId,\n type GatewayJobRow,\n type GatewayJobStatus,\n} from './gateway-jobs.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport { GatewayJobQueue } from './job-queue.js'\n\ntype GatewaySupabaseClient = SupabaseClient<Database>\ntype GatewayRealtimeChannel = ReturnType<GatewaySupabaseClient['channel']>\n\ntype GatewayJobResult = {\n ok: boolean\n result: Record<string, unknown>\n error?: string\n}\n\nexport interface GatewayJobControllerOptions {\n supabase: GatewaySupabaseClient\n config: GatewayConfig\n concurrency: number\n reconcileIntervalMs: number\n channelReconnectMs: number\n claimJob: (job: GatewayJobRow) => Promise<GatewayJobRow | null>\n processJob: (job: GatewayJobRow) => Promise<void>\n handleSubagentCancelJob: (job: GatewayJobRow) => Promise<GatewayJobResult>\n completeJob: (\n jobId: string,\n status: GatewayJobStatus,\n result: Record<string, unknown> | null,\n errorMessage?: string\n ) => Promise<void>\n failSubagentRun: (job: GatewayJobRow, errorMessage: string) => Promise<void>\n onIngressStateChange: (state: GatewayJobIngressState) => void\n onAcceptingJobsChange: (accepting: boolean) => void\n syncOperationalHeartbeatIfChanged: () => Promise<void>\n onIdle: () => Promise<void>\n logInfo: (message: string, data?: Record<string, unknown>) => void\n logError: (message: string, data?: Record<string, unknown>) => void\n now?: () => number\n}\n\nexport class GatewayJobController {\n private readonly jobQueue = new GatewayJobQueue<GatewayJobRow>(resolveJobSubagentId)\n private readonly activeClaimedJobs = new Map<string, GatewayJobRow>()\n private readonly activeCancelJobs = new Map<string, GatewayJobRow>()\n private readonly retiredChannels = new WeakSet<object>()\n private readonly intentionallyClosingChannels = new WeakSet<object>()\n private readonly now: () => number\n private acceptingJobs = true\n private reconcileInFlight = false\n private shutdownInProgress = false\n private lastJobIngressSuccessAtMs: number | null = null\n private lastJobIngressError: string | null = null\n private reconcileTimer: NodeJS.Timeout | null = null\n private channelReconnectTimer: NodeJS.Timeout | null = null\n private channel: GatewayRealtimeChannel | null = null\n\n constructor(private readonly options: GatewayJobControllerOptions) {\n this.now = options.now ?? Date.now\n this.options.onAcceptingJobsChange(true)\n }\n\n activeQueueCount(): number {\n return this.jobQueue.activeCount() + this.activeCancelJobs.size\n }\n\n activeClaimedJobCount(): number {\n return this.activeClaimedJobs.size + this.activeCancelJobs.size\n }\n\n activeClaimedJobEntries(): Array<[string, GatewayJobRow]> {\n return [\n ...Array.from(this.activeClaimedJobs.entries()),\n ...Array.from(this.activeCancelJobs.entries()),\n ]\n }\n\n clearPending(): void {\n this.jobQueue.clearPending()\n }\n\n stopAcceptingJobs(): void {\n if (!this.acceptingJobs) {\n this.clearPending()\n return\n }\n this.acceptingJobs = false\n this.options.onAcceptingJobsChange(false)\n this.clearPending()\n }\n\n beginShutdown(): boolean {\n if (this.shutdownInProgress) return false\n this.shutdownInProgress = true\n this.stopAcceptingJobs()\n this.clearTimers()\n return true\n }\n\n async disconnect(): Promise<void> {\n if (!this.channel) return\n const channel = this.channel\n this.channel = null\n await this.unsubscribeChannel(channel, 'disconnect')\n }\n\n async start(reason: string): Promise<void> {\n await this.connectJobChannel(reason)\n await this.reconcileQueuedJobs(reason)\n this.reconcileTimer = setInterval(() => {\n void this.reconcileQueuedJobs('interval')\n }, this.options.reconcileIntervalMs)\n }\n\n async reconcileQueuedJobs(reason: string): Promise<void> {\n if (this.reconcileInFlight || this.shutdownInProgress) return\n this.reconcileInFlight = true\n try {\n const { data, error } = await this.options.supabase\n .from('gateway_jobs')\n .select('*')\n .eq('team_id', this.options.config.teamId)\n .eq('status', 'queued')\n .eq('gateway_id', this.options.config.gatewayId)\n .order('created_at', { ascending: true })\n\n if (error) {\n throw error\n }\n\n this.lastJobIngressSuccessAtMs = this.now()\n this.lastJobIngressError = null\n this.updateJobIngressState()\n\n for (const row of data ?? []) {\n this.enqueueJob(row as GatewayJobRow)\n }\n\n await this.options.syncOperationalHeartbeatIfChanged()\n } catch (error) {\n this.lastJobIngressError = error instanceof Error ? error.message : String(error)\n this.updateJobIngressState()\n this.options.logError('Failed to reconcile queued gateway jobs', {\n error: this.lastJobIngressError,\n reason,\n })\n await this.options.syncOperationalHeartbeatIfChanged()\n } finally {\n this.reconcileInFlight = false\n }\n }\n\n enqueueJob(job: GatewayJobRow): void {\n if (this.shutdownInProgress) return\n if (!isJobTargeted(job, this.options.config.gatewayId)) return\n if (job.job_type === 'subagent_cancel') {\n void this.processCancelJob(job)\n return\n }\n if (!this.acceptingJobs) return\n if (this.jobQueue.enqueue(job)) {\n this.processQueue()\n }\n }\n\n private updateJobIngressState(): void {\n const ready =\n this.lastJobIngressSuccessAtMs !== null &&\n this.now() - this.lastJobIngressSuccessAtMs <= this.options.reconcileIntervalMs * 3\n const pending = this.lastJobIngressSuccessAtMs === null && this.lastJobIngressError === null\n this.options.onIngressStateChange({\n pending,\n ready,\n })\n }\n\n private async processCancelJob(job: GatewayJobRow): Promise<void> {\n this.activeCancelJobs.set(job.id, job)\n try {\n const claimed = await this.options.claimJob(job)\n if (!claimed) return\n this.activeCancelJobs.set(job.id, claimed)\n const result = await this.options.handleSubagentCancelJob(claimed)\n if (result.ok) {\n await this.options.completeJob(claimed.id, 'completed', result.result)\n } else {\n await this.options.completeJob(claimed.id, 'failed', result.result, result.error)\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.options.logError('Gateway cancel job processing failed', {\n jobId: job.id,\n error: errorMessage,\n })\n await this.options.completeJob(\n job.id,\n 'failed',\n { message: 'Gateway cancel job processing failed', job_type: job.job_type },\n errorMessage\n )\n } finally {\n this.activeCancelJobs.delete(job.id)\n void this.options.onIdle()\n }\n }\n\n private async processJobWithHandling(\n nextJob: GatewayJobRow,\n reservedSubagentId: string | null\n ): Promise<void> {\n this.activeClaimedJobs.set(nextJob.id, nextJob)\n try {\n await this.options.processJob(nextJob)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.options.logError('Gateway job processing failed', {\n jobId: nextJob.id,\n error: errorMessage,\n })\n await this.options.completeJob(\n nextJob.id,\n 'failed',\n { message: 'Gateway job processing failed', job_type: nextJob.job_type },\n errorMessage\n )\n if (nextJob.job_type === 'subagent_run') {\n await this.options.failSubagentRun(nextJob, errorMessage)\n }\n } finally {\n this.activeClaimedJobs.delete(nextJob.id)\n this.jobQueue.markDone(nextJob.id, reservedSubagentId)\n this.processQueue()\n void this.options.onIdle()\n }\n }\n\n private processQueue(): void {\n if (!this.acceptingJobs) return\n const readyJobs = this.jobQueue.takeAvailable(this.options.concurrency)\n for (const nextJob of readyJobs) {\n void this.processJobWithHandling(nextJob.job, nextJob.reservedSubagentId)\n }\n }\n\n private scheduleChannelReconnect(reason: string): void {\n if (this.shutdownInProgress || this.channelReconnectTimer) return\n this.channelReconnectTimer = setTimeout(() => {\n this.channelReconnectTimer = null\n void this.connectJobChannel(`reconnect:${reason}`)\n }, this.options.channelReconnectMs)\n }\n\n private async connectJobChannel(reason: string): Promise<void> {\n if (this.shutdownInProgress) return\n if (this.channel) {\n await this.unsubscribeChannel(this.channel, 'reconnect')\n }\n\n const channel = this.options.supabase.channel(`gateway_jobs_${this.options.config.gatewayId}`)\n channel\n .on(\n 'postgres_changes',\n {\n event: 'INSERT',\n schema: 'public',\n table: 'gateway_jobs',\n filter: `team_id=eq.${this.options.config.teamId}`,\n },\n (payload) => {\n if (this.retiredChannels.has(channel as object)) return\n const job = payload.new as GatewayJobRow\n if (job.status !== 'queued') return\n this.enqueueJob(job)\n }\n )\n .subscribe((status) => {\n if (this.retiredChannels.has(channel as object)) {\n if (status === 'CLOSED') {\n this.intentionallyClosingChannels.delete(channel as object)\n }\n return\n }\n\n if (status === 'CLOSED' && this.intentionallyClosingChannels.has(channel as object)) {\n this.intentionallyClosingChannels.delete(channel as object)\n return\n }\n\n if (status === 'SUBSCRIBED') {\n this.options.logInfo('Gateway subscribed to job queue', { reason })\n void this.reconcileQueuedJobs(`channel_subscribed:${reason}`)\n return\n }\n\n if (status === 'CHANNEL_ERROR' || status === 'TIMED_OUT' || status === 'CLOSED') {\n this.options.logError('Gateway realtime channel unavailable', { status, reason })\n this.scheduleChannelReconnect(status.toLowerCase())\n }\n })\n this.channel = channel\n }\n\n private async unsubscribeChannel(channel: GatewayRealtimeChannel, context: string): Promise<void> {\n this.retiredChannels.add(channel as object)\n this.intentionallyClosingChannels.add(channel as object)\n try {\n await channel.unsubscribe()\n } catch (error) {\n this.intentionallyClosingChannels.delete(channel as object)\n this.options.logError('Failed to unsubscribe gateway realtime channel', {\n context,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n private clearTimers(): void {\n if (this.reconcileTimer) {\n clearInterval(this.reconcileTimer)\n this.reconcileTimer = null\n }\n if (this.channelReconnectTimer) {\n clearTimeout(this.channelReconnectTimer)\n this.channelReconnectTimer = null\n }\n }\n}\n", "import { createClient } from '@supabase/supabase-js'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { fileURLToPath } from 'node:url'\nimport { parseNumberEnv } from '../cli-env.js'\nimport type { Database } from '../database.types.js'\nimport type { GatewaySupabaseClient } from './types.js'\n\nexport const DEFAULT_HEARTBEAT_INTERVAL_MS = 30_000\nexport const DEFAULT_GATEWAY_CONCURRENCY = 10\nexport const DEFAULT_JOB_RECONCILE_INTERVAL_MS = 5_000\nexport const DEFAULT_JOB_CHANNEL_RECONNECT_MS = 5_000\nexport const DEFAULT_RESTART_CHECK_INTERVAL_MS = 30_000\nexport const SUBAGENT_CANCEL_KILL_TIMEOUT_MS = 5_000\nexport const PROCESS_KILL_GRACE_MS = 2_000\n\nexport function isGatewayDevRuntimeModule(params: {\n entryPath?: string\n modulePath?: string\n}): boolean {\n const entryPath = params.entryPath ?? ''\n const modulePath = params.modulePath ?? ''\n return (\n modulePath.endsWith('.ts') ||\n modulePath.includes(`${path.sep}src${path.sep}`) ||\n entryPath.endsWith('.ts')\n )\n}\n\nexport function readCurrentModulePath(metaUrl: string = import.meta.url): string {\n try {\n return fileURLToPath(metaUrl)\n } catch {\n return ''\n }\n}\n\nexport function resolveGatewayConcurrency(env: NodeJS.ProcessEnv = process.env): number {\n const raw = env.PANORAMA_GATEWAY_CONCURRENCY\n if (!raw) return DEFAULT_GATEWAY_CONCURRENCY\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isFinite(parsed) || parsed <= 0) return DEFAULT_GATEWAY_CONCURRENCY\n return parsed\n}\n\nexport function resolveRestartCheckIntervalMs(env: NodeJS.ProcessEnv): number {\n return Math.max(\n 1000,\n parseNumberEnv(env.PANORAMA_GATEWAY_RESTART_CHECK_MS, DEFAULT_RESTART_CHECK_INTERVAL_MS)\n )\n}\n\nexport function createGatewaySupabaseClient(params: {\n supabaseUrl: string\n supabaseAnonKey: string\n}): GatewaySupabaseClient {\n return createClient<Database>(params.supabaseUrl, params.supabaseAnonKey, {\n auth: {\n persistSession: false,\n autoRefreshToken: true,\n detectSessionInUrl: false,\n },\n realtime: {\n params: {\n eventsPerSecond: 10,\n },\n },\n })\n}\n", "import type { GatewayCapabilitiesV1 } from '@panorama/shared/gateway/capabilities'\nimport { computeGatewayOperationalStatus } from '../gateway-operational-status.js'\nimport type { GatewayProviderCapabilityProgressEvent } from '../gateway-provider-capabilities.js'\nimport type { GatewayProviderHealth, GatewayProviderId } from '../cli-providers/types.js'\nimport type { GatewayRuntimeState } from '../gateway-runtime-state.js'\nimport type { GatewayConfig } from '../gateway-state.js'\nimport {\n DEFAULT_HEARTBEAT_INTERVAL_MS,\n} from './runtime-utils.js'\nimport type {\n GatewayLocalRuntimeEventPayload,\n GatewayStatus,\n GatewaySupabaseClient,\n} from './types.js'\n\nexport interface LocalHeartbeatSupervisor {\n sendCurrentHeartbeat: () => Promise<void>\n syncOperationalHeartbeatIfChanged: () => Promise<void>\n refreshHeartbeat: () => Promise<void>\n start: () => void\n stop: () => void\n sendOfflineHeartbeat: () => Promise<void>\n}\n\nexport function createLocalHeartbeatSupervisor(params: {\n supabase: GatewaySupabaseClient\n config: GatewayConfig\n runtimeState: GatewayRuntimeState<GatewayLocalRuntimeEventPayload>\n deviceName: string\n initialCapabilities: GatewayCapabilitiesV1\n initialProviderHealth: Record<GatewayProviderId, GatewayProviderHealth>\n initialStatus: GatewayStatus\n buildCapabilities: (params?: {\n validationMode?: 'full' | 'light' | 'auto'\n previousHealth?: Partial<Record<GatewayProviderId, GatewayProviderHealth>>\n deviceName?: string | null\n installFullControlEnabled?: boolean\n onProgress?: (event: GatewayProviderCapabilityProgressEvent) => void\n }) => Promise<{\n capabilities: GatewayCapabilitiesV1\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>\n anyProviderReady: boolean\n }>\n refreshRuntimeInstallFullControl: (config: GatewayConfig) => Promise<boolean>\n sendHeartbeat: (\n supabase: GatewaySupabaseClient,\n status: GatewayStatus,\n capabilities: GatewayCapabilitiesV1,\n deviceName?: string | null\n ) => Promise<void>\n logInfo: (message: string, data?: Record<string, unknown>) => void\n logError: (message: string, data?: Record<string, unknown>) => void\n}): LocalHeartbeatSupervisor {\n let currentProviderHealth = params.initialProviderHealth\n let heartbeatStatus = params.initialStatus\n let heartbeatInFlight = false\n let heartbeatTimer: NodeJS.Timeout | null = null\n\n const getCurrentCapabilities = (): GatewayCapabilitiesV1 => {\n return params.runtimeState.currentCapabilities ?? params.initialCapabilities\n }\n\n const sendCurrentHeartbeat = async () => {\n await params.sendHeartbeat(\n params.supabase,\n heartbeatStatus,\n getCurrentCapabilities(),\n params.deviceName\n )\n }\n\n const syncOperationalHeartbeatIfChanged = async () => {\n const capabilities = getCurrentCapabilities()\n const nextStatus = computeGatewayOperationalStatus({\n capabilities,\n jobIngressState: params.runtimeState.currentJobIngressState,\n acceptingJobs: params.runtimeState.currentAcceptingJobs,\n })\n if (nextStatus === heartbeatStatus) return\n heartbeatStatus = nextStatus\n await params.sendHeartbeat(params.supabase, heartbeatStatus, capabilities, params.deviceName)\n }\n\n const refreshHeartbeat = async () => {\n if (heartbeatInFlight) return\n heartbeatInFlight = true\n try {\n const installFullControlEnabled = await params.refreshRuntimeInstallFullControl(params.config)\n const { capabilities: nextCapabilities, providerHealth: nextProviderHealth } =\n await params.buildCapabilities({\n validationMode: 'light',\n previousHealth: params.runtimeState.currentProviderHealth ?? currentProviderHealth,\n deviceName: params.deviceName,\n installFullControlEnabled,\n onProgress: (event) => {\n if (event.stage === 'start') return\n params.logInfo('Provider capability refreshed', {\n provider: event.providerId,\n status: event.status,\n duration_ms: event.durationMs,\n error: event.error,\n })\n },\n })\n currentProviderHealth = nextProviderHealth\n params.config.providerHealth = nextProviderHealth\n params.runtimeState.currentCapabilities = nextCapabilities\n params.runtimeState.currentProviderHealth = nextProviderHealth\n heartbeatStatus = computeGatewayOperationalStatus({\n capabilities: nextCapabilities,\n jobIngressState: params.runtimeState.currentJobIngressState,\n acceptingJobs: params.runtimeState.currentAcceptingJobs,\n })\n await params.sendHeartbeat(\n params.supabase,\n heartbeatStatus,\n getCurrentCapabilities(),\n params.deviceName\n )\n } catch (error) {\n heartbeatStatus = 'error'\n params.logError('Failed to refresh gateway capabilities', {\n error: error instanceof Error ? error.message : String(error),\n })\n await params.sendHeartbeat(\n params.supabase,\n heartbeatStatus,\n getCurrentCapabilities(),\n params.deviceName\n )\n } finally {\n heartbeatInFlight = false\n }\n }\n\n const start = () => {\n if (heartbeatTimer) return\n heartbeatTimer = setInterval(() => {\n void refreshHeartbeat()\n }, DEFAULT_HEARTBEAT_INTERVAL_MS)\n }\n\n const stop = () => {\n if (!heartbeatTimer) return\n clearInterval(heartbeatTimer)\n heartbeatTimer = null\n }\n\n const sendOfflineHeartbeat = async () => {\n heartbeatStatus = 'offline'\n await params.sendHeartbeat(\n params.supabase,\n 'offline',\n getCurrentCapabilities(),\n params.deviceName\n )\n }\n\n return {\n sendCurrentHeartbeat,\n syncOperationalHeartbeatIfChanged,\n refreshHeartbeat,\n start,\n stop,\n sendOfflineHeartbeat,\n }\n}\n", "import { spawn } from 'node:child_process'\nimport path from 'node:path'\nimport { parseBooleanEnv, parseNumberEnv } from '../cli-env.js'\nimport {\n getGatewayActiveWorkCounts,\n hasGatewayActiveWork,\n type GatewayActiveWorkRegistries,\n type GatewayShutdownMode,\n} from '../gateway-lifecycle.js'\nimport type { GatewayJobController } from '../gateway-job-controller.js'\nimport {\n readGatewayPackageVersion,\n readRestartProbeFingerprint,\n resolveGatewayPackageJsonPath,\n resolveGatewayRestartProbePath,\n} from '../gateway-restart.js'\nimport {\n isGatewayDevRuntimeModule,\n resolveRestartCheckIntervalMs,\n} from './runtime-utils.js'\nimport type { SpawnProcess } from './types.js'\n\nexport interface GatewayRestartSupervisor {\n maybeRestart: () => Promise<void>\n requestRestart: (reason: string) => void\n start: () => void\n stop: () => void\n}\n\nexport function createGatewayRestartSupervisor(params: {\n env: NodeJS.ProcessEnv\n entryPath: string\n modulePath: string\n execPath: string\n processArgs: string[]\n jobController: GatewayJobController\n activeWorkRegistries: GatewayActiveWorkRegistries\n spawnProcess?: SpawnProcess\n exitProcess: (code: number) => void\n performShutdown: (signal: string, mode?: GatewayShutdownMode) => Promise<void>\n isShutdownInProgress: () => boolean\n syncOperationalHeartbeatIfChanged: () => Promise<void>\n logInfo: (message: string, data?: Record<string, unknown>) => void\n setIntervalFn?: typeof setInterval\n clearIntervalFn?: typeof clearInterval\n}): GatewayRestartSupervisor {\n const spawnProcess = params.spawnProcess ?? spawn\n const setIntervalFn = params.setIntervalFn ?? setInterval\n const clearIntervalFn = params.clearIntervalFn ?? clearInterval\n const isDevModule = isGatewayDevRuntimeModule({\n entryPath: params.entryPath,\n modulePath: params.modulePath,\n })\n const autoRestartEnabled = parseBooleanEnv(\n params.env.PANORAMA_GATEWAY_AUTO_RESTART,\n !isDevModule\n )\n const restartCheckIntervalMs = resolveRestartCheckIntervalMs(params.env)\n const restartMaxWaitMs = Math.max(\n 0,\n parseNumberEnv(params.env.PANORAMA_GATEWAY_RESTART_MAX_WAIT_MS, 0)\n )\n const packageJsonPath = autoRestartEnabled\n ? resolveGatewayPackageJsonPath(params.entryPath, {\n modulePath: params.modulePath,\n env: params.env,\n })\n : null\n const startingVersion = packageJsonPath ? readGatewayPackageVersion(packageJsonPath) : null\n const restartProbePath = autoRestartEnabled\n ? resolveGatewayRestartProbePath(params.entryPath, params.modulePath)\n : null\n const startingProbeFingerprint = restartProbePath\n ? readRestartProbeFingerprint(restartProbePath)\n : null\n const restartCheckEnabled =\n autoRestartEnabled &&\n ((packageJsonPath && startingVersion) || (restartProbePath && startingProbeFingerprint))\n\n let observedVersion = startingVersion\n let observedProbeFingerprint = startingProbeFingerprint\n let restartRequested = false\n let restartDetectedAt: number | null = null\n let restartMaxWaitLogged = false\n let restartTimer: NodeJS.Timeout | null = null\n\n const restartGateway = async (reason: string): Promise<void> => {\n if (params.isShutdownInProgress()) return\n const counts = getGatewayActiveWorkCounts({\n jobController: params.jobController,\n registries: params.activeWorkRegistries,\n })\n if (hasGatewayActiveWork(counts)) {\n params.logInfo('Gateway restart waiting for active work to drain', {\n reason,\n ...counts,\n })\n return\n }\n\n params.logInfo('Gateway restarting', {\n reason,\n active_jobs: params.jobController.activeQueueCount(),\n active_subagent_runs: params.activeWorkRegistries.activeSubagentRuns.size,\n active_model_runs: params.activeWorkRegistries.activeModelRuns.size,\n active_shell_execs: params.activeWorkRegistries.activeShellExecRuns.size,\n })\n const child = spawnProcess(params.execPath, params.processArgs, {\n stdio: 'inherit',\n env: { ...params.env },\n })\n if (child.pid) {\n params.logInfo('Gateway replacement spawned', { pid: child.pid })\n }\n child.unref()\n await params.performShutdown(`restart:${reason}`, 'drain')\n params.exitProcess(0)\n }\n\n const maybeRestart = async () => {\n if (!restartRequested) return\n const counts = getGatewayActiveWorkCounts({\n jobController: params.jobController,\n registries: params.activeWorkRegistries,\n })\n if (hasGatewayActiveWork(counts)) {\n return\n }\n await restartGateway('all jobs complete')\n }\n\n const requestRestart = (reason: string) => {\n if (restartRequested) return\n restartRequested = true\n restartDetectedAt = Date.now()\n params.jobController.stopAcceptingJobs()\n params.logInfo('Gateway update detected; draining before restart', {\n reason,\n active_jobs: params.jobController.activeQueueCount(),\n active_subagent_runs: params.activeWorkRegistries.activeSubagentRuns.size,\n active_model_runs: params.activeWorkRegistries.activeModelRuns.size,\n active_shell_execs: params.activeWorkRegistries.activeShellExecRuns.size,\n })\n void params.syncOperationalHeartbeatIfChanged()\n void maybeRestart()\n }\n\n const checkForUpgrade = () => {\n if (!autoRestartEnabled || restartRequested) return\n if (packageJsonPath && observedVersion) {\n const nextVersion = readGatewayPackageVersion(packageJsonPath)\n if (!nextVersion) return\n if (nextVersion !== observedVersion) {\n requestRestart(`gateway version changed (${observedVersion} -> ${nextVersion})`)\n }\n return\n }\n if (restartProbePath && observedProbeFingerprint) {\n const nextFingerprint = readRestartProbeFingerprint(restartProbePath)\n if (!nextFingerprint) return\n if (nextFingerprint !== observedProbeFingerprint) {\n requestRestart(`gateway entry changed (${path.basename(restartProbePath)})`)\n }\n }\n }\n\n const start = () => {\n if (restartTimer) return\n if (restartCheckEnabled) {\n if (!packageJsonPath && restartProbePath && startingProbeFingerprint) {\n params.logInfo('Gateway auto-restart using entrypoint fingerprint', {\n path: restartProbePath,\n })\n }\n restartTimer = setIntervalFn(() => {\n checkForUpgrade()\n if (restartRequested && restartDetectedAt && restartMaxWaitMs > 0) {\n const elapsedMs = Date.now() - restartDetectedAt\n if (elapsedMs >= restartMaxWaitMs) {\n void maybeRestart()\n if (!restartMaxWaitLogged) {\n restartMaxWaitLogged = true\n const counts = getGatewayActiveWorkCounts({\n jobController: params.jobController,\n registries: params.activeWorkRegistries,\n })\n params.logInfo('Gateway restart max wait reached; continuing to drain active work', {\n wait_ms: elapsedMs,\n ...counts,\n })\n }\n }\n }\n }, restartCheckIntervalMs)\n } else if (autoRestartEnabled) {\n params.logInfo('Gateway auto-restart disabled (package.json not found)', {\n entryPath: params.entryPath,\n })\n }\n }\n\n const stop = () => {\n if (!restartTimer) return\n clearIntervalFn(restartTimer)\n restartTimer = null\n }\n\n return {\n maybeRestart,\n requestRestart,\n start,\n stop,\n }\n}\n", "import type { ChildProcess } from 'node:child_process'\nimport type { GatewayJobController } from './gateway-job-controller.js'\nimport type { ActiveSubagentRun } from './gateway-runtime-state.js'\nimport type { ActiveModelRun } from './gateway-model-run.js'\nimport type { ActiveShellExecRun } from './gateway-shell-exec.js'\n\nexport type GatewayShutdownMode = 'drain' | 'terminate'\n\nexport interface GatewayActiveWorkRegistries {\n activeSubagentRuns: Map<string, ActiveSubagentRun>\n activeModelRuns: Map<string, ActiveModelRun>\n activeShellExecRuns: Map<string, ActiveShellExecRun>\n}\n\nexport interface GatewayActiveWorkCounts {\n activeClaimedJobs: number\n activeSubagentRuns: number\n activeModelRuns: number\n activeShellExecs: number\n}\n\nexport type GatewayChildTerminator = (\n child: ChildProcess | undefined,\n options: { reason: string; graceMs: number; context: string }\n) => void\n\nexport function getGatewayActiveWorkCounts(params: {\n jobController: Pick<GatewayJobController, 'activeClaimedJobCount'>\n registries: GatewayActiveWorkRegistries\n}): GatewayActiveWorkCounts {\n return {\n activeClaimedJobs: params.jobController.activeClaimedJobCount(),\n activeSubagentRuns: params.registries.activeSubagentRuns.size,\n activeModelRuns: params.registries.activeModelRuns.size,\n activeShellExecs: params.registries.activeShellExecRuns.size,\n }\n}\n\nexport function hasGatewayActiveWork(counts: GatewayActiveWorkCounts): boolean {\n return (\n counts.activeClaimedJobs > 0 ||\n counts.activeSubagentRuns > 0 ||\n counts.activeModelRuns > 0 ||\n counts.activeShellExecs > 0\n )\n}\n\nexport function requestGatewayActiveWorkShutdown(params: {\n mode: GatewayShutdownMode\n reason: string\n registries: GatewayActiveWorkRegistries\n terminateChild: GatewayChildTerminator\n subagentGraceMs: number\n processGraceMs: number\n}): void {\n if (params.mode === 'drain') {\n return\n }\n\n const { reason, registries, terminateChild, subagentGraceMs, processGraceMs } = params\n\n for (const activeRun of registries.activeSubagentRuns.values()) {\n activeRun.cancelled = true\n activeRun.cancelReason = reason\n terminateChild(activeRun.child, {\n reason,\n graceMs: subagentGraceMs,\n context: 'gateway_shutdown_subagent',\n })\n }\n\n for (const activeModelRun of registries.activeModelRuns.values()) {\n activeModelRun.shutdownRequested = true\n activeModelRun.shutdownReason = reason\n terminateChild(activeModelRun.child, {\n reason,\n graceMs: processGraceMs,\n context: 'gateway_shutdown_model_run',\n })\n }\n\n for (const activeExecRun of registries.activeShellExecRuns.values()) {\n activeExecRun.shutdownRequested = true\n activeExecRun.shutdownReason = reason\n terminateChild(activeExecRun.child, {\n reason,\n graceMs: processGraceMs,\n context: 'gateway_shutdown_shell_exec',\n })\n }\n}\n\nexport async function waitForGatewayActiveWorkToDrain(params: {\n jobController: Pick<GatewayJobController, 'activeClaimedJobCount'>\n registries: GatewayActiveWorkRegistries\n sleep: (ms: number) => Promise<void>\n pollIntervalMs?: number\n shouldContinue?: () => boolean\n}): Promise<void> {\n const pollIntervalMs = params.pollIntervalMs ?? 100\n const shouldContinue = params.shouldContinue ?? (() => true)\n\n while (shouldContinue()) {\n const counts = getGatewayActiveWorkCounts({\n jobController: params.jobController,\n registries: params.registries,\n })\n if (!hasGatewayActiveWork(counts)) {\n return\n }\n await params.sleep(pollIntervalMs)\n }\n}\n", "import fsSync from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst GATEWAY_PACKAGE_NAME = '@panorama-ai/gateway'\n\nfunction readCurrentModulePath(): string {\n try {\n return fileURLToPath(import.meta.url)\n } catch {\n return ''\n }\n}\n\nfunction isGatewayPackageJson(candidatePath: string): boolean {\n try {\n const pkg = JSON.parse(fsSync.readFileSync(candidatePath, 'utf8')) as { name?: string }\n return pkg.name === GATEWAY_PACKAGE_NAME\n } catch {\n return false\n }\n}\n\nfunction findGatewayPackageJsonFrom(startDir: string): string | null {\n let current = startDir\n while (true) {\n const candidate = path.join(current, 'package.json')\n if (fsSync.existsSync(candidate) && isGatewayPackageJson(candidate)) {\n return candidate\n }\n const parent = path.dirname(current)\n if (parent === current) return null\n current = parent\n }\n}\n\nexport function resolveGatewayPackageJsonPath(\n entryPath: string,\n params: {\n modulePath?: string\n env?: NodeJS.ProcessEnv\n } = {}\n): string | null {\n const candidates = new Set<string>()\n const env = params.env ?? process.env\n const envOverride = env.PANORAMA_GATEWAY_PACKAGE_JSON\n if (envOverride && envOverride.trim().length > 0) {\n candidates.add(envOverride.trim())\n }\n if (entryPath) {\n candidates.add(entryPath)\n try {\n candidates.add(fsSync.realpathSync(entryPath))\n } catch {\n // ignore realpath errors\n }\n }\n\n const modulePath = params.modulePath ?? readCurrentModulePath()\n if (modulePath) {\n candidates.add(modulePath)\n }\n\n for (const candidate of candidates) {\n const resolved = path.resolve(candidate)\n if (resolved.endsWith(`${path.sep}package.json`)) {\n if (fsSync.existsSync(resolved) && isGatewayPackageJson(resolved)) {\n return resolved\n }\n const fallback = findGatewayPackageJsonFrom(path.dirname(resolved))\n if (fallback) return fallback\n continue\n }\n\n let startDir = resolved\n try {\n if (!fsSync.statSync(resolved).isDirectory()) {\n startDir = path.dirname(resolved)\n }\n } catch {\n startDir = path.dirname(resolved)\n }\n\n const found = findGatewayPackageJsonFrom(startDir)\n if (found) return found\n }\n\n return null\n}\n\nexport function resolveGatewayRestartProbePath(\n entryPath: string,\n modulePath: string\n): string | null {\n const candidates = [entryPath, modulePath]\n for (const candidate of candidates) {\n if (!candidate) continue\n try {\n const resolved = path.resolve(candidate)\n if (fsSync.existsSync(resolved)) {\n return resolved\n }\n } catch {\n // ignore resolution errors\n }\n try {\n const realpath = fsSync.realpathSync(candidate)\n if (fsSync.existsSync(realpath)) {\n return realpath\n }\n } catch {\n // ignore realpath errors\n }\n }\n return null\n}\n\nexport function readRestartProbeFingerprint(filePath: string): string | null {\n try {\n const stat = fsSync.statSync(filePath)\n if (!stat.isFile()) return null\n return `${Math.round(stat.mtimeMs)}:${stat.size}`\n } catch {\n return null\n }\n}\n\nexport function readGatewayPackageVersion(packageJsonPath: string): string | null {\n try {\n const pkg = JSON.parse(fsSync.readFileSync(packageJsonPath, 'utf8')) as { version?: string }\n return typeof pkg.version === 'string' && pkg.version.trim().length > 0\n ? pkg.version.trim()\n : null\n } catch {\n return null\n }\n}\n", "import {\n buildRequestedCancelMetadata,\n} from '@panorama/shared/subagents/cancel-orchestrator'\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from './database.types.js'\nimport { asJson } from './gateway-run-helpers.js'\nimport {\n buildErrorOutput,\n mergeMetadata,\n} from './subagent-run-helpers.js'\n\nexport interface SubagentShutdownRunEventInsert {\n supabase: SupabaseClient<Database>\n runId: string\n subagentId: string\n teamId: string\n gatewayId: string | null\n sequence: number\n eventType: string\n payload: Record<string, unknown>\n}\n\nexport async function cancelSubagentRunOnGatewayShutdown(params: {\n supabase: SupabaseClient<Database>\n subagentId: string\n runId: string\n reason: string\n getNextSubagentRunEventSequence: (\n supabase: SupabaseClient<Database>,\n runId: string\n ) => Promise<number>\n insertSubagentRunEvent: (params: SubagentShutdownRunEventInsert) => Promise<number | null>\n logError: (message: string, data?: Record<string, unknown>) => void\n}): Promise<void> {\n const {\n supabase,\n subagentId,\n runId,\n reason,\n getNextSubagentRunEventSequence,\n insertSubagentRunEvent,\n logError,\n } = params\n const nowIso = new Date().toISOString()\n const cancelledOutput = buildErrorOutput(reason)\n const { data: subagentRow, error: subagentLoadError } = await supabase\n .from('subagents')\n .select('team_id, gateway_id, metadata')\n .eq('id', subagentId)\n .maybeSingle()\n\n if (subagentLoadError) {\n logError('Failed to load subagent during shutdown cancellation', {\n subagentId,\n runId,\n error: subagentLoadError.message,\n })\n return\n }\n\n const { data: runRow, error: runLoadError } = await supabase\n .from('subagent_runs')\n .select('team_id, gateway_id, metadata')\n .eq('id', runId)\n .maybeSingle()\n\n if (runLoadError) {\n logError('Failed to load subagent run during shutdown cancellation', {\n subagentId,\n runId,\n error: runLoadError.message,\n })\n return\n }\n\n const updatedRunMetadata = {\n ...buildRequestedCancelMetadata({\n base: (runRow?.metadata ?? {}) as Record<string, unknown>,\n run_id: runId,\n reason,\n requested_at: nowIso,\n cancel_support: 'gateway',\n cancellation_scope: 'gateway',\n }),\n cancel_state: 'acknowledged',\n cancelled: true,\n last_run_at: nowIso,\n }\n\n const { data: updatedRun, error: runUpdateError } = await supabase\n .from('subagent_runs')\n .update({\n status: 'cancelled',\n output: asJson(cancelledOutput),\n error: reason,\n completed_at: nowIso,\n metadata: asJson(updatedRunMetadata),\n })\n .eq('id', runId)\n .eq('status', 'running')\n .select('id')\n .maybeSingle()\n\n if (runUpdateError) {\n logError('Failed to cancel subagent run during shutdown', {\n subagentId,\n runId,\n error: runUpdateError.message,\n })\n }\n\n const updatedSubagentMetadata = mergeMetadata(\n (subagentRow?.metadata ?? {}) as Record<string, unknown>,\n {\n cancel_run_id: runId,\n cancel_requested_at: nowIso,\n cancel_reason: reason,\n cancel_state: 'acknowledged',\n cancel_support: 'gateway',\n cancellation_scope: 'gateway',\n cancelled: true,\n last_run_at: nowIso,\n }\n )\n\n const { error: subagentUpdateError } = await supabase\n .from('subagents')\n .update({\n status: 'cancelled',\n output: asJson(cancelledOutput),\n error: reason,\n completed_at: nowIso,\n metadata: asJson(updatedSubagentMetadata),\n })\n .eq('id', subagentId)\n .eq('status', 'running')\n\n if (subagentUpdateError) {\n logError('Failed to cancel subagent during shutdown', {\n subagentId,\n runId,\n error: subagentUpdateError.message,\n })\n }\n\n if (updatedRun?.id && subagentRow?.team_id) {\n const nextSequence = await getNextSubagentRunEventSequence(supabase, runId)\n await insertSubagentRunEvent({\n supabase,\n runId,\n subagentId,\n teamId: subagentRow.team_id,\n gatewayId: subagentRow.gateway_id,\n sequence: nextSequence,\n eventType: 'cancellation_acknowledged',\n payload: {\n reason,\n source: 'gateway_shutdown',\n cancellation_scope: 'gateway',\n },\n })\n await insertSubagentRunEvent({\n supabase,\n runId,\n subagentId,\n teamId: subagentRow.team_id,\n gatewayId: subagentRow.gateway_id,\n sequence: nextSequence + 1,\n eventType: 'run_cancelled',\n payload: {\n reason,\n source: 'gateway_shutdown',\n cancellation_scope: 'gateway',\n },\n })\n }\n}\n", "import type { ParsedArgs } from '../cli-args.js'\nimport type { GatewayJobController } from '../gateway-job-controller.js'\nimport {\n resolveJobSubagentId,\n type GatewayJobRow,\n type GatewayJobStatus,\n} from '../gateway-jobs.js'\nimport {\n requestGatewayActiveWorkShutdown,\n waitForGatewayActiveWorkToDrain,\n type GatewayActiveWorkRegistries,\n type GatewayChildTerminator,\n type GatewayShutdownMode,\n} from '../gateway-lifecycle.js'\nimport type { GatewayRuntimeState } from '../gateway-runtime-state.js'\nimport { sleep } from '../gateway-run-helpers.js'\nimport type { GatewaySubagentRunEventInsert } from '../gateway-subagent-run-types.js'\nimport { cancelSubagentRunOnGatewayShutdown } from '../subagent-shutdown-cancellation.js'\nimport {\n PROCESS_KILL_GRACE_MS,\n SUBAGENT_CANCEL_KILL_TIMEOUT_MS,\n} from './runtime-utils.js'\nimport type { GatewayLocalRuntimeEventPayload, GatewaySupabaseClient } from './types.js'\n\nexport interface GatewayShutdownCoordinator {\n performShutdown: (signal: string, mode?: GatewayShutdownMode) => Promise<void>\n shutdown: (signal: string) => Promise<void>\n isShutdownInProgress: () => boolean\n}\n\nexport function createGatewayShutdownCoordinator(params: {\n supabase: GatewaySupabaseClient\n options: ParsedArgs['options']\n runtimeState: GatewayRuntimeState<GatewayLocalRuntimeEventPayload>\n jobController: GatewayJobController\n activeWorkRegistries: GatewayActiveWorkRegistries\n requestChildTermination: GatewayChildTerminator\n syncOperationalHeartbeatIfChanged: () => Promise<void>\n stopHeartbeat: () => void\n stopRestart: () => void\n sendOfflineHeartbeat: () => Promise<void>\n removePidFile: (options?: ParsedArgs['options']) => Promise<void>\n completeJob: (\n supabase: GatewaySupabaseClient,\n jobId: string,\n status: GatewayJobStatus,\n result: Record<string, unknown> | null,\n errorMessage?: string\n ) => Promise<void>\n getNextSubagentRunEventSequence: (\n supabase: GatewaySupabaseClient,\n runId: string\n ) => Promise<number>\n insertSubagentRunEvent: (params: GatewaySubagentRunEventInsert) => Promise<number | null>\n logInfo: (message: string, data?: Record<string, unknown>) => void\n logError: (message: string, data?: Record<string, unknown>) => void\n exitProcess: (code: number) => void\n}): GatewayShutdownCoordinator {\n let shutdownInProgress = false\n let shutdownPromise: Promise<void> | null = null\n\n const runShutdownStep = async (step: string, action: () => Promise<void>): Promise<void> => {\n try {\n await action()\n } catch (error) {\n params.logError('Gateway shutdown step failed', {\n step,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n const requestActiveWorkShutdown = (mode: GatewayShutdownMode, reason: string) => {\n requestGatewayActiveWorkShutdown({\n mode,\n reason,\n registries: params.activeWorkRegistries,\n terminateChild: params.requestChildTermination,\n subagentGraceMs: SUBAGENT_CANCEL_KILL_TIMEOUT_MS,\n processGraceMs: PROCESS_KILL_GRACE_MS,\n })\n }\n\n const waitForActiveJobsToDrain = async () => {\n await waitForGatewayActiveWorkToDrain({\n jobController: params.jobController,\n registries: params.activeWorkRegistries,\n sleep,\n })\n }\n\n const cancelSubagentRunOnShutdown = async (\n subagentId: string,\n runId: string,\n reason: string\n ) => {\n await cancelSubagentRunOnGatewayShutdown({\n supabase: params.supabase,\n subagentId,\n runId,\n reason,\n getNextSubagentRunEventSequence: params.getNextSubagentRunEventSequence,\n insertSubagentRunEvent: params.insertSubagentRunEvent,\n logError: params.logError,\n })\n }\n\n const finalizeResidualGatewayJobs = async (reason: string) => {\n for (const [jobId, jobRow] of params.jobController.activeClaimedJobEntries()) {\n if ((jobRow as GatewayJobRow).job_type === 'subagent_run') {\n const subagentId = resolveJobSubagentId(jobRow)\n const activeRun = subagentId ? params.runtimeState.activeSubagentRuns.get(subagentId) : null\n if (subagentId && activeRun) {\n await cancelSubagentRunOnShutdown(subagentId, activeRun.runId, reason)\n }\n await params.completeJob(\n params.supabase,\n jobId,\n 'cancelled',\n { message: reason, cancelled: true },\n reason\n )\n continue\n }\n\n await params.completeJob(\n params.supabase,\n jobId,\n 'cancelled',\n { message: reason, cancelled: true },\n reason\n )\n }\n }\n\n const performShutdown = async (signal: string, mode: GatewayShutdownMode = 'drain') => {\n if (shutdownPromise) return await shutdownPromise\n shutdownPromise = (async () => {\n if (shutdownInProgress) return\n shutdownInProgress = true\n params.jobController.beginShutdown()\n params.logInfo('Gateway shutting down', { signal, mode })\n params.stopHeartbeat()\n params.stopRestart()\n await runShutdownStep('sync_operational_heartbeat', params.syncOperationalHeartbeatIfChanged)\n requestActiveWorkShutdown(mode, `Gateway shutting down (${signal})`)\n await runShutdownStep('wait_for_active_jobs', waitForActiveJobsToDrain)\n if (mode === 'terminate') {\n await runShutdownStep('finalize_residual_gateway_jobs', () =>\n finalizeResidualGatewayJobs(`Gateway shutting down (${signal})`)\n )\n }\n params.runtimeState.currentJobIngressState = {\n pending: false,\n ready: false,\n }\n await runShutdownStep('send_offline_heartbeat', params.sendOfflineHeartbeat)\n await runShutdownStep('disconnect_job_channel', () => params.jobController.disconnect())\n await runShutdownStep('remove_pid_file', () => params.removePidFile(params.options))\n params.runtimeState.currentRuntimeOptions = null\n })()\n return await shutdownPromise\n }\n\n const shutdown = async (signal: string) => {\n try {\n await performShutdown(signal)\n } catch (error) {\n params.logError('Gateway shutdown failed unexpectedly', {\n signal,\n error: error instanceof Error ? error.message : String(error),\n })\n } finally {\n params.exitProcess(0)\n }\n }\n\n return {\n performShutdown,\n shutdown,\n isShutdownInProgress: () => shutdownInProgress,\n }\n}\n", "import type { ChildProcess } from 'node:child_process'\nimport type { GatewayCapabilitiesV1 } from '@panorama/shared/gateway/capabilities'\nimport type { GatewayProviderHealth, GatewayProviderId } from './cli-providers/types.js'\nimport type { ParsedArgs } from './cli-args.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport type { GatewayJobIngressState } from './gateway-operational-status.js'\nimport type { ActiveModelRun } from './gateway-model-run.js'\nimport type { ActiveShellExecRun } from './gateway-shell-exec.js'\n\nexport type ActiveSubagentRun = {\n runId: string\n child?: ChildProcess\n cancelled: boolean\n cancelReason?: string\n}\n\nexport type GatewayRuntimeState<GatewayEventPayload = unknown> = {\n activeSubagentRuns: Map<string, ActiveSubagentRun>\n activeModelRuns: Map<string, ActiveModelRun>\n activeShellExecRuns: Map<string, ActiveShellExecRun>\n pendingCancelByRunId: Map<string, { reason: string }>\n pendingCancelBySubagentId: Map<string, { reason: string }>\n pendingGatewayEvents: GatewayEventPayload[]\n currentCapabilities: GatewayCapabilitiesV1 | null\n currentDeviceName: string | null\n currentConfig: GatewayConfig | null\n currentProviderHealth: Partial<Record<GatewayProviderId, GatewayProviderHealth>> | null\n currentJobIngressState: GatewayJobIngressState | null\n currentAcceptingJobs: boolean\n currentRuntimeOptions: ParsedArgs['options'] | null\n}\n\nexport function createGatewayRuntimeState<\n GatewayEventPayload = unknown,\n>(): GatewayRuntimeState<GatewayEventPayload> {\n return {\n activeSubagentRuns: new Map<string, ActiveSubagentRun>(),\n activeModelRuns: new Map<string, ActiveModelRun>(),\n activeShellExecRuns: new Map<string, ActiveShellExecRun>(),\n pendingCancelByRunId: new Map<string, { reason: string }>(),\n pendingCancelBySubagentId: new Map<string, { reason: string }>(),\n pendingGatewayEvents: [],\n currentCapabilities: null,\n currentDeviceName: null,\n currentConfig: null,\n currentProviderHealth: null,\n currentJobIngressState: null,\n currentAcceptingJobs: true,\n currentRuntimeOptions: null,\n }\n}\n", "import { randomUUID } from 'node:crypto'\nimport { setTimeout as sleep } from 'node:timers/promises'\nimport {\n resolveManagedGatewayRuntimeConfig,\n type ManagedGatewayRuntimeConfig,\n} from './managed-runtime/config.js'\nimport {\n resolveManagedGatewayRuntimeDependencies,\n type ManagedGatewayRuntimeDependencies,\n} from './managed-runtime/dependencies.js'\nimport { executeManagedLinuxExecution } from './managed-runtime/execution-dispatcher.js'\nimport { startHostHeartbeatLoop } from './managed-runtime/heartbeat.js'\nimport {\n describeLinuxHostStopReason,\n readLinuxHostObservedState,\n type LinuxHostObservedState,\n} from './managed-runtime/host-state.js'\nimport { MANAGED_GATEWAY_LOG_PREFIX } from './managed-runtime/runtime-utils.js'\nimport { createWakeSignal } from './managed-runtime/wake-signal.js'\n\nexport { buildManagedShellExecutionEnv } from './managed-runtime/shell-execution.js'\nexport { resolveManagedGatewayRuntimeConfig } from './managed-runtime/config.js'\nexport type { ManagedGatewayRuntimeConfig } from './managed-runtime/config.js'\nexport type { ManagedGatewayRuntimeDependencies } from './managed-runtime/dependencies.js'\n\nexport async function startManagedGatewayRuntime(\n config: ManagedGatewayRuntimeConfig = resolveManagedGatewayRuntimeConfig(),\n dependencies: ManagedGatewayRuntimeDependencies = {}\n): Promise<void> {\n const runtimeDependencies = resolveManagedGatewayRuntimeDependencies(dependencies)\n let shutdownRequested = false\n let draining = false\n let reconciliationRequired = true\n let activeExecutionId: string | null = null\n let requestWakeSignal: ((reason: string) => void) | null = null\n let fatalHeartbeatError: Error | null = null\n\n const requestShutdown = (reason: string) => {\n if (shutdownRequested) {\n return\n }\n shutdownRequested = true\n requestWakeSignal?.(reason)\n }\n\n const applyObservedHostState = (state: LinuxHostObservedState, source: string) => {\n const stopReason = describeLinuxHostStopReason(state, config.hostAttemptGeneration)\n if (shutdownRequested) {\n return\n }\n\n if (stopReason) {\n if (!draining) {\n draining = true\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} draining due to host lifecycle signal`, {\n source,\n reason: stopReason,\n hostId: config.hostId,\n attemptGeneration: config.hostAttemptGeneration,\n status: state.status,\n runtimeState: state.runtimeState,\n desiredPowerState: state.desiredPowerState,\n allocationState: state.allocationState,\n })\n requestWakeSignal?.('host_drain_requested')\n }\n return\n }\n\n if (draining) {\n draining = false\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} host became runnable again; resuming dispatch`, {\n source,\n hostId: config.hostId,\n attemptGeneration: config.hostAttemptGeneration,\n })\n requestWakeSignal?.('host_runnable_again')\n }\n }\n\n const heartbeatHost = async () => {\n const host = await runtimeDependencies.heartbeatLinuxHost({\n controlUrl: config.hostControlUrl,\n controlToken: config.hostControlToken,\n runtimeId: config.runtimeId,\n controlTimeoutMs: config.controlTimeoutMs,\n })\n const observedHostState = readLinuxHostObservedState(host)\n applyObservedHostState(observedHostState, 'heartbeat')\n\n if (\n !shutdownRequested &&\n !draining &&\n !activeExecutionId &&\n requestWakeSignal &&\n !describeLinuxHostStopReason(observedHostState, config.hostAttemptGeneration)\n ) {\n requestWakeSignal('heartbeat_tick')\n }\n }\n\n const onSignal = (signal: NodeJS.Signals) => {\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} received shutdown signal`, { signal })\n requestShutdown('shutdown')\n }\n\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} starting managed gateway runtime`, {\n agentId: config.agentId,\n hostId: config.hostId,\n attemptGeneration: config.hostAttemptGeneration,\n runtimeId: config.runtimeId,\n })\n\n let stopHeartbeat: (() => void) | null = null\n let stopRealtimeWakeLoop: (() => Promise<void>) | null = null\n let unsubscribeAuthStateChange: (() => void) | null = null\n const removeSignalHandlers = runtimeDependencies.registerSignalHandlers(onSignal)\n\n try {\n await heartbeatHost()\n if (shutdownRequested) {\n return\n }\n\n const { requestWake, waitForWake } = createWakeSignal('startup')\n requestWakeSignal = requestWake\n const realtimeClient = await runtimeDependencies.createRealtimeClient({\n supabaseUrl: config.supabaseUrl,\n supabaseAnonKey: config.supabaseAnonKey,\n hostControlToken: config.hostControlToken,\n agentId: config.agentId,\n hostId: config.hostId,\n hostAttemptGeneration: config.hostAttemptGeneration,\n controlTimeoutMs: config.controlTimeoutMs,\n })\n unsubscribeAuthStateChange = realtimeClient.unsubscribeAuthStateChange\n stopRealtimeWakeLoop = runtimeDependencies.startRealtimeWakeLoop({\n supabase: realtimeClient.supabase,\n hostId: config.hostId,\n hostAttemptGeneration: config.hostAttemptGeneration,\n retryBackoffMs: config.retryBackoffMs,\n onReconnectRequired() {\n reconciliationRequired = true\n },\n onHostStateObserved: applyObservedHostState,\n requestWake,\n shouldStop: () => shutdownRequested,\n })\n\n stopHeartbeat = startHostHeartbeatLoop({\n intervalMs: config.heartbeatIntervalMs,\n maxConsecutiveFailures: config.maxConsecutiveHeartbeatFailures,\n heartbeatHost,\n onFatalFailure: (error) => {\n if (fatalHeartbeatError) {\n return\n }\n\n fatalHeartbeatError = error\n console.error(`${MANAGED_GATEWAY_LOG_PREFIX} stopping after repeated heartbeat failures`, { error })\n requestShutdown('heartbeat_failure')\n },\n })\n\n while (!shutdownRequested) {\n await waitForWake()\n if (fatalHeartbeatError || shutdownRequested) {\n break\n }\n\n if (reconciliationRequired) {\n try {\n const reconciliation = await runtimeDependencies.reconcileExecutionLifecycle({\n controlUrl: config.hostControlUrl,\n controlToken: config.hostControlToken,\n runtimeId: config.runtimeId,\n controlTimeoutMs: config.controlTimeoutMs,\n })\n reconciliationRequired = false\n if (reconciliation.recoveredCount > 0 || reconciliation.requeuedCount > 0) {\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} reconciled stale managed executions`, reconciliation)\n }\n } catch (error) {\n console.error(`${MANAGED_GATEWAY_LOG_PREFIX} failed to reconcile execution lifecycle`, { error })\n await sleep(config.retryBackoffMs)\n requestWake('reconcile_retry')\n continue\n }\n }\n\n if (draining) {\n continue\n }\n\n while (!shutdownRequested && !draining) {\n try {\n const claimToken = randomUUID()\n const execution = await runtimeDependencies.dispatchLinuxExecution({\n controlUrl: config.hostControlUrl,\n controlToken: config.hostControlToken,\n runtimeId: config.runtimeId,\n claimToken,\n controlTimeoutMs: config.controlTimeoutMs,\n })\n\n if (!execution?.id) {\n break\n }\n\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} running managed execution`, {\n executionId: execution.id,\n agentId: execution.agent_id,\n })\n const outcome = await executeManagedLinuxExecution({\n config,\n execution,\n registerCancellation: () => undefined,\n onExecutionStarted(executionId) {\n activeExecutionId = executionId\n },\n onExecutionFinished() {\n activeExecutionId = null\n },\n dependencies: runtimeDependencies,\n })\n\n if (outcome.reconciliationRequired) {\n reconciliationRequired = true\n requestWake(outcome.wakeReason ?? 'post_execution_reconcile')\n break\n }\n\n if (reconciliationRequired) {\n requestWake('post_execution_reconcile')\n break\n }\n } catch (error) {\n console.error(`${MANAGED_GATEWAY_LOG_PREFIX} failed to dispatch managed execution`, { error })\n reconciliationRequired = true\n await sleep(config.retryBackoffMs)\n requestWake('dispatch_retry')\n break\n }\n }\n }\n } finally {\n stopHeartbeat?.()\n await stopRealtimeWakeLoop?.()\n unsubscribeAuthStateChange?.()\n removeSignalHandlers()\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} stopped managed gateway runtime`, {\n agentId: config.agentId,\n hostId: config.hostId,\n attemptGeneration: config.hostAttemptGeneration,\n })\n }\n\n if (fatalHeartbeatError) {\n throw fatalHeartbeatError\n }\n}\n", "export const LINUX_HOST_CONTROL_ENDPOINT_PATH = '/functions/v1/linux-host-control';\nexport function buildLinuxHostControlUrl(baseUrl) {\n const trimmed = baseUrl.trim().replace(/\\/+$/, '');\n return `${trimmed}${LINUX_HOST_CONTROL_ENDPOINT_PATH}`;\n}\n", "export const TOOL_EXECUTION_ENDPOINT_PATH = '/functions/v1/execute-tool';\nexport function buildToolExecutionUrl(baseUrl) {\n const trimmed = baseUrl.trim().replace(/\\/+$/, '');\n return `${trimmed}${TOOL_EXECUTION_ENDPOINT_PATH}`;\n}\n", "import { buildLinuxHostControlUrl } from '@panorama/shared/linux-host-control/contract'\nimport { buildToolExecutionUrl } from '@panorama/shared/tools/execution-contract'\nimport { hostname } from 'node:os'\nimport process from 'node:process'\n\nconst DEFAULT_RETRY_BACKOFF_MS = 2_000\nconst DEFAULT_CONTROL_TIMEOUT_MS = 30_000\nconst DEFAULT_EXEC_TIMEOUT_MS = 300_000\nconst DEFAULT_HEARTBEAT_INTERVAL_MS = 15_000\nconst DEFAULT_MAX_CONSECUTIVE_HEARTBEAT_FAILURES = 3\nconst DEFAULT_OUTPUT_CAPTURE_BYTES = 5_000_000\n\nexport type ManagedGatewayRuntimeConfig = {\n agentId: string\n hostId: string\n hostAttemptGeneration: number\n runtimeId: string\n supabaseUrl: string\n supabaseAnonKey: string\n hostControlUrl: string\n hostControlToken: string\n toolExecutionUrl: string\n toolExecutionToken: string\n retryBackoffMs: number\n controlTimeoutMs: number\n execTimeoutMs: number\n outputCaptureBytes: number\n heartbeatIntervalMs: number\n maxConsecutiveHeartbeatFailures: number\n}\n\nfunction requireEnv(name: string, env: NodeJS.ProcessEnv = process.env): string {\n const value = env[name]?.trim()\n if (!value) {\n throw new Error(`${name} is required`)\n }\n return value\n}\n\nfunction readPositiveInt(\n name: string,\n fallback: number,\n env: NodeJS.ProcessEnv = process.env\n): number {\n const raw = env[name]?.trim()\n if (!raw) return fallback\n const parsed = Number(raw)\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`${name} must be a positive number`)\n }\n return Math.floor(parsed)\n}\n\nfunction requirePositiveInt(name: string, env: NodeJS.ProcessEnv = process.env): number {\n const raw = requireEnv(name, env)\n const parsed = Number(raw)\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`${name} must be a positive number`)\n }\n return Math.floor(parsed)\n}\n\nexport function resolveManagedGatewayRuntimeConfig(\n env: NodeJS.ProcessEnv = process.env\n): ManagedGatewayRuntimeConfig {\n const agentId = requireEnv('PANORAMA_AGENT_ID', env)\n const hostId = requireEnv('PANORAMA_LINUX_HOST_ID', env)\n const hostAttemptGeneration = requirePositiveInt('PANORAMA_LINUX_HOST_ATTEMPT_GENERATION', env)\n const supabaseUrl = env.PANORAMA_SUPABASE_URL?.trim() || env.SUPABASE_URL?.trim() || null\n const supabaseAnonKey =\n env.PANORAMA_SUPABASE_ANON_KEY?.trim() ||\n env.SUPABASE_ANON_KEY?.trim() ||\n env.SUPABASE_PUBLISHABLE_KEY?.trim() ||\n null\n const hostControlUrl =\n env.PANORAMA_LINUX_HOST_CONTROL_URL?.trim() ||\n (supabaseUrl ? buildLinuxHostControlUrl(supabaseUrl) : null)\n const toolExecutionUrl =\n env.PANORAMA_TOOL_EXECUTION_URL?.trim() ||\n (supabaseUrl ? buildToolExecutionUrl(supabaseUrl) : null)\n\n if (!hostControlUrl) {\n throw new Error('PANORAMA_LINUX_HOST_CONTROL_URL is required')\n }\n if (!toolExecutionUrl) {\n throw new Error('PANORAMA_TOOL_EXECUTION_URL is required')\n }\n if (!supabaseUrl) {\n throw new Error('PANORAMA_SUPABASE_URL or SUPABASE_URL is required')\n }\n if (!supabaseAnonKey) {\n throw new Error(\n 'PANORAMA_SUPABASE_ANON_KEY, SUPABASE_ANON_KEY, or SUPABASE_PUBLISHABLE_KEY is required'\n )\n }\n\n return {\n agentId,\n hostId,\n hostAttemptGeneration,\n runtimeId: env.PANORAMA_MANAGED_RUNTIME_ID?.trim() || `${hostname()}:${process.pid}`,\n supabaseUrl,\n supabaseAnonKey,\n hostControlUrl,\n hostControlToken: requireEnv('PANORAMA_LINUX_HOST_CONTROL_TOKEN', env),\n toolExecutionUrl,\n toolExecutionToken: requireEnv('PANORAMA_TOOL_EXECUTION_TOKEN', env),\n retryBackoffMs: readPositiveInt(\n 'PANORAMA_MANAGED_RUNTIME_RETRY_BACKOFF_MS',\n DEFAULT_RETRY_BACKOFF_MS,\n env\n ),\n controlTimeoutMs: readPositiveInt(\n 'PANORAMA_MANAGED_RUNTIME_CONTROL_TIMEOUT_MS',\n DEFAULT_CONTROL_TIMEOUT_MS,\n env\n ),\n execTimeoutMs: readPositiveInt('PANORAMA_AGENT_EXEC_TIMEOUT_MS', DEFAULT_EXEC_TIMEOUT_MS, env),\n outputCaptureBytes: readPositiveInt(\n 'PANORAMA_MANAGED_RUNTIME_OUTPUT_CAPTURE_BYTES',\n DEFAULT_OUTPUT_CAPTURE_BYTES,\n env\n ),\n heartbeatIntervalMs: readPositiveInt(\n 'PANORAMA_MANAGED_RUNTIME_HEARTBEAT_INTERVAL_MS',\n DEFAULT_HEARTBEAT_INTERVAL_MS,\n env\n ),\n maxConsecutiveHeartbeatFailures: readPositiveInt(\n 'PANORAMA_MANAGED_RUNTIME_MAX_CONSECUTIVE_HEARTBEAT_FAILURES',\n DEFAULT_MAX_CONSECUTIVE_HEARTBEAT_FAILURES,\n env\n ),\n }\n}\n", "export const LINUX_HOST_SESSION_EXCHANGE_ENDPOINT_PATH = '/functions/v1/exchange-linux-host-session';\nexport function buildLinuxHostSessionExchangeUrl(baseUrl) {\n const trimmed = baseUrl.trim().replace(/\\/+$/, '');\n return `${trimmed}${LINUX_HOST_SESSION_EXCHANGE_ENDPOINT_PATH}`;\n}\n", "import type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from '../database.types.js'\n\nexport const MANAGED_GATEWAY_LOG_PREFIX = '[panorama-gateway managed]'\n\nexport type ManagedGatewaySupabaseClient = SupabaseClient<Database>\n\nexport function asError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error))\n}\n\nexport async function withAbortTimeout<T>(\n timeoutMs: number,\n timeoutMessage: string,\n operation: (signal: AbortSignal) => Promise<T>,\n externalSignal?: AbortSignal\n): Promise<T> {\n const controller = new AbortController()\n let timedOut = false\n const timeoutHandle = setTimeout(() => {\n timedOut = true\n controller.abort()\n }, timeoutMs)\n const abortFromExternalSignal = () => controller.abort()\n\n if (externalSignal?.aborted) {\n controller.abort()\n } else {\n externalSignal?.addEventListener('abort', abortFromExternalSignal, { once: true })\n }\n\n try {\n return await operation(controller.signal)\n } catch (error) {\n if (timedOut) {\n throw new Error(timeoutMessage)\n }\n throw error\n } finally {\n clearTimeout(timeoutHandle)\n externalSignal?.removeEventListener('abort', abortFromExternalSignal)\n }\n}\n\nexport function normalizeRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>\n }\n\n return {}\n}\n", "import {\n buildLinuxHostSessionExchangeUrl,\n type LinuxHostSessionExchangeResponse,\n} from '@panorama/shared/linux-host-session/contract'\nimport type {\n LinuxHostClaimedExecution,\n LinuxHostControlHostEnvelope,\n LinuxHostControlRequest,\n LinuxHostControlResponse,\n} from '@panorama/shared/linux-host-control/contract'\nimport { withAbortTimeout } from './runtime-utils.js'\n\nexport async function postLinuxHostControlRequest(params: {\n controlUrl: string\n controlToken: string\n body: LinuxHostControlRequest\n timeoutMs: number\n signal?: AbortSignal\n}): Promise<LinuxHostControlResponse> {\n return await withAbortTimeout(\n params.timeoutMs,\n `Linux host control request timed out after ${params.timeoutMs}ms`,\n async (signal) => {\n const response = await fetch(params.controlUrl, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${params.controlToken}`,\n 'Content-Type': 'application/json',\n 'X-Request-Source': 'gateway_managed',\n },\n body: JSON.stringify(params.body),\n signal,\n })\n\n let payload: unknown\n try {\n payload = await response.json()\n } catch {\n payload = null\n }\n\n if (!response.ok) {\n const message =\n payload && typeof payload === 'object' && 'error' in payload\n ? String((payload as { error?: string }).error ?? 'Linux host control request failed')\n : `Linux host control request failed with status ${response.status}`\n throw new Error(message)\n }\n\n return payload as LinuxHostControlResponse\n },\n params.signal\n )\n}\n\nexport async function exchangeLinuxHostSession(params: {\n supabaseUrl: string\n supabaseAnonKey: string\n hostControlToken: string\n timeoutMs: number\n}): Promise<LinuxHostSessionExchangeResponse> {\n return await withAbortTimeout(\n params.timeoutMs,\n `Linux host session exchange timed out after ${params.timeoutMs}ms`,\n async (signal) => {\n const response = await fetch(buildLinuxHostSessionExchangeUrl(params.supabaseUrl), {\n method: 'POST',\n headers: {\n apikey: params.supabaseAnonKey,\n Authorization: `Bearer ${params.supabaseAnonKey}`,\n 'Content-Type': 'application/json',\n 'X-Request-Source': 'gateway_managed',\n },\n body: JSON.stringify({\n host_control_token: params.hostControlToken,\n }),\n signal,\n })\n\n let payload: unknown\n try {\n payload = await response.json()\n } catch {\n payload = null\n }\n\n if (!response.ok) {\n const message =\n payload && typeof payload === 'object' && 'error' in payload\n ? String((payload as { error?: string }).error ?? 'Linux host session exchange failed')\n : `Linux host session exchange failed with status ${response.status}`\n throw new Error(message)\n }\n\n return payload as LinuxHostSessionExchangeResponse\n }\n )\n}\n\nexport async function heartbeatLinuxHost(params: {\n controlUrl: string\n controlToken: string\n runtimeId: string\n controlTimeoutMs: number\n}): Promise<LinuxHostControlHostEnvelope> {\n const response = await postLinuxHostControlRequest({\n controlUrl: params.controlUrl,\n controlToken: params.controlToken,\n timeoutMs: params.controlTimeoutMs,\n body: {\n action: 'heartbeat',\n runtime_id: params.runtimeId,\n },\n })\n\n return response.host\n}\n\nexport async function dispatchLinuxExecution(params: {\n controlUrl: string\n controlToken: string\n runtimeId: string\n claimToken: string\n controlTimeoutMs: number\n}): Promise<LinuxHostClaimedExecution | null> {\n const response = await postLinuxHostControlRequest({\n controlUrl: params.controlUrl,\n controlToken: params.controlToken,\n timeoutMs: params.controlTimeoutMs,\n body: {\n action: 'claim_execution',\n runtime_id: params.runtimeId,\n claim_token: params.claimToken,\n },\n })\n\n return response.execution ?? null\n}\n\nexport async function startLinuxExecution(params: {\n controlUrl: string\n controlToken: string\n runtimeId: string\n executionId: string\n claimToken: string\n controlTimeoutMs: number\n}): Promise<LinuxHostClaimedExecution | null> {\n const response = await postLinuxHostControlRequest({\n controlUrl: params.controlUrl,\n controlToken: params.controlToken,\n timeoutMs: params.controlTimeoutMs,\n body: {\n action: 'start_execution',\n runtime_id: params.runtimeId,\n execution_id: params.executionId,\n claim_token: params.claimToken,\n },\n })\n\n return response.execution ?? null\n}\n\nexport async function completeLinuxExecution(params: {\n controlUrl: string\n controlToken: string\n runtimeId: string\n executionId: string\n claimToken: string\n executionStatus: 'succeeded' | 'failed' | 'timed_out' | 'cancelled'\n exitCode?: number | null\n durationMs?: number | null\n stdout?: string | null\n stderr?: string | null\n error?: string | null\n executionMetadata?: Record<string, unknown> | null\n stepStatus?: 'completed' | 'failed' | 'skipped' | 'uncertain' | null\n stepResult?: Record<string, unknown> | null\n stepError?: string | null\n stepUncertaintyReason?: string | null\n controlSignal?: 'continue' | 'pause' | 'stop' | null\n controlTimeoutMs: number\n}): Promise<LinuxHostControlResponse['completion']> {\n const response = await postLinuxHostControlRequest({\n controlUrl: params.controlUrl,\n controlToken: params.controlToken,\n timeoutMs: params.controlTimeoutMs,\n body: {\n action: 'complete_execution',\n runtime_id: params.runtimeId,\n execution_id: params.executionId,\n claim_token: params.claimToken,\n execution_status: params.executionStatus,\n exit_code: params.exitCode ?? null,\n duration_ms: params.durationMs ?? null,\n stdout: params.stdout ?? null,\n stderr: params.stderr ?? null,\n error: params.error ?? null,\n execution_metadata: params.executionMetadata ?? undefined,\n step_status: params.stepStatus ?? null,\n step_result: params.stepResult ?? undefined,\n step_error: params.stepError ?? null,\n step_uncertainty_reason: params.stepUncertaintyReason ?? null,\n control_signal: params.controlSignal ?? null,\n },\n })\n\n return response.completion ?? null\n}\n\nexport async function reconcileExecutionLifecycle(params: {\n controlUrl: string\n controlToken: string\n runtimeId: string\n controlTimeoutMs: number\n}): Promise<{ recoveredCount: number; requeuedCount: number }> {\n const response = await postLinuxHostControlRequest({\n controlUrl: params.controlUrl,\n controlToken: params.controlToken,\n timeoutMs: params.controlTimeoutMs,\n body: {\n action: 'reconcile_execution_lifecycle',\n runtime_id: params.runtimeId,\n },\n })\n\n return {\n recoveredCount: response.recovered_count ?? 0,\n requeuedCount: response.requeued_count ?? 0,\n }\n}\n", "import { createClient, type RealtimeChannel, type RealtimePostgresChangesPayload } from '@supabase/supabase-js'\nimport { exchangeLinuxHostSession } from './control-client.js'\nimport {\n readLinuxHostObservedState,\n readLinuxHostWakeState,\n type LinuxHostObservedState,\n} from './host-state.js'\nimport {\n MANAGED_GATEWAY_LOG_PREFIX,\n normalizeRecord,\n type ManagedGatewaySupabaseClient,\n} from './runtime-utils.js'\n\nconst DEFAULT_REALTIME_EVENTS_PER_SECOND = 10\n\nexport async function createManagedRealtimeClient(params: {\n supabaseUrl: string\n supabaseAnonKey: string\n hostControlToken: string\n agentId: string\n hostId: string\n hostAttemptGeneration: number\n controlTimeoutMs: number\n}): Promise<{\n supabase: ManagedGatewaySupabaseClient\n unsubscribeAuthStateChange: () => void\n}> {\n const sessionExchange = await exchangeLinuxHostSession({\n supabaseUrl: params.supabaseUrl,\n supabaseAnonKey: params.supabaseAnonKey,\n hostControlToken: params.hostControlToken,\n timeoutMs: params.controlTimeoutMs,\n })\n\n if (!sessionExchange.success) {\n throw new Error('Linux host session exchange returned an unsuccessful response.')\n }\n if (sessionExchange.agent_id !== params.agentId) {\n throw new Error(\n `Linux host session exchange returned agent ${sessionExchange.agent_id}, expected ${params.agentId}`\n )\n }\n if (sessionExchange.host_id !== params.hostId) {\n throw new Error(\n `Linux host session exchange returned host ${sessionExchange.host_id}, expected ${params.hostId}`\n )\n }\n if (sessionExchange.attempt_generation !== params.hostAttemptGeneration) {\n throw new Error(\n `Linux host session exchange returned attempt generation ${sessionExchange.attempt_generation}, expected ${params.hostAttemptGeneration}`\n )\n }\n\n const supabase = createClient(params.supabaseUrl, params.supabaseAnonKey, {\n auth: {\n persistSession: false,\n autoRefreshToken: true,\n detectSessionInUrl: false,\n },\n realtime: {\n params: {\n eventsPerSecond: DEFAULT_REALTIME_EVENTS_PER_SECOND,\n },\n },\n }) as ManagedGatewaySupabaseClient\n\n const { data: sessionData, error: sessionError } = await supabase.auth.setSession({\n access_token: sessionExchange.access_token,\n refresh_token: sessionExchange.refresh_token,\n })\n\n if (sessionError || !sessionData?.session) {\n throw new Error(sessionError?.message || 'Linux host session exchange did not return a session.')\n }\n\n const authStateSubscription = supabase.auth.onAuthStateChange((event, session) => {\n if (!session) {\n return\n }\n\n if (event === 'TOKEN_REFRESHED' || event === 'SIGNED_IN') {\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} refreshed managed runtime session`, {\n event,\n expiresAt: session.expires_at ?? null,\n })\n }\n })\n\n return {\n supabase,\n unsubscribeAuthStateChange() {\n authStateSubscription.data.subscription.unsubscribe()\n },\n }\n}\n\nexport function startManagedRealtimeWakeLoop(params: {\n supabase: ManagedGatewaySupabaseClient\n hostId: string\n hostAttemptGeneration: number\n retryBackoffMs: number\n onReconnectRequired: () => void\n onHostStateObserved: (state: LinuxHostObservedState, source: string) => void\n requestWake: (reason: string) => void\n shouldStop: () => boolean\n}): () => Promise<void> {\n let activeChannel: RealtimeChannel | null = null\n let reconnectTimer: NodeJS.Timeout | null = null\n let lastHostWakeState: string | null = null\n\n const syncHostWakeState = async () => {\n const { data, error } = await params.supabase\n .from('linux_agent_hosts')\n .select('attempt_generation, allocation_state, desired_power_state, status, runtime_state, error')\n .eq('id', params.hostId)\n .maybeSingle()\n\n if (error) {\n console.warn(`${MANAGED_GATEWAY_LOG_PREFIX} failed to seed managed host realtime baseline`, {\n hostId: params.hostId,\n error: error.message,\n })\n return\n }\n\n if (data) {\n const normalized = normalizeRecord(data)\n lastHostWakeState = readLinuxHostWakeState(normalized)\n params.onHostStateObserved(readLinuxHostObservedState(normalized), 'baseline')\n }\n }\n\n const scheduleReconnect = (reason: string) => {\n if (params.shouldStop() || reconnectTimer) {\n return\n }\n\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null\n void connectChannel(`reconnect:${reason}`)\n }, params.retryBackoffMs)\n }\n\n const handleHostPayload = (payload: RealtimePostgresChangesPayload<Record<string, unknown>>) => {\n const nextRow = normalizeRecord(payload.new)\n params.onHostStateObserved(\n readLinuxHostObservedState(nextRow),\n `realtime_${payload.eventType.toLowerCase()}`\n )\n const nextWakeState = readLinuxHostWakeState(nextRow)\n if (nextWakeState === lastHostWakeState) {\n return\n }\n lastHostWakeState = nextWakeState\n\n params.onReconnectRequired()\n params.requestWake(`host_${payload.eventType.toLowerCase()}`)\n }\n\n const handleExecutionPayload = (\n payload: RealtimePostgresChangesPayload<Record<string, unknown>>\n ) => {\n const nextRow = normalizeRecord(payload.new)\n const nextStatus = typeof nextRow.status === 'string' ? nextRow.status : null\n if (payload.eventType === 'INSERT' || nextStatus === 'queued') {\n params.requestWake(`execution_${payload.eventType.toLowerCase()}`)\n }\n }\n\n const connectChannel = async (reason: string) => {\n if (params.shouldStop()) {\n return\n }\n\n const previousChannel = activeChannel\n activeChannel = null\n if (previousChannel) {\n try {\n await previousChannel.unsubscribe()\n } catch {\n // ignore unsubscribe failures during reconnect\n }\n }\n\n const nextChannel = params.supabase\n .channel(`managed_gateway_runtime_${params.hostId}_${params.hostAttemptGeneration}`)\n .on(\n 'postgres_changes',\n {\n event: 'UPDATE',\n schema: 'public',\n table: 'linux_agent_hosts',\n filter: `id=eq.${params.hostId}`,\n },\n handleHostPayload\n )\n .on(\n 'postgres_changes',\n {\n event: 'INSERT',\n schema: 'public',\n table: 'linux_agent_executions',\n filter: `host_id=eq.${params.hostId}`,\n },\n handleExecutionPayload\n )\n .on(\n 'postgres_changes',\n {\n event: 'UPDATE',\n schema: 'public',\n table: 'linux_agent_executions',\n filter: `host_id=eq.${params.hostId}`,\n },\n handleExecutionPayload\n )\n\n activeChannel = nextChannel\n\n nextChannel.subscribe((status, error) => {\n if (activeChannel !== nextChannel || params.shouldStop()) {\n return\n }\n\n if (status === 'SUBSCRIBED') {\n void (async () => {\n await syncHostWakeState()\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} subscribed to managed host realtime channel`, {\n hostId: params.hostId,\n attemptGeneration: params.hostAttemptGeneration,\n reason,\n })\n params.onReconnectRequired()\n params.requestWake(`realtime_subscribed:${reason}`)\n })()\n return\n }\n\n if (status === 'CHANNEL_ERROR' || status === 'TIMED_OUT' || status === 'CLOSED') {\n console.error(`${MANAGED_GATEWAY_LOG_PREFIX} managed host realtime channel unavailable`, {\n status,\n reason,\n error: error?.message ?? null,\n })\n params.onReconnectRequired()\n scheduleReconnect(status.toLowerCase())\n }\n })\n }\n\n void connectChannel('startup')\n\n return async () => {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer)\n reconnectTimer = null\n }\n\n const channelToClose = activeChannel\n activeChannel = null\n if (channelToClose) {\n await channelToClose.unsubscribe().catch(() => undefined)\n }\n\n await params.supabase.removeAllChannels().catch(() => undefined)\n }\n}\n", "import type { LinuxHostControlHostEnvelope } from '@panorama/shared/linux-host-control/contract'\n\nexport type LinuxHostObservedState = {\n attemptGeneration: number | null\n allocationState: string | null\n desiredPowerState: string | null\n status: string | null\n runtimeState: string | null\n error: string | null\n}\n\nfunction readNullableString(value: unknown): string | null {\n return typeof value === 'string' ? value : null\n}\n\nexport function readLinuxHostWakeState(row: Record<string, unknown>): string {\n return JSON.stringify({\n attempt_generation:\n typeof row.attempt_generation === 'number' ? row.attempt_generation : row.attempt_generation ?? null,\n allocation_state:\n typeof row.allocation_state === 'string' ? row.allocation_state : row.allocation_state ?? null,\n desired_power_state:\n typeof row.desired_power_state === 'string'\n ? row.desired_power_state\n : row.desired_power_state ?? null,\n status: typeof row.status === 'string' ? row.status : row.status ?? null,\n runtime_state:\n typeof row.runtime_state === 'string' ? row.runtime_state : row.runtime_state ?? null,\n error: typeof row.error === 'string' ? row.error : row.error ?? null,\n })\n}\n\nexport function readLinuxHostObservedState(\n value: Record<string, unknown> | (LinuxHostControlHostEnvelope & { error?: string | null })\n): LinuxHostObservedState {\n return {\n attemptGeneration:\n typeof value.attempt_generation === 'number'\n ? value.attempt_generation\n : value.attempt_generation === null || value.attempt_generation === undefined\n ? null\n : Number.isFinite(Number(value.attempt_generation))\n ? Number(value.attempt_generation)\n : null,\n allocationState: readNullableString(value.allocation_state),\n desiredPowerState: readNullableString(value.desired_power_state),\n status: readNullableString(value.status),\n runtimeState: readNullableString(value.runtime_state),\n error: readNullableString(value.error),\n }\n}\n\nexport function describeLinuxHostStopReason(\n state: LinuxHostObservedState,\n expectedAttemptGeneration: number\n): string | null {\n if (state.attemptGeneration !== null && state.attemptGeneration !== expectedAttemptGeneration) {\n return `host attempt rotated to ${state.attemptGeneration}`\n }\n\n if (state.allocationState !== null && state.allocationState !== 'warm') {\n return `host allocation is ${state.allocationState}`\n }\n\n if (state.desiredPowerState !== null && state.desiredPowerState !== 'running') {\n return `desired power state is ${state.desiredPowerState}`\n }\n\n if (state.status === 'stopping' || state.status === 'stopped') {\n return `host status is ${state.status}`\n }\n\n if (state.runtimeState === 'stopping' || state.runtimeState === 'stopped') {\n return `host runtime_state is ${state.runtimeState}`\n }\n\n return null\n}\n", "const CONTROL_ACTIONS = new Set(['continue', 'pause', 'stop']);\nexport function parseControlSignalCandidate(value) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n const rawNextAction = value.nextAction;\n if (typeof rawNextAction !== 'string' || !CONTROL_ACTIONS.has(rawNextAction)) {\n return null;\n }\n const pauseDurationValue = value.pauseDuration ??\n value.seconds;\n const pauseDuration = typeof pauseDurationValue === 'number' &&\n Number.isFinite(pauseDurationValue) &&\n pauseDurationValue > 0\n ? pauseDurationValue\n : undefined;\n return {\n nextAction: rawNextAction,\n pauseDuration,\n };\n}\nexport function extractControlSignalFromMetadata(metadata) {\n if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) {\n return null;\n }\n return parseControlSignalCandidate(metadata.control);\n}\nexport function extractControlSignalFromToolResult(result) {\n if (!result || typeof result !== 'object' || Array.isArray(result)) {\n return null;\n }\n const metadataSignal = extractControlSignalFromMetadata(result.metadata);\n if (metadataSignal) {\n return metadataSignal;\n }\n return (parseControlSignalCandidate(result.controlSignal) ??\n parseControlSignalCandidate(result.control) ??\n parseControlSignalCandidate(result));\n}\nexport function resolveControlSignals(signals) {\n if (!signals.length) {\n return null;\n }\n let bestPause = null;\n let sawContinue = false;\n for (const signal of signals) {\n if (signal.nextAction === 'stop') {\n return signal;\n }\n if (signal.nextAction === 'pause') {\n if (!bestPause) {\n bestPause = signal;\n }\n else {\n const left = bestPause.pauseDuration ?? 0;\n const right = signal.pauseDuration ?? 0;\n if (right > left) {\n bestPause = signal;\n }\n }\n continue;\n }\n if (signal.nextAction === 'continue') {\n sawContinue = true;\n }\n }\n if (bestPause) {\n return bestPause;\n }\n return sawContinue ? { nextAction: 'continue' } : null;\n}\n", "import { parseControlSignalCandidate, type ControlSignal } from '@panorama/shared/control-signals'\nimport { spawn } from 'node:child_process'\nimport { randomUUID } from 'node:crypto'\nimport { readFile, unlink } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport { BoundedOutputCapture } from '../process-output-capture.js'\n\nconst DEFAULT_SIGTERM_GRACE_MS = 5_000\nconst DEFAULT_OUTPUT_CAPTURE_BYTES = 5_000_000\nconst CONTROL_SIGNAL_PATH_ENV = 'PANORAMA_CONTROL_SIGNAL_PATH'\n\nexport type CommandExecutionResult = {\n status: 'succeeded' | 'failed' | 'timed_out' | 'cancelled'\n stdout: string\n stderr: string\n stdoutObservedBytes: number\n stderrObservedBytes: number\n stdoutCapturedBytes: number\n stderrCapturedBytes: number\n stdoutTruncated: boolean\n stderrTruncated: boolean\n outputCaptureBytes: number\n exitCode: number | null\n durationMs: number\n error: string | null\n}\n\nexport type ExecuteCommandOptions = {\n registerCancellation?: (cancel: (() => void) | null) => void\n env?: NodeJS.ProcessEnv\n outputCaptureBytes?: number\n}\n\nexport async function executeCommand(\n command: string,\n timeoutMs: number,\n options: ExecuteCommandOptions = {}\n): Promise<CommandExecutionResult> {\n const startedAt = Date.now()\n const outputCaptureBytes = options.outputCaptureBytes ?? DEFAULT_OUTPUT_CAPTURE_BYTES\n\n return await new Promise<CommandExecutionResult>((resolve) => {\n const child = spawn('bash', ['-lc', command], {\n stdio: ['ignore', 'pipe', 'pipe'],\n detached: true,\n env: options.env,\n })\n\n const stdoutOutput = new BoundedOutputCapture(outputCaptureBytes)\n const stderrOutput = new BoundedOutputCapture(outputCaptureBytes)\n let resolved = false\n let timedOut = false\n let spawnError: string | null = null\n let interrupted = false\n let forceKillHandle: NodeJS.Timeout | null = null\n\n const finish = (result: CommandExecutionResult) => {\n if (resolved) return\n resolved = true\n clearTimeout(timeoutHandle)\n if (forceKillHandle) {\n clearTimeout(forceKillHandle)\n forceKillHandle = null\n }\n options.registerCancellation?.(null)\n resolve(result)\n }\n\n const killProcessGroup = (signal: NodeJS.Signals) => {\n if (!child.pid) return\n try {\n process.kill(-child.pid, signal)\n } catch {\n try {\n child.kill(signal)\n } catch {\n // ignore best-effort kill failures\n }\n }\n }\n\n const scheduleForceKill = () => {\n if (forceKillHandle) return\n forceKillHandle = setTimeout(() => {\n forceKillHandle = null\n killProcessGroup('SIGKILL')\n }, DEFAULT_SIGTERM_GRACE_MS)\n forceKillHandle.unref()\n }\n\n const timeoutHandle = setTimeout(() => {\n if (resolved) return\n timedOut = true\n killProcessGroup('SIGTERM')\n scheduleForceKill()\n }, timeoutMs)\n\n options.registerCancellation?.(() => {\n if (resolved || interrupted) return\n interrupted = true\n killProcessGroup('SIGTERM')\n scheduleForceKill()\n })\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdoutOutput.append(chunk)\n })\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderrOutput.append(chunk)\n })\n\n child.on('error', (error) => {\n spawnError = error.message\n })\n\n child.on('close', (code) => {\n const stdout = stdoutOutput.readText()\n const stderr = stderrOutput.readText()\n const durationMs = Date.now() - startedAt\n const commonResult = {\n stdout,\n stderr,\n stdoutObservedBytes: stdoutOutput.observedBytes,\n stderrObservedBytes: stderrOutput.observedBytes,\n stdoutCapturedBytes: stdoutOutput.capturedBytes,\n stderrCapturedBytes: stderrOutput.capturedBytes,\n stdoutTruncated: stdoutOutput.truncated,\n stderrTruncated: stderrOutput.truncated,\n outputCaptureBytes,\n exitCode: code,\n durationMs,\n }\n\n if (timedOut) {\n finish({\n ...commonResult,\n status: 'timed_out',\n error: `Command timed out after ${timeoutMs}ms`,\n })\n return\n }\n\n if (interrupted) {\n finish({\n ...commonResult,\n status: 'cancelled',\n error: 'Command was interrupted because the managed gateway host was stopping.',\n })\n return\n }\n\n if (spawnError) {\n finish({\n ...commonResult,\n status: 'failed',\n error: spawnError,\n })\n return\n }\n\n finish({\n ...commonResult,\n status: code === 0 ? 'succeeded' : 'failed',\n error: code === 0 ? null : `Command exited with code ${code ?? 'unknown'}`,\n })\n })\n })\n}\n\nexport function buildManagedShellExecutionEnv(params: {\n baseEnv: NodeJS.ProcessEnv\n agentId: string\n cycleId: string | null\n toolExecutionUrl: string\n toolExecutionToken: string\n controlSignalPath: string\n}): NodeJS.ProcessEnv {\n const safeEnv: NodeJS.ProcessEnv = {}\n const passthroughKeys = [\n 'HOME',\n 'HOSTNAME',\n 'LANG',\n 'LC_ALL',\n 'LOGNAME',\n 'PATH',\n 'PWD',\n 'SHELL',\n 'SHLVL',\n 'TERM',\n 'TMPDIR',\n 'USER',\n ]\n\n for (const key of passthroughKeys) {\n const value = params.baseEnv[key]\n if (typeof value === 'string' && value.length > 0) {\n safeEnv[key] = value\n }\n }\n\n safeEnv.PANORAMA_AGENT_ID = params.agentId\n safeEnv.PANORAMA_TOOL_EXECUTION_URL = params.toolExecutionUrl\n safeEnv.PANORAMA_TOOL_EXECUTION_TOKEN = params.toolExecutionToken\n safeEnv[CONTROL_SIGNAL_PATH_ENV] = params.controlSignalPath\n\n if (params.cycleId) {\n safeEnv.PANORAMA_AGENT_CYCLE_ID = params.cycleId\n }\n\n return safeEnv\n}\n\nexport function buildControlSignalPath(executionId: string): string {\n return join(tmpdir(), `panorama-control-${executionId}-${randomUUID()}.json`)\n}\n\nexport async function readCommandControlSignal(path: string): Promise<ControlSignal | null> {\n try {\n const raw = await readFile(path, 'utf8')\n return parseControlSignalCandidate(JSON.parse(raw))\n } catch {\n return null\n } finally {\n try {\n await unlink(path)\n } catch {\n // best-effort cleanup\n }\n }\n}\n", "import {\n completeLinuxExecution,\n dispatchLinuxExecution,\n heartbeatLinuxHost,\n reconcileExecutionLifecycle,\n startLinuxExecution,\n} from './control-client.js'\nimport { createManagedRealtimeClient, startManagedRealtimeWakeLoop } from './realtime.js'\nimport { executeCommand } from './shell-execution.js'\n\nexport type ResolvedManagedGatewayRuntimeDependencies = {\n heartbeatLinuxHost: typeof heartbeatLinuxHost\n dispatchLinuxExecution: typeof dispatchLinuxExecution\n startLinuxExecution: typeof startLinuxExecution\n completeLinuxExecution: typeof completeLinuxExecution\n reconcileExecutionLifecycle: typeof reconcileExecutionLifecycle\n executeCommand: typeof executeCommand\n createRealtimeClient: typeof createManagedRealtimeClient\n startRealtimeWakeLoop: typeof startManagedRealtimeWakeLoop\n registerSignalHandlers: (onSignal: (signal: NodeJS.Signals) => void) => () => void\n}\n\nexport type ManagedGatewayRuntimeDependencies = Partial<ResolvedManagedGatewayRuntimeDependencies>\n\nconst defaultManagedGatewayRuntimeDependencies: ResolvedManagedGatewayRuntimeDependencies = {\n heartbeatLinuxHost,\n dispatchLinuxExecution,\n startLinuxExecution,\n completeLinuxExecution,\n reconcileExecutionLifecycle,\n executeCommand,\n createRealtimeClient: createManagedRealtimeClient,\n startRealtimeWakeLoop: startManagedRealtimeWakeLoop,\n registerSignalHandlers(onSignal) {\n process.once('SIGINT', onSignal)\n process.once('SIGTERM', onSignal)\n return () => {\n process.off('SIGINT', onSignal)\n process.off('SIGTERM', onSignal)\n }\n },\n}\n\nexport function resolveManagedGatewayRuntimeDependencies(\n dependencies: ManagedGatewayRuntimeDependencies = {}\n): ResolvedManagedGatewayRuntimeDependencies {\n return {\n ...defaultManagedGatewayRuntimeDependencies,\n ...dependencies,\n }\n}\n", "import type { ControlSignal } from '@panorama/shared/control-signals'\nimport type { LinuxHostClaimedExecution } from '@panorama/shared/linux-host-control/contract'\nimport process from 'node:process'\nimport type { ManagedGatewayRuntimeConfig } from './config.js'\nimport type { completeLinuxExecution, startLinuxExecution } from './control-client.js'\nimport {\n buildControlSignalPath,\n buildManagedShellExecutionEnv,\n executeCommand,\n readCommandControlSignal,\n type CommandExecutionResult,\n} from './shell-execution.js'\nimport {\n buildLinuxStepResultPayload,\n buildOutputCaptureMetadata,\n buildPreview,\n type LinuxExecutionCompletion,\n} from './step-result.js'\nimport { normalizeRecord, MANAGED_GATEWAY_LOG_PREFIX } from './runtime-utils.js'\n\nexport type ManagedExecutionOutcome = {\n reconciliationRequired: boolean\n wakeReason?: string\n}\n\nexport interface ExecuteManagedLinuxExecutionDependencies {\n startLinuxExecution: typeof startLinuxExecution\n completeLinuxExecution: typeof completeLinuxExecution\n executeCommand: typeof executeCommand\n}\n\nexport function resolveLinuxExecutionCompletion(\n result: CommandExecutionResult,\n controlSignal: ControlSignal | null\n): LinuxExecutionCompletion {\n if (result.status === 'succeeded') {\n return {\n stepStatus: 'completed',\n toolCallStatus: 'completed',\n controlSignal: controlSignal?.nextAction ?? 'continue',\n pauseDuration: controlSignal?.nextAction === 'pause' ? controlSignal.pauseDuration : undefined,\n }\n }\n\n if (result.status === 'failed') {\n return {\n stepStatus: 'failed',\n toolCallStatus: 'failed',\n controlSignal: 'continue',\n }\n }\n\n if (result.status === 'cancelled') {\n return {\n stepStatus: 'uncertain',\n toolCallStatus: 'failed',\n controlSignal: 'stop',\n uncertaintyReason: 'linux_execution_cancelled_after_start',\n }\n }\n\n return {\n stepStatus: 'uncertain',\n toolCallStatus: 'failed',\n controlSignal: 'stop',\n uncertaintyReason: 'linux_execution_timed_out_after_start',\n }\n}\n\nexport async function executeManagedLinuxExecution(params: {\n config: ManagedGatewayRuntimeConfig\n execution: LinuxHostClaimedExecution\n registerCancellation: (cancel: (() => void) | null) => void\n onExecutionStarted?: (executionId: string) => void\n onExecutionFinished?: () => void\n dependencies: ExecuteManagedLinuxExecutionDependencies\n}): Promise<ManagedExecutionOutcome> {\n const { config } = params\n const { dependencies } = params\n const claimToken = params.execution.claim_token\n if (!claimToken) {\n throw new Error(`Managed execution ${params.execution.id} is missing claim token`)\n }\n\n const startedExecution = await dependencies.startLinuxExecution({\n controlUrl: config.hostControlUrl,\n controlToken: config.hostControlToken,\n runtimeId: config.runtimeId,\n executionId: params.execution.id,\n claimToken,\n controlTimeoutMs: config.controlTimeoutMs,\n })\n\n if (!startedExecution?.id) {\n console.warn(`${MANAGED_GATEWAY_LOG_PREFIX} managed execution disappeared before start acknowledgement`, {\n executionId: params.execution.id,\n })\n return {\n reconciliationRequired: true,\n wakeReason: 'start_ack_missing',\n }\n }\n\n const command = startedExecution.command\n const controlSignalPath = buildControlSignalPath(startedExecution.id)\n params.onExecutionStarted?.(startedExecution.id)\n\n let result: CommandExecutionResult\n try {\n result = await dependencies.executeCommand(command, config.execTimeoutMs, {\n env: buildManagedShellExecutionEnv({\n baseEnv: process.env,\n agentId: config.agentId,\n cycleId: startedExecution.cycle_id,\n toolExecutionUrl: config.toolExecutionUrl,\n toolExecutionToken: config.toolExecutionToken,\n controlSignalPath,\n }),\n outputCaptureBytes: config.outputCaptureBytes,\n registerCancellation: (cancel) => {\n params.registerCancellation(cancel)\n },\n })\n } finally {\n params.registerCancellation(null)\n params.onExecutionFinished?.()\n }\n\n const controlSignal = await readCommandControlSignal(controlSignalPath)\n const stdoutPreview = buildPreview(result.stdout)\n const stderrPreview = buildPreview(result.stderr)\n const stdoutCaptureMetadata = buildOutputCaptureMetadata('stdout', result)\n const stderrCaptureMetadata = buildOutputCaptureMetadata('stderr', result)\n const executionCompletion = resolveLinuxExecutionCompletion(result, controlSignal)\n const stepResult = buildLinuxStepResultPayload({\n executionId: startedExecution.id,\n command,\n result,\n completion: executionCompletion,\n executionMetadata: startedExecution.metadata,\n })\n\n const completion = await dependencies.completeLinuxExecution({\n controlUrl: config.hostControlUrl,\n controlToken: config.hostControlToken,\n runtimeId: config.runtimeId,\n executionId: startedExecution.id,\n claimToken,\n executionStatus: result.status,\n exitCode: result.exitCode,\n durationMs: result.durationMs,\n stdout: result.stdout,\n stderr: result.stderr,\n error: result.error,\n executionMetadata: {\n ...normalizeRecord(startedExecution.metadata),\n runtime_id: config.runtimeId,\n claim_token: claimToken,\n started_by_gateway_mode: 'managed',\n stdout_preview_truncated: stdoutPreview.truncated,\n stderr_preview_truncated: stderrPreview.truncated,\n ...stdoutCaptureMetadata,\n ...stderrCaptureMetadata,\n },\n stepStatus: executionCompletion.stepStatus,\n stepResult,\n stepError: result.error,\n stepUncertaintyReason: executionCompletion.uncertaintyReason ?? null,\n controlSignal: executionCompletion.controlSignal,\n controlTimeoutMs: config.controlTimeoutMs,\n })\n\n if (!completion?.run_id) {\n console.warn(\n `${MANAGED_GATEWAY_LOG_PREFIX} execution was no longer active for this gateway when finalizing step; skipping follow-up`,\n {\n executionId: startedExecution.id,\n runId: completion?.run_id ?? null,\n stepUpdated: completion?.step_updated ?? null,\n }\n )\n return {\n reconciliationRequired: true,\n wakeReason: 'completion_followup_reconcile',\n }\n }\n\n if (completion.step_updated === false) {\n console.warn(\n `${MANAGED_GATEWAY_LOG_PREFIX} execution completed but the linked step was not updated; control plane recovery was queued`,\n {\n executionId: startedExecution.id,\n runId: completion.run_id,\n stepUpdated: completion.step_updated,\n }\n )\n return {\n reconciliationRequired: true,\n wakeReason: 'completion_step_reconcile',\n }\n }\n\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} completed managed command`, {\n executionId: startedExecution.id,\n status: result.status,\n runId: completion.run_id,\n })\n\n return { reconciliationRequired: false }\n}\n", "const RESERVED_TOOL_RESULT_METADATA_KEYS = new Set([\n 'log_type',\n 'actor',\n 'row_role',\n 'tool_name',\n 'tool_color',\n 'execution_time',\n 'action_summary',\n 'summary_pending',\n 'summary_state',\n 'tool_cost',\n 'cycle_id',\n 'run_id',\n 'tool_call_id',\n 'message_id',\n 'step_index',\n 'cycle_timeline',\n 'summary_started_at',\n 'summary_completed_at',\n 'summary_duration_ms',\n 'summary_error',\n 'tool_call_link_missing',\n 'original_type',\n]);\nfunction appendIfDefined(target, key, value) {\n if (value !== undefined && value !== null) {\n target[key] = value;\n }\n}\nfunction appendExtraMetadata(target, extraMetadata) {\n if (!extraMetadata)\n return;\n for (const [key, value] of Object.entries(extraMetadata)) {\n if (RESERVED_TOOL_RESULT_METADATA_KEYS.has(key)) {\n continue;\n }\n if (value !== undefined) {\n target[key] = value;\n }\n }\n}\nexport function buildCycleStepToolResultMetadata(params) {\n const metadata = {\n log_type: params.logType ?? 'agent_cycle',\n actor: params.actor ?? 'agent',\n row_role: 'tool_result',\n tool_name: params.toolName,\n };\n appendIfDefined(metadata, 'tool_color', params.toolColor);\n appendIfDefined(metadata, 'execution_time', params.executionTimeMs);\n appendIfDefined(metadata, 'action_summary', params.actionSummary);\n if (params.summaryPending === true) {\n metadata.summary_pending = true;\n }\n appendIfDefined(metadata, 'summary_state', params.summaryState ?? (params.summaryPending === true ? 'pending' : null));\n appendIfDefined(metadata, 'tool_cost', params.toolCost);\n appendIfDefined(metadata, 'cycle_id', params.cycleId);\n appendIfDefined(metadata, 'run_id', params.runId);\n appendIfDefined(metadata, 'message_id', params.messageId);\n appendIfDefined(metadata, 'step_index', params.stepIndex);\n appendIfDefined(metadata, 'cycle_timeline', params.cycleTimeline);\n appendIfDefined(metadata, 'summary_started_at', params.summaryStartedAt);\n appendIfDefined(metadata, 'summary_completed_at', params.summaryCompletedAt);\n appendIfDefined(metadata, 'summary_duration_ms', params.summaryDurationMs);\n appendIfDefined(metadata, 'summary_error', params.summaryError);\n if (typeof params.toolCallId === 'string' && params.toolCallId.length > 0) {\n metadata.tool_call_id = params.toolCallId;\n }\n else {\n metadata.tool_call_link_missing = true;\n metadata.original_type = 'tool_call';\n }\n appendExtraMetadata(metadata, params.extraMetadata);\n return metadata;\n}\nexport function buildCycleStepToolResultLog(params) {\n return {\n content: params.content,\n ...(params.formattedContent !== undefined ? { formattedContent: params.formattedContent } : {}),\n timestamp: params.timestamp,\n ...(params.type !== undefined ? { type: params.type } : {}),\n ...(params.title !== undefined ? { title: params.title } : {}),\n ...(params.summary !== undefined ? { summary: params.summary } : {}),\n metadata: buildCycleStepToolResultMetadata(params),\n isExpandable: params.isExpandable ?? true,\n ...(params.cost !== undefined ? { cost: params.cost } : {}),\n };\n}\nexport function buildCycleStepToolCallArtifact(params) {\n return {\n toolName: params.toolName,\n parameters: params.parameters,\n result: params.result,\n status: params.status,\n timestamp: params.timestamp,\n };\n}\nexport function buildCycleStepArtifacts(params) {\n return {\n log: buildCycleStepToolResultLog(params.log),\n ...(params.toolCall ? { toolCall: buildCycleStepToolCallArtifact(params.toolCall) } : {}),\n };\n}\n", "import { buildCycleStepArtifacts } from '@panorama/shared/cycle-step-artifacts'\nimport { createEventLogEntry } from '@panorama/shared/utils'\nimport type { CommandExecutionResult } from './shell-execution.js'\n\nconst PREVIEW_TOTAL_CHARS = 1_000\nconst PREVIEW_EDGE_CHARS = 500\nconst LINUX_SHELL_TOOL_NAME = 'shell.command'\n\nexport type LinuxStepTerminalStatus = 'completed' | 'failed' | 'uncertain'\n\nexport type LinuxExecutionCompletion = {\n stepStatus: LinuxStepTerminalStatus\n toolCallStatus: 'completed' | 'failed'\n controlSignal: 'continue' | 'pause' | 'stop'\n pauseDuration?: number\n uncertaintyReason?: string\n}\n\ntype LinuxExecutionFailureClassification =\n | 'panorama_cli_usage_error'\n | 'command_not_found'\n | 'shell_syntax_error'\n | 'linux_execution_timed_out'\n | 'linux_execution_cancelled'\n | 'runtime_execution_error'\n\nexport function buildPreview(text: string): { preview: string | null; truncated: boolean } {\n if (!text) {\n return { preview: null, truncated: false }\n }\n\n if (text.length <= PREVIEW_TOTAL_CHARS) {\n return { preview: text, truncated: false }\n }\n\n const head = text.slice(0, PREVIEW_EDGE_CHARS)\n const tail = text.slice(-PREVIEW_EDGE_CHARS)\n return {\n preview: `${head}\\n...\\n${tail}`,\n truncated: true,\n }\n}\n\nfunction buildOutputCaptureNotice(\n stream: 'stdout' | 'stderr',\n result: CommandExecutionResult\n): string | null {\n const truncated = stream === 'stdout' ? result.stdoutTruncated : result.stderrTruncated\n if (!truncated) {\n return null\n }\n\n const capturedBytes =\n stream === 'stdout' ? result.stdoutCapturedBytes : result.stderrCapturedBytes\n return [\n `${stream} exceeded the managed runtime capture limit of ${result.outputCaptureBytes} bytes.`,\n `Only the first ${capturedBytes} bytes were sent to Panorama.`,\n 'Exact full output is unavailable unless the command wrote it to a file.',\n ].join('\\n')\n}\n\nexport function buildOutputCaptureMetadata(\n stream: 'stdout' | 'stderr',\n result: CommandExecutionResult\n): Record<string, unknown> {\n const observedBytes =\n stream === 'stdout' ? result.stdoutObservedBytes : result.stderrObservedBytes\n const capturedBytes =\n stream === 'stdout' ? result.stdoutCapturedBytes : result.stderrCapturedBytes\n const truncated = stream === 'stdout' ? result.stdoutTruncated : result.stderrTruncated\n const notice = buildOutputCaptureNotice(stream, result)\n\n return {\n [`${stream}_observed_bytes`]: observedBytes,\n [`${stream}_captured_bytes`]: capturedBytes,\n [`${stream}_capture_limit_bytes`]: result.outputCaptureBytes,\n [`${stream}_runtime_truncated`]: truncated,\n ...(notice\n ? {\n [`${stream}_capture_notice`]: notice,\n [`${stream}_overflow_notice`]: notice,\n }\n : {}),\n }\n}\n\nfunction summarizeCommand(command: string): string {\n const flattened = command.replace(/\\s+/g, ' ').trim()\n return flattened.length > 120 ? `${flattened.slice(0, 117)}...` : flattened\n}\n\nfunction classifyLinuxExecutionFailure(params: {\n command: string\n result: CommandExecutionResult\n}): {\n classification: LinuxExecutionFailureClassification\n failureMessage: string\n} {\n const stderr = params.result.stderr.trim()\n const stderrFirstLine = stderr.split(/\\r?\\n/).find((line) => line.trim().length > 0)?.trim() ?? ''\n const stderrLower = stderr.toLowerCase()\n const commandStartsWithPanorama = params.command.trim().startsWith('panorama ')\n\n if (params.result.status === 'timed_out') {\n return {\n classification: 'linux_execution_timed_out',\n failureMessage: params.result.error || 'Linux shell command timed out before completion.',\n }\n }\n\n if (params.result.status === 'cancelled') {\n return {\n classification: 'linux_execution_cancelled',\n failureMessage: params.result.error || 'Linux shell command was cancelled before completion.',\n }\n }\n\n if (params.result.exitCode === 127 || stderrLower.includes('command not found')) {\n return {\n classification: 'command_not_found',\n failureMessage: stderrFirstLine || 'Linux shell command referenced a command that was not found.',\n }\n }\n\n if (\n stderrLower.includes('syntax error') ||\n stderrLower.includes('unexpected eof') ||\n stderrLower.includes('unexpected token')\n ) {\n return {\n classification: 'shell_syntax_error',\n failureMessage: stderrFirstLine || 'Linux shell command failed shell syntax validation.',\n }\n }\n\n if (\n commandStartsWithPanorama &&\n (stderrLower.includes('unknown option') ||\n stderrLower.includes('unknown argument') ||\n stderrLower.includes('missing required argument') ||\n stderrLower.includes('too many arguments') ||\n stderrLower.includes('invalid value for'))\n ) {\n return {\n classification: 'panorama_cli_usage_error',\n failureMessage: stderrFirstLine || 'Panorama CLI command used invalid arguments.',\n }\n }\n\n return {\n classification: 'runtime_execution_error',\n failureMessage:\n stderrFirstLine ||\n params.result.error ||\n 'Linux shell command failed during execution for an unspecified reason.',\n }\n}\n\nexport function buildLinuxStepResultPayload(params: {\n executionId: string\n command: string\n result: CommandExecutionResult\n completion: LinuxExecutionCompletion\n executionMetadata?: Record<string, unknown> | null\n}): Record<string, unknown> {\n const statusLabel =\n params.result.status === 'succeeded'\n ? 'succeeded'\n : params.result.status === 'timed_out'\n ? 'timed out'\n : params.result.status === 'cancelled'\n ? 'cancelled'\n : 'failed'\n\n const stdoutPreview = buildPreview(params.result.stdout)\n const stderrPreview = buildPreview(params.result.stderr)\n const stdoutCaptureMetadata = buildOutputCaptureMetadata('stdout', params.result)\n const stderrCaptureMetadata = buildOutputCaptureMetadata('stderr', params.result)\n const failureDetails =\n params.result.status === 'succeeded'\n ? null\n : classifyLinuxExecutionFailure({\n command: params.command,\n result: params.result,\n })\n const responseContent: Record<string, unknown> = {\n status: params.result.status,\n exit_code: params.result.exitCode,\n duration_ms: params.result.durationMs,\n stdout_preview: stdoutPreview.preview,\n stderr_preview: stderrPreview.preview,\n execution_id: params.executionId,\n command: params.command,\n ...stdoutCaptureMetadata,\n ...stderrCaptureMetadata,\n }\n\n if (params.result.error) {\n responseContent.error = params.result.error\n }\n\n if (failureDetails) {\n responseContent.failure_classification = failureDetails.classification\n responseContent.failure_message = failureDetails.failureMessage\n }\n\n const rawResponse: Record<string, unknown> = {\n success: params.result.status === 'succeeded',\n content: responseContent,\n metadata: {\n executionTime: params.result.durationMs,\n execution_id: params.executionId,\n agent_runtime: 'linux',\n stdout_preview_truncated: stdoutPreview.truncated,\n stderr_preview_truncated: stderrPreview.truncated,\n ...stdoutCaptureMetadata,\n ...stderrCaptureMetadata,\n ...(failureDetails\n ? {\n failure_classification: failureDetails.classification,\n failure_message: failureDetails.failureMessage,\n workflow_failure_classification: failureDetails.classification,\n }\n : {}),\n },\n }\n\n const stepIndex =\n typeof params.executionMetadata?.step_index === 'number' &&\n Number.isFinite(params.executionMetadata.step_index)\n ? params.executionMetadata.step_index\n : null\n\n if (params.result.error) {\n rawResponse.error = params.result.error\n }\n\n const eventContent = JSON.stringify(\n createEventLogEntry(\n 'tool_call',\n {\n raw_tool_name: LINUX_SHELL_TOOL_NAME,\n resolved_tool_name: LINUX_SHELL_TOOL_NAME,\n raw_parameters: {\n command: params.command,\n },\n raw_response: rawResponse,\n success: params.result.status === 'succeeded',\n execution_time: params.result.durationMs,\n },\n {\n toolName: LINUX_SHELL_TOOL_NAME,\n actor: 'agent',\n error: params.result.error ?? undefined,\n }\n )\n )\n\n const formattedParts = [\n 'Request Parameters:',\n JSON.stringify({ command: params.command }, null, 2),\n '',\n 'Response:',\n JSON.stringify(responseContent, null, 2),\n ]\n\n const artifactTimestamp = new Date().toISOString()\n const { log: stepLog, toolCall: toolCallArtifact } = buildCycleStepArtifacts({\n log: {\n content: eventContent,\n formattedContent: formattedParts.join('\\n'),\n timestamp: artifactTimestamp,\n type: 'system_event',\n title: 'Shell Command',\n summary: `shell ${statusLabel}: ${summarizeCommand(params.command)}`,\n toolName: LINUX_SHELL_TOOL_NAME,\n executionTimeMs: params.result.durationMs,\n actionSummary: 'ran shell command',\n summaryPending: true,\n stepIndex: typeof stepIndex === 'number' ? stepIndex : null,\n extraMetadata: {\n agent_runtime: 'linux',\n execution_id: params.executionId,\n command: params.command,\n status: params.result.status,\n exit_code: params.result.exitCode,\n duration_ms: params.result.durationMs,\n ...stdoutCaptureMetadata,\n ...stderrCaptureMetadata,\n ...(failureDetails\n ? {\n failure_classification: failureDetails.classification,\n failure_message: failureDetails.failureMessage,\n workflow_failure_classification: failureDetails.classification,\n }\n : {}),\n },\n },\n toolCall: {\n toolName: LINUX_SHELL_TOOL_NAME,\n parameters: {\n command: params.command,\n },\n result: responseContent,\n status: params.completion.toolCallStatus,\n timestamp: artifactTimestamp,\n },\n })\n\n const controlSignal: Record<string, unknown> = {\n nextAction: params.completion.controlSignal,\n }\n const pauseDuration =\n params.completion.controlSignal === 'pause' &&\n typeof params.completion.pauseDuration === 'number' &&\n Number.isFinite(params.completion.pauseDuration) &&\n params.completion.pauseDuration > 0\n ? params.completion.pauseDuration\n : undefined\n\n if (typeof pauseDuration === 'number') {\n controlSignal.pauseDuration = pauseDuration\n }\n\n return {\n toolName: LINUX_SHELL_TOOL_NAME,\n result: responseContent,\n logs: [stepLog],\n toolCalls: toolCallArtifact ? [toolCallArtifact] : [],\n nextAction: params.completion.controlSignal,\n ...(pauseDuration ? { pauseDuration } : {}),\n controlSignal,\n controlSignals: [controlSignal],\n }\n}\n", "import { setTimeout as sleep } from 'node:timers/promises'\nimport { asError, MANAGED_GATEWAY_LOG_PREFIX } from './runtime-utils.js'\n\nexport function startHostHeartbeatLoop(params: {\n intervalMs: number\n maxConsecutiveFailures: number\n heartbeatHost: () => Promise<void>\n onFatalFailure: (error: Error) => void\n}): () => void {\n let stopped = false\n let consecutiveFailures = 0\n const abortController = new AbortController()\n\n const loop = async () => {\n while (!stopped) {\n try {\n await sleep(params.intervalMs, undefined, { signal: abortController.signal })\n } catch (error) {\n if (abortController.signal.aborted) {\n break\n }\n throw error\n }\n if (stopped) {\n break\n }\n\n try {\n await params.heartbeatHost()\n consecutiveFailures = 0\n } catch (error) {\n consecutiveFailures += 1\n console.error(`${MANAGED_GATEWAY_LOG_PREFIX} failed to heartbeat managed host`, {\n consecutiveFailures,\n error,\n })\n\n if (consecutiveFailures >= params.maxConsecutiveFailures) {\n params.onFatalFailure(asError(error))\n return\n }\n }\n }\n }\n\n void loop()\n\n return () => {\n stopped = true\n abortController.abort()\n }\n}\n", "export function createWakeSignal(initialReason: string): {\n requestWake: (reason: string) => void\n waitForWake: () => Promise<string>\n} {\n let pending = true\n let pendingReason = initialReason\n let resolver: (() => void) | null = null\n\n return {\n requestWake(reason: string) {\n pendingReason = reason\n if (pending) {\n return\n }\n\n pending = true\n if (resolver) {\n const resolve = resolver\n resolver = null\n resolve()\n }\n },\n async waitForWake() {\n if (!pending) {\n await new Promise<void>((resolve) => {\n resolver = resolve\n })\n }\n\n pending = false\n return pendingReason\n },\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * Shared utility functions\n */\n// Default truncation limit - 100k characters for individual logs\nconst DEFAULT_TRUNCATION_LIMIT = 100_000;\n/**\n * Constant-time string comparison to reduce timing side-channel leakage.\n */\nexport function constantTimeEquals(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n let result = 0;\n for (let i = 0; i < a.length; i += 1) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return result === 0;\n}\n/**\n * Escapes special characters in a string for safe use in PostgREST filter values.\n *\n * PostgREST filter syntax uses these characters with special meaning:\n * - Commas (,) to separate OR conditions\n * - Parentheses () for grouping\n * - Periods (.) as syntax delimiters\n * - Percent (%) and underscore (_) as ilike wildcards\n * - Backslash (\\) for escaping\n *\n * Without escaping, user input containing these characters can break filter\n * parsing (causing 400/500 errors) or potentially inject additional filter conditions.\n *\n * @param value The user-provided string to escape\n * @returns The escaped string safe for interpolation into PostgREST filters\n *\n * @example\n * // Safe usage in .or() filter:\n * const escaped = escapePostgrestFilterValue(searchText)\n * query.or(`field.ilike.%${escaped}%`)\n */\nexport function escapePostgrestFilterValue(value) {\n if (!value)\n return value;\n // Escape backslashes first (so we don't double-escape later escapes)\n // Then escape: comma, parentheses, period, ilike wildcards\n return value\n .replace(/\\\\/g, '\\\\\\\\') // Backslash -> \\\\\n .replace(/,/g, '\\\\,') // Comma -> \\,\n .replace(/\\(/g, '\\\\(') // ( -> \\(\n .replace(/\\)/g, '\\\\)') // ) -> \\)\n .replace(/%/g, '\\\\%') // % -> \\%\n .replace(/_/g, '\\\\_') // _ -> \\_\n .replace(/\\./g, '\\\\.'); // . -> \\.\n}\n/**\n * Truncate a string to a specified length, adding ellipsis if truncated\n * @param text The text to truncate\n * @param maxLength Maximum length (default: 100,000 chars)\n * @returns Truncated text with ellipsis if needed\n */\nexport function truncateText(text, maxLength = DEFAULT_TRUNCATION_LIMIT) {\n if (!text || text.length <= maxLength) {\n return text;\n }\n return text.substring(0, maxLength) + '...';\n}\n/**\n * Truncate text and return both the truncated text and a warning if truncated\n * @param text The text to truncate\n * @param maxLength Maximum length\n * @returns Object with truncated text and truncation warning\n */\nexport function truncateWithWarning(text, maxLength = DEFAULT_TRUNCATION_LIMIT) {\n if (!text || text.length <= maxLength) {\n return { text, truncated: false };\n }\n return {\n text: text.substring(0, maxLength) + '...',\n truncated: true,\n originalLength: text.length,\n };\n}\n/**\n * Truncate text for log summaries (shorter default)\n * @param text The text to truncate\n * @param maxLength Maximum length (default: 200 chars for summaries)\n * @returns Truncated text with ellipsis if needed\n */\nexport function truncateForSummary(text, maxLength = 200) {\n return truncateText(text, maxLength);\n}\n/**\n * Configuration for truncation limits\n */\nexport const TRUNCATION_LIMITS = {\n // Full content - 100k characters for individual logs\n FULL_CONTENT: DEFAULT_TRUNCATION_LIMIT,\n // Log summaries - reasonable for UI display\n LOG_SUMMARY: 200,\n // Tool parameters in console logs only\n TOOL_PARAMS: 100,\n // Context logs - 100k characters\n CONTEXT_LOGS: DEFAULT_TRUNCATION_LIMIT,\n // Individual log content - 100k characters\n LOG_CONTENT: DEFAULT_TRUNCATION_LIMIT,\n // AI-generated summaries from query_logs_summary tool - 100k characters\n AI_SUMMARY: DEFAULT_TRUNCATION_LIMIT,\n};\nfunction normalizeAndTruncateEventString(value, maxLength) {\n const normalized = normalizeEventText(value);\n if (normalized.length <= maxLength) {\n return { value: normalized, truncated: false };\n }\n return {\n value: `${normalized.substring(0, maxLength)}...`,\n truncated: true,\n originalLength: normalized.length,\n };\n}\nfunction isDisallowedControlChar(codePoint) {\n return ((codePoint >= 0x00 && codePoint <= 0x08) ||\n codePoint === 0x0b ||\n codePoint === 0x0c ||\n (codePoint >= 0x0e && codePoint <= 0x1f) ||\n codePoint === 0x7f);\n}\nfunction normalizeEventText(value) {\n const withNormalizedLineEndings = value.replace(/\\r\\n|\\r/g, '\\n');\n let output = '';\n for (let index = 0; index < withNormalizedLineEndings.length; index += 1) {\n const codePoint = withNormalizedLineEndings.charCodeAt(index);\n if (isDisallowedControlChar(codePoint))\n continue;\n output += withNormalizedLineEndings[index];\n }\n return output;\n}\n/**\n * Truncate all string values in an object recursively with warnings\n * @param obj The object to process\n * @param maxLength Maximum length for string values\n * @returns Processed object with truncation warnings\n */\nexport function truncateEventData(obj, maxLength = DEFAULT_TRUNCATION_LIMIT) {\n if (!obj || typeof obj !== 'object') {\n if (typeof obj === 'string') {\n const normalized = normalizeAndTruncateEventString(obj, maxLength);\n if (normalized.truncated) {\n return {\n value: normalized.value,\n truncation_warning: `Truncated from ${normalized.originalLength} to ${maxLength} characters`,\n };\n }\n return normalized.value;\n }\n return obj;\n }\n if (Array.isArray(obj)) {\n // Handle arrays\n return obj.map((item) => truncateEventData(item, maxLength));\n }\n // Handle objects\n const result = {};\n const warnings = {};\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === 'string') {\n const normalized = normalizeAndTruncateEventString(value, maxLength);\n result[key] = normalized.value;\n if (normalized.truncated) {\n warnings[key] = `Truncated from ${normalized.originalLength} to ${maxLength} characters`;\n }\n }\n else if (typeof value === 'object' && value !== null) {\n const processed = truncateEventData(value, maxLength);\n result[key] = processed;\n }\n else {\n result[key] = value;\n }\n }\n // Add warnings if any truncation occurred\n if (Object.keys(warnings).length > 0) {\n result.truncation_warning = warnings;\n }\n return result;\n}\n/**\n * Create a standardized event log entry with automatic truncation\n * @param eventType The type of event\n * @param data The event data\n * @param options Optional settings\n * @returns Formatted event data ready for storage\n */\nexport function createEventLogEntry(eventType, data, options) {\n const event = {\n event_type: eventType,\n };\n // Add optional fields\n if (options?.toolName) {\n event.tool_name = options.toolName;\n }\n if (options?.actor) {\n event.actor = options.actor;\n }\n if (options?.error) {\n const normalizedError = normalizeAndTruncateEventString(options.error, DEFAULT_TRUNCATION_LIMIT);\n event.error = normalizedError.value;\n }\n // Truncate all string data in the event\n event.data = truncateEventData(data);\n return event;\n}\n/**\n * Format a relative timestamp for display (e.g., \"2 minutes ago\")\n * @param date The date to format\n * @param now The current date for comparison (defaults to new Date())\n * @returns Formatted relative timestamp string\n */\nexport function formatRelativeTimestamp(date, now = new Date()) {\n const seconds = Math.floor((now.getTime() - date.getTime()) / 1000);\n if (seconds < 60) {\n return seconds === 1 ? '1 second ago' : `${seconds} seconds ago`;\n }\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n return minutes === 1 ? '1 minute ago' : `${minutes} minutes ago`;\n }\n const hours = Math.floor(minutes / 60);\n if (hours < 24) {\n return hours === 1 ? '1 hour ago' : `${hours} hours ago`;\n }\n const days = Math.floor(hours / 24);\n return days === 1 ? '1 day ago' : `${days} days ago`;\n}\nexport function normalizeSubscriptionPath(path) {\n const raw = (path ?? '').trim();\n if (!raw)\n return '/';\n const withLeadingSlash = raw.startsWith('/') ? raw : `/${raw}`;\n const collapsed = withLeadingSlash.replace(/\\/{2,}/g, '/');\n if (collapsed.length > 1 && collapsed.endsWith('/')) {\n return collapsed.slice(0, -1);\n }\n return collapsed;\n}\n/**\n * Match a subscription path glob against an event's resource_path.\n *\n * Supports:\n * - `/` => matches all paths\n * - `*` => matches a single path segment\n * - `**` => matches across segments (including `/`)\n *\n * Examples:\n * - subscription `/` matches `/` and `/threads/123`\n * - subscription `/threads/*` matches `/threads/123`\n * - subscription `/threads/**` matches `/threads/123/messages/456`\n */\n/**\n * Type guard: returns true if `value` is a non-null, non-array object.\n */\nexport function isRecord(value) {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n/**\n * Returns `value` as a record if it is a non-null, non-array object, or null otherwise.\n */\nexport function asRecord(value) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n return value;\n}\n/**\n * Returns `value` as a trimmed string if non-empty, or null otherwise.\n */\nexport function readString(value) {\n return typeof value === 'string' && value.trim().length > 0 ? value : null;\n}\nexport function matchSubscriptionPath(subscriptionPath, resourcePath) {\n const pattern = normalizeSubscriptionPath(subscriptionPath);\n const path = normalizeSubscriptionPath(resourcePath);\n if (pattern === '/')\n return true;\n // Build a regex from the glob pattern.\n // - `**` -> `.*`\n // - `*` -> `[^/]+`\n let regexSource = '^';\n for (let index = 0; index < pattern.length; index++) {\n const ch = pattern[index];\n if (ch === '*') {\n const next = pattern[index + 1];\n if (next === '*') {\n regexSource += '.*';\n index++;\n }\n else {\n regexSource += '[^/]+';\n }\n continue;\n }\n // Escape regex metacharacters.\n const regexMetacharacters = '\\\\^$.*+?()[]{}|';\n if (regexMetacharacters.includes(ch)) {\n regexSource += `\\\\${ch}`;\n }\n else {\n regexSource += ch;\n }\n }\n regexSource += '$';\n return new RegExp(regexSource).test(path);\n}\n", "import { isGatewayHostAvailable, validateGatewayCapabilitiesV1 } from './capabilities.js';\nexport const GATEWAY_HEARTBEAT_STALE_MS = 90_000;\nexport const GATEWAY_RUNTIME_STATUSES = ['pending', 'ready', 'offline', 'error'];\nconst GATEWAY_RUNTIME_STATUS_SET = new Set(GATEWAY_RUNTIME_STATUSES);\nexport function normalizeGatewayRuntimeStatus(value) {\n if (typeof value !== 'string')\n return null;\n const normalized = value.trim().toLowerCase();\n if (!GATEWAY_RUNTIME_STATUS_SET.has(normalized)) {\n return null;\n }\n return normalized;\n}\nexport function isGatewayHeartbeatFresh(lastSeenAt, options) {\n if (!lastSeenAt)\n return false;\n const lastSeenMs = Date.parse(lastSeenAt);\n if (!Number.isFinite(lastSeenMs))\n return false;\n const nowMs = options?.nowMs ?? Date.now();\n const staleMs = options?.staleMs ?? GATEWAY_HEARTBEAT_STALE_MS;\n return nowMs - lastSeenMs <= staleMs;\n}\nexport function getGatewayHostAvailability(capabilities) {\n const parsed = validateGatewayCapabilitiesV1(capabilities ?? null);\n if (!parsed.ok)\n return null;\n return isGatewayHostAvailable(parsed.value);\n}\nexport function deriveGatewayLiveness(params) {\n const rawStatus = normalizeGatewayRuntimeStatus(params.status);\n const heartbeatFresh = isGatewayHeartbeatFresh(params.lastSeenAt ?? null, {\n nowMs: params.nowMs,\n staleMs: params.staleMs,\n });\n const hostAvailable = getGatewayHostAvailability(params.capabilities ?? null);\n const online = rawStatus === 'ready' && heartbeatFresh && hostAvailable === true;\n const effectiveStatus = rawStatus === 'ready' ? (online ? 'ready' : 'offline') : rawStatus;\n return {\n rawStatus,\n effectiveStatus,\n heartbeatFresh,\n hostAvailable,\n online,\n };\n}\n", "import { isRecord } from '../utils.js';\nimport { deriveGatewayLiveness } from './liveness.js';\nexport const GATEWAY_CAPABILITIES_SCHEMA_VERSION = 'v1';\nexport const GATEWAY_PROVIDER_IDS = ['claude_code', 'codex', 'gemini'];\nexport const GATEWAY_SERVICE_IDS = [\n 'model_execution',\n 'remote_shell',\n 'machine_control',\n];\nexport function createEmptyGatewayCapabilitiesV1(params) {\n const providers = Object.fromEntries(GATEWAY_PROVIDER_IDS.map((id) => [\n id,\n {\n available: false,\n supports: {\n output_schema: false,\n stream_json: false,\n tool_disable: false,\n },\n },\n ]));\n const host = {\n kind: 'gateway',\n available: params?.hostAvailable ?? true,\n };\n if (params?.hostLabel) {\n host.label = params.hostLabel;\n }\n return {\n schema_version: GATEWAY_CAPABILITIES_SCHEMA_VERSION,\n providers,\n hosts: { gateway: host },\n services: {\n model_execution: { ready: false },\n remote_shell: { ready: host.available },\n machine_control: { ready: false },\n },\n };\n}\nexport function validateGatewayCapabilitiesV1(value) {\n if (!isRecord(value)) {\n return { ok: false, error: 'capabilities must be an object' };\n }\n if (value.schema_version !== GATEWAY_CAPABILITIES_SCHEMA_VERSION) {\n return {\n ok: false,\n error: `schema_version must be \"${GATEWAY_CAPABILITIES_SCHEMA_VERSION}\"`,\n };\n }\n const providers = value.providers;\n if (!isRecord(providers)) {\n return { ok: false, error: 'providers must be an object' };\n }\n for (const key of Object.keys(providers)) {\n if (!GATEWAY_PROVIDER_IDS.includes(key)) {\n return { ok: false, error: `providers.${key} is not supported` };\n }\n }\n for (const providerId of GATEWAY_PROVIDER_IDS) {\n const entry = providers[providerId];\n if (!isRecord(entry)) {\n return { ok: false, error: `providers.${providerId} must be an object` };\n }\n if (typeof entry.available !== 'boolean') {\n return { ok: false, error: `providers.${providerId}.available must be boolean` };\n }\n const supports = entry.supports;\n if (!isRecord(supports)) {\n return { ok: false, error: `providers.${providerId}.supports must be an object` };\n }\n const requiredSupports = [\n 'output_schema',\n 'stream_json',\n 'tool_disable',\n ];\n for (const supportKey of requiredSupports) {\n if (typeof supports[supportKey] !== 'boolean') {\n return {\n ok: false,\n error: `providers.${providerId}.supports.${supportKey} must be boolean`,\n };\n }\n }\n if (entry.supported_flags !== undefined && !isBooleanRecord(entry.supported_flags)) {\n return {\n ok: false,\n error: `providers.${providerId}.supported_flags must be a boolean map`,\n };\n }\n if (entry.extensions !== undefined && !isStringArray(entry.extensions)) {\n return { ok: false, error: `providers.${providerId}.extensions must be string[]` };\n }\n if (entry.health !== undefined) {\n const health = entry.health;\n if (!isRecord(health)) {\n return { ok: false, error: `providers.${providerId}.health must be an object` };\n }\n if (!isGatewayHealthStatus(health.status)) {\n return { ok: false, error: `providers.${providerId}.health.status is invalid` };\n }\n if (!isGatewayHealthCheckType(health.check_type)) {\n return { ok: false, error: `providers.${providerId}.health.check_type is invalid` };\n }\n if (typeof health.checked_at !== 'string') {\n return { ok: false, error: `providers.${providerId}.health.checked_at must be string` };\n }\n if (health.last_full_checked_at !== undefined && typeof health.last_full_checked_at !== 'string') {\n return {\n ok: false,\n error: `providers.${providerId}.health.last_full_checked_at must be string`,\n };\n }\n if (health.last_full_status !== undefined && !isGatewayHealthStatus(health.last_full_status)) {\n return { ok: false, error: `providers.${providerId}.health.last_full_status is invalid` };\n }\n if (health.error !== undefined && typeof health.error !== 'string') {\n return { ok: false, error: `providers.${providerId}.health.error must be string` };\n }\n if (health.model !== undefined && typeof health.model !== 'string') {\n return { ok: false, error: `providers.${providerId}.health.model must be string` };\n }\n if (health.duration_ms !== undefined && typeof health.duration_ms !== 'number') {\n return { ok: false, error: `providers.${providerId}.health.duration_ms must be number` };\n }\n }\n }\n const hosts = value.hosts;\n if (!isRecord(hosts)) {\n return { ok: false, error: 'hosts must be an object' };\n }\n if (!isRecord(hosts.gateway)) {\n return { ok: false, error: 'hosts.gateway must be an object' };\n }\n const gatewayHost = hosts.gateway;\n if (gatewayHost.kind !== 'gateway') {\n return { ok: false, error: 'hosts.gateway.kind must be \"gateway\"' };\n }\n if (typeof gatewayHost.available !== 'boolean') {\n return { ok: false, error: 'hosts.gateway.available must be boolean' };\n }\n if (gatewayHost.label !== undefined && typeof gatewayHost.label !== 'string') {\n return { ok: false, error: 'hosts.gateway.label must be string' };\n }\n if (gatewayHost.error !== undefined && typeof gatewayHost.error !== 'string') {\n return { ok: false, error: 'hosts.gateway.error must be string' };\n }\n if (gatewayHost.last_checked_at !== undefined && typeof gatewayHost.last_checked_at !== 'string') {\n return { ok: false, error: 'hosts.gateway.last_checked_at must be string' };\n }\n if (gatewayHost.metadata !== undefined && !isRecord(gatewayHost.metadata)) {\n return { ok: false, error: 'hosts.gateway.metadata must be an object' };\n }\n const services = value.services;\n if (!isRecord(services)) {\n return { ok: false, error: 'services must be an object' };\n }\n for (const serviceId of GATEWAY_SERVICE_IDS) {\n const entry = services[serviceId];\n if (!isRecord(entry)) {\n return { ok: false, error: `services.${serviceId} must be an object` };\n }\n if (typeof entry.ready !== 'boolean') {\n return { ok: false, error: `services.${serviceId}.ready must be boolean` };\n }\n if (entry.reason !== undefined && typeof entry.reason !== 'string') {\n return { ok: false, error: `services.${serviceId}.reason must be string` };\n }\n }\n if (value.runtime !== undefined) {\n const runtime = value.runtime;\n if (!isRecord(runtime)) {\n return { ok: false, error: 'runtime must be an object' };\n }\n if (typeof runtime.platform !== 'string') {\n return { ok: false, error: 'runtime.platform must be string' };\n }\n if (typeof runtime.arch !== 'string') {\n return { ok: false, error: 'runtime.arch must be string' };\n }\n if (typeof runtime.node_version !== 'string') {\n return { ok: false, error: 'runtime.node_version must be string' };\n }\n if (runtime.gateway_version !== undefined && typeof runtime.gateway_version !== 'string') {\n return { ok: false, error: 'runtime.gateway_version must be string' };\n }\n }\n return { ok: true, value: value };\n}\nexport function isGatewayHostAvailable(capabilities) {\n return capabilities?.hosts?.gateway?.available === true;\n}\nexport function getGatewayServiceCapability(capabilities, serviceId) {\n const services = capabilities?.services;\n if (!services || typeof services !== 'object') {\n return null;\n }\n const service = services[serviceId];\n if (!service || typeof service !== 'object') {\n return null;\n }\n return service;\n}\nexport function isGatewayServiceReady(capabilities, serviceId) {\n return getGatewayServiceCapability(capabilities, serviceId)?.ready === true;\n}\nexport const GATEWAY_MACHINE_CONTROL_REASONS = {\n resource_disabled: 'Resource machine control is disabled. Set full_control=true on the resource before running host commands.',\n gateway_disabled: 'Gateway machine control is disabled in Team Integrations.',\n install_disabled: 'Gateway host machine control is disabled. Run \"panorama-gateway full-control enable\" on the host.',\n service_unavailable: 'Gateway machine control service is unavailable.',\n};\nfunction normalizeOptionalBoolean(value) {\n return typeof value === 'boolean' ? value : null;\n}\nexport function deriveGatewayMachineControlState(params) {\n const resourceEnabled = normalizeOptionalBoolean(params.resourceEnabled);\n const gatewayEnabled = normalizeOptionalBoolean(params.gatewayEnabled);\n const installEnabled = normalizeOptionalBoolean(params.installEnabled);\n const serviceReady = normalizeOptionalBoolean(params.serviceReady);\n const resourceRequired = params.resourceEnabled !== undefined;\n const serviceRequired = params.serviceReady !== undefined;\n const failedReasonCode = resourceRequired && resourceEnabled !== true\n ? 'resource_disabled'\n : gatewayEnabled !== true\n ? 'gateway_disabled'\n : installEnabled !== true\n ? 'install_disabled'\n : serviceRequired && serviceReady !== true\n ? 'service_unavailable'\n : null;\n return {\n resourceEnabled,\n gatewayEnabled,\n installEnabled,\n serviceReady,\n effective: failedReasonCode == null,\n reasonCode: failedReasonCode,\n reason: failedReasonCode ? GATEWAY_MACHINE_CONTROL_REASONS[failedReasonCode] : null,\n };\n}\nexport class RemoteShellAdmissionError extends Error {\n code;\n parameter;\n constructor(params) {\n super(params.message, params.cause ? { cause: params.cause } : undefined);\n this.name = 'RemoteShellAdmissionError';\n this.code = params.code;\n this.parameter = params.parameter;\n }\n}\nfunction isPlainObject(value) {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\nfunction normalizeOptionalString(value) {\n if (typeof value !== 'string')\n return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\nfunction normalizeTimeoutMs(value, fallbackMs, maxMs) {\n const parsed = typeof value === 'number'\n ? value\n : typeof value === 'string'\n ? Number.parseInt(value, 10)\n : Number.NaN;\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return fallbackMs;\n }\n return Math.max(1, Math.min(maxMs, Math.round(parsed)));\n}\nfunction parseInstallFullControlFlag(capabilities) {\n if (!isPlainObject(capabilities))\n return null;\n const hosts = capabilities.hosts;\n if (!isPlainObject(hosts))\n return null;\n const gateway = hosts.gateway;\n if (!isPlainObject(gateway))\n return null;\n const metadata = gateway.metadata;\n if (!isPlainObject(metadata))\n return null;\n return typeof metadata.install_full_control_enabled === 'boolean'\n ? metadata.install_full_control_enabled\n : null;\n}\nexport function normalizeRemoteShellExecTimeout(value, fallbackMs, options) {\n return normalizeTimeoutMs(value, fallbackMs, options?.maxMs ?? 10 * 60_000);\n}\nexport function extractRemoteShellMetadata(resource) {\n const metadata = isPlainObject(resource.metadata) ? resource.metadata : {};\n const gatewayId = normalizeOptionalString(metadata.gateway_id);\n const vmId = normalizeOptionalString(metadata.vm_id);\n if (!gatewayId && !vmId) {\n throw new RemoteShellAdmissionError({\n code: 'invalid_parameter',\n parameter: 'resource_uri',\n message: 'Remote shell resource is missing metadata.gateway_id or metadata.vm_id',\n });\n }\n return {\n gatewayId,\n vmId,\n fullControl: metadata.full_control === true,\n };\n}\nexport async function resolveRemoteShellGatewayTarget(serviceClient, teamId, metadata) {\n if (metadata.vmId) {\n const { data, error } = await serviceClient\n .from('team_gateways')\n .select('id, vm_id')\n .eq('team_id', teamId)\n .eq('vm_id', metadata.vmId)\n .order('updated_at', { ascending: false })\n .limit(1)\n .maybeSingle();\n if (error) {\n throw new RemoteShellAdmissionError({\n code: 'database_error',\n message: 'Failed to resolve VM-backed remote shell gateway target',\n cause: error,\n });\n }\n if (!data?.id) {\n throw new RemoteShellAdmissionError({\n code: 'not_found',\n message: 'Remote shell gateway',\n });\n }\n return {\n gatewayId: data.id,\n vmId: normalizeOptionalString(data.vm_id),\n };\n }\n if (!metadata.gatewayId) {\n throw new RemoteShellAdmissionError({\n code: 'invalid_parameter',\n parameter: 'resource_uri',\n message: 'Remote shell resource is missing metadata.gateway_id',\n });\n }\n return {\n gatewayId: metadata.gatewayId,\n vmId: null,\n };\n}\nexport async function loadReadyRemoteShellGateway(serviceClient, teamId, target, options) {\n const { data, error } = await serviceClient\n .from('team_gateways')\n .select('id, status, last_seen_at, full_control_enabled, capabilities, vm_id')\n .eq('team_id', teamId)\n .eq('id', target.gatewayId)\n .maybeSingle();\n if (error) {\n throw new RemoteShellAdmissionError({\n code: 'database_error',\n message: 'Failed to load remote shell gateway',\n cause: error,\n });\n }\n if (!data) {\n throw new RemoteShellAdmissionError({\n code: 'not_found',\n message: 'Remote shell gateway',\n });\n }\n if (target.vmId && data.vm_id !== target.vmId) {\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: 'Remote shell VM guest gateway target changed during resolution',\n });\n }\n const liveness = deriveGatewayLiveness({\n status: data.status,\n lastSeenAt: data.last_seen_at,\n capabilities: data.capabilities,\n });\n if (liveness.rawStatus === 'offline') {\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: 'Remote shell gateway is offline or heartbeat is stale',\n });\n }\n if (liveness.rawStatus === 'error') {\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: 'Remote shell gateway is unavailable',\n });\n }\n if (liveness.rawStatus !== 'ready' || !liveness.online) {\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: 'Remote shell gateway is not ready yet',\n });\n }\n const parsedCapabilities = validateGatewayCapabilitiesV1(data.capabilities ?? null);\n if (!parsedCapabilities.ok) {\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: `Gateway capabilities invalid: ${parsedCapabilities.error}`,\n });\n }\n if (!isGatewayServiceReady(parsedCapabilities.value, 'remote_shell')) {\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: 'Remote shell service is unavailable on the selected gateway',\n });\n }\n const installFullControlEnabled = parseInstallFullControlFlag(data.capabilities);\n if (options?.requireFullControl === true) {\n const machineControl = deriveGatewayMachineControlState({\n gatewayEnabled: data.full_control_enabled === true,\n installEnabled: installFullControlEnabled,\n serviceReady: isGatewayServiceReady(parsedCapabilities.value, 'machine_control'),\n });\n if (!machineControl.effective) {\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: machineControl.reason ?? GATEWAY_MACHINE_CONTROL_REASONS.service_unavailable,\n });\n }\n }\n return {\n id: data.id,\n status: data.status,\n lastSeenAt: data.last_seen_at,\n fullControlEnabled: data.full_control_enabled === true,\n installFullControlEnabled,\n vmId: normalizeOptionalString(data.vm_id),\n };\n}\nexport async function admitRemoteShellExec(params) {\n const resourceTeamId = typeof params.resource.team_id === 'string' && params.resource.team_id.trim().length > 0\n ? params.resource.team_id\n : params.resolvedContext.teamId;\n if (resourceTeamId !== params.resolvedContext.teamId) {\n throw new RemoteShellAdmissionError({\n code: 'not_found',\n message: 'Remote shell resource',\n });\n }\n if (params.resource.resource_type !== 'remote_shell') {\n throw new RemoteShellAdmissionError({\n code: 'invalid_parameter',\n parameter: 'resource_uri',\n message: `Resource is not a remote shell target (found ${params.resource.resource_type})`,\n });\n }\n if (params.resolvedContext.scope === 'agent') {\n if (params.resource.scope !== 'agent' ||\n params.resource.owner_agent_id !== params.resolvedContext.ownerAgentId) {\n throw new RemoteShellAdmissionError({\n code: 'not_found',\n message: 'Remote shell resource',\n });\n }\n }\n else if (params.resource.scope !== 'team') {\n throw new RemoteShellAdmissionError({\n code: 'not_found',\n message: 'Remote shell resource',\n });\n }\n if (params.resource.max_access_level === 'viewer') {\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: 'Remote shell resource is configured for viewer access. Full access is required for this action.',\n });\n }\n const metadata = extractRemoteShellMetadata(params.resource);\n if (!metadata.fullControl) {\n const machineControl = deriveGatewayMachineControlState({\n resourceEnabled: metadata.fullControl,\n gatewayEnabled: true,\n installEnabled: true,\n serviceReady: true,\n });\n throw new RemoteShellAdmissionError({\n code: 'conflict',\n message: machineControl.reason ?? GATEWAY_MACHINE_CONTROL_REASONS.resource_disabled,\n });\n }\n const target = await resolveRemoteShellGatewayTarget(params.serviceClient, params.resolvedContext.teamId, metadata);\n const gateway = await loadReadyRemoteShellGateway(params.serviceClient, params.resolvedContext.teamId, target, { requireFullControl: true });\n return {\n teamId: params.resolvedContext.teamId,\n gatewayId: gateway.id,\n vmId: target.vmId,\n resourceId: params.resource.id,\n resourceUri: params.resourceUri,\n command: params.command,\n timeoutMs: normalizeRemoteShellExecTimeout(params.timeoutMs, 30_000),\n requestedByUserId: params.resolvedContext.requestedByUserId,\n requestedByAgentId: params.resolvedContext.ownerAgentId,\n };\n}\nexport function buildRemoteShellExecGatewayJobInsert(params) {\n return {\n team_id: params.admission.teamId,\n gateway_id: params.admission.gatewayId,\n status: 'queued',\n job_type: 'shell_exec',\n requested_by_user_id: params.admission.requestedByUserId ?? undefined,\n requested_by_agent_id: params.admission.requestedByAgentId ?? undefined,\n requested_via: params.requestedVia,\n payload: {\n resource_id: params.admission.resourceId,\n resource_uri: params.admission.resourceUri,\n command: params.admission.command,\n timeout_ms: params.admission.timeoutMs,\n requested_at: params.requestedAt ?? new Date().toISOString(),\n },\n };\n}\nfunction isStringArray(value) {\n return Array.isArray(value) && value.every((item) => typeof item === 'string');\n}\nfunction isBooleanRecord(value) {\n if (!isRecord(value))\n return false;\n return Object.values(value).every((entry) => typeof entry === 'boolean');\n}\nfunction isGatewayHealthStatus(value) {\n return value === 'healthy' || value === 'unhealthy' || value === 'unknown' || value === 'unavailable';\n}\nfunction isGatewayHealthCheckType(value) {\n return value === 'full' || value === 'light';\n}\n", "#!/usr/bin/env node\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport { GATEWAY_CAPABILITIES_SCHEMA_VERSION } from '@panorama/shared/gateway/capabilities'\nimport dotenv from 'dotenv'\nimport { execFile } from 'node:child_process'\nimport { randomUUID } from 'node:crypto'\nimport fsSync from 'node:fs'\nimport fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { promisify } from 'node:util'\nimport {\n getStringOption,\n parseArgs,\n resolveGatewayRuntimeMode,\n type ParsedArgs,\n} from './cli-args.js'\nimport {\n applyOptionEnvOverrides,\n normalizeEnvName,\n} from './cli-env.js'\nimport {\n GatewayCliError,\n cliError as writeCliError,\n cliInfo as writeCliInfo,\n cliSuccess as writeCliSuccess,\n cliWarn as writeCliWarn,\n describeError,\n formatPathForDisplay,\n type CliDetail,\n} from './cli-output.js'\nimport {\n fullControlGatewayCommand,\n showGatewayLogsCommand,\n statusGatewayCommand,\n stopGatewayCommand,\n type GatewayCliCommandDependencies,\n} from './gateway-cli-commands.js'\nimport {\n doctorGatewayCommand,\n type GatewayDoctorDependencies,\n} from './gateway-doctor.js'\nimport {\n pairGatewayCommand,\n type GatewayPairingDependencies,\n} from './gateway-pairing.js'\nimport type { Database } from './database.types.js'\nimport { createGatewayExecutionSupport } from './gateway-execution-support.js'\nimport { createGatewayControlPlane } from './gateway-control-plane.js'\nimport { createGatewayJobHandlers } from './gateway-job-handlers.js'\nimport { createGatewayProviderRuntime } from './gateway-provider-runtime.js'\nimport { startGatewayCommand } from './gateway-start-command.js'\nimport { startGatewayDaemonIfRequested } from './gateway-daemon.js'\nimport {\n ensureGatewayStatePermissions,\n isProcessAlive,\n loadGatewayConfig,\n readPidFile as readPidFileBase,\n removePidFile as removePidFileBase,\n resolveGatewayPaths as resolveGatewayPathsBase,\n saveGatewayConfig,\n writePidFile as writePidFileBase,\n type GatewayConfig,\n type GatewayPaths,\n} from './gateway-state.js'\nimport { createGatewayRuntimeState } from './gateway-runtime-state.js'\nimport {\n ensureOwnerOnlyDirectory,\n ensureOwnerOnlyFile,\n writeOwnerOnlyFile,\n} from './local-security.js'\nimport { startManagedGatewayRuntime } from './managed-runtime.js'\nimport { finalizeGatewaySubagentRunOnBackend } from './finalize-subagent-run.js'\nimport {\n startGatewayLocalRuntime,\n type GatewayLocalRuntimeConfigResolution,\n type GatewayLocalRuntimeEventPayload,\n} from './gateway-local-runtime.js'\n\nconst execFileAsync = promisify(execFile)\n\nconst DEFAULT_CLAUDE_TIMEOUT_MS = 10_000\nconst DEFAULT_REMOTE_SHELL_EXEC_TIMEOUT_MS = 30_000\nconst DEFAULT_SUBAGENT_TIMEOUT_MS = 30 * 60_000\nconst DEFAULT_MODEL_RUN_TIMEOUT_MS = 110_000\nconst SUBAGENT_CANCEL_KILL_TIMEOUT_MS = 5_000\nconst PROCESS_KILL_GRACE_MS = 2_000\n\ntype GatewaySupabaseClient = SupabaseClient<Database>\n\ntype GatewayEventPayload = GatewayLocalRuntimeEventPayload\n\ntype GatewayConfigDirResolution = GatewayLocalRuntimeConfigResolution\n\nconst runtimeState = createGatewayRuntimeState<GatewayEventPayload>()\nconst activeSubagentRuns = runtimeState.activeSubagentRuns\nconst activeModelRuns = runtimeState.activeModelRuns\nconst activeShellExecRuns = runtimeState.activeShellExecRuns\n\nlet ACTIVE_OPTIONS: ParsedArgs['options'] | null = null\n\nconst executionSupport = createGatewayExecutionSupport({\n runtimeState,\n subagentCancelKillTimeoutMs: SUBAGENT_CANCEL_KILL_TIMEOUT_MS,\n getActiveOptions,\n logError,\n})\nconst ensureGatewayTmpDir = executionSupport.ensureGatewayTmpDir\nconst buildGatewayChildEnv = executionSupport.buildGatewayChildEnv\nconst runGatewayCommandWithLogging = executionSupport.runCommand\nconst runGatewayStreamingCommandWithLogging = executionSupport.runStreamingCommand\nconst getNextRunSequence = executionSupport.getNextRunSequence\nconst getNextSubagentRunEventSequence = executionSupport.getNextSubagentRunEventSequence\nconst insertSubagentRunEvent = executionSupport.insertSubagentRunEvent\nconst requestChildTerminationWithLogging = executionSupport.requestChildTermination\nconst requestSubagentCancel = executionSupport.requestSubagentCancel\nconst resolvePendingCancel = executionSupport.resolvePendingCancel\nconst consumePendingCancelFromQueue = executionSupport.consumePendingCancelFromQueue\nconst clearPendingCancel = executionSupport.clearPendingCancel\nconst resolveSubagentWorkdirRoot = executionSupport.resolveSubagentWorkdirRoot\n\nconst controlPlane = createGatewayControlPlane({\n runtimeState,\n loadConfig,\n logInfo,\n logError,\n})\nconst createGatewayEventClient = controlPlane.createGatewayEventClient\nconst emitGatewayEvent = controlPlane.emitGatewayEvent\nconst flushGatewayEvents = controlPlane.flushGatewayEvents\nconst sendHeartbeat = controlPlane.sendHeartbeat\nconst loadGatewayControlState = controlPlane.loadGatewayControlState\nconst isHeartbeatFresh = controlPlane.isHeartbeatFresh\nconst refreshRuntimeInstallFullControl = controlPlane.refreshRuntimeInstallFullControl\n\nconst providerRuntime = createGatewayProviderRuntime({\n runtimeState,\n getActiveOptions,\n isVerbose,\n buildGatewayChildEnv,\n runCommand: runGatewayCommandWithLogging,\n readGatewayVersion: getGatewayVersion,\n saveConfig,\n sendHeartbeat,\n emitGatewayEvent,\n cliWarn,\n logInfo,\n logWarn,\n logError,\n expectedCapabilitiesSchemaVersion: GATEWAY_CAPABILITIES_SCHEMA_VERSION,\n})\nconst resolveClaudeCommand = providerRuntime.resolveClaudeCommand\nconst resolveCodexCommand = providerRuntime.resolveCodexCommand\nconst resolveGeminiCommand = providerRuntime.resolveGeminiCommand\nconst discoverGatewayCliCommands = providerRuntime.discoverCliCommands\nconst buildCapabilities = providerRuntime.buildCapabilities\nconst updateRuntimeProviderHealth = providerRuntime.updateRuntimeProviderHealth\nconst emitProviderHealthEvents = providerRuntime.emitProviderHealthEvents\n\nfunction printHelp(): void {\n console.log(\n `\\nPanorama Gateway\\n\\nUsage:\\n panorama-gateway pair <PAIRING_CODE> [--device-name \\\"My Mac\\\"]\\n panorama-gateway start [--device-name \\\"My Mac\\\"] [--foreground|--daemon] [--mode local|managed]\\n panorama-gateway stop\\n panorama-gateway status\\n panorama-gateway logs [--lines 200] [--no-follow]\\n panorama-gateway doctor\\n panorama-gateway full-control <enable|disable|status>\\n\\nNotes:\\n Pair automatically starts the gateway when possible.\\n Start runs in the background by default for the built CLI. Use --foreground to keep it attached.\\n Managed mode runs in the foreground and uses Panorama-managed runtime credentials from the environment.\\n\\nOutput options:\\n --verbose, -v Show technical details (paths, IDs, PIDs)\\n\\nEnvironment options:\\n --env <local|dev|test|stage|prod> Load .env.<env> from repo root (defaults to .env)\\n --env-file <path> Load a specific env file\\n --mode <local|managed> Runtime mode for start (default: local)\\n PANORAMA_ENV Same as --env\\n PANORAMA_ENV_FILE Same as --env-file\\n PANORAMA_GATEWAY_MODE Same as --mode for start\\n\\nCLI overrides:\\n --config-dir <path> Override config directory (default: ~/.panorama/gateway)\\n --config-path <path> Override gateway config file\\n --log-path <path> Override gateway log file\\n --pid-path <path> Override gateway pid file\\n --claude-cli <path> Override Claude CLI command\\n --codex-cli <path> Override Codex CLI command\\n --gemini-cli <path> Override Gemini CLI command\\n\\nEnvironment overrides:\\n PANORAMA_GATEWAY_CONFIG_DIR\\n PANORAMA_GATEWAY_CONFIG_PATH\\n PANORAMA_GATEWAY_LOG_PATH\\n PANORAMA_GATEWAY_PID_PATH\\n PANORAMA_CLAUDE_CLI or CLAUDE_CLI\\n PANORAMA_CODEX_CLI or CODEX_CLI\\n PANORAMA_GEMINI_CLI or GEMINI_CLI\\n PANORAMA_GATEWAY_AUTO_RESTART (default: on for built CLI, off for dev)\\n PANORAMA_GATEWAY_RESTART_CHECK_MS (default: 30000)\\n PANORAMA_GATEWAY_RESTART_MAX_WAIT_MS (optional)\\n`\n )\n}\n\nfunction getActiveOptions(options?: ParsedArgs['options']): ParsedArgs['options'] {\n return options ?? ACTIVE_OPTIONS ?? {}\n}\n\nfunction isVerbose(options?: ParsedArgs['options']): boolean {\n const resolvedOptions = getActiveOptions(options)\n return resolvedOptions.verbose === true || resolvedOptions.v === true\n}\n\nfunction resolveGatewayPaths(options?: ParsedArgs['options']): GatewayPaths {\n return resolveGatewayPathsBase(getActiveOptions(options))\n}\n\nfunction resolveGatewayFallbackConfigDir(): string {\n if (process.platform === 'darwin') {\n return path.join(os.homedir(), 'Library', 'Application Support', 'Panorama Gateway')\n }\n if (process.platform === 'win32') {\n const base = process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming')\n return path.join(base, 'Panorama Gateway')\n }\n const dataHome = process.env.XDG_DATA_HOME || path.join(os.homedir(), '.local', 'share')\n return path.join(dataHome, 'panorama-gateway')\n}\n\nasync function ensureWritableDirectory(dir: string): Promise<{ ok: boolean; error?: string }> {\n try {\n await ensureOwnerOnlyDirectory(dir)\n const probe = path.join(dir, `.panorama-write-${randomUUID()}`)\n await writeOwnerOnlyFile(probe, 'ok')\n await fs.unlink(probe)\n return { ok: true }\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) }\n }\n}\n\nasync function prepareGatewayConfigDir(\n options: ParsedArgs['options'],\n allowFallback: boolean\n): Promise<GatewayConfigDirResolution> {\n const resolvedOptions = getActiveOptions(options)\n const overrideDir =\n getStringOption(resolvedOptions, 'config-dir') || process.env.PANORAMA_GATEWAY_CONFIG_DIR\n const overridePath =\n getStringOption(resolvedOptions, 'config-path') || process.env.PANORAMA_GATEWAY_CONFIG_PATH\n const explicitOverride = Boolean(overrideDir || overridePath)\n\n const { configDir, configPath, logPath, pidPath } = resolveGatewayPaths(resolvedOptions)\n const writable = await ensureWritableDirectory(configDir)\n if (writable.ok) {\n process.env.PANORAMA_GATEWAY_CONFIG_DIR = configDir\n process.env.PANORAMA_GATEWAY_CONFIG_PATH = configPath\n process.env.PANORAMA_GATEWAY_LOG_PATH = logPath\n process.env.PANORAMA_GATEWAY_PID_PATH = pidPath\n try {\n await ensureGatewayStatePermissions({ configDir, configPath, logPath, pidPath })\n } catch (error) {\n const details = error instanceof Error ? error.message : String(error)\n throw new GatewayCliError(\n 'Gateway state permissions could not be secured.',\n `${details} Ensure the gateway directory is owned by this user and writable.`\n )\n }\n return { configDir, configPath }\n }\n\n if (explicitOverride || !allowFallback) {\n throw new GatewayCliError(\n 'Gateway config directory is not writable.',\n writable.error ??\n `Unable to write to ${configDir}. Set --config-dir or PANORAMA_GATEWAY_CONFIG_DIR to a writable location.`\n )\n }\n\n const fallbackDir = resolveGatewayFallbackConfigDir()\n const fallbackWritable = await ensureWritableDirectory(fallbackDir)\n if (!fallbackWritable.ok) {\n throw new GatewayCliError(\n 'Gateway config directory is not writable.',\n fallbackWritable.error ?? `Unable to write to ${configDir} or fallback ${fallbackDir}.`\n )\n }\n\n const fallbackOptions = { ...resolvedOptions, 'config-dir': fallbackDir }\n const fallbackPaths = resolveGatewayPaths(fallbackOptions)\n if (configPath !== fallbackPaths.configPath && fsSync.existsSync(configPath)) {\n try {\n await ensureOwnerOnlyDirectory(path.dirname(fallbackPaths.configPath))\n await fs.copyFile(configPath, fallbackPaths.configPath)\n await ensureOwnerOnlyFile(fallbackPaths.configPath)\n } catch (error) {\n logError('Failed to migrate gateway config to fallback directory', {\n from: configPath,\n to: fallbackPaths.configPath,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n resolvedOptions['config-dir'] = fallbackDir\n process.env.PANORAMA_GATEWAY_CONFIG_DIR = fallbackDir\n process.env.PANORAMA_GATEWAY_CONFIG_PATH = fallbackPaths.configPath\n process.env.PANORAMA_GATEWAY_LOG_PATH = fallbackPaths.logPath\n process.env.PANORAMA_GATEWAY_PID_PATH = fallbackPaths.pidPath\n try {\n await ensureGatewayStatePermissions(fallbackPaths)\n } catch (error) {\n const details = error instanceof Error ? error.message : String(error)\n throw new GatewayCliError(\n 'Gateway state permissions could not be secured.',\n `${details} Ensure the fallback directory is owned by this user and writable.`\n )\n }\n cliWarn('Gateway config directory not writable; using fallback location.', resolvedOptions, [\n { label: 'Fallback', value: formatPathForDisplay(fallbackDir), verboseOnly: true },\n { label: 'Previous', value: formatPathForDisplay(configDir), verboseOnly: true },\n ])\n\n return {\n configDir: fallbackPaths.configDir,\n configPath: fallbackPaths.configPath,\n migratedFrom: configDir,\n }\n}\n\nfunction cliSuccess(message: string, options?: ParsedArgs['options'], details?: CliDetail[]): void {\n writeCliSuccess(message, isVerbose(options), details)\n}\n\nfunction cliInfo(message: string, options?: ParsedArgs['options'], details?: CliDetail[]): void {\n writeCliInfo(message, isVerbose(options), details)\n}\n\nfunction cliWarn(message: string, options?: ParsedArgs['options'], details?: CliDetail[]): void {\n writeCliWarn(message, isVerbose(options), details)\n}\n\nfunction cliError(message: string, options?: ParsedArgs['options'], details?: CliDetail[]): void {\n writeCliError(message, isVerbose(options), details)\n}\n\nasync function getGatewayVersion(): Promise<string | null> {\n try {\n const raw = await fs.readFile(new URL('../package.json', import.meta.url), 'utf-8')\n const parsed = JSON.parse(raw) as { version?: string }\n return parsed.version ?? null\n } catch {\n return null\n }\n}\n\nfunction formatUptime(etime: string): string | null {\n const trimmed = etime.trim()\n if (!trimmed) return null\n const [dayPart, timePart] = trimmed.includes('-') ? trimmed.split('-') : [null, trimmed]\n const segments = timePart.split(':').map((segment) => Number.parseInt(segment, 10))\n if (segments.some((segment) => !Number.isFinite(segment))) return trimmed\n\n let hours = 0\n let minutes = 0\n let seconds = 0\n\n if (segments.length === 3) {\n ;[hours, minutes, seconds] = segments\n } else if (segments.length === 2) {\n ;[minutes, seconds] = segments\n } else if (segments.length === 1) {\n ;[seconds] = segments\n }\n\n if (dayPart) {\n const days = Number.parseInt(dayPart, 10)\n if (Number.isFinite(days)) {\n hours += days * 24\n }\n }\n\n const parts: string[] = []\n if (hours > 0) parts.push(`${hours}h`)\n if (minutes > 0 || hours > 0) parts.push(`${minutes}m`)\n if (hours === 0 && minutes === 0) parts.push(`${seconds}s`)\n\n return parts.join(' ')\n}\n\nasync function getProcessUptime(pid: number): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync('ps', ['-p', String(pid), '-o', 'etime='])\n const trimmed = stdout.trim()\n if (!trimmed) return null\n return formatUptime(trimmed) ?? trimmed\n } catch {\n return null\n }\n}\n\nfunction findRepoRoot(startDir: string): string | null {\n let current = startDir\n while (true) {\n if (fsSync.existsSync(path.join(current, 'pnpm-workspace.yaml'))) {\n return current\n }\n const parent = path.dirname(current)\n if (parent === current) return null\n current = parent\n }\n}\n\nfunction loadEnvironment(options: ParsedArgs['options']): void {\n const envFileOption =\n getStringOption(options, 'env-file') ||\n process.env.PANORAMA_ENV_FILE ||\n process.env.PANORAMA_ENV_PATH\n const envNameOption =\n getStringOption(options, 'env') || process.env.PANORAMA_ENV || process.env.ENVIRONMENT\n const envName = normalizeEnvName(envNameOption) ?? 'local'\n\n const envPath = envFileOption\n ? path.resolve(envFileOption)\n : path.join(\n findRepoRoot(process.cwd()) ?? process.cwd(),\n envName === 'local' ? '.env' : `.env.${envName}`\n )\n\n if (!fsSync.existsSync(envPath)) {\n if (envFileOption || envNameOption) {\n throw new GatewayCliError('Environment file not found.', `Path: ${envPath}`)\n }\n return\n }\n\n dotenv.config({ path: envPath })\n}\n\nasync function loadConfig(options?: ParsedArgs['options']): Promise<GatewayConfig> {\n return loadGatewayConfig(getActiveOptions(options))\n}\n\nasync function saveConfig(config: GatewayConfig, options?: ParsedArgs['options']): Promise<void> {\n await saveGatewayConfig(config, getActiveOptions(options))\n}\n\nfunction shouldEmitDebugOutput(stream: NodeJS.WriteStream): boolean {\n if (!stream.isTTY) return true\n return isVerbose()\n}\n\nfunction logInfo(message: string, data?: Record<string, unknown>): void {\n if (!shouldEmitDebugOutput(process.stdout)) return\n if (data) {\n console.log(`[gateway] ${message}`, data)\n } else {\n console.log(`[gateway] ${message}`)\n }\n}\n\nfunction logError(message: string, data?: Record<string, unknown>): void {\n if (!shouldEmitDebugOutput(process.stderr)) return\n if (data) {\n console.error(`[gateway] ${message}`, data)\n } else {\n console.error(`[gateway] ${message}`)\n }\n}\n\nfunction logWarn(message: string, data?: Record<string, unknown>): void {\n if (!shouldEmitDebugOutput(process.stderr)) return\n if (data) {\n console.warn(`[gateway] ${message}`, data)\n } else {\n console.warn(`[gateway] ${message}`)\n }\n}\n\nfunction readPidFile(options?: ParsedArgs['options']): number | null {\n return readPidFileBase(getActiveOptions(options))\n}\n\nasync function writePidFile(pid: number, options?: ParsedArgs['options']): Promise<void> {\n await writePidFileBase(pid, getActiveOptions(options))\n}\n\nasync function removePidFile(options?: ParsedArgs['options']): Promise<void> {\n await removePidFileBase(getActiveOptions(options))\n}\n\nfunction buildGatewayJobHandlers() {\n return createGatewayJobHandlers({\n activeSubagentRuns,\n activeModelRuns,\n activeShellExecRuns,\n getProviderCapabilities: providerRuntime.getProviderCapabilities,\n getClaudeSupport: providerRuntime.getClaudeSupport,\n defaultClaudeTimeoutMs: DEFAULT_CLAUDE_TIMEOUT_MS,\n defaultRemoteShellExecTimeoutMs: DEFAULT_REMOTE_SHELL_EXEC_TIMEOUT_MS,\n defaultSubagentTimeoutMs: DEFAULT_SUBAGENT_TIMEOUT_MS,\n defaultModelRunTimeoutMs: DEFAULT_MODEL_RUN_TIMEOUT_MS,\n subagentCancelKillTimeoutMs: SUBAGENT_CANCEL_KILL_TIMEOUT_MS,\n processKillGraceMs: PROCESS_KILL_GRACE_MS,\n buildGatewayChildEnv,\n resolveClaudeCommand,\n resolveCodexCommand,\n resolveGeminiCommand,\n refreshRuntimeInstallFullControl,\n loadGatewayControlState,\n isHeartbeatFresh,\n requestSubagentCancel,\n getNextRunSequence,\n getNextSubagentRunEventSequence,\n insertSubagentRunEvent,\n resolvePendingCancel,\n consumePendingCancelFromQueue,\n clearPendingCancel,\n resolveSubagentWorkdirRoot,\n runCommand: runGatewayCommandWithLogging,\n runStreamingCommand: runGatewayStreamingCommandWithLogging,\n updateRuntimeProviderHealth,\n requestChildTermination: requestChildTerminationWithLogging,\n logInfo,\n logError,\n })\n}\n\nfunction buildGatewayStartDependencies() {\n return {\n runtimeState,\n resolveGatewayPaths,\n readPidFile,\n writePidFile,\n removePidFile,\n isProcessAlive,\n loadConfig,\n saveConfig,\n buildGatewayJobHandlers,\n buildCapabilities,\n ensureGatewayTmpDir,\n discoverGatewayCliCommands,\n refreshRuntimeInstallFullControl,\n emitGatewayEvent,\n flushGatewayEvents,\n emitProviderHealthEvents,\n sendHeartbeat,\n getNextSubagentRunEventSequence,\n insertSubagentRunEvent,\n requestChildTermination: requestChildTerminationWithLogging,\n startGatewayDaemonIfRequested,\n startGatewayLocalRuntime,\n logInfo,\n logError,\n cliInfo,\n cliSuccess,\n }\n}\n\nfunction buildGatewayCliCommandDependencies(): GatewayCliCommandDependencies {\n return {\n resolveGatewayPaths,\n readPidFile,\n isProcessAlive,\n removePidFile,\n loadConfig,\n saveConfig,\n getGatewayVersion,\n getProcessUptime,\n onFullControlChanged: (config, enabled) => {\n if (runtimeState.currentConfig && runtimeState.currentConfig.gatewayId === config.gatewayId) {\n runtimeState.currentConfig.full_control_enabled = enabled\n }\n },\n cliSuccess,\n cliInfo,\n cliWarn,\n cliError,\n }\n}\n\nfunction buildGatewayPairingDependencies(): GatewayPairingDependencies<GatewaySupabaseClient> {\n return {\n resolveGatewayPaths,\n loadConfig,\n saveConfig,\n discoverGatewayCliCommands,\n buildCapabilities,\n createGatewayEventClient,\n flushGatewayEvents,\n emitGatewayEvent,\n emitProviderHealthEvents,\n logError,\n cliSuccess,\n cliInfo,\n cliWarn,\n }\n}\n\nfunction buildGatewayDoctorDependencies(): GatewayDoctorDependencies<GatewaySupabaseClient> {\n return {\n resolveGatewayPaths,\n loadConfig,\n saveConfig,\n discoverGatewayCliCommands,\n buildCapabilities,\n createGatewayEventClient,\n flushGatewayEvents,\n emitGatewayEvent,\n emitProviderHealthEvents,\n cliInfo,\n cliWarn,\n }\n}\n\nasync function run(): Promise<void> {\n const parsed = parseArgs(process.argv.slice(2))\n ACTIVE_OPTIONS = parsed.options\n applyOptionEnvOverrides(parsed.options)\n\n if (parsed.options.h || parsed.options.help || parsed.command === null) {\n printHelp()\n return\n }\n\n if (parsed.command === 'pair') {\n loadEnvironment(parsed.options)\n const configResolution = await prepareGatewayConfigDir(parsed.options, true)\n applyOptionEnvOverrides(parsed.options)\n const code = getStringOption(parsed.options, 'code') || parsed.positional[0]\n if (!code) {\n throw new Error('Pairing code is required')\n }\n await pairGatewayCommand(\n code,\n parsed.options,\n configResolution,\n buildGatewayPairingDependencies()\n )\n const entryPath = process.argv[1] || ''\n if (entryPath.endsWith('.ts')) {\n cliInfo(\n 'Auto-start skipped in dev mode; run \"panorama-gateway start\" when ready.',\n parsed.options\n )\n return\n }\n try {\n await startGatewayCommand(parsed.options, configResolution, buildGatewayStartDependencies())\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n cliWarn('Auto-start failed; run \"panorama-gateway start\" to retry.', parsed.options, [\n { label: 'Error', value: message, verboseOnly: true },\n ])\n }\n return\n }\n\n if (parsed.command === 'start') {\n loadEnvironment(parsed.options)\n if (resolveGatewayRuntimeMode(parsed.options) === 'managed') {\n applyOptionEnvOverrides(parsed.options)\n await startManagedGatewayRuntime()\n return\n }\n const configResolution = await prepareGatewayConfigDir(parsed.options, true)\n applyOptionEnvOverrides(parsed.options)\n await startGatewayCommand(parsed.options, configResolution, buildGatewayStartDependencies())\n return\n }\n\n if (parsed.command === 'full-control') {\n await fullControlGatewayCommand(\n parsed.options,\n parsed.positional,\n buildGatewayCliCommandDependencies()\n )\n return\n }\n\n if (parsed.command === 'stop') {\n await stopGatewayCommand(parsed.options, buildGatewayCliCommandDependencies())\n return\n }\n\n if (parsed.command === 'status') {\n await statusGatewayCommand(parsed.options, buildGatewayCliCommandDependencies())\n return\n }\n\n if (parsed.command === 'logs') {\n await showGatewayLogsCommand(parsed.options, buildGatewayCliCommandDependencies())\n return\n }\n\n if (parsed.command === 'doctor') {\n loadEnvironment(parsed.options)\n const configResolution = await prepareGatewayConfigDir(parsed.options, true)\n applyOptionEnvOverrides(parsed.options)\n await doctorGatewayCommand(\n parsed.options,\n configResolution,\n buildGatewayDoctorDependencies()\n )\n return\n }\n\n printHelp()\n process.exitCode = 1\n}\n\nrun().catch((error) => {\n const { message, details } = describeError(error)\n const detailItems: CliDetail[] = []\n if (details) {\n detailItems.push({ label: 'Details', value: details, verboseOnly: true })\n }\n cliError(message, ACTIVE_OPTIONS ?? undefined, detailItems)\n process.exitCode = 1\n})\n", "export interface ParsedArgs {\n command: string | null\n positional: string[]\n options: Record<string, string | boolean>\n}\n\nexport type GatewayRuntimeMode = 'local' | 'managed'\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const normalizedArgv = argv[0] === '--' ? argv.slice(1) : argv\n const positional: string[] = []\n const options: Record<string, string | boolean> = {}\n\n for (let i = 0; i < normalizedArgv.length; i += 1) {\n const arg = normalizedArgv[i]\n if (!arg) continue\n\n if (arg === '--') {\n positional.push(...normalizedArgv.slice(i + 1))\n break\n }\n\n if (arg.startsWith('--')) {\n const [flag, inlineValue] = arg.slice(2).split('=')\n if (inlineValue !== undefined) {\n options[flag] = inlineValue\n continue\n }\n\n const next = normalizedArgv[i + 1]\n if (next && !next.startsWith('--')) {\n options[flag] = next\n i += 1\n } else {\n options[flag] = true\n }\n continue\n }\n\n if (arg.startsWith('-') && arg.length > 1) {\n options[arg.slice(1)] = true\n continue\n }\n\n positional.push(arg)\n }\n\n const command = positional.shift() ?? null\n return { command, positional, options }\n}\n\nexport function getStringOption(options: ParsedArgs['options'], key: string): string | undefined {\n const value = options[key]\n if (typeof value === 'string') return value\n return undefined\n}\n\nexport function resolveGatewayRuntimeMode(\n options: ParsedArgs['options'],\n env: NodeJS.ProcessEnv = process.env\n): GatewayRuntimeMode {\n const rawMode = getStringOption(options, 'mode') || env.PANORAMA_GATEWAY_MODE || 'local'\n const mode = rawMode.trim().toLowerCase()\n if (mode === 'local' || mode === 'managed') {\n return mode\n }\n throw new Error(`Unsupported gateway mode: ${rawMode}`)\n}\n\nexport function parseBooleanInput(value: unknown): boolean | null {\n if (typeof value === 'boolean') return value\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase()\n if (\n normalized === 'true' ||\n normalized === '1' ||\n normalized === 'yes' ||\n normalized === 'on'\n ) {\n return true\n }\n if (\n normalized === 'false' ||\n normalized === '0' ||\n normalized === 'no' ||\n normalized === 'off'\n ) {\n return false\n }\n }\n return null\n}\n", "import { getStringOption, type ParsedArgs } from './cli-args.js'\n\nconst VALID_ENVIRONMENTS = new Set(['local', 'dev', 'test', 'stage', 'prod'])\n\nexport function applyOptionEnvOverrides(\n options: ParsedArgs['options'],\n env: NodeJS.ProcessEnv = process.env\n): void {\n const setValue = (key: string, value: string | undefined): void => {\n if (!value) return\n env[key] = value\n }\n\n setValue('PANORAMA_GATEWAY_CONFIG_DIR', getStringOption(options, 'config-dir'))\n setValue('PANORAMA_GATEWAY_CONFIG_PATH', getStringOption(options, 'config-path'))\n setValue('PANORAMA_GATEWAY_LOG_PATH', getStringOption(options, 'log-path'))\n setValue('PANORAMA_GATEWAY_PID_PATH', getStringOption(options, 'pid-path'))\n setValue('PANORAMA_CLAUDE_CLI', getStringOption(options, 'claude-cli'))\n setValue('PANORAMA_CODEX_CLI', getStringOption(options, 'codex-cli'))\n setValue('PANORAMA_GEMINI_CLI', getStringOption(options, 'gemini-cli'))\n}\n\nexport function buildGatewayEnvOverrides(options: ParsedArgs['options']): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {}\n const configDir = getStringOption(options, 'config-dir')\n const configPath = getStringOption(options, 'config-path')\n const logPath = getStringOption(options, 'log-path')\n const pidPath = getStringOption(options, 'pid-path')\n const claudeCli = getStringOption(options, 'claude-cli')\n const codexCli = getStringOption(options, 'codex-cli')\n const geminiCli = getStringOption(options, 'gemini-cli')\n const supabaseUrl = getStringOption(options, 'supabase-url')\n const supabaseAnonKey = getStringOption(options, 'anon-key')\n\n if (configDir) env.PANORAMA_GATEWAY_CONFIG_DIR = configDir\n if (configPath) env.PANORAMA_GATEWAY_CONFIG_PATH = configPath\n if (logPath) env.PANORAMA_GATEWAY_LOG_PATH = logPath\n if (pidPath) env.PANORAMA_GATEWAY_PID_PATH = pidPath\n if (claudeCli) env.PANORAMA_CLAUDE_CLI = claudeCli\n if (codexCli) env.PANORAMA_CODEX_CLI = codexCli\n if (geminiCli) env.PANORAMA_GEMINI_CLI = geminiCli\n if (supabaseUrl) env.PANORAMA_SUPABASE_URL = supabaseUrl\n if (supabaseAnonKey) env.PANORAMA_SUPABASE_ANON_KEY = supabaseAnonKey\n\n return env\n}\n\nexport function normalizeEnvName(raw: string | undefined): string | null {\n if (!raw) return null\n const value = raw.trim().toLowerCase()\n if (!value) return null\n if (value === 'production') return 'prod'\n if (value === 'development') return 'local'\n if (VALID_ENVIRONMENTS.has(value)) return value\n return null\n}\n\nexport function parseBooleanEnv(value: string | undefined, fallback: boolean): boolean {\n if (value === undefined) return fallback\n const normalized = value.trim().toLowerCase()\n if (normalized === '1' || normalized === 'true' || normalized === 'yes' || normalized === 'on') {\n return true\n }\n if (normalized === '0' || normalized === 'false' || normalized === 'no' || normalized === 'off') {\n return false\n }\n return fallback\n}\n\nexport function parseNumberEnv(value: string | undefined, fallback: number): number {\n if (!value) return fallback\n const parsed = Number.parseInt(value, 10)\n if (!Number.isFinite(parsed)) return fallback\n return parsed\n}\n", "import os from 'node:os'\nimport path from 'node:path'\n\nexport type CliDetail = {\n label: string\n value: string | number | null | undefined\n verboseOnly?: boolean\n}\n\nexport class GatewayCliError extends Error {\n readonly details?: string\n\n constructor(message: string, details?: string) {\n super(message)\n this.name = 'GatewayCliError'\n this.details = details\n }\n}\n\nexport function formatCliValue(value: CliDetail['value']): string | null {\n if (value === null || value === undefined) return null\n if (typeof value === 'number' && !Number.isFinite(value)) return null\n if (typeof value === 'string' && value.trim() === '') return null\n return String(value)\n}\n\nexport function formatPathForDisplay(\n value: string | null | undefined,\n homeDir: string = os.homedir()\n): string | null {\n if (!value) return null\n if (value === homeDir) return '~'\n if (value.startsWith(`${homeDir}${path.sep}`)) {\n return `~${value.slice(homeDir.length)}`\n }\n return value\n}\n\nexport function truncateText(value: string, maxLength: number): string {\n if (value.length <= maxLength) return value\n return `${value.slice(0, maxLength)}...`\n}\n\nexport function formatCliDetails(details: CliDetail[] | undefined, verbose: boolean): string[] {\n if (!details || details.length === 0) return []\n const lines: string[] = []\n for (const detail of details) {\n if (detail.verboseOnly && !verbose) continue\n const formatted = formatCliValue(detail.value)\n if (!formatted) continue\n const formattedLines = formatted.split('\\n')\n lines.push(` ${detail.label}: ${formattedLines[0]}`)\n for (const line of formattedLines.slice(1)) {\n lines.push(` ${line}`)\n }\n }\n return lines\n}\n\nexport function writeCliDetails(\n details: CliDetail[] | undefined,\n verbose: boolean,\n writer: (line: string) => void\n): void {\n for (const line of formatCliDetails(details, verbose)) {\n writer(line)\n }\n}\n\nexport function cliSuccess(message: string, verbose: boolean, details?: CliDetail[]): void {\n console.log(`OK ${message}`)\n writeCliDetails(details, verbose, console.log)\n}\n\nexport function cliInfo(message: string, verbose: boolean, details?: CliDetail[]): void {\n console.log(message)\n writeCliDetails(details, verbose, console.log)\n}\n\nexport function cliWarn(message: string, verbose: boolean, details?: CliDetail[]): void {\n console.warn(`WARN ${message}`)\n writeCliDetails(details, verbose, console.warn)\n}\n\nexport function cliError(message: string, verbose: boolean, details?: CliDetail[]): void {\n console.error(`ERROR ${message}`)\n writeCliDetails(details, verbose, console.error)\n}\n\nexport function describeError(error: unknown): { message: string; details?: string } {\n if (error instanceof GatewayCliError) {\n return { message: error.message, details: error.details }\n }\n if (error instanceof Error) {\n return {\n message: error.message || 'Unexpected error',\n details: error.stack ?? undefined,\n }\n }\n return { message: String(error) }\n}\n", "import fsSync from 'node:fs'\nimport fs from 'node:fs/promises'\nimport process from 'node:process'\nimport { getStringOption, type ParsedArgs } from './cli-args.js'\nimport {\n GatewayCliError,\n formatPathForDisplay,\n type CliDetail,\n} from './cli-output.js'\nimport type { GatewayConfig, GatewayPaths } from './gateway-state.js'\n\ntype CliReporter = (\n message: string,\n options?: ParsedArgs['options'],\n details?: CliDetail[]\n) => void\n\nexport interface GatewayCliCommandDependencies {\n resolveGatewayPaths: (options?: ParsedArgs['options']) => GatewayPaths\n readPidFile: (options?: ParsedArgs['options']) => number | null\n isProcessAlive: (pid: number) => boolean\n removePidFile: (options?: ParsedArgs['options']) => Promise<void>\n loadConfig: (options?: ParsedArgs['options']) => Promise<GatewayConfig>\n saveConfig: (config: GatewayConfig, options?: ParsedArgs['options']) => Promise<void>\n getGatewayVersion: () => Promise<string | null>\n getProcessUptime: (pid: number) => Promise<string | null>\n onFullControlChanged?: (config: GatewayConfig, enabled: boolean) => void\n cliSuccess: CliReporter\n cliInfo: CliReporter\n cliWarn: CliReporter\n cliError: CliReporter\n}\n\nexport async function stopGatewayCommand(\n options: ParsedArgs['options'],\n dependencies: GatewayCliCommandDependencies\n): Promise<void> {\n const { pidPath } = dependencies.resolveGatewayPaths(options)\n const pid = dependencies.readPidFile(options)\n if (!pid) {\n dependencies.cliInfo('Gateway is not running', options, [\n { label: 'PID file', value: formatPathForDisplay(pidPath), verboseOnly: true },\n ])\n return\n }\n\n if (!dependencies.isProcessAlive(pid)) {\n await dependencies.removePidFile(options)\n dependencies.cliInfo('Gateway is not running (stale PID removed)', options, [\n { label: 'PID', value: pid, verboseOnly: true },\n ])\n return\n }\n\n try {\n process.kill(pid, 'SIGTERM')\n } catch (error) {\n dependencies.cliError('Failed to stop gateway process', options, [\n { label: 'PID', value: pid, verboseOnly: true },\n {\n label: 'Error',\n value: error instanceof Error ? error.message : String(error),\n verboseOnly: true,\n },\n ])\n return\n }\n\n dependencies.cliInfo('Stopping gateway...', options, [\n { label: 'PID', value: pid, verboseOnly: true },\n ])\n\n const timeoutMs = 5000\n const start = Date.now()\n while (Date.now() - start < timeoutMs) {\n if (!dependencies.isProcessAlive(pid)) {\n await dependencies.removePidFile(options)\n dependencies.cliSuccess('Gateway stopped', options, [\n { label: 'PID', value: pid, verboseOnly: true },\n ])\n return\n }\n await new Promise((resolve) => setTimeout(resolve, 200))\n }\n\n dependencies.cliWarn('Gateway stop is still draining active work; process remains running', options, [\n { label: 'PID', value: pid, verboseOnly: true },\n ])\n}\n\nexport async function statusGatewayCommand(\n options: ParsedArgs['options'],\n dependencies: GatewayCliCommandDependencies\n): Promise<void> {\n const { pidPath, logPath, configPath } = dependencies.resolveGatewayPaths(options)\n const pid = dependencies.readPidFile(options)\n const configExists = fsSync.existsSync(configPath)\n\n let configSummary: {\n gatewayId?: string\n teamId?: string\n deviceName?: string\n fullControlEnabled?: boolean\n } | null = null\n if (configExists) {\n try {\n const config = await dependencies.loadConfig(options)\n configSummary = {\n gatewayId: config.gatewayId,\n teamId: config.teamId,\n deviceName: config.deviceName ?? undefined,\n fullControlEnabled: config.full_control_enabled === true,\n }\n } catch {\n configSummary = null\n }\n }\n\n const alive = pid ? dependencies.isProcessAlive(pid) : false\n const statusLabel = alive ? 'Running' : 'Stopped'\n const version = await dependencies.getGatewayVersion()\n const uptime = alive && pid ? await dependencies.getProcessUptime(pid) : null\n\n dependencies.cliInfo(`Gateway Status: ${statusLabel}`, options, [\n { label: 'Version', value: version ?? undefined },\n { label: 'Uptime', value: uptime ?? undefined },\n { label: 'Paired', value: configExists ? 'Yes' : 'No' },\n {\n label: 'Host machine control',\n value:\n configSummary == null\n ? undefined\n : configSummary.fullControlEnabled\n ? 'Enabled'\n : 'Disabled',\n },\n { label: 'Device', value: configSummary?.deviceName ?? undefined, verboseOnly: true },\n { label: 'Gateway ID', value: configSummary?.gatewayId ?? undefined, verboseOnly: true },\n { label: 'Team ID', value: configSummary?.teamId ?? undefined, verboseOnly: true },\n { label: 'PID', value: pid ?? undefined, verboseOnly: true },\n { label: 'Stale PID', value: pid && !alive ? pid : undefined, verboseOnly: true },\n { label: 'Config Path', value: formatPathForDisplay(configPath), verboseOnly: true },\n { label: 'Log Path', value: formatPathForDisplay(logPath), verboseOnly: true },\n { label: 'PID Path', value: formatPathForDisplay(pidPath), verboseOnly: true },\n ])\n}\n\nexport async function fullControlGatewayCommand(\n options: ParsedArgs['options'],\n positional: string[],\n dependencies: GatewayCliCommandDependencies\n): Promise<void> {\n const action = (positional[0] ?? 'status').trim().toLowerCase()\n let config: GatewayConfig\n try {\n config = await dependencies.loadConfig(options)\n } catch (error) {\n const details = error instanceof Error ? error.message : String(error)\n throw new GatewayCliError('Gateway config not found. Run \"pair\" first.', details)\n }\n\n if (action === 'status') {\n dependencies.cliInfo('Gateway host machine control', options, [\n { label: 'Enabled', value: config.full_control_enabled ? 'Yes' : 'No' },\n { label: 'Gateway ID', value: config.gatewayId, verboseOnly: true },\n ])\n return\n }\n\n const enabled = action === 'enable' || action === 'on' || action === 'true'\n const disabled = action === 'disable' || action === 'off' || action === 'false'\n if (!enabled && !disabled) {\n throw new GatewayCliError(\n 'Unknown full-control command.',\n 'Use one of: enable, disable, status'\n )\n }\n\n const nextValue = enabled\n if (config.full_control_enabled === nextValue) {\n dependencies.cliInfo(\n `Gateway host machine control already ${nextValue ? 'enabled' : 'disabled'}.`,\n options\n )\n return\n }\n\n config.full_control_enabled = nextValue\n await dependencies.saveConfig(config, options)\n dependencies.onFullControlChanged?.(config, nextValue)\n dependencies.cliSuccess(\n `Gateway host machine control ${nextValue ? 'enabled' : 'disabled'}.`,\n options,\n [{ label: 'Gateway ID', value: config.gatewayId, verboseOnly: true }]\n )\n}\n\nexport async function showGatewayLogsCommand(\n options: ParsedArgs['options'],\n dependencies: GatewayCliCommandDependencies\n): Promise<void> {\n const linesRaw = getStringOption(options, 'lines')\n const lines = linesRaw ? Number.parseInt(linesRaw, 10) : 200\n const follow = options['no-follow'] !== true\n const { logPath } = dependencies.resolveGatewayPaths(options)\n\n try {\n const content = await fs.readFile(logPath, 'utf-8')\n const allLines = content.split(/\\r?\\n/)\n const tail = Number.isFinite(lines) && lines > 0 ? allLines.slice(-lines) : allLines\n const displayLines = Number.isFinite(lines) && lines > 0 ? lines : allLines.length\n const header = follow\n ? 'Following gateway logs (press Ctrl+C to stop)'\n : `Showing last ${displayLines} lines of gateway logs`\n dependencies.cliInfo(header, options, [\n { label: 'Log path', value: formatPathForDisplay(logPath), verboseOnly: true },\n ])\n process.stdout.write(`${tail.join('\\n')}\\n`)\n } catch (error) {\n dependencies.cliError('Unable to read gateway log file', options, [\n { label: 'Log path', value: formatPathForDisplay(logPath), verboseOnly: true },\n {\n label: 'Error',\n value: error instanceof Error ? error.message : String(error),\n verboseOnly: true,\n },\n ])\n return\n }\n\n if (!follow) return\n\n let position = 0\n try {\n const stat = await fs.stat(logPath)\n position = stat.size\n } catch {\n position = 0\n }\n\n fsSync.watch(logPath, { persistent: true }, async (event) => {\n if (event !== 'change') return\n try {\n const stat = await fs.stat(logPath)\n if (stat.size < position) {\n position = 0\n }\n const handle = await fs.open(logPath, 'r')\n const length = stat.size - position\n if (length > 0) {\n const buffer = Buffer.alloc(length)\n await handle.read(buffer, 0, length, position)\n position = stat.size\n process.stdout.write(buffer.toString('utf-8'))\n }\n await handle.close()\n } catch (error) {\n dependencies.cliError('Failed to tail gateway logs', options, [\n { label: 'Log path', value: formatPathForDisplay(logPath), verboseOnly: true },\n {\n label: 'Error',\n value: error instanceof Error ? error.message : String(error),\n verboseOnly: true,\n },\n ])\n }\n })\n\n await new Promise(() => undefined)\n}\n", "import fsSync from 'node:fs'\nimport { getStringOption, type ParsedArgs } from './cli-args.js'\nimport {\n formatPathForDisplay,\n truncateText,\n type CliDetail,\n} from './cli-output.js'\nimport type {\n GatewayProviderHealth,\n GatewayProviderId,\n} from './cli-providers/types.js'\nimport {\n formatProviderLabel,\n formatProviderProgressLine,\n} from './gateway-provider-health.js'\nimport type { GatewayProviderCapabilityProgressEvent } from './gateway-provider-capabilities.js'\nimport type { GatewayConfig, GatewayPaths } from './gateway-state.js'\n\ntype CliReporter = (\n message: string,\n options?: ParsedArgs['options'],\n details?: CliDetail[]\n) => void\n\nexport interface GatewayDoctorConfigResolution {\n configDir: string\n configPath: string\n migratedFrom?: string\n}\n\nexport interface GatewayDoctorEventPayload {\n level: 'info' | 'warn' | 'error'\n code?: string\n message: string\n provider?: string\n details?: Record<string, unknown>\n}\n\nexport interface GatewayDoctorDependencies<EventClient = unknown> {\n resolveGatewayPaths: (options?: ParsedArgs['options']) => GatewayPaths\n loadConfig: (options?: ParsedArgs['options']) => Promise<GatewayConfig>\n saveConfig: (config: GatewayConfig, options?: ParsedArgs['options']) => Promise<void>\n discoverGatewayCliCommands: (options?: ParsedArgs['options']) => Promise<void>\n buildCapabilities: (params?: {\n validationMode?: 'full' | 'light' | 'auto'\n previousHealth?: Partial<Record<GatewayProviderId, GatewayProviderHealth>>\n deviceName?: string | null\n installFullControlEnabled?: boolean\n onProgress?: (event: GatewayProviderCapabilityProgressEvent) => void\n }) => Promise<{\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>\n anyProviderReady: boolean\n }>\n createGatewayEventClient: (config: GatewayConfig) => Promise<EventClient | null>\n flushGatewayEvents: (client: EventClient, config: GatewayConfig) => Promise<void>\n emitGatewayEvent: (\n client: EventClient,\n config: GatewayConfig,\n payload: GatewayDoctorEventPayload\n ) => Promise<void>\n emitProviderHealthEvents: (\n client: EventClient,\n config: GatewayConfig,\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>,\n context: string\n ) => Promise<void>\n outputLine?: (line: string) => void\n configExists?: (path: string) => boolean\n cliInfo: CliReporter\n cliWarn: CliReporter\n}\n\nexport async function doctorGatewayCommand<EventClient = unknown>(\n options: ParsedArgs['options'],\n configResolution: GatewayDoctorConfigResolution | undefined,\n dependencies: GatewayDoctorDependencies<EventClient>\n): Promise<void> {\n const { configPath, configDir } = dependencies.resolveGatewayPaths(options)\n const configExists = dependencies.configExists ?? fsSync.existsSync\n const outputLine = dependencies.outputLine ?? console.log\n const paired = configExists(configPath)\n\n let config: GatewayConfig | null = null\n if (paired) {\n try {\n config = await dependencies.loadConfig(options)\n } catch (error) {\n dependencies.cliWarn('Unable to read gateway config.', options, [\n { label: 'Config path', value: formatPathForDisplay(configPath), verboseOnly: true },\n {\n label: 'Error',\n value: error instanceof Error ? error.message : String(error),\n verboseOnly: true,\n },\n ])\n }\n }\n\n dependencies.cliInfo('Gateway doctor report', options, [\n { label: 'Config dir', value: formatPathForDisplay(configDir) },\n { label: 'Paired', value: paired ? 'Yes' : 'No' },\n {\n label: 'Host machine control',\n value: config == null ? undefined : config.full_control_enabled ? 'Enabled' : 'Disabled',\n },\n { label: 'Gateway ID', value: config?.gatewayId ?? undefined, verboseOnly: true },\n { label: 'Team ID', value: config?.teamId ?? undefined, verboseOnly: true },\n ])\n\n dependencies.cliInfo('Validating providers...', options)\n await dependencies.discoverGatewayCliCommands(options)\n const { providerHealth, anyProviderReady } = await dependencies.buildCapabilities({\n validationMode: 'full',\n previousHealth: config?.providerHealth,\n installFullControlEnabled: config?.full_control_enabled === true,\n onProgress: (event) => {\n if (event.stage === 'start') {\n dependencies.cliInfo(` ${formatProviderLabel(event.providerId)}...`, options)\n return\n }\n dependencies.cliInfo(` ${formatProviderProgressLine(event)}`, options)\n },\n })\n\n if (config) {\n config.providerHealth = providerHealth\n await dependencies.saveConfig(config, options)\n }\n\n const providerEntries = Object.entries(providerHealth) as Array<\n [GatewayProviderId, GatewayProviderHealth]\n >\n\n outputLine('Provider status:')\n for (const [providerId, health] of providerEntries) {\n const error = health.error ? ` (${truncateText(health.error, 200)})` : ''\n outputLine(` - ${providerId}: ${health.status}${error}`)\n }\n\n if (!anyProviderReady) {\n dependencies.cliWarn(\n 'No providers passed validation. Install/authenticate a provider before starting the gateway.',\n options\n )\n }\n\n if (!config) return\n\n const eventClient = await dependencies.createGatewayEventClient(config)\n if (!eventClient) return\n\n await dependencies.flushGatewayEvents(eventClient, config)\n if (configResolution?.migratedFrom) {\n await dependencies.emitGatewayEvent(eventClient, config, {\n level: 'warn',\n code: 'config_dir_fallback',\n message: 'Gateway config directory was not writable; using fallback location.',\n details: {\n previous: configResolution.migratedFrom,\n current: configResolution.configDir,\n },\n })\n }\n await dependencies.emitProviderHealthEvents(eventClient, config, providerHealth, 'doctor')\n}\n", "import { truncateText } from './cli-output.js'\nimport type {\n GatewayHealthStatus,\n GatewayProviderHealth,\n GatewayProviderId,\n} from './cli-providers/types.js'\n\nexport function formatProviderLabel(providerId: GatewayProviderId): string {\n switch (providerId) {\n case 'claude_code':\n return 'Claude'\n case 'gemini':\n return 'Gemini'\n case 'codex':\n return 'Codex'\n default:\n return providerId\n }\n}\n\nexport function formatDurationMs(durationMs?: number): string | null {\n if (durationMs === undefined || durationMs === null) return null\n if (!Number.isFinite(durationMs)) return null\n if (durationMs < 1000) return `${Math.round(durationMs)}ms`\n return `${(durationMs / 1000).toFixed(1)}s`\n}\n\nexport function formatProviderProgressLine(params: {\n providerId: GatewayProviderId\n status?: GatewayHealthStatus\n durationMs?: number\n error?: string\n}): string {\n const label = formatProviderLabel(params.providerId)\n const status = params.status ?? 'unknown'\n const duration = formatDurationMs(params.durationMs)\n const suffixParts = []\n if (duration) suffixParts.push(duration)\n if (params.error) suffixParts.push(normalizeProviderErrorSummary(params.error, 120))\n const suffix = suffixParts.length > 0 ? ` (${suffixParts.join(' \u2022 ')})` : ''\n return `${label}: ${status}${suffix}`\n}\n\nexport function buildProviderHealthEventPayloads(\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>,\n context: string\n): Array<{\n level: 'warn' | 'error'\n code: string\n provider: GatewayProviderId\n message: string\n details: Record<string, unknown>\n}> {\n const entries = Object.entries(providerHealth) as Array<\n [GatewayProviderId, GatewayProviderHealth]\n >\n const payloads: Array<{\n level: 'warn' | 'error'\n code: string\n provider: GatewayProviderId\n message: string\n details: Record<string, unknown>\n }> = []\n for (const [providerId, health] of entries) {\n if (health.status === 'healthy') continue\n const error = typeof health.error === 'string' ? health.error : undefined\n const errorSummary = error ? normalizeProviderErrorSummary(error, 500) : undefined\n const message = errorSummary\n ? `${providerId} validation failed: ${errorSummary}`\n : `${providerId} validation status: ${health.status}`\n payloads.push({\n level: health.status === 'unhealthy' ? 'error' : 'warn',\n code: 'provider_validation',\n provider: providerId,\n message,\n details: {\n context,\n status: health.status,\n check_type: health.check_type,\n error: errorSummary ?? null,\n duration_ms: health.duration_ms ?? null,\n },\n })\n }\n return payloads\n}\n\nexport function normalizeProviderErrorSummary(\n message: string | null | undefined,\n maxLength = 500\n): string | undefined {\n if (!message) return undefined\n const normalized = message.replace(/\\s+/g, ' ').trim()\n if (!normalized) return undefined\n return truncateText(normalized, maxLength)\n}\n\nexport function buildProviderFailureMessage(\n providerId: GatewayProviderId,\n detail?: string | null\n): string {\n const label = formatProviderLabel(providerId)\n const detailSuffix = detail ? ` Details: ${detail}` : ''\n return `Gateway provider ${label} is unhealthy. Try another provider or run \"panorama-gateway doctor\".${detailSuffix}`\n}\n", "import os from 'node:os'\nimport process from 'node:process'\nimport {\n getStringOption,\n parseBooleanInput,\n type ParsedArgs,\n} from './cli-args.js'\nimport {\n GatewayCliError,\n formatPathForDisplay,\n type CliDetail,\n} from './cli-output.js'\nimport type {\n GatewayProviderHealth,\n GatewayProviderId,\n} from './cli-providers/types.js'\nimport {\n formatProviderLabel,\n formatProviderProgressLine,\n} from './gateway-provider-health.js'\nimport type { GatewayProviderCapabilityProgressEvent } from './gateway-provider-capabilities.js'\nimport type { GatewayConfig, GatewayPaths } from './gateway-state.js'\nimport {\n buildMissingSupabaseConfigError,\n resolveSupabaseConfig,\n} from './supabase-config.js'\n\ntype CliReporter = (\n message: string,\n options?: ParsedArgs['options'],\n details?: CliDetail[]\n) => void\n\ntype GatewayPairingFetchResponse = {\n ok: boolean\n status: number\n json: () => Promise<unknown>\n}\n\ntype GatewayPairingFetch = (\n url: string,\n init: {\n method: 'POST'\n headers: Record<string, string>\n body: string\n }\n) => Promise<GatewayPairingFetchResponse>\n\nexport interface GatewayPairingConfigResolution {\n configDir: string\n configPath: string\n migratedFrom?: string\n}\n\nexport interface GatewayPairingEventPayload {\n level: 'info' | 'warn' | 'error'\n code?: string\n message: string\n provider?: string\n details?: Record<string, unknown>\n}\n\nexport interface GatewayPairingDependencies<EventClient = unknown> {\n resolveGatewayPaths: (options?: ParsedArgs['options']) => GatewayPaths\n loadConfig: (options?: ParsedArgs['options']) => Promise<GatewayConfig>\n saveConfig: (config: GatewayConfig, options?: ParsedArgs['options']) => Promise<void>\n discoverGatewayCliCommands: (options?: ParsedArgs['options']) => Promise<void>\n buildCapabilities: (params?: {\n validationMode?: 'full' | 'light' | 'auto'\n previousHealth?: Partial<Record<GatewayProviderId, GatewayProviderHealth>>\n deviceName?: string | null\n installFullControlEnabled?: boolean\n onProgress?: (event: GatewayProviderCapabilityProgressEvent) => void\n }) => Promise<{\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>\n anyProviderReady: boolean\n }>\n createGatewayEventClient: (config: GatewayConfig) => Promise<EventClient | null>\n flushGatewayEvents: (client: EventClient, config: GatewayConfig) => Promise<void>\n emitGatewayEvent: (\n client: EventClient,\n config: GatewayConfig,\n payload: GatewayPairingEventPayload\n ) => Promise<void>\n emitProviderHealthEvents: (\n client: EventClient,\n config: GatewayConfig,\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>,\n context: string\n ) => Promise<void>\n fetchPairingCode?: GatewayPairingFetch\n env?: NodeJS.ProcessEnv\n hostname?: () => string\n logError: (message: string, data?: Record<string, unknown>) => void\n cliSuccess: CliReporter\n cliInfo: CliReporter\n cliWarn: CliReporter\n}\n\nasync function safeJson(response: { json: () => Promise<unknown> }): Promise<Record<string, unknown> | null> {\n try {\n const value = await response.json()\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : null\n } catch {\n return null\n }\n}\n\nfunction readRequiredPairingField(body: Record<string, unknown> | null, field: string): string {\n const value = body?.[field]\n return typeof value === 'string' && value.trim().length > 0 ? value : ''\n}\n\nexport async function pairGatewayCommand<EventClient = unknown>(\n code: string,\n options: ParsedArgs['options'],\n configResolution: GatewayPairingConfigResolution | undefined,\n dependencies: GatewayPairingDependencies<EventClient>\n): Promise<void> {\n dependencies.cliInfo('Pairing with team...', options)\n const env = dependencies.env ?? process.env\n const resolvedSupabaseConfig = resolveSupabaseConfig({\n cliSupabaseUrl: getStringOption(options, 'supabase-url'),\n cliAnonKey: getStringOption(options, 'anon-key'),\n env,\n })\n\n if (resolvedSupabaseConfig.missingFields.length > 0) {\n const { message, details } = buildMissingSupabaseConfigError(\n 'pair',\n resolvedSupabaseConfig.missingFields\n )\n throw new GatewayCliError(message, details)\n }\n\n const { supabaseUrl, supabaseAnonKey } = resolvedSupabaseConfig\n const deviceName =\n getStringOption(options, 'device-name') ||\n env.PANORAMA_GATEWAY_DEVICE_NAME ||\n dependencies.hostname?.() ||\n os.hostname()\n\n const url = `${supabaseUrl.replace(/\\/$/, '')}/functions/v1/exchange-gateway-pairing-code`\n const fetchPairingCode =\n dependencies.fetchPairingCode ??\n ((requestUrl, init) => fetch(requestUrl, init) as Promise<GatewayPairingFetchResponse>)\n const response = await fetchPairingCode(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n apikey: supabaseAnonKey,\n Authorization: `Bearer ${supabaseAnonKey}`,\n },\n body: JSON.stringify({\n code: code.trim(),\n device_name: deviceName,\n }),\n })\n\n const body = await safeJson(response)\n\n if (!response.ok || body?.success === false) {\n const message =\n typeof body?.error === 'string' ? body.error : `Pairing failed with status ${response.status}`\n throw new Error(message)\n }\n\n const accessToken = readRequiredPairingField(body, 'access_token')\n const refreshToken = readRequiredPairingField(body, 'refresh_token')\n const gatewayId = readRequiredPairingField(body, 'gateway_id')\n const teamId = readRequiredPairingField(body, 'team_id')\n if (!accessToken || !refreshToken || !gatewayId || !teamId) {\n throw new Error('Pairing response missing required fields')\n }\n\n const requestedFullControl = parseBooleanInput(options['full-control'])\n let existingConfig: GatewayConfig | null = null\n try {\n existingConfig = await dependencies.loadConfig(options)\n } catch {\n existingConfig = null\n }\n const installFullControlEnabled =\n requestedFullControl ?? existingConfig?.full_control_enabled ?? false\n\n const config: GatewayConfig = {\n supabaseUrl,\n supabaseAnonKey,\n accessToken,\n refreshToken,\n gatewayId,\n teamId,\n full_control_enabled: installFullControlEnabled,\n deviceName,\n }\n\n await dependencies.saveConfig(config, options)\n\n let providerHealthSummary: string | null = null\n let anyProviderReady = false\n let providerHealth: Record<GatewayProviderId, GatewayProviderHealth> | null = null\n try {\n dependencies.cliInfo('Validating providers...', options)\n await dependencies.discoverGatewayCliCommands(options)\n const { providerHealth: resolvedHealth, anyProviderReady: ready } =\n await dependencies.buildCapabilities({\n validationMode: 'full',\n installFullControlEnabled: config.full_control_enabled,\n onProgress: (event) => {\n if (event.stage === 'start') {\n dependencies.cliInfo(`Validating ${formatProviderLabel(event.providerId)}...`, options)\n return\n }\n dependencies.cliInfo(formatProviderProgressLine(event), options)\n },\n })\n config.providerHealth = resolvedHealth\n providerHealth = resolvedHealth\n await dependencies.saveConfig(config, options)\n providerHealthSummary = Object.entries(providerHealth)\n .map(([id, health]) => `${id}:${health.status}`)\n .join(', ')\n anyProviderReady = ready\n } catch (error) {\n dependencies.logError('Gateway provider validation failed during pairing', {\n error: error instanceof Error ? error.message : String(error),\n })\n }\n\n const { configPath } = dependencies.resolveGatewayPaths(options)\n dependencies.cliSuccess('Paired to team successfully', options, [\n { label: 'Config saved', value: formatPathForDisplay(configPath) },\n { label: 'Gateway ID', value: gatewayId, verboseOnly: true },\n { label: 'Team ID', value: teamId, verboseOnly: true },\n { label: 'Device', value: deviceName, verboseOnly: true },\n {\n label: 'Host machine control',\n value: installFullControlEnabled ? 'Enabled' : 'Disabled',\n verboseOnly: true,\n },\n ...(providerHealthSummary\n ? [{ label: 'Provider health', value: providerHealthSummary, verboseOnly: true }]\n : []),\n ])\n\n if (providerHealthSummary && !anyProviderReady) {\n dependencies.cliWarn(\n 'No gateway providers passed validation. Install/authenticate a provider before starting the gateway.',\n options,\n [{ label: 'Provider health', value: providerHealthSummary, verboseOnly: true }]\n )\n }\n\n const eventClient = await dependencies.createGatewayEventClient(config)\n if (!eventClient) return\n\n await dependencies.flushGatewayEvents(eventClient, config)\n if (configResolution?.migratedFrom) {\n await dependencies.emitGatewayEvent(eventClient, config, {\n level: 'warn',\n code: 'config_dir_fallback',\n message: 'Gateway config directory was not writable; using fallback location.',\n details: {\n previous: configResolution.migratedFrom,\n current: configResolution.configDir,\n },\n })\n }\n\n if (providerHealth) {\n await dependencies.emitProviderHealthEvents(eventClient, config, providerHealth, 'pairing')\n }\n}\n", "// Auto-generated by scripts/generate-prod-defaults.mjs\nexport const PROD_SUPABASE_URL = \"https://api.panorama.app\"\nexport const PROD_SUPABASE_ANON_KEY = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImF0aHp3Y2ZkbHVzZGpraHl4amllIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTcyNzg4ODIsImV4cCI6MjA3Mjg1NDg4Mn0.PKDawoNKeeblcCuOEdlwO57YOodwDL2ey1UmqThiJdc\"\n", "import { PROD_SUPABASE_ANON_KEY, PROD_SUPABASE_URL } from './prod-defaults.generated.js'\n\ntype MissingSupabaseField = 'supabaseUrl' | 'supabaseAnonKey'\ntype SupabaseValueSource = 'cli' | 'env' | 'config' | 'default' | 'missing'\n\ntype SupabaseValueCandidate = {\n source: Exclude<SupabaseValueSource, 'missing'>\n value: string | null | undefined\n}\n\nexport interface ResolveSupabaseConfigInput {\n cliSupabaseUrl?: string\n cliAnonKey?: string\n configSupabaseUrl?: string | null\n configAnonKey?: string | null\n env?: NodeJS.ProcessEnv\n}\n\nexport interface ResolvedSupabaseConfig {\n supabaseUrl: string\n supabaseAnonKey: string\n urlSource: SupabaseValueSource\n anonKeySource: SupabaseValueSource\n missingFields: MissingSupabaseField[]\n}\n\ninterface MissingSupabaseErrorContext {\n configPath?: string\n}\n\nfunction normalizeSupabaseValue(value: string | null | undefined): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction resolveSupabaseValue(candidates: readonly SupabaseValueCandidate[]): {\n value: string\n source: SupabaseValueSource\n} {\n for (const candidate of candidates) {\n const normalized = normalizeSupabaseValue(candidate.value)\n if (normalized) {\n return { value: normalized, source: candidate.source }\n }\n }\n\n return { value: '', source: 'missing' }\n}\n\nexport function resolveSupabaseConfig(input: ResolveSupabaseConfigInput): ResolvedSupabaseConfig {\n const env = input.env ?? process.env\n const url = resolveSupabaseValue([\n { source: 'cli', value: input.cliSupabaseUrl },\n { source: 'env', value: env.PANORAMA_SUPABASE_URL },\n { source: 'env', value: env.SUPABASE_URL },\n { source: 'config', value: input.configSupabaseUrl },\n { source: 'default', value: PROD_SUPABASE_URL },\n ])\n const anonKey = resolveSupabaseValue([\n { source: 'cli', value: input.cliAnonKey },\n { source: 'env', value: env.PANORAMA_SUPABASE_ANON_KEY },\n { source: 'env', value: env.SUPABASE_ANON_KEY },\n { source: 'env', value: env.SUPABASE_PUBLISHABLE_KEY },\n { source: 'config', value: input.configAnonKey },\n { source: 'default', value: PROD_SUPABASE_ANON_KEY },\n ])\n\n const missingFields: MissingSupabaseField[] = []\n if (!url.value) missingFields.push('supabaseUrl')\n if (!anonKey.value) missingFields.push('supabaseAnonKey')\n\n return {\n supabaseUrl: url.value,\n supabaseAnonKey: anonKey.value,\n urlSource: url.source,\n anonKeySource: anonKey.source,\n missingFields,\n }\n}\n\nfunction formatMissingFields(missingFields: readonly MissingSupabaseField[]): string {\n const labels = missingFields.map((field) =>\n field === 'supabaseUrl' ? 'Supabase URL' : 'Supabase anon key'\n )\n if (labels.length <= 1) return labels[0] ?? 'Supabase configuration'\n return `${labels.slice(0, -1).join(', ')} and ${labels[labels.length - 1]}`\n}\n\nexport function buildMissingSupabaseConfigError(\n action: 'pair' | 'start',\n missingFields: readonly MissingSupabaseField[],\n context: MissingSupabaseErrorContext = {}\n): { message: string; details: string } {\n const missingSummary = formatMissingFields(missingFields)\n const message =\n action === 'pair'\n ? 'Missing Supabase configuration for pairing.'\n : 'Missing Supabase configuration for gateway start.'\n\n const guidance =\n 'Install or reinstall @panorama-ai/gateway to refresh built-in backend configuration, or set PANORAMA_SUPABASE_URL and PANORAMA_SUPABASE_ANON_KEY via --env / --env-file for development overrides.'\n\n const configPathDetail =\n action === 'start' && context.configPath\n ? ` Existing config path: ${context.configPath}.`\n : ''\n\n return {\n message,\n details: `${missingSummary} not found.${configPathDetail} ${guidance}`.trim(),\n }\n}\n", "import { spawn, type ChildProcess } from 'node:child_process'\nimport process from 'node:process'\nimport { buildGatewayChildProcessEnv } from './child-process-env.js'\nimport { resolveGatewayTmpDir } from './runtime-paths.js'\nimport { StreamJsonCollector } from './stream-json-collector.js'\nimport { requestChildTermination, type TerminationOptions } from './process-control.js'\nimport { BoundedOutputCapture } from './process-output-capture.js'\nimport type { SubagentStreamEvent } from './subagent-adapters/types.js'\n\nexport const DEFAULT_GATEWAY_COMMAND_TIMEOUT_MS = 30 * 60_000\nexport const DEFAULT_GATEWAY_COMMAND_OUTPUT_BYTES = 5_000_000\nexport const DEFAULT_GATEWAY_STREAM_EVENTS = 2000\nexport const DEFAULT_GATEWAY_STREAM_BUFFER_CHARS = 200_000\nexport const DEFAULT_GATEWAY_COMMAND_TERMINATION_GRACE_MS = 2_000\n\nexport interface GatewayCommandEnvOptions {\n baseEnv?: NodeJS.ProcessEnv\n overrides?: NodeJS.ProcessEnv\n tmpDir?: string\n}\n\nexport interface GatewayCommandRunOptions {\n timeoutMs?: number\n cwd?: string\n env?: NodeJS.ProcessEnv\n onStart?: (child: ChildProcess) => void\n outputLimitBytes?: number\n terminationGraceMs?: number\n timeoutContext?: string\n baseEnv?: NodeJS.ProcessEnv\n tmpDir?: string\n onTerminationError?: (phase: 'sigterm' | 'sigkill', error: unknown, context: string) => void\n terminateChild?: (child: ChildProcess, options: TerminationOptions) => void\n}\n\nexport interface GatewayStreamingCommandRunOptions extends GatewayCommandRunOptions {\n maxStreamEvents?: number\n maxStreamBufferChars?: number\n}\n\nexport interface GatewayCommandResult {\n ok: boolean\n stdout: string\n stderr: string\n exitCode: number | null\n durationMs: number\n timedOut: boolean\n stdoutTruncated: boolean\n stderrTruncated: boolean\n error?: string\n}\n\nexport interface GatewayStreamingCommandResult extends GatewayCommandResult {\n events: SubagentStreamEvent[]\n}\n\nexport function buildGatewayCommandEnv(\n options: GatewayCommandEnvOptions = {}\n): NodeJS.ProcessEnv {\n return buildGatewayChildProcessEnv({\n baseEnv: options.baseEnv ?? process.env,\n tmpDir: options.tmpDir ?? resolveGatewayTmpDir(),\n overrides: options.overrides,\n })\n}\n\nfunction resolveCommandTimeoutMs(timeoutMs: number | undefined): number {\n return timeoutMs ?? DEFAULT_GATEWAY_COMMAND_TIMEOUT_MS\n}\n\nfunction requestTimedOutChildTermination(\n child: ChildProcess,\n options: GatewayCommandRunOptions\n): void {\n const context = options.timeoutContext ?? 'runGatewayCommand'\n const terminate = options.terminateChild ?? requestChildTermination\n terminate(child, {\n reason: 'process_timeout',\n graceMs: options.terminationGraceMs ?? DEFAULT_GATEWAY_COMMAND_TERMINATION_GRACE_MS,\n onError: (phase, error) => options.onTerminationError?.(phase, error, context),\n })\n}\n\nexport async function runGatewayCommand(\n command: string,\n args: string[],\n options: GatewayCommandRunOptions = {}\n): Promise<GatewayCommandResult> {\n const start = Date.now()\n const timeoutMs = resolveCommandTimeoutMs(options.timeoutMs)\n const outputLimitBytes = options.outputLimitBytes ?? DEFAULT_GATEWAY_COMMAND_OUTPUT_BYTES\n\n return await new Promise((resolve) => {\n const stdoutOutput = new BoundedOutputCapture(outputLimitBytes)\n const stderrOutput = new BoundedOutputCapture(outputLimitBytes)\n let timedOut = false\n\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: buildGatewayCommandEnv({\n baseEnv: options.baseEnv,\n tmpDir: options.tmpDir,\n overrides: options.env,\n }),\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n options.onStart?.(child)\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdoutOutput.append(chunk)\n })\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderrOutput.append(chunk)\n })\n\n const timer =\n timeoutMs && Number.isFinite(timeoutMs)\n ? setTimeout(() => {\n timedOut = true\n requestTimedOutChildTermination(child, options)\n }, timeoutMs)\n : null\n\n const finalize = (exitCode: number | null, error?: string) => {\n if (timer) clearTimeout(timer)\n const durationMs = Date.now() - start\n const stdout = stdoutOutput.readText()\n const stderr = stderrOutput.readText()\n const ok = !timedOut && exitCode === 0 && !error\n resolve({\n ok,\n stdout,\n stderr,\n exitCode,\n durationMs,\n timedOut,\n stdoutTruncated: stdoutOutput.truncated,\n stderrTruncated: stderrOutput.truncated,\n error,\n })\n }\n\n child.on('error', (error) => {\n finalize(null, error.message)\n })\n\n child.on('close', (code) => {\n finalize(code ?? null)\n })\n })\n}\n\nexport async function runGatewayStreamingCommand(\n command: string,\n args: string[],\n options: GatewayStreamingCommandRunOptions = {}\n): Promise<GatewayStreamingCommandResult> {\n const start = Date.now()\n const timeoutMs = resolveCommandTimeoutMs(options.timeoutMs)\n const outputLimitBytes = options.outputLimitBytes ?? DEFAULT_GATEWAY_COMMAND_OUTPUT_BYTES\n\n return await new Promise((resolve) => {\n const stderrOutput = new BoundedOutputCapture(outputLimitBytes)\n let timedOut = false\n const collector = new StreamJsonCollector({\n maxOutputBytes: outputLimitBytes,\n maxEvents: options.maxStreamEvents ?? DEFAULT_GATEWAY_STREAM_EVENTS,\n maxBufferChars: options.maxStreamBufferChars ?? DEFAULT_GATEWAY_STREAM_BUFFER_CHARS,\n })\n\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: buildGatewayCommandEnv({\n baseEnv: options.baseEnv,\n tmpDir: options.tmpDir,\n overrides: options.env,\n }),\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n options.onStart?.(child)\n\n child.stdout?.on('data', (chunk: Buffer) => {\n collector.append(chunk)\n })\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderrOutput.append(chunk)\n })\n\n const timer =\n timeoutMs && Number.isFinite(timeoutMs)\n ? setTimeout(() => {\n timedOut = true\n requestTimedOutChildTermination(child, {\n ...options,\n timeoutContext: options.timeoutContext ?? 'runGatewayStreamingCommand',\n })\n }, timeoutMs)\n : null\n\n const finalize = (exitCode: number | null, error?: string) => {\n if (timer) clearTimeout(timer)\n const streamResult = collector.finalize()\n const durationMs = Date.now() - start\n const stderr = stderrOutput.readText()\n const ok = !timedOut && exitCode === 0 && !error\n resolve({\n ok,\n stdout: streamResult.stdout,\n stderr,\n exitCode,\n durationMs,\n timedOut,\n stdoutTruncated: streamResult.stdoutTruncated || streamResult.eventsTruncated,\n stderrTruncated: stderrOutput.truncated,\n events: streamResult.events,\n error,\n })\n }\n\n child.on('error', (error) => {\n finalize(null, error.message)\n })\n\n child.on('close', (code) => {\n finalize(code ?? null)\n })\n })\n}\n", "import process from 'node:process'\n\nconst GATEWAY_CHILD_ENV_BLOCKED_KEYS = new Set([\n 'DATABASE_URL',\n 'DATABASE_CA_CERT',\n 'SUPABASE_URL',\n 'SUPABASE_ANON_KEY',\n 'SUPABASE_PUBLISHABLE_KEY',\n 'SUPABASE_SERVICE_ROLE_KEY',\n 'SUPABASE_SECRET_KEY',\n 'PANORAMA_SUPABASE_URL',\n 'PANORAMA_SUPABASE_ANON_KEY',\n 'PANORAMA_ENV',\n 'PANORAMA_ENV_FILE',\n 'PANORAMA_ENV_PATH',\n 'OPENROUTER_API_KEY',\n 'BRAVE_SEARCH_API_KEY',\n])\n\nconst GATEWAY_CHILD_ENV_BLOCKED_PREFIXES = ['PANORAMA_GATEWAY_']\n\nexport function isGatewayInternalEnvVar(key: string): boolean {\n if (!key) return false\n if (GATEWAY_CHILD_ENV_BLOCKED_KEYS.has(key)) return true\n return GATEWAY_CHILD_ENV_BLOCKED_PREFIXES.some((prefix) => key.startsWith(prefix))\n}\n\nexport function scrubGatewayInternalEnv(\n baseEnv: NodeJS.ProcessEnv = process.env\n): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {}\n for (const [key, value] of Object.entries(baseEnv)) {\n if (value === undefined) continue\n if (isGatewayInternalEnvVar(key)) continue\n env[key] = value\n }\n return env\n}\n\nexport function buildGatewayChildProcessEnv(params?: {\n baseEnv?: NodeJS.ProcessEnv\n tmpDir?: string\n overrides?: NodeJS.ProcessEnv\n}): NodeJS.ProcessEnv {\n const baseEnv = params?.baseEnv ?? process.env\n const env = scrubGatewayInternalEnv(baseEnv)\n const tmpDir = params?.tmpDir\n if (tmpDir) {\n env.TMPDIR = tmpDir\n env.TMP = tmpDir\n env.TEMP = tmpDir\n }\n const overrides = params?.overrides\n if (overrides) {\n for (const [key, value] of Object.entries(overrides)) {\n if (value === undefined) {\n delete env[key]\n } else {\n env[key] = value\n }\n }\n }\n return env\n}\n", "import os from 'node:os'\nimport path from 'node:path'\n\nexport const DEFAULT_GATEWAY_CONFIG_DIR = path.join(os.homedir(), '.panorama', 'gateway')\n\nexport function resolveGatewayConfigDir(rawOverride?: string | null): string {\n const raw = rawOverride ?? process.env.PANORAMA_GATEWAY_CONFIG_DIR ?? DEFAULT_GATEWAY_CONFIG_DIR\n return path.resolve(raw)\n}\n\nexport function resolveGatewayConfigPath(\n configDir: string = resolveGatewayConfigDir(),\n rawOverride?: string | null\n): string {\n const raw = rawOverride ?? process.env.PANORAMA_GATEWAY_CONFIG_PATH\n return raw ? path.resolve(raw) : path.join(configDir, 'gateway.json')\n}\n\nexport function resolveGatewayLogPath(\n configPath: string = resolveGatewayConfigPath(),\n rawOverride?: string | null\n): string {\n const raw = rawOverride ?? process.env.PANORAMA_GATEWAY_LOG_PATH\n return raw ? path.resolve(raw) : path.join(path.dirname(configPath), 'gateway.log')\n}\n\nexport function resolveGatewayPidPath(\n configPath: string = resolveGatewayConfigPath(),\n rawOverride?: string | null\n): string {\n const raw = rawOverride ?? process.env.PANORAMA_GATEWAY_PID_PATH\n return raw ? path.resolve(raw) : path.join(path.dirname(configPath), 'gateway.pid')\n}\n\nexport function resolveGatewayTmpDir(configDir: string = resolveGatewayConfigDir()): string {\n return path.join(configDir, 'tmp')\n}\n\nexport function resolveGatewayWorkdirRoot(configDir: string = resolveGatewayConfigDir()): string {\n return path.join(configDir, 'work')\n}\n\nexport function resolveSubagentWorkdirRoot(configDir: string = resolveGatewayConfigDir()): string {\n return path.join(resolveGatewayWorkdirRoot(configDir), 'subagents')\n}\n\nexport function resolveModelWorkdirRoot(configDir: string = resolveGatewayConfigDir()): string {\n return path.join(resolveGatewayWorkdirRoot(configDir), 'model-runs')\n}\n\nexport function resolveValidationWorkdirRoot(configDir: string = resolveGatewayConfigDir()): string {\n return path.join(resolveGatewayWorkdirRoot(configDir), 'validation')\n}\n", "export interface BoundedOutputCaptureSnapshot {\n text: string\n observedBytes: number\n capturedBytes: number\n truncated: boolean\n}\n\nexport class BoundedOutputCapture {\n private readonly chunks: Buffer[] = []\n private observedByteCount = 0\n private capturedByteCount = 0\n private wasTruncated = false\n\n constructor(private readonly maxBytes: number) {}\n\n append(chunk: Buffer): void {\n this.observedByteCount += chunk.length\n\n if (this.capturedByteCount >= this.maxBytes) {\n this.wasTruncated = true\n return\n }\n\n const remainingBytes = this.maxBytes - this.capturedByteCount\n if (chunk.length > remainingBytes) {\n this.chunks.push(Buffer.from(chunk.subarray(0, remainingBytes)))\n this.capturedByteCount = this.maxBytes\n this.wasTruncated = true\n return\n }\n\n this.chunks.push(Buffer.from(chunk))\n this.capturedByteCount += chunk.length\n }\n\n get observedBytes(): number {\n return this.observedByteCount\n }\n\n get capturedBytes(): number {\n return this.capturedByteCount\n }\n\n get truncated(): boolean {\n return this.wasTruncated\n }\n\n readText(): string {\n return Buffer.concat(this.chunks, this.capturedByteCount).toString('utf8')\n }\n\n snapshot(): BoundedOutputCaptureSnapshot {\n return {\n text: this.readText(),\n observedBytes: this.observedByteCount,\n capturedBytes: this.capturedByteCount,\n truncated: this.wasTruncated,\n }\n }\n}\n", "import type { SubagentStreamEvent } from './subagent-adapters/types.js'\nimport { BoundedOutputCapture } from './process-output-capture.js'\n\nexport interface StreamJsonCollectorOptions {\n maxOutputBytes: number\n maxEvents: number\n maxBufferChars: number\n}\n\nexport interface StreamJsonCollectorResult {\n stdout: string\n stdoutBytes: number\n stdoutTruncated: boolean\n events: SubagentStreamEvent[]\n eventsTruncated: boolean\n}\n\nexport class StreamJsonCollector {\n private readonly stdoutOutput: BoundedOutputCapture\n private readonly events: SubagentStreamEvent[] = []\n private stdoutTruncated = false\n private eventsTruncated = false\n private buffer = ''\n private nextSequence = 0\n\n constructor(private readonly options: StreamJsonCollectorOptions) {\n this.stdoutOutput = new BoundedOutputCapture(options.maxOutputBytes)\n }\n\n append(chunk: Buffer): void {\n this.captureStdout(chunk)\n this.buffer += chunk.toString('utf-8')\n if (this.buffer.length > this.options.maxBufferChars) {\n this.buffer = this.buffer.slice(-this.options.maxBufferChars)\n this.stdoutTruncated = true\n }\n\n let newlineIndex = this.buffer.indexOf('\\n')\n while (newlineIndex >= 0) {\n const line = this.buffer.slice(0, newlineIndex)\n this.buffer = this.buffer.slice(newlineIndex + 1)\n this.captureLine(line)\n newlineIndex = this.buffer.indexOf('\\n')\n }\n }\n\n finalize(): StreamJsonCollectorResult {\n if (this.buffer.trim().length > 0) {\n this.captureLine(this.buffer)\n this.buffer = ''\n }\n\n return {\n stdout: this.stdoutOutput.readText(),\n stdoutBytes: this.stdoutOutput.capturedBytes,\n stdoutTruncated: this.stdoutOutput.truncated || this.stdoutTruncated,\n events: [...this.events],\n eventsTruncated: this.eventsTruncated,\n }\n }\n\n private captureStdout(chunk: Buffer): void {\n this.stdoutOutput.append(chunk)\n }\n\n private captureLine(line: string): void {\n const trimmed = line.trim()\n if (!trimmed) return\n\n let event: Record<string, unknown> | null = null\n try {\n event = JSON.parse(trimmed) as Record<string, unknown>\n } catch {\n event = null\n }\n\n this.events.push({\n sequence: this.nextSequence,\n raw: trimmed,\n event,\n })\n this.nextSequence += 1\n\n if (this.events.length > this.options.maxEvents) {\n this.events.splice(0, this.events.length - this.options.maxEvents)\n this.eventsTruncated = true\n }\n }\n}\n", "import type { ChildProcess } from 'node:child_process'\n\ntype KillSignal = NodeJS.Signals | number\n\nexport interface TerminationOptions {\n graceMs: number\n reason: string\n onError?: (phase: 'sigterm' | 'sigkill', error: unknown) => void\n}\n\nexport function isChildProcessRunning(child: ChildProcess | undefined): boolean {\n if (!child) return false\n return child.exitCode === null && child.signalCode === null\n}\n\nexport function requestChildTermination(\n child: ChildProcess | undefined,\n options: TerminationOptions\n): void {\n if (!child) return\n if (!isChildProcessRunning(child)) return\n\n try {\n child.kill('SIGTERM' as KillSignal)\n } catch (error) {\n options.onError?.('sigterm', error)\n return\n }\n\n const killTimer = setTimeout(() => {\n if (!isChildProcessRunning(child)) return\n try {\n child.kill('SIGKILL' as KillSignal)\n } catch (error) {\n options.onError?.('sigkill', error)\n }\n }, options.graceMs)\n\n if (typeof killTimer.unref === 'function') {\n killTimer.unref()\n }\n}\n", "import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport process from 'node:process'\n\nexport const OWNER_ONLY_DIRECTORY_MODE = 0o700\nexport const OWNER_ONLY_FILE_MODE = 0o600\n\nfunction normalizeMode(mode: number): number {\n return mode & 0o777\n}\n\nexport function shouldEnforceOwnerOnlyPermissions(): boolean {\n return process.platform !== 'win32'\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n return (error as NodeJS.ErrnoException)?.code === 'ENOENT'\n}\n\nexport async function ensureOwnerOnlyDirectory(dirPath: string): Promise<void> {\n if (shouldEnforceOwnerOnlyPermissions()) {\n await fs.mkdir(dirPath, { recursive: true, mode: OWNER_ONLY_DIRECTORY_MODE })\n const stat = await fs.stat(dirPath)\n if (!stat.isDirectory()) {\n throw new Error(`Expected directory at ${dirPath}`)\n }\n if (normalizeMode(stat.mode) !== OWNER_ONLY_DIRECTORY_MODE) {\n await fs.chmod(dirPath, OWNER_ONLY_DIRECTORY_MODE)\n }\n return\n }\n\n await fs.mkdir(dirPath, { recursive: true })\n}\n\nexport async function ensureOwnerOnlyFile(filePath: string): Promise<void> {\n if (!shouldEnforceOwnerOnlyPermissions()) return\n\n let stat\n try {\n stat = await fs.stat(filePath)\n } catch (error) {\n if (isNotFoundError(error)) return\n throw error\n }\n\n if (!stat.isFile()) {\n throw new Error(`Expected regular file at ${filePath}`)\n }\n\n if (normalizeMode(stat.mode) !== OWNER_ONLY_FILE_MODE) {\n await fs.chmod(filePath, OWNER_ONLY_FILE_MODE)\n }\n}\n\nexport async function writeOwnerOnlyFile(\n filePath: string,\n contents: string\n): Promise<void> {\n await ensureOwnerOnlyDirectory(path.dirname(filePath))\n if (shouldEnforceOwnerOnlyPermissions()) {\n await fs.writeFile(filePath, contents, { encoding: 'utf-8', mode: OWNER_ONLY_FILE_MODE })\n await ensureOwnerOnlyFile(filePath)\n return\n }\n\n await fs.writeFile(filePath, contents, { encoding: 'utf-8' })\n}\n", "import fsSync from 'node:fs'\nimport fs from 'node:fs/promises'\nimport type { ParsedArgs } from './cli-args.js'\nimport {\n ensureOwnerOnlyDirectory,\n ensureOwnerOnlyFile,\n writeOwnerOnlyFile,\n} from './local-security.js'\nimport {\n resolveGatewayConfigDir,\n resolveGatewayConfigPath,\n resolveGatewayLogPath,\n resolveGatewayPidPath,\n resolveGatewayTmpDir,\n resolveGatewayWorkdirRoot,\n resolveSubagentWorkdirRoot as resolveSubagentWorkdirRootBase,\n} from './runtime-paths.js'\nimport type { GatewayProviderHealth, GatewayProviderId } from './cli-providers/types.js'\n\nexport interface GatewayConfig {\n supabaseUrl: string\n supabaseAnonKey: string\n accessToken: string\n refreshToken: string\n gatewayId: string\n teamId: string\n full_control_enabled: boolean\n deviceName?: string | null\n providerHealth?: Record<GatewayProviderId, GatewayProviderHealth>\n}\n\nexport type GatewayPaths = {\n configDir: string\n configPath: string\n logPath: string\n pidPath: string\n}\n\nexport function resolveGatewayPaths(\n options: ParsedArgs['options'] = {},\n env: NodeJS.ProcessEnv = process.env\n): GatewayPaths {\n const configDirRaw =\n typeof options['config-dir'] === 'string'\n ? options['config-dir']\n : env.PANORAMA_GATEWAY_CONFIG_DIR || null\n const configDir = resolveGatewayConfigDir(configDirRaw)\n\n const configPathRaw =\n typeof options['config-path'] === 'string'\n ? options['config-path']\n : env.PANORAMA_GATEWAY_CONFIG_PATH || null\n const configPath = resolveGatewayConfigPath(configDir, configPathRaw)\n\n const logPathRaw =\n typeof options['log-path'] === 'string' ? options['log-path'] : env.PANORAMA_GATEWAY_LOG_PATH || null\n const logPath = resolveGatewayLogPath(configPath, logPathRaw)\n\n const pidPathRaw =\n typeof options['pid-path'] === 'string' ? options['pid-path'] : env.PANORAMA_GATEWAY_PID_PATH || null\n const pidPath = resolveGatewayPidPath(configPath, pidPathRaw)\n\n if (!env.PANORAMA_GATEWAY_CONFIG_DIR) {\n env.PANORAMA_GATEWAY_CONFIG_DIR = configDir\n }\n if (!env.PANORAMA_GATEWAY_CONFIG_PATH) {\n env.PANORAMA_GATEWAY_CONFIG_PATH = configPath\n }\n if (!env.PANORAMA_GATEWAY_LOG_PATH) {\n env.PANORAMA_GATEWAY_LOG_PATH = logPath\n }\n if (!env.PANORAMA_GATEWAY_PID_PATH) {\n env.PANORAMA_GATEWAY_PID_PATH = pidPath\n }\n\n return { configDir, configPath, logPath, pidPath }\n}\n\nexport async function ensureGatewayStatePermissions(paths: GatewayPaths): Promise<void> {\n await ensureOwnerOnlyDirectory(paths.configDir)\n await ensureOwnerOnlyDirectory(resolveGatewayTmpDir(paths.configDir))\n await ensureOwnerOnlyDirectory(resolveGatewayWorkdirRoot(paths.configDir))\n await ensureOwnerOnlyFile(paths.configPath)\n await ensureOwnerOnlyFile(paths.logPath)\n await ensureOwnerOnlyFile(paths.pidPath)\n}\n\nexport function resolveGatewaySubagentWorkdirRoot(\n options: ParsedArgs['options'] = {},\n env: NodeJS.ProcessEnv = process.env\n): string {\n const { configDir } = resolveGatewayPaths(options, env)\n return resolveSubagentWorkdirRootBase(configDir)\n}\n\nexport async function loadGatewayConfig(\n options: ParsedArgs['options'] = {},\n env: NodeJS.ProcessEnv = process.env\n): Promise<GatewayConfig> {\n const { configPath } = resolveGatewayPaths(options, env)\n await ensureOwnerOnlyFile(configPath)\n const raw = await fs.readFile(configPath, 'utf-8')\n const parsed = JSON.parse(raw) as Partial<GatewayConfig> | null\n return {\n ...(parsed ?? {}),\n supabaseUrl: parsed?.supabaseUrl ?? '',\n supabaseAnonKey: parsed?.supabaseAnonKey ?? '',\n accessToken: parsed?.accessToken ?? '',\n refreshToken: parsed?.refreshToken ?? '',\n gatewayId: parsed?.gatewayId ?? '',\n teamId: parsed?.teamId ?? '',\n full_control_enabled: parsed?.full_control_enabled === true,\n }\n}\n\nexport async function saveGatewayConfig(\n config: GatewayConfig,\n options: ParsedArgs['options'] = {},\n env: NodeJS.ProcessEnv = process.env\n): Promise<void> {\n const { configPath } = resolveGatewayPaths(options, env)\n await writeOwnerOnlyFile(configPath, JSON.stringify(config, null, 2))\n}\n\nexport function readPidFile(\n options: ParsedArgs['options'] = {},\n env: NodeJS.ProcessEnv = process.env\n): number | null {\n const { pidPath } = resolveGatewayPaths(options, env)\n try {\n const raw = fsSync.readFileSync(pidPath, 'utf-8').trim()\n const pid = Number.parseInt(raw, 10)\n return Number.isFinite(pid) ? pid : null\n } catch {\n return null\n }\n}\n\nexport async function writePidFile(\n pid: number,\n options: ParsedArgs['options'] = {},\n env: NodeJS.ProcessEnv = process.env\n): Promise<void> {\n const { pidPath } = resolveGatewayPaths(options, env)\n await writeOwnerOnlyFile(pidPath, `${pid}\\n`)\n}\n\nexport async function removePidFile(\n options: ParsedArgs['options'] = {},\n env: NodeJS.ProcessEnv = process.env\n): Promise<void> {\n const { pidPath } = resolveGatewayPaths(options, env)\n try {\n await fs.unlink(pidPath)\n } catch {\n // ignore missing pid\n }\n}\n\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch {\n return false\n }\n}\n", "import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport type { Json } from './database.types.js'\nimport { ensureOwnerOnlyDirectory, writeOwnerOnlyFile } from './local-security.js'\n\nexport const DEFAULT_GATEWAY_LOG_BYTES = 200_000\n\nexport function isPathWithin(root: string, target: string): boolean {\n const relative = path.relative(root, target)\n if (!relative) return true\n return !relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative)\n}\n\nexport function sanitizeWorkSegment(value: string, label: string): string {\n const trimmed = value.trim()\n if (!trimmed) {\n throw new Error(`${label} is required`)\n }\n if (trimmed === '.' || trimmed === '..') {\n throw new Error(`${label} contains invalid path segments`)\n }\n if (trimmed.includes('/') || trimmed.includes('\\\\')) {\n throw new Error(`${label} contains path separators`)\n }\n return trimmed\n}\n\nexport function buildWorkDirPath(\n root: string,\n segments: Array<{ value: string; label: string }>\n): string {\n const cleaned = segments.map((segment) => sanitizeWorkSegment(segment.value, segment.label))\n return path.join(root, ...cleaned)\n}\n\nexport async function createWorkDir(\n root: string,\n segments: Array<{ value: string; label: string }>\n): Promise<string> {\n const dir = buildWorkDirPath(root, segments)\n await ensureOwnerOnlyDirectory(dir)\n return dir\n}\n\nexport async function cleanupWorkDir(workDir: string, root: string): Promise<void> {\n const resolvedRoot = path.resolve(root)\n const resolvedWorkDir = path.resolve(workDir)\n try {\n await fs.rm(resolvedWorkDir, { recursive: true, force: true })\n } catch {\n return\n }\n let current = path.dirname(resolvedWorkDir)\n while (current !== resolvedRoot && isPathWithin(resolvedRoot, current)) {\n try {\n const entries = await fs.readdir(current)\n if (entries.length > 0) return\n await fs.rmdir(current)\n current = path.dirname(current)\n } catch {\n return\n }\n }\n}\n\nexport function resolveSafeWorkPath(workDir: string, relativePath: string, label: string): string {\n const trimmed = relativePath.trim()\n if (!trimmed) {\n throw new Error(`${label} path is required`)\n }\n if (path.isAbsolute(trimmed)) {\n throw new Error(`${label} path must be relative`)\n }\n const normalized = path.normalize(trimmed)\n if (normalized === '..' || normalized.startsWith(`..${path.sep}`)) {\n throw new Error(`${label} path must stay within work directory`)\n }\n const resolved = path.resolve(workDir, normalized)\n if (!isPathWithin(path.resolve(workDir), resolved)) {\n throw new Error(`${label} path must stay within work directory`)\n }\n return resolved\n}\n\nexport async function writeRunPlanFiles(\n workDir: string,\n files: Array<{ path: string; contents: string }> | undefined\n): Promise<void> {\n if (!files || files.length === 0) return\n for (const file of files) {\n const filePath = resolveSafeWorkPath(workDir, file.path, 'Run plan file')\n await writeOwnerOnlyFile(filePath, file.contents)\n }\n}\n\nexport function assertSafeOutputPath(workDir: string, outputPath: string | undefined): void {\n if (!outputPath) return\n resolveSafeWorkPath(workDir, outputPath, 'Run plan output')\n}\n\nexport function resolveRunPlanEnv(\n env: NodeJS.ProcessEnv | undefined,\n workDir: string\n): NodeJS.ProcessEnv | undefined {\n if (!env) return undefined\n return Object.fromEntries(\n Object.entries(env).map(([key, value]) => {\n if (typeof value === 'string' && value.includes('{WORKDIR}')) {\n return [key, value.replace(/\\{WORKDIR\\}/g, workDir)]\n }\n return [key, value]\n })\n )\n}\n\nexport function truncateLog(\n value: string,\n maxBytes = DEFAULT_GATEWAY_LOG_BYTES\n): { value: string; truncated: boolean; originalBytes: number } {\n if (!value) {\n return { value: '', truncated: false, originalBytes: 0 }\n }\n if (value.length <= maxBytes) {\n return { value, truncated: false, originalBytes: value.length }\n }\n return {\n value: value.slice(0, maxBytes),\n truncated: true,\n originalBytes: value.length,\n }\n}\n\nexport function extractFirstJsonObject(text: string): Record<string, unknown> | null {\n let inString = false\n let escape = false\n for (let i = 0; i < text.length; i += 1) {\n const char = text[i]\n if (escape) {\n escape = false\n continue\n }\n if (char === '\\\\') {\n if (inString) escape = true\n continue\n }\n if (char === '\"') {\n inString = !inString\n continue\n }\n if (inString) continue\n if (char !== '{') continue\n let depth = 0\n let innerInString = false\n let innerEscape = false\n for (let j = i; j < text.length; j += 1) {\n const inner = text[j]\n if (innerEscape) {\n innerEscape = false\n continue\n }\n if (inner === '\\\\') {\n if (innerInString) innerEscape = true\n continue\n }\n if (inner === '\"') {\n innerInString = !innerInString\n continue\n }\n if (innerInString) continue\n if (inner === '{') depth += 1\n if (inner === '}') {\n depth -= 1\n if (depth === 0) {\n const candidate = text.slice(i, j + 1)\n try {\n return JSON.parse(candidate) as Record<string, unknown>\n } catch {\n break\n }\n }\n }\n }\n }\n return null\n}\n\nexport function extractGatewayErrorSummary(\n stderr: string\n): { message?: string; type?: string; code?: string; param?: string } | null {\n if (!stderr) return null\n const parsed = extractFirstJsonObject(stderr)\n if (!parsed) return null\n const error = (parsed as { error?: Record<string, unknown> }).error\n if (error && typeof error === 'object') {\n return {\n message: typeof error.message === 'string' ? error.message : undefined,\n type: typeof error.type === 'string' ? error.type : undefined,\n code: typeof error.code === 'string' ? error.code : undefined,\n param: typeof error.param === 'string' ? error.param : undefined,\n }\n }\n return {\n message: typeof parsed.message === 'string' ? parsed.message : undefined,\n type:\n typeof (parsed as Record<string, unknown>).type === 'string'\n ? String(parsed.type)\n : undefined,\n code:\n typeof (parsed as Record<string, unknown>).code === 'string'\n ? String(parsed.code)\n : undefined,\n }\n}\n\nexport async function sleep(ms: number): Promise<void> {\n if (!ms || ms <= 0) return\n await new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function asJson(value: unknown): Json {\n return value as Json\n}\n", "const textEncoder = new globalThis.TextEncoder();\nexport async function sha256Hex(value) {\n const bytes = textEncoder.encode(value);\n const digest = await globalThis.crypto.subtle.digest('SHA-256', bytes);\n const parts = Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, '0'));\n return parts.join('');\n}\n", "import { sha256Hex } from '../crypto.js';\nexport const OVERFLOW_STORAGE_BUCKET = 'overflow-artifacts';\nexport const MAX_OVERFLOW_ARTIFACT_BYTES = 20 * 1024 * 1024;\nexport const DEFAULT_OVERFLOW_PREVIEW_CHARS = 2_000;\nexport const OVERFLOW_READ_MAX_CHARS = 12_000;\nexport const OVERFLOW_PERSIST_THRESHOLD_CHARS = 6_000;\nexport const SUBAGENT_OUTPUT_OVERFLOW_THRESHOLD_CHARS = OVERFLOW_PERSIST_THRESHOLD_CHARS;\nexport const OVERFLOW_LIST_DEFAULT_LIMIT = 25;\nexport const OVERFLOW_LIST_MAX_LIMIT = 100;\nexport const OVERFLOW_ARTIFACT_SOURCE_CONFLICT_CODE = 'OVERFLOW_ARTIFACT_SOURCE_CONFLICT';\nconst NORMALIZE_LINE_ENDINGS_PATTERN = /\\r\\n|\\r/g;\nfunction formatUuidFromHex(hex) {\n const normalized = hex.slice(0, 32).padEnd(32, '0');\n const timeLow = normalized.slice(0, 8);\n const timeMid = normalized.slice(8, 12);\n const timeHiAndVersion = `5${normalized.slice(13, 16)}`;\n const clockSeqHi = ((parseInt(normalized.slice(16, 18), 16) & 0x3f) | 0x80)\n .toString(16)\n .padStart(2, '0');\n const clockSeqLow = normalized.slice(18, 20);\n const node = normalized.slice(20, 32);\n return `${timeLow}-${timeMid}-${timeHiAndVersion}-${clockSeqHi}${clockSeqLow}-${node}`;\n}\nfunction normalizeMimeType(mimeType) {\n if (typeof mimeType !== 'string')\n return 'text/plain';\n const trimmed = mimeType.trim();\n return trimmed.length > 0 ? trimmed : 'text/plain';\n}\nexport function normalizeOverflowText(text) {\n return text.replace(NORMALIZE_LINE_ENDINGS_PATTERN, '\\n');\n}\nexport function countOverflowLines(text) {\n if (!text)\n return 0;\n return normalizeOverflowText(text).split('\\n').length;\n}\nexport function computeOverflowByteSize(text) {\n return new globalThis.TextEncoder().encode(text).byteLength;\n}\nexport function buildOverflowPreview(text, maxChars = DEFAULT_OVERFLOW_PREVIEW_CHARS) {\n const normalized = normalizeOverflowText(text);\n if (normalized.length <= maxChars)\n return normalized;\n const marker = '\\n[... overflow preview truncated ...]\\n';\n const available = Math.max(maxChars - marker.length, 0);\n const headChars = Math.ceil(available / 2);\n const tailChars = Math.max(available - headChars, 0);\n const head = normalized.slice(0, headChars);\n const tail = normalized.slice(-tailChars);\n return `${head}${marker}${tail}`;\n}\nexport async function buildDeterministicOverflowArtifactId(params) {\n const sourceId = params.sourceId?.trim();\n if (!sourceId) {\n return null;\n }\n const digest = await sha256Hex(`overflow-artifact:${params.agentId}:${params.sourceType}:${sourceId}`);\n return formatUuidFromHex(digest);\n}\nexport async function buildOverflowContentSha256(text) {\n return sha256Hex(text);\n}\nexport function preparePersistedText(text, mimeType) {\n const normalizedText = normalizeOverflowText(text);\n return {\n normalized_text: normalizedText,\n preview_text: buildOverflowPreview(normalizedText),\n size_bytes: computeOverflowByteSize(normalizedText),\n line_count: countOverflowLines(normalizedText),\n mime_type: normalizeMimeType(mimeType),\n encoding: 'utf-8',\n };\n}\nexport function shouldPersistTextAsOverflow(text, thresholdChars = OVERFLOW_PERSIST_THRESHOLD_CHARS) {\n const normalizedText = normalizeOverflowText(text);\n return normalizedText.length > thresholdChars;\n}\nexport function buildInlinePersistedTextOutput(text, mimeType) {\n const prepared = preparePersistedText(text, mimeType);\n return {\n storage_mode: 'inline',\n inline_text: prepared.normalized_text,\n preview_text: prepared.preview_text,\n size_bytes: prepared.size_bytes,\n line_count: prepared.line_count,\n mime_type: prepared.mime_type,\n encoding: prepared.encoding,\n };\n}\nexport function buildOverflowPersistedTextOutput(params) {\n const prepared = preparePersistedText(params.text, params.mimeType);\n return {\n storage_mode: 'overflow',\n inline_text: null,\n preview_text: prepared.preview_text,\n size_bytes: prepared.size_bytes,\n line_count: prepared.line_count,\n mime_type: prepared.mime_type,\n encoding: prepared.encoding,\n overflow_artifact: params.pointer,\n };\n}\nexport function buildPreviewOnlyPersistedTextOutput(params) {\n const prepared = preparePersistedText(params.text, params.mimeType);\n return {\n storage_mode: 'preview_only',\n inline_text: null,\n preview_text: prepared.preview_text,\n size_bytes: prepared.size_bytes,\n line_count: prepared.line_count,\n mime_type: prepared.mime_type,\n encoding: prepared.encoding,\n omission_reason: params.omissionReason,\n };\n}\nexport function normalizeOverflowPreview(preview, fallbackText = '') {\n if (typeof preview === 'string' && preview.length > 0) {\n return preview;\n }\n return buildOverflowPreview(fallbackText);\n}\nfunction readString(value) {\n if (typeof value !== 'string')\n return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\nfunction readNumber(value) {\n if (typeof value === 'number' && Number.isFinite(value))\n return value;\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed)\n return undefined;\n const parsed = Number(trimmed);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n}\nexport function coerceOverflowArtifactPointer(value) {\n if (!value || typeof value !== 'object' || Array.isArray(value))\n return undefined;\n const record = value;\n const ref = readString(record.ref);\n if (!ref)\n return undefined;\n return {\n ref,\n mime_type: readString(record.mime_type) ?? 'text/plain',\n encoding: readString(record.encoding) ?? 'utf-8',\n size_bytes: readNumber(record.size_bytes) ?? 0,\n line_count: readNumber(record.line_count) ?? undefined,\n preview: normalizeOverflowPreview(record.preview),\n created_at: readString(record.created_at),\n source_type: readString(record.source_type),\n };\n}\nexport function encodeOverflowListCursor(cursor) {\n return `${cursor.created_at}|${cursor.ref}`;\n}\nexport function decodeOverflowListCursor(value) {\n if (typeof value !== 'string')\n return undefined;\n const trimmed = value.trim();\n if (!trimmed)\n return undefined;\n const separatorIndex = trimmed.lastIndexOf('|');\n if (separatorIndex <= 0 || separatorIndex >= trimmed.length - 1) {\n return undefined;\n }\n const created_at = trimmed.slice(0, separatorIndex).trim();\n const ref = trimmed.slice(separatorIndex + 1).trim();\n if (!created_at || !ref)\n return undefined;\n return { created_at, ref };\n}\nexport function buildOverflowAccessNotice(params) {\n const subject = params.subject?.trim() || 'output';\n if (params.exactContentState === 'preview_only') {\n return [\n `Only a preview of ${subject} is available.`,\n params.omissionReason === 'overflow_artifact_too_large'\n ? 'The exact output exceeded Panorama\u2019s overflow artifact size limit.'\n : 'The exact output could not be persisted into overflow storage.',\n 'No overflow artifact is available for reread. Save or use the preview only if it is sufficient.',\n ].join('\\n');\n }\n const pointer = params.overflowArtifact;\n if (!pointer?.ref || params.exactContentState !== 'overflow') {\n return null;\n }\n const lines = [\n `Full ${subject} stored as overflow artifact ${pointer.ref}.`,\n 'Use overflow.describe or overflow.read to inspect narrower slices.',\n ];\n if (params.includeDeleteInstruction) {\n lines.push('Delete it with overflow.delete when it is no longer useful.');\n }\n if (pointer.size_bytes > 0) {\n lines.push(`Artifact size: ${pointer.size_bytes.toLocaleString()} bytes.`);\n }\n return lines.join('\\n');\n}\n", "import { coerceOverflowArtifactPointer, } from '../overflow/contract.js';\nexport const SUBAGENT_SCHEMA_VERSION = 1;\n// Default tool allowlist for internal subagents.\n// Expanding this list is the only enforcement mechanism for subagent tool access.\nexport const SUBAGENT_SAFE_TOOL_ALLOWLIST = [\n 'read_todos',\n 'write_todos',\n 'ls',\n 'read_file',\n 'write_file',\n 'edit_file',\n 'glob',\n 'grep',\n 'web.search',\n 'web.read_content',\n 'web.read_html',\n 'web.summarize',\n 'resources.list_available',\n 'resources.search',\n 'overflow.describe',\n 'overflow.list',\n 'overflow.read',\n 'drive.list_entries',\n 'drive.get_entry',\n 'drive.read_file',\n 'notes.read',\n 'notes.read_lines',\n 'notes.search',\n 'wikis.list_pages',\n 'wikis.read_page',\n 'wikis.search',\n 'google_docs_markdown.read_lines',\n 'google_sheets.read',\n 'google_sheets.get_metadata',\n 'notion.get_schema',\n 'notion.get_pages',\n 'notion.get_pages_by_ids',\n 'airtable.list_bases',\n 'airtable.list_tables',\n 'airtable.get_schema',\n];\nexport const SUBAGENT_RUN_STATUS_VALUES = ['running', 'completed', 'failed', 'cancelled'];\nexport const SUBAGENT_RUN_TERMINAL_STATUSES = ['completed', 'failed', 'cancelled'];\nconst RUN_STATUS_SET = new Set(SUBAGENT_RUN_STATUS_VALUES);\nconst TERMINAL_RUN_STATUS_SET = new Set(SUBAGENT_RUN_TERMINAL_STATUSES);\nexport function isSubagentRunStatus(value) {\n if (typeof value !== 'string')\n return false;\n return RUN_STATUS_SET.has(value);\n}\nexport function coerceSubagentRunStatus(value, fallback = 'running') {\n if (typeof value !== 'string')\n return fallback;\n const normalized = value.trim().toLowerCase();\n if (!RUN_STATUS_SET.has(normalized))\n return fallback;\n return normalized;\n}\nexport function isTerminalSubagentRunStatus(status) {\n return TERMINAL_RUN_STATUS_SET.has(status);\n}\nexport const SUBAGENT_CANCEL_STATE_VALUES = [\n 'none',\n 'requested',\n 'acknowledged',\n 'rejected',\n];\nconst CANCEL_STATE_SET = new Set(SUBAGENT_CANCEL_STATE_VALUES);\nexport function coerceSubagentCancelState(value, fallback = 'none') {\n if (typeof value !== 'string')\n return fallback;\n const normalized = value.trim().toLowerCase();\n if (!CANCEL_STATE_SET.has(normalized))\n return fallback;\n return normalized;\n}\nexport const SUBAGENT_RUN_EVENT_TYPE_VALUES = [\n 'message',\n 'system',\n 'tool_call',\n 'tool_result',\n 'run_started',\n 'run_progress',\n 'cancellation_requested',\n 'cancellation_acknowledged',\n 'run_completed',\n 'run_failed',\n 'run_cancelled',\n];\nconst RUN_EVENT_TYPE_SET = new Set(SUBAGENT_RUN_EVENT_TYPE_VALUES);\nexport function isSubagentRunEventType(value) {\n if (typeof value !== 'string')\n return false;\n return RUN_EVENT_TYPE_SET.has(value);\n}\nexport function coerceSubagentRunEventType(value, fallback = 'system') {\n if (typeof value !== 'string')\n return fallback;\n const normalized = value.trim().toLowerCase();\n if (!RUN_EVENT_TYPE_SET.has(normalized))\n return fallback;\n return normalized;\n}\nconst CONTENT_TYPES = new Set(['markdown', 'text', 'json']);\nconst EXACT_CONTENT_STATE_VALUES = ['inline', 'overflow', 'preview_only'];\nconst EXACT_CONTENT_STATE_SET = new Set(EXACT_CONTENT_STATE_VALUES);\nconst OMITTED_CONTENT_REASON_SET = new Set([\n 'overflow_artifact_too_large',\n 'overflow_persistence_failed',\n]);\nfunction normalizeContentType(value) {\n if (typeof value !== 'string')\n return null;\n const trimmed = value.trim().toLowerCase();\n if (!CONTENT_TYPES.has(trimmed))\n return null;\n return trimmed;\n}\nfunction normalizeExactContentState(value) {\n if (typeof value !== 'string')\n return null;\n const trimmed = value.trim().toLowerCase();\n if (!EXACT_CONTENT_STATE_SET.has(trimmed))\n return null;\n return trimmed;\n}\nfunction normalizePersistedTextUnavailableReason(value) {\n if (typeof value !== 'string')\n return undefined;\n const trimmed = value.trim();\n if (!OMITTED_CONTENT_REASON_SET.has(trimmed))\n return undefined;\n return trimmed;\n}\nfunction inferExactContentState(params) {\n const explicitState = normalizeExactContentState(params.explicitState);\n if (explicitState)\n return explicitState;\n if (params.overflowArtifact)\n return 'overflow';\n if (params.omissionReason)\n return 'preview_only';\n return 'inline';\n}\nfunction normalizeStringList(value) {\n if (!value)\n return undefined;\n if (Array.isArray(value)) {\n const list = value.map((item) => String(item).trim()).filter((item) => item.length > 0);\n return list.length > 0 ? list : undefined;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed)\n return undefined;\n const list = trimmed\n .split(',')\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n return list.length > 0 ? list : undefined;\n }\n return undefined;\n}\nfunction inferContentType(value) {\n if (value && typeof value === 'object')\n return 'json';\n return 'text';\n}\nfunction extractSummary(value) {\n const summary = value.summary ?? value.overview;\n return typeof summary === 'string' && summary.trim().length > 0 ? summary.trim() : undefined;\n}\nfunction extractSources(value) {\n return normalizeStringList(value.sources);\n}\nfunction extractOriginalContentType(value) {\n return normalizeContentType(value.original_content_type) ?? undefined;\n}\nexport function isSubagentOutputEnvelope(value) {\n if (!value || typeof value !== 'object')\n return false;\n const record = value;\n if (!('content' in record) || !('content_type' in record))\n return false;\n const contentType = normalizeContentType(record.content_type);\n return !!contentType;\n}\nexport function coerceSubagentOutputEnvelope(value, options) {\n const fallbackContentType = options?.fallbackContentType ?? 'markdown';\n if (isSubagentOutputEnvelope(value)) {\n const record = value;\n const overflowArtifact = coerceOverflowArtifactPointer(record.overflow_artifact);\n const omissionReason = normalizePersistedTextUnavailableReason(record.omission_reason);\n return {\n ...record,\n schema_version: typeof record.schema_version === 'number' ? record.schema_version : SUBAGENT_SCHEMA_VERSION,\n content_type: normalizeContentType(record.content_type) ?? inferContentType(record.content),\n original_content_type: normalizeContentType(record.original_content_type) ?? undefined,\n exact_content_state: inferExactContentState({\n explicitState: record.exact_content_state,\n overflowArtifact,\n omissionReason,\n }),\n omission_reason: omissionReason,\n summary: record.summary?.trim() || undefined,\n sources: normalizeStringList(record.sources),\n errors: normalizeStringList(record.errors),\n overflow_artifact: overflowArtifact,\n };\n }\n if (value && typeof value === 'object') {\n const record = value;\n if ('content' in record) {\n const content = record.content;\n const contentType = normalizeContentType(record.content_type) ?? inferContentType(content);\n const overflowArtifact = coerceOverflowArtifactPointer(record.overflow_artifact);\n const omissionReason = normalizePersistedTextUnavailableReason(record.omission_reason);\n return {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n content,\n content_type: contentType,\n original_content_type: extractOriginalContentType(record),\n exact_content_state: inferExactContentState({\n explicitState: record.exact_content_state,\n overflowArtifact,\n omissionReason,\n }),\n omission_reason: omissionReason,\n summary: extractSummary(record),\n sources: extractSources(record),\n errors: normalizeStringList(record.errors),\n overflow_artifact: overflowArtifact,\n };\n }\n if (typeof record.result === 'string' && record.result.trim().length > 0) {\n return {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n content: record.result.trim(),\n content_type: 'markdown',\n exact_content_state: 'inline',\n summary: extractSummary(record),\n sources: extractSources(record),\n };\n }\n if (typeof record.text === 'string' && record.text.trim().length > 0) {\n return {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n content: record.text.trim(),\n content_type: 'markdown',\n exact_content_state: 'inline',\n summary: extractSummary(record),\n sources: extractSources(record),\n };\n }\n return {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n content: record,\n content_type: 'json',\n exact_content_state: 'inline',\n };\n }\n if (typeof value === 'string') {\n return {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n content: value.trim(),\n content_type: fallbackContentType,\n exact_content_state: 'inline',\n };\n }\n return {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n content: value == null ? '' : String(value),\n content_type: 'text',\n exact_content_state: 'inline',\n };\n}\n", "import type { OverflowArtifactPointer } from '@panorama/shared'\nimport type { SubagentSchemaVersion } from '@panorama/shared/subagents/contract'\n\nexport const SUBAGENT_SCHEMA_VERSION: SubagentSchemaVersion = 1\n\nexport type SubagentOutputContentType = 'markdown' | 'text' | 'json'\nexport type SubagentRunOutputFormat = 'json' | 'text' | 'stream-json'\n\nexport interface SubagentStreamEvent {\n sequence: number\n raw: string\n event: Record<string, unknown> | null\n}\n\nexport interface NormalizedRunEvent {\n event_type: string\n payload: Record<string, unknown>\n}\n\nexport interface SubagentOutputEnvelope {\n schema_version: number\n content: unknown\n content_type: SubagentOutputContentType\n original_content_type?: SubagentOutputContentType\n summary?: string\n sources?: string[]\n errors?: string[]\n overflow_artifact?: OverflowArtifactPointer\n}\n\nexport interface SubagentRunPlan {\n command: string\n args: string[]\n outputFormat: SubagentRunOutputFormat\n timeoutMs: number | null\n env?: NodeJS.ProcessEnv\n files?: Array<{ path: string; contents: string }>\n}\n\nexport interface SubagentNormalizeResult {\n output: SubagentOutputEnvelope\n metadata: Record<string, unknown>\n rawResponse?: Record<string, unknown> | null\n parseError?: string | null\n}\n\nexport interface SubagentAdapterContext {\n prompt: string\n config: Record<string, unknown>\n command: string\n support: Record<string, boolean>\n fullControl: boolean\n resumeSessionId?: string | null\n}\n\nexport interface SubagentAdapter {\n id: string\n label: string\n supportsContinuation: boolean\n buildRunPlan(context: SubagentAdapterContext): SubagentRunPlan\n normalizeRunResult(params: {\n stdout: string\n outputFormat: 'json' | 'text'\n }): SubagentNormalizeResult\n normalizeStreamingResult?: (params: {\n events: SubagentStreamEvent[]\n rawOutput: string\n }) => SubagentNormalizeResult\n normalizeStreamEvents?: (events: SubagentStreamEvent[]) => NormalizedRunEvent[]\n}\n", "import { coerceSubagentRunEventType } from '@panorama/shared/subagents/contract'\nimport { SUBAGENT_SCHEMA_VERSION } from './subagent-adapters/types.js'\n\nexport const DEFAULT_SUBAGENT_EVENT_PAYLOAD_BYTES = 200_000\n\nexport type SubagentRetryConfig = {\n maxAttempts: number\n backoffMs: number\n maxBackoffMs: number\n retryOnCapacity: boolean\n retryOnTimeout: boolean\n retryOnNetwork: boolean\n retryOnParse: boolean\n}\n\nexport function buildErrorOutput(message: string): Record<string, unknown> {\n return {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n content: message,\n content_type: 'text',\n errors: [message],\n }\n}\n\nexport function extractSubagentPrompt(input: Record<string, unknown> | null): string | null {\n if (!input) return null\n const raw =\n (typeof input.prompt === 'string' && input.prompt) ||\n (typeof input.query === 'string' && input.query) ||\n (typeof input.task === 'string' && input.task)\n if (!raw) return null\n const trimmed = raw.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nexport function isUuid(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\n}\n\nexport function trimEventPayload(\n event: Record<string, unknown>,\n maxPayloadBytes = DEFAULT_SUBAGENT_EVENT_PAYLOAD_BYTES\n): Record<string, unknown> {\n try {\n const raw = JSON.stringify(event)\n if (raw.length <= maxPayloadBytes) return event\n return {\n truncated: true,\n original_bytes: raw.length,\n preview: raw.slice(0, maxPayloadBytes),\n }\n } catch {\n return event\n }\n}\n\nexport function computeRetryDelayMs(\n attempt: number,\n baseMs: number,\n maxMs: number,\n random: () => number = Math.random\n): number {\n const exponent = Math.max(0, attempt - 1)\n const raw = Math.min(maxMs, baseMs * Math.pow(2, exponent))\n const jitter = 0.7 + random() * 0.6\n return Math.round(raw * jitter)\n}\n\nexport function classifySubagentRetryable(params: {\n result: {\n ok: boolean\n timedOut: boolean\n exitCode: number | null\n error?: string\n stderr?: string\n stdoutTruncated?: boolean\n stderrTruncated?: boolean\n }\n parseError: string | null\n parseStrict: boolean\n config: SubagentRetryConfig\n}): { retryable: boolean; reason: string } | null {\n const { result, parseError, parseStrict, config } = params\n if (parseStrict && parseError && config.retryOnParse) {\n return { retryable: true, reason: 'parse_error' }\n }\n if (!result.ok) {\n if (result.timedOut && config.retryOnTimeout) {\n return { retryable: true, reason: 'timeout' }\n }\n const message = `${result.error ?? ''}\\n${result.stderr ?? ''}`.toLowerCase()\n if (config.retryOnCapacity) {\n if (\n message.includes('resource_exhausted') ||\n message.includes('capacity') ||\n message.includes('rate limit') ||\n message.includes('too many requests') ||\n message.includes('429')\n ) {\n return { retryable: true, reason: 'capacity' }\n }\n }\n if (config.retryOnNetwork) {\n if (\n message.includes('econnreset') ||\n message.includes('etimedout') ||\n message.includes('enotfound') ||\n message.includes('eai_again') ||\n message.includes('socket hang up') ||\n message.includes('network')\n ) {\n return { retryable: true, reason: 'network' }\n }\n }\n }\n return null\n}\n\nexport function normalizeSubagentRunEventType(value: unknown, fallback = 'system'): string {\n return coerceSubagentRunEventType(value, coerceSubagentRunEventType(fallback))\n}\n\nexport function mergeMetadata(\n base: Record<string, unknown> | null | undefined,\n update: Record<string, unknown>\n): Record<string, unknown> {\n return {\n ...(base ?? {}),\n ...update,\n }\n}\n", "import type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from './database.types.js'\nimport { asJson } from './gateway-run-helpers.js'\nimport { normalizeSubagentRunEventType, trimEventPayload } from './subagent-run-helpers.js'\n\nexport type SubagentRunEventClient = SupabaseClient<Database>\nexport type SubagentRunEventLogger = (\n message: string,\n data?: Record<string, unknown>\n) => void\n\nconst noopLogger: SubagentRunEventLogger = () => {}\n\nexport async function getNextSubagentRunEventSequence(\n supabase: SubagentRunEventClient,\n runId: string,\n logError: SubagentRunEventLogger = noopLogger\n): Promise<number> {\n const { data, error } = await supabase\n .from('subagent_run_events')\n .select('sequence')\n .eq('run_id', runId)\n .order('sequence', { ascending: false })\n .limit(1)\n .maybeSingle()\n\n if (error) {\n logError('Failed to fetch subagent run event sequence; defaulting to 0', {\n runId,\n error: error.message,\n })\n return 0\n }\n\n if (!data || typeof data.sequence !== 'number' || !Number.isFinite(data.sequence)) {\n return 0\n }\n\n return data.sequence + 1\n}\n\nexport async function insertSubagentRunEvent(params: {\n supabase: SubagentRunEventClient\n runId: string\n subagentId: string\n teamId: string\n gatewayId: string | null\n sequence: number\n eventType: string\n payload: Record<string, unknown>\n logError?: SubagentRunEventLogger\n}): Promise<number | null> {\n const logError = params.logError ?? noopLogger\n const normalizedType = normalizeSubagentRunEventType(params.eventType, 'system')\n\n const insertWithSequence = async (sequence: number) =>\n params.supabase.from('subagent_run_events').insert({\n run_id: params.runId,\n subagent_id: params.subagentId,\n team_id: params.teamId,\n gateway_id: params.gatewayId,\n sequence,\n event_type: normalizedType,\n payload: asJson(trimEventPayload(params.payload)),\n })\n\n const { error } = await insertWithSequence(params.sequence)\n if (!error) return params.sequence\n\n if (error.code === '23505') {\n const retrySequence = await getNextSubagentRunEventSequence(\n params.supabase,\n params.runId,\n logError\n )\n const { error: retryError } = await insertWithSequence(retrySequence)\n if (!retryError) return retrySequence\n\n logError('Failed to insert subagent run event after retry', {\n runId: params.runId,\n subagentId: params.subagentId,\n event_type: normalizedType,\n error: retryError.message,\n })\n return null\n }\n\n logError('Failed to insert subagent run event', {\n runId: params.runId,\n subagentId: params.subagentId,\n event_type: normalizedType,\n error: error.message,\n })\n return null\n}\n", "import type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from './database.types.js'\n\nexport type SubagentRunStoreClient = SupabaseClient<Database>\nexport type SubagentRunStoreLogger = (\n message: string,\n data?: Record<string, unknown>\n) => void\n\nexport async function getNextSubagentRunSequence(\n supabase: SubagentRunStoreClient,\n subagentId: string,\n logError: SubagentRunStoreLogger = () => {}\n): Promise<number> {\n const { data, error } = await supabase.rpc('allocate_subagent_run_sequence', {\n p_subagent_id: subagentId,\n })\n\n if (error) {\n logError('Failed to allocate subagent run sequence; falling back to read-based sequence', {\n subagentId,\n error: error.message,\n })\n const { data: fallback } = await supabase\n .from('subagent_runs')\n .select('run_sequence')\n .eq('subagent_id', subagentId)\n .order('run_sequence', { ascending: false })\n .limit(1)\n .maybeSingle()\n\n const lastSequence =\n fallback && typeof fallback.run_sequence === 'number' ? fallback.run_sequence : 0\n return lastSequence + 1\n }\n\n return typeof data === 'number' && Number.isFinite(data) ? data : 1\n}\n", "import type { SupabaseClient } from '@supabase/supabase-js'\nimport type { ChildProcess } from 'node:child_process'\nimport {\n buildGatewayCommandEnv,\n runGatewayCommand,\n runGatewayStreamingCommand,\n type GatewayCommandRunOptions,\n type GatewayCommandResult,\n type GatewayStreamingCommandResult,\n} from './gateway-command-runner.js'\nimport type { Database } from './database.types.js'\nimport type { GatewayRuntimeState } from './gateway-runtime-state.js'\nimport type { ParsedArgs } from './cli-args.js'\nimport { ensureOwnerOnlyDirectory } from './local-security.js'\nimport { requestChildTermination as requestChildTerminationBase } from './process-control.js'\nimport { resolveGatewayTmpDir } from './runtime-paths.js'\nimport { resolveGatewaySubagentWorkdirRoot } from './gateway-state.js'\nimport type { GatewaySubagentRunEventInsert } from './gateway-subagent-run-types.js'\nimport {\n getNextSubagentRunEventSequence as getNextSubagentRunEventSequenceBase,\n insertSubagentRunEvent as insertSubagentRunEventBase,\n} from './subagent-run-events.js'\nimport { getNextSubagentRunSequence as getNextSubagentRunSequenceBase } from './subagent-run-store.js'\n\ntype GatewaySupabaseClient = SupabaseClient<Database>\n\ntype GatewayChildTerminator = (\n child: ChildProcess | undefined,\n options: { reason: string; graceMs: number; context: string }\n) => void\n\ntype GatewayCommandRunner = (\n command: string,\n args: string[],\n options: GatewayCommandRunOptions\n) => Promise<GatewayCommandResult>\n\ntype GatewayStreamingCommandRunner = (\n command: string,\n args: string[],\n options: GatewayCommandRunOptions\n) => Promise<GatewayStreamingCommandResult>\n\nexport interface GatewayExecutionSupportDependencies {\n runtimeState: GatewayRuntimeState<unknown>\n subagentCancelKillTimeoutMs: number\n getActiveOptions: (options?: ParsedArgs['options']) => ParsedArgs['options']\n logError: (message: string, data?: Record<string, unknown>) => void\n buildCommandEnv?: (options?: { baseEnv?: NodeJS.ProcessEnv }) => NodeJS.ProcessEnv\n runCommandBase?: GatewayCommandRunner\n runStreamingCommandBase?: GatewayStreamingCommandRunner\n ensureOwnerOnlyDirectory?: (path: string) => Promise<void>\n resolveGatewayTmpDir?: () => string\n requestChildTerminationBase?: typeof requestChildTerminationBase\n resolveSubagentWorkdirRootBase?: (options?: ParsedArgs['options']) => string\n getNextRunSequenceBase?: (\n supabase: GatewaySupabaseClient,\n subagentId: string,\n logError: (message: string, data?: Record<string, unknown>) => void\n ) => Promise<number>\n getNextSubagentRunEventSequenceBase?: (\n supabase: GatewaySupabaseClient,\n runId: string,\n logError: (message: string, data?: Record<string, unknown>) => void\n ) => Promise<number>\n insertSubagentRunEventBase?: (\n params: GatewaySubagentRunEventInsert & {\n logError: (message: string, data?: Record<string, unknown>) => void\n }\n ) => Promise<number | null>\n}\n\nexport interface GatewayExecutionSupport {\n ensureGatewayTmpDir: () => Promise<void>\n buildGatewayChildEnv: (baseEnv?: NodeJS.ProcessEnv) => NodeJS.ProcessEnv\n runCommand: GatewayCommandRunner\n runStreamingCommand: GatewayStreamingCommandRunner\n getNextRunSequence: (supabase: GatewaySupabaseClient, subagentId: string) => Promise<number>\n getNextSubagentRunEventSequence: (\n supabase: GatewaySupabaseClient,\n runId: string\n ) => Promise<number>\n insertSubagentRunEvent: (params: GatewaySubagentRunEventInsert) => Promise<number | null>\n requestChildTermination: GatewayChildTerminator\n requestSubagentCancel: (\n subagentId: string,\n runId: string | null,\n reason: string\n ) => { active: boolean }\n resolvePendingCancel: (\n subagentId: string,\n runId: string,\n metadata: Record<string, unknown>\n ) => string | null\n consumePendingCancelFromQueue: (subagentId: string, runId: string) => string | null\n clearPendingCancel: (subagentId: string, runId: string) => void\n resolveSubagentWorkdirRoot: () => string\n}\n\nexport function createGatewayExecutionSupport(\n dependencies: GatewayExecutionSupportDependencies\n): GatewayExecutionSupport {\n const buildCommandEnv =\n dependencies.buildCommandEnv ??\n ((options?: { baseEnv?: NodeJS.ProcessEnv }) =>\n buildGatewayCommandEnv({ baseEnv: options?.baseEnv }))\n const runCommandBase = dependencies.runCommandBase ?? runGatewayCommand\n const runStreamingCommandBase =\n dependencies.runStreamingCommandBase ?? runGatewayStreamingCommand\n const ensureDirectory = dependencies.ensureOwnerOnlyDirectory ?? ensureOwnerOnlyDirectory\n const resolveTmpDir = dependencies.resolveGatewayTmpDir ?? resolveGatewayTmpDir\n const requestChildTerminationImpl =\n dependencies.requestChildTerminationBase ?? requestChildTerminationBase\n const resolveSubagentWorkdirRootBase =\n dependencies.resolveSubagentWorkdirRootBase ?? resolveGatewaySubagentWorkdirRoot\n const getNextRunSequenceBase =\n dependencies.getNextRunSequenceBase ?? getNextSubagentRunSequenceBase\n const getNextSubagentRunEventSequenceImpl =\n dependencies.getNextSubagentRunEventSequenceBase ?? getNextSubagentRunEventSequenceBase\n const insertSubagentRunEventImpl =\n dependencies.insertSubagentRunEventBase ?? insertSubagentRunEventBase\n\n const buildGatewayChildEnv = (baseEnv?: NodeJS.ProcessEnv): NodeJS.ProcessEnv => {\n return buildCommandEnv({ baseEnv })\n }\n\n const ensureGatewayTmpDir = async (): Promise<void> => {\n await ensureDirectory(resolveTmpDir())\n }\n\n const withGatewayCommandLogging = <T extends GatewayCommandRunOptions>(\n options: T,\n context: string\n ): T => {\n return {\n ...options,\n timeoutContext: context,\n onTerminationError: (phase, error, timeoutContext) => {\n dependencies.logError('Failed to send child process termination signal', {\n context: timeoutContext,\n reason: 'process_timeout',\n phase,\n error: error instanceof Error ? error.message : String(error),\n })\n },\n }\n }\n\n const runCommand = async (\n command: string,\n args: string[],\n options: GatewayCommandRunOptions\n ): Promise<GatewayCommandResult> => {\n return await runCommandBase(\n command,\n args,\n withGatewayCommandLogging(options, 'runGatewayCommand')\n )\n }\n\n const runStreamingCommand = async (\n command: string,\n args: string[],\n options: GatewayCommandRunOptions\n ): Promise<GatewayStreamingCommandResult> => {\n return await runStreamingCommandBase(\n command,\n args,\n withGatewayCommandLogging(options, 'runGatewayStreamingCommand')\n )\n }\n\n const getNextRunSequence = async (\n supabase: GatewaySupabaseClient,\n subagentId: string\n ): Promise<number> => {\n return await getNextRunSequenceBase(supabase, subagentId, dependencies.logError)\n }\n\n const getNextSubagentRunEventSequence = async (\n supabase: GatewaySupabaseClient,\n runId: string\n ): Promise<number> => {\n return await getNextSubagentRunEventSequenceImpl(supabase, runId, dependencies.logError)\n }\n\n const insertSubagentRunEventWithLogging = async (\n params: GatewaySubagentRunEventInsert\n ): Promise<number | null> => {\n return await insertSubagentRunEventImpl({ ...params, logError: dependencies.logError })\n }\n\n const requestChildTermination: GatewayChildTerminator = (child, options) => {\n requestChildTerminationImpl(child, {\n reason: options.reason,\n graceMs: options.graceMs,\n onError: (phase, error) => {\n dependencies.logError('Failed to send child process termination signal', {\n context: options.context,\n reason: options.reason,\n phase,\n error: error instanceof Error ? error.message : String(error),\n })\n },\n })\n }\n\n const requestSubagentCancel = (\n subagentId: string,\n runId: string | null,\n reason: string\n ): { active: boolean } => {\n const activeRun = dependencies.runtimeState.activeSubagentRuns.get(subagentId)\n if (activeRun && (!runId || activeRun.runId === runId)) {\n activeRun.cancelled = true\n activeRun.cancelReason = reason\n requestChildTermination(activeRun.child, {\n reason,\n graceMs: dependencies.subagentCancelKillTimeoutMs,\n context: 'gateway_cancel_request',\n })\n return { active: true }\n }\n\n if (runId) {\n dependencies.runtimeState.pendingCancelByRunId.set(runId, { reason })\n } else {\n dependencies.runtimeState.pendingCancelBySubagentId.set(subagentId, { reason })\n }\n\n return { active: false }\n }\n\n const resolvePendingCancelFromQueue = (subagentId: string, runId: string): string | null => {\n const pendingByRun = dependencies.runtimeState.pendingCancelByRunId.get(runId)\n if (pendingByRun) return pendingByRun.reason\n\n const pendingBySubagent = dependencies.runtimeState.pendingCancelBySubagentId.get(subagentId)\n if (pendingBySubagent) return pendingBySubagent.reason\n\n return null\n }\n\n const clearPendingCancel = (subagentId: string, runId: string): void => {\n dependencies.runtimeState.pendingCancelByRunId.delete(runId)\n dependencies.runtimeState.pendingCancelBySubagentId.delete(subagentId)\n }\n\n const resolvePendingCancel = (\n subagentId: string,\n runId: string,\n metadata: Record<string, unknown>\n ): string | null => {\n const cancelRunId = typeof metadata.cancel_run_id === 'string' ? metadata.cancel_run_id : null\n if (cancelRunId && cancelRunId === runId) {\n return typeof metadata.cancel_reason === 'string' ? metadata.cancel_reason : 'Cancelled'\n }\n return resolvePendingCancelFromQueue(subagentId, runId)\n }\n\n const consumePendingCancelFromQueue = (subagentId: string, runId: string): string | null => {\n const reason = resolvePendingCancelFromQueue(subagentId, runId)\n if (!reason) return null\n clearPendingCancel(subagentId, runId)\n return reason\n }\n\n const resolveSubagentWorkdirRoot = (): string => {\n return resolveSubagentWorkdirRootBase(dependencies.getActiveOptions())\n }\n\n return {\n ensureGatewayTmpDir,\n buildGatewayChildEnv,\n runCommand,\n runStreamingCommand,\n getNextRunSequence,\n getNextSubagentRunEventSequence,\n insertSubagentRunEvent: insertSubagentRunEventWithLogging,\n requestChildTermination,\n requestSubagentCancel,\n resolvePendingCancel,\n consumePendingCancelFromQueue,\n clearPendingCancel,\n resolveSubagentWorkdirRoot,\n }\n}\n", "import {\n validateGatewayCapabilitiesV1,\n type GatewayCapabilitiesV1,\n} from '@panorama/shared/gateway/capabilities'\nimport { createClient, type SupabaseClient } from '@supabase/supabase-js'\nimport type { ParsedArgs } from './cli-args.js'\nimport { truncateText } from './cli-output.js'\nimport type { Database } from './database.types.js'\nimport type { GatewayRuntimeState } from './gateway-runtime-state.js'\nimport type { GatewayConfig } from './gateway-state.js'\n\nconst DEFAULT_MAX_GATEWAY_EVENT_MESSAGE_CHARS = 2000\nconst DEFAULT_GATEWAY_HEARTBEAT_STALE_MS = 90_000\n\ntype GatewaySupabaseClient = SupabaseClient<Database>\ntype GatewayStatus = 'pending' | 'ready' | 'offline' | 'error'\n\nexport interface GatewayControlPlaneEventPayload {\n level: 'info' | 'warn' | 'error'\n code?: string\n message: string\n provider?: string\n details?: Record<string, unknown>\n}\n\nexport interface GatewayControlState {\n full_control_enabled: boolean\n status: string\n last_seen_at: string | null\n capabilities: GatewayCapabilitiesV1 | null\n}\n\nexport interface GatewayControlPlaneDependencies {\n runtimeState: GatewayRuntimeState<GatewayControlPlaneEventPayload>\n loadConfig: (options?: ParsedArgs['options']) => Promise<GatewayConfig>\n createSupabaseClient?: (\n supabaseUrl: string,\n supabaseAnonKey: string\n ) => GatewaySupabaseClient\n maxEventMessageChars?: number\n heartbeatStaleMs?: number\n now?: () => number\n logInfo: (message: string, data?: Record<string, unknown>) => void\n logError: (message: string, data?: Record<string, unknown>) => void\n}\n\nexport interface GatewayControlPlane {\n createGatewayEventClient: (config: GatewayConfig) => Promise<GatewaySupabaseClient | null>\n emitGatewayEvent: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n payload: GatewayControlPlaneEventPayload\n ) => Promise<void>\n queueGatewayEvent: (payload: GatewayControlPlaneEventPayload) => void\n flushGatewayEvents: (supabase: GatewaySupabaseClient, config: GatewayConfig) => Promise<void>\n sendHeartbeat: (\n supabase: GatewaySupabaseClient,\n status: GatewayStatus,\n capabilities: GatewayCapabilitiesV1,\n deviceName?: string | null\n ) => Promise<void>\n loadGatewayControlState: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig\n ) => Promise<GatewayControlState | null>\n isHeartbeatFresh: (lastSeenAt: string | null) => boolean\n refreshRuntimeInstallFullControl: (config: GatewayConfig) => Promise<boolean>\n}\n\nfunction createDefaultSupabaseClient(\n supabaseUrl: string,\n supabaseAnonKey: string\n): GatewaySupabaseClient {\n return createClient<Database>(supabaseUrl, supabaseAnonKey, {\n auth: {\n persistSession: false,\n autoRefreshToken: false,\n detectSessionInUrl: false,\n },\n })\n}\n\nexport function createGatewayControlPlane(\n dependencies: GatewayControlPlaneDependencies\n): GatewayControlPlane {\n const createSupabaseClient = dependencies.createSupabaseClient ?? createDefaultSupabaseClient\n const maxEventMessageChars =\n dependencies.maxEventMessageChars ?? DEFAULT_MAX_GATEWAY_EVENT_MESSAGE_CHARS\n const heartbeatStaleMs = dependencies.heartbeatStaleMs ?? DEFAULT_GATEWAY_HEARTBEAT_STALE_MS\n const now = dependencies.now ?? Date.now\n\n const createGatewayEventClient = async (\n config: GatewayConfig\n ): Promise<GatewaySupabaseClient | null> => {\n if (!config.supabaseUrl || !config.supabaseAnonKey) return null\n const supabase = createSupabaseClient(config.supabaseUrl, config.supabaseAnonKey)\n\n const { data: sessionData, error: sessionError } = await supabase.auth.setSession({\n access_token: config.accessToken,\n refresh_token: config.refreshToken,\n })\n\n if (sessionError || !sessionData?.session) {\n dependencies.logError('Failed to authenticate gateway event session', {\n error: sessionError?.message || 'No session returned',\n })\n return null\n }\n\n return supabase\n }\n\n const emitGatewayEvent = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n payload: GatewayControlPlaneEventPayload\n ): Promise<void> => {\n if (!config.gatewayId || !config.teamId) return\n const message = truncateText(payload.message, maxEventMessageChars)\n const details = payload.details ?? {}\n const { error } = await supabase.from('gateway_events' as any).insert({\n gateway_id: config.gatewayId,\n team_id: config.teamId,\n provider: payload.provider ?? null,\n level: payload.level,\n code: payload.code ?? null,\n message,\n details,\n })\n\n if (error) {\n dependencies.logError('Failed to record gateway event', {\n error: error.message,\n code: payload.code ?? null,\n provider: payload.provider ?? null,\n })\n }\n }\n\n const queueGatewayEvent = (payload: GatewayControlPlaneEventPayload): void => {\n dependencies.runtimeState.pendingGatewayEvents.push(payload)\n }\n\n const flushGatewayEvents = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig\n ): Promise<void> => {\n if (dependencies.runtimeState.pendingGatewayEvents.length === 0) return\n const queued = dependencies.runtimeState.pendingGatewayEvents.splice(\n 0,\n dependencies.runtimeState.pendingGatewayEvents.length\n )\n for (const payload of queued) {\n await emitGatewayEvent(supabase, config, payload)\n }\n }\n\n const sendHeartbeat = async (\n supabase: GatewaySupabaseClient,\n status: GatewayStatus,\n capabilities: GatewayCapabilitiesV1,\n deviceName?: string | null\n ): Promise<void> => {\n const { error } = await supabase.functions.invoke('gateway-heartbeat', {\n body: {\n status,\n capabilities,\n device_name: deviceName,\n },\n })\n\n if (error) {\n dependencies.logError('Failed to send gateway heartbeat', { error: error.message })\n }\n }\n\n const loadGatewayControlState = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig\n ): Promise<GatewayControlState | null> => {\n const { data, error } = await supabase\n .from('team_gateways')\n .select('full_control_enabled, status, last_seen_at, capabilities')\n .eq('id', config.gatewayId)\n .eq('team_id', config.teamId)\n .maybeSingle()\n\n if (error) {\n dependencies.logError('Failed to load gateway control state', {\n gatewayId: config.gatewayId,\n teamId: config.teamId,\n error: error.message,\n })\n return null\n }\n\n if (!data) return null\n\n const parsedCapabilities = validateGatewayCapabilitiesV1(data.capabilities ?? null)\n\n return {\n full_control_enabled: data.full_control_enabled === true,\n status: typeof data.status === 'string' ? data.status : 'unknown',\n last_seen_at: typeof data.last_seen_at === 'string' ? data.last_seen_at : null,\n capabilities: parsedCapabilities.ok ? parsedCapabilities.value : null,\n }\n }\n\n const isHeartbeatFresh = (lastSeenAt: string | null): boolean => {\n if (!lastSeenAt) return false\n const parsed = Date.parse(lastSeenAt)\n if (!Number.isFinite(parsed)) return false\n return now() - parsed <= heartbeatStaleMs\n }\n\n const refreshRuntimeInstallFullControl = async (config: GatewayConfig): Promise<boolean> => {\n const options = dependencies.runtimeState.currentRuntimeOptions ?? undefined\n try {\n const latestConfig = await dependencies.loadConfig(options)\n const nextValue = latestConfig.full_control_enabled === true\n if (config.full_control_enabled !== nextValue) {\n config.full_control_enabled = nextValue\n if (dependencies.runtimeState.currentConfig) {\n dependencies.runtimeState.currentConfig.full_control_enabled = nextValue\n }\n dependencies.logInfo('Reloaded gateway host machine-control setting', {\n enabled: nextValue,\n })\n }\n } catch (error) {\n dependencies.logError('Failed to refresh gateway host machine-control setting', {\n error: error instanceof Error ? error.message : String(error),\n })\n }\n return config.full_control_enabled === true\n }\n\n return {\n createGatewayEventClient,\n emitGatewayEvent,\n queueGatewayEvent,\n flushGatewayEvents,\n sendHeartbeat,\n loadGatewayControlState,\n isHeartbeatFresh,\n refreshRuntimeInstallFullControl,\n }\n}\n", "import {\n deriveGatewayMachineControlState,\n isGatewayServiceReady,\n type GatewayCapabilitiesV1,\n} from '@panorama/shared/gateway/capabilities'\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport { execFile, type ChildProcess } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport type {\n GatewayHealthStatus,\n GatewayProviderCapabilities,\n GatewayProviderId,\n} from './cli-providers/types.js'\nimport type { Database } from './database.types.js'\nimport {\n claimGatewayJob,\n completeGatewayJob,\n findGatewayJobIdempotencyConflict,\n loadGatewayJobStatus,\n updateGatewayJobDebug,\n} from './gateway-job-store.js'\nimport { processGatewayJob } from './gateway-job-processor.js'\nimport type { GatewayJobRow, GatewayJobStatus } from './gateway-jobs.js'\nimport {\n handleGatewayModelRunJob,\n type ActiveModelRun,\n} from './gateway-model-run.js'\nimport {\n handleGatewayShellExecJob,\n type ActiveShellExecRun,\n} from './gateway-shell-exec.js'\nimport { handleGatewaySubagentRunJob } from './gateway-subagent-run-job.js'\nimport type {\n GatewaySubagentRunControlState,\n GatewaySubagentRunEventInsert,\n} from './gateway-subagent-run-types.js'\nimport type { ActiveSubagentRun } from './gateway-runtime-state.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport { handleSubagentCancelJob as handleSubagentCancelJobBase } from './subagent-cancel-job.js'\nimport { failSubagentRun as failSubagentRunBase } from './subagent-failure.js'\nimport type { ClaudeSupport } from './subagent-adapters/claude-support.js'\nimport type {\n SubagentCommandRunner,\n SubagentStreamingCommandRunner,\n} from './subagent-run-execution.js'\n\nconst execFileAsync = promisify(execFile)\n\ntype GatewaySupabaseClient = SupabaseClient<Database>\n\ntype GatewayChildTerminator = (\n child: ChildProcess | undefined,\n options: { reason: string; graceMs: number; context: string }\n) => void\n\nexport interface CreateGatewayJobHandlersParams {\n activeSubagentRuns: Map<string, ActiveSubagentRun>\n activeModelRuns: Map<string, ActiveModelRun>\n activeShellExecRuns: Map<string, ActiveShellExecRun>\n getProviderCapabilities: () => Record<GatewayProviderId, GatewayProviderCapabilities> | null\n getClaudeSupport: () => ClaudeSupport | null\n defaultClaudeTimeoutMs: number\n defaultRemoteShellExecTimeoutMs: number\n defaultSubagentTimeoutMs: number\n defaultModelRunTimeoutMs: number\n subagentCancelKillTimeoutMs: number\n processKillGraceMs: number\n buildGatewayChildEnv: () => NodeJS.ProcessEnv\n resolveClaudeCommand: () => string\n resolveCodexCommand: () => string\n resolveGeminiCommand: () => string\n refreshRuntimeInstallFullControl: (config: GatewayConfig) => Promise<boolean>\n loadGatewayControlState: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig\n ) => Promise<GatewaySubagentRunControlState | null>\n isHeartbeatFresh: (lastSeenAt: string | null) => boolean\n requestSubagentCancel: (\n subagentId: string,\n runId: string | null,\n reason: string\n ) => { active: boolean }\n getNextRunSequence: (supabase: GatewaySupabaseClient, subagentId: string) => Promise<number>\n getNextSubagentRunEventSequence: (\n supabase: GatewaySupabaseClient,\n runId: string\n ) => Promise<number>\n insertSubagentRunEvent: (params: GatewaySubagentRunEventInsert) => Promise<number | null>\n resolvePendingCancel: (\n subagentId: string,\n runId: string,\n metadata: Record<string, unknown>\n ) => string | null\n consumePendingCancelFromQueue: (subagentId: string, runId: string) => string | null\n clearPendingCancel: (subagentId: string, runId: string) => void\n resolveSubagentWorkdirRoot: () => string\n runCommand: SubagentCommandRunner\n runStreamingCommand: SubagentStreamingCommandRunner\n updateRuntimeProviderHealth: (params: {\n supabase: GatewaySupabaseClient\n providerId: GatewayProviderId\n status: GatewayHealthStatus\n error?: string | null\n context: string\n jobId?: string\n runId?: string\n }) => Promise<void>\n requestChildTermination: GatewayChildTerminator\n logInfo: (message: string, data?: Record<string, unknown>) => void\n logError: (message: string, data?: Record<string, unknown>) => void\n}\n\nexport interface GatewayJobHandlers {\n claimJob: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ) => Promise<GatewayJobRow | null>\n processJob: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ) => Promise<void>\n handleSubagentCancelJob: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ) => Promise<{ ok: boolean; result: Record<string, unknown>; error?: string }>\n completeJob: (\n supabase: GatewaySupabaseClient,\n jobId: string,\n status: GatewayJobStatus,\n result: Record<string, unknown> | null,\n errorMessage?: string\n ) => Promise<void>\n failSubagentRun: (\n supabase: GatewaySupabaseClient,\n job: GatewayJobRow,\n errorMessage: string\n ) => Promise<void>\n}\n\nasync function runClaudeVersionDiagnostic(params: {\n resolveClaudeCommand: () => string\n buildGatewayChildEnv: () => NodeJS.ProcessEnv\n timeoutMs: number\n}): Promise<{\n ok: boolean\n stdout: string\n stderr: string\n exitCode: number | null\n durationMs: number\n error?: string\n version?: string\n}> {\n const start = Date.now()\n const command = params.resolveClaudeCommand()\n try {\n const { stdout, stderr } = await execFileAsync(command, ['--version'], {\n timeout: params.timeoutMs,\n env: params.buildGatewayChildEnv(),\n })\n\n const durationMs = Date.now() - start\n const stdoutText = String(stdout)\n const trimmed = stdoutText.trim()\n return {\n ok: true,\n stdout: stdoutText,\n stderr: String(stderr),\n exitCode: 0,\n durationMs,\n version: trimmed || undefined,\n }\n } catch (error) {\n const durationMs = Date.now() - start\n const err = error as NodeJS.ErrnoException & { stdout?: string; stderr?: string; code?: number }\n return {\n ok: false,\n stdout: err.stdout ? String(err.stdout) : '',\n stderr: err.stderr ? String(err.stderr) : '',\n exitCode: typeof err.code === 'number' ? err.code : null,\n durationMs,\n error: err.message,\n }\n }\n}\n\nasync function validateMachineControlState(params: {\n supabase: GatewaySupabaseClient\n config: GatewayConfig\n refreshRuntimeInstallFullControl: (config: GatewayConfig) => Promise<boolean>\n loadGatewayControlState: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig\n ) => Promise<{\n full_control_enabled: boolean\n status: string\n last_seen_at: string | null\n capabilities: GatewayCapabilitiesV1 | null\n } | null>\n isHeartbeatFresh: (lastSeenAt: string | null) => boolean\n}): Promise<{ ok: boolean; message?: string }> {\n const installFullControlEnabled = await params.refreshRuntimeInstallFullControl(params.config)\n const gatewayControlState = await params.loadGatewayControlState(params.supabase, params.config)\n if (!gatewayControlState) {\n return {\n ok: false,\n message: 'Gateway control state unavailable',\n }\n }\n\n if (!params.isHeartbeatFresh(gatewayControlState.last_seen_at)) {\n return {\n ok: false,\n message: 'Gateway is offline or heartbeat is stale',\n }\n }\n\n const machineControl = deriveGatewayMachineControlState({\n gatewayEnabled: gatewayControlState.full_control_enabled,\n installEnabled: installFullControlEnabled,\n serviceReady: gatewayControlState.capabilities\n ? isGatewayServiceReady(gatewayControlState.capabilities, 'machine_control')\n : false,\n })\n if (!machineControl.effective) {\n return {\n ok: false,\n message: machineControl.reason ?? 'Gateway machine control is unavailable',\n }\n }\n\n return { ok: true }\n}\n\nexport function createGatewayJobHandlers(\n params: CreateGatewayJobHandlersParams\n): GatewayJobHandlers {\n const claimJob = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ): Promise<GatewayJobRow | null> => {\n return await claimGatewayJob(supabase, config, job, params.logError)\n }\n\n const findIdempotencyConflict = async (\n supabase: GatewaySupabaseClient,\n job: GatewayJobRow\n ): Promise<GatewayJobRow | null> => {\n return await findGatewayJobIdempotencyConflict(supabase, job, params.logError)\n }\n\n const completeJob = async (\n supabase: GatewaySupabaseClient,\n jobId: string,\n status: GatewayJobStatus,\n result: Record<string, unknown> | null,\n errorMessage?: string\n ): Promise<void> => {\n await completeGatewayJob(supabase, jobId, status, result, errorMessage, params.logError)\n }\n\n const updateJobDebug = async (\n supabase: GatewaySupabaseClient,\n jobId: string,\n debug: Record<string, unknown>\n ): Promise<void> => {\n await updateGatewayJobDebug(supabase, jobId, debug, params.logError)\n }\n\n const handleDiagnosticJob = async (): Promise<{\n ok: boolean\n result: Record<string, unknown>\n error?: string\n }> => {\n const output = await runClaudeVersionDiagnostic({\n resolveClaudeCommand: params.resolveClaudeCommand,\n buildGatewayChildEnv: params.buildGatewayChildEnv,\n timeoutMs: params.defaultClaudeTimeoutMs,\n })\n const command = params.resolveClaudeCommand()\n if (!output.ok) {\n return {\n ok: false,\n result: {\n command: `${command} --version`,\n stdout: output.stdout,\n stderr: output.stderr,\n exit_code: output.exitCode,\n duration_ms: output.durationMs,\n error: output.error,\n },\n error: output.error || 'Claude CLI check failed',\n }\n }\n\n return {\n ok: true,\n result: {\n command: `${command} --version`,\n stdout: output.stdout,\n stderr: output.stderr,\n exit_code: output.exitCode,\n duration_ms: output.durationMs,\n version: output.version,\n },\n }\n }\n\n const handleSubagentCancelJob = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ): Promise<{ ok: boolean; result: Record<string, unknown>; error?: string }> => {\n return await handleSubagentCancelJobBase({\n supabase,\n config,\n job,\n requestSubagentCancel: params.requestSubagentCancel,\n logError: params.logError,\n })\n }\n\n const handleSubagentRunJob = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ): Promise<{\n ok: boolean\n result: Record<string, unknown>\n jobStatus?: GatewayJobStatus\n skipSubagentFailure?: boolean\n error?: string\n }> => {\n return await handleGatewaySubagentRunJob({\n supabase,\n config,\n job,\n activeSubagentRuns: params.activeSubagentRuns,\n providerCapabilities: params.getProviderCapabilities(),\n claudeSupport: params.getClaudeSupport(),\n defaultTimeoutMs: params.defaultSubagentTimeoutMs,\n cancelKillTimeoutMs: params.subagentCancelKillTimeoutMs,\n refreshRuntimeInstallFullControl: params.refreshRuntimeInstallFullControl,\n loadGatewayControlState: params.loadGatewayControlState,\n isHeartbeatFresh: params.isHeartbeatFresh,\n resolveClaudeCommand: params.resolveClaudeCommand,\n resolveCodexCommand: params.resolveCodexCommand,\n resolveGeminiCommand: params.resolveGeminiCommand,\n getNextRunSequence: params.getNextRunSequence,\n getNextSubagentRunEventSequence: params.getNextSubagentRunEventSequence,\n insertSubagentRunEvent: params.insertSubagentRunEvent,\n resolvePendingCancel: params.resolvePendingCancel,\n consumePendingCancelFromQueue: params.consumePendingCancelFromQueue,\n clearPendingCancel: params.clearPendingCancel,\n resolveSubagentWorkdirRoot: params.resolveSubagentWorkdirRoot,\n runCommand: params.runCommand,\n runStreamingCommand: params.runStreamingCommand,\n updateRuntimeProviderHealth: params.updateRuntimeProviderHealth,\n requestChildTermination: params.requestChildTermination,\n logInfo: params.logInfo,\n logError: params.logError,\n })\n }\n\n const handleModelRunJob = async (\n supabase: GatewaySupabaseClient,\n job: GatewayJobRow\n ): Promise<{ ok: boolean; result: Record<string, unknown>; error?: string }> => {\n return await handleGatewayModelRunJob({\n job,\n defaultTimeoutMs: params.defaultModelRunTimeoutMs,\n processKillGraceMs: params.processKillGraceMs,\n activeModelRuns: params.activeModelRuns,\n runCommand: params.runCommand,\n updateJobDebug: (jobId, debug) => updateJobDebug(supabase, jobId, debug),\n updateProviderHealth: (providerId, status, errorMessage) =>\n params.updateRuntimeProviderHealth({\n supabase,\n providerId,\n status,\n error: errorMessage ?? null,\n context: 'model_run',\n jobId: job.id,\n }),\n requestChildTermination: params.requestChildTermination,\n })\n }\n\n const isGatewayJobCancelled = async (\n supabase: GatewaySupabaseClient,\n jobId: string\n ): Promise<boolean> => {\n const status = await loadGatewayJobStatus(supabase, jobId, params.logError)\n return status === 'cancelled'\n }\n\n const handleShellExecJob = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ): Promise<{ ok: boolean; result: Record<string, unknown>; error?: string }> => {\n return await handleGatewayShellExecJob({\n supabase,\n config,\n job,\n defaultTimeoutMs: params.defaultRemoteShellExecTimeoutMs,\n activeShellExecRuns: params.activeShellExecRuns,\n runCommand: params.runCommand,\n isJobCancelled: (jobId) => isGatewayJobCancelled(supabase, jobId),\n validateMachineControlState: () =>\n validateMachineControlState({\n supabase,\n config,\n refreshRuntimeInstallFullControl: params.refreshRuntimeInstallFullControl,\n loadGatewayControlState: params.loadGatewayControlState,\n isHeartbeatFresh: params.isHeartbeatFresh,\n }),\n processKillGraceMs: params.processKillGraceMs,\n requestChildTermination: params.requestChildTermination,\n logError: params.logError,\n })\n }\n\n const failSubagentRun = async (\n supabase: GatewaySupabaseClient,\n job: GatewayJobRow,\n errorMessage: string\n ): Promise<void> => {\n await failSubagentRunBase({\n supabase,\n job,\n errorMessage,\n logError: params.logError,\n })\n }\n\n const processJob = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ): Promise<void> => {\n await processGatewayJob(job, {\n claimJob: (nextJob) => claimJob(supabase, config, nextJob),\n findIdempotencyConflict: (claimedJob) => findIdempotencyConflict(supabase, claimedJob),\n completeJob: (jobId, status, result, errorMessage) =>\n completeJob(supabase, jobId, status, result, errorMessage),\n failSubagentRun: (claimedJob, errorMessage) =>\n failSubagentRun(supabase, claimedJob, errorMessage),\n handleDiagnosticJob,\n handleSubagentRunJob: (claimedJob) => handleSubagentRunJob(supabase, config, claimedJob),\n handleModelRunJob: (claimedJob) => handleModelRunJob(supabase, claimedJob),\n handleSubagentCancelJob: (claimedJob) =>\n handleSubagentCancelJob(supabase, config, claimedJob),\n handleShellExecJob: (claimedJob) => handleShellExecJob(supabase, config, claimedJob),\n logInfo: params.logInfo,\n })\n }\n\n return {\n claimJob,\n processJob,\n handleSubagentCancelJob,\n completeJob,\n failSubagentRun,\n }\n}\n", "const REDACTED_MARKER = '[REDACTED]'\nconst MAX_DEBUG_TEXT_CHARS = 200_000\nconst MAX_DEBUG_SHORT_TEXT_CHARS = 2_000\nconst MAX_DEBUG_COMMAND_CHARS = 512\nconst MAX_DEBUG_PATH_CHARS = 1024\nconst MAX_DEBUG_ARG_CHARS = 256\nconst MAX_DEBUG_ARGS = 128\nconst MAX_DEBUG_FILES = 128\nconst DEFAULT_SENSITIVE_VALUE_FLAGS = new Set([\n '-p',\n '--prompt',\n '--json-schema',\n '--system-prompt',\n '--append-system-prompt',\n])\n\nconst ALLOWED_DEBUG_FIELDS = new Set([\n 'provider_id',\n 'command',\n 'args',\n 'command_line',\n 'work_dir',\n 'prompt_chars',\n 'json_schema_chars',\n 'timeout_ms',\n 'output_mode',\n 'output_path',\n 'files',\n 'stdout',\n 'stdout_truncated',\n 'stdout_bytes',\n 'stderr',\n 'stderr_truncated',\n 'stderr_bytes',\n 'exit_code',\n 'duration_ms',\n 'timed_out',\n 'error_summary',\n])\n\nconst SENSITIVE_FIELD_KEY_PATTERN =\n /(?:access[_-]?token|refresh[_-]?token|api[_-]?key|service[_-]?role[_-]?key|secret|password|authorization|cookie|session(?:[_-]?id)?|(?:^|[_-])token(?:$|[_-])|prompt)/i\n\nconst SENSITIVE_ARG_FLAG_PATTERN =\n /^-{1,2}[a-z0-9][a-z0-9_-]*(?:token|key|secret|password|authorization|cookie|session|prompt)[a-z0-9_-]*$/i\nconst SENSITIVE_ARG_FLAG_WITH_VALUE_PATTERN =\n /^(-{1,2}[a-z0-9][a-z0-9_-]*(?:token|key|secret|password|authorization|cookie|session|prompt)[a-z0-9_-]*)(=)(.*)$/i\n\nconst OPENAI_KEY_PATTERN = /\\bsk-[a-z0-9]{16,}\\b/gi\nconst JWT_PATTERN = /\\beyJ[a-z0-9_-]{8,}\\.[a-z0-9_-]{8,}\\.[a-z0-9_-]{8,}\\b/gi\nconst BEARER_PATTERN = /\\bBearer\\s+[a-z0-9._~+/-]+=*/gi\nconst OPENAI_KEY_MATCH_PATTERN = /\\bsk-[a-z0-9]{16,}\\b/i\nconst JWT_MATCH_PATTERN = /\\beyJ[a-z0-9_-]{8,}\\.[a-z0-9_-]{8,}\\.[a-z0-9_-]{8,}\\b/i\nconst BEARER_MATCH_PATTERN = /\\bBearer\\s+[a-z0-9._~+/-]+=*/i\nconst SECRET_JSON_VALUE_PATTERN =\n /(\"(?:access[_-]?token|refresh[_-]?token|api[_-]?key|service[_-]?role[_-]?key|secret|password|authorization|cookie|session(?:[_-]?id)?|token)\"\\s*:\\s*\")([^\"]*)(\")/gi\nconst SECRET_PAIR_PATTERN =\n /(\\b(?:access[_-]?token|refresh[_-]?token|api[_-]?key|service[_-]?role[_-]?key|secret|password|authorization|cookie|session(?:[_-]?id)?|token)\\b\\s*[:=]\\s*)(?:\"[^\"]*\"|'[^']*'|[^\\s,;]+)/gi\n\nconst OUTPUT_MODE_ALLOWLIST = new Set(['stdout-json', 'file-json', 'stream-json'])\n\nexport interface SafeGatewayCommandDescriptorOptions {\n redactArgIndexes?: Iterable<number>\n redactLastArg?: boolean\n sensitiveValueFlags?: Iterable<string>\n}\n\nexport interface SafeGatewayCommandDescriptor {\n command: string\n args: string[]\n commandLine: string\n}\n\nfunction truncateText(value: string, limit: number): string {\n if (value.length <= limit) return value\n return value.slice(0, limit)\n}\n\nfunction sanitizeText(value: string, limit: number): string {\n if (!value) return ''\n\n let sanitized = value\n sanitized = sanitized.replace(SECRET_JSON_VALUE_PATTERN, `$1${REDACTED_MARKER}$3`)\n sanitized = sanitized.replace(SECRET_PAIR_PATTERN, `$1${REDACTED_MARKER}`)\n sanitized = sanitized.replace(BEARER_PATTERN, `Bearer ${REDACTED_MARKER}`)\n sanitized = sanitized.replace(JWT_PATTERN, REDACTED_MARKER)\n sanitized = sanitized.replace(OPENAI_KEY_PATTERN, REDACTED_MARKER)\n return truncateText(sanitized, limit)\n}\n\nfunction isSensitiveFieldKey(key: string): boolean {\n return SENSITIVE_FIELD_KEY_PATTERN.test(key)\n}\n\nfunction sanitizeBoolean(value: unknown): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined\n}\n\nfunction sanitizeFiniteNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction sanitizeStringValue(value: unknown, limit: number): string | undefined {\n return typeof value === 'string' ? sanitizeText(value, limit) : undefined\n}\n\nfunction sanitizePathValue(value: unknown): string | null | undefined {\n if (value === null) return null\n return sanitizeStringValue(value, MAX_DEBUG_PATH_CHARS)\n}\n\nfunction shouldRedactPositionalArg(arg: string): boolean {\n if (!arg.trim()) return false\n if (SENSITIVE_FIELD_KEY_PATTERN.test(arg)) return true\n if (OPENAI_KEY_MATCH_PATTERN.test(arg)) return true\n if (JWT_MATCH_PATTERN.test(arg)) return true\n if (BEARER_MATCH_PATTERN.test(arg)) return true\n if (/\\s/.test(arg)) return true\n if (arg.length > MAX_DEBUG_ARG_CHARS) return true\n return false\n}\n\nfunction sanitizeArgValue(arg: string): string {\n const matchesSensitiveFlagWithValue = arg.match(SENSITIVE_ARG_FLAG_WITH_VALUE_PATTERN)\n if (matchesSensitiveFlagWithValue) {\n return `${matchesSensitiveFlagWithValue[1]}=${REDACTED_MARKER}`\n }\n if (shouldRedactPositionalArg(arg)) {\n return `[REDACTED_CONTENT:${arg.length}]`\n }\n return sanitizeText(arg, MAX_DEBUG_ARG_CHARS)\n}\n\nfunction normalizeSensitiveValueFlags(options?: SafeGatewayCommandDescriptorOptions): Set<string> {\n const flags = new Set(DEFAULT_SENSITIVE_VALUE_FLAGS)\n for (const flag of options?.sensitiveValueFlags ?? []) {\n flags.add(flag)\n }\n return flags\n}\n\nfunction sanitizeArgs(\n value: unknown,\n options?: SafeGatewayCommandDescriptorOptions\n): string[] | undefined {\n if (!Array.isArray(value)) return undefined\n\n const sanitized: string[] = []\n let redactNextValue = false\n const sensitiveValueFlags = normalizeSensitiveValueFlags(options)\n const redactArgIndexes = new Set(options?.redactArgIndexes ?? [])\n const entries = value.slice(0, MAX_DEBUG_ARGS)\n for (const [index, entry] of entries.entries()) {\n if (typeof entry !== 'string') {\n sanitized.push('[INVALID_ARG]')\n redactNextValue = false\n continue\n }\n\n if (\n redactNextValue ||\n redactArgIndexes.has(index) ||\n (options?.redactLastArg === true && index === entries.length - 1)\n ) {\n sanitized.push(REDACTED_MARKER)\n redactNextValue = false\n continue\n }\n\n const trimmed = entry.trim()\n if (SENSITIVE_ARG_FLAG_PATTERN.test(trimmed) || sensitiveValueFlags.has(trimmed)) {\n sanitized.push(sanitizeText(trimmed, MAX_DEBUG_ARG_CHARS))\n redactNextValue = true\n continue\n }\n\n sanitized.push(sanitizeArgValue(entry))\n }\n\n return sanitized\n}\n\nfunction sanitizeFiles(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined\n const files = value\n .filter((entry): entry is string => typeof entry === 'string')\n .slice(0, MAX_DEBUG_FILES)\n .map((entry) => sanitizeText(entry, MAX_DEBUG_PATH_CHARS))\n return files\n}\n\nfunction sanitizeErrorSummaryValue(value: unknown, depth = 0): unknown {\n if (value === null || typeof value === 'boolean') return value\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined\n if (typeof value === 'string') return sanitizeText(value, MAX_DEBUG_SHORT_TEXT_CHARS)\n if (depth >= 2) return '[REDACTED_NESTED]'\n if (Array.isArray(value)) {\n return value.slice(0, 20).map((entry) => sanitizeErrorSummaryValue(entry, depth + 1))\n }\n if (typeof value === 'object') {\n const output: Record<string, unknown> = {}\n for (const [key, nestedValue] of Object.entries(value as Record<string, unknown>)) {\n if (isSensitiveFieldKey(key)) {\n output[key] = REDACTED_MARKER\n } else {\n const cleaned = sanitizeErrorSummaryValue(nestedValue, depth + 1)\n if (cleaned !== undefined) {\n output[key] = cleaned\n }\n }\n }\n return output\n }\n return undefined\n}\n\nfunction sanitizeErrorSummary(value: unknown): Record<string, unknown> | null | undefined {\n if (value === null) return null\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined\n\n const output: Record<string, unknown> = {}\n for (const [key, nestedValue] of Object.entries(value as Record<string, unknown>)) {\n if (isSensitiveFieldKey(key)) {\n output[key] = REDACTED_MARKER\n continue\n }\n const cleaned = sanitizeErrorSummaryValue(nestedValue, 0)\n if (cleaned !== undefined) {\n output[key] = cleaned\n }\n }\n return output\n}\n\nfunction sanitizeCommandLine(command: string | undefined, args: string[] | undefined, fallback: unknown): string | undefined {\n if (command && args) {\n const joined = args.length > 0 ? `${command} ${args.join(' ')}` : command\n return sanitizeText(joined, MAX_DEBUG_TEXT_CHARS)\n }\n return sanitizeStringValue(fallback, MAX_DEBUG_TEXT_CHARS)\n}\n\nexport function buildSafeGatewayCommandDescriptor(\n command: string,\n args: readonly string[],\n options?: SafeGatewayCommandDescriptorOptions\n): SafeGatewayCommandDescriptor {\n const sanitizedCommand = sanitizeStringValue(command, MAX_DEBUG_COMMAND_CHARS) ?? ''\n const sanitizedArgs = sanitizeArgs([...args], options) ?? []\n const commandLine =\n sanitizeCommandLine(sanitizedCommand, sanitizedArgs, null) ?? sanitizedCommand\n\n return {\n command: sanitizedCommand,\n args: sanitizedArgs,\n commandLine,\n }\n}\n\nexport function sanitizeGatewayDebugPayload(debug: Record<string, unknown>): Record<string, unknown> {\n const sanitized: Record<string, unknown> = {}\n\n const args = sanitizeArgs(debug.args)\n const command = sanitizeStringValue(debug.command, MAX_DEBUG_COMMAND_CHARS)\n const commandLine = sanitizeCommandLine(command, args, debug.command_line)\n\n for (const [key, rawValue] of Object.entries(debug)) {\n if (!ALLOWED_DEBUG_FIELDS.has(key)) {\n continue\n }\n\n switch (key) {\n case 'provider_id':\n if (typeof rawValue === 'string') {\n sanitized.provider_id = sanitizeText(rawValue, MAX_DEBUG_SHORT_TEXT_CHARS)\n }\n break\n case 'command':\n if (command !== undefined) {\n sanitized.command = command\n }\n break\n case 'args':\n if (args !== undefined) {\n sanitized.args = args\n }\n break\n case 'command_line':\n if (commandLine !== undefined) {\n sanitized.command_line = commandLine\n }\n break\n case 'work_dir':\n case 'output_path': {\n const cleaned = sanitizePathValue(rawValue)\n if (cleaned !== undefined) {\n sanitized[key] = cleaned\n }\n break\n }\n case 'files': {\n const files = sanitizeFiles(rawValue)\n if (files !== undefined) {\n sanitized.files = files\n }\n break\n }\n case 'prompt_chars':\n case 'json_schema_chars':\n case 'timeout_ms':\n case 'stdout_bytes':\n case 'stderr_bytes':\n case 'exit_code':\n case 'duration_ms': {\n const numberValue = sanitizeFiniteNumber(rawValue)\n if (numberValue !== undefined) {\n sanitized[key] = numberValue\n }\n break\n }\n case 'stdout':\n case 'stderr': {\n const cleaned = sanitizeStringValue(rawValue, MAX_DEBUG_TEXT_CHARS)\n if (cleaned !== undefined) {\n sanitized[key] = cleaned\n }\n break\n }\n case 'stdout_truncated':\n case 'stderr_truncated':\n case 'timed_out': {\n const boolValue = sanitizeBoolean(rawValue)\n if (boolValue !== undefined) {\n sanitized[key] = boolValue\n }\n break\n }\n case 'output_mode':\n if (typeof rawValue === 'string' && OUTPUT_MODE_ALLOWLIST.has(rawValue)) {\n sanitized.output_mode = rawValue\n }\n break\n case 'error_summary': {\n const errorSummary = sanitizeErrorSummary(rawValue)\n if (errorSummary !== undefined) {\n sanitized.error_summary = errorSummary\n }\n break\n }\n default:\n break\n }\n }\n\n return sanitized\n}\n", "import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport {\n DEFAULT_MODEL_SENTINEL,\n type GatewayCliProvider,\n type GatewayProviderCapabilities,\n type GatewayModelRunPlan,\n} from './types.js'\nimport {\n DEFAULT_CLAUDE_SUPPORT,\n parseClaudeSupport,\n toFlagRecord,\n type ClaudeSupport,\n} from '../subagent-adapters/claude-support.js'\nimport { normalizeGatewayModelOutput, parseClaudeJsonOutput } from './claude-utils.js'\nimport {\n buildProviderChildProcessEnv,\n resolveClaudeProviderCommand,\n} from '../provider-runtime-utils.js'\n\nconst execFileAsync = promisify(execFile)\n\nconst DEFAULT_CLAUDE_TIMEOUT_MS = 10_000\n\nasync function execClaudeHelp(): Promise<{ ok: boolean; stdout: string; stderr: string; error?: string } > {\n const command = resolveClaudeProviderCommand()\n try {\n const { stdout, stderr } = await execFileAsync(command, ['--help'], {\n timeout: DEFAULT_CLAUDE_TIMEOUT_MS,\n env: buildProviderChildProcessEnv(),\n })\n return { ok: true, stdout: String(stdout ?? ''), stderr: String(stderr ?? '') }\n } catch (error) {\n const err = error as NodeJS.ErrnoException & { stdout?: string; stderr?: string }\n return {\n ok: false,\n stdout: err.stdout ? String(err.stdout) : '',\n stderr: err.stderr ? String(err.stderr) : '',\n error: err.message,\n }\n }\n}\n\nasync function execClaudeVersion(): Promise<{ ok: boolean; version: string | null; error?: string } > {\n const command = resolveClaudeProviderCommand()\n try {\n const { stdout } = await execFileAsync(command, ['--version'], {\n timeout: DEFAULT_CLAUDE_TIMEOUT_MS,\n env: buildProviderChildProcessEnv(),\n })\n const version = String(stdout ?? '').trim()\n return { ok: true, version: version || null }\n } catch (error) {\n const err = error as NodeJS.ErrnoException\n return { ok: false, version: null, error: err.message }\n }\n}\n\nasync function detectClaudeSupport(): Promise<ClaudeSupport> {\n const help = await execClaudeHelp()\n if (!help.ok) return DEFAULT_CLAUDE_SUPPORT\n return parseClaudeSupport(`${help.stdout}\\n${help.stderr}`)\n}\n\nfunction appendClaudeIsolationArgs(args: string[], support: ClaudeSupport): void {\n if (support.settingSourcesFlag) {\n args.push('--setting-sources', 'local')\n }\n if (support.disableSlashCommandsFlag) {\n args.push('--disable-slash-commands')\n }\n}\n\nexport function createClaudeCliProvider(): GatewayCliProvider {\n let cachedSupport: ClaudeSupport | null = null\n\n return {\n id: 'claude_code',\n label: 'Claude Code',\n async detectCapabilities(): Promise<GatewayProviderCapabilities> {\n const versionInfo = await execClaudeVersion()\n const support = await detectClaudeSupport()\n cachedSupport = support\n return {\n available: versionInfo.ok,\n version: versionInfo.version ?? undefined,\n error: versionInfo.ok ? undefined : versionInfo.error,\n supported_flags: toFlagRecord(support),\n supports: {\n output_schema: support.jsonSchemaFlag,\n stream_json: support.outputFormatFlag && support.streamJsonFlag,\n tool_disable: support.toolsFlag || support.allowedToolsFlag,\n },\n }\n },\n buildModelRunPlan(context) {\n const support = cachedSupport ?? DEFAULT_CLAUDE_SUPPORT\n const command = resolveClaudeProviderCommand()\n const args: string[] = [\n '--print',\n '--output-format',\n 'json',\n '--json-schema',\n JSON.stringify(context.jsonSchema),\n ]\n\n if (context.model !== DEFAULT_MODEL_SENTINEL) {\n args.splice(1, 0, '--model', context.model)\n }\n\n if (support.toolsFlag) {\n args.push('--tools', '')\n } else if (support.allowedToolsFlag) {\n args.push('--allowedTools', '')\n }\n\n if (support.inputFormatFlag) {\n args.push('--input-format', 'text')\n }\n if (support.noSessionPersistenceFlag) {\n args.push('--no-session-persistence')\n }\n if (support.permissionModeFlag) {\n args.push('--permission-mode', 'dontAsk')\n }\n\n appendClaudeIsolationArgs(args, support)\n\n if (context.appendSystemPrompt) {\n if (support.systemPromptFlag) {\n args.push('--system-prompt', context.appendSystemPrompt)\n } else if (support.appendSystemPromptFlag) {\n args.push('--append-system-prompt', context.appendSystemPrompt)\n }\n }\n\n args.push(context.prompt)\n\n return {\n command,\n args,\n env: buildProviderChildProcessEnv(),\n outputFormat: 'json',\n outputMode: 'stdout-json',\n timeoutMs: typeof context.timeoutMs === 'number' ? context.timeoutMs : null,\n debug: {\n command,\n args,\n prompt_chars: context.prompt.length,\n },\n }\n },\n normalizeModelRunResult({ stdout }) {\n const parsed = parseClaudeJsonOutput(stdout)\n if (!parsed.parsed) {\n throw new Error(parsed.error ?? 'Failed to parse Claude output')\n }\n const normalized = normalizeGatewayModelOutput(parsed.parsed)\n return {\n output: normalized.output,\n raw: parsed.parsed,\n usage: normalized.usage,\n model: normalized.model,\n }\n },\n }\n}\n", "import type {\n GatewayHealthCheckType,\n GatewayHealthStatus,\n GatewayProviderCapabilities,\n GatewayProviderHealth,\n GatewayProviderId,\n GatewayProviderSupports,\n} from '@panorama/shared/gateway/capabilities'\nimport type { ReasoningMode } from '@panorama/shared'\n\nexport type {\n GatewayHealthCheckType,\n GatewayHealthStatus,\n GatewayProviderCapabilities,\n GatewayProviderHealth,\n GatewayProviderId,\n GatewayProviderSupports,\n}\n\nexport type GatewayModelOutputMode = 'stdout-json' | 'file-json' | 'stream-json'\n\nexport const DEFAULT_MODEL_SENTINEL = '__default__' as const\n\nexport interface GatewayModelRunContext {\n model: string\n prompt: string\n jsonSchema: Record<string, unknown>\n appendSystemPrompt?: string\n reasoningEffort?: Exclude<ReasoningMode, 'none'>\n timeoutMs?: number\n}\n\nexport interface GatewaySchemaNormalization {\n schema: Record<string, unknown>\n promptSuffix?: string\n}\n\nexport interface GatewayModelRunPlan {\n command: string\n args: string[]\n env?: NodeJS.ProcessEnv\n outputFormat: 'json' | 'text' | 'stream-json'\n outputMode: GatewayModelOutputMode\n outputPath?: string\n files?: Array<{ path: string; contents: string }>\n timeoutMs: number | null\n debug?: Record<string, unknown>\n}\n\nexport interface GatewayModelRunNormalized {\n output: Record<string, unknown>\n raw: Record<string, unknown>\n usage: Record<string, unknown> | null\n model: string | null\n}\n\nexport interface GatewayCliProvider {\n id: GatewayProviderId\n label: string\n detectCapabilities: () => Promise<GatewayProviderCapabilities>\n normalizeSchema?: (schema: Record<string, unknown>) => GatewaySchemaNormalization\n buildModelRunPlan: (context: GatewayModelRunContext) => GatewayModelRunPlan\n normalizeModelRunResult: (params: {\n stdout: string\n outputFormat: GatewayModelRunPlan['outputFormat']\n outputMode: GatewayModelRunPlan['outputMode']\n outputPath?: string\n workDir: string\n }) => GatewayModelRunNormalized\n}\n", "export interface ClaudeSupport {\n toolsFlag: boolean\n allowedToolsFlag: boolean\n disallowedToolsFlag: boolean\n outputFormatFlag: boolean\n streamJsonFlag: boolean\n modelFlag: boolean\n jsonSchemaFlag: boolean\n appendSystemPromptFlag: boolean\n systemPromptFlag: boolean\n includePartialMessagesFlag: boolean\n permissionModeFlag: boolean\n maxBudgetFlag: boolean\n inputFormatFlag: boolean\n betasFlag: boolean\n noSessionPersistenceFlag: boolean\n sessionIdFlag: boolean\n resumeFlag: boolean\n verboseFlag: boolean\n settingsFlag: boolean\n settingSourcesFlag: boolean\n disableSlashCommandsFlag: boolean\n strictMcpConfigFlag: boolean\n mcpConfigFlag: boolean\n pluginDirFlag: boolean\n dangerouslySkipPermissionsFlag: boolean\n allowDangerouslySkipPermissionsFlag: boolean\n}\n\nexport const DEFAULT_CLAUDE_SUPPORT: ClaudeSupport = {\n toolsFlag: false,\n allowedToolsFlag: true,\n disallowedToolsFlag: true,\n outputFormatFlag: true,\n streamJsonFlag: false,\n modelFlag: false,\n jsonSchemaFlag: false,\n appendSystemPromptFlag: false,\n systemPromptFlag: true,\n includePartialMessagesFlag: false,\n permissionModeFlag: false,\n maxBudgetFlag: false,\n inputFormatFlag: false,\n betasFlag: false,\n noSessionPersistenceFlag: false,\n sessionIdFlag: false,\n resumeFlag: false,\n verboseFlag: false,\n settingsFlag: false,\n settingSourcesFlag: false,\n disableSlashCommandsFlag: false,\n strictMcpConfigFlag: false,\n mcpConfigFlag: false,\n pluginDirFlag: false,\n dangerouslySkipPermissionsFlag: false,\n allowDangerouslySkipPermissionsFlag: false,\n}\n\nexport function coerceClaudeSupport(flags?: Record<string, boolean> | null): ClaudeSupport {\n if (!flags) return DEFAULT_CLAUDE_SUPPORT\n return {\n ...DEFAULT_CLAUDE_SUPPORT,\n ...flags,\n }\n}\n\nexport function toFlagRecord(flags: ClaudeSupport): Record<string, boolean> {\n return Object.fromEntries(\n Object.entries(flags).map(([key, value]) => [key, Boolean(value)])\n )\n}\n\nexport function parseClaudeSupport(helpText: string): ClaudeSupport {\n const text = helpText.toLowerCase()\n const hasFlag = (flag: string) => text.includes(flag.toLowerCase())\n\n return {\n ...DEFAULT_CLAUDE_SUPPORT,\n toolsFlag: hasFlag('--tools'),\n allowedToolsFlag: hasFlag('--allowedtools') || hasFlag('--allowed-tools'),\n disallowedToolsFlag: hasFlag('--disallowedtools') || hasFlag('--disallowed-tools'),\n outputFormatFlag: hasFlag('--output-format'),\n streamJsonFlag: text.includes('stream-json'),\n modelFlag: hasFlag('--model'),\n jsonSchemaFlag: hasFlag('--json-schema'),\n appendSystemPromptFlag: hasFlag('--append-system-prompt'),\n systemPromptFlag: hasFlag('--system-prompt'),\n includePartialMessagesFlag: hasFlag('--include-partial-messages'),\n permissionModeFlag: hasFlag('--permission-mode'),\n maxBudgetFlag: hasFlag('--max-budget-usd'),\n inputFormatFlag: hasFlag('--input-format'),\n betasFlag: hasFlag('--betas'),\n noSessionPersistenceFlag: hasFlag('--no-session-persistence'),\n sessionIdFlag: hasFlag('--session-id'),\n resumeFlag: hasFlag('--resume'),\n verboseFlag: hasFlag('--verbose'),\n settingsFlag: hasFlag('--settings'),\n settingSourcesFlag: hasFlag('--setting-sources'),\n disableSlashCommandsFlag: hasFlag('--disable-slash-commands'),\n strictMcpConfigFlag: hasFlag('--strict-mcp-config'),\n mcpConfigFlag: hasFlag('--mcp-config'),\n pluginDirFlag: hasFlag('--plugin-dir'),\n dangerouslySkipPermissionsFlag: hasFlag('--dangerously-skip-permissions'),\n allowDangerouslySkipPermissionsFlag: hasFlag('--allow-dangerously-skip-permissions'),\n }\n}\n", "export function parseClaudeJsonOutput(stdout: string): { parsed: Record<string, unknown> | null; error?: string } {\n if (!stdout) return { parsed: null, error: 'Empty Claude output' }\n const trimmed = stdout.trim()\n if (!trimmed) return { parsed: null, error: 'Empty Claude output' }\n\n const tryParse = (value: string): Record<string, unknown> | null => {\n try {\n const parsed = JSON.parse(value) as Record<string, unknown>\n return parsed\n } catch {\n return null\n }\n }\n\n const direct = tryParse(trimmed)\n if (direct) return { parsed: direct }\n\n const lines = trimmed\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n for (const line of lines) {\n const parsed = tryParse(line)\n if (parsed) return { parsed }\n }\n\n const firstBrace = trimmed.indexOf('{')\n const lastBrace = trimmed.lastIndexOf('}')\n if (firstBrace !== -1 && lastBrace !== -1 && lastBrace > firstBrace) {\n const slice = trimmed.slice(firstBrace, lastBrace + 1)\n const parsed = tryParse(slice)\n if (parsed) return { parsed }\n }\n\n return {\n parsed: null,\n error: 'Failed to parse Claude JSON output',\n }\n}\n\nexport function normalizeGatewayModelOutput(parsed: Record<string, unknown>): {\n output: Record<string, unknown>\n usage: Record<string, unknown> | null\n model: string | null\n} {\n let outputCandidate =\n (parsed.structured_output ??\n parsed.structuredOutput ??\n parsed.output ??\n parsed.tool_call ??\n parsed.toolCall) ??\n null\n\n if (!outputCandidate && typeof parsed.result === 'string') {\n try {\n outputCandidate = JSON.parse(parsed.result) as Record<string, unknown>\n } catch {\n outputCandidate = null\n }\n }\n\n if (!outputCandidate || typeof outputCandidate !== 'object') {\n throw new Error('Claude output missing structured JSON payload')\n }\n\n const usage =\n (parsed.usage as Record<string, unknown> | undefined) ??\n (parsed.usage_metadata as Record<string, unknown> | undefined) ??\n null\n\n const model =\n typeof parsed.model === 'string'\n ? parsed.model\n : typeof parsed.provider_model === 'string'\n ? parsed.provider_model\n : null\n\n return {\n output: outputCandidate as Record<string, unknown>,\n usage,\n model,\n }\n}\n", "import path from 'node:path'\nimport process from 'node:process'\nimport { buildGatewayChildProcessEnv } from './child-process-env.js'\nimport {\n resolveClaudeCommand,\n resolveCodexCommand,\n resolveGeminiCommand,\n type ResolveProviderCommandOptions,\n} from './cli-provider-commands.js'\nimport { resolveGatewayTmpDir } from './runtime-paths.js'\n\nexport interface ProviderChildProcessEnvOptions {\n baseEnv?: NodeJS.ProcessEnv\n tmpDir?: string\n overrides?: NodeJS.ProcessEnv\n}\n\nexport interface GeminiProviderChildProcessEnvOptions extends ProviderChildProcessEnvOptions {\n systemPromptPath?: string\n commandPath?: string\n}\n\nexport interface ParseProviderJsonFromTextOptions {\n stripCodeFence?: boolean\n errorMessage?: string\n}\n\nexport function resolveClaudeProviderCommand(\n options: ResolveProviderCommandOptions = {}\n): string {\n return resolveClaudeCommand(options)\n}\n\nexport function resolveCodexProviderCommand(options: ResolveProviderCommandOptions = {}): string {\n return resolveCodexCommand(options)\n}\n\nexport function resolveGeminiProviderCommand(options: ResolveProviderCommandOptions = {}): string {\n return resolveGeminiCommand(options)\n}\n\nexport function buildProviderChildProcessEnv(\n options: ProviderChildProcessEnvOptions = {}\n): NodeJS.ProcessEnv {\n return buildGatewayChildProcessEnv({\n baseEnv: options.baseEnv,\n tmpDir: options.tmpDir ?? resolveGatewayTmpDir(),\n overrides: options.overrides,\n })\n}\n\nexport function withProviderPathEntries(current: string | undefined, entries: string[]): string {\n const parts = (current ?? '')\n .split(path.delimiter)\n .map((entry) => entry.trim())\n .filter(Boolean)\n const seen = new Set(parts)\n for (const entry of entries) {\n if (!entry || seen.has(entry)) continue\n parts.unshift(entry)\n seen.add(entry)\n }\n return parts.join(path.delimiter)\n}\n\nexport function ensureNodeAndCommandPath(env: NodeJS.ProcessEnv, commandPath: string): void {\n const entries: string[] = []\n const nodeDir = path.dirname(process.execPath)\n if (nodeDir) entries.push(nodeDir)\n if (commandPath && path.isAbsolute(commandPath)) {\n entries.push(path.dirname(commandPath))\n }\n if (entries.length > 0) {\n env.PATH = withProviderPathEntries(env.PATH, entries)\n }\n}\n\nexport function buildGeminiProviderChildProcessEnv(\n options: GeminiProviderChildProcessEnvOptions = {}\n): NodeJS.ProcessEnv {\n const env = buildProviderChildProcessEnv(options)\n if (options.systemPromptPath) {\n env.GEMINI_SYSTEM_MD = options.systemPromptPath\n }\n const commandPath =\n options.commandPath ??\n resolveGeminiProviderCommand({ env: options.baseEnv ?? process.env })\n ensureNodeAndCommandPath(env, commandPath)\n return env\n}\n\nexport function stripProviderCodeFence(text: string): string {\n const trimmed = text.trim()\n if (trimmed.startsWith('```')) {\n return trimmed.replace(/^```(?:json)?\\n?/i, '').replace(/```$/i, '').trim()\n }\n return trimmed\n}\n\nexport function parseProviderJsonFromText(\n text: string,\n options: ParseProviderJsonFromTextOptions = {}\n): Record<string, unknown> {\n const cleaned = options.stripCodeFence ? stripProviderCodeFence(text) : text.trim()\n const tryParse = (value: string): Record<string, unknown> | null => {\n try {\n return JSON.parse(value) as Record<string, unknown>\n } catch {\n return null\n }\n }\n\n const direct = tryParse(cleaned)\n if (direct) return direct\n\n const lines = cleaned\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n for (const line of lines) {\n const parsed = tryParse(line)\n if (parsed) return parsed\n }\n\n const firstBrace = cleaned.indexOf('{')\n const lastBrace = cleaned.lastIndexOf('}')\n if (firstBrace !== -1 && lastBrace > firstBrace) {\n const slice = cleaned.slice(firstBrace, lastBrace + 1)\n const parsed = tryParse(slice)\n if (parsed) return parsed\n }\n\n throw new Error(options.errorMessage ?? 'Failed to parse JSON output')\n}\n", "import { execFile } from 'node:child_process'\nimport fsSync from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { promisify } from 'node:util'\nimport { getStringOption, type ParsedArgs } from './cli-args.js'\nimport {\n collectCommandCandidates,\n compareVersions,\n extractVersion,\n resolveClaudeFallbackCommand,\n type CommandDiscoveryOptions,\n} from './cli-command-discovery.js'\n\nconst execFileAsync = promisify(execFile)\nconst DEFAULT_COMMAND_PROBE_TIMEOUT_MS = 5_000\nconst DEFAULT_SHELL_RESOLUTION_TIMEOUT_MS = 2_000\n\nexport type ProviderCommandSource = 'override' | 'detected' | 'fallback'\n\nexport interface CommandVersionProbeResult {\n ok: boolean\n version: string | null\n error?: string\n}\n\nexport interface ShellCommandResolution {\n kind: 'alias' | 'function' | 'path'\n detail: string\n path?: string\n}\n\nexport type CommandProbeExec = (\n command: string,\n args: string[],\n options: { timeout: number; env?: NodeJS.ProcessEnv }\n) => Promise<{ stdout?: unknown; stderr?: unknown }>\n\nexport type ProviderCommandLogger = (\n message: string,\n data?: Record<string, unknown>\n) => void\n\nexport interface ProbeCommandVersionOptions {\n env?: NodeJS.ProcessEnv\n timeoutMs?: number\n execFile?: CommandProbeExec\n}\n\nexport interface ProbeShellResolutionOptions {\n shell?: string\n timeoutMs?: number\n execFile?: CommandProbeExec\n}\n\nexport interface ResolveProviderCommandOptions {\n options?: ParsedArgs['options']\n env?: NodeJS.ProcessEnv\n homeDir?: string\n defaultClaudePath?: string\n logInfo?: ProviderCommandLogger\n}\n\nexport interface SelectBestCommandOptions {\n label: string\n command: string\n override?: string\n extraCandidates?: string[]\n discoveryOptions?: CommandDiscoveryOptions\n probeCommand?: (command: string) => Promise<CommandVersionProbeResult>\n logInfo?: ProviderCommandLogger\n}\n\nlet claudeWrapperFallbackLogged = false\n\nfunction toOutputString(value: unknown): string {\n if (value === null || value === undefined) return ''\n return String(value)\n}\n\nexport function getDefaultClaudePath(homeDir: string = os.homedir()): string {\n return path.join(homeDir, '.claude', 'local', 'claude')\n}\n\nfunction logClaudeWrapperFallbackOnce(\n wrapper: string,\n fallback: string,\n logInfo?: ProviderCommandLogger\n): void {\n if (claudeWrapperFallbackLogged) return\n claudeWrapperFallbackLogged = true\n logInfo?.('Claude CLI wrapper missing target; falling back to alternate command', {\n wrapper,\n fallback,\n })\n}\n\nexport function resolveClaudeCommand(params: ResolveProviderCommandOptions = {}): string {\n const env = params.env ?? process.env\n const options = params.options ?? {}\n const homeDir = params.homeDir ?? os.homedir()\n const defaultClaudePath = params.defaultClaudePath ?? getDefaultClaudePath(homeDir)\n const discoveryOptions: CommandDiscoveryOptions = { env, homeDir }\n const override =\n getStringOption(options, 'claude-cli') || env.PANORAMA_CLAUDE_CLI || env.CLAUDE_CLI\n\n if (override) {\n const fallback = resolveClaudeFallbackCommand(override, discoveryOptions)\n if (fallback) {\n logClaudeWrapperFallbackOnce(override, fallback, params.logInfo)\n return fallback\n }\n return override\n }\n\n if (fsSync.existsSync(defaultClaudePath)) {\n const fallback = resolveClaudeFallbackCommand(defaultClaudePath, discoveryOptions)\n if (fallback) {\n logClaudeWrapperFallbackOnce(defaultClaudePath, fallback, params.logInfo)\n return fallback\n }\n return defaultClaudePath\n }\n\n return 'claude'\n}\n\nexport function resolveCodexCommand(params: ResolveProviderCommandOptions = {}): string {\n const env = params.env ?? process.env\n const options = params.options ?? {}\n return getStringOption(options, 'codex-cli') || env.PANORAMA_CODEX_CLI || env.CODEX_CLI || 'codex'\n}\n\nexport function resolveGeminiCommand(params: ResolveProviderCommandOptions = {}): string {\n const env = params.env ?? process.env\n const options = params.options ?? {}\n return (\n getStringOption(options, 'gemini-cli') || env.PANORAMA_GEMINI_CLI || env.GEMINI_CLI || 'gemini'\n )\n}\n\nexport async function probeCommandVersion(\n command: string,\n options: ProbeCommandVersionOptions = {}\n): Promise<CommandVersionProbeResult> {\n const exec = options.execFile ?? execFileAsync\n try {\n const { stdout, stderr } = await exec(command, ['--version'], {\n timeout: options.timeoutMs ?? DEFAULT_COMMAND_PROBE_TIMEOUT_MS,\n env: options.env,\n })\n const output = `${toOutputString(stdout)}\\n${toOutputString(stderr)}`\n return { ok: true, version: extractVersion(output) }\n } catch (error) {\n const err = error as NodeJS.ErrnoException\n return { ok: false, version: null, error: err.message }\n }\n}\n\nexport async function probeShellResolution(\n command: string,\n options: ProbeShellResolutionOptions = {}\n): Promise<ShellCommandResolution | null> {\n const shell = options.shell ?? process.env.SHELL\n if (!shell) return null\n\n const exec = options.execFile ?? execFileAsync\n try {\n const { stdout, stderr } = await exec(shell, ['-lc', `type -a ${command}`], {\n timeout: options.timeoutMs ?? DEFAULT_SHELL_RESOLUTION_TIMEOUT_MS,\n })\n const output = `${toOutputString(stdout)}\\n${toOutputString(stderr)}`.trim()\n if (!output) return null\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n\n for (const line of lines) {\n const lower = line.toLowerCase()\n if (lower.includes('alias')) {\n return { kind: 'alias', detail: line }\n }\n }\n\n for (const line of lines) {\n const lower = line.toLowerCase()\n if (lower.includes('function')) {\n return { kind: 'function', detail: line }\n }\n }\n\n for (const line of lines) {\n const match = line.match(/\\bis\\s+(\\/\\S+)/)\n if (match) {\n return { kind: 'path', detail: line, path: match[1] }\n }\n }\n } catch {\n return null\n }\n\n return null\n}\n\nexport async function selectBestCommand(options: SelectBestCommandOptions): Promise<{\n command: string\n version: string | null\n source: ProviderCommandSource\n}> {\n const { label, command, override } = options\n const extraCandidates = options.extraCandidates ?? []\n const probeCommand = options.probeCommand ?? ((candidate) => probeCommandVersion(candidate))\n\n if (override) {\n const result = await probeCommand(override)\n if (!result.ok) {\n options.logInfo?.(`${label} CLI override failed version check`, {\n command: override,\n error: result.error,\n })\n }\n return { command: override, version: result.version, source: 'override' }\n }\n\n const candidates = collectCommandCandidates(\n command,\n extraCandidates,\n options.discoveryOptions ?? {}\n )\n let best: { command: string; version: string | null } | null = null\n\n for (const candidate of candidates) {\n const result = await probeCommand(candidate)\n if (!result.ok) continue\n if (!best) {\n best = { command: candidate, version: result.version }\n continue\n }\n if (result.version && !best.version) {\n best = { command: candidate, version: result.version }\n continue\n }\n if (result.version && best.version && compareVersions(result.version, best.version) > 0) {\n best = { command: candidate, version: result.version }\n }\n }\n\n if (best) {\n return { command: best.command, version: best.version, source: 'detected' }\n }\n\n return { command, version: null, source: 'fallback' }\n}\n", "import fsSync from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\n\nconst DEFAULT_MAX_CLAUDE_WRAPPER_BYTES = 4096\n\nexport interface CommandDiscoveryOptions {\n env?: NodeJS.ProcessEnv\n homeDir?: string\n platform?: NodeJS.Platform\n maxClaudeWrapperBytes?: number\n}\n\nfunction resolveOptions(options: CommandDiscoveryOptions = {}): Required<CommandDiscoveryOptions> {\n return {\n env: options.env ?? process.env,\n homeDir: options.homeDir ?? os.homedir(),\n platform: options.platform ?? process.platform,\n maxClaudeWrapperBytes: options.maxClaudeWrapperBytes ?? DEFAULT_MAX_CLAUDE_WRAPPER_BYTES,\n }\n}\n\nexport function expandHomePath(value: string, homeDir: string = os.homedir()): string {\n if (value.startsWith('~/')) {\n return path.join(homeDir, value.slice(2))\n }\n return value\n}\n\nexport function extractClaudeWrapperTarget(\n commandPath: string,\n options: CommandDiscoveryOptions = {}\n): string | null {\n const { homeDir, maxClaudeWrapperBytes } = resolveOptions(options)\n try {\n const stat = fsSync.statSync(commandPath)\n if (!stat.isFile() || stat.size > maxClaudeWrapperBytes) return null\n const raw = fsSync.readFileSync(commandPath, 'utf8')\n const match = raw.match(/exec\\s+(?:\"([^\"]+)\"|'([^']+)'|([^\\s]+))/)\n const target = match?.[1] ?? match?.[2] ?? match?.[3]\n if (!target) return null\n return expandHomePath(target, homeDir)\n } catch {\n return null\n }\n}\n\nexport function isBrokenClaudeWrapper(\n commandPath: string,\n options: CommandDiscoveryOptions = {}\n): boolean {\n const target = extractClaudeWrapperTarget(commandPath, options)\n if (!target) return false\n try {\n return !fsSync.existsSync(target)\n } catch {\n return false\n }\n}\n\nexport function isExecutableCandidate(\n candidate: string,\n platform: NodeJS.Platform = process.platform\n): boolean {\n try {\n const stat = fsSync.statSync(candidate)\n if (!stat.isFile()) return false\n if (platform === 'win32') return true\n fsSync.accessSync(candidate, fsSync.constants.X_OK)\n return true\n } catch {\n return false\n }\n}\n\nexport function collectBinDirs(options: CommandDiscoveryOptions = {}): string[] {\n const { env, homeDir, platform } = resolveOptions(options)\n const dirs = new Set<string>()\n\n const addDir = (dir?: string | null) => {\n if (!dir) return\n const resolved = expandHomePath(dir, homeDir)\n if (!resolved) return\n dirs.add(path.resolve(resolved))\n }\n\n const addPrefixBin = (prefix?: string | null) => {\n if (!prefix) return\n const resolved = expandHomePath(prefix, homeDir)\n if (!resolved) return\n dirs.add(path.resolve(resolved, 'bin'))\n }\n\n addDir(env.PNPM_HOME)\n addPrefixBin(env.NPM_CONFIG_PREFIX)\n addPrefixBin(env.npm_config_prefix)\n addDir(env.VOLTA_HOME ? path.join(env.VOLTA_HOME, 'bin') : null)\n addDir(env.BUN_INSTALL ? path.join(env.BUN_INSTALL, 'bin') : null)\n addPrefixBin(env.HOMEBREW_PREFIX)\n addPrefixBin(env.BREW_PREFIX)\n if (env.ASDF_DATA_DIR) {\n addDir(path.join(env.ASDF_DATA_DIR, 'shims'))\n }\n\n if (platform === 'darwin') {\n addDir('/opt/homebrew/bin')\n addDir('/usr/local/bin')\n addDir(path.join(homeDir, 'Library', 'pnpm'))\n }\n\n if (platform !== 'win32') {\n addDir('/usr/local/bin')\n addDir('/usr/bin')\n addDir('/bin')\n addDir(path.join(homeDir, '.local', 'bin'))\n addDir(path.join(homeDir, 'bin'))\n addDir(path.join(homeDir, '.npm-global', 'bin'))\n addDir(path.join(homeDir, '.nvm', 'versions', 'node', 'current', 'bin'))\n addDir(path.join(homeDir, '.asdf', 'shims'))\n addDir(path.join(homeDir, '.nix-profile', 'bin'))\n }\n\n const pathDelimiter = platform === 'win32' ? ';' : ':'\n const pathEntries = (env.PATH ?? '')\n .split(pathDelimiter)\n .map((entry) => entry.trim())\n .filter(Boolean)\n for (const entry of pathEntries) {\n addDir(entry)\n }\n\n return Array.from(dirs)\n}\n\nexport function expandCommandExtensions(\n command: string,\n options: Pick<CommandDiscoveryOptions, 'env' | 'platform'> = {}\n): string[] {\n const env = options.env ?? process.env\n const platform = options.platform ?? process.platform\n if (platform !== 'win32') return [command]\n const extList = (env.PATHEXT ?? '.EXE;.CMD;.BAT')\n .split(';')\n .map((entry) => entry.trim())\n .filter(Boolean)\n return extList.map((ext) => `${command}${ext.toLowerCase()}`)\n}\n\nexport function collectCommandCandidates(\n command: string,\n extraCandidates: string[],\n options: CommandDiscoveryOptions = {}\n): string[] {\n const resolvedOptions = resolveOptions(options)\n const candidates = new Set<string>()\n\n const addCandidate = (value: string) => {\n if (!value) return\n const resolved = expandHomePath(value, resolvedOptions.homeDir)\n candidates.add(resolved)\n }\n\n extraCandidates.forEach(addCandidate)\n\n const binDirs = collectBinDirs(resolvedOptions)\n const extensions = expandCommandExtensions(command, resolvedOptions)\n for (const dir of binDirs) {\n for (const extCommand of extensions) {\n const candidate = path.join(dir, extCommand)\n if (isExecutableCandidate(candidate, resolvedOptions.platform)) {\n candidates.add(candidate)\n }\n }\n }\n\n candidates.add(command)\n\n return Array.from(candidates)\n}\n\nexport function resolveClaudeFallbackCommand(\n commandPath: string,\n options: CommandDiscoveryOptions = {}\n): string | null {\n const resolvedOptions = resolveOptions(options)\n if (!isBrokenClaudeWrapper(commandPath, resolvedOptions)) return null\n\n const excluded = new Set<string>()\n const addExcluded = (value: string) => {\n if (!value) return\n excluded.add(path.resolve(value))\n try {\n excluded.add(fsSync.realpathSync(value))\n } catch {\n // ignore realpath errors\n }\n }\n\n addExcluded(commandPath)\n\n const candidates = [path.join(resolvedOptions.homeDir, '.claude', 'claude')]\n for (const candidate of candidates) {\n if (excluded.has(path.resolve(candidate))) continue\n if (isExecutableCandidate(candidate, resolvedOptions.platform)) return candidate\n }\n\n const extensions = expandCommandExtensions('claude', resolvedOptions)\n for (const dir of collectBinDirs(resolvedOptions)) {\n for (const extCommand of extensions) {\n const candidate = path.join(dir, extCommand)\n if (excluded.has(path.resolve(candidate))) continue\n if (isExecutableCandidate(candidate, resolvedOptions.platform)) return candidate\n }\n }\n\n return null\n}\n\nexport function extractVersion(text: string): string | null {\n const normalized = text.trim()\n if (!normalized) return null\n const match = normalized.match(/v?(\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?)/)\n if (match?.[1]) return match[1]\n const fallback = normalized.match(/v?(\\d+\\.\\d+)/)\n if (fallback?.[1]) return `${fallback[1]}.0`\n return null\n}\n\nexport function compareVersions(a: string, b: string): number {\n const parse = (value: string) => {\n const cleaned = value.replace(/^v/i, '')\n const [main, pre] = cleaned.split('-', 2)\n const parts = main.split('.').map((part) => Number.parseInt(part, 10))\n if (parts.some((part) => Number.isNaN(part))) return null\n return { parts, pre: pre ?? null }\n }\n\n const parsedA = parse(a)\n const parsedB = parse(b)\n if (!parsedA || !parsedB) return 0\n\n const length = Math.max(parsedA.parts.length, parsedB.parts.length)\n for (let i = 0; i < length; i += 1) {\n const left = parsedA.parts[i] ?? 0\n const right = parsedB.parts[i] ?? 0\n if (left !== right) return left > right ? 1 : -1\n }\n\n if (parsedA.pre && !parsedB.pre) return -1\n if (!parsedA.pre && parsedB.pre) return 1\n if (parsedA.pre && parsedB.pre) {\n if (parsedA.pre === parsedB.pre) return 0\n return parsedA.pre > parsedB.pre ? 1 : -1\n }\n\n return 0\n}\n", "import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport path from 'node:path'\nimport fsSync from 'node:fs'\nimport {\n DEFAULT_MODEL_SENTINEL,\n type GatewayCliProvider,\n type GatewayProviderCapabilities,\n type GatewayModelRunPlan,\n} from './types.js'\nimport {\n enforceCodexStrictSchema,\n normalizeCodexArgsPayload,\n normalizeCodexToolSchema,\n} from './codex-schema.js'\nimport {\n buildProviderChildProcessEnv,\n parseProviderJsonFromText,\n resolveCodexProviderCommand,\n} from '../provider-runtime-utils.js'\n\nconst execFileAsync = promisify(execFile)\n\nconst DEFAULT_CODEX_TIMEOUT_MS = 10_000\n\nasync function execCodexHelp(): Promise<{ ok: boolean; stdout: string; stderr: string; error?: string } > {\n const command = resolveCodexProviderCommand()\n try {\n const { stdout, stderr } = await execFileAsync(command, ['exec', '--help'], {\n timeout: DEFAULT_CODEX_TIMEOUT_MS,\n env: buildProviderChildProcessEnv(),\n })\n return { ok: true, stdout: String(stdout ?? ''), stderr: String(stderr ?? '') }\n } catch (error) {\n const err = error as NodeJS.ErrnoException & { stdout?: string; stderr?: string }\n return {\n ok: false,\n stdout: err.stdout ? String(err.stdout) : '',\n stderr: err.stderr ? String(err.stderr) : '',\n error: err.message,\n }\n }\n}\n\nasync function execCodexVersion(): Promise<{ ok: boolean; version: string | null; error?: string } > {\n const command = resolveCodexProviderCommand()\n try {\n const { stdout } = await execFileAsync(command, ['--version'], {\n timeout: DEFAULT_CODEX_TIMEOUT_MS,\n env: buildProviderChildProcessEnv(),\n })\n const version = String(stdout ?? '').trim()\n return { ok: true, version: version || null }\n } catch (error) {\n const err = error as NodeJS.ErrnoException\n return { ok: false, version: null, error: err.message }\n }\n}\n\nfunction parseHelpFlags(helpText: string): Record<string, boolean> {\n const text = helpText.toLowerCase()\n const has = (flag: string) => text.includes(flag.toLowerCase())\n return {\n outputSchemaFlag: has('--output-schema'),\n outputLastMessageFlag: has('--output-last-message') || has('-o, --output-last-message'),\n jsonFlag: has('--json'),\n modelFlag: has('--model'),\n sandboxFlag: has('--sandbox'),\n skipGitRepoCheckFlag: has('--skip-git-repo-check'),\n configFlag: has('-c, --config') || has('--config <key=value>'),\n dangerouslyBypassApprovalsAndSandboxFlag: has('--dangerously-bypass-approvals-and-sandbox'),\n }\n}\n\nfunction parseJsonFromText(text: string): Record<string, unknown> {\n return parseProviderJsonFromText(text, { stripCodeFence: true })\n}\n\nfunction parseJsonlForOutput(stdout: string): { output?: Record<string, unknown>; usage?: Record<string, unknown> } {\n const lines = stdout.split(/\\r?\\n/).map((line) => line.trim()).filter(Boolean)\n let outputText: string | null = null\n let usage: Record<string, unknown> | null = null\n for (const line of lines) {\n try {\n const event = JSON.parse(line) as Record<string, unknown>\n if (event.type === 'item.completed') {\n const item = event.item as Record<string, unknown>\n if (item?.type === 'agent_message' && typeof item.text === 'string') {\n outputText = item.text\n }\n }\n if (event.type === 'turn.completed' && event.usage && typeof event.usage === 'object') {\n usage = event.usage as Record<string, unknown>\n }\n } catch {\n // ignore\n }\n }\n if (!outputText) return {}\n return { output: parseJsonFromText(outputText), usage: usage ?? undefined }\n}\n\nexport function createCodexCliProvider(): GatewayCliProvider {\n let cachedFlags: Record<string, boolean> = {}\n\n return {\n id: 'codex',\n label: 'OpenAI Codex',\n normalizeSchema(schema) {\n return normalizeCodexToolSchema(schema)\n },\n async detectCapabilities(): Promise<GatewayProviderCapabilities> {\n let versionInfo = await execCodexVersion()\n let helpInfo = await execCodexHelp()\n\n if (helpInfo.ok) {\n cachedFlags = parseHelpFlags(`${helpInfo.stdout}\\n${helpInfo.stderr}`)\n } else {\n cachedFlags = {}\n }\n return {\n available: versionInfo.ok,\n version: versionInfo.version ?? undefined,\n error: versionInfo.ok ? undefined : versionInfo.error,\n supported_flags: cachedFlags,\n supports: {\n output_schema: !!(cachedFlags.outputSchemaFlag && cachedFlags.outputLastMessageFlag),\n stream_json: !!cachedFlags.jsonFlag,\n tool_disable: !!cachedFlags.configFlag,\n },\n }\n },\n buildModelRunPlan(context): GatewayModelRunPlan {\n let prompt = context.prompt\n const args: string[] = ['exec', '--sandbox', 'read-only', '--skip-git-repo-check']\n if (context.model !== DEFAULT_MODEL_SENTINEL) {\n args.push('--model', context.model)\n }\n\n const files: Array<{ path: string; contents: string }> = []\n\n if (cachedFlags.configFlag) {\n if (context.reasoningEffort) {\n args.push('-c', `model_reasoning_effort=\"${context.reasoningEffort}\"`)\n }\n args.push('-c', 'features.shell_tool=false')\n args.push('-c', 'features.web_search_request=false')\n }\n\n let outputMode: GatewayModelRunPlan['outputMode'] = 'stdout-json'\n let outputPath: string | undefined\n if (cachedFlags.outputSchemaFlag && cachedFlags.outputLastMessageFlag) {\n const schemaPath = 'schema.json'\n outputPath = 'output.json'\n const codexSchema = enforceCodexStrictSchema(context.jsonSchema)\n files.push({ path: schemaPath, contents: JSON.stringify(codexSchema) })\n args.push('--output-schema', schemaPath)\n args.push('-o', outputPath)\n outputMode = 'file-json'\n } else if (cachedFlags.jsonFlag) {\n args.push('--json')\n outputMode = 'stream-json'\n } else {\n // fallback: embed schema in prompt\n const schemaInline = JSON.stringify(enforceCodexStrictSchema(context.jsonSchema))\n prompt = `${prompt}\\n\\nReturn STRICT JSON matching this schema:\\n${schemaInline}`\n }\n\n if (context.appendSystemPrompt) {\n prompt = `${prompt}\\n\\n${context.appendSystemPrompt}`\n }\n\n args.push(prompt)\n\n return {\n command: resolveCodexProviderCommand(),\n args,\n env: buildProviderChildProcessEnv(),\n outputFormat: outputMode === 'stream-json' ? 'stream-json' : 'text',\n outputMode,\n outputPath,\n files,\n timeoutMs: typeof context.timeoutMs === 'number' ? context.timeoutMs : null,\n }\n },\n normalizeModelRunResult({ stdout, outputMode, outputPath, workDir }) {\n if (outputMode === 'file-json') {\n if (!outputPath) {\n throw new Error('Codex output file path missing')\n }\n const filePath = path.join(workDir, outputPath)\n if (!fsSync.existsSync(filePath)) {\n throw new Error('Codex output file not found')\n }\n const fileContents = fsSync.readFileSync(filePath, 'utf-8')\n const parsed = JSON.parse(fileContents) as Record<string, unknown>\n const normalized = normalizeCodexArgsPayload(parsed)\n return { output: normalized.output, raw: normalized.raw, usage: null, model: null }\n }\n\n if (outputMode === 'stream-json') {\n const parsed = parseJsonlForOutput(stdout)\n if (!parsed.output) {\n throw new Error('Codex JSONL output missing agent message')\n }\n const normalized = normalizeCodexArgsPayload(parsed.output)\n return {\n output: normalized.output,\n raw: normalized.raw,\n usage: parsed.usage ?? null,\n model: null,\n }\n }\n\n const parsed = parseJsonFromText(stdout)\n const normalized = normalizeCodexArgsPayload(parsed)\n return { output: normalized.output, raw: normalized.raw, usage: null, model: null }\n },\n }\n}\n", "export function enforceCodexStrictSchema<T>(schema: T): T {\n const seen = new WeakMap<object, unknown>()\n\n const visit = (value: unknown): unknown => {\n if (value === null || typeof value !== 'object') {\n return value\n }\n if (Array.isArray(value)) {\n return value.map((entry) => visit(entry))\n }\n if (seen.has(value)) {\n return seen.get(value) as unknown\n }\n\n const input = value as Record<string, unknown>\n const output: Record<string, unknown> = {}\n seen.set(value, output)\n\n for (const [key, entry] of Object.entries(input)) {\n output[key] = visit(entry)\n }\n\n const typeValue = output.type\n const isObjectType =\n typeValue === 'object' ||\n (Array.isArray(typeValue) && typeValue.includes('object')) ||\n typeof output.properties === 'object' ||\n typeof output.patternProperties === 'object'\n\n if (isObjectType) {\n // Codex requires additionalProperties explicitly set to false on object nodes.\n if (output.additionalProperties !== false) {\n output.additionalProperties = false\n }\n }\n\n return output\n }\n\n return visit(schema) as T\n}\n\nexport function normalizeCodexToolSchema(schema: Record<string, unknown>): {\n schema: Record<string, unknown>\n promptSuffix?: string\n} {\n const properties = schema.properties\n if (!properties || typeof properties !== 'object') {\n return { schema }\n }\n\n const props = properties as Record<string, unknown>\n if (!props.name || !props.args) {\n return { schema }\n }\n\n const nameSchema = props.name as Record<string, unknown>\n const codexSchema: Record<string, unknown> = {\n type: 'object',\n required: ['name', 'args_json'],\n properties: {\n name: nameSchema,\n args_json: { type: 'string' },\n },\n additionalProperties: false,\n }\n\n return {\n schema: codexSchema,\n promptSuffix: 'Set args_json to a JSON-encoded string containing the arguments object.',\n }\n}\n\nexport function normalizeCodexArgsPayload(\n payload: Record<string, unknown>\n): { output: Record<string, unknown>; raw: Record<string, unknown> } {\n const raw = payload\n const argsJson = payload.args_json ?? payload.argsJson\n if (typeof argsJson === 'string') {\n try {\n const parsedArgs = JSON.parse(argsJson) as Record<string, unknown>\n const output: Record<string, unknown> = { ...payload }\n output.args = parsedArgs\n delete output.args_json\n delete output.argsJson\n return { output, raw }\n } catch (error) {\n throw new Error(\n `Codex args_json is not valid JSON: ${\n error instanceof Error ? error.message : 'unknown error'\n }`\n )\n }\n }\n return { output: payload, raw }\n}\n", "import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport path from 'node:path'\nimport {\n DEFAULT_MODEL_SENTINEL,\n type GatewayCliProvider,\n type GatewayProviderCapabilities,\n type GatewayModelRunPlan,\n} from './types.js'\nimport {\n buildGeminiProviderChildProcessEnv,\n parseProviderJsonFromText,\n resolveGeminiProviderCommand,\n stripProviderCodeFence,\n} from '../provider-runtime-utils.js'\n\nconst execFileAsync = promisify(execFile)\n\nconst DEFAULT_GEMINI_TIMEOUT_MS = 10_000\n\nasync function execGeminiHelp(): Promise<{ ok: boolean; stdout: string; stderr: string; error?: string } > {\n const command = resolveGeminiProviderCommand()\n try {\n const { stdout, stderr } = await execFileAsync(command, ['--help'], {\n timeout: DEFAULT_GEMINI_TIMEOUT_MS,\n env: buildGeminiProviderChildProcessEnv({ commandPath: command }),\n })\n return { ok: true, stdout: String(stdout ?? ''), stderr: String(stderr ?? '') }\n } catch (error) {\n const err = error as NodeJS.ErrnoException & { stdout?: string; stderr?: string }\n return {\n ok: false,\n stdout: err.stdout ? String(err.stdout) : '',\n stderr: err.stderr ? String(err.stderr) : '',\n error: err.message,\n }\n }\n}\n\nasync function execGeminiVersion(): Promise<{ ok: boolean; version: string | null; error?: string } > {\n const command = resolveGeminiProviderCommand()\n try {\n const { stdout } = await execFileAsync(command, ['--version'], {\n timeout: DEFAULT_GEMINI_TIMEOUT_MS,\n env: buildGeminiProviderChildProcessEnv({ commandPath: command }),\n })\n const version = String(stdout ?? '').trim()\n return { ok: true, version: version || null }\n } catch (error) {\n const err = error as NodeJS.ErrnoException\n return { ok: false, version: null, error: err.message }\n }\n}\n\nasync function execGeminiExtensions(): Promise<{ ok: boolean; list: string[]; error?: string } > {\n const command = resolveGeminiProviderCommand()\n try {\n const { stdout } = await execFileAsync(command, ['--list-extensions'], {\n timeout: DEFAULT_GEMINI_TIMEOUT_MS,\n env: buildGeminiProviderChildProcessEnv({ commandPath: command }),\n })\n const lines = String(stdout ?? '')\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && line.toLowerCase() !== 'installed extensions:')\n return { ok: true, list: lines }\n } catch (error) {\n const err = error as NodeJS.ErrnoException\n return { ok: false, list: [], error: err.message }\n }\n}\n\nfunction parseJsonFromText(text: string): Record<string, unknown> {\n return parseProviderJsonFromText(text, { errorMessage: 'Failed to parse Gemini JSON output' })\n}\n\nexport function createGeminiCliProvider(): GatewayCliProvider {\n let outputFormatSupported = true\n let modelFlagSupported = true\n let approvalModeSupported = false\n let yoloFlagSupported = false\n let sandboxFlagSupported = false\n let extensions: string[] = []\n let extensionsCheckOk = true\n\n return {\n id: 'gemini',\n label: 'Gemini CLI',\n async detectCapabilities(): Promise<GatewayProviderCapabilities> {\n const versionInfo = await execGeminiVersion()\n const helpInfo = await execGeminiHelp()\n const extensionInfo = await execGeminiExtensions()\n extensions = extensionInfo.list\n extensionsCheckOk = extensionInfo.ok\n if (!helpInfo.ok) {\n outputFormatSupported = true\n modelFlagSupported = true\n approvalModeSupported = false\n yoloFlagSupported = false\n sandboxFlagSupported = false\n } else {\n const text = `${helpInfo.stdout}\\n${helpInfo.stderr}`.toLowerCase()\n outputFormatSupported = text.includes('--output-format')\n modelFlagSupported = text.includes('--model')\n approvalModeSupported = text.includes('--approval-mode')\n yoloFlagSupported = text.includes('--yolo')\n sandboxFlagSupported = text.includes('--sandbox')\n }\n const toolDisableSupported = extensionsCheckOk ? extensions.length === 0 : false\n return {\n available: versionInfo.ok,\n version: versionInfo.version ?? undefined,\n error: versionInfo.ok ? undefined : versionInfo.error,\n supported_flags: {\n outputFormatFlag: outputFormatSupported,\n modelFlag: modelFlagSupported,\n extensionsFlag: true,\n approvalModeFlag: approvalModeSupported,\n yoloFlag: yoloFlagSupported,\n sandboxFlag: sandboxFlagSupported,\n },\n supports: {\n output_schema: false,\n stream_json: outputFormatSupported,\n tool_disable: toolDisableSupported,\n },\n extensions,\n }\n },\n buildModelRunPlan(context): GatewayModelRunPlan {\n const prompt = context.prompt\n const schemaString = JSON.stringify(context.jsonSchema)\n const systemPrompt =\n context.appendSystemPrompt && context.appendSystemPrompt.trim().length > 0\n ? `${context.appendSystemPrompt}\\nReturn STRICT JSON only. Do not wrap in code fences.\\nSchema:\\n${schemaString}`\n : `Return STRICT JSON only. Do not wrap in code fences.\\nSchema:\\n${schemaString}`\n\n const files: Array<{ path: string; contents: string }> = [\n { path: 'system.md', contents: systemPrompt },\n ]\n\n const args: string[] = ['--output-format', 'json']\n if (context.model !== DEFAULT_MODEL_SENTINEL) {\n args.push('--model', context.model)\n }\n args.push(prompt)\n const command = resolveGeminiProviderCommand()\n\n return {\n command,\n args,\n env: buildGeminiProviderChildProcessEnv({\n systemPromptPath: path.join('{WORKDIR}', 'system.md'),\n commandPath: command,\n }),\n outputFormat: 'json',\n outputMode: 'stdout-json',\n files,\n timeoutMs: typeof context.timeoutMs === 'number' ? context.timeoutMs : null,\n }\n },\n normalizeModelRunResult({ stdout }) {\n const parsed = parseJsonFromText(stdout)\n const response = typeof parsed.response === 'string' ? parsed.response : ''\n const cleaned = stripProviderCodeFence(response)\n const output = JSON.parse(cleaned) as Record<string, unknown>\n const stats = parsed.stats && typeof parsed.stats === 'object' ? (parsed.stats as Record<string, unknown>) : null\n let model: string | null = null\n const models = stats && typeof stats.models === 'object' ? (stats.models as Record<string, unknown>) : null\n if (models) {\n const first = Object.keys(models)[0]\n if (first) model = first\n }\n return { output, raw: parsed, usage: stats, model }\n },\n }\n}\n", "import type { GatewayCliProvider, GatewayProviderId } from './types.js'\nimport { createClaudeCliProvider } from './claude.js'\nimport { createCodexCliProvider } from './codex.js'\nimport { createGeminiCliProvider } from './gemini.js'\n\nconst PROVIDERS: Record<GatewayProviderId, GatewayCliProvider> = {\n claude_code: createClaudeCliProvider(),\n codex: createCodexCliProvider(),\n gemini: createGeminiCliProvider(),\n}\n\nexport function getGatewayCliProvider(id: GatewayProviderId): GatewayCliProvider {\n return PROVIDERS[id]\n}\n\nexport function listGatewayCliProviders(): GatewayCliProvider[] {\n return Object.values(PROVIDERS)\n}\n\nexport function inferGatewayProviderFromModel(model: string): GatewayProviderId {\n const lowered = model.toLowerCase()\n if (lowered.startsWith('openai/') || lowered.startsWith('gpt-') || lowered.includes('codex')) {\n return 'codex'\n }\n if (lowered.startsWith('google/') || lowered.startsWith('gemini')) {\n return 'gemini'\n }\n return 'claude_code'\n}\n", "import { inferGatewayProviderFromModel } from './cli-providers/registry.js'\n\nexport type GatewayJobStatus = 'queued' | 'running' | 'completed' | 'failed' | 'cancelled'\n\nexport interface GatewayJobRow {\n id: string\n team_id: string\n gateway_id: string | null\n status: GatewayJobStatus\n job_type: string\n payload: Record<string, unknown>\n result: Record<string, unknown> | null\n error: string | null\n idempotency_key?: string | null\n attempt?: number | null\n retry_of_job_id?: string | null\n created_at: string\n updated_at: string\n completed_at: string | null\n}\n\nexport type GatewayJobDescriptionInput = {\n job_type: string\n payload?: Record<string, unknown> | null\n}\n\nexport function inferProviderFromSubagentType(\n subagentType: string | null | undefined\n): string | null {\n if (!subagentType) return null\n const lowered = subagentType.toLowerCase()\n if (lowered.includes('claude')) return 'claude_code'\n if (lowered.includes('codex')) return 'codex'\n if (lowered.includes('gemini')) return 'gemini'\n return null\n}\n\nexport function describeGatewayJob(job: GatewayJobDescriptionInput): {\n job_kind: string\n provider?: string | null\n model?: string | null\n subagent_type?: string | null\n} {\n if (job.job_type === 'model_run') {\n const payload = job.payload ?? {}\n const model = typeof payload.model === 'string' ? payload.model : null\n const provider =\n typeof payload.provider === 'string'\n ? payload.provider\n : model\n ? inferGatewayProviderFromModel(model)\n : null\n return { job_kind: 'cycle', provider, model }\n }\n\n if (job.job_type === 'subagent_run') {\n const payload = job.payload ?? {}\n const subagentType = typeof payload.subagent_type === 'string' ? payload.subagent_type : null\n const provider = inferProviderFromSubagentType(subagentType)\n return { job_kind: 'subagent', provider, subagent_type: subagentType }\n }\n\n if (job.job_type === 'subagent_cancel') {\n return { job_kind: 'subagent_cancel' }\n }\n\n if (job.job_type === 'shell_exec') {\n return { job_kind: 'shell_exec' }\n }\n\n return { job_kind: job.job_type }\n}\n\nexport function isJobTargeted(job: GatewayJobRow, gatewayId: string): boolean {\n return job.gateway_id === gatewayId\n}\n\nexport function resolveJobSubagentId(job: GatewayJobRow): string | null {\n if (job.job_type !== 'subagent_run') return null\n const payload = job.payload ?? {}\n return typeof payload.subagent_id === 'string'\n ? payload.subagent_id\n : typeof payload.subagentId === 'string'\n ? payload.subagentId\n : null\n}\n", "import type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from './database.types.js'\nimport { sanitizeGatewayDebugPayload } from './debug-redaction.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport { asJson } from './gateway-run-helpers.js'\nimport {\n isJobTargeted,\n type GatewayJobRow,\n type GatewayJobStatus,\n} from './gateway-jobs.js'\n\nexport type GatewayJobStoreClient = SupabaseClient<Database>\nexport type GatewayJobStoreLogger = (message: string, data?: Record<string, unknown>) => void\ntype GatewayJobUpdate = Database['public']['Tables']['gateway_jobs']['Update']\n\nconst noopLogger: GatewayJobStoreLogger = () => {}\n\nexport function coerceGatewayJobStatus(value: unknown): GatewayJobStatus | null {\n if (\n value === 'queued' ||\n value === 'running' ||\n value === 'completed' ||\n value === 'failed' ||\n value === 'cancelled'\n ) {\n return value\n }\n\n return null\n}\n\nexport async function claimGatewayJob(\n supabase: GatewayJobStoreClient,\n config: GatewayConfig,\n job: GatewayJobRow,\n logError: GatewayJobStoreLogger = noopLogger\n): Promise<GatewayJobRow | null> {\n if (!isJobTargeted(job, config.gatewayId)) {\n return null\n }\n\n const { data, error } = await supabase\n .from('gateway_jobs')\n .update({\n status: 'running',\n gateway_id: config.gatewayId,\n started_at: new Date().toISOString(),\n })\n .eq('id', job.id)\n .eq('team_id', config.teamId)\n .eq('status', 'queued')\n .eq('gateway_id', config.gatewayId)\n .select('*')\n .maybeSingle()\n\n if (error) {\n logError('Failed to claim gateway job', { error: error.message, jobId: job.id })\n return null\n }\n\n if (!data) {\n return null\n }\n\n return data as GatewayJobRow\n}\n\nexport async function findGatewayJobIdempotencyConflict(\n supabase: GatewayJobStoreClient,\n job: GatewayJobRow,\n logError: GatewayJobStoreLogger = noopLogger\n): Promise<GatewayJobRow | null> {\n if (!job.idempotency_key) return null\n const attempt = typeof job.attempt === 'number' && Number.isFinite(job.attempt) ? job.attempt : 1\n const { data, error } = await supabase\n .from('gateway_jobs')\n .select('id, status, result, error')\n .eq('team_id', job.team_id)\n .eq('idempotency_key', job.idempotency_key)\n .eq('attempt', attempt)\n .in('status', ['running', 'completed'])\n .neq('id', job.id)\n .order('created_at', { ascending: true })\n .limit(1)\n .maybeSingle()\n\n if (error) {\n logError('Failed to check gateway job idempotency', { error: error.message, jobId: job.id })\n return null\n }\n\n return data ? (data as GatewayJobRow) : null\n}\n\nexport async function completeGatewayJob(\n supabase: GatewayJobStoreClient,\n jobId: string,\n status: GatewayJobStatus,\n result: Record<string, unknown> | null,\n errorMessage?: string,\n logError: GatewayJobStoreLogger = noopLogger\n): Promise<void> {\n const updates: GatewayJobUpdate = {\n status,\n result: result ? asJson(result) : null,\n error: errorMessage || null,\n completed_at: new Date().toISOString(),\n }\n\n const { error } = await supabase\n .from('gateway_jobs')\n .update(updates)\n .eq('id', jobId)\n .eq('status', 'running')\n\n if (error) {\n logError('Failed to update gateway job result', { error: error.message, jobId })\n }\n}\n\nexport async function updateGatewayJobDebug(\n supabase: GatewayJobStoreClient,\n jobId: string,\n debug: Record<string, unknown>,\n logError: GatewayJobStoreLogger = noopLogger\n): Promise<void> {\n const sanitizedDebug = sanitizeGatewayDebugPayload(debug)\n const { error } = await supabase\n .from('gateway_jobs')\n .update({ debug: asJson(sanitizedDebug) })\n .eq('id', jobId)\n\n if (error) {\n logError('Failed to update gateway job debug info', { error: error.message, jobId })\n }\n}\n\nexport async function loadGatewayJobStatus(\n supabase: GatewayJobStoreClient,\n jobId: string,\n logError: GatewayJobStoreLogger = noopLogger\n): Promise<GatewayJobStatus | null> {\n const { data, error } = await supabase\n .from('gateway_jobs')\n .select('status')\n .eq('id', jobId)\n .maybeSingle()\n\n if (error) {\n logError('Failed to fetch gateway job status', {\n jobId,\n error: error.message,\n })\n return null\n }\n\n if (!data || typeof data.status !== 'string') {\n return null\n }\n\n return coerceGatewayJobStatus(data.status)\n}\n", "import {\n describeGatewayJob,\n type GatewayJobRow,\n type GatewayJobStatus,\n} from './gateway-jobs.js'\n\nexport interface GatewayJobHandlerResult {\n ok: boolean\n result: Record<string, unknown>\n error?: string\n}\n\nexport interface GatewaySubagentRunHandlerResult extends GatewayJobHandlerResult {\n jobStatus?: GatewayJobStatus\n skipSubagentFailure?: boolean\n}\n\nexport interface GatewayJobProcessorDependencies {\n claimJob: (job: GatewayJobRow) => Promise<GatewayJobRow | null>\n findIdempotencyConflict: (job: GatewayJobRow) => Promise<GatewayJobRow | null>\n completeJob: (\n jobId: string,\n status: GatewayJobStatus,\n result: Record<string, unknown> | null,\n errorMessage?: string\n ) => Promise<void>\n failSubagentRun: (job: GatewayJobRow, errorMessage: string) => Promise<void>\n handleDiagnosticJob: () => Promise<GatewayJobHandlerResult>\n handleSubagentRunJob: (job: GatewayJobRow) => Promise<GatewaySubagentRunHandlerResult>\n handleModelRunJob: (job: GatewayJobRow) => Promise<GatewayJobHandlerResult>\n handleSubagentCancelJob: (job: GatewayJobRow) => Promise<GatewayJobHandlerResult>\n handleShellExecJob: (job: GatewayJobRow) => Promise<GatewayJobHandlerResult>\n logInfo: (message: string, data?: Record<string, unknown>) => void\n}\n\nexport async function processGatewayJob(\n job: GatewayJobRow,\n dependencies: GatewayJobProcessorDependencies\n): Promise<void> {\n const claimed = await dependencies.claimJob(job)\n if (!claimed) {\n return\n }\n\n const idempotencyConflict = await dependencies.findIdempotencyConflict(claimed)\n if (idempotencyConflict) {\n const conflictMessage = 'Duplicate gateway job idempotency key; skipping execution'\n dependencies.logInfo('Skipping duplicate gateway job', {\n jobId: claimed.id,\n conflict_job_id: idempotencyConflict.id,\n idempotency_key: claimed.idempotency_key ?? null,\n attempt: claimed.attempt ?? 1,\n })\n await dependencies.completeJob(\n claimed.id,\n 'cancelled',\n {\n message: conflictMessage,\n idempotency_key: claimed.idempotency_key,\n attempt: claimed.attempt,\n },\n conflictMessage\n )\n return\n }\n\n const jobDetails = describeGatewayJob(claimed)\n dependencies.logInfo('Processing gateway job', {\n jobId: claimed.id,\n jobType: claimed.job_type,\n jobKind: jobDetails.job_kind,\n provider: jobDetails.provider ?? undefined,\n model: jobDetails.model ?? undefined,\n subagentType: jobDetails.subagent_type ?? undefined,\n })\n\n if (claimed.job_type === 'diagnostic') {\n const diagnostic = await dependencies.handleDiagnosticJob()\n if (diagnostic.ok) {\n await dependencies.completeJob(claimed.id, 'completed', diagnostic.result)\n } else {\n await dependencies.completeJob(claimed.id, 'failed', diagnostic.result, diagnostic.error)\n }\n return\n }\n\n if (claimed.job_type === 'subagent_run') {\n const result = await dependencies.handleSubagentRunJob(claimed)\n if (result.ok) {\n await dependencies.completeJob(claimed.id, 'completed', result.result)\n } else {\n await dependencies.completeJob(\n claimed.id,\n result.jobStatus ?? 'failed',\n result.result,\n result.error\n )\n if (!result.skipSubagentFailure) {\n await dependencies.failSubagentRun(claimed, result.error ?? 'Subagent run failed')\n }\n }\n return\n }\n\n if (claimed.job_type === 'model_run') {\n const result = await dependencies.handleModelRunJob(claimed)\n if (result.ok) {\n await dependencies.completeJob(claimed.id, 'completed', result.result)\n } else {\n await dependencies.completeJob(claimed.id, 'failed', result.result, result.error)\n }\n return\n }\n\n if (claimed.job_type === 'subagent_cancel') {\n const result = await dependencies.handleSubagentCancelJob(claimed)\n if (result.ok) {\n await dependencies.completeJob(claimed.id, 'completed', result.result)\n } else {\n await dependencies.completeJob(claimed.id, 'failed', result.result, result.error)\n }\n return\n }\n\n if (claimed.job_type === 'shell_exec') {\n const result = await dependencies.handleShellExecJob(claimed)\n if (result.ok) {\n await dependencies.completeJob(claimed.id, 'completed', result.result)\n } else {\n await dependencies.completeJob(claimed.id, 'failed', result.result, result.error)\n }\n return\n }\n\n await dependencies.completeJob(\n claimed.id,\n 'failed',\n {\n message: 'Unsupported job type',\n job_type: claimed.job_type,\n },\n `Unsupported job type: ${claimed.job_type}`\n )\n}\n", "import type { ChildProcess } from 'node:child_process'\nimport type {\n GatewayCommandResult,\n GatewayCommandRunOptions,\n} from './gateway-command-runner.js'\nimport {\n getGatewayCliProvider,\n inferGatewayProviderFromModel,\n} from './cli-providers/registry.js'\nimport type { GatewayHealthStatus, GatewayProviderId } from './cli-providers/types.js'\nimport {\n assertSafeOutputPath,\n cleanupWorkDir,\n createWorkDir,\n extractGatewayErrorSummary,\n resolveRunPlanEnv,\n truncateLog,\n writeRunPlanFiles,\n} from './gateway-run-helpers.js'\nimport { resolveModelWorkdirRoot } from './runtime-paths.js'\nimport type { GatewayJobRow } from './gateway-jobs.js'\nimport { buildSafeGatewayCommandDescriptor } from './debug-redaction.js'\nimport {\n buildProviderFailureMessage,\n normalizeProviderErrorSummary,\n} from './gateway-provider-health.js'\n\nexport type ActiveModelRun = {\n child?: ChildProcess\n shutdownRequested: boolean\n shutdownReason?: string\n}\n\nexport type GatewayModelRunResult = {\n ok: boolean\n result: Record<string, unknown>\n error?: string\n}\n\nexport type GatewayModelRunCommandRunner = (\n command: string,\n args: string[],\n options: GatewayCommandRunOptions\n) => Promise<GatewayCommandResult>\n\nexport interface GatewayModelRunPayload {\n prompt: string\n model: string\n jsonSchema: Record<string, unknown>\n appendSystemPrompt?: string\n reasoningEffort?: 'low' | 'medium' | 'high'\n timeoutMs: number\n providerId: GatewayProviderId\n}\n\nexport function parseGatewayModelRunPayload(\n payload: Record<string, unknown>,\n defaultTimeoutMs: number\n):\n | { ok: true; value: GatewayModelRunPayload }\n | { ok: false; result: Record<string, unknown>; error: string } {\n const prompt = typeof payload.prompt === 'string' ? payload.prompt : null\n const model = typeof payload.model === 'string' ? payload.model : null\n const jsonSchema =\n payload.json_schema && typeof payload.json_schema === 'object'\n ? (payload.json_schema as Record<string, unknown>)\n : null\n const appendSystemPrompt =\n typeof payload.append_system_prompt === 'string' ? payload.append_system_prompt : undefined\n const reasoningEffort =\n payload.reasoning_effort === 'low' ||\n payload.reasoning_effort === 'medium' ||\n payload.reasoning_effort === 'high'\n ? payload.reasoning_effort\n : undefined\n const timeoutMs =\n typeof payload.timeout_ms === 'number' && payload.timeout_ms > 0\n ? payload.timeout_ms\n : defaultTimeoutMs\n\n if (!prompt || !model) {\n return {\n ok: false,\n result: { message: 'Missing prompt or model for gateway model run' },\n error: 'Missing prompt or model',\n }\n }\n\n if (!jsonSchema) {\n return {\n ok: false,\n result: { message: 'Missing json_schema for gateway model run' },\n error: 'Missing json_schema',\n }\n }\n\n const providerFromPayload = typeof payload.provider === 'string' ? payload.provider : null\n const providerId =\n providerFromPayload === 'claude_code' ||\n providerFromPayload === 'codex' ||\n providerFromPayload === 'gemini'\n ? (providerFromPayload as GatewayProviderId)\n : inferGatewayProviderFromModel(model)\n\n return {\n ok: true,\n value: {\n prompt,\n model,\n jsonSchema,\n appendSystemPrompt,\n reasoningEffort,\n timeoutMs,\n providerId,\n },\n }\n}\n\nexport async function handleGatewayModelRunJob(params: {\n job: GatewayJobRow\n defaultTimeoutMs: number\n processKillGraceMs: number\n activeModelRuns: Map<string, ActiveModelRun>\n runCommand: GatewayModelRunCommandRunner\n updateJobDebug: (jobId: string, debug: Record<string, unknown>) => Promise<void>\n updateProviderHealth: (\n providerId: GatewayProviderId,\n status: GatewayHealthStatus,\n errorMessage?: string | null\n ) => Promise<void>\n requestChildTermination: (\n child: ChildProcess | undefined,\n options: { reason: string; graceMs: number; context: string }\n ) => void\n workRoot?: string\n}): Promise<GatewayModelRunResult> {\n const {\n job,\n defaultTimeoutMs,\n processKillGraceMs,\n activeModelRuns,\n runCommand,\n updateJobDebug,\n updateProviderHealth,\n requestChildTermination,\n workRoot = resolveModelWorkdirRoot(),\n } = params\n const parsedPayload = parseGatewayModelRunPayload(job.payload ?? {}, defaultTimeoutMs)\n if (!parsedPayload.ok) return parsedPayload\n\n const {\n prompt,\n model,\n jsonSchema,\n appendSystemPrompt,\n reasoningEffort,\n timeoutMs,\n providerId,\n } = parsedPayload.value\n const provider = getGatewayCliProvider(providerId)\n let normalizedPrompt = prompt\n let normalizedSchema = jsonSchema\n if (provider.normalizeSchema) {\n const normalized = provider.normalizeSchema(jsonSchema)\n normalizedSchema = normalized.schema\n if (normalized.promptSuffix) {\n normalizedPrompt = `${normalizedPrompt}\\n\\n${normalized.promptSuffix}`\n }\n }\n\n const runPlan = provider.buildModelRunPlan({\n model,\n prompt: normalizedPrompt,\n jsonSchema: normalizedSchema,\n appendSystemPrompt,\n reasoningEffort,\n timeoutMs,\n })\n\n let workDir = ''\n const activeModelRun: ActiveModelRun = {\n shutdownRequested: false,\n }\n activeModelRuns.set(job.id, activeModelRun)\n\n try {\n workDir = await createWorkDir(workRoot, [{ value: job.id, label: 'job id' }])\n assertSafeOutputPath(workDir, runPlan.outputPath)\n await writeRunPlanFiles(workDir, runPlan.files)\n\n const resolvedEnv = resolveRunPlanEnv(runPlan.env, workDir)\n\n const commandDescriptor = buildSafeGatewayCommandDescriptor(runPlan.command, runPlan.args, {\n redactLastArg: true,\n })\n const debugInfo: Record<string, unknown> = {\n provider_id: providerId,\n command: commandDescriptor.command,\n args: commandDescriptor.args,\n command_line: commandDescriptor.commandLine,\n work_dir: workDir,\n prompt_chars: prompt.length,\n json_schema_chars: JSON.stringify(normalizedSchema).length,\n reasoning_effort: reasoningEffort ?? null,\n timeout_ms: timeoutMs,\n output_mode: runPlan.outputMode,\n output_path: runPlan.outputPath ?? null,\n }\n\n if (runPlan.files && runPlan.files.length > 0) {\n debugInfo.files = runPlan.files.map((file) => file.path)\n }\n\n await updateJobDebug(job.id, debugInfo)\n\n const runResult = await runCommand(runPlan.command, runPlan.args, {\n timeoutMs: runPlan.timeoutMs ?? defaultTimeoutMs,\n cwd: workDir,\n env: resolvedEnv,\n onStart: (child) => {\n activeModelRun.child = child\n if (activeModelRun.shutdownRequested) {\n requestChildTermination(child, {\n reason: activeModelRun.shutdownReason ?? 'Gateway shutting down',\n graceMs: processKillGraceMs,\n context: 'model_run_shutdown',\n })\n }\n },\n })\n\n const stdoutInfo = truncateLog(runResult.stdout)\n const stderrInfo = truncateLog(runResult.stderr)\n const errorSummary = extractGatewayErrorSummary(stderrInfo.value)\n debugInfo.stdout = stdoutInfo.value\n debugInfo.stdout_truncated = stdoutInfo.truncated\n debugInfo.stdout_bytes = stdoutInfo.originalBytes\n debugInfo.stderr = stderrInfo.value\n debugInfo.stderr_truncated = stderrInfo.truncated\n debugInfo.stderr_bytes = stderrInfo.originalBytes\n debugInfo.exit_code = runResult.exitCode\n debugInfo.duration_ms = runResult.durationMs\n debugInfo.timed_out = runResult.timedOut\n if (errorSummary) {\n debugInfo.error_summary = errorSummary\n }\n\n await updateJobDebug(job.id, debugInfo)\n\n if (!runResult.ok) {\n const summary = normalizeProviderErrorSummary(\n errorSummary?.message ?? runResult.error ?? 'Gateway model run failed'\n )\n await updateProviderHealth(providerId, 'unhealthy', summary ?? 'Gateway model run failed')\n const failureMessage = buildProviderFailureMessage(providerId, summary)\n return {\n ok: false,\n result: {\n message: failureMessage,\n exit_code: runResult.exitCode,\n stderr: stderrInfo.value,\n stdout: stdoutInfo.value,\n command: commandDescriptor.commandLine,\n error_summary: errorSummary ?? null,\n },\n error: failureMessage,\n }\n }\n\n let normalized\n try {\n normalized = provider.normalizeModelRunResult({\n stdout: runResult.stdout,\n outputFormat: runPlan.outputFormat,\n outputMode: runPlan.outputMode,\n outputPath: runPlan.outputPath,\n workDir,\n })\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to normalize gateway output'\n const summary = normalizeProviderErrorSummary(message)\n await updateProviderHealth(providerId, 'unhealthy', summary ?? message)\n const failureMessage = buildProviderFailureMessage(providerId, summary ?? message)\n return {\n ok: false,\n result: {\n message: failureMessage,\n stdout: stdoutInfo.value,\n stderr: stderrInfo.value,\n command: commandDescriptor.commandLine,\n },\n error: failureMessage,\n }\n }\n\n await updateProviderHealth(providerId, 'healthy')\n return {\n ok: true,\n result: {\n output: normalized.output,\n raw: normalized.raw,\n usage: normalized.usage,\n model: normalized.model,\n duration_ms: runResult.durationMs,\n exit_code: runResult.exitCode,\n stdout_truncated: runResult.stdoutTruncated,\n stderr_truncated: runResult.stderrTruncated,\n command: commandDescriptor.commandLine,\n },\n }\n } finally {\n activeModelRuns.delete(job.id)\n if (workDir) {\n await cleanupWorkDir(workDir, workRoot)\n }\n }\n}\n", "import type { ChildProcess } from 'node:child_process'\nimport fsSync from 'node:fs'\nimport process from 'node:process'\nimport type {\n GatewayCommandResult,\n GatewayCommandRunOptions,\n} from './gateway-command-runner.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport type { GatewayJobRow } from './gateway-jobs.js'\nimport { loadValidatedRemoteShellResource } from './remote-shell-resource.js'\nimport type { GatewayJobStoreClient } from './gateway-job-store.js'\n\nexport type ActiveShellExecRun = {\n child?: ChildProcess\n shutdownRequested: boolean\n shutdownReason?: string\n}\n\nexport type GatewayShellExecResult = {\n ok: boolean\n result: Record<string, unknown>\n error?: string\n}\n\nexport type GatewayShellExecCommandRunner = (\n command: string,\n args: string[],\n options: GatewayCommandRunOptions\n) => Promise<GatewayCommandResult>\n\nexport function coercePositiveInteger(\n value: unknown,\n fallback: number,\n options?: { min?: number; max?: number }\n): number {\n const min = options?.min ?? 1\n const max = options?.max ?? Number.MAX_SAFE_INTEGER\n const parsed =\n typeof value === 'number' ? value : typeof value === 'string' ? Number.parseInt(value, 10) : NaN\n if (!Number.isFinite(parsed)) return fallback\n return Math.max(min, Math.min(max, Math.trunc(parsed)))\n}\n\nexport function resolveRemoteShellExecShellCommand(\n options: {\n existsSync?: (path: string) => boolean\n shellEnv?: string | undefined\n } = {}\n): string {\n const existsSync = options.existsSync ?? fsSync.existsSync\n if (existsSync('/bin/bash')) {\n return '/bin/bash'\n }\n if (existsSync('/bin/sh')) {\n return '/bin/sh'\n }\n const shellEnv = options.shellEnv ?? process.env.SHELL\n if (typeof shellEnv === 'string' && shellEnv.trim().length > 0) {\n return shellEnv.trim()\n }\n return '/bin/bash'\n}\n\nexport async function handleGatewayShellExecJob(params: {\n supabase: GatewayJobStoreClient\n config: GatewayConfig\n job: GatewayJobRow\n defaultTimeoutMs: number\n activeShellExecRuns: Map<string, ActiveShellExecRun>\n runCommand: GatewayShellExecCommandRunner\n isJobCancelled: (jobId: string) => Promise<boolean>\n validateMachineControlState: () => Promise<{ ok: boolean; message?: string }>\n processKillGraceMs: number\n requestChildTermination: (\n child: ChildProcess | undefined,\n options: { reason: string; graceMs: number; context: string }\n ) => void\n logError?: (message: string, data?: Record<string, unknown>) => void\n resolveShellCommand?: () => string\n}): Promise<GatewayShellExecResult> {\n const {\n supabase,\n config,\n job,\n defaultTimeoutMs,\n activeShellExecRuns,\n runCommand,\n isJobCancelled,\n validateMachineControlState,\n processKillGraceMs,\n requestChildTermination,\n logError,\n resolveShellCommand = resolveRemoteShellExecShellCommand,\n } = params\n\n if (await isJobCancelled(job.id)) {\n const message = 'Gateway remote shell exec job was cancelled before execution'\n return {\n ok: false,\n result: { message, cancelled: true },\n error: message,\n }\n }\n\n const controlValidation = await validateMachineControlState()\n if (!controlValidation.ok) {\n const message = controlValidation.message ?? 'Gateway machine control unavailable'\n return {\n ok: false,\n result: { message },\n error: message,\n }\n }\n\n const payload = job.payload ?? {}\n const resourceId =\n typeof payload.resource_id === 'string' && payload.resource_id.trim().length > 0\n ? payload.resource_id.trim()\n : null\n\n if (!resourceId) {\n return {\n ok: false,\n result: { message: 'Missing resource_id in payload' },\n error: 'Missing resource_id in payload',\n }\n }\n\n const resourceValidation = await loadValidatedRemoteShellResource(\n supabase,\n config,\n resourceId,\n 'write',\n logError\n )\n if (!resourceValidation.ok) {\n return {\n ok: false,\n result: { message: resourceValidation.message, resource_id: resourceId },\n error: resourceValidation.message,\n }\n }\n\n const command =\n typeof payload.command === 'string' && payload.command.trim().length > 0\n ? payload.command\n : null\n if (!command) {\n return {\n ok: false,\n result: { message: 'Missing command in payload', resource_id: resourceId },\n error: 'Missing command in payload',\n }\n }\n\n const timeoutMs = coercePositiveInteger(payload.timeout_ms, defaultTimeoutMs, {\n min: 1,\n max: 10 * 60_000,\n })\n const shell = resolveShellCommand()\n const activeExecRun: ActiveShellExecRun = {\n shutdownRequested: false,\n }\n activeShellExecRuns.set(job.id, activeExecRun)\n\n try {\n const execResult = await runCommand(shell, ['-lc', command], {\n cwd: '/',\n timeoutMs,\n onStart: (child) => {\n activeExecRun.child = child\n if (activeExecRun.shutdownRequested) {\n requestChildTermination(child, {\n reason: activeExecRun.shutdownReason ?? 'Gateway shutting down',\n graceMs: processKillGraceMs,\n context: 'shell_exec_shutdown',\n })\n }\n },\n })\n const message = execResult.ok\n ? 'Remote shell command completed'\n : execResult.timedOut\n ? 'Remote shell command timed out'\n : execResult.error\n ? 'Remote shell command failed to start'\n : 'Remote shell command completed with a non-zero exit status'\n\n return {\n ok: true,\n result: {\n message,\n resource_id: resourceId,\n command,\n shell,\n cwd: '/',\n stdout: execResult.stdout,\n stderr: execResult.stderr,\n exit_code: execResult.exitCode,\n duration_ms: execResult.durationMs,\n timed_out: execResult.timedOut,\n success: execResult.ok,\n stdout_truncated: execResult.stdoutTruncated,\n stderr_truncated: execResult.stderrTruncated,\n output_truncated: execResult.stdoutTruncated || execResult.stderrTruncated,\n error: execResult.error ?? null,\n },\n }\n } finally {\n activeShellExecRuns.delete(job.id)\n }\n}\n", "import type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from './database.types.js'\nimport type { GatewayConfig } from './gateway-state.js'\n\nexport interface RemoteShellResourceRow {\n id: string\n team_id: string\n resource_type: string\n max_access_level: string | null\n metadata: unknown\n}\n\nexport interface RemoteShellResourceValidationOptions {\n teamId: string\n gatewayId: string\n gatewayVmId?: string | null\n requiredAccess: 'read' | 'write'\n}\n\nexport type RemoteShellResourceLogger = (\n message: string,\n data?: Record<string, unknown>\n) => void\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction normalizeOptionalString(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nexport function validateRemoteShellResourceRow(\n resource: RemoteShellResourceRow | null,\n options: RemoteShellResourceValidationOptions\n): { ok: true } | { ok: false; message: string } {\n if (!resource) {\n return { ok: false, message: 'Remote shell resource not found' }\n }\n\n if (resource.team_id !== options.teamId) {\n return { ok: false, message: 'Remote shell resource belongs to another team' }\n }\n\n if (resource.resource_type !== 'remote_shell') {\n return {\n ok: false,\n message: `Resource is not a remote shell target (found ${resource.resource_type})`,\n }\n }\n\n if (options.requiredAccess === 'write' && resource.max_access_level === 'viewer') {\n return {\n ok: false,\n message:\n 'Remote shell resource is configured for viewer access. Full access is required for this action.',\n }\n }\n\n const metadata = isPlainObject(resource.metadata) ? resource.metadata : {}\n const vmId = normalizeOptionalString(metadata.vm_id)\n if (vmId) {\n if (!options.gatewayVmId || options.gatewayVmId !== vmId) {\n return {\n ok: false,\n message: 'Remote shell resource targets a different VM-backed gateway',\n }\n }\n } else {\n const gatewayId = normalizeOptionalString(metadata.gateway_id)\n if (!gatewayId) {\n return {\n ok: false,\n message: 'Remote shell resource is missing metadata.gateway_id or metadata.vm_id',\n }\n }\n\n if (gatewayId !== options.gatewayId) {\n return {\n ok: false,\n message: 'Remote shell resource targets a different gateway',\n }\n }\n }\n\n if (metadata.full_control !== true) {\n return {\n ok: false,\n message: 'Remote shell resource machine control is disabled',\n }\n }\n\n return { ok: true }\n}\n\nexport async function loadValidatedRemoteShellResource(\n supabase: SupabaseClient<Database>,\n config: GatewayConfig,\n resourceId: string,\n requiredAccess: 'read' | 'write',\n logError: RemoteShellResourceLogger = () => {}\n): Promise<{ ok: true } | { ok: false; message: string }> {\n const [{ data: resourceData, error: resourceError }, { data: gatewayData, error: gatewayError }] =\n await Promise.all([\n supabase\n .from('team_resources')\n .select('id, team_id, resource_type, max_access_level, metadata')\n .eq('id', resourceId)\n .eq('team_id', config.teamId)\n .maybeSingle(),\n supabase\n .from('team_gateways')\n .select('vm_id')\n .eq('id', config.gatewayId)\n .eq('team_id', config.teamId)\n .maybeSingle(),\n ])\n\n if (resourceError) {\n logError('Failed to load remote shell resource for gateway validation', {\n resourceId,\n gatewayId: config.gatewayId,\n teamId: config.teamId,\n error: resourceError.message,\n })\n return { ok: false, message: 'Failed to load remote shell resource' }\n }\n\n if (gatewayError) {\n logError('Failed to load gateway identity for remote shell resource validation', {\n resourceId,\n gatewayId: config.gatewayId,\n teamId: config.teamId,\n error: gatewayError.message,\n })\n return { ok: false, message: 'Failed to load gateway identity for remote shell resource' }\n }\n\n if (!gatewayData) {\n return { ok: false, message: 'Gateway identity is missing' }\n }\n\n return validateRemoteShellResourceRow(\n (resourceData as RemoteShellResourceRow | null) ?? null,\n {\n teamId: config.teamId,\n gatewayId: config.gatewayId,\n gatewayVmId: typeof gatewayData.vm_id === 'string' ? gatewayData.vm_id : null,\n requiredAccess,\n }\n )\n}\n", "export const PROVIDER_HOSTED_COMMON_CONFIG_KEYS = [\n 'model',\n 'output_format',\n 'system_prompt',\n 'append_system_prompt',\n 'json_schema',\n 'max_budget_usd',\n 'timeout_ms',\n 'max_poll_attempts',\n];\nexport const PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS = ['provider_options'];\nexport const PROVIDER_HOSTED_NORMALIZED_SEMANTICS = {\n statuses: {\n running: 'running',\n completed: 'completed',\n failed: 'failed',\n cancelled: 'cancelled',\n },\n events: {\n started: 'run_started',\n progress: 'run_progress',\n completed: 'run_completed',\n failed: 'run_failed',\n cancelled: 'run_cancelled',\n },\n output: {\n envelope: 'SubagentOutputEnvelope',\n overflow: 'overflow_artifact',\n },\n cost: 'Resolve and persist provider usage/cost before billing. Production-enabled provider-hosted lanes require provider-reported total cost. Provider/model pricing tables are implementation guardrails for disabled or experimental lanes, and unavailable cost charges the configured emergency fallback instead of dropping usage to zero.',\n error: 'Map provider terminal errors into failed/cancelled subagent status plus a durable error output envelope.',\n};\nconst ASYNC_POLL_TERMINAL_STATUSES = ['COMPLETED', 'FAILED', 'CANCELLED'];\nconst ASYNC_POLL_IN_PROGRESS_STATUSES = ['CREATED', 'IN_PROGRESS', 'QUEUED', 'RUNNING'];\nconst PERPLEXITY_ASYNC_TERMINAL_STATUSES = ['COMPLETED', 'FAILED'];\nconst PERPLEXITY_ASYNC_IN_PROGRESS_STATUSES = ['CREATED', 'IN_PROGRESS'];\nconst GOOGLE_INTERACTIONS_TERMINAL_STATUSES = ['COMPLETED', 'FAILED', 'CANCELLED'];\nconst GOOGLE_INTERACTIONS_IN_PROGRESS_STATUSES = ['IN_PROGRESS', 'QUEUED', 'CREATED'];\nconst ANTHROPIC_MANAGED_AGENTS_TERMINAL_STATUSES = ['IDLE', 'TERMINATED'];\nconst ANTHROPIC_MANAGED_AGENTS_IN_PROGRESS_STATUSES = ['RUNNING', 'RESCHEDULING'];\nexport const OPENAI_PROVIDER_HOSTED_CAPABILITIES = {\n lifecycle: {\n mode: 'async_stream_poll',\n create: { support: 'supported', notes: 'Creates a background Responses request.' },\n stream: {\n support: 'supported',\n notes: 'Streams Responses events for progress, hosted tool activity, text deltas, and terminal completion, with polling as a fallback.',\n },\n poll: {\n support: 'supported',\n notes: 'Polls the Responses request by provider response ID as a recovery/fallback path when streaming is unavailable or interrupted.',\n },\n cancel: {\n support: 'supported',\n notes: 'Cancels background Responses requests through the provider cancellation endpoint.',\n },\n terminalStatuses: [...ASYNC_POLL_TERMINAL_STATUSES, 'INCOMPLETE'],\n inProgressStatuses: [...ASYNC_POLL_IN_PROGRESS_STATUSES],\n },\n hostedTools: {\n support: 'supported',\n configurable: true,\n knownTools: [\n 'web_search',\n 'web_search_2025_08_26',\n 'web_search_preview',\n 'file_search',\n 'code_interpreter',\n 'mcp',\n ],\n notes: 'The adapter defaults to hosted web search plus code interpreter, and validates/forwards explicit hosted Responses tools. Function, shell/apply-patch, image generation, and computer-use tools are intentionally not enabled in this subagent lane.',\n },\n continuation: {\n support: 'supported',\n notes: 'Panorama re-prompts automatically continue the provider thread by wiring the saved response anchor into previous_response_id for the next run.',\n },\n structuredOutput: {\n support: 'supported',\n modes: ['json_schema', 'json_object', 'text'],\n notes: 'JSON output uses Responses text.format json_schema when a schema is configured, otherwise json_object.',\n },\n usage: {\n support: 'supported',\n usageTokens: 'supported',\n costUsd: 'unsupported',\n notes: 'Token usage is preserved when returned. OpenAI Responses does not return an authoritative per-response total cost, so this provider-hosted lane is disabled until reliable provider-reported run cost is available.',\n },\n citations: {\n support: 'supported',\n sourcesField: 'sources',\n notes: 'Sources are extracted from Responses output annotations when present.',\n },\n providerTrace: {\n support: 'supported',\n metadataFields: [\n 'external_request_id',\n 'provider_request_id',\n 'provider_previous_request_id',\n 'provider_continuation_request_id',\n 'openai_response_id',\n 'openai_previous_response_id',\n 'openai_status',\n 'openai_model',\n 'openai_tools',\n 'openai_tool_calls',\n 'openai_stream_fallback_reason',\n ],\n },\n};\nexport const PERPLEXITY_PROVIDER_HOSTED_CAPABILITIES = {\n lifecycle: {\n mode: 'async_poll',\n create: { support: 'supported', notes: 'Creates an async Sonar request.' },\n poll: { support: 'supported', notes: 'Polls the async Sonar request by Perplexity ID.' },\n cancel: {\n support: 'unsupported',\n notes: 'The documented async Sonar API exposes create, list, and get endpoints but no provider-side cancel endpoint; Panorama cancellation is local best-effort and stops polling on the next worker check.',\n },\n terminalStatuses: [...PERPLEXITY_ASYNC_TERMINAL_STATUSES],\n inProgressStatuses: [...PERPLEXITY_ASYNC_IN_PROGRESS_STATUSES],\n },\n hostedTools: {\n support: 'unsupported',\n configurable: false,\n knownTools: ['web_search'],\n notes: 'Search behavior is provider-managed through model/search options rather than Panorama-hosted tool selection.',\n },\n continuation: {\n support: 'unsupported',\n notes: 'The current provider API path has no continuation anchor; create a new subagent for another Perplexity async request.',\n },\n structuredOutput: {\n support: 'supported',\n modes: ['provider_default', 'text'],\n notes: 'JSON behavior is prompt-guided by Panorama system prompt/schema text. Provider reasoning markup is stripped before output persistence.',\n },\n usage: {\n support: 'supported',\n usageTokens: 'supported',\n costUsd: 'supported',\n notes: 'Provider usage is preserved when returned; total cost is extracted from response.usage.cost.total_cost when present.',\n },\n citations: {\n support: 'supported',\n sourcesField: 'citations',\n },\n providerTrace: {\n support: 'supported',\n metadataFields: [\n 'external_request_id',\n 'perplexity_request_id',\n 'perplexity_status',\n 'perplexity_reasoning_content_removed',\n 'perplexity_reasoning_content_truncated',\n 'citations',\n ],\n },\n};\nexport const GOOGLE_PROVIDER_HOSTED_CAPABILITIES = {\n lifecycle: {\n mode: 'async_stream_poll',\n create: {\n support: 'supported',\n notes: 'Creates a background Gemini Deep Research Interaction.',\n },\n stream: {\n support: 'supported',\n notes: 'Streams Gemini Interactions events for progress, thought summaries, tool activity, text deltas, and rich-media output metadata, with polling as a fallback.',\n },\n poll: {\n support: 'supported',\n notes: 'Polls the Interaction by provider interaction ID as the durable fallback/recovery path.',\n },\n cancel: {\n support: 'supported',\n notes: 'Cancels running background Interactions through the provider cancellation endpoint.',\n },\n terminalStatuses: [...GOOGLE_INTERACTIONS_TERMINAL_STATUSES],\n inProgressStatuses: [...GOOGLE_INTERACTIONS_IN_PROGRESS_STATUSES],\n },\n hostedTools: {\n support: 'supported',\n configurable: true,\n knownTools: ['google_search', 'url_context', 'code_execution', 'file_search', 'mcp_server'],\n notes: 'Deep Research includes Google Search, URL context, and code execution defaults. Rich media generation is off by default and can be requested explicitly through visualization/response_modalities. The adapter exposes explicit tool selection/restriction plus provider-side File Search and remote MCP server configuration; local Panorama tools and Google Computer Use are intentionally not enabled.',\n },\n continuation: {\n support: 'supported',\n notes: 'Panorama follow-up prompts continue from the saved completed Interaction via previous_interaction_id.',\n },\n structuredOutput: {\n support: 'unsupported',\n modes: ['text', 'provider_default'],\n notes: 'Gemini Deep Research currently does not support provider-enforced structured outputs. JSON output is prompt-guided only.',\n },\n usage: {\n support: 'supported',\n usageTokens: 'supported',\n costUsd: 'unsupported',\n notes: 'Interaction token usage is preserved when returned. Gemini Interactions does not return an authoritative per-interaction total cost, so this provider-hosted lane is disabled until reliable provider-reported run cost is available.',\n },\n citations: {\n support: 'supported',\n sourcesField: 'annotations',\n notes: 'Sources are extracted from Interaction output annotations and citation-like source fields when present.',\n },\n providerTrace: {\n support: 'supported',\n metadataFields: [\n 'external_request_id',\n 'provider_request_id',\n 'provider_previous_request_id',\n 'provider_continuation_request_id',\n 'google_interaction_id',\n 'google_previous_interaction_id',\n 'google_status',\n 'google_agent',\n 'google_model',\n 'google_tools',\n 'google_agent_config',\n 'google_output_types',\n 'google_rich_outputs',\n 'google_last_event_id',\n 'google_streamed',\n 'google_stream_fallback_reason',\n 'google_citations',\n ],\n },\n};\nexport const ANTHROPIC_PROVIDER_HOSTED_CAPABILITIES = {\n lifecycle: {\n mode: 'async_stream_poll',\n create: {\n support: 'supported',\n notes: 'Creates or resumes a Claude Managed Agents session and sends work through session events.',\n },\n stream: {\n support: 'supported',\n notes: 'Streams Managed Agents session events for progress, hosted tool activity, text deltas, and terminal completion, with session polling as a recovery path.',\n },\n poll: {\n support: 'supported',\n notes: 'Retrieves the Managed Agents session and persisted session events by session ID as a recovery path.',\n },\n cancel: {\n support: 'supported',\n notes: 'Interrupts active Managed Agents sessions with a provider-side user.interrupt event.',\n },\n terminalStatuses: [...ANTHROPIC_MANAGED_AGENTS_TERMINAL_STATUSES],\n inProgressStatuses: [...ANTHROPIC_MANAGED_AGENTS_IN_PROGRESS_STATUSES],\n },\n hostedTools: {\n support: 'supported',\n configurable: true,\n knownTools: [\n 'web_search',\n 'web_fetch',\n 'bash',\n 'read',\n 'write',\n 'edit',\n 'glob',\n 'grep',\n 'mcp_server',\n 'skills',\n ],\n notes: 'Claude Managed Agents run in Anthropic-managed cloud containers. The adapter defaults to the provider full built-in toolset with provider-side execution auto-approved: web search/fetch plus remote bash and file tools. It exposes explicit narrowing plus MCP servers, skills, packages, vaults, and environment networking through configuration.',\n },\n continuation: {\n support: 'supported',\n notes: 'A Panorama subagent maps to one Anthropic session; follow-up prompts send new user.message events to the saved session ID.',\n },\n structuredOutput: {\n support: 'supported',\n modes: ['provider_default', 'text'],\n notes: 'Managed Agents output is normalized from agent.message events. JSON output remains prompt-guided in this adapter.',\n },\n usage: {\n support: 'supported',\n usageTokens: 'supported',\n costUsd: 'planned',\n notes: 'Session usage exposes cumulative token statistics when available; exact synchronous Managed Agents cost collection still needs provider support. If exact cost is unavailable after a run, billing uses the marked external-provider emergency fallback rather than zero cost.',\n },\n citations: {\n support: 'supported',\n sourcesField: 'session_events',\n notes: 'Sources are extracted opportunistically from session event content, hosted web tool results, and citation-like URL fields when present.',\n },\n providerTrace: {\n support: 'supported',\n metadataFields: [\n 'external_request_id',\n 'provider_request_id',\n 'provider_previous_request_id',\n 'provider_continuation_request_id',\n 'anthropic_session_id',\n 'anthropic_agent_id',\n 'anthropic_environment_id',\n 'anthropic_user_event_id',\n 'anthropic_status',\n 'anthropic_model',\n 'anthropic_tools',\n 'anthropic_output_types',\n 'anthropic_cumulative_usage',\n 'anthropic_stream_fallback_reason',\n ],\n },\n};\nexport const PROVIDER_HOSTED_CAPABILITY_DOCUMENTS = {\n openai: {\n provider: 'openai',\n implementationTicket: 'PAN-412',\n implementationStatus: 'partial',\n capabilityDiscovery: 'complete',\n summary: 'OpenAI provider-hosted subagent infrastructure uses the Responses API with background mode, SSE progress streaming, hosted tool configuration, provider-side continuation, provider cancellation, and normalized run tracking, but the lane is not production-enabled because Responses does not return authoritative per-run total cost.',\n notes: [\n 'The canonical subagent type is openai_provider_hosted.',\n 'This lane is disabled in production surfaces until OpenAI provides reliable provider-reported total cost for the completed run or an equivalent per-run cost reconciliation mechanism.',\n 'OpenAI deep research behavior is a provider-side model/tool configuration, not a separate Panorama subagent architecture.',\n 'Hosted tools that require a separate execution loop or unsafe local action surface are not passed through by this adapter.',\n ],\n },\n perplexity: {\n provider: 'perplexity',\n implementationTicket: 'PAN-744',\n implementationStatus: 'implemented',\n capabilityDiscovery: 'complete',\n summary: 'Perplexity provider-hosted subagents use the async Sonar API with provider-managed research/search behavior, normalized run tracking, citations, usage, and local best-effort cancellation.',\n notes: [\n 'The canonical subagent type is perplexity_provider_hosted.',\n 'This is a premium external managed-agent lane; broad search-heavy Sonar research can cost materially more than internal delegation and may be roughly dollar-scale.',\n 'The async Sonar path does not expose a provider-side continuation anchor; create a new subagent for another Perplexity provider run.',\n 'The documented async Sonar API does not expose provider-side cancellation; Panorama cancellation is local best-effort.',\n 'Provider reasoning markup is stripped before output persistence; runs fail safely if no final answer remains after stripping.',\n ],\n },\n google: {\n provider: 'google',\n implementationTicket: 'PAN-413',\n implementationStatus: 'partial',\n capabilityDiscovery: 'complete',\n summary: 'Google provider-hosted subagent infrastructure uses the Gemini Interactions API with the Deep Research managed agent, background execution, streaming plus polling fallback, provider cancellation, continuation via previous_interaction_id, configurable provider-hosted tools, and normalized run tracking, but the lane is not production-enabled because Interactions does not return authoritative per-run total cost.',\n notes: [\n 'The canonical subagent type is google_provider_hosted.',\n 'This lane is disabled in production surfaces until Google provides reliable provider-reported total cost for the completed Interaction or an equivalent per-run cost reconciliation mechanism.',\n 'Google Search, URL context, and code execution are provider-managed defaults for Deep Research when no explicit tools array is sent.',\n 'Rich media generation is off by default; use visualization/response_modalities explicitly when chart, image, audio, video, or document outputs are wanted.',\n 'Explicit hosted_tools/tool_choice config can restrict provider tools, including custom-data-only file search or no-tool modes.',\n 'Provider-side File Search and remote MCP servers are configuration-gated; local Panorama tooling and Google Computer Use are intentionally not enabled in this lane.',\n 'Gemini Deep Research currently does not expose provider-enforced structured output; JSON remains prompt-guided.',\n ],\n },\n};\n", "import { SUBAGENT_SAFE_TOOL_ALLOWLIST, } from './contract.js';\nimport { ANTHROPIC_PROVIDER_HOSTED_CAPABILITIES, GOOGLE_PROVIDER_HOSTED_CAPABILITIES, OPENAI_PROVIDER_HOSTED_CAPABILITIES, PERPLEXITY_PROVIDER_HOSTED_CAPABILITIES, PROVIDER_HOSTED_CAPABILITY_DOCUMENTS, PROVIDER_HOSTED_COMMON_CONFIG_KEYS, PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS, PROVIDER_HOSTED_NORMALIZED_SEMANTICS, } from './provider-hosted.js';\nconst CLAUDE_CODE_ALLOWED_KEYS = [\n 'allowed_tools',\n 'disallowed_tools',\n 'full_control',\n 'model',\n 'output_format',\n 'system_prompt',\n 'append_system_prompt',\n 'json_schema',\n 'permission_mode',\n 'max_budget_usd',\n 'input_format',\n 'betas',\n 'no_session_persistence',\n 'session_id',\n 'resume_session_id',\n 'timeout_ms',\n 'include_partial_messages',\n];\nconst CLAUDE_CODE_ALIASES = {\n allowedTools: 'allowed_tools',\n disallowedTools: 'disallowed_tools',\n fullControl: 'full_control',\n outputFormat: 'output_format',\n systemPrompt: 'system_prompt',\n appendSystemPrompt: 'append_system_prompt',\n jsonSchema: 'json_schema',\n permissionMode: 'permission_mode',\n maxBudgetUsd: 'max_budget_usd',\n inputFormat: 'input_format',\n noSessionPersistence: 'no_session_persistence',\n sessionId: 'session_id',\n resumeSessionId: 'resume_session_id',\n timeoutMs: 'timeout_ms',\n includePartialMessages: 'include_partial_messages',\n tools: 'allowed_tools',\n};\nconst CLAUDE_CODE_DEFAULTS = {\n output_format: 'json',\n full_control: false,\n include_partial_messages: false,\n allowed_tools: ['WebSearch'],\n permission_mode: 'dontAsk',\n append_system_prompt: 'You cannot write or interact with files in this environment. ' +\n 'Include a brief \"Approach Summary\" describing the key steps, tools, or sources you used (do not reveal chain-of-thought). ' +\n 'If you output JSON, include a \"summary\" field and a \"sources\" array when applicable.',\n};\nconst CODEX_ALLOWED_KEYS = [...CLAUDE_CODE_ALLOWED_KEYS, 'reasoning_effort'];\nconst CODEX_ALIASES = {\n ...CLAUDE_CODE_ALIASES,\n reasoningEffort: 'reasoning_effort',\n};\nconst CODEX_DEFAULTS = {\n output_format: 'json',\n full_control: false,\n allowed_tools: ['WebSearch'],\n reasoning_effort: 'high',\n append_system_prompt: 'You cannot write or interact with files in this environment. ' +\n 'Include a brief \"Approach Summary\" describing the key steps, tools, or sources you used (do not reveal chain-of-thought). ' +\n 'If you output JSON, include a \"summary\" field and a \"sources\" array when applicable.',\n};\nconst GEMINI_ALLOWED_KEYS = [...CLAUDE_CODE_ALLOWED_KEYS, 'extensions'];\nconst GEMINI_ALIASES = {\n ...CLAUDE_CODE_ALIASES,\n extensions: 'extensions',\n};\nconst GEMINI_DEFAULTS = {\n output_format: 'json',\n full_control: false,\n allowed_tools: ['WebSearch'],\n append_system_prompt: 'You cannot write or interact with files in this environment. ' +\n 'Include a brief \"Approach Summary\" describing the key steps, tools, or sources you used (do not reveal chain-of-thought). ' +\n 'If you output JSON, include a \"summary\" field and a \"sources\" array when applicable.',\n};\nconst PERPLEXITY_ALLOWED_KEYS = [\n ...PROVIDER_HOSTED_COMMON_CONFIG_KEYS,\n 'reasoning_effort',\n 'search_mode',\n 'search_context_size',\n 'search_domain_filter',\n 'search_recency_filter',\n 'web_search_options',\n 'max_tokens',\n ...PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS,\n];\nconst PERPLEXITY_ALIASES = {\n outputFormat: 'output_format',\n systemPrompt: 'system_prompt',\n appendSystemPrompt: 'append_system_prompt',\n jsonSchema: 'json_schema',\n maxBudgetUsd: 'max_budget_usd',\n timeoutMs: 'timeout_ms',\n reasoningEffort: 'reasoning_effort',\n searchMode: 'search_mode',\n searchContextSize: 'search_context_size',\n searchDomainFilter: 'search_domain_filter',\n searchRecencyFilter: 'search_recency_filter',\n webSearchOptions: 'web_search_options',\n maxTokens: 'max_tokens',\n maxPollAttempts: 'max_poll_attempts',\n providerOptions: 'provider_options',\n};\nconst PERPLEXITY_DEFAULTS = {\n output_format: 'json',\n reasoning_effort: 'high',\n search_context_size: 'high',\n append_system_prompt: 'You cannot write or interact with files in this environment. ' +\n 'Return a self-contained text or JSON answer by default. Do not make the final answer depend on generated files, images, charts, or documents unless the user explicitly asks for artifacts. ' +\n 'Include a brief \"Approach Summary\" describing the key steps, tools, or sources you used (do not reveal chain-of-thought). ' +\n 'If you output JSON, include a \"summary\" field and a \"sources\" array when applicable.',\n};\nconst PERPLEXITY_PROVIDER_HOSTED_SPEC = {\n provider: 'perplexity',\n adapterId: 'perplexity',\n runtime: 'perplexity_async_sonar',\n contractVersion: 1,\n capabilities: PERPLEXITY_PROVIDER_HOSTED_CAPABILITIES,\n config: {\n commonKeys: [...PROVIDER_HOSTED_COMMON_CONFIG_KEYS],\n providerSpecificKeys: [\n 'reasoning_effort',\n 'search_mode',\n 'search_context_size',\n 'search_domain_filter',\n 'search_recency_filter',\n 'web_search_options',\n 'max_tokens',\n ],\n escapeHatchKeys: [...PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS],\n },\n normalizedSemantics: PROVIDER_HOSTED_NORMALIZED_SEMANTICS,\n};\nconst GOOGLE_ALLOWED_KEYS = [\n ...PROVIDER_HOSTED_COMMON_CONFIG_KEYS,\n 'agent',\n 'hosted_tools',\n 'tool_choice',\n 'file_search_store_names',\n 'file_search_top_k',\n 'mcp_servers',\n 'thinking_summaries',\n 'visualization',\n 'collaborative_planning',\n 'previous_interaction_id',\n 'response_modalities',\n 'service_tier',\n 'input_parts',\n ...PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS,\n];\nconst GOOGLE_ALIASES = {\n agent: 'agent',\n hostedTools: 'hosted_tools',\n toolChoice: 'tool_choice',\n outputFormat: 'output_format',\n systemPrompt: 'system_prompt',\n appendSystemPrompt: 'append_system_prompt',\n jsonSchema: 'json_schema',\n maxBudgetUsd: 'max_budget_usd',\n timeoutMs: 'timeout_ms',\n fileSearchStoreNames: 'file_search_store_names',\n fileSearchTopK: 'file_search_top_k',\n mcpServers: 'mcp_servers',\n thinkingSummaries: 'thinking_summaries',\n collaborativePlanning: 'collaborative_planning',\n previousInteractionId: 'previous_interaction_id',\n responseModalities: 'response_modalities',\n serviceTier: 'service_tier',\n inputParts: 'input_parts',\n maxPollAttempts: 'max_poll_attempts',\n providerOptions: 'provider_options',\n};\nconst GOOGLE_DEFAULTS = {\n output_format: 'text',\n thinking_summaries: 'auto',\n visualization: 'off',\n collaborative_planning: false,\n append_system_prompt: 'You cannot write or interact with local files or local computers in this environment. ' +\n 'Use only Google Deep Research provider-hosted research, code execution, file search, and remote MCP capabilities available to this managed run. ' +\n 'Return self-contained text or JSON output matching the requested output format by default. Do not generate or attach charts, images, audio, video, PDFs, documents, or other files unless the user explicitly asks for rich media or artifacts. ' +\n 'Include a brief \"Approach Summary\" describing the provider-managed sources or tools used (do not reveal chain-of-thought). ' +\n 'Include source URLs when available.',\n};\nconst GOOGLE_PROVIDER_HOSTED_SPEC = {\n provider: 'google',\n adapterId: 'google',\n runtime: 'google_interactions_deep_research',\n contractVersion: 1,\n capabilities: GOOGLE_PROVIDER_HOSTED_CAPABILITIES,\n config: {\n commonKeys: [...PROVIDER_HOSTED_COMMON_CONFIG_KEYS],\n providerSpecificKeys: [\n 'agent',\n 'hosted_tools',\n 'tool_choice',\n 'file_search_store_names',\n 'file_search_top_k',\n 'mcp_servers',\n 'thinking_summaries',\n 'visualization',\n 'collaborative_planning',\n 'previous_interaction_id',\n 'response_modalities',\n 'service_tier',\n 'input_parts',\n ],\n escapeHatchKeys: [...PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS],\n },\n normalizedSemantics: PROVIDER_HOSTED_NORMALIZED_SEMANTICS,\n};\nconst ANTHROPIC_ALLOWED_KEYS = [\n ...PROVIDER_HOSTED_COMMON_CONFIG_KEYS,\n 'agent_id',\n 'agent_name',\n 'environment_id',\n 'environment_name',\n 'session_id',\n 'title',\n 'enabled_tools',\n 'disabled_tools',\n 'agent_toolset',\n 'tool_configs',\n 'permission_policy',\n 'mcp_servers',\n 'skills',\n 'environment',\n 'networking',\n 'packages',\n 'vault_ids',\n 'anthropic_beta',\n 'metadata',\n ...PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS,\n];\nconst ANTHROPIC_ALIASES = {\n agentId: 'agent_id',\n agentName: 'agent_name',\n environmentId: 'environment_id',\n environmentName: 'environment_name',\n sessionId: 'session_id',\n outputFormat: 'output_format',\n systemPrompt: 'system_prompt',\n appendSystemPrompt: 'append_system_prompt',\n jsonSchema: 'json_schema',\n maxBudgetUsd: 'max_budget_usd',\n timeoutMs: 'timeout_ms',\n enabledTools: 'enabled_tools',\n disabledTools: 'disabled_tools',\n agentToolset: 'agent_toolset',\n toolConfigs: 'tool_configs',\n permissionPolicy: 'permission_policy',\n mcpServers: 'mcp_servers',\n vaultIds: 'vault_ids',\n anthropicBeta: 'anthropic_beta',\n maxPollAttempts: 'max_poll_attempts',\n providerOptions: 'provider_options',\n};\nconst ANTHROPIC_DEFAULTS = {\n output_format: 'text',\n append_system_prompt: 'You are running in Anthropic Claude Managed Agents, not in Panorama local infrastructure. ' +\n 'Use only provider-hosted tools and container state available in the Anthropic session. ' +\n 'Return self-contained text or JSON output matching the requested output format by default. You may use provider-hosted scratch files internally, but do not make the final answer depend on generated files, images, charts, or documents unless the user explicitly asks for artifacts. ' +\n 'Include a brief \"Approach Summary\" describing the provider-managed tools or sources used (do not reveal chain-of-thought). ' +\n 'Include source URLs when available.',\n};\nconst ANTHROPIC_PROVIDER_HOSTED_SPEC = {\n provider: 'anthropic',\n adapterId: 'anthropic',\n runtime: 'anthropic_managed_agents',\n contractVersion: 1,\n capabilities: ANTHROPIC_PROVIDER_HOSTED_CAPABILITIES,\n config: {\n commonKeys: [...PROVIDER_HOSTED_COMMON_CONFIG_KEYS],\n providerSpecificKeys: [\n 'agent_id',\n 'agent_name',\n 'environment_id',\n 'environment_name',\n 'session_id',\n 'title',\n 'enabled_tools',\n 'disabled_tools',\n 'agent_toolset',\n 'tool_configs',\n 'permission_policy',\n 'mcp_servers',\n 'skills',\n 'environment',\n 'networking',\n 'packages',\n 'vault_ids',\n 'anthropic_beta',\n 'metadata',\n ],\n escapeHatchKeys: [...PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS],\n },\n normalizedSemantics: PROVIDER_HOSTED_NORMALIZED_SEMANTICS,\n};\nconst OPENAI_ALLOWED_KEYS = [\n ...PROVIDER_HOSTED_COMMON_CONFIG_KEYS,\n 'reasoning_effort',\n 'max_output_tokens',\n 'hosted_tools',\n 'tool_choice',\n 'parallel_tool_calls',\n 'max_tool_calls',\n 'metadata',\n 'previous_response_id',\n 'store',\n 'include',\n ...PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS,\n];\nconst OPENAI_ALIASES = {\n hostedTools: 'hosted_tools',\n outputFormat: 'output_format',\n systemPrompt: 'system_prompt',\n appendSystemPrompt: 'append_system_prompt',\n jsonSchema: 'json_schema',\n maxBudgetUsd: 'max_budget_usd',\n timeoutMs: 'timeout_ms',\n reasoningEffort: 'reasoning_effort',\n maxOutputTokens: 'max_output_tokens',\n toolChoice: 'tool_choice',\n parallelToolCalls: 'parallel_tool_calls',\n maxToolCalls: 'max_tool_calls',\n previousResponseId: 'previous_response_id',\n maxPollAttempts: 'max_poll_attempts',\n providerOptions: 'provider_options',\n};\nconst OPENAI_DEFAULTS = {\n output_format: 'json',\n reasoning_effort: 'high',\n hosted_tools: [{ type: 'web_search' }, { type: 'code_interpreter' }],\n tool_choice: 'auto',\n append_system_prompt: 'You cannot write or interact with local Panorama files or local computers in this environment. ' +\n 'Use only provider-hosted OpenAI tools available to this managed run. ' +\n 'Return self-contained text or JSON output matching the requested output format by default. You may use code interpreter for analysis, but do not make the final answer depend on generated charts, images, documents, or files unless the user explicitly asks for artifacts. ' +\n 'Include a brief \"Approach Summary\" describing the key steps, tools, or sources you used (do not reveal chain-of-thought). ' +\n 'If you output JSON, include a \"summary\" field and a \"sources\" array when applicable.',\n};\nconst PANORAMA_INTERNAL_ALLOWED_KEYS = [\n 'allowed_tools',\n 'disallowed_tools',\n 'model',\n 'output_format',\n 'system_prompt',\n 'append_system_prompt',\n 'json_schema',\n 'max_budget_usd',\n 'timeout_ms',\n 'max_tool_steps',\n];\nconst PANORAMA_INTERNAL_ALIASES = {\n allowedTools: 'allowed_tools',\n disallowedTools: 'disallowed_tools',\n outputFormat: 'output_format',\n systemPrompt: 'system_prompt',\n appendSystemPrompt: 'append_system_prompt',\n jsonSchema: 'json_schema',\n maxBudgetUsd: 'max_budget_usd',\n timeoutMs: 'timeout_ms',\n maxToolSteps: 'max_tool_steps',\n tools: 'allowed_tools',\n};\nconst PANORAMA_INTERNAL_DEFAULTS = {\n allowed_tools: [...SUBAGENT_SAFE_TOOL_ALLOWLIST],\n};\nconst GATEWAY_CANCEL_ADAPTER = {\n supported: true,\n support: 'gateway',\n scope: 'gateway',\n request_mode: 'gateway_job',\n};\nconst LOCAL_BEST_EFFORT_CANCEL_ADAPTER = {\n supported: true,\n support: 'best_effort_local',\n scope: 'local',\n request_mode: 'cooperative_local',\n};\nconst UNSUPPORTED_CANCEL_ADAPTER = {\n supported: false,\n support: null,\n scope: null,\n request_mode: 'cooperative_local',\n};\nexport const SUBAGENT_TYPE_DEFINITIONS = {\n anthropic_provider_hosted: {\n id: 'anthropic_provider_hosted',\n label: 'Anthropic Provider-Hosted',\n runner: 'external',\n adapter_id: 'anthropic',\n enabled: false,\n disabledReason: 'Anthropic provider-hosted subagents are not enabled because exact synchronous Managed Agents cost accounting is not complete.',\n supports_continuation: true,\n cancel: {\n supported: true,\n support: 'provider',\n scope: 'provider',\n request_mode: 'provider_request',\n },\n config: {\n allowedKeys: [...ANTHROPIC_ALLOWED_KEYS],\n aliases: ANTHROPIC_ALIASES,\n defaults: ANTHROPIC_DEFAULTS,\n },\n provider_hosted: ANTHROPIC_PROVIDER_HOSTED_SPEC,\n },\n claude_code_gateway: {\n id: 'claude_code_gateway',\n label: 'Claude Code (Gateway)',\n runner: 'gateway',\n adapter_id: 'claude_code',\n supports_continuation: true,\n cancel: GATEWAY_CANCEL_ADAPTER,\n config: {\n allowedKeys: [...CLAUDE_CODE_ALLOWED_KEYS],\n aliases: CLAUDE_CODE_ALIASES,\n defaults: CLAUDE_CODE_DEFAULTS,\n },\n },\n codex_gateway: {\n id: 'codex_gateway',\n label: 'Codex (Gateway)',\n runner: 'gateway',\n adapter_id: 'codex',\n supports_continuation: false,\n cancel: GATEWAY_CANCEL_ADAPTER,\n config: {\n allowedKeys: [...CODEX_ALLOWED_KEYS],\n aliases: CODEX_ALIASES,\n defaults: CODEX_DEFAULTS,\n },\n },\n gemini_gateway: {\n id: 'gemini_gateway',\n label: 'Gemini CLI (Gateway)',\n runner: 'gateway',\n adapter_id: 'gemini',\n supports_continuation: false,\n cancel: GATEWAY_CANCEL_ADAPTER,\n config: {\n allowedKeys: [...GEMINI_ALLOWED_KEYS],\n aliases: GEMINI_ALIASES,\n defaults: GEMINI_DEFAULTS,\n },\n },\n google_provider_hosted: {\n id: 'google_provider_hosted',\n label: 'Google Provider-Hosted',\n runner: 'external',\n adapter_id: 'google',\n enabled: false,\n disabledReason: 'Google provider-hosted subagents are not enabled because Gemini Interactions does not return authoritative per-run total cost.',\n supports_continuation: true,\n cancel: {\n supported: true,\n support: 'provider',\n scope: 'provider',\n request_mode: 'provider_request',\n },\n config: {\n allowedKeys: [...GOOGLE_ALLOWED_KEYS],\n aliases: GOOGLE_ALIASES,\n defaults: GOOGLE_DEFAULTS,\n },\n provider_hosted: GOOGLE_PROVIDER_HOSTED_SPEC,\n },\n perplexity_provider_hosted: {\n id: 'perplexity_provider_hosted',\n label: 'Perplexity Provider-Hosted',\n runner: 'external',\n adapter_id: 'perplexity',\n supports_continuation: false,\n cancel: LOCAL_BEST_EFFORT_CANCEL_ADAPTER,\n config: {\n allowedKeys: [...PERPLEXITY_ALLOWED_KEYS],\n aliases: PERPLEXITY_ALIASES,\n defaults: PERPLEXITY_DEFAULTS,\n },\n provider_hosted: {\n ...PERPLEXITY_PROVIDER_HOSTED_SPEC,\n },\n },\n openai_provider_hosted: {\n id: 'openai_provider_hosted',\n label: 'OpenAI Provider-Hosted',\n runner: 'external',\n adapter_id: 'openai',\n enabled: false,\n disabledReason: 'OpenAI provider-hosted subagents are not enabled because Responses does not return authoritative per-run total cost.',\n supports_continuation: true,\n cancel: {\n supported: true,\n support: 'provider',\n scope: 'provider',\n request_mode: 'provider_request',\n },\n config: {\n allowedKeys: [...OPENAI_ALLOWED_KEYS],\n aliases: OPENAI_ALIASES,\n defaults: OPENAI_DEFAULTS,\n },\n provider_hosted: {\n provider: 'openai',\n adapterId: 'openai',\n runtime: 'openai_responses_background',\n contractVersion: 1,\n capabilities: OPENAI_PROVIDER_HOSTED_CAPABILITIES,\n config: {\n commonKeys: [...PROVIDER_HOSTED_COMMON_CONFIG_KEYS],\n providerSpecificKeys: [\n 'reasoning_effort',\n 'max_output_tokens',\n 'hosted_tools',\n 'tool_choice',\n 'parallel_tool_calls',\n 'max_tool_calls',\n 'metadata',\n 'previous_response_id',\n 'store',\n 'include',\n ],\n escapeHatchKeys: [...PROVIDER_HOSTED_ESCAPE_HATCH_CONFIG_KEYS],\n },\n normalizedSemantics: PROVIDER_HOSTED_NORMALIZED_SEMANTICS,\n },\n },\n panorama_internal: {\n id: 'panorama_internal',\n label: 'Panorama (Internal)',\n runner: 'worker',\n adapter_id: 'panorama',\n supports_continuation: false,\n cancel: LOCAL_BEST_EFFORT_CANCEL_ADAPTER,\n config: {\n allowedKeys: [...PANORAMA_INTERNAL_ALLOWED_KEYS],\n aliases: PANORAMA_INTERNAL_ALIASES,\n defaults: PANORAMA_INTERNAL_DEFAULTS,\n },\n },\n};\nfunction normalizeStringList(value, options) {\n if (value == null)\n return undefined;\n if (Array.isArray(value)) {\n const list = value.map((item) => String(item).trim()).filter((item) => item.length > 0);\n if (list.length > 0)\n return list;\n return options?.allowEmpty ? [] : undefined;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed)\n return options?.allowEmpty ? [] : undefined;\n const list = trimmed\n .split(',')\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n if (list.length > 0)\n return list;\n return options?.allowEmpty ? [] : undefined;\n }\n return undefined;\n}\nfunction normalizeNumber(value) {\n if (typeof value === 'number' && Number.isFinite(value))\n return value;\n if (typeof value === 'string') {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n}\nfunction normalizeBoolean(value) {\n if (typeof value === 'boolean')\n return value;\n if (typeof value === 'string') {\n const trimmed = value.trim().toLowerCase();\n if (trimmed === 'true')\n return true;\n if (trimmed === 'false')\n return false;\n }\n return undefined;\n}\nfunction normalizeConfigValue(key, value) {\n if (key === 'allowed_tools' ||\n key === 'disallowed_tools' ||\n key === 'file_search_store_names' ||\n key === 'enabled_tools' ||\n key === 'disabled_tools' ||\n key === 'vault_ids' ||\n key === 'anthropic_beta' ||\n key === 'response_modalities') {\n return normalizeStringList(value, { allowEmpty: true });\n }\n if (key === 'betas' || key === 'extensions') {\n return normalizeStringList(value);\n }\n if (key === 'max_tool_steps' || key === 'file_search_top_k') {\n const numeric = normalizeNumber(value);\n if (!numeric || numeric <= 0)\n return undefined;\n return Math.max(1, Math.round(numeric));\n }\n if (key === 'max_budget_usd' || key === 'timeout_ms') {\n return normalizeNumber(value);\n }\n if (key === 'no_session_persistence' ||\n key === 'include_partial_messages' ||\n key === 'full_control' ||\n key === 'parallel_tool_calls' ||\n key === 'store' ||\n key === 'collaborative_planning') {\n return normalizeBoolean(value);\n }\n if (key === 'output_format') {\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n if (normalized === 'json' || normalized === 'text') {\n return normalized;\n }\n if (normalized === 'stream-json' || normalized === 'stream_json' || normalized === 'stream') {\n return 'stream-json';\n }\n }\n return undefined;\n }\n if (key === 'reasoning_effort') {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n return undefined;\n }\n if (key === 'search_context_size' ||\n key === 'search_mode' ||\n key === 'search_recency_filter' ||\n key === 'agent' ||\n key === 'agent_id' ||\n key === 'agent_name' ||\n key === 'environment_id' ||\n key === 'environment_name' ||\n key === 'session_id' ||\n key === 'title' ||\n key === 'agent_toolset' ||\n key === 'thinking_summaries' ||\n key === 'visualization' ||\n key === 'previous_interaction_id' ||\n key === 'service_tier') {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n return undefined;\n }\n if (key === 'max_tokens' || key === 'max_output_tokens') {\n return normalizeNumber(value);\n }\n if (key === 'max_poll_attempts' || key === 'max_tool_calls') {\n const numeric = normalizeNumber(value);\n if (numeric === undefined || numeric <= 0)\n return undefined;\n return Math.max(1, Math.round(numeric));\n }\n if (key === 'hosted_tools') {\n if (Array.isArray(value)) {\n return value;\n }\n const list = normalizeStringList(value);\n return list && list.length > 0 ? list : undefined;\n }\n if (key === 'include') {\n if (Array.isArray(value)) {\n return value.length > 0 ? value : undefined;\n }\n const list = normalizeStringList(value);\n return list && list.length > 0 ? list : undefined;\n }\n if (key === 'mcp_servers' || key === 'skills' || key === 'tool_configs') {\n return Array.isArray(value) && value.length > 0 ? value : undefined;\n }\n if (key === 'input_parts') {\n return Array.isArray(value) && value.length > 0 ? value : undefined;\n }\n if (key === 'tool_choice') {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value;\n }\n return undefined;\n }\n if (key === 'metadata' ||\n key === 'environment' ||\n key === 'networking' ||\n key === 'packages' ||\n key === 'permission_policy') {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value;\n }\n return undefined;\n }\n if (key === 'previous_response_id') {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n return undefined;\n }\n if (key === 'provider_options') {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value;\n }\n return undefined;\n }\n if (value === undefined)\n return undefined;\n return value;\n}\nexport function getSubagentTypeDefinition(id) {\n return SUBAGENT_TYPE_DEFINITIONS[id] ?? null;\n}\nexport function getSubagentCancelAdapter(id) {\n const definition = getSubagentTypeDefinition(id);\n if (!definition)\n return UNSUPPORTED_CANCEL_ADAPTER;\n return definition.cancel;\n}\nexport function isProviderHostedSubagentDefinition(definition) {\n return definition?.runner === 'external' && !!definition.provider_hosted;\n}\nexport function getProviderHostedSubagentDefinitions() {\n return Object.values(SUBAGENT_TYPE_DEFINITIONS).filter((definition) => isProviderHostedSubagentDefinition(definition) && definition.enabled !== false);\n}\nexport function getProviderHostedProviderDocument(provider) {\n return PROVIDER_HOSTED_CAPABILITY_DOCUMENTS[provider];\n}\nexport function getSubagentExecutionContext(definition) {\n switch (definition.runner) {\n case 'gateway':\n return {\n execution_lane: 'cloud',\n execution_bridge: 'gateway',\n execution_substrate: 'gateway_host',\n trust_zone: 'user_delegated_host',\n delegate_kind: 'gateway_cli',\n };\n case 'external':\n return {\n execution_lane: 'cloud',\n execution_bridge: 'worker',\n execution_substrate: 'provider_service',\n trust_zone: 'provider_hosted',\n delegate_kind: 'provider_service',\n };\n case 'worker':\n default:\n return {\n execution_lane: 'cloud',\n execution_bridge: 'worker',\n execution_substrate: 'panorama_cloud',\n trust_zone: 'panorama_managed',\n delegate_kind: 'panorama_internal',\n };\n }\n}\nexport function normalizeSubagentConfig(definition, rawConfig) {\n const normalized = {\n ...(definition.config.defaults ?? {}),\n };\n const warnings = [];\n if (!rawConfig || typeof rawConfig !== 'object' || Array.isArray(rawConfig)) {\n return { config: normalized, warnings };\n }\n for (const [rawKey, rawValue] of Object.entries(rawConfig)) {\n const mappedKey = definition.config.aliases[rawKey] ?? rawKey;\n if (!definition.config.allowedKeys.includes(mappedKey)) {\n warnings.push(`Unsupported config key ignored: ${rawKey}`);\n continue;\n }\n const normalizedValue = normalizeConfigValue(mappedKey, rawValue);\n if (normalizedValue === undefined || normalizedValue === null) {\n if (rawValue !== undefined && rawValue !== null) {\n warnings.push(`Invalid value for ${rawKey} ignored`);\n }\n continue;\n }\n normalized[mappedKey] = normalizedValue;\n }\n return { config: normalized, warnings };\n}\n", "import { getSubagentExecutionContext } from '@panorama/shared/subagents/registry'\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport { randomUUID } from 'node:crypto'\nimport type { Database } from './database.types.js'\nimport { asJson } from './gateway-run-helpers.js'\nimport type { ActiveSubagentRun } from './gateway-runtime-state.js'\nimport {\n SUBAGENT_SCHEMA_VERSION,\n type SubagentRunPlan,\n} from './subagent-adapters/types.js'\nimport { buildErrorOutput, mergeMetadata } from './subagent-run-helpers.js'\nimport {\n resolveProviderCommand,\n resolveSubagentRunId,\n} from './subagent-run-job.js'\nimport {\n executeSubagentRunPlan,\n} from './subagent-run-execution.js'\nimport { finalizeExecutedSubagentRun } from './gateway-subagent-run-finalizer.js'\nimport {\n loadSubagentRunTarget,\n resolveSubagentRunPolicy,\n} from './gateway-subagent-run-target.js'\nimport type {\n GatewaySubagentRunJobResult,\n HandleGatewaySubagentRunJobParams,\n SubagentRunEventEmitter,\n SubagentRunRow,\n} from './gateway-subagent-run-types.js'\n\nexport type {\n GatewaySubagentRunControlState,\n GatewaySubagentRunEventInsert,\n GatewaySubagentRunJobResult,\n HandleGatewaySubagentRunJobParams,\n} from './gateway-subagent-run-types.js'\n\nfunction createSubagentRunEventEmitter(params: {\n handlerParams: HandleGatewaySubagentRunJobParams\n supabase: SupabaseClient<Database>\n runId: string\n subagentId: string\n teamId: string\n gatewayId: string | null\n}): SubagentRunEventEmitter {\n let nextEventSequence: number | null = null\n\n return async (eventType, eventPayload) => {\n if (nextEventSequence == null) {\n nextEventSequence = await params.handlerParams.getNextSubagentRunEventSequence(\n params.supabase,\n params.runId\n )\n }\n const insertedSequence = await params.handlerParams.insertSubagentRunEvent({\n supabase: params.supabase,\n runId: params.runId,\n subagentId: params.subagentId,\n teamId: params.teamId,\n gatewayId: params.gatewayId,\n sequence: nextEventSequence,\n eventType,\n payload: eventPayload,\n })\n if (typeof insertedSequence === 'number') {\n nextEventSequence = insertedSequence + 1\n }\n }\n}\n\nasync function recordPendingCancelledRun(params: {\n handlerParams: HandleGatewaySubagentRunJobParams\n supabase: SupabaseClient<Database>\n subagent: SubagentRunRow\n subagentId: string\n resolvedRunId: string\n runSequence: number\n prompt: string\n runMetadata: Record<string, unknown>\n pendingCancelReason: string\n emitRunEvent: SubagentRunEventEmitter\n}): Promise<GatewaySubagentRunJobResult> {\n const {\n handlerParams,\n supabase,\n subagent,\n subagentId,\n resolvedRunId,\n runSequence,\n prompt,\n runMetadata,\n pendingCancelReason,\n emitRunEvent,\n } = params\n handlerParams.clearPendingCancel(subagentId, resolvedRunId)\n const nowIso = new Date().toISOString()\n const cancelledOutput = buildErrorOutput(pendingCancelReason)\n\n const { error: cancelInsertError } = await supabase.from('subagent_runs').insert({\n id: resolvedRunId,\n subagent_id: subagentId,\n team_id: subagent.team_id,\n gateway_id: subagent.gateway_id,\n run_sequence: runSequence,\n status: 'cancelled',\n prompt,\n output: asJson(cancelledOutput),\n error: pendingCancelReason,\n started_at: nowIso,\n completed_at: nowIso,\n metadata: asJson({\n ...runMetadata,\n cancel_reason: pendingCancelReason,\n cancel_support: 'gateway',\n cancel_state: 'acknowledged',\n cancellation_scope: 'gateway',\n cancelled: true,\n }),\n })\n\n if (cancelInsertError) {\n return {\n ok: false,\n result: { message: 'Failed to record cancelled run', subagent_id: subagentId },\n error: cancelInsertError.message,\n }\n }\n\n await emitRunEvent('cancellation_requested', {\n reason: pendingCancelReason,\n source: 'pending_cancel',\n stage: 'before_start',\n })\n await emitRunEvent('cancellation_acknowledged', {\n reason: pendingCancelReason,\n source: 'gateway',\n cancellation_scope: 'gateway',\n })\n await emitRunEvent('run_cancelled', {\n reason: pendingCancelReason,\n source: 'gateway',\n cancellation_scope: 'gateway',\n })\n\n return {\n ok: true,\n result: {\n subagent_id: subagentId,\n status: 'cancelled',\n output: cancelledOutput,\n error: pendingCancelReason,\n },\n }\n}\n\nasync function insertRunningSubagentRun(params: {\n supabase: SupabaseClient<Database>\n subagent: SubagentRunRow\n subagentId: string\n resolvedRunId: string\n runSequence: number\n prompt: string\n startedAt: string\n runMetadata: Record<string, unknown>\n}): Promise<GatewaySubagentRunJobResult | null> {\n const {\n supabase,\n subagent,\n subagentId,\n resolvedRunId,\n runSequence,\n prompt,\n startedAt,\n runMetadata,\n } = params\n const { error: runInsertError } = await supabase.from('subagent_runs').insert({\n id: resolvedRunId,\n subagent_id: subagentId,\n team_id: subagent.team_id,\n gateway_id: subagent.gateway_id,\n run_sequence: runSequence,\n status: 'running',\n prompt,\n started_at: startedAt,\n metadata: asJson(runMetadata),\n })\n\n if (!runInsertError) {\n return null\n }\n\n if (runInsertError.code === '23505') {\n const { data: existingRunningRun, error: existingRunningRunError } = await supabase\n .from('subagent_runs')\n .select('id, status')\n .eq('subagent_id', subagentId)\n .eq('status', 'running')\n .order('run_sequence', { ascending: false })\n .limit(1)\n .maybeSingle()\n\n if (existingRunningRunError) {\n return {\n ok: false,\n result: {\n message: 'Failed to resolve conflicting subagent run after insert conflict',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n },\n error: existingRunningRunError.message,\n }\n }\n\n if (existingRunningRun?.id && existingRunningRun.id !== resolvedRunId) {\n return {\n ok: false,\n result: {\n message: 'Skipped duplicate subagent job because another run is already active',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n active_run_id: existingRunningRun.id,\n },\n jobStatus: 'cancelled',\n skipSubagentFailure: true,\n error: 'Another subagent run is already active',\n }\n }\n }\n\n return {\n ok: false,\n result: { message: 'Failed to create subagent run', subagent_id: subagentId },\n error: runInsertError.message,\n }\n}\n\nasync function markSubagentRunStarted(params: {\n handlerParams: HandleGatewaySubagentRunJobParams\n supabase: SupabaseClient<Database>\n subagentId: string\n resolvedRunId: string\n runSequence: number\n startedAt: string\n metadata: Record<string, unknown>\n}): Promise<GatewaySubagentRunJobResult | null> {\n const {\n handlerParams,\n supabase,\n subagentId,\n resolvedRunId,\n runSequence,\n startedAt,\n metadata,\n } = params\n const { data: startedSubagent, error: startSubagentUpdateError } = await supabase\n .from('subagents')\n .update({\n status: 'running',\n started_at: startedAt,\n metadata: asJson(\n mergeMetadata(metadata, {\n current_run_id: resolvedRunId,\n current_run_sequence: runSequence,\n })\n ),\n })\n .eq('id', subagentId)\n .eq('status', 'running')\n .select('id')\n .maybeSingle()\n\n if (startSubagentUpdateError) {\n handlerParams.activeSubagentRuns.delete(subagentId)\n return {\n ok: false,\n result: {\n message: 'Failed to mark subagent as running',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n },\n error: startSubagentUpdateError.message,\n }\n }\n if (!startedSubagent?.id) {\n handlerParams.activeSubagentRuns.delete(subagentId)\n return {\n ok: false,\n result: {\n message: 'Subagent status changed before gateway execution could start',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n },\n jobStatus: 'cancelled',\n skipSubagentFailure: true,\n error: 'Subagent status changed before gateway execution could start',\n }\n }\n\n return null\n}\n\nexport async function handleGatewaySubagentRunJob(\n params: HandleGatewaySubagentRunJobParams\n): Promise<GatewaySubagentRunJobResult> {\n const { supabase, job } = params\n const targetResult = await loadSubagentRunTarget(params)\n if (!targetResult.ok) return targetResult.result\n const target = targetResult.target\n const policyResult = await resolveSubagentRunPolicy(params, target)\n if (!policyResult.ok) return policyResult.result\n const {\n subagent,\n subagentId,\n payloadRunId,\n adapter,\n subagentType,\n prompt,\n inputRunId,\n inputRunSequence,\n configPayload,\n metadata,\n subagentFullControlRequested,\n resumeSessionId,\n } = target\n const {\n adapterId,\n providerSupport,\n effectiveFullControl,\n fullControlDeniedReason,\n retryConfig,\n } = policyResult.policy\n\n const resolvedRunId = resolveSubagentRunId(\n payloadRunId,\n inputRunId,\n params.createRunId ?? randomUUID\n )\n const nowIso = new Date().toISOString()\n const runSequence =\n inputRunSequence ?? (await params.getNextRunSequence(supabase, subagentId))\n const executionContext = getSubagentExecutionContext({\n runner: 'gateway',\n })\n const runMetadata: Record<string, unknown> = {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n runner: 'gateway',\n adapter_id: adapterId,\n subagent_type: subagentType,\n run_id: resolvedRunId,\n run_sequence: runSequence,\n cancel_state: 'none',\n full_control_requested: subagentFullControlRequested,\n full_control_effective: effectiveFullControl,\n full_control_denied_reason: fullControlDeniedReason,\n ...executionContext,\n }\n\n const emitRunEvent = createSubagentRunEventEmitter({\n handlerParams: params,\n supabase,\n runId: resolvedRunId,\n subagentId,\n teamId: subagent.team_id,\n gatewayId: subagent.gateway_id,\n })\n\n const pendingCancelReason = params.resolvePendingCancel(subagentId, resolvedRunId, metadata)\n if (pendingCancelReason) {\n return await recordPendingCancelledRun({\n handlerParams: params,\n supabase,\n subagent,\n subagentId,\n resolvedRunId,\n runSequence,\n prompt,\n runMetadata,\n pendingCancelReason,\n emitRunEvent,\n })\n }\n\n const insertErrorResult = await insertRunningSubagentRun({\n supabase,\n subagent,\n subagentId,\n resolvedRunId,\n runSequence,\n prompt,\n startedAt: nowIso,\n runMetadata,\n })\n if (insertErrorResult) return insertErrorResult\n\n const activeRun: ActiveSubagentRun = {\n runId: resolvedRunId,\n cancelled: false,\n }\n params.activeSubagentRuns.set(subagentId, activeRun)\n\n const latePendingCancelReason = params.consumePendingCancelFromQueue(subagentId, resolvedRunId)\n if (latePendingCancelReason) {\n activeRun.cancelled = true\n activeRun.cancelReason = latePendingCancelReason\n }\n\n const startErrorResult = await markSubagentRunStarted({\n handlerParams: params,\n supabase,\n subagentId,\n resolvedRunId,\n runSequence,\n startedAt: nowIso,\n metadata,\n })\n if (startErrorResult) return startErrorResult\n\n await emitRunEvent('run_started', {\n runner: 'gateway',\n adapter_id: adapterId,\n ...executionContext,\n subagent_type: subagentType,\n run_id: resolvedRunId,\n run_sequence: runSequence,\n })\n\n const failRun = async (\n message: string,\n options?: { metadata?: Record<string, unknown> }\n ): Promise<{\n ok: false\n result: Record<string, unknown>\n error: string\n }> => {\n const failureOutput = buildErrorOutput(message)\n const completedAt = new Date().toISOString()\n const metadataUpdate = mergeMetadata(runMetadata, options?.metadata ?? {})\n\n const { error: runFailureUpdateError } = await supabase\n .from('subagent_runs')\n .update({\n status: 'failed',\n output: asJson(failureOutput),\n error: message,\n completed_at: completedAt,\n metadata: asJson(metadataUpdate),\n })\n .eq('id', resolvedRunId)\n .eq('status', 'running')\n\n if (runFailureUpdateError) {\n params.logError('Failed to persist failed subagent run state', {\n subagentId,\n runId: resolvedRunId,\n error: runFailureUpdateError.message,\n })\n }\n\n const { error: subagentFailureUpdateError } = await supabase\n .from('subagents')\n .update({\n status: 'failed',\n output: asJson(failureOutput),\n error: message,\n completed_at: completedAt,\n metadata: asJson(mergeMetadata(metadata, options?.metadata ?? {})),\n })\n .eq('id', subagentId)\n .eq('status', 'running')\n\n if (subagentFailureUpdateError) {\n params.logError('Failed to persist failed subagent state', {\n subagentId,\n runId: resolvedRunId,\n error: subagentFailureUpdateError.message,\n })\n }\n\n await emitRunEvent('run_failed', {\n reason: message,\n source: 'gateway',\n stage: 'pre_execution',\n })\n\n params.activeSubagentRuns.delete(subagentId)\n\n const persistenceErrors = [\n runFailureUpdateError ? `run update: ${runFailureUpdateError.message}` : null,\n subagentFailureUpdateError ? `subagent update: ${subagentFailureUpdateError.message}` : null,\n ].filter((value): value is string => !!value)\n const error =\n persistenceErrors.length > 0\n ? `${message} (persistence errors: ${persistenceErrors.join('; ')})`\n : message\n\n return {\n ok: false,\n result: { message, subagent_id: subagentId },\n error,\n }\n }\n\n if (subagentFullControlRequested && !effectiveFullControl) {\n const deniedReason = fullControlDeniedReason ?? 'Gateway elevated provider mode is unavailable.'\n return await failRun(deniedReason, {\n metadata: {\n full_control_requested: true,\n full_control_effective: false,\n full_control_denied_reason: deniedReason,\n },\n })\n }\n\n let runPlan: SubagentRunPlan\n\n try {\n const command = resolveProviderCommand({\n providerId: adapterId,\n resolveClaudeCommand: params.resolveClaudeCommand,\n resolveCodexCommand: params.resolveCodexCommand,\n resolveGeminiCommand: params.resolveGeminiCommand,\n })\n\n runPlan = adapter.buildRunPlan({\n prompt,\n config: configPayload,\n command,\n support: providerSupport as Record<string, boolean>,\n fullControl: effectiveFullControl,\n resumeSessionId,\n })\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to build subagent run plan'\n return await failRun(message)\n }\n\n if (runPlan.outputFormat === 'stream-json') {\n if (!adapter.normalizeStreamingResult || !adapter.normalizeStreamEvents) {\n return await failRun('Subagent adapter does not support normalized streaming output')\n }\n }\n\n try {\n const executionResult = await executeSubagentRunPlan({\n runPlan,\n adapter,\n retryConfig,\n workRoot: params.resolveSubagentWorkdirRoot(),\n workSegments: [\n { value: subagentId, label: 'subagent id' },\n { value: resolvedRunId, label: 'run id' },\n ],\n defaultTimeoutMs: params.defaultTimeoutMs,\n runCommand: params.runCommand,\n runStreamingCommand: params.runStreamingCommand,\n emitRunEvent,\n logInfo: params.logInfo,\n logContext: { subagentId, runId: resolvedRunId },\n isCancelled: () => activeRun.cancelled,\n onStart: (child, context) => {\n activeRun.child = child\n if (activeRun.cancelled) {\n params.requestChildTermination(child, {\n reason: activeRun.cancelReason ?? 'Cancelled',\n graceMs: params.cancelKillTimeoutMs,\n context,\n })\n }\n },\n })\n return await finalizeExecutedSubagentRun({\n handlerParams: params,\n supabase,\n job,\n adapter,\n subagentId,\n subagentType,\n resolvedRunId,\n runSequence,\n runPlan,\n activeRun,\n executionResult,\n retryConfig,\n executionContext,\n subagentFullControlRequested,\n effectiveFullControl,\n emitRunEvent,\n })\n } finally {\n params.activeSubagentRuns.delete(subagentId)\n }\n}\n", "import { deriveGatewayMachineControlState } from '@panorama/shared/gateway/capabilities'\nimport { randomUUID } from 'node:crypto'\nimport type { GatewayProviderId } from './cli-providers/types.js'\nimport type { FullControlSupportResult } from './subagent-full-control.js'\nimport {\n extractSubagentPrompt,\n isUuid,\n type SubagentRetryConfig,\n} from './subagent-run-helpers.js'\n\nexport interface ParsedSubagentRunPayload {\n subagentId: string | null\n payloadRunId: string | null\n}\n\nexport interface ParsedSubagentRunInput {\n prompt: string | null\n inputRunId: string | null\n inputRunSequence: number | null\n}\n\nexport interface ResolvedSubagentFullControlState {\n effectiveFullControl: boolean\n deniedReason: string | null\n}\n\nexport function parseSubagentRunPayload(payload: Record<string, unknown>): ParsedSubagentRunPayload {\n const payloadRunId =\n typeof payload.run_id === 'string'\n ? payload.run_id.trim()\n : typeof payload.runId === 'string'\n ? payload.runId.trim()\n : null\n const subagentId =\n typeof payload.subagent_id === 'string'\n ? payload.subagent_id\n : typeof payload.subagentId === 'string'\n ? payload.subagentId\n : null\n\n return { subagentId, payloadRunId }\n}\n\nexport function parseSubagentRunInput(input: Record<string, unknown>): ParsedSubagentRunInput {\n const inputRunId = typeof input.run_id === 'string' ? input.run_id.trim() : null\n const rawRunSequence =\n typeof input.run_sequence === 'number'\n ? input.run_sequence\n : typeof input.runSequence === 'number'\n ? input.runSequence\n : typeof input.run_sequence === 'string'\n ? Number.parseInt(input.run_sequence, 10)\n : typeof input.runSequence === 'string'\n ? Number.parseInt(input.runSequence, 10)\n : NaN\n const inputRunSequence = Number.isFinite(rawRunSequence) ? rawRunSequence : null\n\n return {\n prompt: extractSubagentPrompt(input),\n inputRunId,\n inputRunSequence,\n }\n}\n\nexport function buildDefaultSubagentRetryConfig(): SubagentRetryConfig {\n return {\n maxAttempts: 1,\n backoffMs: 0,\n maxBackoffMs: 0,\n retryOnCapacity: false,\n retryOnTimeout: false,\n retryOnNetwork: false,\n retryOnParse: false,\n }\n}\n\nexport function resolveSubagentRunId(\n payloadRunId: string | null,\n inputRunId: string | null,\n createId: () => string = randomUUID\n): string {\n if (payloadRunId && isUuid(payloadRunId)) return payloadRunId\n if (inputRunId && isUuid(inputRunId)) return inputRunId\n return createId()\n}\n\nexport function resolveSubagentFullControlState(params: {\n requested: boolean\n installFullControlEnabled: boolean\n gatewayFullControlEnabled: boolean\n providerFullControlSupport: FullControlSupportResult\n}): ResolvedSubagentFullControlState {\n const machineControl = deriveGatewayMachineControlState({\n gatewayEnabled: params.gatewayFullControlEnabled,\n installEnabled: params.installFullControlEnabled,\n })\n const effectiveFullControl =\n params.requested && machineControl.effective && params.providerFullControlSupport.supported\n\n if (!params.requested || effectiveFullControl) {\n return { effectiveFullControl, deniedReason: null }\n }\n\n const deniedReason =\n machineControl.reason ??\n params.providerFullControlSupport.reason ??\n 'Gateway elevated provider mode is unavailable.'\n\n return { effectiveFullControl, deniedReason }\n}\n\nexport function resolveProviderCommand(params: {\n providerId: GatewayProviderId\n resolveClaudeCommand: () => string\n resolveCodexCommand: () => string\n resolveGeminiCommand: () => string\n}): string {\n if (params.providerId === 'codex') return params.resolveCodexCommand()\n if (params.providerId === 'gemini') return params.resolveGeminiCommand()\n return params.resolveClaudeCommand()\n}\n", "import type { ChildProcess } from 'node:child_process'\nimport type {\n GatewayCommandResult,\n GatewayCommandRunOptions,\n GatewayStreamingCommandResult,\n} from './gateway-command-runner.js'\nimport type {\n SubagentAdapter,\n SubagentNormalizeResult,\n SubagentRunPlan,\n} from './subagent-adapters/types.js'\nimport {\n cleanupWorkDir,\n createWorkDir,\n resolveRunPlanEnv,\n sleep,\n writeRunPlanFiles,\n} from './gateway-run-helpers.js'\nimport {\n buildErrorOutput,\n classifySubagentRetryable,\n computeRetryDelayMs,\n type SubagentRetryConfig,\n} from './subagent-run-helpers.js'\n\nexport type SubagentCommandStartContext = 'subagent_run_on_start' | 'subagent_run_streaming_on_start'\nexport type SubagentCommandRunOptions = GatewayCommandRunOptions\nexport type SubagentCommandResult = GatewayCommandResult\nexport type SubagentStreamingCommandResult = GatewayStreamingCommandResult\n\nexport type SubagentCommandRunner = (\n command: string,\n args: string[],\n options: SubagentCommandRunOptions\n) => Promise<SubagentCommandResult>\n\nexport type SubagentStreamingCommandRunner = (\n command: string,\n args: string[],\n options: SubagentCommandRunOptions\n) => Promise<SubagentStreamingCommandResult>\n\nexport interface ExecuteSubagentRunPlanOptions {\n runPlan: SubagentRunPlan\n adapter: Pick<\n SubagentAdapter,\n 'normalizeRunResult' | 'normalizeStreamingResult' | 'normalizeStreamEvents'\n >\n retryConfig: SubagentRetryConfig\n workRoot: string\n workSegments: Array<{ value: string; label: string }>\n defaultTimeoutMs: number\n runCommand: SubagentCommandRunner\n runStreamingCommand: SubagentStreamingCommandRunner\n emitRunEvent: (eventType: string, payload: Record<string, unknown>) => Promise<void>\n logInfo?: (message: string, data?: Record<string, unknown>) => void\n logContext?: Record<string, unknown>\n isCancelled?: () => boolean\n onStart?: (child: ChildProcess, context: SubagentCommandStartContext) => void\n sleepFn?: (ms: number) => Promise<void>\n computeRetryDelayMsFn?: (attempt: number, baseMs: number, maxMs: number) => number\n}\n\nexport interface ExecuteSubagentRunPlanResult {\n activeResult: SubagentCommandResult\n streamResult: SubagentStreamingCommandResult | null\n normalized: SubagentNormalizeResult\n attempt: number\n retryReasons: string[]\n}\n\nfunction buildExecutionFailureResult(message: string): SubagentCommandResult {\n return {\n ok: false,\n stdout: '',\n stderr: message,\n exitCode: null,\n durationMs: 0,\n timedOut: false,\n stdoutTruncated: false,\n stderrTruncated: false,\n error: message,\n }\n}\n\nfunction buildExecutionFailureNormalization(message: string): SubagentNormalizeResult {\n return {\n output: buildErrorOutput(message) as unknown as SubagentNormalizeResult['output'],\n metadata: {},\n parseError: null,\n }\n}\n\nexport async function executeSubagentRunPlan(\n options: ExecuteSubagentRunPlanOptions\n): Promise<ExecuteSubagentRunPlanResult> {\n const {\n runPlan,\n adapter,\n retryConfig,\n workRoot,\n workSegments,\n defaultTimeoutMs,\n runCommand,\n runStreamingCommand,\n emitRunEvent,\n } = options\n const isCancelled = options.isCancelled ?? (() => false)\n const sleepFn = options.sleepFn ?? sleep\n const computeDelay = options.computeRetryDelayMsFn ?? computeRetryDelayMs\n const retryReasons: string[] = []\n let workDir = ''\n\n try {\n workDir = await createWorkDir(workRoot, workSegments)\n await writeRunPlanFiles(workDir, runPlan.files)\n const resolvedEnv = resolveRunPlanEnv(runPlan.env, workDir)\n let runResult: SubagentCommandResult | null = null\n let streamResult: SubagentStreamingCommandResult | null = null\n let activeResult: SubagentCommandResult | null = null\n let normalized: SubagentNormalizeResult | null = null\n let attempt = 0\n\n while (attempt < retryConfig.maxAttempts) {\n attempt += 1\n runResult = null\n streamResult = null\n activeResult = null\n normalized = null\n let executionError: string | null = null\n\n await emitRunEvent('run_progress', {\n phase: 'attempt_started',\n attempt,\n max_attempts: retryConfig.maxAttempts,\n })\n\n try {\n if (runPlan.outputFormat === 'stream-json') {\n streamResult = await runStreamingCommand(runPlan.command, runPlan.args, {\n timeoutMs: runPlan.timeoutMs ?? defaultTimeoutMs,\n cwd: workDir,\n env: resolvedEnv,\n onStart: (child) => options.onStart?.(child, 'subagent_run_streaming_on_start'),\n })\n } else {\n runResult = await runCommand(runPlan.command, runPlan.args, {\n timeoutMs: runPlan.timeoutMs ?? defaultTimeoutMs,\n cwd: workDir,\n env: resolvedEnv,\n onStart: (child) => options.onStart?.(child, 'subagent_run_on_start'),\n })\n }\n } catch (error) {\n executionError = error instanceof Error ? error.message : 'Subagent run failed'\n }\n\n activeResult =\n streamResult ?? runResult ?? buildExecutionFailureResult(executionError ?? 'Subagent run failed')\n\n if (streamResult || runResult) {\n normalized =\n runPlan.outputFormat === 'stream-json' && adapter.normalizeStreamingResult\n ? adapter.normalizeStreamingResult({\n events: streamResult?.events ?? [],\n rawOutput: streamResult?.stdout ?? '',\n })\n : adapter.normalizeRunResult({\n stdout: runResult?.stdout ?? '',\n outputFormat:\n runPlan.outputFormat === 'stream-json' ? 'json' : runPlan.outputFormat,\n })\n } else {\n normalized = buildExecutionFailureNormalization(executionError ?? 'Subagent run failed')\n }\n\n const parseStrict = runPlan.outputFormat === 'json'\n const parseError = normalized.parseError ?? null\n const retryDecision = classifySubagentRetryable({\n result: {\n ok: activeResult.ok,\n timedOut: activeResult.timedOut,\n exitCode: activeResult.exitCode,\n error: activeResult.error,\n stderr: activeResult.stderr,\n stdoutTruncated: activeResult.stdoutTruncated,\n stderrTruncated: activeResult.stderrTruncated,\n },\n parseError,\n parseStrict,\n config: retryConfig,\n })\n\n if (retryDecision && attempt < retryConfig.maxAttempts && !isCancelled()) {\n retryReasons.push(retryDecision.reason)\n const delayMs = computeDelay(attempt, retryConfig.backoffMs, retryConfig.maxBackoffMs)\n options.logInfo?.('Retrying subagent run', {\n ...(options.logContext ?? {}),\n attempt,\n maxAttempts: retryConfig.maxAttempts,\n reason: retryDecision.reason,\n delay_ms: delayMs,\n })\n await emitRunEvent('run_progress', {\n phase: 'retry_scheduled',\n attempt,\n max_attempts: retryConfig.maxAttempts,\n reason: retryDecision.reason,\n delay_ms: delayMs,\n })\n await sleepFn(delayMs)\n continue\n }\n break\n }\n\n if (!activeResult || !normalized) {\n activeResult = buildExecutionFailureResult('Subagent run failed')\n normalized = buildExecutionFailureNormalization('Subagent run failed')\n }\n\n return {\n activeResult,\n streamResult,\n normalized,\n attempt,\n retryReasons,\n }\n } finally {\n if (workDir) {\n await cleanupWorkDir(workDir, workRoot)\n }\n }\n}\n", "import type {\n FinalizeGatewaySubagentRunRequest,\n FinalizeGatewaySubagentRunResponse,\n SubagentOutputEnvelope,\n} from '@panorama/shared'\n\ninterface EdgeInvokeError {\n message?: string\n}\n\ntype InvokeBody =\n | string\n | Record<string, unknown>\n | ArrayBuffer\n | InstanceType<typeof globalThis.File>\n | InstanceType<typeof globalThis.Blob>\n | InstanceType<typeof globalThis.FormData>\n | globalThis.ReadableStream<Uint8Array>\n\ninterface FunctionsInvokeClient {\n functions: {\n invoke: (\n functionName: string,\n options?: {\n body?: InvokeBody\n }\n ) => Promise<{\n data: unknown\n error: EdgeInvokeError | null\n }>\n }\n}\n\nfunction extractFunctionError(error: EdgeInvokeError | null): string | null {\n if (!error) return null\n if (typeof error.message === 'string' && error.message.trim().length > 0) {\n return error.message.trim()\n }\n return 'Edge Function invocation failed'\n}\n\nasync function finalizeGatewaySubagentRunViaEdge(\n client: FunctionsInvokeClient,\n body: FinalizeGatewaySubagentRunRequest\n): Promise<FinalizeGatewaySubagentRunResponse> {\n const { data, error } = await client.functions.invoke('finalize-gateway-subagent-run', {\n body: body as unknown as Record<string, unknown>,\n })\n if (error) {\n throw new Error(extractFunctionError(error) ?? 'Failed to finalize gateway subagent run')\n }\n return (data as FinalizeGatewaySubagentRunResponse | null) ?? {\n success: false,\n error: 'Unexpected response from finalize-gateway-subagent-run',\n }\n}\n\nexport async function finalizeGatewaySubagentRunOnBackend(\n client: FunctionsInvokeClient,\n params: {\n subagentId: string\n runId: string\n finalStatus: 'completed' | 'failed' | 'cancelled'\n output?: SubagentOutputEnvelope\n failureOutput?: Record<string, unknown> | null\n finalError?: string | null\n completedAt: string\n stderr?: string | null\n metadataPatch?: Record<string, unknown>\n }\n): Promise<FinalizeGatewaySubagentRunResponse> {\n return finalizeGatewaySubagentRunViaEdge(client, {\n subagent_id: params.subagentId,\n run_id: params.runId,\n final_status: params.finalStatus,\n output: params.output,\n failure_output: params.failureOutput ?? undefined,\n final_error: params.finalError ?? undefined,\n completed_at: params.completedAt,\n stderr: params.stderr ?? undefined,\n metadata_patch: params.metadataPatch,\n })\n}\n", "import type { SupabaseClient } from '@supabase/supabase-js'\nimport type { GatewayProviderId } from './cli-providers/types.js'\nimport type { Database } from './database.types.js'\nimport { buildSafeGatewayCommandDescriptor } from './debug-redaction.js'\nimport { finalizeGatewaySubagentRunOnBackend } from './finalize-subagent-run.js'\nimport {\n buildProviderFailureMessage,\n normalizeProviderErrorSummary,\n} from './gateway-provider-health.js'\nimport type { GatewayJobRow } from './gateway-jobs.js'\nimport {\n extractGatewayErrorSummary,\n truncateLog,\n} from './gateway-run-helpers.js'\nimport type { ActiveSubagentRun } from './gateway-runtime-state.js'\nimport {\n SUBAGENT_SCHEMA_VERSION,\n type SubagentAdapter,\n type SubagentOutputEnvelope,\n type SubagentRunPlan,\n} from './subagent-adapters/types.js'\nimport {\n buildErrorOutput,\n mergeMetadata,\n type SubagentRetryConfig,\n} from './subagent-run-helpers.js'\nimport type { ExecuteSubagentRunPlanResult } from './subagent-run-execution.js'\nimport type {\n GatewaySubagentRunJobResult,\n HandleGatewaySubagentRunJobParams,\n SubagentRunEventEmitter,\n} from './gateway-subagent-run-types.js'\n\nexport async function finalizeExecutedSubagentRun(params: {\n handlerParams: HandleGatewaySubagentRunJobParams\n supabase: SupabaseClient<Database>\n job: GatewayJobRow\n adapter: SubagentAdapter\n subagentId: string\n subagentType: string\n resolvedRunId: string\n runSequence: number\n runPlan: SubagentRunPlan\n activeRun: ActiveSubagentRun\n executionResult: ExecuteSubagentRunPlanResult\n retryConfig: SubagentRetryConfig\n executionContext: object\n subagentFullControlRequested: boolean\n effectiveFullControl: boolean\n emitRunEvent: SubagentRunEventEmitter\n}): Promise<GatewaySubagentRunJobResult> {\n const {\n handlerParams,\n supabase,\n job,\n adapter,\n subagentId,\n subagentType,\n resolvedRunId,\n runSequence,\n runPlan,\n activeRun,\n executionResult,\n retryConfig,\n executionContext,\n subagentFullControlRequested,\n effectiveFullControl,\n emitRunEvent,\n } = params\n const { activeResult, streamResult, normalized, attempt, retryReasons } = executionResult\n\n const { data: cancellationRow, error: cancellationError } = await supabase\n .from('subagent_runs')\n .select('status')\n .eq('id', resolvedRunId)\n .maybeSingle()\n\n if (cancellationError) {\n handlerParams.logError('Failed to check subagent run cancellation', {\n error: cancellationError.message,\n subagentId,\n runId: resolvedRunId,\n })\n }\n\n const dbCancelled = cancellationRow?.status === 'cancelled'\n const wasCancelled = activeRun.cancelled || dbCancelled\n const cancelReason =\n activeRun.cancelReason && activeRun.cancelReason.trim().length > 0\n ? activeRun.cancelReason\n : 'Cancelled'\n\n const output = normalized.output\n const parseError = normalized.parseError ?? null\n const retryCount = Math.max(0, attempt - 1)\n\n const completedAt = new Date().toISOString()\n const parseStrict = runPlan.outputFormat === 'json'\n const shouldFail = !activeResult.ok || (parseStrict && !!parseError)\n const effectiveShouldFail = !wasCancelled && shouldFail\n const stderrMessage =\n activeResult.stderr && activeResult.stderr.trim().length > 0\n ? activeResult.stderr.trim()\n : null\n const exitCodeMessage =\n activeResult.exitCode === null\n ? 'Subagent process did not exit cleanly'\n : `Subagent exited with code ${activeResult.exitCode}`\n let errorMessage = !activeResult.ok\n ? (activeResult.error ?? stderrMessage ?? exitCodeMessage)\n : (parseError ?? null)\n\n const providerId = adapter.id as GatewayProviderId\n if (!wasCancelled) {\n if (effectiveShouldFail) {\n const stderrInfo = truncateLog(activeResult.stderr ?? '')\n const stdoutInfo = truncateLog(activeResult.stdout ?? '')\n handlerParams.logError('Subagent run failed', {\n subagentId,\n runId: resolvedRunId,\n provider: providerId,\n exit_code: activeResult.exitCode,\n timed_out: activeResult.timedOut,\n parse_error: parseError ?? null,\n error: activeResult.error ?? null,\n stderr: stderrInfo.value || null,\n stderr_truncated: stderrInfo.truncated,\n stderr_bytes: stderrInfo.originalBytes,\n stdout: parseError ? stdoutInfo.value || null : null,\n stdout_truncated: parseError ? stdoutInfo.truncated : null,\n stdout_bytes: parseError ? stdoutInfo.originalBytes : null,\n })\n const parsed = activeResult.stderr\n ? extractGatewayErrorSummary(activeResult.stderr)?.message\n : null\n const providerSummary = normalizeProviderErrorSummary(parsed ?? errorMessage ?? null)\n await handlerParams.updateRuntimeProviderHealth({\n supabase,\n providerId,\n status: 'unhealthy',\n error: providerSummary ?? errorMessage,\n context: 'subagent_run',\n jobId: job.id,\n runId: resolvedRunId,\n })\n errorMessage = buildProviderFailureMessage(providerId, providerSummary ?? errorMessage)\n } else {\n await handlerParams.updateRuntimeProviderHealth({\n supabase,\n providerId,\n status: 'healthy',\n context: 'subagent_run',\n jobId: job.id,\n runId: resolvedRunId,\n })\n }\n }\n\n const failureOutput = buildErrorOutput(\n wasCancelled ? cancelReason : (errorMessage ?? 'Subagent run failed')\n )\n const finalStatus = wasCancelled ? 'cancelled' : effectiveShouldFail ? 'failed' : 'completed'\n let finalOutput: Record<string, unknown> | SubagentOutputEnvelope =\n wasCancelled || effectiveShouldFail ? failureOutput : output\n const finalError = wasCancelled ? cancelReason : effectiveShouldFail ? errorMessage : null\n\n const commandDescriptor = buildSafeGatewayCommandDescriptor(runPlan.command, runPlan.args, {\n redactLastArg: true,\n })\n const metadataPatch: Record<string, unknown> = {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n runner: 'gateway',\n adapter_id: adapter.id,\n subagent_type: subagentType,\n run_id: resolvedRunId,\n run_sequence: runSequence,\n last_run_at: completedAt,\n command: commandDescriptor.commandLine,\n exit_code: activeResult.exitCode,\n duration_ms: activeResult.durationMs,\n timed_out: activeResult.timedOut,\n stdout_truncated: activeResult.stdoutTruncated,\n stderr_truncated: activeResult.stderrTruncated,\n output_format: runPlan.outputFormat,\n parse_error: parseError,\n retry_count: retryCount,\n retry_reasons: retryReasons,\n retry_max_attempts: retryConfig.maxAttempts,\n cancel_run_id: null,\n cancel_requested_at: null,\n cancel_reason: wasCancelled ? cancelReason : null,\n cancelled: wasCancelled,\n cancel_state: wasCancelled ? 'acknowledged' : 'none',\n cancel_support: wasCancelled ? 'gateway' : null,\n cancellation_scope: wasCancelled ? 'gateway' : null,\n full_control_requested: subagentFullControlRequested,\n full_control_effective: effectiveFullControl,\n full_control_denied_reason: null,\n ...executionContext,\n }\n const finalizationPayload = await finalizeGatewaySubagentRunOnBackend(supabase, {\n subagentId,\n runId: resolvedRunId,\n finalStatus,\n output: finalStatus === 'completed' ? output : undefined,\n failureOutput: finalStatus === 'completed' ? null : failureOutput,\n finalError,\n completedAt,\n stderr: activeResult.stderr ?? null,\n metadataPatch: mergeMetadata(normalized.metadata, metadataPatch),\n })\n\n if (!finalizationPayload.success) {\n handlerParams.activeSubagentRuns.delete(subagentId)\n return {\n ok: false,\n result: {\n message: 'Failed to persist terminal subagent run state',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n },\n error: finalizationPayload.error ?? 'Failed to persist terminal subagent run state',\n }\n }\n\n finalOutput = finalizationPayload.output ?? finalOutput\n\n if (streamResult?.events?.length && adapter.normalizeStreamEvents) {\n const normalizedEvents = adapter.normalizeStreamEvents(streamResult.events)\n for (const entry of normalizedEvents) {\n await emitRunEvent(entry.event_type, entry.payload)\n }\n }\n\n if (wasCancelled) {\n await emitRunEvent('cancellation_acknowledged', {\n reason: cancelReason,\n source: 'gateway',\n cancellation_scope: 'gateway',\n })\n await emitRunEvent('run_cancelled', {\n reason: cancelReason,\n source: 'gateway',\n cancellation_scope: 'gateway',\n duration_ms: activeResult.durationMs,\n })\n } else if (effectiveShouldFail) {\n await emitRunEvent('run_failed', {\n reason: errorMessage ?? 'Subagent run failed',\n duration_ms: activeResult.durationMs,\n parse_error: parseError,\n })\n } else {\n await emitRunEvent('run_completed', {\n duration_ms: activeResult.durationMs,\n parse_error: parseError,\n retry_count: retryCount,\n })\n }\n\n handlerParams.activeSubagentRuns.delete(subagentId)\n\n return {\n ok: !effectiveShouldFail,\n result: {\n subagent_id: subagentId,\n status: finalStatus,\n output: effectiveShouldFail ? null : finalOutput,\n error: finalError,\n },\n error: effectiveShouldFail ? (errorMessage ?? 'Subagent run failed') : undefined,\n }\n}\n", "import { SUBAGENT_SCHEMA_VERSION, type SubagentOutputContentType, type SubagentOutputEnvelope } from './types.js'\n\nexport function normalizeStringList(value: unknown): string[] | null {\n if (Array.isArray(value)) {\n const items = value.map((item) => String(item).trim()).filter((item) => item.length > 0)\n return items.length > 0 ? items : null\n }\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return null\n const items = trimmed\n .split(',')\n .map((item) => item.trim())\n .filter((item) => item.length > 0)\n return items.length > 0 ? items : null\n }\n return null\n}\n\nexport function toOutputEnvelope(\n content: unknown,\n contentType: SubagentOutputContentType,\n options?: { summary?: string | null; sources?: string[] | null }\n): SubagentOutputEnvelope {\n const output: SubagentOutputEnvelope = {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n content,\n content_type: contentType,\n }\n\n const summary = options?.summary\n if (typeof summary === 'string' && summary.trim().length > 0) {\n output.summary = summary.trim()\n }\n\n const sources = options?.sources\n if (Array.isArray(sources) && sources.length > 0) {\n output.sources = sources\n }\n\n return output\n}\n\nexport function stripCodeFence(text: string): string {\n const trimmed = text.trim()\n if (trimmed.startsWith('```')) {\n return trimmed.replace(/^```(?:json)?\\n?/i, '').replace(/```$/i, '').trim()\n }\n return trimmed\n}\n\nexport function tryParseJson(text: string): { ok: true; value: unknown } | { ok: false } {\n try {\n const parsed = JSON.parse(text) as unknown\n return { ok: true, value: parsed }\n } catch {\n return { ok: false }\n }\n}\n\nexport function extractJsonCandidate(text: string): { candidate: string; looksLikeJson: boolean } {\n const trimmed = text.trim()\n const fenceMatch = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i)\n if (fenceMatch) {\n return { candidate: fenceMatch[1].trim(), looksLikeJson: true }\n }\n const firstObject = trimmed.indexOf('{')\n const lastObject = trimmed.lastIndexOf('}')\n if (firstObject !== -1 && lastObject > firstObject) {\n return { candidate: trimmed.slice(firstObject, lastObject + 1).trim(), looksLikeJson: true }\n }\n const firstArray = trimmed.indexOf('[')\n const lastArray = trimmed.lastIndexOf(']')\n if (firstArray !== -1 && lastArray > firstArray) {\n return { candidate: trimmed.slice(firstArray, lastArray + 1).trim(), looksLikeJson: true }\n }\n return {\n candidate: stripCodeFence(trimmed),\n looksLikeJson: trimmed.startsWith('{') || trimmed.startsWith('['),\n }\n}\n\nexport function extractJsonFromText(\n text: string,\n options?: { strict?: boolean }\n): { output: SubagentOutputEnvelope; parseError?: string } {\n const { candidate, looksLikeJson } = extractJsonCandidate(text)\n const parsed = tryParseJson(candidate)\n if (parsed.ok) {\n return { output: toOutputEnvelope(parsed.value, 'json') }\n }\n if (options?.strict || looksLikeJson) {\n return {\n output: toOutputEnvelope(text.trim(), 'markdown'),\n parseError: 'Failed to parse JSON output',\n }\n }\n return { output: toOutputEnvelope(text.trim(), 'markdown') }\n}\n", "import type {\n SubagentAdapter,\n SubagentAdapterContext,\n SubagentNormalizeResult,\n SubagentOutputEnvelope,\n SubagentOutputContentType,\n SubagentRunPlan,\n SubagentRunOutputFormat,\n SubagentStreamEvent,\n NormalizedRunEvent,\n} from './types.js'\nimport { coerceClaudeSupport, type ClaudeSupport } from './claude-support.js'\nimport { normalizeStringList, toOutputEnvelope } from './utils.js'\nimport { asRecord } from '@panorama/shared/utils'\n\nconst SAFE_MODE_APPEND_SYSTEM_PROMPT_PREFIX =\n 'You cannot write or interact with files in this environment.'\n\nfunction normalizeClaudeToolName(name: string): string | null {\n const trimmed = name.trim()\n if (!trimmed) return null\n const lower = trimmed.toLowerCase()\n if (lower === 'web__search' || lower === 'web_search' || lower === 'websearch') {\n return 'WebSearch'\n }\n return trimmed\n}\n\nfunction normalizeClaudeToolList(value: unknown): string[] | null {\n const list = normalizeStringList(value)\n if (!list) return null\n const normalized = list\n .map((tool) => normalizeClaudeToolName(tool))\n .filter((tool): tool is string => !!tool && tool.length > 0)\n return normalized.length > 0 ? normalized : null\n}\n\nfunction stringifyJsonSchema(value: unknown): string | null {\n if (!value) return null\n if (typeof value === 'string') {\n return value.trim().length > 0 ? value : null\n }\n try {\n return JSON.stringify(value)\n } catch {\n return null\n }\n}\n\nfunction normalizePermissionMode(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction appendIsolationArgs(args: string[], support: ClaudeSupport): void {\n if (support.settingSourcesFlag) {\n args.push('--setting-sources', 'local')\n }\n if (support.disableSlashCommandsFlag) {\n args.push('--disable-slash-commands')\n }\n}\n\nfunction isDefaultSafeAppendPrompt(value: string): boolean {\n return value.includes(SAFE_MODE_APPEND_SYSTEM_PROMPT_PREFIX)\n}\n\nfunction isDefaultSafeAllowedTools(value: string[] | null): boolean {\n if (!value || value.length !== 1) return false\n return value[0]?.trim().toLowerCase() === 'websearch'\n}\n\nfunction extractSummaryAndSources(value: unknown): { summary?: string; sources?: string[] } {\n if (!value || typeof value !== 'object') return {}\n const obj = value as Record<string, unknown>\n const summary =\n typeof obj.summary === 'string'\n ? obj.summary\n : typeof obj.overview === 'string'\n ? obj.overview\n : undefined\n const sources =\n Array.isArray(obj.sources) && obj.sources.every((item) => typeof item === 'string')\n ? (obj.sources as string[])\n : undefined\n return { summary, sources }\n}\n\nfunction buildClaudeArgs(\n prompt: string,\n config: Record<string, unknown>,\n support: ClaudeSupport,\n fullControl: boolean,\n resumeSessionId?: string | null\n): { args: string[]; outputFormat: SubagentRunOutputFormat; timeoutMs: number | null } {\n const safeMode = !fullControl\n let effectivePrompt = prompt\n const args: string[] = []\n\n const rawOutputFormat =\n typeof config.output_format === 'string' ? config.output_format.trim().toLowerCase() : ''\n const desiredOutputFormat: SubagentRunOutputFormat =\n rawOutputFormat === 'text'\n ? 'text'\n : rawOutputFormat === 'stream-json' ||\n rawOutputFormat === 'stream_json' ||\n rawOutputFormat === 'stream'\n ? 'stream-json'\n : 'json'\n const outputFormat: SubagentRunOutputFormat = desiredOutputFormat\n const cliOutputFormat =\n outputFormat === 'stream-json' && support.streamJsonFlag\n ? 'stream-json'\n : outputFormat === 'text'\n ? 'text'\n : 'json'\n args.push('--print')\n if (support.outputFormatFlag) {\n args.push('--output-format', cliOutputFormat)\n }\n\n const model = typeof config.model === 'string' ? config.model.trim() : ''\n if (model && support.modelFlag) {\n args.push('--model', model)\n }\n\n let allowedTools = normalizeClaudeToolList(config.allowed_tools)\n if (fullControl && isDefaultSafeAllowedTools(allowedTools)) {\n allowedTools = null\n } else if (safeMode && !allowedTools) {\n allowedTools = ['WebSearch']\n }\n if (allowedTools && support.allowedToolsFlag) {\n args.push('--allowedTools', allowedTools.join(','))\n } else if (allowedTools && support.toolsFlag) {\n args.push('--tools', allowedTools.join(','))\n }\n\n const disallowedTools = normalizeClaudeToolList(config.disallowed_tools)\n if (disallowedTools && support.disallowedToolsFlag) {\n args.push('--disallowedTools', disallowedTools.join(','))\n }\n\n const appendSystemPromptRaw =\n typeof config.append_system_prompt === 'string'\n ? config.append_system_prompt.trim()\n : ''\n const appendSystemPrompt = fullControl && isDefaultSafeAppendPrompt(appendSystemPromptRaw)\n ? ''\n : appendSystemPromptRaw\n if (appendSystemPrompt) {\n if (support.appendSystemPromptFlag) {\n args.push('--append-system-prompt', appendSystemPrompt)\n } else {\n effectivePrompt = `${effectivePrompt}\\n\\n${appendSystemPrompt}`\n }\n }\n\n const systemPrompt =\n typeof config.system_prompt === 'string'\n ? config.system_prompt.trim()\n : ''\n if (systemPrompt && support.systemPromptFlag) {\n args.push('--system-prompt', systemPrompt)\n }\n\n const jsonSchema = stringifyJsonSchema(config.json_schema)\n if (jsonSchema) {\n if (support.jsonSchemaFlag) {\n args.push('--json-schema', jsonSchema)\n } else {\n effectivePrompt = `${effectivePrompt}\\n\\nReturn STRICT JSON matching this schema:\\n${jsonSchema}`\n }\n }\n\n const configuredPermissionMode = normalizePermissionMode(config.permission_mode)\n const effectivePermissionMode =\n fullControl && (!configuredPermissionMode || configuredPermissionMode.toLowerCase() === 'dontask')\n ? 'bypassPermissions'\n : configuredPermissionMode\n if (effectivePermissionMode && support.permissionModeFlag) {\n args.push('--permission-mode', effectivePermissionMode)\n }\n if (fullControl && support.dangerouslySkipPermissionsFlag) {\n args.push('--dangerously-skip-permissions')\n }\n\n const maxBudget =\n typeof config.max_budget_usd === 'number'\n ? config.max_budget_usd\n : typeof config.max_budget_usd === 'string'\n ? Number.parseFloat(config.max_budget_usd)\n : NaN\n if (Number.isFinite(maxBudget) && support.maxBudgetFlag) {\n args.push('--max-budget-usd', String(maxBudget))\n }\n\n const inputFormat =\n typeof config.input_format === 'string'\n ? config.input_format.trim()\n : ''\n if (inputFormat && support.inputFormatFlag) {\n args.push('--input-format', inputFormat)\n }\n\n const betas = normalizeStringList(config.betas)\n if (betas && betas.length > 0 && support.betasFlag) {\n args.push('--betas', ...betas)\n }\n\n const noSessionPersistence =\n config.no_session_persistence === true && support.noSessionPersistenceFlag\n if (noSessionPersistence) {\n args.push('--no-session-persistence')\n }\n\n const sessionId =\n typeof config.session_id === 'string'\n ? config.session_id.trim()\n : ''\n if (sessionId && support.sessionIdFlag) {\n args.push('--session-id', sessionId)\n }\n\n const explicitResume =\n typeof config.resume_session_id === 'string'\n ? config.resume_session_id.trim()\n : ''\n\n const resumeId = explicitResume || (resumeSessionId ?? '')\n if (resumeId) {\n if (!support.resumeFlag) {\n throw new Error('Claude CLI does not support session continuation (--resume)')\n }\n args.push('--resume', resumeId)\n }\n\n if (safeMode) {\n appendIsolationArgs(args, support)\n }\n\n const timeoutMs =\n typeof config.timeout_ms === 'number'\n ? config.timeout_ms\n : null\n\n args.push('-p', effectivePrompt)\n\n return {\n args,\n outputFormat,\n timeoutMs: Number.isFinite(timeoutMs) ? timeoutMs : null,\n }\n}\n\nfunction normalizeOutputFromJson(parsed: Record<string, unknown>): {\n output: SubagentOutputEnvelope\n metadata: Record<string, unknown>\n} {\n const metadata: Record<string, unknown> = {\n adapter_id: 'claude_code',\n }\n\n if (typeof parsed.session_id === 'string') {\n metadata.session_id = parsed.session_id\n }\n if (typeof parsed.total_cost_usd === 'number') {\n metadata.total_cost_usd = parsed.total_cost_usd\n }\n if (parsed.usage) {\n metadata.usage = parsed.usage\n }\n if (parsed.modelUsage) {\n metadata.model_usage = parsed.modelUsage\n }\n if (parsed.permission_denials) {\n metadata.permission_denials = parsed.permission_denials\n }\n\n const structured = parsed.structured_output\n if (structured && typeof structured === 'object') {\n const { summary, sources } = extractSummaryAndSources(structured)\n return {\n output: toOutputEnvelope(structured, 'json', { summary, sources }),\n metadata,\n }\n }\n\n const result = parsed.result\n if (typeof result === 'string') {\n const { summary, sources } = extractSummaryAndSources(parsed)\n return {\n output: toOutputEnvelope(result, 'markdown', { summary, sources }),\n metadata,\n }\n }\n\n if (result !== undefined) {\n const contentType: SubagentOutputContentType =\n result && typeof result === 'object' ? 'json' : 'text'\n const { summary, sources } = extractSummaryAndSources(result)\n return {\n output: toOutputEnvelope(result, contentType, { summary, sources }),\n metadata,\n }\n }\n\n const { summary, sources } = extractSummaryAndSources(parsed)\n return {\n output: toOutputEnvelope(parsed, 'json', { summary, sources }),\n metadata,\n }\n}\n\nfunction extractStringValue(value: unknown): string | null {\n if (!value) return null\n if (typeof value === 'string') {\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n }\n return null\n}\n\nfunction extractAssistantContent(event: Record<string, unknown>): string | null {\n const direct =\n extractStringValue(event.content) ??\n extractStringValue(event.message) ??\n extractStringValue(event.result) ??\n extractStringValue(event.output)\n if (direct) return direct\n\n const message = event.message\n if (message && typeof message === 'object') {\n const msgObj = message as Record<string, unknown>\n const content = msgObj.content\n if (typeof content === 'string') {\n return extractStringValue(content)\n }\n if (Array.isArray(content)) {\n const textChunks = content\n .map((item) => {\n if (!item || typeof item !== 'object') return null\n const part = item as Record<string, unknown>\n return extractStringValue(part.text) ?? extractStringValue(part.content)\n })\n .filter((item): item is string => !!item)\n if (textChunks.length > 0) {\n return textChunks.join('')\n }\n }\n }\n\n return null\n}\n\nfunction extractMetadataFromEvents(events: SubagentStreamEvent[]): Record<string, unknown> {\n const metadata: Record<string, unknown> = { adapter_id: 'claude_code' }\n for (const entry of events) {\n const event = entry.event\n if (!event) continue\n if (typeof event.session_id === 'string' && event.session_id.trim().length > 0) {\n metadata.session_id = event.session_id\n }\n if (typeof event.total_cost_usd === 'number') {\n metadata.total_cost_usd = event.total_cost_usd\n }\n if (event.usage) {\n metadata.usage = event.usage\n }\n if (event.modelUsage) {\n metadata.model_usage = event.modelUsage\n }\n }\n return metadata\n}\n\nfunction normalizeStreamEvents(events: SubagentStreamEvent[]): NormalizedRunEvent[] {\n const normalized: NormalizedRunEvent[] = []\n const assistantIndexById = new Map<string, number>()\n const toolNameByUseId = new Map<string, string>()\n const toolCallSeen = new Set<string>()\n const toolResultSeen = new Set<string>()\n\n const upsertAssistantMessage = (messageId: string | null, payload: Record<string, unknown>) => {\n if (messageId && assistantIndexById.has(messageId)) {\n const index = assistantIndexById.get(messageId)\n if (index !== undefined) {\n normalized[index] = { event_type: 'message', payload }\n }\n return\n }\n normalized.push({ event_type: 'message', payload })\n if (messageId) {\n assistantIndexById.set(messageId, normalized.length - 1)\n }\n }\n\n for (const entry of events) {\n const event = entry.event\n if (!event || typeof event.type !== 'string') continue\n\n const eventType = event.type\n if (eventType === 'result') continue\n\n if (eventType === 'system') {\n continue\n }\n\n if (eventType === 'assistant') {\n const message = getMessageFromEvent(event)\n const messageId = message && typeof message.id === 'string' ? message.id : null\n const model = message && typeof message.model === 'string' ? message.model : ''\n const stopReason =\n message && typeof message.stop_reason === 'string' ? message.stop_reason : ''\n\n if (message) {\n const contentParts = getContentParts(message)\n const textParts: string[] = []\n const toolParts: Record<string, unknown>[] = []\n\n for (const part of contentParts) {\n const partType = typeof part.type === 'string' ? part.type : ''\n if (partType === 'tool_use') {\n toolParts.push(part)\n continue\n }\n\n const text = extractStringValue(part.text) ?? extractStringValue(part.content)\n if (text) {\n textParts.push(text)\n }\n }\n\n const combinedText = trimText(textParts.join(''))\n if (combinedText) {\n const payload: Record<string, unknown> = {\n role: 'assistant',\n content: combinedText,\n }\n if (messageId) payload.message_id = messageId\n if (model) payload.model = model\n if (stopReason) payload.stop_reason = stopReason\n upsertAssistantMessage(messageId, payload)\n }\n\n for (const part of toolParts) {\n const toolUseId =\n typeof part.id === 'string'\n ? part.id\n : typeof part.tool_use_id === 'string'\n ? part.tool_use_id\n : null\n const toolName = typeof part.name === 'string' ? part.name.trim() : ''\n if (toolUseId && !toolCallSeen.has(toolUseId)) {\n toolCallSeen.add(toolUseId)\n if (toolName) {\n toolNameByUseId.set(toolUseId, toolName)\n }\n const toolInput = part.input ?? null\n normalized.push({\n event_type: 'tool_call',\n payload: {\n tool_name: toolName || null,\n tool_use_id: toolUseId,\n tool_input: toolInput,\n summary: buildToolInputSummary(toolInput),\n message_id: messageId,\n },\n })\n }\n }\n continue\n }\n\n const fallbackText = extractAssistantContent(event)\n if (fallbackText) {\n upsertAssistantMessage(messageId, {\n role: 'assistant',\n content: trimText(fallbackText),\n })\n }\n continue\n }\n\n if (eventType === 'user') {\n const message = getMessageFromEvent(event)\n const messageId = message && typeof message.id === 'string' ? message.id : null\n if (!message) continue\n const contentParts = getContentParts(message)\n for (const part of contentParts) {\n const partType = typeof part.type === 'string' ? part.type : ''\n if (partType !== 'tool_result') continue\n const toolUseId =\n typeof part.tool_use_id === 'string'\n ? part.tool_use_id\n : typeof part.id === 'string'\n ? part.id\n : null\n if (toolUseId && toolResultSeen.has(toolUseId)) continue\n if (toolUseId) toolResultSeen.add(toolUseId)\n const content = stringifyContent(part.content)\n const trimmedContent = trimText(content)\n if (!trimmedContent) continue\n normalized.push({\n event_type: 'tool_result',\n payload: {\n tool_use_id: toolUseId,\n tool_name: toolUseId ? toolNameByUseId.get(toolUseId) ?? null : null,\n content: trimmedContent,\n is_error: part.is_error === true,\n message_id: messageId,\n },\n })\n }\n continue\n }\n }\n\n return normalized\n}\n\nfunction getMessageFromEvent(event: Record<string, unknown>): Record<string, unknown> | null {\n const message = event.message\n return asRecord(message)\n}\n\nfunction getContentParts(message: Record<string, unknown>): Record<string, unknown>[] {\n const content = message.content\n if (Array.isArray(content)) {\n return content.filter((item) => !!item && typeof item === 'object') as Record<string, unknown>[]\n }\n if (typeof content === 'string') {\n return [{ type: 'text', text: content }]\n }\n return []\n}\n\nfunction stringifyContent(value: unknown): string {\n if (typeof value === 'string') return value\n if (value === null || value === undefined) return ''\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return String(value)\n }\n}\n\nfunction trimText(value: string): string {\n return value.replace(/\\s+$/, '')\n}\n\nfunction buildToolInputSummary(input: unknown): string | null {\n if (!input) return null\n if (typeof input === 'string') {\n const trimmed = input.trim()\n return trimmed.length > 0 ? trimmed : null\n }\n if (typeof input === 'object') {\n const record = input as Record<string, unknown>\n const query = typeof record.query === 'string' ? record.query.trim() : ''\n if (query) return `Query: ${query}`\n const text = typeof record.text === 'string' ? record.text.trim() : ''\n if (text) return text\n }\n return null\n}\n\nexport function createClaudeCodeAdapter(): SubagentAdapter {\n return {\n id: 'claude_code',\n label: 'Claude Code',\n supportsContinuation: true,\n buildRunPlan(context: SubagentAdapterContext): SubagentRunPlan {\n const support = coerceClaudeSupport(context.support as Record<string, boolean> | undefined)\n const { args, outputFormat, timeoutMs } = buildClaudeArgs(\n context.prompt,\n context.config,\n support,\n context.fullControl,\n context.resumeSessionId\n )\n\n return {\n command: context.command,\n args,\n outputFormat,\n timeoutMs,\n }\n },\n normalizeRunResult({\n stdout,\n outputFormat,\n }: {\n stdout: string\n outputFormat: 'json' | 'text'\n }): SubagentNormalizeResult {\n if (outputFormat === 'json') {\n try {\n const parsed = JSON.parse(stdout) as Record<string, unknown>\n const normalized = normalizeOutputFromJson(parsed)\n return {\n ...normalized,\n rawResponse: parsed,\n }\n } catch (error) {\n const parseError = error instanceof Error ? error.message : 'Failed to parse JSON output'\n return {\n output: toOutputEnvelope(stdout.trim(), 'text'),\n metadata: { adapter_id: 'claude_code' },\n parseError,\n }\n }\n }\n\n return {\n output: toOutputEnvelope(stdout.trim(), 'text'),\n metadata: { adapter_id: 'claude_code' },\n }\n },\n normalizeStreamingResult({ events, rawOutput }): SubagentNormalizeResult {\n const resultEvent = [...events]\n .reverse()\n .find((entry) => entry.event && entry.event.type === 'result')\n\n if (resultEvent?.event) {\n const normalized = normalizeOutputFromJson(resultEvent.event)\n return {\n ...normalized,\n rawResponse: resultEvent.event,\n }\n }\n\n const assistantEvent = [...events]\n .reverse()\n .find((entry) => entry.event && typeof entry.event.type === 'string')\n\n const assistantText =\n (assistantEvent?.event ? extractAssistantContent(assistantEvent.event) : null) ??\n rawOutput.trim()\n\n return {\n output: toOutputEnvelope(assistantText.trim(), 'markdown'),\n metadata: extractMetadataFromEvents(events),\n }\n },\n normalizeStreamEvents,\n }\n}\n", "import type { SubagentRunOutputFormat } from './types.js'\n\nexport function parseSubagentRunOutputFormat(value: unknown): SubagentRunOutputFormat {\n if (typeof value !== 'string') return 'json'\n const normalized = value.trim().toLowerCase()\n if (normalized === 'text') return 'text'\n if (normalized === 'stream-json' || normalized === 'stream_json' || normalized === 'stream') {\n return 'stream-json'\n }\n return 'json'\n}\n", "import type {\n SubagentAdapter,\n SubagentAdapterContext,\n SubagentNormalizeResult,\n SubagentRunPlan,\n SubagentStreamEvent,\n NormalizedRunEvent,\n} from './types.js'\nimport { parseSubagentRunOutputFormat } from './output-format.js'\nimport { extractJsonFromText, normalizeStringList, toOutputEnvelope } from './utils.js'\nimport {\n buildProviderChildProcessEnv,\n resolveCodexProviderCommand,\n} from '../provider-runtime-utils.js'\n\nconst SAFE_MODE_APPEND_SYSTEM_PROMPT_PREFIX =\n 'You cannot write or interact with files in this environment.'\n\nfunction includesWebSearch(value: unknown): boolean {\n const list = normalizeStringList(value)\n if (!list) return false\n return list.some((item) => item.toLowerCase().replace(/[^a-z]/g, '') === 'websearch')\n}\n\nfunction isDefaultSafeAppendPrompt(value: string): boolean {\n return value.includes(SAFE_MODE_APPEND_SYSTEM_PROMPT_PREFIX)\n}\n\nfunction findLastAgentMessage(events: SubagentStreamEvent[]): string | null {\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i].event\n if (!event || typeof event !== 'object') continue\n if (event.type === 'item.completed') {\n const item = (event as Record<string, unknown>).item as Record<string, unknown> | undefined\n if (item && item.type === 'agent_message' && typeof item.text === 'string') {\n return item.text\n }\n }\n }\n return null\n}\n\nfunction extractUsage(events: SubagentStreamEvent[]): Record<string, unknown> | null {\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i].event\n if (!event || typeof event !== 'object') continue\n if (event.type === 'turn.completed' && typeof (event as Record<string, unknown>).usage === 'object') {\n return (event as Record<string, unknown>).usage as Record<string, unknown>\n }\n }\n return null\n}\n\nfunction normalizeStreamEvents(events: SubagentStreamEvent[]): NormalizedRunEvent[] {\n const normalized: NormalizedRunEvent[] = []\n for (const entry of events) {\n const event = entry.event\n if (!event || typeof event !== 'object') continue\n const type = (event as Record<string, unknown>).type\n if (type === 'item.completed') {\n const item = (event as Record<string, unknown>).item as Record<string, unknown> | undefined\n if (!item) continue\n if (item.type === 'agent_message' && typeof item.text === 'string') {\n normalized.push({\n event_type: 'message',\n payload: { role: 'assistant', content: item.text },\n })\n }\n if (item.type === 'reasoning' && typeof item.text === 'string') {\n normalized.push({\n event_type: 'message',\n payload: { role: 'assistant', content: item.text, kind: 'reasoning' },\n })\n }\n }\n }\n return normalized\n}\n\nfunction parseJsonlEvents(output: string): SubagentStreamEvent[] {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n const events: SubagentStreamEvent[] = []\n let sequence = 0\n for (const line of lines) {\n let event: Record<string, unknown> | null = null\n try {\n event = JSON.parse(line) as Record<string, unknown>\n } catch {\n event = null\n }\n events.push({ sequence, raw: line, event })\n sequence += 1\n }\n return events\n}\n\nfunction normalizeCodexStreamResult(\n events: SubagentStreamEvent[],\n rawOutput: string\n): SubagentNormalizeResult {\n const outputText = findLastAgentMessage(events) ?? rawOutput.trim()\n const { output, parseError } = extractJsonFromText(outputText, { strict: false })\n const metadata: Record<string, unknown> = { adapter_id: 'codex' }\n const usage = extractUsage(events)\n if (usage) metadata.usage = usage\n return { output, metadata, parseError: parseError ?? undefined }\n}\n\nexport function createCodexAdapter(): SubagentAdapter {\n return {\n id: 'codex',\n label: 'OpenAI Codex',\n supportsContinuation: false,\n buildRunPlan(context: SubagentAdapterContext): SubagentRunPlan {\n const config = context.config ?? {}\n const fullControl = context.fullControl === true\n const outputFormat = parseSubagentRunOutputFormat(config.output_format)\n const supportFlags = context.support ?? {}\n\n const args: string[] = ['exec', '--skip-git-repo-check']\n if (!fullControl) {\n if (supportFlags.sandboxFlag !== false) {\n args.push('--sandbox', 'read-only')\n }\n } else if (supportFlags.dangerouslyBypassApprovalsAndSandboxFlag === true) {\n args.push('--dangerously-bypass-approvals-and-sandbox')\n } else if (supportFlags.sandboxFlag !== false) {\n args.push('--sandbox', 'danger-full-access')\n }\n\n const model = typeof config.model === 'string' ? config.model.trim() : ''\n if (model) {\n args.push('--model', model)\n }\n\n if (supportFlags.configFlag !== false) {\n const effort = typeof config.reasoning_effort === 'string' ? config.reasoning_effort : 'high'\n args.push('-c', `model_reasoning_effort=\"${effort}\"`)\n if (!fullControl) {\n args.push('-c', 'features.shell_tool=false')\n const enableSearch = includesWebSearch(config.allowed_tools)\n args.push('-c', `features.web_search_request=${enableSearch ? 'true' : 'false'}`)\n } else {\n args.push('-c', 'features.shell_tool=true')\n args.push('-c', 'features.web_search_request=true')\n }\n }\n\n if (outputFormat !== 'text') {\n args.push('--json')\n }\n\n let prompt = context.prompt\n const appendSystemPromptRaw =\n typeof config.append_system_prompt === 'string' ? config.append_system_prompt.trim() : ''\n const appendSystemPrompt =\n fullControl && isDefaultSafeAppendPrompt(appendSystemPromptRaw)\n ? ''\n : appendSystemPromptRaw\n if (appendSystemPrompt) {\n prompt = `${prompt}\\n\\n${appendSystemPrompt}`\n }\n\n args.push(prompt)\n\n return {\n command: context.command || resolveCodexProviderCommand(),\n args,\n outputFormat,\n timeoutMs: typeof config.timeout_ms === 'number' ? config.timeout_ms : null,\n env: buildProviderChildProcessEnv(),\n }\n },\n normalizeRunResult({ stdout, outputFormat }): SubagentNormalizeResult {\n if (outputFormat === 'json') {\n try {\n const parsed = JSON.parse(stdout) as Record<string, unknown>\n return { output: toOutputEnvelope(parsed, 'json'), metadata: { adapter_id: 'codex' }, rawResponse: parsed }\n } catch (error) {\n const events = parseJsonlEvents(stdout)\n if (events.some((entry) => entry.event)) {\n return normalizeCodexStreamResult(events, stdout)\n }\n const parseError = error instanceof Error ? error.message : 'Failed to parse JSON output'\n return {\n output: toOutputEnvelope(stdout.trim(), 'text'),\n metadata: { adapter_id: 'codex' },\n parseError,\n }\n }\n }\n return { output: toOutputEnvelope(stdout.trim(), 'text'), metadata: { adapter_id: 'codex' } }\n },\n normalizeStreamingResult({ events, rawOutput }): SubagentNormalizeResult {\n return normalizeCodexStreamResult(events, rawOutput)\n },\n normalizeStreamEvents,\n }\n}\n", "import type {\n SubagentAdapter,\n SubagentAdapterContext,\n SubagentNormalizeResult,\n SubagentRunPlan,\n SubagentStreamEvent,\n NormalizedRunEvent,\n} from './types.js'\nimport { parseSubagentRunOutputFormat } from './output-format.js'\nimport { extractJsonFromText, normalizeStringList, toOutputEnvelope } from './utils.js'\nimport path from 'node:path'\nimport {\n buildGeminiProviderChildProcessEnv,\n resolveGeminiProviderCommand,\n} from '../provider-runtime-utils.js'\n\nconst SAFE_MODE_APPEND_SYSTEM_PROMPT_PREFIX =\n 'You cannot write or interact with files in this environment.'\n\nfunction findLastAssistantMessage(events: SubagentStreamEvent[]): string | null {\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i].event\n if (!event || typeof event !== 'object') continue\n if ((event as Record<string, unknown>).type === 'message') {\n const role = (event as Record<string, unknown>).role\n const content = (event as Record<string, unknown>).content\n if (role === 'assistant' && typeof content === 'string') {\n return content\n }\n }\n }\n return null\n}\n\nfunction concatenateAssistantMessages(events: SubagentStreamEvent[]): string | null {\n const chunks: string[] = []\n for (const entry of events) {\n const event = entry.event\n if (!event || typeof event !== 'object') continue\n if ((event as Record<string, unknown>).type === 'message') {\n const role = (event as Record<string, unknown>).role\n const content = (event as Record<string, unknown>).content\n if (role === 'assistant' && typeof content === 'string') {\n chunks.push(content)\n }\n }\n }\n if (chunks.length === 0) return null\n return chunks.join('').trim()\n}\n\nfunction extractUsage(events: SubagentStreamEvent[]): Record<string, unknown> | null {\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i].event\n if (!event || typeof event !== 'object') continue\n if ((event as Record<string, unknown>).type === 'result') {\n const stats = (event as Record<string, unknown>).stats\n if (stats && typeof stats === 'object') {\n return stats as Record<string, unknown>\n }\n }\n }\n return null\n}\n\nfunction normalizeStreamEvents(events: SubagentStreamEvent[]): NormalizedRunEvent[] {\n const normalized: NormalizedRunEvent[] = []\n for (const entry of events) {\n const event = entry.event\n if (!event || typeof event !== 'object') continue\n if ((event as Record<string, unknown>).type === 'message') {\n const role = (event as Record<string, unknown>).role\n const content = (event as Record<string, unknown>).content\n if (typeof role === 'string' && typeof content === 'string') {\n normalized.push({ event_type: 'message', payload: { role, content } })\n }\n }\n }\n return normalized\n}\n\nfunction isDefaultSafeAppendPrompt(value: string): boolean {\n return value.includes(SAFE_MODE_APPEND_SYSTEM_PROMPT_PREFIX)\n}\n\nexport function createGeminiAdapter(): SubagentAdapter {\n return {\n id: 'gemini',\n label: 'Gemini CLI',\n supportsContinuation: false,\n buildRunPlan(context: SubagentAdapterContext): SubagentRunPlan {\n const config = context.config ?? {}\n const fullControl = context.fullControl === true\n const outputFormat = parseSubagentRunOutputFormat(config.output_format)\n const supportFlags = context.support ?? {}\n\n const command = context.command || resolveGeminiProviderCommand()\n const args: string[] = ['--output-format', outputFormat === 'text' ? 'text' : 'json']\n\n if (supportFlags.approvalModeFlag === true) {\n args.push('--approval-mode', fullControl ? 'yolo' : 'plan')\n } else if (fullControl && supportFlags.yoloFlag === true) {\n args.push('--yolo')\n }\n if (!fullControl && supportFlags.sandboxFlag === true) {\n args.push('--sandbox')\n }\n\n const model = typeof config.model === 'string' ? config.model.trim() : ''\n if (model) {\n args.push('--model', model)\n }\n\n const extensions = normalizeStringList(config.extensions)\n if (extensions && extensions.length > 0) {\n args.push('--extensions', extensions.join(','))\n }\n\n let prompt = context.prompt\n const systemPrompt = typeof config.system_prompt === 'string' ? config.system_prompt.trim() : ''\n const appendSystemPromptRaw =\n typeof config.append_system_prompt === 'string' ? config.append_system_prompt.trim() : ''\n const appendSystemPrompt =\n fullControl && isDefaultSafeAppendPrompt(appendSystemPromptRaw)\n ? ''\n : appendSystemPromptRaw\n const finalSystemPrompt = [systemPrompt, appendSystemPrompt]\n .map((value) => value.trim())\n .filter((value) => value.length > 0)\n .join('\\n')\n\n const jsonOnly = outputFormat === 'json'\n const systemContents = finalSystemPrompt\n ? jsonOnly\n ? `${finalSystemPrompt}\\nReturn STRICT JSON only. Do not wrap in code fences.`\n : finalSystemPrompt\n : jsonOnly\n ? 'Return STRICT JSON only. Do not wrap in code fences.'\n : ''\n\n const files: Array<{ path: string; contents: string }> = systemContents\n ? [{ path: 'system.md', contents: systemContents }]\n : []\n\n args.push(prompt)\n\n return {\n command,\n args,\n outputFormat,\n timeoutMs: typeof config.timeout_ms === 'number' ? config.timeout_ms : null,\n env: systemContents\n ? buildGeminiProviderChildProcessEnv({\n systemPromptPath: path.join('{WORKDIR}', 'system.md'),\n commandPath: command,\n })\n : buildGeminiProviderChildProcessEnv({ commandPath: command }),\n files,\n }\n },\n normalizeRunResult({ stdout, outputFormat }): SubagentNormalizeResult {\n if (outputFormat === 'json') {\n try {\n const parsed = JSON.parse(stdout) as Record<string, unknown>\n const response = typeof parsed.response === 'string' ? parsed.response : ''\n const { output, parseError } = extractJsonFromText(response)\n return { output, metadata: { adapter_id: 'gemini' }, parseError }\n } catch (error) {\n const parseError = error instanceof Error ? error.message : 'Failed to parse JSON output'\n return {\n output: toOutputEnvelope(stdout.trim(), 'text'),\n metadata: { adapter_id: 'gemini' },\n parseError,\n }\n }\n }\n return { output: toOutputEnvelope(stdout.trim(), 'text'), metadata: { adapter_id: 'gemini' } }\n },\n normalizeStreamingResult({ events, rawOutput }): SubagentNormalizeResult {\n const outputText =\n concatenateAssistantMessages(events) ?? findLastAssistantMessage(events) ?? rawOutput.trim()\n const { output, parseError } = extractJsonFromText(outputText, { strict: false })\n const metadata: Record<string, unknown> = { adapter_id: 'gemini' }\n const usage = extractUsage(events)\n if (usage) metadata.usage = usage\n return { output, metadata, parseError: parseError ?? undefined }\n },\n normalizeStreamEvents,\n }\n}\n", "import type { SubagentAdapter } from './types.js'\nimport { createClaudeCodeAdapter } from './claude-code.js'\nimport { createCodexAdapter } from './codex.js'\nimport { createGeminiAdapter } from './gemini.js'\n\nconst claudeAdapter = createClaudeCodeAdapter()\nconst codexAdapter = createCodexAdapter()\nconst geminiAdapter = createGeminiAdapter()\n\nconst SUBAGENT_ADAPTERS: Record<string, SubagentAdapter> = {\n claude_code_gateway: claudeAdapter,\n codex_gateway: codexAdapter,\n gemini_gateway: geminiAdapter,\n}\n\nexport function getSubagentAdapter(subagentType: string): SubagentAdapter | null {\n return SUBAGENT_ADAPTERS[subagentType] ?? null\n}\n\nexport function listSubagentAdapters(): SubagentAdapter[] {\n return Array.from(new Set(Object.values(SUBAGENT_ADAPTERS)))\n}\n", "import type { GatewayProviderId } from './cli-providers/types.js'\n\nexport interface FullControlSupportResult {\n supported: boolean\n reason: string | null\n}\n\nfunction readFlag(flags: Record<string, unknown>, key: string): boolean | null {\n if (!Object.prototype.hasOwnProperty.call(flags, key)) return null\n const value = flags[key]\n return typeof value === 'boolean' ? value : null\n}\n\nexport function evaluateGatewayProviderFullControlSupport(\n providerId: GatewayProviderId,\n supportedFlags: Record<string, unknown> | null | undefined\n): FullControlSupportResult {\n const flags = supportedFlags ?? {}\n\n switch (providerId) {\n case 'claude_code': {\n const permissionMode = readFlag(flags, 'permissionModeFlag')\n const dangerousSkip = readFlag(flags, 'dangerouslySkipPermissionsFlag')\n if (permissionMode === true || dangerousSkip === true) {\n return { supported: true, reason: null }\n }\n return {\n supported: false,\n reason:\n 'Claude CLI does not expose elevated permission flags on this host (missing --permission-mode bypassPermissions and --dangerously-skip-permissions).',\n }\n }\n case 'codex': {\n const dangerousBypass = readFlag(flags, 'dangerouslyBypassApprovalsAndSandboxFlag')\n const sandbox = readFlag(flags, 'sandboxFlag')\n if (dangerousBypass === true || sandbox === true) {\n return { supported: true, reason: null }\n }\n return {\n supported: false,\n reason:\n 'Codex CLI does not expose elevated permission flags on this host (missing --dangerously-bypass-approvals-and-sandbox and --sandbox danger-full-access).',\n }\n }\n case 'gemini': {\n const approvalMode = readFlag(flags, 'approvalModeFlag')\n const yolo = readFlag(flags, 'yoloFlag')\n if (approvalMode === true || yolo === true) {\n return { supported: true, reason: null }\n }\n return {\n supported: false,\n reason:\n 'Gemini CLI does not expose elevated approval flags on this host (missing --approval-mode yolo and --yolo).',\n }\n }\n default:\n return {\n supported: false,\n reason: `Unsupported gateway provider for elevated provider mode: ${providerId}`,\n }\n }\n}\n", "import { isGatewayServiceReady } from '@panorama/shared/gateway/capabilities'\nimport { parseBooleanInput } from './cli-args.js'\nimport type { GatewayProviderId } from './cli-providers/types.js'\nimport { inferProviderFromSubagentType } from './gateway-jobs.js'\nimport {\n DEFAULT_CLAUDE_SUPPORT,\n toFlagRecord,\n} from './subagent-adapters/claude-support.js'\nimport { getSubagentAdapter } from './subagent-adapters/registry.js'\nimport { evaluateGatewayProviderFullControlSupport } from './subagent-full-control.js'\nimport {\n buildDefaultSubagentRetryConfig,\n parseSubagentRunInput,\n parseSubagentRunPayload,\n resolveSubagentFullControlState,\n} from './subagent-run-job.js'\nimport type {\n GatewaySubagentRunJobResult,\n HandleGatewaySubagentRunJobParams,\n SubagentRunPolicy,\n SubagentRunRow,\n SubagentRunTarget,\n} from './gateway-subagent-run-types.js'\n\nexport async function loadSubagentRunTarget(\n params: HandleGatewaySubagentRunJobParams\n): Promise<\n | { ok: true; target: SubagentRunTarget }\n | { ok: false; result: GatewaySubagentRunJobResult }\n> {\n const { supabase, config, job } = params\n const payload = job.payload ?? {}\n const { subagentId, payloadRunId } = parseSubagentRunPayload(payload)\n\n if (!subagentId) {\n return {\n ok: false,\n result: {\n ok: false,\n result: { message: 'Missing subagent_id in payload' },\n error: 'Missing subagent_id in payload',\n },\n }\n }\n\n const { data: loadedSubagent, error: subagentError } = await supabase\n .from('subagents')\n .select('id, team_id, gateway_id, owner_agent_id, subagent_type, status, config, input, metadata')\n .eq('id', subagentId)\n .maybeSingle()\n const subagent = loadedSubagent as SubagentRunRow | null\n\n if (subagentError || !subagent) {\n return {\n ok: false,\n result: {\n ok: false,\n result: { message: 'Subagent not found', subagent_id: subagentId },\n jobStatus: 'cancelled',\n skipSubagentFailure: true,\n error: subagentError?.message ?? 'Subagent not found',\n },\n }\n }\n\n if (subagent.gateway_id !== config.gatewayId) {\n const message = 'Subagent is assigned to a different gateway'\n return {\n ok: false,\n result: {\n ok: false,\n result: {\n message,\n subagent_id: subagentId,\n assigned_gateway_id: subagent.gateway_id,\n gateway_id: config.gatewayId,\n },\n jobStatus: 'cancelled',\n skipSubagentFailure: true,\n error: message,\n },\n }\n }\n\n const metadata = (subagent.metadata ?? {}) as Record<string, unknown>\n const currentRunId = typeof metadata.current_run_id === 'string' ? metadata.current_run_id : null\n if (subagent.status !== 'running') {\n const message = `Subagent status changed before queued job execution (status=${subagent.status})`\n return {\n ok: false,\n result: {\n ok: false,\n result: {\n message,\n subagent_id: subagentId,\n expected_run_id: payloadRunId,\n current_run_id: currentRunId,\n },\n jobStatus: 'cancelled',\n skipSubagentFailure: true,\n error: message,\n },\n }\n }\n\n if (payloadRunId && currentRunId && payloadRunId !== currentRunId) {\n const message = 'Queued subagent job no longer matches the subagent current_run_id'\n return {\n ok: false,\n result: {\n ok: false,\n result: {\n message,\n subagent_id: subagentId,\n expected_run_id: payloadRunId,\n current_run_id: currentRunId,\n },\n jobStatus: 'cancelled',\n skipSubagentFailure: true,\n error: message,\n },\n }\n }\n\n const subagentType = subagent.subagent_type\n const adapter = getSubagentAdapter(subagentType)\n if (!adapter) {\n return {\n ok: false,\n result: {\n ok: false,\n result: { message: 'Unsupported subagent type', subagent_type: subagentType },\n error: `Unsupported subagent type: ${subagentType}`,\n },\n }\n }\n\n params.logInfo('Processing subagent run', {\n jobId: job.id,\n subagentId,\n subagentType,\n provider: inferProviderFromSubagentType(subagentType),\n })\n\n const inputPayload = (subagent.input ?? {}) as Record<string, unknown>\n const { prompt, inputRunId, inputRunSequence } = parseSubagentRunInput(inputPayload)\n if (!prompt) {\n return {\n ok: false,\n result: {\n ok: false,\n result: { message: 'Missing prompt in subagent input', subagent_id: subagentId },\n error: 'Missing prompt in subagent input',\n },\n }\n }\n\n const configPayload = (subagent.config ?? {}) as Record<string, unknown>\n const subagentFullControlRequested =\n parseBooleanInput(configPayload.full_control) ??\n parseBooleanInput(configPayload.fullControl) ??\n false\n const resumeSessionId =\n typeof metadata.session_id === 'string' ? metadata.session_id.trim() : null\n\n if (resumeSessionId && !adapter.supportsContinuation) {\n return {\n ok: false,\n result: {\n ok: false,\n result: { message: 'Subagent does not support continuation', subagent_id: subagentId },\n error: 'Subagent provider does not support continuation',\n },\n }\n }\n\n return {\n ok: true,\n target: {\n subagent,\n subagentId,\n payloadRunId,\n adapter,\n subagentType,\n prompt,\n inputRunId,\n inputRunSequence,\n configPayload,\n metadata,\n subagentFullControlRequested,\n resumeSessionId,\n },\n }\n}\n\nexport async function resolveSubagentRunPolicy(\n params: HandleGatewaySubagentRunJobParams,\n target: SubagentRunTarget\n): Promise<\n | { ok: true; policy: SubagentRunPolicy }\n | { ok: false; result: GatewaySubagentRunJobResult }\n> {\n const { supabase, config, job } = params\n const installFullControlEnabled = await params.refreshRuntimeInstallFullControl(config)\n const gatewayControlState = await params.loadGatewayControlState(supabase, config)\n if (!gatewayControlState) {\n return {\n ok: false,\n result: {\n ok: false,\n result: {\n message: 'Gateway control state unavailable',\n subagent_id: target.subagentId,\n },\n error: 'Gateway control state unavailable',\n },\n }\n }\n if (!params.isHeartbeatFresh(gatewayControlState.last_seen_at)) {\n return {\n ok: false,\n result: {\n ok: false,\n result: {\n message: 'Gateway is offline or heartbeat is stale',\n subagent_id: target.subagentId,\n },\n error: 'Gateway is offline or heartbeat is stale',\n },\n }\n }\n if (\n !gatewayControlState.capabilities ||\n !isGatewayServiceReady(gatewayControlState.capabilities, 'model_execution')\n ) {\n const modelServiceReason =\n gatewayControlState.capabilities?.services.model_execution.reason ??\n 'Gateway AI model providers are unavailable'\n return {\n ok: false,\n result: {\n ok: false,\n result: {\n message: modelServiceReason,\n subagent_id: target.subagentId,\n },\n error: modelServiceReason,\n },\n }\n }\n\n const adapterId = target.adapter.id as GatewayProviderId\n const providerSupport: Record<string, unknown> =\n params.providerCapabilities?.[adapterId]?.supported_flags ??\n (adapterId === 'claude_code'\n ? toFlagRecord(params.claudeSupport ?? DEFAULT_CLAUDE_SUPPORT)\n : {})\n const providerFullControlSupport = evaluateGatewayProviderFullControlSupport(\n adapterId,\n providerSupport\n )\n const { effectiveFullControl, deniedReason: fullControlDeniedReason } =\n resolveSubagentFullControlState({\n requested: target.subagentFullControlRequested,\n installFullControlEnabled,\n gatewayFullControlEnabled: gatewayControlState.full_control_enabled,\n providerFullControlSupport,\n })\n\n params.logInfo('Resolved subagent elevated provider state', {\n jobId: job.id,\n subagentId: target.subagentId,\n providerId: adapterId,\n fullControlRequested: target.subagentFullControlRequested,\n installFullControlEnabled,\n gatewayFullControlEnabled: gatewayControlState.full_control_enabled,\n providerFullControlSupported: providerFullControlSupport.supported,\n fullControlDeniedReason,\n fullControlEffective: effectiveFullControl,\n })\n\n return {\n ok: true,\n policy: {\n adapterId,\n providerSupport,\n effectiveFullControl,\n fullControlDeniedReason,\n retryConfig: buildDefaultSubagentRetryConfig(),\n },\n }\n}\n", "const TERMINAL_STATUSES = new Set(['completed', 'failed', 'cancelled']);\nfunction normalizeStatus(value) {\n if (typeof value !== 'string')\n return 'unknown';\n const normalized = value.trim().toLowerCase();\n return normalized.length > 0 ? normalized : 'unknown';\n}\nfunction normalizeRunId(value) {\n if (typeof value !== 'string')\n return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\nfunction buildStatusMessage(status) {\n if (TERMINAL_STATUSES.has(status)) {\n return `Subagent run is already terminal (status: ${status}).`;\n }\n if (status === 'idle') {\n return 'No active subagent run to cancel.';\n }\n return `Subagent is not running (status: ${status}).`;\n}\nexport function resolveCancelRequest(input) {\n const status = normalizeStatus(input.subagent_status);\n const requestedRunId = normalizeRunId(input.requested_run_id);\n const activeRunId = normalizeRunId(input.active_run_id);\n if (!input.cancel_supported) {\n return {\n accepted: false,\n cancel_result: 'rejected',\n cancel_state: 'rejected',\n status,\n resolved_run_id: null,\n message: 'Cancellation request rejected for this subagent.',\n };\n }\n if (status !== 'running') {\n const cancelResult = TERMINAL_STATUSES.has(status)\n ? 'already_terminal'\n : status === 'idle'\n ? 'no_active_run'\n : 'rejected';\n return {\n accepted: false,\n cancel_result: cancelResult,\n cancel_state: 'none',\n status,\n resolved_run_id: null,\n message: buildStatusMessage(status),\n };\n }\n if (!activeRunId) {\n return {\n accepted: false,\n cancel_result: 'no_active_run',\n cancel_state: 'none',\n status,\n resolved_run_id: null,\n message: 'No active subagent run to cancel.',\n };\n }\n if (requestedRunId && requestedRunId !== activeRunId) {\n return {\n accepted: false,\n cancel_result: 'no_active_run',\n cancel_state: 'none',\n status,\n resolved_run_id: null,\n message: 'Requested run_id is not the active running subagent run.',\n };\n }\n return {\n accepted: true,\n cancel_result: 'accepted',\n cancel_state: 'requested',\n status,\n resolved_run_id: activeRunId,\n message: 'Cancel requested.',\n };\n}\nexport function buildRequestedCancelMetadata(input) {\n const base = input.base ?? {};\n return {\n ...base,\n cancel_run_id: input.run_id,\n cancel_requested_at: input.requested_at,\n cancel_reason: input.reason,\n cancel_state: 'requested',\n cancel_support: input.cancel_support ?? null,\n cancellation_scope: input.cancellation_scope ?? null,\n };\n}\n", "import {\n buildRequestedCancelMetadata,\n resolveCancelRequest,\n} from '@panorama/shared/subagents/cancel-orchestrator'\nimport { getSubagentCancelAdapter } from '@panorama/shared/subagents/registry'\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from './database.types.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport type { GatewayJobRow } from './gateway-jobs.js'\nimport { asJson } from './gateway-run-helpers.js'\nimport {\n getNextSubagentRunEventSequence,\n insertSubagentRunEvent,\n type SubagentRunEventLogger,\n} from './subagent-run-events.js'\n\nexport type SubagentCancelJobResult = {\n ok: boolean\n result: Record<string, unknown>\n error?: string\n}\n\nexport function parseSubagentCancelPayload(payload: Record<string, unknown>): {\n subagentId: string | null\n runId: string | null\n reason: string\n} {\n const subagentId =\n typeof payload.subagent_id === 'string'\n ? payload.subagent_id\n : typeof payload.subagentId === 'string'\n ? payload.subagentId\n : null\n const runId =\n typeof payload.run_id === 'string'\n ? payload.run_id\n : typeof payload.runId === 'string'\n ? payload.runId\n : null\n const reason =\n typeof payload.reason === 'string' && payload.reason.trim().length > 0\n ? payload.reason.trim()\n : 'Cancelled'\n\n return { subagentId, runId, reason }\n}\n\nexport async function handleSubagentCancelJob(params: {\n supabase: SupabaseClient<Database>\n config: GatewayConfig\n job: GatewayJobRow\n requestSubagentCancel: (\n subagentId: string,\n runId: string | null,\n reason: string\n ) => { active: boolean }\n logError?: SubagentRunEventLogger\n}): Promise<SubagentCancelJobResult> {\n const { supabase, config, job, requestSubagentCancel, logError } = params\n const payload = job.payload ?? {}\n const { subagentId, runId, reason } = parseSubagentCancelPayload(payload)\n\n if (!subagentId) {\n return {\n ok: false,\n result: { message: 'Missing subagent_id in payload' },\n error: 'Missing subagent_id in payload',\n }\n }\n\n const { data: subagent, error: subagentError } = await supabase\n .from('subagents')\n .select('id, team_id, gateway_id, subagent_type, status, metadata')\n .eq('id', subagentId)\n .maybeSingle()\n\n if (subagentError) {\n return {\n ok: false,\n result: { message: 'Failed to load subagent for cancellation', subagent_id: subagentId },\n error: subagentError.message,\n }\n }\n\n if (!subagent) {\n return {\n ok: true,\n result: {\n subagent_id: subagentId,\n run_id: runId,\n cancelled_active_run: false,\n reason,\n cancel_result: 'no_active_run',\n cancel_state: 'none',\n cancel_supported: false,\n status: 'not_found',\n message: 'Subagent not found; no active run to cancel.',\n },\n }\n }\n\n if (subagent.gateway_id !== config.gatewayId) {\n return {\n ok: true,\n result: {\n subagent_id: subagentId,\n run_id: runId,\n cancelled_active_run: false,\n reason,\n cancel_result: 'no_active_run',\n cancel_state: 'none',\n cancel_supported: false,\n status: 'running',\n message: 'Subagent is assigned to another gateway; skipping stale cancel request.',\n },\n }\n }\n\n const metadata = (subagent.metadata ?? {}) as Record<string, unknown>\n const status = typeof subagent.status === 'string' ? subagent.status : 'unknown'\n const hasGateway = !!subagent.gateway_id\n const cancelAdapter = getSubagentCancelAdapter(subagent.subagent_type)\n const cancelSupported =\n cancelAdapter.supported && (cancelAdapter.support !== 'gateway' || hasGateway)\n const cancelSupportMode = cancelAdapter.support\n const cancellationScope = cancelAdapter.scope\n\n let activeRun: { id: string; metadata: Record<string, unknown> | null } | null = null\n if (status === 'running') {\n const { data: runningRun, error: runningRunError } = await supabase\n .from('subagent_runs')\n .select('id, metadata')\n .eq('subagent_id', subagentId)\n .eq('status', 'running')\n .order('run_sequence', { ascending: false })\n .limit(1)\n .maybeSingle()\n\n if (runningRunError) {\n return {\n ok: false,\n result: {\n message: 'Failed to resolve active subagent run for cancellation',\n subagent_id: subagentId,\n },\n error: runningRunError.message,\n }\n }\n\n activeRun = runningRun as { id: string; metadata: Record<string, unknown> | null } | null\n }\n\n const resolution = resolveCancelRequest({\n subagent_status: status,\n requested_run_id: runId,\n active_run_id: activeRun?.id ?? null,\n cancel_supported: cancelSupported,\n })\n\n if (!resolution.accepted) {\n return {\n ok: true,\n result: {\n subagent_id: subagentId,\n run_id: resolution.resolved_run_id,\n active_run_id: activeRun?.id ?? null,\n cancelled_active_run: false,\n reason,\n cancel_result: resolution.cancel_result,\n cancel_state: resolution.cancel_state,\n cancel_supported: cancelSupported,\n status: resolution.status,\n message: resolution.message,\n },\n }\n }\n\n const resolvedRunId = resolution.resolved_run_id\n if (!resolvedRunId) {\n return {\n ok: false,\n result: {\n message: 'Cancel accepted without an active run_id',\n subagent_id: subagentId,\n },\n error: 'Cancel accepted without an active run_id',\n }\n }\n\n const nowIso = new Date().toISOString()\n const mergedMetadata = buildRequestedCancelMetadata({\n base: metadata,\n run_id: resolvedRunId,\n reason,\n requested_at: nowIso,\n cancel_support: cancelSupportMode,\n cancellation_scope: cancellationScope,\n })\n\n const { data: updatedSubagent, error: subagentUpdateError } = await supabase\n .from('subagents')\n .update({\n metadata: asJson(mergedMetadata),\n })\n .eq('status', 'running')\n .eq('id', subagentId)\n .select('id')\n .maybeSingle()\n\n if (subagentUpdateError) {\n return {\n ok: false,\n result: {\n message: 'Failed to persist subagent cancellation metadata',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n },\n error: subagentUpdateError.message,\n }\n }\n\n if (!updatedSubagent) {\n const { data: latestSubagent, error: latestSubagentError } = await supabase\n .from('subagents')\n .select('status')\n .eq('id', subagentId)\n .maybeSingle()\n\n if (latestSubagentError) {\n return {\n ok: false,\n result: {\n message: 'Failed to refresh subagent status after cancel race',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n },\n error: latestSubagentError.message,\n }\n }\n\n const latestStatus = typeof latestSubagent?.status === 'string' ? latestSubagent.status : status\n let latestActiveRunId: string | null = null\n if (latestStatus === 'running') {\n const { data: latestRunningRun, error: latestRunningRunError } = await supabase\n .from('subagent_runs')\n .select('id')\n .eq('subagent_id', subagentId)\n .eq('status', 'running')\n .order('run_sequence', { ascending: false })\n .limit(1)\n .maybeSingle()\n\n if (latestRunningRunError) {\n return {\n ok: false,\n result: {\n message: 'Failed to refresh active subagent run after cancel race',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n },\n error: latestRunningRunError.message,\n }\n }\n\n latestActiveRunId = latestRunningRun?.id ?? null\n }\n\n const latestResolution = resolveCancelRequest({\n subagent_status: latestStatus,\n requested_run_id: runId,\n active_run_id: latestActiveRunId,\n cancel_supported: cancelSupported,\n })\n\n return {\n ok: true,\n result: {\n subagent_id: subagentId,\n run_id: latestResolution.resolved_run_id,\n cancelled_active_run: false,\n reason,\n cancel_result: latestResolution.cancel_result,\n cancel_state: latestResolution.cancel_state,\n cancel_supported: cancelSupported,\n status: latestResolution.status,\n message: latestResolution.message,\n },\n }\n }\n\n if (activeRun) {\n const runMetadata = (activeRun.metadata ?? {}) as Record<string, unknown>\n const { error: runUpdateError } = await supabase\n .from('subagent_runs')\n .update({\n metadata: asJson(\n buildRequestedCancelMetadata({\n base: runMetadata,\n run_id: resolvedRunId,\n reason,\n requested_at: nowIso,\n cancel_support: cancelSupportMode,\n cancellation_scope: cancellationScope,\n })\n ),\n })\n .eq('id', resolvedRunId)\n .eq('status', 'running')\n\n if (runUpdateError) {\n return {\n ok: false,\n result: {\n message: 'Failed to persist run cancellation metadata',\n subagent_id: subagentId,\n run_id: resolvedRunId,\n },\n error: runUpdateError.message,\n }\n }\n }\n\n const { active } = requestSubagentCancel(subagentId, resolvedRunId, reason)\n\n if (activeRun) {\n const nextEventSequence = await getNextSubagentRunEventSequence(\n supabase,\n resolvedRunId,\n logError\n )\n await insertSubagentRunEvent({\n supabase,\n runId: resolvedRunId,\n subagentId,\n teamId: subagent.team_id,\n gatewayId: subagent.gateway_id,\n sequence: nextEventSequence,\n eventType: 'cancellation_requested',\n payload: {\n reason,\n source: 'gateway_cancel_job',\n active_process: active,\n cancel_state: 'requested',\n },\n logError,\n })\n }\n\n return {\n ok: true,\n result: {\n subagent_id: subagentId,\n run_id: resolvedRunId,\n cancelled_active_run: active,\n reason,\n cancel_result: 'accepted',\n cancel_state: 'requested',\n cancel_supported: cancelSupported,\n status: resolution.status,\n message:\n cancelSupportMode === 'gateway'\n ? 'Cancel requested and forwarded to gateway.'\n : 'Cancel requested. Worker will stop the run on its next cancellation check.',\n },\n }\n}\n", "import {\n getSubagentExecutionContext,\n getSubagentTypeDefinition,\n} from '@panorama/shared/subagents/registry'\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from './database.types.js'\nimport { asJson } from './gateway-run-helpers.js'\nimport type { GatewayJobRow } from './gateway-jobs.js'\nimport { SUBAGENT_SCHEMA_VERSION } from './subagent-adapters/types.js'\nimport { getNextSubagentRunEventSequence, insertSubagentRunEvent } from './subagent-run-events.js'\nimport { buildErrorOutput, mergeMetadata } from './subagent-run-helpers.js'\n\nexport type SubagentFailureLogger = (\n message: string,\n data?: Record<string, unknown>\n) => void\n\nexport async function failSubagentRun(params: {\n supabase: SupabaseClient<Database>\n job: GatewayJobRow\n errorMessage: string\n logError?: SubagentFailureLogger\n}): Promise<void> {\n const { supabase, job, errorMessage, logError = () => {} } = params\n const payload = job.payload ?? {}\n const subagentId =\n typeof payload.subagent_id === 'string'\n ? payload.subagent_id\n : typeof payload.subagentId === 'string'\n ? payload.subagentId\n : null\n\n if (!subagentId) return\n\n const { data: subagent } = await supabase\n .from('subagents')\n .select('id, status, subagent_type, metadata, team_id, gateway_id')\n .eq('id', subagentId)\n .maybeSingle()\n\n if (!subagent) return\n if (subagent.status !== 'running') return\n\n const nowIso = new Date().toISOString()\n const definition = getSubagentTypeDefinition(subagent.subagent_type)\n const executionContext = definition\n ? getSubagentExecutionContext(definition)\n : getSubagentExecutionContext({ runner: 'gateway' })\n const metadataUpdate: Record<string, unknown> = {\n schema_version: SUBAGENT_SCHEMA_VERSION,\n runner: 'gateway',\n subagent_type: subagent.subagent_type,\n last_run_at: nowIso,\n gateway_error: errorMessage,\n ...executionContext,\n }\n\n const mergedMetadata = mergeMetadata(\n (subagent.metadata ?? {}) as Record<string, unknown>,\n metadataUpdate\n )\n const failureOutput = buildErrorOutput(errorMessage)\n\n const { data: runningRun } = await supabase\n .from('subagent_runs')\n .select('id, run_sequence')\n .eq('subagent_id', subagent.id)\n .eq('status', 'running')\n .order('run_sequence', { ascending: false })\n .limit(1)\n .maybeSingle()\n\n if (runningRun?.id) {\n const { error: runFailUpdateError } = await supabase\n .from('subagent_runs')\n .update({\n status: 'failed',\n error: errorMessage,\n output: asJson(failureOutput),\n completed_at: nowIso,\n metadata: asJson(mergedMetadata),\n })\n .eq('id', runningRun.id)\n .eq('status', 'running')\n\n if (runFailUpdateError) {\n logError('Failed to mark running subagent run as failed after gateway error', {\n subagentId,\n runId: runningRun.id,\n error: runFailUpdateError.message,\n })\n }\n\n if (subagent.gateway_id) {\n const nextSequence = await getNextSubagentRunEventSequence(\n supabase,\n runningRun.id,\n logError\n )\n await insertSubagentRunEvent({\n supabase,\n runId: runningRun.id,\n subagentId: subagent.id,\n teamId: subagent.team_id,\n gatewayId: subagent.gateway_id,\n sequence: nextSequence,\n eventType: 'run_failed',\n payload: { reason: errorMessage, source: 'gateway_job_failure' },\n logError,\n })\n }\n }\n\n const { error } = await supabase\n .from('subagents')\n .update({\n status: 'failed',\n error: errorMessage,\n completed_at: nowIso,\n output: asJson(failureOutput),\n metadata: asJson(mergedMetadata),\n })\n .eq('id', subagent.id)\n\n if (error) {\n logError('Failed to mark subagent as failed after gateway error', {\n subagentId,\n error: error.message,\n })\n }\n}\n", "import {\n GATEWAY_CAPABILITIES_SCHEMA_VERSION as DEFAULT_GATEWAY_CAPABILITIES_SCHEMA_VERSION,\n type GatewayCapabilitiesV1,\n} from '@panorama/shared/gateway/capabilities'\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport os from 'node:os'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { getStringOption, type ParsedArgs } from './cli-args.js'\nimport {\n getDefaultClaudePath,\n probeCommandVersion,\n probeShellResolution,\n selectBestCommand,\n} from './cli-provider-commands.js'\nimport type {\n GatewayHealthStatus,\n GatewayProviderCapabilities,\n GatewayProviderHealth,\n GatewayProviderId,\n} from './cli-providers/types.js'\nimport type { CliDetail } from './cli-output.js'\nimport type { Database } from './database.types.js'\nimport {\n buildGatewayProviderCapabilities,\n type GatewayProviderCapabilityProgressEvent,\n type GatewayProviderValidationCommandRunner,\n type ProviderValidationMode,\n} from './gateway-provider-capabilities.js'\nimport { buildProviderHealthEventPayloads } from './gateway-provider-health.js'\nimport { updateRuntimeProviderHealth as updateRuntimeProviderHealthBase } from './gateway-runtime-provider-health.js'\nimport {\n resolveClaudeProviderCommand,\n resolveCodexProviderCommand,\n resolveGeminiProviderCommand,\n} from './provider-runtime-utils.js'\nimport type { GatewayRuntimeState } from './gateway-runtime-state.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport type { ClaudeSupport } from './subagent-adapters/claude-support.js'\n\ntype GatewaySupabaseClient = SupabaseClient<Database>\ntype GatewayStatus = 'pending' | 'ready' | 'offline' | 'error'\n\nexport interface GatewayProviderRuntimeEventPayload {\n level: 'info' | 'warn' | 'error'\n code?: string\n message: string\n provider?: string\n details?: Record<string, unknown>\n}\n\nexport interface GatewayProviderRuntimeBuildCapabilitiesParams {\n validationMode?: ProviderValidationMode\n previousHealth?: Partial<Record<GatewayProviderId, GatewayProviderHealth>>\n deviceName?: string | null\n installFullControlEnabled?: boolean\n onProgress?: (event: GatewayProviderCapabilityProgressEvent) => void\n}\n\nexport interface GatewayProviderRuntimeBuildCapabilitiesResult {\n capabilities: GatewayCapabilitiesV1\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>\n anyProviderReady: boolean\n}\n\nexport interface GatewayProviderRuntimeDependencies {\n runtimeState: GatewayRuntimeState<GatewayProviderRuntimeEventPayload>\n getActiveOptions: (options?: ParsedArgs['options']) => ParsedArgs['options']\n isVerbose: (options?: ParsedArgs['options']) => boolean\n buildGatewayChildEnv: () => NodeJS.ProcessEnv\n runCommand: GatewayProviderValidationCommandRunner\n readGatewayVersion: () => Promise<string | null>\n saveConfig: (config: GatewayConfig) => Promise<void>\n sendHeartbeat: (\n supabase: GatewaySupabaseClient,\n status: GatewayStatus,\n capabilities: GatewayCapabilitiesV1,\n deviceName?: string | null\n ) => Promise<void>\n emitGatewayEvent: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n payload: GatewayProviderRuntimeEventPayload\n ) => Promise<void>\n cliWarn: (\n message: string,\n options?: ParsedArgs['options'],\n details?: CliDetail[]\n ) => void\n logInfo: (message: string, data?: Record<string, unknown>) => void\n logWarn: (message: string, data?: Record<string, unknown>) => void\n logError: (message: string, data?: Record<string, unknown>) => void\n expectedCapabilitiesSchemaVersion?: typeof DEFAULT_GATEWAY_CAPABILITIES_SCHEMA_VERSION\n buildProviderCapabilities?: typeof buildGatewayProviderCapabilities\n env?: NodeJS.ProcessEnv\n homeDir?: () => string\n}\n\nexport interface GatewayProviderRuntime {\n resolveClaudeCommand: (options?: ParsedArgs['options']) => string\n resolveCodexCommand: (options?: ParsedArgs['options']) => string\n resolveGeminiCommand: (options?: ParsedArgs['options']) => string\n discoverCliCommands: (options?: ParsedArgs['options']) => Promise<void>\n buildCapabilities: (\n params?: GatewayProviderRuntimeBuildCapabilitiesParams\n ) => Promise<GatewayProviderRuntimeBuildCapabilitiesResult>\n updateRuntimeProviderHealth: (params: {\n supabase: GatewaySupabaseClient\n providerId: GatewayProviderId\n status: GatewayHealthStatus\n error?: string | null\n context: string\n jobId?: string\n runId?: string\n }) => Promise<void>\n emitProviderHealthEvents: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>,\n context: string\n ) => Promise<void>\n getProviderCapabilities: () => Record<GatewayProviderId, GatewayProviderCapabilities> | null\n getClaudeSupport: () => ClaudeSupport | null\n}\n\nexport function createGatewayProviderRuntime(\n dependencies: GatewayProviderRuntimeDependencies\n): GatewayProviderRuntime {\n const buildProviderCapabilities =\n dependencies.buildProviderCapabilities ?? buildGatewayProviderCapabilities\n const expectedCapabilitiesSchemaVersion =\n dependencies.expectedCapabilitiesSchemaVersion ?? DEFAULT_GATEWAY_CAPABILITIES_SCHEMA_VERSION\n const env = dependencies.env ?? process.env\n const homeDir = dependencies.homeDir ?? os.homedir\n let providerCapabilities: Record<GatewayProviderId, GatewayProviderCapabilities> | null = null\n let claudeSupport: ClaudeSupport | null = null\n\n const resolveClaudeCommand = (options?: ParsedArgs['options']): string => {\n return resolveClaudeProviderCommand({\n options: dependencies.getActiveOptions(options),\n env,\n homeDir: homeDir(),\n logInfo: dependencies.logInfo,\n })\n }\n\n const resolveCodexCommand = (options?: ParsedArgs['options']): string => {\n return resolveCodexProviderCommand({\n options: dependencies.getActiveOptions(options),\n env,\n })\n }\n\n const resolveGeminiCommand = (options?: ParsedArgs['options']): string => {\n return resolveGeminiProviderCommand({\n options: dependencies.getActiveOptions(options),\n env,\n })\n }\n\n const discoverCliCommands = async (options?: ParsedArgs['options']): Promise<void> => {\n const resolvedOptions = dependencies.getActiveOptions(options)\n const warnShellResolution = async (\n label: string,\n command: string,\n envKey: string,\n cliFlag: string,\n source: 'override' | 'detected' | 'fallback',\n override?: string\n ): Promise<void> => {\n if (override || source !== 'fallback') return\n const resolution = await probeShellResolution(command, { shell: env.SHELL })\n if (!resolution) return\n const hint =\n resolution.kind === 'path'\n ? `Your shell resolves \"${command}\" to ${resolution.path}, but the gateway could not find it in PATH.`\n : `Your shell defines \"${command}\" as a ${resolution.kind}, but the gateway does not load shell aliases.`\n dependencies.cliWarn(`${label} CLI not found in PATH. ${hint}`, resolvedOptions, [\n { label: 'Shell', value: env.SHELL ?? 'unknown', verboseOnly: true },\n { label: 'Shell resolution', value: resolution.detail, verboseOnly: true },\n { label: 'Fix', value: `Set ${envKey} or pass ${cliFlag}.` },\n ])\n }\n\n const claudeOverride =\n getStringOption(resolvedOptions, 'claude-cli') ||\n env.PANORAMA_CLAUDE_CLI ||\n env.CLAUDE_CLI\n const codexOverride =\n getStringOption(resolvedOptions, 'codex-cli') ||\n env.PANORAMA_CODEX_CLI ||\n env.CODEX_CLI\n const geminiOverride =\n getStringOption(resolvedOptions, 'gemini-cli') ||\n env.PANORAMA_GEMINI_CLI ||\n env.GEMINI_CLI\n\n const probeGatewayCommandVersion = (command: string) =>\n probeCommandVersion(command, { env: dependencies.buildGatewayChildEnv() })\n const selectGatewayCommand = (params: {\n label: string\n command: string\n override?: string\n extraCandidates?: string[]\n }) =>\n selectBestCommand({\n ...params,\n discoveryOptions: { env, homeDir: homeDir() },\n probeCommand: probeGatewayCommandVersion,\n logInfo: dependencies.logInfo,\n })\n\n const claudeResult = await selectGatewayCommand({\n label: 'Claude',\n command: 'claude',\n override: claudeOverride,\n extraCandidates: [getDefaultClaudePath(homeDir()), path.join(homeDir(), '.claude', 'claude')],\n })\n const codexResult = await selectGatewayCommand({\n label: 'Codex',\n command: 'codex',\n override: codexOverride,\n })\n const geminiResult = await selectGatewayCommand({\n label: 'Gemini',\n command: 'gemini',\n override: geminiOverride,\n })\n\n await warnShellResolution(\n 'Claude',\n 'claude',\n 'PANORAMA_CLAUDE_CLI',\n '--claude-cli <path>',\n claudeResult.source,\n claudeOverride\n )\n await warnShellResolution(\n 'Codex',\n 'codex',\n 'PANORAMA_CODEX_CLI',\n '--codex-cli <path>',\n codexResult.source,\n codexOverride\n )\n await warnShellResolution(\n 'Gemini',\n 'gemini',\n 'PANORAMA_GEMINI_CLI',\n '--gemini-cli <path>',\n geminiResult.source,\n geminiOverride\n )\n\n if (!claudeOverride) {\n env.PANORAMA_CLAUDE_CLI = claudeResult.command\n }\n if (!codexOverride) {\n env.PANORAMA_CODEX_CLI = codexResult.command\n }\n if (!geminiOverride) {\n env.PANORAMA_GEMINI_CLI = geminiResult.command\n }\n\n if (dependencies.isVerbose(resolvedOptions)) {\n dependencies.logInfo('Gateway CLI discovery results', {\n claude: claudeResult,\n codex: codexResult,\n gemini: geminiResult,\n })\n }\n }\n\n const buildCapabilities = async (\n params?: GatewayProviderRuntimeBuildCapabilitiesParams\n ): Promise<GatewayProviderRuntimeBuildCapabilitiesResult> => {\n const result = await buildProviderCapabilities({\n ...params,\n runCommand: dependencies.runCommand,\n readGatewayVersion: dependencies.readGatewayVersion,\n })\n providerCapabilities = result.providerCapabilities\n if (result.claudeSupport) {\n claudeSupport = result.claudeSupport\n }\n if (result.capabilities.schema_version !== expectedCapabilitiesSchemaVersion) {\n dependencies.logWarn('Gateway capability schema version mismatch', {\n expected: expectedCapabilitiesSchemaVersion,\n actual: result.capabilities.schema_version,\n })\n }\n return {\n capabilities: result.capabilities,\n providerHealth: result.providerHealth,\n anyProviderReady: result.anyProviderReady,\n }\n }\n\n const updateRuntimeProviderHealth = async (params: {\n supabase: GatewaySupabaseClient\n providerId: GatewayProviderId\n status: GatewayHealthStatus\n error?: string | null\n context: string\n jobId?: string\n runId?: string\n }): Promise<void> => {\n await updateRuntimeProviderHealthBase({\n state: dependencies.runtimeState,\n providerCapabilities,\n providerId: params.providerId,\n status: params.status,\n error: params.error,\n context: params.context,\n jobId: params.jobId,\n runId: params.runId,\n saveConfig: dependencies.saveConfig,\n sendHeartbeat: (status, capabilities, deviceName) =>\n dependencies.sendHeartbeat(params.supabase, status, capabilities, deviceName),\n emitGatewayEvent: (config, payload) =>\n dependencies.emitGatewayEvent(params.supabase, config, payload),\n logError: dependencies.logError,\n })\n }\n\n const emitProviderHealthEvents = async (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>,\n context: string\n ): Promise<void> => {\n const payloads = buildProviderHealthEventPayloads(providerHealth, context)\n for (const payload of payloads) {\n await dependencies.emitGatewayEvent(supabase, config, {\n level: payload.level,\n code: payload.code,\n provider: payload.provider,\n message: payload.message,\n details: payload.details,\n })\n }\n }\n\n return {\n resolveClaudeCommand,\n resolveCodexCommand,\n resolveGeminiCommand,\n discoverCliCommands,\n buildCapabilities,\n updateRuntimeProviderHealth,\n emitProviderHealthEvents,\n getProviderCapabilities: () => providerCapabilities,\n getClaudeSupport: () => claudeSupport,\n }\n}\n", "import {\n GATEWAY_CAPABILITIES_SCHEMA_VERSION,\n type GatewayCapabilitiesV1,\n type GatewayHostCapabilities,\n type GatewayRuntimeInfo,\n} from '@panorama/shared/gateway/capabilities'\nimport { randomUUID } from 'node:crypto'\nimport process from 'node:process'\nimport { listGatewayCliProviders } from './cli-providers/registry.js'\nimport {\n DEFAULT_MODEL_SENTINEL,\n type GatewayCliProvider,\n type GatewayHealthStatus,\n type GatewayProviderCapabilities,\n type GatewayProviderHealth,\n type GatewayProviderId,\n} from './cli-providers/types.js'\nimport {\n deriveGatewayServiceCapabilities,\n hasReadyGatewayModelProvider,\n} from './gateway-capability-services.js'\nimport {\n runGatewayCommand,\n type GatewayCommandRunOptions,\n type GatewayCommandResult,\n} from './gateway-command-runner.js'\nimport {\n assertSafeOutputPath,\n cleanupWorkDir,\n createWorkDir,\n resolveRunPlanEnv,\n writeRunPlanFiles,\n} from './gateway-run-helpers.js'\nimport { resolveValidationWorkdirRoot } from './runtime-paths.js'\nimport {\n coerceClaudeSupport,\n type ClaudeSupport,\n} from './subagent-adapters/claude-support.js'\n\nconst PROVIDER_VALIDATION_TIMEOUT_MS = 30_000\nconst PROVIDER_VALIDATION_PROMPT = 'Say hi.'\nconst PROVIDER_VALIDATION_SCHEMA = {\n type: 'object',\n required: ['message'],\n properties: {\n message: { type: 'string' },\n },\n additionalProperties: false,\n}\nconst PROVIDER_VALIDATION_MODEL = DEFAULT_MODEL_SENTINEL\n\nexport type ProviderValidationMode = 'full' | 'light' | 'auto'\n\nexport interface GatewayProviderCapabilityProgressEvent {\n stage: 'start' | 'complete'\n providerId: GatewayProviderId\n status?: GatewayHealthStatus\n durationMs?: number\n error?: string\n}\n\nexport type GatewayProviderValidationCommandRunner = (\n command: string,\n args: string[],\n options: GatewayCommandRunOptions\n) => Promise<GatewayCommandResult>\n\nexport interface GatewayProviderCapabilitiesResult {\n capabilities: GatewayCapabilitiesV1\n providerCapabilities: Record<GatewayProviderId, GatewayProviderCapabilities>\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>\n anyProviderReady: boolean\n claudeSupport: ClaudeSupport | null\n}\n\nexport function coerceGatewayHealthStatus(\n value: GatewayHealthStatus | undefined\n): GatewayHealthStatus {\n if (\n value === 'healthy' ||\n value === 'unhealthy' ||\n value === 'unknown' ||\n value === 'unavailable'\n ) {\n return value\n }\n return 'unknown'\n}\n\nexport async function runProviderValidation(params: {\n provider: GatewayCliProvider\n model?: string\n runCommand?: GatewayProviderValidationCommandRunner\n workRoot?: string\n createRunId?: () => string\n}): Promise<{ ok: boolean; durationMs: number; error?: string }> {\n const {\n provider,\n model = PROVIDER_VALIDATION_MODEL,\n runCommand = runGatewayCommand,\n workRoot = resolveValidationWorkdirRoot(),\n createRunId = randomUUID,\n } = params\n const workDir = await createWorkDir(workRoot, [\n { value: provider.id, label: 'provider id' },\n { value: createRunId(), label: 'validation run id' },\n ])\n\n try {\n const runPlan = provider.buildModelRunPlan({\n model,\n prompt: PROVIDER_VALIDATION_PROMPT,\n jsonSchema: PROVIDER_VALIDATION_SCHEMA,\n timeoutMs: PROVIDER_VALIDATION_TIMEOUT_MS,\n })\n\n assertSafeOutputPath(workDir, runPlan.outputPath)\n await writeRunPlanFiles(workDir, runPlan.files)\n\n const runResult = await runCommand(runPlan.command, runPlan.args, {\n timeoutMs: runPlan.timeoutMs ?? PROVIDER_VALIDATION_TIMEOUT_MS,\n cwd: workDir,\n env: resolveRunPlanEnv(runPlan.env, workDir),\n })\n\n if (!runResult.ok) {\n return {\n ok: false,\n durationMs: runResult.durationMs,\n error: runResult.error || runResult.stderr || 'Provider validation failed',\n }\n }\n\n try {\n provider.normalizeModelRunResult({\n stdout: runResult.stdout,\n outputFormat: runPlan.outputFormat,\n outputMode: runPlan.outputMode,\n outputPath: runPlan.outputPath,\n workDir,\n })\n } catch (error) {\n return {\n ok: false,\n durationMs: runResult.durationMs,\n error: error instanceof Error ? error.message : 'Failed to parse validation output',\n }\n }\n\n return { ok: true, durationMs: runResult.durationMs }\n } finally {\n await cleanupWorkDir(workDir, workRoot)\n }\n}\n\nexport async function resolveProviderHealth(params: {\n provider: GatewayCliProvider\n capability: GatewayProviderCapabilities\n mode: ProviderValidationMode\n previous?: GatewayProviderHealth\n runValidation?: (\n provider: GatewayCliProvider,\n model: string\n ) => Promise<{ ok: boolean; durationMs: number; error?: string }>\n now?: () => Date\n}): Promise<GatewayProviderHealth> {\n const { provider, capability, mode, previous } = params\n const now = (params.now ?? (() => new Date()))().toISOString()\n const lastFullCheckedAt = previous?.last_full_checked_at\n const lastFullStatus = previous?.last_full_status\n\n if (!capability.available) {\n return {\n status: 'unavailable',\n check_type: mode === 'full' ? 'full' : 'light',\n checked_at: now,\n last_full_checked_at: lastFullCheckedAt,\n last_full_status: lastFullStatus,\n error: capability.error ?? previous?.error,\n }\n }\n\n const shouldRunFull =\n mode === 'full' || (mode === 'auto' && (!lastFullCheckedAt || !lastFullStatus))\n\n if (shouldRunFull) {\n const model = PROVIDER_VALIDATION_MODEL\n const validation = await (params.runValidation ?? ((nextProvider, nextModel) =>\n runProviderValidation({ provider: nextProvider, model: nextModel })))(provider, model)\n const status: GatewayHealthStatus = validation.ok ? 'healthy' : 'unhealthy'\n return {\n status,\n check_type: 'full',\n checked_at: now,\n last_full_checked_at: now,\n last_full_status: status,\n error: validation.ok ? undefined : validation.error,\n model: model === DEFAULT_MODEL_SENTINEL ? undefined : model,\n duration_ms: validation.durationMs,\n }\n }\n\n const fallbackStatus = coerceGatewayHealthStatus(lastFullStatus)\n const previousStatus = previous?.status ? coerceGatewayHealthStatus(previous.status) : undefined\n\n return {\n status: previousStatus ?? fallbackStatus,\n check_type: 'light',\n checked_at: now,\n last_full_checked_at: lastFullCheckedAt,\n last_full_status: lastFullStatus,\n error: capability.error ?? previous?.error,\n }\n}\n\nexport async function buildGatewayProviderCapabilities(params?: {\n validationMode?: ProviderValidationMode\n previousHealth?: Partial<Record<GatewayProviderId, GatewayProviderHealth>>\n deviceName?: string | null\n installFullControlEnabled?: boolean\n onProgress?: (event: GatewayProviderCapabilityProgressEvent) => void\n providers?: GatewayCliProvider[]\n runCommand?: GatewayProviderValidationCommandRunner\n readGatewayVersion?: () => Promise<string | null>\n now?: () => Date\n platform?: string\n arch?: string\n nodeVersion?: string\n}): Promise<GatewayProviderCapabilitiesResult> {\n const validationMode = params?.validationMode ?? 'light'\n const previousHealth =\n params?.previousHealth ?? ({} as Partial<Record<GatewayProviderId, GatewayProviderHealth>>)\n const providers = params?.providers ?? listGatewayCliProviders()\n const progress = params?.onProgress\n const entries = await Promise.all(\n providers.map(async (provider) => {\n progress?.({ stage: 'start', providerId: provider.id })\n const startedAt = Date.now()\n try {\n const capability = await provider.detectCapabilities()\n const health = await resolveProviderHealth({\n provider,\n capability,\n mode: validationMode,\n previous: previousHealth[provider.id],\n runValidation: (nextProvider, model) =>\n runProviderValidation({\n provider: nextProvider,\n model,\n runCommand: params?.runCommand,\n }),\n now: params?.now,\n })\n progress?.({\n stage: 'complete',\n providerId: provider.id,\n status: health.status,\n durationMs: Date.now() - startedAt,\n error: health.error,\n })\n return [provider.id, { ...capability, health }] as const\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n progress?.({\n stage: 'complete',\n providerId: provider.id,\n status: 'unavailable',\n durationMs: Date.now() - startedAt,\n error: message,\n })\n return [\n provider.id,\n {\n available: false,\n error: message,\n supports: { output_schema: false, stream_json: false, tool_disable: false },\n health: {\n status: 'unavailable',\n check_type: validationMode === 'full' ? 'full' : 'light',\n checked_at: (params?.now ?? (() => new Date()))().toISOString(),\n error: message,\n },\n } satisfies GatewayProviderCapabilities,\n ] as const\n }\n })\n )\n\n const providerCapabilities = entries.reduce(\n (acc, [id, capability]) => {\n acc[id] = capability\n return acc\n },\n {} as Record<GatewayProviderId, GatewayProviderCapabilities>\n )\n\n const providerHealth = Object.fromEntries(\n Object.entries(providerCapabilities).map(([id, capability]) => [\n id,\n capability.health ??\n ({\n status: 'unknown',\n check_type: validationMode === 'full' ? 'full' : 'light',\n checked_at: (params?.now ?? (() => new Date()))().toISOString(),\n } as GatewayProviderHealth),\n ])\n ) as Record<GatewayProviderId, GatewayProviderHealth>\n\n const claudeCapabilities = providerCapabilities.claude_code\n const claudeSupport = claudeCapabilities?.supported_flags\n ? coerceClaudeSupport(\n claudeCapabilities.supported_flags as Record<string, boolean> | undefined\n )\n : null\n\n const anyProviderReady = hasReadyGatewayModelProvider(providerCapabilities)\n const gatewayVersion = await (params?.readGatewayVersion?.() ?? Promise.resolve(null))\n\n const runtime: GatewayRuntimeInfo = {\n platform: params?.platform ?? process.platform,\n arch: params?.arch ?? process.arch,\n node_version: params?.nodeVersion ?? process.version,\n ...(gatewayVersion ? { gateway_version: gatewayVersion } : {}),\n }\n\n const host: GatewayHostCapabilities = {\n kind: 'gateway',\n available: true,\n }\n\n if (params?.deviceName) {\n host.label = params.deviceName\n }\n host.metadata = {\n install_full_control_enabled: params?.installFullControlEnabled === true,\n }\n\n return {\n capabilities: {\n schema_version: GATEWAY_CAPABILITIES_SCHEMA_VERSION,\n providers: providerCapabilities,\n hosts: { gateway: host },\n services: deriveGatewayServiceCapabilities({\n providers: providerCapabilities,\n host,\n installFullControlEnabled: params?.installFullControlEnabled === true,\n }),\n runtime,\n },\n providerCapabilities,\n providerHealth,\n anyProviderReady,\n claudeSupport,\n }\n}\n", "import type { GatewayCapabilitiesV1 } from '@panorama/shared/gateway/capabilities'\nimport type { GatewayProviderCapabilities } from './cli-providers/types.js'\n\nexport function isGatewayProviderReady(entry?: GatewayProviderCapabilities): boolean {\n if (!entry) return false\n if (entry.health?.status === 'healthy') return true\n if (!entry.available) return false\n if (!entry.health) return true\n return entry.health.status !== 'unavailable' && entry.health.status !== 'unhealthy'\n}\n\nexport function hasReadyGatewayModelProvider(\n providers: Record<string, GatewayProviderCapabilities>\n): boolean {\n return Object.values(providers).some((entry) => isGatewayProviderReady(entry))\n}\n\nexport function deriveGatewayServiceCapabilities(params: {\n providers: Record<string, GatewayProviderCapabilities>\n host: GatewayCapabilitiesV1['hosts']['gateway']\n installFullControlEnabled?: boolean\n}): GatewayCapabilitiesV1['services'] {\n const anyProviderReady = hasReadyGatewayModelProvider(params.providers)\n const installFullControlEnabled =\n params.installFullControlEnabled ??\n (params.host.metadata?.install_full_control_enabled === true)\n\n return {\n model_execution: {\n ready: anyProviderReady,\n reason: anyProviderReady ? undefined : 'No gateway AI model provider is healthy',\n },\n remote_shell: {\n ready: params.host.available,\n reason: params.host.available\n ? undefined\n : (params.host.error ?? 'Gateway host is unavailable'),\n },\n machine_control: {\n ready: params.host.available && installFullControlEnabled,\n reason:\n params.host.available && installFullControlEnabled\n ? undefined\n : !params.host.available\n ? (params.host.error ?? 'Gateway host is unavailable')\n : 'Gateway host machine control is disabled',\n },\n }\n}\n", "import {\n isGatewayHostAvailable,\n type GatewayCapabilitiesV1,\n} from '@panorama/shared/gateway/capabilities'\nimport type { GatewayProviderCapabilities } from './cli-providers/types.js'\nimport { isGatewayProviderReady } from './gateway-capability-services.js'\n\nexport interface GatewayJobIngressState {\n pending: boolean\n ready: boolean\n}\n\nexport type GatewayOperationalStatus = 'pending' | 'ready' | 'error'\n\nexport function isProviderReady(entry?: GatewayProviderCapabilities): boolean {\n return isGatewayProviderReady(entry)\n}\n\nexport function computeGatewayStatusFromCapabilities(\n providers: Record<string, GatewayProviderCapabilities>\n): GatewayOperationalStatus {\n const anyReady = Object.values(providers).some((entry) => isProviderReady(entry))\n return anyReady ? 'ready' : 'error'\n}\n\nexport function computeGatewayOperationalStatus(params: {\n capabilities: GatewayCapabilitiesV1 | null\n jobIngressState: GatewayJobIngressState | null\n acceptingJobs: boolean\n}): GatewayOperationalStatus {\n if (!params.capabilities) return 'pending'\n\n if (!isGatewayHostAvailable(params.capabilities)) {\n return 'error'\n }\n\n if (!params.acceptingJobs) {\n return 'pending'\n }\n\n if (!params.jobIngressState || params.jobIngressState.pending) {\n return 'pending'\n }\n\n return params.jobIngressState.ready ? 'ready' : 'error'\n}\n", "import type { GatewayCapabilitiesV1 } from '@panorama/shared/gateway/capabilities'\nimport type {\n GatewayHealthStatus,\n GatewayProviderCapabilities,\n GatewayProviderHealth,\n GatewayProviderId,\n} from './cli-providers/types.js'\nimport { computeGatewayOperationalStatus } from './gateway-operational-status.js'\nimport { deriveGatewayServiceCapabilities } from './gateway-capability-services.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport {\n formatProviderLabel,\n normalizeProviderErrorSummary,\n} from './gateway-provider-health.js'\nimport type { GatewayRuntimeState } from './gateway-runtime-state.js'\n\nexport type GatewayRuntimeProviderHealthEvent = {\n level: 'info' | 'warn' | 'error'\n code?: string\n message: string\n provider?: string\n details?: Record<string, unknown>\n}\n\nexport function resolveRuntimeProviderHealth(params: {\n state: GatewayRuntimeState<unknown>\n providerCapabilities: Record<GatewayProviderId, GatewayProviderCapabilities> | null\n providerId: GatewayProviderId\n}): GatewayProviderHealth | undefined {\n const { state, providerCapabilities, providerId } = params\n if (state.currentProviderHealth && state.currentProviderHealth[providerId]) {\n return state.currentProviderHealth[providerId]\n }\n const fromConfig = state.currentConfig?.providerHealth?.[providerId]\n if (fromConfig) return fromConfig\n return providerCapabilities?.[providerId]?.health\n}\n\nexport async function updateRuntimeProviderHealth(params: {\n state: GatewayRuntimeState<unknown>\n providerCapabilities: Record<GatewayProviderId, GatewayProviderCapabilities> | null\n providerId: GatewayProviderId\n status: GatewayHealthStatus\n error?: string | null\n context: string\n jobId?: string\n runId?: string\n saveConfig: (config: GatewayConfig) => Promise<void>\n sendHeartbeat: (\n status: 'pending' | 'ready' | 'offline' | 'error',\n capabilities: GatewayCapabilitiesV1,\n deviceName?: string | null\n ) => Promise<void>\n emitGatewayEvent: (\n config: GatewayConfig,\n payload: GatewayRuntimeProviderHealthEvent\n ) => Promise<void>\n logError: (message: string, data?: Record<string, unknown>) => void\n}): Promise<void> {\n const { state, providerCapabilities } = params\n if (!providerCapabilities || !providerCapabilities[params.providerId]) return\n\n const previous = resolveRuntimeProviderHealth({\n state,\n providerCapabilities,\n providerId: params.providerId,\n })\n const nextStatus = params.status\n const errorSummary = normalizeProviderErrorSummary(params.error)\n const nowIso = new Date().toISOString()\n\n const nextHealth: GatewayProviderHealth = {\n status: nextStatus,\n check_type: 'light',\n checked_at: nowIso,\n last_full_checked_at: previous?.last_full_checked_at,\n last_full_status: previous?.last_full_status,\n error: nextStatus === 'healthy' ? undefined : (errorSummary ?? previous?.error),\n }\n\n providerCapabilities[params.providerId] = {\n ...providerCapabilities[params.providerId],\n health: nextHealth,\n }\n\n if (state.currentCapabilities) {\n const providers: Record<GatewayProviderId, GatewayProviderCapabilities> = {\n ...state.currentCapabilities.providers,\n }\n if (providers[params.providerId]) {\n providers[params.providerId] = {\n ...providers[params.providerId],\n health: nextHealth,\n }\n }\n state.currentCapabilities = {\n ...state.currentCapabilities,\n providers,\n services: deriveGatewayServiceCapabilities({\n providers,\n host: state.currentCapabilities.hosts.gateway,\n }),\n }\n }\n\n if (state.currentConfig) {\n if (!state.currentConfig.providerHealth) {\n state.currentConfig.providerHealth = {} as Record<GatewayProviderId, GatewayProviderHealth>\n }\n state.currentConfig.providerHealth[params.providerId] = nextHealth\n void params.saveConfig(state.currentConfig).catch((error) => {\n params.logError('Failed to persist gateway provider health', {\n error: error instanceof Error ? error.message : String(error),\n provider: params.providerId,\n })\n })\n }\n\n state.currentProviderHealth = {\n ...(state.currentProviderHealth ?? {}),\n [params.providerId]: nextHealth,\n }\n\n const nextStatusOverall = computeGatewayOperationalStatus({\n capabilities: state.currentCapabilities,\n jobIngressState: state.currentJobIngressState,\n acceptingJobs: state.currentAcceptingJobs,\n })\n if (state.currentCapabilities && state.currentDeviceName) {\n await params.sendHeartbeat(\n nextStatusOverall,\n state.currentCapabilities,\n state.currentDeviceName\n )\n }\n\n const statusChanged = previous?.status !== nextStatus\n if (statusChanged && nextStatus !== 'healthy' && state.currentConfig) {\n const label = formatProviderLabel(params.providerId)\n await params.emitGatewayEvent(state.currentConfig, {\n level: nextStatus === 'unhealthy' ? 'error' : 'warn',\n code: 'provider_unhealthy',\n provider: params.providerId,\n message: `${label} provider marked ${nextStatus}.`,\n details: {\n context: params.context,\n status: nextStatus,\n error: errorSummary ?? null,\n job_id: params.jobId ?? null,\n run_id: params.runId ?? null,\n },\n })\n }\n}\n", "import os from 'node:os'\nimport process from 'node:process'\nimport { getStringOption, type ParsedArgs } from './cli-args.js'\nimport { GatewayCliError, type CliDetail } from './cli-output.js'\nimport { startGatewayDaemonIfRequested as startGatewayDaemonIfRequestedBase } from './gateway-daemon.js'\nimport type { GatewayJobHandlers } from './gateway-job-handlers.js'\nimport {\n startGatewayLocalRuntime as startGatewayLocalRuntimeBase,\n type GatewayLocalRuntimeConfigResolution,\n type GatewayLocalRuntimeEventPayload,\n type StartGatewayLocalRuntimeParams,\n} from './gateway-local-runtime.js'\nimport type { GatewayRuntimeState } from './gateway-runtime-state.js'\nimport type { GatewayConfig, GatewayPaths } from './gateway-state.js'\nimport { buildMissingSupabaseConfigError, resolveSupabaseConfig } from './supabase-config.js'\n\ntype CliReporter = (\n message: string,\n options?: ParsedArgs['options'],\n details?: CliDetail[]\n) => void\n\nexport type GatewayStartCommandDependencies = Pick<\n StartGatewayLocalRuntimeParams,\n | 'buildCapabilities'\n | 'ensureGatewayTmpDir'\n | 'discoverGatewayCliCommands'\n | 'refreshRuntimeInstallFullControl'\n | 'emitGatewayEvent'\n | 'flushGatewayEvents'\n | 'emitProviderHealthEvents'\n | 'sendHeartbeat'\n | 'getNextSubagentRunEventSequence'\n | 'insertSubagentRunEvent'\n | 'requestChildTermination'\n | 'logInfo'\n | 'logError'\n> & {\n runtimeState: GatewayRuntimeState<GatewayLocalRuntimeEventPayload>\n resolveGatewayPaths: (options?: ParsedArgs['options']) => GatewayPaths\n readPidFile: (options?: ParsedArgs['options']) => number | null\n writePidFile: (pid: number, options?: ParsedArgs['options']) => Promise<void>\n removePidFile: (options?: ParsedArgs['options']) => Promise<void>\n isProcessAlive: (pid: number) => boolean\n loadConfig: (options?: ParsedArgs['options']) => Promise<GatewayConfig>\n saveConfig: (config: GatewayConfig, options?: ParsedArgs['options']) => Promise<void>\n buildGatewayJobHandlers: () => GatewayJobHandlers\n cliInfo: CliReporter\n cliSuccess: CliReporter\n startGatewayDaemonIfRequested?: typeof startGatewayDaemonIfRequestedBase\n startGatewayLocalRuntime?: typeof startGatewayLocalRuntimeBase\n env?: NodeJS.ProcessEnv\n hostname?: () => string\n}\n\nexport async function startGatewayCommand(\n options: ParsedArgs['options'],\n configResolution: GatewayLocalRuntimeConfigResolution | undefined,\n dependencies: GatewayStartCommandDependencies\n): Promise<void> {\n const paths = dependencies.resolveGatewayPaths(options)\n const foregroundRequested = options.foreground === true\n const explicitDaemon = options.daemon === true || options.background === true\n const startGatewayDaemonIfRequested =\n dependencies.startGatewayDaemonIfRequested ?? startGatewayDaemonIfRequestedBase\n const daemonResult = await startGatewayDaemonIfRequested({\n options,\n paths,\n foregroundRequested,\n explicitDaemon,\n dependencies: {\n readPidFile: dependencies.readPidFile,\n writePidFile: dependencies.writePidFile,\n isProcessAlive: dependencies.isProcessAlive,\n cliInfo: dependencies.cliInfo,\n cliSuccess: dependencies.cliSuccess,\n },\n })\n if (daemonResult.started) return\n\n dependencies.cliInfo('Starting gateway...', options)\n dependencies.runtimeState.currentRuntimeOptions = options\n let config: GatewayConfig\n try {\n config = await dependencies.loadConfig(options)\n } catch (error) {\n const details = error instanceof Error ? error.message : String(error)\n throw new GatewayCliError(\n 'Gateway config not found. Run \"pair\" first or set --config-path / PANORAMA_GATEWAY_CONFIG_PATH.',\n details\n )\n }\n\n const env = dependencies.env ?? process.env\n const resolvedSupabaseConfig = resolveSupabaseConfig({\n cliSupabaseUrl: getStringOption(options, 'supabase-url'),\n cliAnonKey: getStringOption(options, 'anon-key'),\n configSupabaseUrl: config.supabaseUrl,\n configAnonKey: config.supabaseAnonKey,\n env,\n })\n\n if (resolvedSupabaseConfig.missingFields.length > 0) {\n const { message, details } = buildMissingSupabaseConfigError(\n 'start',\n resolvedSupabaseConfig.missingFields,\n {\n configPath: paths.configPath,\n }\n )\n throw new GatewayCliError(message, details)\n }\n\n const { supabaseUrl, supabaseAnonKey } = resolvedSupabaseConfig\n const deviceName =\n getStringOption(options, 'device-name') ||\n config.deviceName ||\n env.PANORAMA_GATEWAY_DEVICE_NAME ||\n (dependencies.hostname ?? os.hostname)()\n\n config = {\n ...config,\n supabaseUrl,\n supabaseAnonKey,\n deviceName,\n }\n\n await dependencies.saveConfig(config, options)\n dependencies.runtimeState.currentConfig = config\n dependencies.runtimeState.currentDeviceName = deviceName\n\n const gatewayJobHandlers = dependencies.buildGatewayJobHandlers()\n const startGatewayLocalRuntime =\n dependencies.startGatewayLocalRuntime ?? startGatewayLocalRuntimeBase\n await startGatewayLocalRuntime({\n options,\n config,\n supabaseUrl,\n supabaseAnonKey,\n deviceName,\n runtimeState: dependencies.runtimeState,\n configResolution,\n buildCapabilities: dependencies.buildCapabilities,\n saveConfig: dependencies.saveConfig,\n ensureGatewayTmpDir: dependencies.ensureGatewayTmpDir,\n discoverGatewayCliCommands: dependencies.discoverGatewayCliCommands,\n refreshRuntimeInstallFullControl: dependencies.refreshRuntimeInstallFullControl,\n emitGatewayEvent: dependencies.emitGatewayEvent,\n flushGatewayEvents: dependencies.flushGatewayEvents,\n emitProviderHealthEvents: dependencies.emitProviderHealthEvents,\n sendHeartbeat: dependencies.sendHeartbeat,\n writePidFile: dependencies.writePidFile,\n removePidFile: dependencies.removePidFile,\n claimJob: gatewayJobHandlers.claimJob,\n processJob: gatewayJobHandlers.processJob,\n handleSubagentCancelJob: gatewayJobHandlers.handleSubagentCancelJob,\n completeJob: gatewayJobHandlers.completeJob,\n failSubagentRun: gatewayJobHandlers.failSubagentRun,\n getNextSubagentRunEventSequence: dependencies.getNextSubagentRunEventSequence,\n insertSubagentRunEvent: dependencies.insertSubagentRunEvent,\n requestChildTermination: dependencies.requestChildTermination,\n logInfo: dependencies.logInfo,\n logError: dependencies.logError,\n cliInfo: dependencies.cliInfo,\n cliSuccess: dependencies.cliSuccess,\n })\n}\n", "import { spawn, type ChildProcess, type SpawnOptions } from 'node:child_process'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { getStringOption, type ParsedArgs } from './cli-args.js'\nimport { buildGatewayEnvOverrides } from './cli-env.js'\nimport { formatPathForDisplay, type CliDetail } from './cli-output.js'\nimport type { GatewayPaths } from './gateway-state.js'\nimport {\n ensureOwnerOnlyDirectory,\n ensureOwnerOnlyFile,\n shouldEnforceOwnerOnlyPermissions,\n} from './local-security.js'\n\ntype CliReporter = (\n message: string,\n options?: ParsedArgs['options'],\n details?: CliDetail[]\n) => void\n\ntype SpawnProcess = (command: string, args: string[], options: SpawnOptions) => ChildProcess\n\ninterface GatewayDaemonDependencies {\n readPidFile: (options?: ParsedArgs['options']) => number | null\n writePidFile: (pid: number, options?: ParsedArgs['options']) => Promise<void>\n isProcessAlive: (pid: number) => boolean\n cliInfo: CliReporter\n cliSuccess: CliReporter\n spawnProcess?: SpawnProcess\n openLogFile?: typeof fs.open\n ensureOwnerOnlyDirectory?: typeof ensureOwnerOnlyDirectory\n ensureOwnerOnlyFile?: typeof ensureOwnerOnlyFile\n shouldEnforceOwnerOnlyPermissions?: typeof shouldEnforceOwnerOnlyPermissions\n buildGatewayEnvOverrides?: typeof buildGatewayEnvOverrides\n formatPathForDisplay?: typeof formatPathForDisplay\n entryPath?: string\n execPath?: string\n env?: NodeJS.ProcessEnv\n}\n\ninterface StartGatewayDaemonParams {\n options: ParsedArgs['options']\n paths: GatewayPaths\n foregroundRequested: boolean\n explicitDaemon: boolean\n dependencies: GatewayDaemonDependencies\n}\n\nexport type StartGatewayDaemonResult = { started: true } | { started: false }\n\nexport async function startGatewayDaemonIfRequested(\n params: StartGatewayDaemonParams\n): Promise<StartGatewayDaemonResult> {\n if (params.foregroundRequested) {\n return { started: false }\n }\n\n const {\n readPidFile,\n writePidFile,\n isProcessAlive,\n cliInfo,\n cliSuccess,\n spawnProcess = spawn,\n openLogFile = fs.open,\n env = process.env,\n } = params.dependencies\n const secureDirectory =\n params.dependencies.ensureOwnerOnlyDirectory ?? ensureOwnerOnlyDirectory\n const secureFile = params.dependencies.ensureOwnerOnlyFile ?? ensureOwnerOnlyFile\n const enforceOwnerOnlyPermissions =\n params.dependencies.shouldEnforceOwnerOnlyPermissions ?? shouldEnforceOwnerOnlyPermissions\n const buildEnvOverrides =\n params.dependencies.buildGatewayEnvOverrides ?? buildGatewayEnvOverrides\n const displayPath = params.dependencies.formatPathForDisplay ?? formatPathForDisplay\n\n const existingPid = readPidFile(params.options)\n if (existingPid && isProcessAlive(existingPid)) {\n cliInfo('Gateway already running', params.options, [\n { label: 'PID', value: existingPid, verboseOnly: true },\n ])\n return { started: true }\n }\n\n const entryPath = params.dependencies.entryPath ?? process.argv[1] ?? ''\n if (entryPath.endsWith('.ts')) {\n if (!params.explicitDaemon) {\n cliInfo('Gateway running in foreground (dev mode detected)', params.options)\n return { started: false }\n }\n throw new Error('Daemon mode requires the built gateway. Run \"pnpm gateway:start -- --daemon\".')\n }\n\n await secureDirectory(path.dirname(params.paths.logPath))\n await secureFile(params.paths.logPath)\n const logHandle = await openLogFile(\n params.paths.logPath,\n 'a',\n enforceOwnerOnlyPermissions() ? 0o600 : undefined\n )\n await secureFile(params.paths.logPath)\n\n const childArgs = [entryPath, 'start', '--foreground']\n const deviceName =\n getStringOption(params.options, 'device-name') || env.PANORAMA_GATEWAY_DEVICE_NAME\n if (deviceName) {\n childArgs.push('--device-name', deviceName)\n }\n\n let child: ChildProcess\n try {\n child = spawnProcess(params.dependencies.execPath ?? process.execPath, childArgs, {\n detached: true,\n stdio: ['ignore', logHandle.fd, logHandle.fd],\n env: {\n ...env,\n ...buildEnvOverrides(params.options),\n },\n })\n\n child.unref()\n } finally {\n await logHandle.close()\n }\n if (!child.pid) {\n throw new Error('Failed to determine gateway process id')\n }\n\n await writePidFile(child.pid, params.options)\n cliSuccess('Gateway started', params.options, [\n { label: 'Logs', value: displayPath(params.paths.logPath) },\n { label: 'PID', value: child.pid, verboseOnly: true },\n { label: 'Config', value: displayPath(params.paths.configPath), verboseOnly: true },\n ])\n return { started: true }\n}\n", "import type { GatewayCapabilitiesV1 } from '@panorama/shared/gateway/capabilities'\nimport process from 'node:process'\nimport type { ParsedArgs } from './cli-args.js'\nimport { GatewayCliError } from './cli-output.js'\nimport type {\n GatewayProviderCapabilities,\n GatewayProviderHealth,\n GatewayProviderId,\n} from './cli-providers/types.js'\nimport { computeGatewayOperationalStatus } from './gateway-operational-status.js'\nimport {\n formatProviderLabel,\n formatProviderProgressLine,\n} from './gateway-provider-health.js'\nimport type { GatewayProviderCapabilityProgressEvent } from './gateway-provider-capabilities.js'\nimport { GatewayJobController } from './gateway-job-controller.js'\nimport type {\n GatewayJobRow,\n GatewayJobStatus,\n} from './gateway-jobs.js'\nimport type {\n GatewayActiveWorkRegistries,\n GatewayChildTerminator,\n} from './gateway-lifecycle.js'\nimport type { GatewayRuntimeState } from './gateway-runtime-state.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport type { GatewaySubagentRunEventInsert } from './gateway-subagent-run-types.js'\nimport { createLocalHeartbeatSupervisor } from './local-runtime/heartbeat-supervisor.js'\nimport { createGatewayRestartSupervisor, type GatewayRestartSupervisor } from './local-runtime/restart-supervisor.js'\nimport {\n createGatewaySupabaseClient,\n DEFAULT_HEARTBEAT_INTERVAL_MS,\n DEFAULT_JOB_CHANNEL_RECONNECT_MS,\n DEFAULT_JOB_RECONCILE_INTERVAL_MS,\n isGatewayDevRuntimeModule,\n readCurrentModulePath,\n resolveGatewayConcurrency,\n} from './local-runtime/runtime-utils.js'\nimport { createGatewayShutdownCoordinator, type GatewayShutdownCoordinator } from './local-runtime/shutdown-supervisor.js'\nimport type {\n CliReporter,\n GatewayLocalRuntimeConfigResolution,\n GatewayLocalRuntimeEventPayload,\n GatewayStatus,\n GatewaySupabaseClient,\n SpawnProcess,\n} from './local-runtime/types.js'\n\nexport {\n isGatewayDevRuntimeModule,\n resolveGatewayConcurrency,\n} from './local-runtime/runtime-utils.js'\nexport type {\n GatewayLocalRuntimeConfigResolution,\n GatewayLocalRuntimeEventPayload,\n} from './local-runtime/types.js'\n\nexport interface StartGatewayLocalRuntimeParams {\n options: ParsedArgs['options']\n config: GatewayConfig\n supabaseUrl: string\n supabaseAnonKey: string\n deviceName: string\n runtimeState: GatewayRuntimeState<GatewayLocalRuntimeEventPayload>\n configResolution?: GatewayLocalRuntimeConfigResolution\n buildCapabilities: (params?: {\n validationMode?: 'full' | 'light' | 'auto'\n previousHealth?: Partial<Record<GatewayProviderId, GatewayProviderHealth>>\n deviceName?: string | null\n installFullControlEnabled?: boolean\n onProgress?: (event: GatewayProviderCapabilityProgressEvent) => void\n }) => Promise<{\n capabilities: GatewayCapabilitiesV1\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>\n anyProviderReady: boolean\n }>\n saveConfig: (config: GatewayConfig, options?: ParsedArgs['options']) => Promise<void>\n ensureGatewayTmpDir: () => Promise<void>\n discoverGatewayCliCommands: (options?: ParsedArgs['options']) => Promise<void>\n refreshRuntimeInstallFullControl: (config: GatewayConfig) => Promise<boolean>\n emitGatewayEvent: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n payload: GatewayLocalRuntimeEventPayload\n ) => Promise<void>\n flushGatewayEvents: (supabase: GatewaySupabaseClient, config: GatewayConfig) => Promise<void>\n emitProviderHealthEvents: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>,\n context: string\n ) => Promise<void>\n sendHeartbeat: (\n supabase: GatewaySupabaseClient,\n status: GatewayStatus,\n capabilities: GatewayCapabilitiesV1,\n deviceName?: string | null\n ) => Promise<void>\n writePidFile: (pid: number, options?: ParsedArgs['options']) => Promise<void>\n removePidFile: (options?: ParsedArgs['options']) => Promise<void>\n claimJob: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ) => Promise<GatewayJobRow | null>\n processJob: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ) => Promise<void>\n handleSubagentCancelJob: (\n supabase: GatewaySupabaseClient,\n config: GatewayConfig,\n job: GatewayJobRow\n ) => Promise<{ ok: boolean; result: Record<string, unknown>; error?: string }>\n completeJob: (\n supabase: GatewaySupabaseClient,\n jobId: string,\n status: GatewayJobStatus,\n result: Record<string, unknown> | null,\n errorMessage?: string\n ) => Promise<void>\n failSubagentRun: (\n supabase: GatewaySupabaseClient,\n job: GatewayJobRow,\n errorMessage: string\n ) => Promise<void>\n getNextSubagentRunEventSequence: (\n supabase: GatewaySupabaseClient,\n runId: string\n ) => Promise<number>\n insertSubagentRunEvent: (params: GatewaySubagentRunEventInsert) => Promise<number | null>\n requestChildTermination: GatewayChildTerminator\n logInfo: (message: string, data?: Record<string, unknown>) => void\n logError: (message: string, data?: Record<string, unknown>) => void\n cliInfo: CliReporter\n cliSuccess: CliReporter\n env?: NodeJS.ProcessEnv\n entryPath?: string\n modulePath?: string\n processArgs?: string[]\n execPath?: string\n spawnProcess?: SpawnProcess\n exitProcess?: (code: number) => void\n registerSignalHandlers?: boolean\n}\n\nexport async function startGatewayLocalRuntime(\n params: StartGatewayLocalRuntimeParams\n): Promise<void> {\n const {\n options,\n config,\n supabaseUrl,\n supabaseAnonKey,\n deviceName,\n runtimeState,\n configResolution,\n buildCapabilities,\n saveConfig,\n ensureGatewayTmpDir,\n discoverGatewayCliCommands,\n refreshRuntimeInstallFullControl,\n emitGatewayEvent,\n flushGatewayEvents,\n emitProviderHealthEvents,\n sendHeartbeat,\n writePidFile,\n removePidFile,\n claimJob,\n processJob,\n handleSubagentCancelJob,\n completeJob,\n failSubagentRun,\n getNextSubagentRunEventSequence,\n insertSubagentRunEvent,\n requestChildTermination,\n logInfo,\n logError,\n cliInfo,\n cliSuccess,\n env = process.env,\n entryPath = process.argv[1] || '',\n modulePath = readCurrentModulePath(),\n processArgs = process.argv.slice(1),\n execPath = process.execPath,\n spawnProcess,\n exitProcess = (code) => process.exit(code),\n registerSignalHandlers = true,\n } = params\n\n const supabase = createGatewaySupabaseClient({ supabaseUrl, supabaseAnonKey })\n\n const { data: sessionData, error: sessionError } = await supabase.auth.setSession({\n access_token: config.accessToken,\n refresh_token: config.refreshToken,\n })\n\n if (sessionError || !sessionData?.session) {\n const details = sessionError?.message || 'No session returned'\n throw new GatewayCliError('Failed to authenticate gateway session.', details)\n }\n\n config.accessToken = sessionData.session.access_token\n config.refreshToken = sessionData.session.refresh_token\n await saveConfig(config, options)\n\n supabase.auth.onAuthStateChange((event, session) => {\n if (!session) return\n if (event === 'TOKEN_REFRESHED' || event === 'SIGNED_IN') {\n config.accessToken = session.access_token\n config.refreshToken = session.refresh_token\n void saveConfig(config, options)\n .then(() => logInfo('Gateway session refreshed'))\n .catch((error) => {\n logError('Failed to persist refreshed gateway session', {\n error: error instanceof Error ? error.message : String(error),\n })\n })\n }\n })\n\n await ensureGatewayTmpDir()\n await discoverGatewayCliCommands(options)\n\n cliInfo('Validating providers...', options)\n const { capabilities: initialCapabilities, providerHealth } = await buildCapabilities({\n validationMode: 'auto',\n previousHealth: config.providerHealth,\n deviceName,\n installFullControlEnabled: config.full_control_enabled,\n onProgress: (event) => {\n if (event.stage === 'start') {\n cliInfo(` ${formatProviderLabel(event.providerId)}...`, options)\n return\n }\n cliInfo(` ${formatProviderProgressLine(event)}`, options)\n },\n })\n config.providerHealth = providerHealth\n if (Object.values(providerHealth).some((health) => health.check_type === 'full')) {\n await saveConfig(config, options)\n }\n\n runtimeState.currentCapabilities = initialCapabilities\n runtimeState.currentProviderHealth = providerHealth\n runtimeState.currentJobIngressState = {\n pending: true,\n ready: false,\n }\n\n const providerStatus = initialCapabilities.providers as Record<string, GatewayProviderCapabilities>\n const getCurrentCapabilities = (): GatewayCapabilitiesV1 => {\n return runtimeState.currentCapabilities ?? initialCapabilities\n }\n const initialStatus = computeGatewayOperationalStatus({\n capabilities: getCurrentCapabilities(),\n jobIngressState: runtimeState.currentJobIngressState,\n acceptingJobs: runtimeState.currentAcceptingJobs,\n })\n\n const gatewayConcurrency = resolveGatewayConcurrency(env)\n logInfo('Gateway capabilities loaded', {\n providers: Object.fromEntries(\n Object.entries(providerStatus).map(([id, entry]) => [\n id,\n {\n available: entry.available,\n version: entry.version ?? null,\n health: entry.health?.status ?? 'unknown',\n },\n ])\n ),\n concurrency: gatewayConcurrency,\n })\n\n if (configResolution?.migratedFrom) {\n await emitGatewayEvent(supabase, config, {\n level: 'warn',\n code: 'config_dir_fallback',\n message: 'Gateway config directory was not writable; using fallback location.',\n details: {\n previous: configResolution.migratedFrom,\n current: configResolution.configDir,\n },\n })\n }\n\n await flushGatewayEvents(supabase, config)\n\n const ranFullValidation = Object.values(providerHealth).some(\n (health) => health.check_type === 'full'\n )\n if (ranFullValidation) {\n await emitProviderHealthEvents(supabase, config, providerHealth, 'startup')\n }\n\n const heartbeatSupervisor = createLocalHeartbeatSupervisor({\n supabase,\n config,\n runtimeState,\n deviceName,\n initialCapabilities,\n initialProviderHealth: providerHealth,\n initialStatus,\n buildCapabilities,\n refreshRuntimeInstallFullControl,\n sendHeartbeat,\n logInfo,\n logError,\n })\n await heartbeatSupervisor.sendCurrentHeartbeat()\n await writePidFile(process.pid, options)\n heartbeatSupervisor.start()\n\n runtimeState.currentAcceptingJobs = true\n const activeWorkRegistries: GatewayActiveWorkRegistries = {\n activeSubagentRuns: runtimeState.activeSubagentRuns,\n activeModelRuns: runtimeState.activeModelRuns,\n activeShellExecRuns: runtimeState.activeShellExecRuns,\n }\n\n let restartSupervisor: GatewayRestartSupervisor | null = null\n let shutdownCoordinator: GatewayShutdownCoordinator | null = null\n const jobController = new GatewayJobController({\n supabase,\n config,\n concurrency: gatewayConcurrency,\n reconcileIntervalMs: DEFAULT_JOB_RECONCILE_INTERVAL_MS,\n channelReconnectMs: DEFAULT_JOB_CHANNEL_RECONNECT_MS,\n claimJob: (job) => claimJob(supabase, config, job),\n processJob: (job) => processJob(supabase, config, job),\n handleSubagentCancelJob: (job) => handleSubagentCancelJob(supabase, config, job),\n completeJob: (jobId, status, result, errorMessage) =>\n completeJob(supabase, jobId, status, result, errorMessage),\n failSubagentRun: (job, errorMessage) => failSubagentRun(supabase, job, errorMessage),\n onIngressStateChange: (state) => {\n runtimeState.currentJobIngressState = state\n },\n onAcceptingJobsChange: (accepting) => {\n runtimeState.currentAcceptingJobs = accepting\n },\n syncOperationalHeartbeatIfChanged: heartbeatSupervisor.syncOperationalHeartbeatIfChanged,\n onIdle: async () => {\n await restartSupervisor?.maybeRestart()\n },\n logInfo,\n logError,\n })\n\n restartSupervisor = createGatewayRestartSupervisor({\n env,\n entryPath,\n modulePath,\n execPath,\n processArgs,\n jobController,\n activeWorkRegistries,\n spawnProcess,\n exitProcess,\n performShutdown: (signal, mode) =>\n shutdownCoordinator?.performShutdown(signal, mode) ?? Promise.resolve(),\n isShutdownInProgress: () => shutdownCoordinator?.isShutdownInProgress() ?? false,\n syncOperationalHeartbeatIfChanged: heartbeatSupervisor.syncOperationalHeartbeatIfChanged,\n logInfo,\n })\n\n shutdownCoordinator = createGatewayShutdownCoordinator({\n supabase,\n options,\n runtimeState,\n jobController,\n activeWorkRegistries,\n requestChildTermination,\n syncOperationalHeartbeatIfChanged: heartbeatSupervisor.syncOperationalHeartbeatIfChanged,\n stopHeartbeat: heartbeatSupervisor.stop,\n stopRestart: restartSupervisor.stop,\n sendOfflineHeartbeat: heartbeatSupervisor.sendOfflineHeartbeat,\n removePidFile,\n completeJob,\n getNextSubagentRunEventSequence,\n insertSubagentRunEvent,\n logInfo,\n logError,\n exitProcess,\n })\n\n await jobController.start('startup')\n restartSupervisor.start()\n\n if (registerSignalHandlers) {\n process.on('SIGINT', () => void shutdownCoordinator?.shutdown('SIGINT'))\n process.on('SIGTERM', () => void shutdownCoordinator?.shutdown('SIGTERM'))\n }\n\n logInfo('Gateway running', {\n gatewayId: config.gatewayId,\n teamId: config.teamId,\n deviceName,\n installFullControlEnabled: config.full_control_enabled,\n heartbeatIntervalMs: DEFAULT_HEARTBEAT_INTERVAL_MS,\n concurrency: gatewayConcurrency,\n })\n\n cliSuccess('Gateway running', options, [\n { label: 'Mode', value: 'Foreground' },\n { label: 'Device', value: deviceName },\n { label: 'Host machine control', value: config.full_control_enabled ? 'Enabled' : 'Disabled' },\n { label: 'Gateway ID', value: config.gatewayId, verboseOnly: true },\n { label: 'Team ID', value: config.teamId, verboseOnly: true },\n ])\n}\n", "export interface QueueJobLike {\n id: string\n}\n\nexport interface DequeuedGatewayJob<T extends QueueJobLike> {\n job: T\n reservedSubagentId: string | null\n}\n\nexport class GatewayJobQueue<T extends QueueJobLike> {\n private readonly pendingJobs: T[] = []\n private readonly queuedJobIds = new Set<string>()\n private readonly activeJobIds = new Set<string>()\n private readonly reservedSubagentIds = new Set<string>()\n\n constructor(\n private readonly resolveSubagentId: (job: T) => string | null\n ) {}\n\n enqueue(job: T): boolean {\n if (this.queuedJobIds.has(job.id) || this.activeJobIds.has(job.id)) {\n return false\n }\n\n this.pendingJobs.push(job)\n this.queuedJobIds.add(job.id)\n return true\n }\n\n takeAvailable(maxActiveJobs: number): DequeuedGatewayJob<T>[] {\n const ready: DequeuedGatewayJob<T>[] = []\n let deferredForReservedSubagent = 0\n\n while (this.activeJobIds.size < maxActiveJobs && this.pendingJobs.length > 0) {\n const nextJob = this.pendingJobs.shift()\n if (!nextJob) break\n\n this.queuedJobIds.delete(nextJob.id)\n const reservedSubagentId = this.resolveSubagentId(nextJob)\n if (reservedSubagentId && this.reservedSubagentIds.has(reservedSubagentId)) {\n this.pendingJobs.push(nextJob)\n this.queuedJobIds.add(nextJob.id)\n deferredForReservedSubagent += 1\n if (deferredForReservedSubagent >= this.pendingJobs.length) {\n break\n }\n continue\n }\n\n deferredForReservedSubagent = 0\n if (this.activeJobIds.has(nextJob.id)) {\n continue\n }\n\n this.activeJobIds.add(nextJob.id)\n if (reservedSubagentId) {\n this.reservedSubagentIds.add(reservedSubagentId)\n }\n ready.push({ job: nextJob, reservedSubagentId })\n }\n\n return ready\n }\n\n markDone(jobId: string, reservedSubagentId?: string | null): void {\n this.activeJobIds.delete(jobId)\n if (reservedSubagentId) {\n this.reservedSubagentIds.delete(reservedSubagentId)\n }\n }\n\n clearPending(): void {\n this.pendingJobs.length = 0\n this.queuedJobIds.clear()\n }\n\n clearAll(): void {\n this.clearPending()\n this.activeJobIds.clear()\n this.reservedSubagentIds.clear()\n }\n\n activeCount(): number {\n return this.activeJobIds.size\n }\n\n pendingCount(): number {\n return this.pendingJobs.length\n }\n}\n", "import type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from './database.types.js'\nimport type { GatewayJobIngressState } from './gateway-operational-status.js'\nimport {\n isJobTargeted,\n resolveJobSubagentId,\n type GatewayJobRow,\n type GatewayJobStatus,\n} from './gateway-jobs.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport { GatewayJobQueue } from './job-queue.js'\n\ntype GatewaySupabaseClient = SupabaseClient<Database>\ntype GatewayRealtimeChannel = ReturnType<GatewaySupabaseClient['channel']>\n\ntype GatewayJobResult = {\n ok: boolean\n result: Record<string, unknown>\n error?: string\n}\n\nexport interface GatewayJobControllerOptions {\n supabase: GatewaySupabaseClient\n config: GatewayConfig\n concurrency: number\n reconcileIntervalMs: number\n channelReconnectMs: number\n claimJob: (job: GatewayJobRow) => Promise<GatewayJobRow | null>\n processJob: (job: GatewayJobRow) => Promise<void>\n handleSubagentCancelJob: (job: GatewayJobRow) => Promise<GatewayJobResult>\n completeJob: (\n jobId: string,\n status: GatewayJobStatus,\n result: Record<string, unknown> | null,\n errorMessage?: string\n ) => Promise<void>\n failSubagentRun: (job: GatewayJobRow, errorMessage: string) => Promise<void>\n onIngressStateChange: (state: GatewayJobIngressState) => void\n onAcceptingJobsChange: (accepting: boolean) => void\n syncOperationalHeartbeatIfChanged: () => Promise<void>\n onIdle: () => Promise<void>\n logInfo: (message: string, data?: Record<string, unknown>) => void\n logError: (message: string, data?: Record<string, unknown>) => void\n now?: () => number\n}\n\nexport class GatewayJobController {\n private readonly jobQueue = new GatewayJobQueue<GatewayJobRow>(resolveJobSubagentId)\n private readonly activeClaimedJobs = new Map<string, GatewayJobRow>()\n private readonly activeCancelJobs = new Map<string, GatewayJobRow>()\n private readonly retiredChannels = new WeakSet<object>()\n private readonly intentionallyClosingChannels = new WeakSet<object>()\n private readonly now: () => number\n private acceptingJobs = true\n private reconcileInFlight = false\n private shutdownInProgress = false\n private lastJobIngressSuccessAtMs: number | null = null\n private lastJobIngressError: string | null = null\n private reconcileTimer: NodeJS.Timeout | null = null\n private channelReconnectTimer: NodeJS.Timeout | null = null\n private channel: GatewayRealtimeChannel | null = null\n\n constructor(private readonly options: GatewayJobControllerOptions) {\n this.now = options.now ?? Date.now\n this.options.onAcceptingJobsChange(true)\n }\n\n activeQueueCount(): number {\n return this.jobQueue.activeCount() + this.activeCancelJobs.size\n }\n\n activeClaimedJobCount(): number {\n return this.activeClaimedJobs.size + this.activeCancelJobs.size\n }\n\n activeClaimedJobEntries(): Array<[string, GatewayJobRow]> {\n return [\n ...Array.from(this.activeClaimedJobs.entries()),\n ...Array.from(this.activeCancelJobs.entries()),\n ]\n }\n\n clearPending(): void {\n this.jobQueue.clearPending()\n }\n\n stopAcceptingJobs(): void {\n if (!this.acceptingJobs) {\n this.clearPending()\n return\n }\n this.acceptingJobs = false\n this.options.onAcceptingJobsChange(false)\n this.clearPending()\n }\n\n beginShutdown(): boolean {\n if (this.shutdownInProgress) return false\n this.shutdownInProgress = true\n this.stopAcceptingJobs()\n this.clearTimers()\n return true\n }\n\n async disconnect(): Promise<void> {\n if (!this.channel) return\n const channel = this.channel\n this.channel = null\n await this.unsubscribeChannel(channel, 'disconnect')\n }\n\n async start(reason: string): Promise<void> {\n await this.connectJobChannel(reason)\n await this.reconcileQueuedJobs(reason)\n this.reconcileTimer = setInterval(() => {\n void this.reconcileQueuedJobs('interval')\n }, this.options.reconcileIntervalMs)\n }\n\n async reconcileQueuedJobs(reason: string): Promise<void> {\n if (this.reconcileInFlight || this.shutdownInProgress) return\n this.reconcileInFlight = true\n try {\n const { data, error } = await this.options.supabase\n .from('gateway_jobs')\n .select('*')\n .eq('team_id', this.options.config.teamId)\n .eq('status', 'queued')\n .eq('gateway_id', this.options.config.gatewayId)\n .order('created_at', { ascending: true })\n\n if (error) {\n throw error\n }\n\n this.lastJobIngressSuccessAtMs = this.now()\n this.lastJobIngressError = null\n this.updateJobIngressState()\n\n for (const row of data ?? []) {\n this.enqueueJob(row as GatewayJobRow)\n }\n\n await this.options.syncOperationalHeartbeatIfChanged()\n } catch (error) {\n this.lastJobIngressError = error instanceof Error ? error.message : String(error)\n this.updateJobIngressState()\n this.options.logError('Failed to reconcile queued gateway jobs', {\n error: this.lastJobIngressError,\n reason,\n })\n await this.options.syncOperationalHeartbeatIfChanged()\n } finally {\n this.reconcileInFlight = false\n }\n }\n\n enqueueJob(job: GatewayJobRow): void {\n if (this.shutdownInProgress) return\n if (!isJobTargeted(job, this.options.config.gatewayId)) return\n if (job.job_type === 'subagent_cancel') {\n void this.processCancelJob(job)\n return\n }\n if (!this.acceptingJobs) return\n if (this.jobQueue.enqueue(job)) {\n this.processQueue()\n }\n }\n\n private updateJobIngressState(): void {\n const ready =\n this.lastJobIngressSuccessAtMs !== null &&\n this.now() - this.lastJobIngressSuccessAtMs <= this.options.reconcileIntervalMs * 3\n const pending = this.lastJobIngressSuccessAtMs === null && this.lastJobIngressError === null\n this.options.onIngressStateChange({\n pending,\n ready,\n })\n }\n\n private async processCancelJob(job: GatewayJobRow): Promise<void> {\n this.activeCancelJobs.set(job.id, job)\n try {\n const claimed = await this.options.claimJob(job)\n if (!claimed) return\n this.activeCancelJobs.set(job.id, claimed)\n const result = await this.options.handleSubagentCancelJob(claimed)\n if (result.ok) {\n await this.options.completeJob(claimed.id, 'completed', result.result)\n } else {\n await this.options.completeJob(claimed.id, 'failed', result.result, result.error)\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.options.logError('Gateway cancel job processing failed', {\n jobId: job.id,\n error: errorMessage,\n })\n await this.options.completeJob(\n job.id,\n 'failed',\n { message: 'Gateway cancel job processing failed', job_type: job.job_type },\n errorMessage\n )\n } finally {\n this.activeCancelJobs.delete(job.id)\n void this.options.onIdle()\n }\n }\n\n private async processJobWithHandling(\n nextJob: GatewayJobRow,\n reservedSubagentId: string | null\n ): Promise<void> {\n this.activeClaimedJobs.set(nextJob.id, nextJob)\n try {\n await this.options.processJob(nextJob)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.options.logError('Gateway job processing failed', {\n jobId: nextJob.id,\n error: errorMessage,\n })\n await this.options.completeJob(\n nextJob.id,\n 'failed',\n { message: 'Gateway job processing failed', job_type: nextJob.job_type },\n errorMessage\n )\n if (nextJob.job_type === 'subagent_run') {\n await this.options.failSubagentRun(nextJob, errorMessage)\n }\n } finally {\n this.activeClaimedJobs.delete(nextJob.id)\n this.jobQueue.markDone(nextJob.id, reservedSubagentId)\n this.processQueue()\n void this.options.onIdle()\n }\n }\n\n private processQueue(): void {\n if (!this.acceptingJobs) return\n const readyJobs = this.jobQueue.takeAvailable(this.options.concurrency)\n for (const nextJob of readyJobs) {\n void this.processJobWithHandling(nextJob.job, nextJob.reservedSubagentId)\n }\n }\n\n private scheduleChannelReconnect(reason: string): void {\n if (this.shutdownInProgress || this.channelReconnectTimer) return\n this.channelReconnectTimer = setTimeout(() => {\n this.channelReconnectTimer = null\n void this.connectJobChannel(`reconnect:${reason}`)\n }, this.options.channelReconnectMs)\n }\n\n private async connectJobChannel(reason: string): Promise<void> {\n if (this.shutdownInProgress) return\n if (this.channel) {\n await this.unsubscribeChannel(this.channel, 'reconnect')\n }\n\n const channel = this.options.supabase.channel(`gateway_jobs_${this.options.config.gatewayId}`)\n channel\n .on(\n 'postgres_changes',\n {\n event: 'INSERT',\n schema: 'public',\n table: 'gateway_jobs',\n filter: `team_id=eq.${this.options.config.teamId}`,\n },\n (payload) => {\n if (this.retiredChannels.has(channel as object)) return\n const job = payload.new as GatewayJobRow\n if (job.status !== 'queued') return\n this.enqueueJob(job)\n }\n )\n .subscribe((status) => {\n if (this.retiredChannels.has(channel as object)) {\n if (status === 'CLOSED') {\n this.intentionallyClosingChannels.delete(channel as object)\n }\n return\n }\n\n if (status === 'CLOSED' && this.intentionallyClosingChannels.has(channel as object)) {\n this.intentionallyClosingChannels.delete(channel as object)\n return\n }\n\n if (status === 'SUBSCRIBED') {\n this.options.logInfo('Gateway subscribed to job queue', { reason })\n void this.reconcileQueuedJobs(`channel_subscribed:${reason}`)\n return\n }\n\n if (status === 'CHANNEL_ERROR' || status === 'TIMED_OUT' || status === 'CLOSED') {\n this.options.logError('Gateway realtime channel unavailable', { status, reason })\n this.scheduleChannelReconnect(status.toLowerCase())\n }\n })\n this.channel = channel\n }\n\n private async unsubscribeChannel(channel: GatewayRealtimeChannel, context: string): Promise<void> {\n this.retiredChannels.add(channel as object)\n this.intentionallyClosingChannels.add(channel as object)\n try {\n await channel.unsubscribe()\n } catch (error) {\n this.intentionallyClosingChannels.delete(channel as object)\n this.options.logError('Failed to unsubscribe gateway realtime channel', {\n context,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n private clearTimers(): void {\n if (this.reconcileTimer) {\n clearInterval(this.reconcileTimer)\n this.reconcileTimer = null\n }\n if (this.channelReconnectTimer) {\n clearTimeout(this.channelReconnectTimer)\n this.channelReconnectTimer = null\n }\n }\n}\n", "import { createClient } from '@supabase/supabase-js'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { fileURLToPath } from 'node:url'\nimport { parseNumberEnv } from '../cli-env.js'\nimport type { Database } from '../database.types.js'\nimport type { GatewaySupabaseClient } from './types.js'\n\nexport const DEFAULT_HEARTBEAT_INTERVAL_MS = 30_000\nexport const DEFAULT_GATEWAY_CONCURRENCY = 10\nexport const DEFAULT_JOB_RECONCILE_INTERVAL_MS = 5_000\nexport const DEFAULT_JOB_CHANNEL_RECONNECT_MS = 5_000\nexport const DEFAULT_RESTART_CHECK_INTERVAL_MS = 30_000\nexport const SUBAGENT_CANCEL_KILL_TIMEOUT_MS = 5_000\nexport const PROCESS_KILL_GRACE_MS = 2_000\n\nexport function isGatewayDevRuntimeModule(params: {\n entryPath?: string\n modulePath?: string\n}): boolean {\n const entryPath = params.entryPath ?? ''\n const modulePath = params.modulePath ?? ''\n return (\n modulePath.endsWith('.ts') ||\n modulePath.includes(`${path.sep}src${path.sep}`) ||\n entryPath.endsWith('.ts')\n )\n}\n\nexport function readCurrentModulePath(metaUrl: string = import.meta.url): string {\n try {\n return fileURLToPath(metaUrl)\n } catch {\n return ''\n }\n}\n\nexport function resolveGatewayConcurrency(env: NodeJS.ProcessEnv = process.env): number {\n const raw = env.PANORAMA_GATEWAY_CONCURRENCY\n if (!raw) return DEFAULT_GATEWAY_CONCURRENCY\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isFinite(parsed) || parsed <= 0) return DEFAULT_GATEWAY_CONCURRENCY\n return parsed\n}\n\nexport function resolveRestartCheckIntervalMs(env: NodeJS.ProcessEnv): number {\n return Math.max(\n 1000,\n parseNumberEnv(env.PANORAMA_GATEWAY_RESTART_CHECK_MS, DEFAULT_RESTART_CHECK_INTERVAL_MS)\n )\n}\n\nexport function createGatewaySupabaseClient(params: {\n supabaseUrl: string\n supabaseAnonKey: string\n}): GatewaySupabaseClient {\n return createClient<Database>(params.supabaseUrl, params.supabaseAnonKey, {\n auth: {\n persistSession: false,\n autoRefreshToken: true,\n detectSessionInUrl: false,\n },\n realtime: {\n params: {\n eventsPerSecond: 10,\n },\n },\n })\n}\n", "import type { GatewayCapabilitiesV1 } from '@panorama/shared/gateway/capabilities'\nimport { computeGatewayOperationalStatus } from '../gateway-operational-status.js'\nimport type { GatewayProviderCapabilityProgressEvent } from '../gateway-provider-capabilities.js'\nimport type { GatewayProviderHealth, GatewayProviderId } from '../cli-providers/types.js'\nimport type { GatewayRuntimeState } from '../gateway-runtime-state.js'\nimport type { GatewayConfig } from '../gateway-state.js'\nimport {\n DEFAULT_HEARTBEAT_INTERVAL_MS,\n} from './runtime-utils.js'\nimport type {\n GatewayLocalRuntimeEventPayload,\n GatewayStatus,\n GatewaySupabaseClient,\n} from './types.js'\n\nexport interface LocalHeartbeatSupervisor {\n sendCurrentHeartbeat: () => Promise<void>\n syncOperationalHeartbeatIfChanged: () => Promise<void>\n refreshHeartbeat: () => Promise<void>\n start: () => void\n stop: () => void\n sendOfflineHeartbeat: () => Promise<void>\n}\n\nexport function createLocalHeartbeatSupervisor(params: {\n supabase: GatewaySupabaseClient\n config: GatewayConfig\n runtimeState: GatewayRuntimeState<GatewayLocalRuntimeEventPayload>\n deviceName: string\n initialCapabilities: GatewayCapabilitiesV1\n initialProviderHealth: Record<GatewayProviderId, GatewayProviderHealth>\n initialStatus: GatewayStatus\n buildCapabilities: (params?: {\n validationMode?: 'full' | 'light' | 'auto'\n previousHealth?: Partial<Record<GatewayProviderId, GatewayProviderHealth>>\n deviceName?: string | null\n installFullControlEnabled?: boolean\n onProgress?: (event: GatewayProviderCapabilityProgressEvent) => void\n }) => Promise<{\n capabilities: GatewayCapabilitiesV1\n providerHealth: Record<GatewayProviderId, GatewayProviderHealth>\n anyProviderReady: boolean\n }>\n refreshRuntimeInstallFullControl: (config: GatewayConfig) => Promise<boolean>\n sendHeartbeat: (\n supabase: GatewaySupabaseClient,\n status: GatewayStatus,\n capabilities: GatewayCapabilitiesV1,\n deviceName?: string | null\n ) => Promise<void>\n logInfo: (message: string, data?: Record<string, unknown>) => void\n logError: (message: string, data?: Record<string, unknown>) => void\n}): LocalHeartbeatSupervisor {\n let currentProviderHealth = params.initialProviderHealth\n let heartbeatStatus = params.initialStatus\n let heartbeatInFlight = false\n let heartbeatTimer: NodeJS.Timeout | null = null\n\n const getCurrentCapabilities = (): GatewayCapabilitiesV1 => {\n return params.runtimeState.currentCapabilities ?? params.initialCapabilities\n }\n\n const sendCurrentHeartbeat = async () => {\n await params.sendHeartbeat(\n params.supabase,\n heartbeatStatus,\n getCurrentCapabilities(),\n params.deviceName\n )\n }\n\n const syncOperationalHeartbeatIfChanged = async () => {\n const capabilities = getCurrentCapabilities()\n const nextStatus = computeGatewayOperationalStatus({\n capabilities,\n jobIngressState: params.runtimeState.currentJobIngressState,\n acceptingJobs: params.runtimeState.currentAcceptingJobs,\n })\n if (nextStatus === heartbeatStatus) return\n heartbeatStatus = nextStatus\n await params.sendHeartbeat(params.supabase, heartbeatStatus, capabilities, params.deviceName)\n }\n\n const refreshHeartbeat = async () => {\n if (heartbeatInFlight) return\n heartbeatInFlight = true\n try {\n const installFullControlEnabled = await params.refreshRuntimeInstallFullControl(params.config)\n const { capabilities: nextCapabilities, providerHealth: nextProviderHealth } =\n await params.buildCapabilities({\n validationMode: 'light',\n previousHealth: params.runtimeState.currentProviderHealth ?? currentProviderHealth,\n deviceName: params.deviceName,\n installFullControlEnabled,\n onProgress: (event) => {\n if (event.stage === 'start') return\n params.logInfo('Provider capability refreshed', {\n provider: event.providerId,\n status: event.status,\n duration_ms: event.durationMs,\n error: event.error,\n })\n },\n })\n currentProviderHealth = nextProviderHealth\n params.config.providerHealth = nextProviderHealth\n params.runtimeState.currentCapabilities = nextCapabilities\n params.runtimeState.currentProviderHealth = nextProviderHealth\n heartbeatStatus = computeGatewayOperationalStatus({\n capabilities: nextCapabilities,\n jobIngressState: params.runtimeState.currentJobIngressState,\n acceptingJobs: params.runtimeState.currentAcceptingJobs,\n })\n await params.sendHeartbeat(\n params.supabase,\n heartbeatStatus,\n getCurrentCapabilities(),\n params.deviceName\n )\n } catch (error) {\n heartbeatStatus = 'error'\n params.logError('Failed to refresh gateway capabilities', {\n error: error instanceof Error ? error.message : String(error),\n })\n await params.sendHeartbeat(\n params.supabase,\n heartbeatStatus,\n getCurrentCapabilities(),\n params.deviceName\n )\n } finally {\n heartbeatInFlight = false\n }\n }\n\n const start = () => {\n if (heartbeatTimer) return\n heartbeatTimer = setInterval(() => {\n void refreshHeartbeat()\n }, DEFAULT_HEARTBEAT_INTERVAL_MS)\n }\n\n const stop = () => {\n if (!heartbeatTimer) return\n clearInterval(heartbeatTimer)\n heartbeatTimer = null\n }\n\n const sendOfflineHeartbeat = async () => {\n heartbeatStatus = 'offline'\n await params.sendHeartbeat(\n params.supabase,\n 'offline',\n getCurrentCapabilities(),\n params.deviceName\n )\n }\n\n return {\n sendCurrentHeartbeat,\n syncOperationalHeartbeatIfChanged,\n refreshHeartbeat,\n start,\n stop,\n sendOfflineHeartbeat,\n }\n}\n", "import { spawn } from 'node:child_process'\nimport path from 'node:path'\nimport { parseBooleanEnv, parseNumberEnv } from '../cli-env.js'\nimport {\n getGatewayActiveWorkCounts,\n hasGatewayActiveWork,\n type GatewayActiveWorkRegistries,\n type GatewayShutdownMode,\n} from '../gateway-lifecycle.js'\nimport type { GatewayJobController } from '../gateway-job-controller.js'\nimport {\n readGatewayPackageVersion,\n readRestartProbeFingerprint,\n resolveGatewayPackageJsonPath,\n resolveGatewayRestartProbePath,\n} from '../gateway-restart.js'\nimport {\n isGatewayDevRuntimeModule,\n resolveRestartCheckIntervalMs,\n} from './runtime-utils.js'\nimport type { SpawnProcess } from './types.js'\n\nexport interface GatewayRestartSupervisor {\n maybeRestart: () => Promise<void>\n requestRestart: (reason: string) => void\n start: () => void\n stop: () => void\n}\n\nexport function createGatewayRestartSupervisor(params: {\n env: NodeJS.ProcessEnv\n entryPath: string\n modulePath: string\n execPath: string\n processArgs: string[]\n jobController: GatewayJobController\n activeWorkRegistries: GatewayActiveWorkRegistries\n spawnProcess?: SpawnProcess\n exitProcess: (code: number) => void\n performShutdown: (signal: string, mode?: GatewayShutdownMode) => Promise<void>\n isShutdownInProgress: () => boolean\n syncOperationalHeartbeatIfChanged: () => Promise<void>\n logInfo: (message: string, data?: Record<string, unknown>) => void\n setIntervalFn?: typeof setInterval\n clearIntervalFn?: typeof clearInterval\n}): GatewayRestartSupervisor {\n const spawnProcess = params.spawnProcess ?? spawn\n const setIntervalFn = params.setIntervalFn ?? setInterval\n const clearIntervalFn = params.clearIntervalFn ?? clearInterval\n const isDevModule = isGatewayDevRuntimeModule({\n entryPath: params.entryPath,\n modulePath: params.modulePath,\n })\n const autoRestartEnabled = parseBooleanEnv(\n params.env.PANORAMA_GATEWAY_AUTO_RESTART,\n !isDevModule\n )\n const restartCheckIntervalMs = resolveRestartCheckIntervalMs(params.env)\n const restartMaxWaitMs = Math.max(\n 0,\n parseNumberEnv(params.env.PANORAMA_GATEWAY_RESTART_MAX_WAIT_MS, 0)\n )\n const packageJsonPath = autoRestartEnabled\n ? resolveGatewayPackageJsonPath(params.entryPath, {\n modulePath: params.modulePath,\n env: params.env,\n })\n : null\n const startingVersion = packageJsonPath ? readGatewayPackageVersion(packageJsonPath) : null\n const restartProbePath = autoRestartEnabled\n ? resolveGatewayRestartProbePath(params.entryPath, params.modulePath)\n : null\n const startingProbeFingerprint = restartProbePath\n ? readRestartProbeFingerprint(restartProbePath)\n : null\n const restartCheckEnabled =\n autoRestartEnabled &&\n ((packageJsonPath && startingVersion) || (restartProbePath && startingProbeFingerprint))\n\n let observedVersion = startingVersion\n let observedProbeFingerprint = startingProbeFingerprint\n let restartRequested = false\n let restartDetectedAt: number | null = null\n let restartMaxWaitLogged = false\n let restartTimer: NodeJS.Timeout | null = null\n\n const restartGateway = async (reason: string): Promise<void> => {\n if (params.isShutdownInProgress()) return\n const counts = getGatewayActiveWorkCounts({\n jobController: params.jobController,\n registries: params.activeWorkRegistries,\n })\n if (hasGatewayActiveWork(counts)) {\n params.logInfo('Gateway restart waiting for active work to drain', {\n reason,\n ...counts,\n })\n return\n }\n\n params.logInfo('Gateway restarting', {\n reason,\n active_jobs: params.jobController.activeQueueCount(),\n active_subagent_runs: params.activeWorkRegistries.activeSubagentRuns.size,\n active_model_runs: params.activeWorkRegistries.activeModelRuns.size,\n active_shell_execs: params.activeWorkRegistries.activeShellExecRuns.size,\n })\n const child = spawnProcess(params.execPath, params.processArgs, {\n stdio: 'inherit',\n env: { ...params.env },\n })\n if (child.pid) {\n params.logInfo('Gateway replacement spawned', { pid: child.pid })\n }\n child.unref()\n await params.performShutdown(`restart:${reason}`, 'drain')\n params.exitProcess(0)\n }\n\n const maybeRestart = async () => {\n if (!restartRequested) return\n const counts = getGatewayActiveWorkCounts({\n jobController: params.jobController,\n registries: params.activeWorkRegistries,\n })\n if (hasGatewayActiveWork(counts)) {\n return\n }\n await restartGateway('all jobs complete')\n }\n\n const requestRestart = (reason: string) => {\n if (restartRequested) return\n restartRequested = true\n restartDetectedAt = Date.now()\n params.jobController.stopAcceptingJobs()\n params.logInfo('Gateway update detected; draining before restart', {\n reason,\n active_jobs: params.jobController.activeQueueCount(),\n active_subagent_runs: params.activeWorkRegistries.activeSubagentRuns.size,\n active_model_runs: params.activeWorkRegistries.activeModelRuns.size,\n active_shell_execs: params.activeWorkRegistries.activeShellExecRuns.size,\n })\n void params.syncOperationalHeartbeatIfChanged()\n void maybeRestart()\n }\n\n const checkForUpgrade = () => {\n if (!autoRestartEnabled || restartRequested) return\n if (packageJsonPath && observedVersion) {\n const nextVersion = readGatewayPackageVersion(packageJsonPath)\n if (!nextVersion) return\n if (nextVersion !== observedVersion) {\n requestRestart(`gateway version changed (${observedVersion} -> ${nextVersion})`)\n }\n return\n }\n if (restartProbePath && observedProbeFingerprint) {\n const nextFingerprint = readRestartProbeFingerprint(restartProbePath)\n if (!nextFingerprint) return\n if (nextFingerprint !== observedProbeFingerprint) {\n requestRestart(`gateway entry changed (${path.basename(restartProbePath)})`)\n }\n }\n }\n\n const start = () => {\n if (restartTimer) return\n if (restartCheckEnabled) {\n if (!packageJsonPath && restartProbePath && startingProbeFingerprint) {\n params.logInfo('Gateway auto-restart using entrypoint fingerprint', {\n path: restartProbePath,\n })\n }\n restartTimer = setIntervalFn(() => {\n checkForUpgrade()\n if (restartRequested && restartDetectedAt && restartMaxWaitMs > 0) {\n const elapsedMs = Date.now() - restartDetectedAt\n if (elapsedMs >= restartMaxWaitMs) {\n void maybeRestart()\n if (!restartMaxWaitLogged) {\n restartMaxWaitLogged = true\n const counts = getGatewayActiveWorkCounts({\n jobController: params.jobController,\n registries: params.activeWorkRegistries,\n })\n params.logInfo('Gateway restart max wait reached; continuing to drain active work', {\n wait_ms: elapsedMs,\n ...counts,\n })\n }\n }\n }\n }, restartCheckIntervalMs)\n } else if (autoRestartEnabled) {\n params.logInfo('Gateway auto-restart disabled (package.json not found)', {\n entryPath: params.entryPath,\n })\n }\n }\n\n const stop = () => {\n if (!restartTimer) return\n clearIntervalFn(restartTimer)\n restartTimer = null\n }\n\n return {\n maybeRestart,\n requestRestart,\n start,\n stop,\n }\n}\n", "import type { ChildProcess } from 'node:child_process'\nimport type { GatewayJobController } from './gateway-job-controller.js'\nimport type { ActiveSubagentRun } from './gateway-runtime-state.js'\nimport type { ActiveModelRun } from './gateway-model-run.js'\nimport type { ActiveShellExecRun } from './gateway-shell-exec.js'\n\nexport type GatewayShutdownMode = 'drain' | 'terminate'\n\nexport interface GatewayActiveWorkRegistries {\n activeSubagentRuns: Map<string, ActiveSubagentRun>\n activeModelRuns: Map<string, ActiveModelRun>\n activeShellExecRuns: Map<string, ActiveShellExecRun>\n}\n\nexport interface GatewayActiveWorkCounts {\n activeClaimedJobs: number\n activeSubagentRuns: number\n activeModelRuns: number\n activeShellExecs: number\n}\n\nexport type GatewayChildTerminator = (\n child: ChildProcess | undefined,\n options: { reason: string; graceMs: number; context: string }\n) => void\n\nexport function getGatewayActiveWorkCounts(params: {\n jobController: Pick<GatewayJobController, 'activeClaimedJobCount'>\n registries: GatewayActiveWorkRegistries\n}): GatewayActiveWorkCounts {\n return {\n activeClaimedJobs: params.jobController.activeClaimedJobCount(),\n activeSubagentRuns: params.registries.activeSubagentRuns.size,\n activeModelRuns: params.registries.activeModelRuns.size,\n activeShellExecs: params.registries.activeShellExecRuns.size,\n }\n}\n\nexport function hasGatewayActiveWork(counts: GatewayActiveWorkCounts): boolean {\n return (\n counts.activeClaimedJobs > 0 ||\n counts.activeSubagentRuns > 0 ||\n counts.activeModelRuns > 0 ||\n counts.activeShellExecs > 0\n )\n}\n\nexport function requestGatewayActiveWorkShutdown(params: {\n mode: GatewayShutdownMode\n reason: string\n registries: GatewayActiveWorkRegistries\n terminateChild: GatewayChildTerminator\n subagentGraceMs: number\n processGraceMs: number\n}): void {\n if (params.mode === 'drain') {\n return\n }\n\n const { reason, registries, terminateChild, subagentGraceMs, processGraceMs } = params\n\n for (const activeRun of registries.activeSubagentRuns.values()) {\n activeRun.cancelled = true\n activeRun.cancelReason = reason\n terminateChild(activeRun.child, {\n reason,\n graceMs: subagentGraceMs,\n context: 'gateway_shutdown_subagent',\n })\n }\n\n for (const activeModelRun of registries.activeModelRuns.values()) {\n activeModelRun.shutdownRequested = true\n activeModelRun.shutdownReason = reason\n terminateChild(activeModelRun.child, {\n reason,\n graceMs: processGraceMs,\n context: 'gateway_shutdown_model_run',\n })\n }\n\n for (const activeExecRun of registries.activeShellExecRuns.values()) {\n activeExecRun.shutdownRequested = true\n activeExecRun.shutdownReason = reason\n terminateChild(activeExecRun.child, {\n reason,\n graceMs: processGraceMs,\n context: 'gateway_shutdown_shell_exec',\n })\n }\n}\n\nexport async function waitForGatewayActiveWorkToDrain(params: {\n jobController: Pick<GatewayJobController, 'activeClaimedJobCount'>\n registries: GatewayActiveWorkRegistries\n sleep: (ms: number) => Promise<void>\n pollIntervalMs?: number\n shouldContinue?: () => boolean\n}): Promise<void> {\n const pollIntervalMs = params.pollIntervalMs ?? 100\n const shouldContinue = params.shouldContinue ?? (() => true)\n\n while (shouldContinue()) {\n const counts = getGatewayActiveWorkCounts({\n jobController: params.jobController,\n registries: params.registries,\n })\n if (!hasGatewayActiveWork(counts)) {\n return\n }\n await params.sleep(pollIntervalMs)\n }\n}\n", "import fsSync from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst GATEWAY_PACKAGE_NAME = '@panorama-ai/gateway'\n\nfunction readCurrentModulePath(): string {\n try {\n return fileURLToPath(import.meta.url)\n } catch {\n return ''\n }\n}\n\nfunction isGatewayPackageJson(candidatePath: string): boolean {\n try {\n const pkg = JSON.parse(fsSync.readFileSync(candidatePath, 'utf8')) as { name?: string }\n return pkg.name === GATEWAY_PACKAGE_NAME\n } catch {\n return false\n }\n}\n\nfunction findGatewayPackageJsonFrom(startDir: string): string | null {\n let current = startDir\n while (true) {\n const candidate = path.join(current, 'package.json')\n if (fsSync.existsSync(candidate) && isGatewayPackageJson(candidate)) {\n return candidate\n }\n const parent = path.dirname(current)\n if (parent === current) return null\n current = parent\n }\n}\n\nexport function resolveGatewayPackageJsonPath(\n entryPath: string,\n params: {\n modulePath?: string\n env?: NodeJS.ProcessEnv\n } = {}\n): string | null {\n const candidates = new Set<string>()\n const env = params.env ?? process.env\n const envOverride = env.PANORAMA_GATEWAY_PACKAGE_JSON\n if (envOverride && envOverride.trim().length > 0) {\n candidates.add(envOverride.trim())\n }\n if (entryPath) {\n candidates.add(entryPath)\n try {\n candidates.add(fsSync.realpathSync(entryPath))\n } catch {\n // ignore realpath errors\n }\n }\n\n const modulePath = params.modulePath ?? readCurrentModulePath()\n if (modulePath) {\n candidates.add(modulePath)\n }\n\n for (const candidate of candidates) {\n const resolved = path.resolve(candidate)\n if (resolved.endsWith(`${path.sep}package.json`)) {\n if (fsSync.existsSync(resolved) && isGatewayPackageJson(resolved)) {\n return resolved\n }\n const fallback = findGatewayPackageJsonFrom(path.dirname(resolved))\n if (fallback) return fallback\n continue\n }\n\n let startDir = resolved\n try {\n if (!fsSync.statSync(resolved).isDirectory()) {\n startDir = path.dirname(resolved)\n }\n } catch {\n startDir = path.dirname(resolved)\n }\n\n const found = findGatewayPackageJsonFrom(startDir)\n if (found) return found\n }\n\n return null\n}\n\nexport function resolveGatewayRestartProbePath(\n entryPath: string,\n modulePath: string\n): string | null {\n const candidates = [entryPath, modulePath]\n for (const candidate of candidates) {\n if (!candidate) continue\n try {\n const resolved = path.resolve(candidate)\n if (fsSync.existsSync(resolved)) {\n return resolved\n }\n } catch {\n // ignore resolution errors\n }\n try {\n const realpath = fsSync.realpathSync(candidate)\n if (fsSync.existsSync(realpath)) {\n return realpath\n }\n } catch {\n // ignore realpath errors\n }\n }\n return null\n}\n\nexport function readRestartProbeFingerprint(filePath: string): string | null {\n try {\n const stat = fsSync.statSync(filePath)\n if (!stat.isFile()) return null\n return `${Math.round(stat.mtimeMs)}:${stat.size}`\n } catch {\n return null\n }\n}\n\nexport function readGatewayPackageVersion(packageJsonPath: string): string | null {\n try {\n const pkg = JSON.parse(fsSync.readFileSync(packageJsonPath, 'utf8')) as { version?: string }\n return typeof pkg.version === 'string' && pkg.version.trim().length > 0\n ? pkg.version.trim()\n : null\n } catch {\n return null\n }\n}\n", "import {\n buildRequestedCancelMetadata,\n} from '@panorama/shared/subagents/cancel-orchestrator'\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from './database.types.js'\nimport { asJson } from './gateway-run-helpers.js'\nimport {\n buildErrorOutput,\n mergeMetadata,\n} from './subagent-run-helpers.js'\n\nexport interface SubagentShutdownRunEventInsert {\n supabase: SupabaseClient<Database>\n runId: string\n subagentId: string\n teamId: string\n gatewayId: string | null\n sequence: number\n eventType: string\n payload: Record<string, unknown>\n}\n\nexport async function cancelSubagentRunOnGatewayShutdown(params: {\n supabase: SupabaseClient<Database>\n subagentId: string\n runId: string\n reason: string\n getNextSubagentRunEventSequence: (\n supabase: SupabaseClient<Database>,\n runId: string\n ) => Promise<number>\n insertSubagentRunEvent: (params: SubagentShutdownRunEventInsert) => Promise<number | null>\n logError: (message: string, data?: Record<string, unknown>) => void\n}): Promise<void> {\n const {\n supabase,\n subagentId,\n runId,\n reason,\n getNextSubagentRunEventSequence,\n insertSubagentRunEvent,\n logError,\n } = params\n const nowIso = new Date().toISOString()\n const cancelledOutput = buildErrorOutput(reason)\n const { data: subagentRow, error: subagentLoadError } = await supabase\n .from('subagents')\n .select('team_id, gateway_id, metadata')\n .eq('id', subagentId)\n .maybeSingle()\n\n if (subagentLoadError) {\n logError('Failed to load subagent during shutdown cancellation', {\n subagentId,\n runId,\n error: subagentLoadError.message,\n })\n return\n }\n\n const { data: runRow, error: runLoadError } = await supabase\n .from('subagent_runs')\n .select('team_id, gateway_id, metadata')\n .eq('id', runId)\n .maybeSingle()\n\n if (runLoadError) {\n logError('Failed to load subagent run during shutdown cancellation', {\n subagentId,\n runId,\n error: runLoadError.message,\n })\n return\n }\n\n const updatedRunMetadata = {\n ...buildRequestedCancelMetadata({\n base: (runRow?.metadata ?? {}) as Record<string, unknown>,\n run_id: runId,\n reason,\n requested_at: nowIso,\n cancel_support: 'gateway',\n cancellation_scope: 'gateway',\n }),\n cancel_state: 'acknowledged',\n cancelled: true,\n last_run_at: nowIso,\n }\n\n const { data: updatedRun, error: runUpdateError } = await supabase\n .from('subagent_runs')\n .update({\n status: 'cancelled',\n output: asJson(cancelledOutput),\n error: reason,\n completed_at: nowIso,\n metadata: asJson(updatedRunMetadata),\n })\n .eq('id', runId)\n .eq('status', 'running')\n .select('id')\n .maybeSingle()\n\n if (runUpdateError) {\n logError('Failed to cancel subagent run during shutdown', {\n subagentId,\n runId,\n error: runUpdateError.message,\n })\n }\n\n const updatedSubagentMetadata = mergeMetadata(\n (subagentRow?.metadata ?? {}) as Record<string, unknown>,\n {\n cancel_run_id: runId,\n cancel_requested_at: nowIso,\n cancel_reason: reason,\n cancel_state: 'acknowledged',\n cancel_support: 'gateway',\n cancellation_scope: 'gateway',\n cancelled: true,\n last_run_at: nowIso,\n }\n )\n\n const { error: subagentUpdateError } = await supabase\n .from('subagents')\n .update({\n status: 'cancelled',\n output: asJson(cancelledOutput),\n error: reason,\n completed_at: nowIso,\n metadata: asJson(updatedSubagentMetadata),\n })\n .eq('id', subagentId)\n .eq('status', 'running')\n\n if (subagentUpdateError) {\n logError('Failed to cancel subagent during shutdown', {\n subagentId,\n runId,\n error: subagentUpdateError.message,\n })\n }\n\n if (updatedRun?.id && subagentRow?.team_id) {\n const nextSequence = await getNextSubagentRunEventSequence(supabase, runId)\n await insertSubagentRunEvent({\n supabase,\n runId,\n subagentId,\n teamId: subagentRow.team_id,\n gatewayId: subagentRow.gateway_id,\n sequence: nextSequence,\n eventType: 'cancellation_acknowledged',\n payload: {\n reason,\n source: 'gateway_shutdown',\n cancellation_scope: 'gateway',\n },\n })\n await insertSubagentRunEvent({\n supabase,\n runId,\n subagentId,\n teamId: subagentRow.team_id,\n gatewayId: subagentRow.gateway_id,\n sequence: nextSequence + 1,\n eventType: 'run_cancelled',\n payload: {\n reason,\n source: 'gateway_shutdown',\n cancellation_scope: 'gateway',\n },\n })\n }\n}\n", "import type { ParsedArgs } from '../cli-args.js'\nimport type { GatewayJobController } from '../gateway-job-controller.js'\nimport {\n resolveJobSubagentId,\n type GatewayJobRow,\n type GatewayJobStatus,\n} from '../gateway-jobs.js'\nimport {\n requestGatewayActiveWorkShutdown,\n waitForGatewayActiveWorkToDrain,\n type GatewayActiveWorkRegistries,\n type GatewayChildTerminator,\n type GatewayShutdownMode,\n} from '../gateway-lifecycle.js'\nimport type { GatewayRuntimeState } from '../gateway-runtime-state.js'\nimport { sleep } from '../gateway-run-helpers.js'\nimport type { GatewaySubagentRunEventInsert } from '../gateway-subagent-run-types.js'\nimport { cancelSubagentRunOnGatewayShutdown } from '../subagent-shutdown-cancellation.js'\nimport {\n PROCESS_KILL_GRACE_MS,\n SUBAGENT_CANCEL_KILL_TIMEOUT_MS,\n} from './runtime-utils.js'\nimport type { GatewayLocalRuntimeEventPayload, GatewaySupabaseClient } from './types.js'\n\nexport interface GatewayShutdownCoordinator {\n performShutdown: (signal: string, mode?: GatewayShutdownMode) => Promise<void>\n shutdown: (signal: string) => Promise<void>\n isShutdownInProgress: () => boolean\n}\n\nexport function createGatewayShutdownCoordinator(params: {\n supabase: GatewaySupabaseClient\n options: ParsedArgs['options']\n runtimeState: GatewayRuntimeState<GatewayLocalRuntimeEventPayload>\n jobController: GatewayJobController\n activeWorkRegistries: GatewayActiveWorkRegistries\n requestChildTermination: GatewayChildTerminator\n syncOperationalHeartbeatIfChanged: () => Promise<void>\n stopHeartbeat: () => void\n stopRestart: () => void\n sendOfflineHeartbeat: () => Promise<void>\n removePidFile: (options?: ParsedArgs['options']) => Promise<void>\n completeJob: (\n supabase: GatewaySupabaseClient,\n jobId: string,\n status: GatewayJobStatus,\n result: Record<string, unknown> | null,\n errorMessage?: string\n ) => Promise<void>\n getNextSubagentRunEventSequence: (\n supabase: GatewaySupabaseClient,\n runId: string\n ) => Promise<number>\n insertSubagentRunEvent: (params: GatewaySubagentRunEventInsert) => Promise<number | null>\n logInfo: (message: string, data?: Record<string, unknown>) => void\n logError: (message: string, data?: Record<string, unknown>) => void\n exitProcess: (code: number) => void\n}): GatewayShutdownCoordinator {\n let shutdownInProgress = false\n let shutdownPromise: Promise<void> | null = null\n\n const runShutdownStep = async (step: string, action: () => Promise<void>): Promise<void> => {\n try {\n await action()\n } catch (error) {\n params.logError('Gateway shutdown step failed', {\n step,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n const requestActiveWorkShutdown = (mode: GatewayShutdownMode, reason: string) => {\n requestGatewayActiveWorkShutdown({\n mode,\n reason,\n registries: params.activeWorkRegistries,\n terminateChild: params.requestChildTermination,\n subagentGraceMs: SUBAGENT_CANCEL_KILL_TIMEOUT_MS,\n processGraceMs: PROCESS_KILL_GRACE_MS,\n })\n }\n\n const waitForActiveJobsToDrain = async () => {\n await waitForGatewayActiveWorkToDrain({\n jobController: params.jobController,\n registries: params.activeWorkRegistries,\n sleep,\n })\n }\n\n const cancelSubagentRunOnShutdown = async (\n subagentId: string,\n runId: string,\n reason: string\n ) => {\n await cancelSubagentRunOnGatewayShutdown({\n supabase: params.supabase,\n subagentId,\n runId,\n reason,\n getNextSubagentRunEventSequence: params.getNextSubagentRunEventSequence,\n insertSubagentRunEvent: params.insertSubagentRunEvent,\n logError: params.logError,\n })\n }\n\n const finalizeResidualGatewayJobs = async (reason: string) => {\n for (const [jobId, jobRow] of params.jobController.activeClaimedJobEntries()) {\n if ((jobRow as GatewayJobRow).job_type === 'subagent_run') {\n const subagentId = resolveJobSubagentId(jobRow)\n const activeRun = subagentId ? params.runtimeState.activeSubagentRuns.get(subagentId) : null\n if (subagentId && activeRun) {\n await cancelSubagentRunOnShutdown(subagentId, activeRun.runId, reason)\n }\n await params.completeJob(\n params.supabase,\n jobId,\n 'cancelled',\n { message: reason, cancelled: true },\n reason\n )\n continue\n }\n\n await params.completeJob(\n params.supabase,\n jobId,\n 'cancelled',\n { message: reason, cancelled: true },\n reason\n )\n }\n }\n\n const performShutdown = async (signal: string, mode: GatewayShutdownMode = 'drain') => {\n if (shutdownPromise) return await shutdownPromise\n shutdownPromise = (async () => {\n if (shutdownInProgress) return\n shutdownInProgress = true\n params.jobController.beginShutdown()\n params.logInfo('Gateway shutting down', { signal, mode })\n params.stopHeartbeat()\n params.stopRestart()\n await runShutdownStep('sync_operational_heartbeat', params.syncOperationalHeartbeatIfChanged)\n requestActiveWorkShutdown(mode, `Gateway shutting down (${signal})`)\n await runShutdownStep('wait_for_active_jobs', waitForActiveJobsToDrain)\n if (mode === 'terminate') {\n await runShutdownStep('finalize_residual_gateway_jobs', () =>\n finalizeResidualGatewayJobs(`Gateway shutting down (${signal})`)\n )\n }\n params.runtimeState.currentJobIngressState = {\n pending: false,\n ready: false,\n }\n await runShutdownStep('send_offline_heartbeat', params.sendOfflineHeartbeat)\n await runShutdownStep('disconnect_job_channel', () => params.jobController.disconnect())\n await runShutdownStep('remove_pid_file', () => params.removePidFile(params.options))\n params.runtimeState.currentRuntimeOptions = null\n })()\n return await shutdownPromise\n }\n\n const shutdown = async (signal: string) => {\n try {\n await performShutdown(signal)\n } catch (error) {\n params.logError('Gateway shutdown failed unexpectedly', {\n signal,\n error: error instanceof Error ? error.message : String(error),\n })\n } finally {\n params.exitProcess(0)\n }\n }\n\n return {\n performShutdown,\n shutdown,\n isShutdownInProgress: () => shutdownInProgress,\n }\n}\n", "import type { ChildProcess } from 'node:child_process'\nimport type { GatewayCapabilitiesV1 } from '@panorama/shared/gateway/capabilities'\nimport type { GatewayProviderHealth, GatewayProviderId } from './cli-providers/types.js'\nimport type { ParsedArgs } from './cli-args.js'\nimport type { GatewayConfig } from './gateway-state.js'\nimport type { GatewayJobIngressState } from './gateway-operational-status.js'\nimport type { ActiveModelRun } from './gateway-model-run.js'\nimport type { ActiveShellExecRun } from './gateway-shell-exec.js'\n\nexport type ActiveSubagentRun = {\n runId: string\n child?: ChildProcess\n cancelled: boolean\n cancelReason?: string\n}\n\nexport type GatewayRuntimeState<GatewayEventPayload = unknown> = {\n activeSubagentRuns: Map<string, ActiveSubagentRun>\n activeModelRuns: Map<string, ActiveModelRun>\n activeShellExecRuns: Map<string, ActiveShellExecRun>\n pendingCancelByRunId: Map<string, { reason: string }>\n pendingCancelBySubagentId: Map<string, { reason: string }>\n pendingGatewayEvents: GatewayEventPayload[]\n currentCapabilities: GatewayCapabilitiesV1 | null\n currentDeviceName: string | null\n currentConfig: GatewayConfig | null\n currentProviderHealth: Partial<Record<GatewayProviderId, GatewayProviderHealth>> | null\n currentJobIngressState: GatewayJobIngressState | null\n currentAcceptingJobs: boolean\n currentRuntimeOptions: ParsedArgs['options'] | null\n}\n\nexport function createGatewayRuntimeState<\n GatewayEventPayload = unknown,\n>(): GatewayRuntimeState<GatewayEventPayload> {\n return {\n activeSubagentRuns: new Map<string, ActiveSubagentRun>(),\n activeModelRuns: new Map<string, ActiveModelRun>(),\n activeShellExecRuns: new Map<string, ActiveShellExecRun>(),\n pendingCancelByRunId: new Map<string, { reason: string }>(),\n pendingCancelBySubagentId: new Map<string, { reason: string }>(),\n pendingGatewayEvents: [],\n currentCapabilities: null,\n currentDeviceName: null,\n currentConfig: null,\n currentProviderHealth: null,\n currentJobIngressState: null,\n currentAcceptingJobs: true,\n currentRuntimeOptions: null,\n }\n}\n", "import { randomUUID } from 'node:crypto'\nimport { setTimeout as sleep } from 'node:timers/promises'\nimport {\n resolveManagedGatewayRuntimeConfig,\n type ManagedGatewayRuntimeConfig,\n} from './managed-runtime/config.js'\nimport {\n resolveManagedGatewayRuntimeDependencies,\n type ManagedGatewayRuntimeDependencies,\n} from './managed-runtime/dependencies.js'\nimport { executeManagedLinuxExecution } from './managed-runtime/execution-dispatcher.js'\nimport { startHostHeartbeatLoop } from './managed-runtime/heartbeat.js'\nimport {\n describeLinuxHostStopReason,\n readLinuxHostObservedState,\n type LinuxHostObservedState,\n} from './managed-runtime/host-state.js'\nimport { MANAGED_GATEWAY_LOG_PREFIX } from './managed-runtime/runtime-utils.js'\nimport { createWakeSignal } from './managed-runtime/wake-signal.js'\n\nexport { buildManagedShellExecutionEnv } from './managed-runtime/shell-execution.js'\nexport { resolveManagedGatewayRuntimeConfig } from './managed-runtime/config.js'\nexport type { ManagedGatewayRuntimeConfig } from './managed-runtime/config.js'\nexport type { ManagedGatewayRuntimeDependencies } from './managed-runtime/dependencies.js'\n\nexport async function startManagedGatewayRuntime(\n config: ManagedGatewayRuntimeConfig = resolveManagedGatewayRuntimeConfig(),\n dependencies: ManagedGatewayRuntimeDependencies = {}\n): Promise<void> {\n const runtimeDependencies = resolveManagedGatewayRuntimeDependencies(dependencies)\n let shutdownRequested = false\n let draining = false\n let reconciliationRequired = true\n let activeExecutionId: string | null = null\n let requestWakeSignal: ((reason: string) => void) | null = null\n let fatalHeartbeatError: Error | null = null\n\n const requestShutdown = (reason: string) => {\n if (shutdownRequested) {\n return\n }\n shutdownRequested = true\n requestWakeSignal?.(reason)\n }\n\n const applyObservedHostState = (state: LinuxHostObservedState, source: string) => {\n const stopReason = describeLinuxHostStopReason(state, config.hostAttemptGeneration)\n if (shutdownRequested) {\n return\n }\n\n if (stopReason) {\n if (!draining) {\n draining = true\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} draining due to host lifecycle signal`, {\n source,\n reason: stopReason,\n hostId: config.hostId,\n attemptGeneration: config.hostAttemptGeneration,\n status: state.status,\n runtimeState: state.runtimeState,\n desiredPowerState: state.desiredPowerState,\n allocationState: state.allocationState,\n })\n requestWakeSignal?.('host_drain_requested')\n }\n return\n }\n\n if (draining) {\n draining = false\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} host became runnable again; resuming dispatch`, {\n source,\n hostId: config.hostId,\n attemptGeneration: config.hostAttemptGeneration,\n })\n requestWakeSignal?.('host_runnable_again')\n }\n }\n\n const heartbeatHost = async () => {\n const host = await runtimeDependencies.heartbeatLinuxHost({\n controlUrl: config.hostControlUrl,\n controlToken: config.hostControlToken,\n runtimeId: config.runtimeId,\n controlTimeoutMs: config.controlTimeoutMs,\n })\n const observedHostState = readLinuxHostObservedState(host)\n applyObservedHostState(observedHostState, 'heartbeat')\n\n if (\n !shutdownRequested &&\n !draining &&\n !activeExecutionId &&\n requestWakeSignal &&\n !describeLinuxHostStopReason(observedHostState, config.hostAttemptGeneration)\n ) {\n requestWakeSignal('heartbeat_tick')\n }\n }\n\n const onSignal = (signal: NodeJS.Signals) => {\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} received shutdown signal`, { signal })\n requestShutdown('shutdown')\n }\n\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} starting managed gateway runtime`, {\n agentId: config.agentId,\n hostId: config.hostId,\n attemptGeneration: config.hostAttemptGeneration,\n runtimeId: config.runtimeId,\n })\n\n let stopHeartbeat: (() => void) | null = null\n let stopRealtimeWakeLoop: (() => Promise<void>) | null = null\n let unsubscribeAuthStateChange: (() => void) | null = null\n const removeSignalHandlers = runtimeDependencies.registerSignalHandlers(onSignal)\n\n try {\n await heartbeatHost()\n if (shutdownRequested) {\n return\n }\n\n const { requestWake, waitForWake } = createWakeSignal('startup')\n requestWakeSignal = requestWake\n const realtimeClient = await runtimeDependencies.createRealtimeClient({\n supabaseUrl: config.supabaseUrl,\n supabaseAnonKey: config.supabaseAnonKey,\n hostControlToken: config.hostControlToken,\n agentId: config.agentId,\n hostId: config.hostId,\n hostAttemptGeneration: config.hostAttemptGeneration,\n controlTimeoutMs: config.controlTimeoutMs,\n })\n unsubscribeAuthStateChange = realtimeClient.unsubscribeAuthStateChange\n stopRealtimeWakeLoop = runtimeDependencies.startRealtimeWakeLoop({\n supabase: realtimeClient.supabase,\n hostId: config.hostId,\n hostAttemptGeneration: config.hostAttemptGeneration,\n retryBackoffMs: config.retryBackoffMs,\n onReconnectRequired() {\n reconciliationRequired = true\n },\n onHostStateObserved: applyObservedHostState,\n requestWake,\n shouldStop: () => shutdownRequested,\n })\n\n stopHeartbeat = startHostHeartbeatLoop({\n intervalMs: config.heartbeatIntervalMs,\n maxConsecutiveFailures: config.maxConsecutiveHeartbeatFailures,\n heartbeatHost,\n onFatalFailure: (error) => {\n if (fatalHeartbeatError) {\n return\n }\n\n fatalHeartbeatError = error\n console.error(`${MANAGED_GATEWAY_LOG_PREFIX} stopping after repeated heartbeat failures`, { error })\n requestShutdown('heartbeat_failure')\n },\n })\n\n while (!shutdownRequested) {\n await waitForWake()\n if (fatalHeartbeatError || shutdownRequested) {\n break\n }\n\n if (reconciliationRequired) {\n try {\n const reconciliation = await runtimeDependencies.reconcileExecutionLifecycle({\n controlUrl: config.hostControlUrl,\n controlToken: config.hostControlToken,\n runtimeId: config.runtimeId,\n controlTimeoutMs: config.controlTimeoutMs,\n })\n reconciliationRequired = false\n if (reconciliation.recoveredCount > 0 || reconciliation.requeuedCount > 0) {\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} reconciled stale managed executions`, reconciliation)\n }\n } catch (error) {\n console.error(`${MANAGED_GATEWAY_LOG_PREFIX} failed to reconcile execution lifecycle`, { error })\n await sleep(config.retryBackoffMs)\n requestWake('reconcile_retry')\n continue\n }\n }\n\n if (draining) {\n continue\n }\n\n while (!shutdownRequested && !draining) {\n try {\n const claimToken = randomUUID()\n const execution = await runtimeDependencies.dispatchLinuxExecution({\n controlUrl: config.hostControlUrl,\n controlToken: config.hostControlToken,\n runtimeId: config.runtimeId,\n claimToken,\n controlTimeoutMs: config.controlTimeoutMs,\n })\n\n if (!execution?.id) {\n break\n }\n\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} running managed execution`, {\n executionId: execution.id,\n agentId: execution.agent_id,\n })\n const outcome = await executeManagedLinuxExecution({\n config,\n execution,\n registerCancellation: () => undefined,\n onExecutionStarted(executionId) {\n activeExecutionId = executionId\n },\n onExecutionFinished() {\n activeExecutionId = null\n },\n dependencies: runtimeDependencies,\n })\n\n if (outcome.reconciliationRequired) {\n reconciliationRequired = true\n requestWake(outcome.wakeReason ?? 'post_execution_reconcile')\n break\n }\n\n if (reconciliationRequired) {\n requestWake('post_execution_reconcile')\n break\n }\n } catch (error) {\n console.error(`${MANAGED_GATEWAY_LOG_PREFIX} failed to dispatch managed execution`, { error })\n reconciliationRequired = true\n await sleep(config.retryBackoffMs)\n requestWake('dispatch_retry')\n break\n }\n }\n }\n } finally {\n stopHeartbeat?.()\n await stopRealtimeWakeLoop?.()\n unsubscribeAuthStateChange?.()\n removeSignalHandlers()\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} stopped managed gateway runtime`, {\n agentId: config.agentId,\n hostId: config.hostId,\n attemptGeneration: config.hostAttemptGeneration,\n })\n }\n\n if (fatalHeartbeatError) {\n throw fatalHeartbeatError\n }\n}\n", "export const LINUX_HOST_CONTROL_ENDPOINT_PATH = '/functions/v1/linux-host-control';\nexport function buildLinuxHostControlUrl(baseUrl) {\n const trimmed = baseUrl.trim().replace(/\\/+$/, '');\n return `${trimmed}${LINUX_HOST_CONTROL_ENDPOINT_PATH}`;\n}\n", "export const TOOL_EXECUTION_ENDPOINT_PATH = '/functions/v1/execute-tool';\nexport function buildToolExecutionUrl(baseUrl) {\n const trimmed = baseUrl.trim().replace(/\\/+$/, '');\n return `${trimmed}${TOOL_EXECUTION_ENDPOINT_PATH}`;\n}\n", "import { buildLinuxHostControlUrl } from '@panorama/shared/linux-host-control/contract'\nimport { buildToolExecutionUrl } from '@panorama/shared/tools/execution-contract'\nimport { hostname } from 'node:os'\nimport process from 'node:process'\n\nconst DEFAULT_RETRY_BACKOFF_MS = 2_000\nconst DEFAULT_CONTROL_TIMEOUT_MS = 30_000\nconst DEFAULT_EXEC_TIMEOUT_MS = 300_000\nconst DEFAULT_HEARTBEAT_INTERVAL_MS = 15_000\nconst DEFAULT_MAX_CONSECUTIVE_HEARTBEAT_FAILURES = 3\nconst DEFAULT_OUTPUT_CAPTURE_BYTES = 5_000_000\n\nexport type ManagedGatewayRuntimeConfig = {\n agentId: string\n hostId: string\n hostAttemptGeneration: number\n runtimeId: string\n supabaseUrl: string\n supabaseAnonKey: string\n hostControlUrl: string\n hostControlToken: string\n toolExecutionUrl: string\n toolExecutionToken: string\n retryBackoffMs: number\n controlTimeoutMs: number\n execTimeoutMs: number\n outputCaptureBytes: number\n heartbeatIntervalMs: number\n maxConsecutiveHeartbeatFailures: number\n}\n\nfunction requireEnv(name: string, env: NodeJS.ProcessEnv = process.env): string {\n const value = env[name]?.trim()\n if (!value) {\n throw new Error(`${name} is required`)\n }\n return value\n}\n\nfunction readPositiveInt(\n name: string,\n fallback: number,\n env: NodeJS.ProcessEnv = process.env\n): number {\n const raw = env[name]?.trim()\n if (!raw) return fallback\n const parsed = Number(raw)\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`${name} must be a positive number`)\n }\n return Math.floor(parsed)\n}\n\nfunction requirePositiveInt(name: string, env: NodeJS.ProcessEnv = process.env): number {\n const raw = requireEnv(name, env)\n const parsed = Number(raw)\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`${name} must be a positive number`)\n }\n return Math.floor(parsed)\n}\n\nexport function resolveManagedGatewayRuntimeConfig(\n env: NodeJS.ProcessEnv = process.env\n): ManagedGatewayRuntimeConfig {\n const agentId = requireEnv('PANORAMA_AGENT_ID', env)\n const hostId = requireEnv('PANORAMA_LINUX_HOST_ID', env)\n const hostAttemptGeneration = requirePositiveInt('PANORAMA_LINUX_HOST_ATTEMPT_GENERATION', env)\n const supabaseUrl = env.PANORAMA_SUPABASE_URL?.trim() || env.SUPABASE_URL?.trim() || null\n const supabaseAnonKey =\n env.PANORAMA_SUPABASE_ANON_KEY?.trim() ||\n env.SUPABASE_ANON_KEY?.trim() ||\n env.SUPABASE_PUBLISHABLE_KEY?.trim() ||\n null\n const hostControlUrl =\n env.PANORAMA_LINUX_HOST_CONTROL_URL?.trim() ||\n (supabaseUrl ? buildLinuxHostControlUrl(supabaseUrl) : null)\n const toolExecutionUrl =\n env.PANORAMA_TOOL_EXECUTION_URL?.trim() ||\n (supabaseUrl ? buildToolExecutionUrl(supabaseUrl) : null)\n\n if (!hostControlUrl) {\n throw new Error('PANORAMA_LINUX_HOST_CONTROL_URL is required')\n }\n if (!toolExecutionUrl) {\n throw new Error('PANORAMA_TOOL_EXECUTION_URL is required')\n }\n if (!supabaseUrl) {\n throw new Error('PANORAMA_SUPABASE_URL or SUPABASE_URL is required')\n }\n if (!supabaseAnonKey) {\n throw new Error(\n 'PANORAMA_SUPABASE_ANON_KEY, SUPABASE_ANON_KEY, or SUPABASE_PUBLISHABLE_KEY is required'\n )\n }\n\n return {\n agentId,\n hostId,\n hostAttemptGeneration,\n runtimeId: env.PANORAMA_MANAGED_RUNTIME_ID?.trim() || `${hostname()}:${process.pid}`,\n supabaseUrl,\n supabaseAnonKey,\n hostControlUrl,\n hostControlToken: requireEnv('PANORAMA_LINUX_HOST_CONTROL_TOKEN', env),\n toolExecutionUrl,\n toolExecutionToken: requireEnv('PANORAMA_TOOL_EXECUTION_TOKEN', env),\n retryBackoffMs: readPositiveInt(\n 'PANORAMA_MANAGED_RUNTIME_RETRY_BACKOFF_MS',\n DEFAULT_RETRY_BACKOFF_MS,\n env\n ),\n controlTimeoutMs: readPositiveInt(\n 'PANORAMA_MANAGED_RUNTIME_CONTROL_TIMEOUT_MS',\n DEFAULT_CONTROL_TIMEOUT_MS,\n env\n ),\n execTimeoutMs: readPositiveInt('PANORAMA_AGENT_EXEC_TIMEOUT_MS', DEFAULT_EXEC_TIMEOUT_MS, env),\n outputCaptureBytes: readPositiveInt(\n 'PANORAMA_MANAGED_RUNTIME_OUTPUT_CAPTURE_BYTES',\n DEFAULT_OUTPUT_CAPTURE_BYTES,\n env\n ),\n heartbeatIntervalMs: readPositiveInt(\n 'PANORAMA_MANAGED_RUNTIME_HEARTBEAT_INTERVAL_MS',\n DEFAULT_HEARTBEAT_INTERVAL_MS,\n env\n ),\n maxConsecutiveHeartbeatFailures: readPositiveInt(\n 'PANORAMA_MANAGED_RUNTIME_MAX_CONSECUTIVE_HEARTBEAT_FAILURES',\n DEFAULT_MAX_CONSECUTIVE_HEARTBEAT_FAILURES,\n env\n ),\n }\n}\n", "export const LINUX_HOST_SESSION_EXCHANGE_ENDPOINT_PATH = '/functions/v1/exchange-linux-host-session';\nexport function buildLinuxHostSessionExchangeUrl(baseUrl) {\n const trimmed = baseUrl.trim().replace(/\\/+$/, '');\n return `${trimmed}${LINUX_HOST_SESSION_EXCHANGE_ENDPOINT_PATH}`;\n}\n", "import type { SupabaseClient } from '@supabase/supabase-js'\nimport type { Database } from '../database.types.js'\n\nexport const MANAGED_GATEWAY_LOG_PREFIX = '[panorama-gateway managed]'\n\nexport type ManagedGatewaySupabaseClient = SupabaseClient<Database>\n\nexport function asError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error))\n}\n\nexport async function withAbortTimeout<T>(\n timeoutMs: number,\n timeoutMessage: string,\n operation: (signal: AbortSignal) => Promise<T>,\n externalSignal?: AbortSignal\n): Promise<T> {\n const controller = new AbortController()\n let timedOut = false\n const timeoutHandle = setTimeout(() => {\n timedOut = true\n controller.abort()\n }, timeoutMs)\n const abortFromExternalSignal = () => controller.abort()\n\n if (externalSignal?.aborted) {\n controller.abort()\n } else {\n externalSignal?.addEventListener('abort', abortFromExternalSignal, { once: true })\n }\n\n try {\n return await operation(controller.signal)\n } catch (error) {\n if (timedOut) {\n throw new Error(timeoutMessage)\n }\n throw error\n } finally {\n clearTimeout(timeoutHandle)\n externalSignal?.removeEventListener('abort', abortFromExternalSignal)\n }\n}\n\nexport function normalizeRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>\n }\n\n return {}\n}\n", "import {\n buildLinuxHostSessionExchangeUrl,\n type LinuxHostSessionExchangeResponse,\n} from '@panorama/shared/linux-host-session/contract'\nimport type {\n LinuxHostClaimedExecution,\n LinuxHostControlHostEnvelope,\n LinuxHostControlRequest,\n LinuxHostControlResponse,\n} from '@panorama/shared/linux-host-control/contract'\nimport { withAbortTimeout } from './runtime-utils.js'\n\nexport async function postLinuxHostControlRequest(params: {\n controlUrl: string\n controlToken: string\n body: LinuxHostControlRequest\n timeoutMs: number\n signal?: AbortSignal\n}): Promise<LinuxHostControlResponse> {\n return await withAbortTimeout(\n params.timeoutMs,\n `Linux host control request timed out after ${params.timeoutMs}ms`,\n async (signal) => {\n const response = await fetch(params.controlUrl, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${params.controlToken}`,\n 'Content-Type': 'application/json',\n 'X-Request-Source': 'gateway_managed',\n },\n body: JSON.stringify(params.body),\n signal,\n })\n\n let payload: unknown\n try {\n payload = await response.json()\n } catch {\n payload = null\n }\n\n if (!response.ok) {\n const message =\n payload && typeof payload === 'object' && 'error' in payload\n ? String((payload as { error?: string }).error ?? 'Linux host control request failed')\n : `Linux host control request failed with status ${response.status}`\n throw new Error(message)\n }\n\n return payload as LinuxHostControlResponse\n },\n params.signal\n )\n}\n\nexport async function exchangeLinuxHostSession(params: {\n supabaseUrl: string\n supabaseAnonKey: string\n hostControlToken: string\n timeoutMs: number\n}): Promise<LinuxHostSessionExchangeResponse> {\n return await withAbortTimeout(\n params.timeoutMs,\n `Linux host session exchange timed out after ${params.timeoutMs}ms`,\n async (signal) => {\n const response = await fetch(buildLinuxHostSessionExchangeUrl(params.supabaseUrl), {\n method: 'POST',\n headers: {\n apikey: params.supabaseAnonKey,\n Authorization: `Bearer ${params.supabaseAnonKey}`,\n 'Content-Type': 'application/json',\n 'X-Request-Source': 'gateway_managed',\n },\n body: JSON.stringify({\n host_control_token: params.hostControlToken,\n }),\n signal,\n })\n\n let payload: unknown\n try {\n payload = await response.json()\n } catch {\n payload = null\n }\n\n if (!response.ok) {\n const message =\n payload && typeof payload === 'object' && 'error' in payload\n ? String((payload as { error?: string }).error ?? 'Linux host session exchange failed')\n : `Linux host session exchange failed with status ${response.status}`\n throw new Error(message)\n }\n\n return payload as LinuxHostSessionExchangeResponse\n }\n )\n}\n\nexport async function heartbeatLinuxHost(params: {\n controlUrl: string\n controlToken: string\n runtimeId: string\n controlTimeoutMs: number\n}): Promise<LinuxHostControlHostEnvelope> {\n const response = await postLinuxHostControlRequest({\n controlUrl: params.controlUrl,\n controlToken: params.controlToken,\n timeoutMs: params.controlTimeoutMs,\n body: {\n action: 'heartbeat',\n runtime_id: params.runtimeId,\n },\n })\n\n return response.host\n}\n\nexport async function dispatchLinuxExecution(params: {\n controlUrl: string\n controlToken: string\n runtimeId: string\n claimToken: string\n controlTimeoutMs: number\n}): Promise<LinuxHostClaimedExecution | null> {\n const response = await postLinuxHostControlRequest({\n controlUrl: params.controlUrl,\n controlToken: params.controlToken,\n timeoutMs: params.controlTimeoutMs,\n body: {\n action: 'claim_execution',\n runtime_id: params.runtimeId,\n claim_token: params.claimToken,\n },\n })\n\n return response.execution ?? null\n}\n\nexport async function startLinuxExecution(params: {\n controlUrl: string\n controlToken: string\n runtimeId: string\n executionId: string\n claimToken: string\n controlTimeoutMs: number\n}): Promise<LinuxHostClaimedExecution | null> {\n const response = await postLinuxHostControlRequest({\n controlUrl: params.controlUrl,\n controlToken: params.controlToken,\n timeoutMs: params.controlTimeoutMs,\n body: {\n action: 'start_execution',\n runtime_id: params.runtimeId,\n execution_id: params.executionId,\n claim_token: params.claimToken,\n },\n })\n\n return response.execution ?? null\n}\n\nexport async function completeLinuxExecution(params: {\n controlUrl: string\n controlToken: string\n runtimeId: string\n executionId: string\n claimToken: string\n executionStatus: 'succeeded' | 'failed' | 'timed_out' | 'cancelled'\n exitCode?: number | null\n durationMs?: number | null\n stdout?: string | null\n stderr?: string | null\n error?: string | null\n executionMetadata?: Record<string, unknown> | null\n stepStatus?: 'completed' | 'failed' | 'skipped' | 'uncertain' | null\n stepResult?: Record<string, unknown> | null\n stepError?: string | null\n stepUncertaintyReason?: string | null\n controlSignal?: 'continue' | 'pause' | 'stop' | null\n controlTimeoutMs: number\n}): Promise<LinuxHostControlResponse['completion']> {\n const response = await postLinuxHostControlRequest({\n controlUrl: params.controlUrl,\n controlToken: params.controlToken,\n timeoutMs: params.controlTimeoutMs,\n body: {\n action: 'complete_execution',\n runtime_id: params.runtimeId,\n execution_id: params.executionId,\n claim_token: params.claimToken,\n execution_status: params.executionStatus,\n exit_code: params.exitCode ?? null,\n duration_ms: params.durationMs ?? null,\n stdout: params.stdout ?? null,\n stderr: params.stderr ?? null,\n error: params.error ?? null,\n execution_metadata: params.executionMetadata ?? undefined,\n step_status: params.stepStatus ?? null,\n step_result: params.stepResult ?? undefined,\n step_error: params.stepError ?? null,\n step_uncertainty_reason: params.stepUncertaintyReason ?? null,\n control_signal: params.controlSignal ?? null,\n },\n })\n\n return response.completion ?? null\n}\n\nexport async function reconcileExecutionLifecycle(params: {\n controlUrl: string\n controlToken: string\n runtimeId: string\n controlTimeoutMs: number\n}): Promise<{ recoveredCount: number; requeuedCount: number }> {\n const response = await postLinuxHostControlRequest({\n controlUrl: params.controlUrl,\n controlToken: params.controlToken,\n timeoutMs: params.controlTimeoutMs,\n body: {\n action: 'reconcile_execution_lifecycle',\n runtime_id: params.runtimeId,\n },\n })\n\n return {\n recoveredCount: response.recovered_count ?? 0,\n requeuedCount: response.requeued_count ?? 0,\n }\n}\n", "import { createClient, type RealtimeChannel, type RealtimePostgresChangesPayload } from '@supabase/supabase-js'\nimport { exchangeLinuxHostSession } from './control-client.js'\nimport {\n readLinuxHostObservedState,\n readLinuxHostWakeState,\n type LinuxHostObservedState,\n} from './host-state.js'\nimport {\n MANAGED_GATEWAY_LOG_PREFIX,\n normalizeRecord,\n type ManagedGatewaySupabaseClient,\n} from './runtime-utils.js'\n\nconst DEFAULT_REALTIME_EVENTS_PER_SECOND = 10\n\nexport async function createManagedRealtimeClient(params: {\n supabaseUrl: string\n supabaseAnonKey: string\n hostControlToken: string\n agentId: string\n hostId: string\n hostAttemptGeneration: number\n controlTimeoutMs: number\n}): Promise<{\n supabase: ManagedGatewaySupabaseClient\n unsubscribeAuthStateChange: () => void\n}> {\n const sessionExchange = await exchangeLinuxHostSession({\n supabaseUrl: params.supabaseUrl,\n supabaseAnonKey: params.supabaseAnonKey,\n hostControlToken: params.hostControlToken,\n timeoutMs: params.controlTimeoutMs,\n })\n\n if (!sessionExchange.success) {\n throw new Error('Linux host session exchange returned an unsuccessful response.')\n }\n if (sessionExchange.agent_id !== params.agentId) {\n throw new Error(\n `Linux host session exchange returned agent ${sessionExchange.agent_id}, expected ${params.agentId}`\n )\n }\n if (sessionExchange.host_id !== params.hostId) {\n throw new Error(\n `Linux host session exchange returned host ${sessionExchange.host_id}, expected ${params.hostId}`\n )\n }\n if (sessionExchange.attempt_generation !== params.hostAttemptGeneration) {\n throw new Error(\n `Linux host session exchange returned attempt generation ${sessionExchange.attempt_generation}, expected ${params.hostAttemptGeneration}`\n )\n }\n\n const supabase = createClient(params.supabaseUrl, params.supabaseAnonKey, {\n auth: {\n persistSession: false,\n autoRefreshToken: true,\n detectSessionInUrl: false,\n },\n realtime: {\n params: {\n eventsPerSecond: DEFAULT_REALTIME_EVENTS_PER_SECOND,\n },\n },\n }) as ManagedGatewaySupabaseClient\n\n const { data: sessionData, error: sessionError } = await supabase.auth.setSession({\n access_token: sessionExchange.access_token,\n refresh_token: sessionExchange.refresh_token,\n })\n\n if (sessionError || !sessionData?.session) {\n throw new Error(sessionError?.message || 'Linux host session exchange did not return a session.')\n }\n\n const authStateSubscription = supabase.auth.onAuthStateChange((event, session) => {\n if (!session) {\n return\n }\n\n if (event === 'TOKEN_REFRESHED' || event === 'SIGNED_IN') {\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} refreshed managed runtime session`, {\n event,\n expiresAt: session.expires_at ?? null,\n })\n }\n })\n\n return {\n supabase,\n unsubscribeAuthStateChange() {\n authStateSubscription.data.subscription.unsubscribe()\n },\n }\n}\n\nexport function startManagedRealtimeWakeLoop(params: {\n supabase: ManagedGatewaySupabaseClient\n hostId: string\n hostAttemptGeneration: number\n retryBackoffMs: number\n onReconnectRequired: () => void\n onHostStateObserved: (state: LinuxHostObservedState, source: string) => void\n requestWake: (reason: string) => void\n shouldStop: () => boolean\n}): () => Promise<void> {\n let activeChannel: RealtimeChannel | null = null\n let reconnectTimer: NodeJS.Timeout | null = null\n let lastHostWakeState: string | null = null\n\n const syncHostWakeState = async () => {\n const { data, error } = await params.supabase\n .from('linux_agent_hosts')\n .select('attempt_generation, allocation_state, desired_power_state, status, runtime_state, error')\n .eq('id', params.hostId)\n .maybeSingle()\n\n if (error) {\n console.warn(`${MANAGED_GATEWAY_LOG_PREFIX} failed to seed managed host realtime baseline`, {\n hostId: params.hostId,\n error: error.message,\n })\n return\n }\n\n if (data) {\n const normalized = normalizeRecord(data)\n lastHostWakeState = readLinuxHostWakeState(normalized)\n params.onHostStateObserved(readLinuxHostObservedState(normalized), 'baseline')\n }\n }\n\n const scheduleReconnect = (reason: string) => {\n if (params.shouldStop() || reconnectTimer) {\n return\n }\n\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null\n void connectChannel(`reconnect:${reason}`)\n }, params.retryBackoffMs)\n }\n\n const handleHostPayload = (payload: RealtimePostgresChangesPayload<Record<string, unknown>>) => {\n const nextRow = normalizeRecord(payload.new)\n params.onHostStateObserved(\n readLinuxHostObservedState(nextRow),\n `realtime_${payload.eventType.toLowerCase()}`\n )\n const nextWakeState = readLinuxHostWakeState(nextRow)\n if (nextWakeState === lastHostWakeState) {\n return\n }\n lastHostWakeState = nextWakeState\n\n params.onReconnectRequired()\n params.requestWake(`host_${payload.eventType.toLowerCase()}`)\n }\n\n const handleExecutionPayload = (\n payload: RealtimePostgresChangesPayload<Record<string, unknown>>\n ) => {\n const nextRow = normalizeRecord(payload.new)\n const nextStatus = typeof nextRow.status === 'string' ? nextRow.status : null\n if (payload.eventType === 'INSERT' || nextStatus === 'queued') {\n params.requestWake(`execution_${payload.eventType.toLowerCase()}`)\n }\n }\n\n const connectChannel = async (reason: string) => {\n if (params.shouldStop()) {\n return\n }\n\n const previousChannel = activeChannel\n activeChannel = null\n if (previousChannel) {\n try {\n await previousChannel.unsubscribe()\n } catch {\n // ignore unsubscribe failures during reconnect\n }\n }\n\n const nextChannel = params.supabase\n .channel(`managed_gateway_runtime_${params.hostId}_${params.hostAttemptGeneration}`)\n .on(\n 'postgres_changes',\n {\n event: 'UPDATE',\n schema: 'public',\n table: 'linux_agent_hosts',\n filter: `id=eq.${params.hostId}`,\n },\n handleHostPayload\n )\n .on(\n 'postgres_changes',\n {\n event: 'INSERT',\n schema: 'public',\n table: 'linux_agent_executions',\n filter: `host_id=eq.${params.hostId}`,\n },\n handleExecutionPayload\n )\n .on(\n 'postgres_changes',\n {\n event: 'UPDATE',\n schema: 'public',\n table: 'linux_agent_executions',\n filter: `host_id=eq.${params.hostId}`,\n },\n handleExecutionPayload\n )\n\n activeChannel = nextChannel\n\n nextChannel.subscribe((status, error) => {\n if (activeChannel !== nextChannel || params.shouldStop()) {\n return\n }\n\n if (status === 'SUBSCRIBED') {\n void (async () => {\n await syncHostWakeState()\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} subscribed to managed host realtime channel`, {\n hostId: params.hostId,\n attemptGeneration: params.hostAttemptGeneration,\n reason,\n })\n params.onReconnectRequired()\n params.requestWake(`realtime_subscribed:${reason}`)\n })()\n return\n }\n\n if (status === 'CHANNEL_ERROR' || status === 'TIMED_OUT' || status === 'CLOSED') {\n console.error(`${MANAGED_GATEWAY_LOG_PREFIX} managed host realtime channel unavailable`, {\n status,\n reason,\n error: error?.message ?? null,\n })\n params.onReconnectRequired()\n scheduleReconnect(status.toLowerCase())\n }\n })\n }\n\n void connectChannel('startup')\n\n return async () => {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer)\n reconnectTimer = null\n }\n\n const channelToClose = activeChannel\n activeChannel = null\n if (channelToClose) {\n await channelToClose.unsubscribe().catch(() => undefined)\n }\n\n await params.supabase.removeAllChannels().catch(() => undefined)\n }\n}\n", "import type { LinuxHostControlHostEnvelope } from '@panorama/shared/linux-host-control/contract'\n\nexport type LinuxHostObservedState = {\n attemptGeneration: number | null\n allocationState: string | null\n desiredPowerState: string | null\n status: string | null\n runtimeState: string | null\n error: string | null\n}\n\nfunction readNullableString(value: unknown): string | null {\n return typeof value === 'string' ? value : null\n}\n\nexport function readLinuxHostWakeState(row: Record<string, unknown>): string {\n return JSON.stringify({\n attempt_generation:\n typeof row.attempt_generation === 'number' ? row.attempt_generation : row.attempt_generation ?? null,\n allocation_state:\n typeof row.allocation_state === 'string' ? row.allocation_state : row.allocation_state ?? null,\n desired_power_state:\n typeof row.desired_power_state === 'string'\n ? row.desired_power_state\n : row.desired_power_state ?? null,\n status: typeof row.status === 'string' ? row.status : row.status ?? null,\n runtime_state:\n typeof row.runtime_state === 'string' ? row.runtime_state : row.runtime_state ?? null,\n error: typeof row.error === 'string' ? row.error : row.error ?? null,\n })\n}\n\nexport function readLinuxHostObservedState(\n value: Record<string, unknown> | (LinuxHostControlHostEnvelope & { error?: string | null })\n): LinuxHostObservedState {\n return {\n attemptGeneration:\n typeof value.attempt_generation === 'number'\n ? value.attempt_generation\n : value.attempt_generation === null || value.attempt_generation === undefined\n ? null\n : Number.isFinite(Number(value.attempt_generation))\n ? Number(value.attempt_generation)\n : null,\n allocationState: readNullableString(value.allocation_state),\n desiredPowerState: readNullableString(value.desired_power_state),\n status: readNullableString(value.status),\n runtimeState: readNullableString(value.runtime_state),\n error: readNullableString(value.error),\n }\n}\n\nexport function describeLinuxHostStopReason(\n state: LinuxHostObservedState,\n expectedAttemptGeneration: number\n): string | null {\n if (state.attemptGeneration !== null && state.attemptGeneration !== expectedAttemptGeneration) {\n return `host attempt rotated to ${state.attemptGeneration}`\n }\n\n if (state.allocationState !== null && state.allocationState !== 'warm') {\n return `host allocation is ${state.allocationState}`\n }\n\n if (state.desiredPowerState !== null && state.desiredPowerState !== 'running') {\n return `desired power state is ${state.desiredPowerState}`\n }\n\n if (state.status === 'stopping' || state.status === 'stopped') {\n return `host status is ${state.status}`\n }\n\n if (state.runtimeState === 'stopping' || state.runtimeState === 'stopped') {\n return `host runtime_state is ${state.runtimeState}`\n }\n\n return null\n}\n", "const CONTROL_ACTIONS = new Set(['continue', 'pause', 'stop']);\nexport function parseControlSignalCandidate(value) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n const rawNextAction = value.nextAction;\n if (typeof rawNextAction !== 'string' || !CONTROL_ACTIONS.has(rawNextAction)) {\n return null;\n }\n const pauseDurationValue = value.pauseDuration ??\n value.seconds;\n const pauseDuration = typeof pauseDurationValue === 'number' &&\n Number.isFinite(pauseDurationValue) &&\n pauseDurationValue > 0\n ? pauseDurationValue\n : undefined;\n return {\n nextAction: rawNextAction,\n pauseDuration,\n };\n}\nexport function extractControlSignalFromMetadata(metadata) {\n if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) {\n return null;\n }\n return parseControlSignalCandidate(metadata.control);\n}\nexport function extractControlSignalFromToolResult(result) {\n if (!result || typeof result !== 'object' || Array.isArray(result)) {\n return null;\n }\n const metadataSignal = extractControlSignalFromMetadata(result.metadata);\n if (metadataSignal) {\n return metadataSignal;\n }\n return (parseControlSignalCandidate(result.controlSignal) ??\n parseControlSignalCandidate(result.control) ??\n parseControlSignalCandidate(result));\n}\nexport function resolveControlSignals(signals) {\n if (!signals.length) {\n return null;\n }\n let bestPause = null;\n let sawContinue = false;\n for (const signal of signals) {\n if (signal.nextAction === 'stop') {\n return signal;\n }\n if (signal.nextAction === 'pause') {\n if (!bestPause) {\n bestPause = signal;\n }\n else {\n const left = bestPause.pauseDuration ?? 0;\n const right = signal.pauseDuration ?? 0;\n if (right > left) {\n bestPause = signal;\n }\n }\n continue;\n }\n if (signal.nextAction === 'continue') {\n sawContinue = true;\n }\n }\n if (bestPause) {\n return bestPause;\n }\n return sawContinue ? { nextAction: 'continue' } : null;\n}\n", "import { parseControlSignalCandidate, type ControlSignal } from '@panorama/shared/control-signals'\nimport { spawn } from 'node:child_process'\nimport { randomUUID } from 'node:crypto'\nimport { readFile, unlink } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport { BoundedOutputCapture } from '../process-output-capture.js'\n\nconst DEFAULT_SIGTERM_GRACE_MS = 5_000\nconst DEFAULT_OUTPUT_CAPTURE_BYTES = 5_000_000\nconst CONTROL_SIGNAL_PATH_ENV = 'PANORAMA_CONTROL_SIGNAL_PATH'\n\nexport type CommandExecutionResult = {\n status: 'succeeded' | 'failed' | 'timed_out' | 'cancelled'\n stdout: string\n stderr: string\n stdoutObservedBytes: number\n stderrObservedBytes: number\n stdoutCapturedBytes: number\n stderrCapturedBytes: number\n stdoutTruncated: boolean\n stderrTruncated: boolean\n outputCaptureBytes: number\n exitCode: number | null\n durationMs: number\n error: string | null\n}\n\nexport type ExecuteCommandOptions = {\n registerCancellation?: (cancel: (() => void) | null) => void\n env?: NodeJS.ProcessEnv\n outputCaptureBytes?: number\n}\n\nexport async function executeCommand(\n command: string,\n timeoutMs: number,\n options: ExecuteCommandOptions = {}\n): Promise<CommandExecutionResult> {\n const startedAt = Date.now()\n const outputCaptureBytes = options.outputCaptureBytes ?? DEFAULT_OUTPUT_CAPTURE_BYTES\n\n return await new Promise<CommandExecutionResult>((resolve) => {\n const child = spawn('bash', ['-lc', command], {\n stdio: ['ignore', 'pipe', 'pipe'],\n detached: true,\n env: options.env,\n })\n\n const stdoutOutput = new BoundedOutputCapture(outputCaptureBytes)\n const stderrOutput = new BoundedOutputCapture(outputCaptureBytes)\n let resolved = false\n let timedOut = false\n let spawnError: string | null = null\n let interrupted = false\n let forceKillHandle: NodeJS.Timeout | null = null\n\n const finish = (result: CommandExecutionResult) => {\n if (resolved) return\n resolved = true\n clearTimeout(timeoutHandle)\n if (forceKillHandle) {\n clearTimeout(forceKillHandle)\n forceKillHandle = null\n }\n options.registerCancellation?.(null)\n resolve(result)\n }\n\n const killProcessGroup = (signal: NodeJS.Signals) => {\n if (!child.pid) return\n try {\n process.kill(-child.pid, signal)\n } catch {\n try {\n child.kill(signal)\n } catch {\n // ignore best-effort kill failures\n }\n }\n }\n\n const scheduleForceKill = () => {\n if (forceKillHandle) return\n forceKillHandle = setTimeout(() => {\n forceKillHandle = null\n killProcessGroup('SIGKILL')\n }, DEFAULT_SIGTERM_GRACE_MS)\n forceKillHandle.unref()\n }\n\n const timeoutHandle = setTimeout(() => {\n if (resolved) return\n timedOut = true\n killProcessGroup('SIGTERM')\n scheduleForceKill()\n }, timeoutMs)\n\n options.registerCancellation?.(() => {\n if (resolved || interrupted) return\n interrupted = true\n killProcessGroup('SIGTERM')\n scheduleForceKill()\n })\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdoutOutput.append(chunk)\n })\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderrOutput.append(chunk)\n })\n\n child.on('error', (error) => {\n spawnError = error.message\n })\n\n child.on('close', (code) => {\n const stdout = stdoutOutput.readText()\n const stderr = stderrOutput.readText()\n const durationMs = Date.now() - startedAt\n const commonResult = {\n stdout,\n stderr,\n stdoutObservedBytes: stdoutOutput.observedBytes,\n stderrObservedBytes: stderrOutput.observedBytes,\n stdoutCapturedBytes: stdoutOutput.capturedBytes,\n stderrCapturedBytes: stderrOutput.capturedBytes,\n stdoutTruncated: stdoutOutput.truncated,\n stderrTruncated: stderrOutput.truncated,\n outputCaptureBytes,\n exitCode: code,\n durationMs,\n }\n\n if (timedOut) {\n finish({\n ...commonResult,\n status: 'timed_out',\n error: `Command timed out after ${timeoutMs}ms`,\n })\n return\n }\n\n if (interrupted) {\n finish({\n ...commonResult,\n status: 'cancelled',\n error: 'Command was interrupted because the managed gateway host was stopping.',\n })\n return\n }\n\n if (spawnError) {\n finish({\n ...commonResult,\n status: 'failed',\n error: spawnError,\n })\n return\n }\n\n finish({\n ...commonResult,\n status: code === 0 ? 'succeeded' : 'failed',\n error: code === 0 ? null : `Command exited with code ${code ?? 'unknown'}`,\n })\n })\n })\n}\n\nexport function buildManagedShellExecutionEnv(params: {\n baseEnv: NodeJS.ProcessEnv\n agentId: string\n cycleId: string | null\n toolExecutionUrl: string\n toolExecutionToken: string\n controlSignalPath: string\n}): NodeJS.ProcessEnv {\n const safeEnv: NodeJS.ProcessEnv = {}\n const passthroughKeys = [\n 'HOME',\n 'HOSTNAME',\n 'LANG',\n 'LC_ALL',\n 'LOGNAME',\n 'PATH',\n 'PWD',\n 'SHELL',\n 'SHLVL',\n 'TERM',\n 'TMPDIR',\n 'USER',\n ]\n\n for (const key of passthroughKeys) {\n const value = params.baseEnv[key]\n if (typeof value === 'string' && value.length > 0) {\n safeEnv[key] = value\n }\n }\n\n safeEnv.PANORAMA_AGENT_ID = params.agentId\n safeEnv.PANORAMA_TOOL_EXECUTION_URL = params.toolExecutionUrl\n safeEnv.PANORAMA_TOOL_EXECUTION_TOKEN = params.toolExecutionToken\n safeEnv[CONTROL_SIGNAL_PATH_ENV] = params.controlSignalPath\n\n if (params.cycleId) {\n safeEnv.PANORAMA_AGENT_CYCLE_ID = params.cycleId\n }\n\n return safeEnv\n}\n\nexport function buildControlSignalPath(executionId: string): string {\n return join(tmpdir(), `panorama-control-${executionId}-${randomUUID()}.json`)\n}\n\nexport async function readCommandControlSignal(path: string): Promise<ControlSignal | null> {\n try {\n const raw = await readFile(path, 'utf8')\n return parseControlSignalCandidate(JSON.parse(raw))\n } catch {\n return null\n } finally {\n try {\n await unlink(path)\n } catch {\n // best-effort cleanup\n }\n }\n}\n", "import {\n completeLinuxExecution,\n dispatchLinuxExecution,\n heartbeatLinuxHost,\n reconcileExecutionLifecycle,\n startLinuxExecution,\n} from './control-client.js'\nimport { createManagedRealtimeClient, startManagedRealtimeWakeLoop } from './realtime.js'\nimport { executeCommand } from './shell-execution.js'\n\nexport type ResolvedManagedGatewayRuntimeDependencies = {\n heartbeatLinuxHost: typeof heartbeatLinuxHost\n dispatchLinuxExecution: typeof dispatchLinuxExecution\n startLinuxExecution: typeof startLinuxExecution\n completeLinuxExecution: typeof completeLinuxExecution\n reconcileExecutionLifecycle: typeof reconcileExecutionLifecycle\n executeCommand: typeof executeCommand\n createRealtimeClient: typeof createManagedRealtimeClient\n startRealtimeWakeLoop: typeof startManagedRealtimeWakeLoop\n registerSignalHandlers: (onSignal: (signal: NodeJS.Signals) => void) => () => void\n}\n\nexport type ManagedGatewayRuntimeDependencies = Partial<ResolvedManagedGatewayRuntimeDependencies>\n\nconst defaultManagedGatewayRuntimeDependencies: ResolvedManagedGatewayRuntimeDependencies = {\n heartbeatLinuxHost,\n dispatchLinuxExecution,\n startLinuxExecution,\n completeLinuxExecution,\n reconcileExecutionLifecycle,\n executeCommand,\n createRealtimeClient: createManagedRealtimeClient,\n startRealtimeWakeLoop: startManagedRealtimeWakeLoop,\n registerSignalHandlers(onSignal) {\n process.once('SIGINT', onSignal)\n process.once('SIGTERM', onSignal)\n return () => {\n process.off('SIGINT', onSignal)\n process.off('SIGTERM', onSignal)\n }\n },\n}\n\nexport function resolveManagedGatewayRuntimeDependencies(\n dependencies: ManagedGatewayRuntimeDependencies = {}\n): ResolvedManagedGatewayRuntimeDependencies {\n return {\n ...defaultManagedGatewayRuntimeDependencies,\n ...dependencies,\n }\n}\n", "import type { ControlSignal } from '@panorama/shared/control-signals'\nimport type { LinuxHostClaimedExecution } from '@panorama/shared/linux-host-control/contract'\nimport process from 'node:process'\nimport type { ManagedGatewayRuntimeConfig } from './config.js'\nimport type { completeLinuxExecution, startLinuxExecution } from './control-client.js'\nimport {\n buildControlSignalPath,\n buildManagedShellExecutionEnv,\n executeCommand,\n readCommandControlSignal,\n type CommandExecutionResult,\n} from './shell-execution.js'\nimport {\n buildLinuxStepResultPayload,\n buildOutputCaptureMetadata,\n buildPreview,\n type LinuxExecutionCompletion,\n} from './step-result.js'\nimport { normalizeRecord, MANAGED_GATEWAY_LOG_PREFIX } from './runtime-utils.js'\n\nexport type ManagedExecutionOutcome = {\n reconciliationRequired: boolean\n wakeReason?: string\n}\n\nexport interface ExecuteManagedLinuxExecutionDependencies {\n startLinuxExecution: typeof startLinuxExecution\n completeLinuxExecution: typeof completeLinuxExecution\n executeCommand: typeof executeCommand\n}\n\nexport function resolveLinuxExecutionCompletion(\n result: CommandExecutionResult,\n controlSignal: ControlSignal | null\n): LinuxExecutionCompletion {\n if (result.status === 'succeeded') {\n return {\n stepStatus: 'completed',\n toolCallStatus: 'completed',\n controlSignal: controlSignal?.nextAction ?? 'continue',\n pauseDuration: controlSignal?.nextAction === 'pause' ? controlSignal.pauseDuration : undefined,\n }\n }\n\n if (result.status === 'failed') {\n return {\n stepStatus: 'failed',\n toolCallStatus: 'failed',\n controlSignal: 'continue',\n }\n }\n\n if (result.status === 'cancelled') {\n return {\n stepStatus: 'uncertain',\n toolCallStatus: 'failed',\n controlSignal: 'stop',\n uncertaintyReason: 'linux_execution_cancelled_after_start',\n }\n }\n\n return {\n stepStatus: 'uncertain',\n toolCallStatus: 'failed',\n controlSignal: 'stop',\n uncertaintyReason: 'linux_execution_timed_out_after_start',\n }\n}\n\nexport async function executeManagedLinuxExecution(params: {\n config: ManagedGatewayRuntimeConfig\n execution: LinuxHostClaimedExecution\n registerCancellation: (cancel: (() => void) | null) => void\n onExecutionStarted?: (executionId: string) => void\n onExecutionFinished?: () => void\n dependencies: ExecuteManagedLinuxExecutionDependencies\n}): Promise<ManagedExecutionOutcome> {\n const { config } = params\n const { dependencies } = params\n const claimToken = params.execution.claim_token\n if (!claimToken) {\n throw new Error(`Managed execution ${params.execution.id} is missing claim token`)\n }\n\n const startedExecution = await dependencies.startLinuxExecution({\n controlUrl: config.hostControlUrl,\n controlToken: config.hostControlToken,\n runtimeId: config.runtimeId,\n executionId: params.execution.id,\n claimToken,\n controlTimeoutMs: config.controlTimeoutMs,\n })\n\n if (!startedExecution?.id) {\n console.warn(`${MANAGED_GATEWAY_LOG_PREFIX} managed execution disappeared before start acknowledgement`, {\n executionId: params.execution.id,\n })\n return {\n reconciliationRequired: true,\n wakeReason: 'start_ack_missing',\n }\n }\n\n const command = startedExecution.command\n const controlSignalPath = buildControlSignalPath(startedExecution.id)\n params.onExecutionStarted?.(startedExecution.id)\n\n let result: CommandExecutionResult\n try {\n result = await dependencies.executeCommand(command, config.execTimeoutMs, {\n env: buildManagedShellExecutionEnv({\n baseEnv: process.env,\n agentId: config.agentId,\n cycleId: startedExecution.cycle_id,\n toolExecutionUrl: config.toolExecutionUrl,\n toolExecutionToken: config.toolExecutionToken,\n controlSignalPath,\n }),\n outputCaptureBytes: config.outputCaptureBytes,\n registerCancellation: (cancel) => {\n params.registerCancellation(cancel)\n },\n })\n } finally {\n params.registerCancellation(null)\n params.onExecutionFinished?.()\n }\n\n const controlSignal = await readCommandControlSignal(controlSignalPath)\n const stdoutPreview = buildPreview(result.stdout)\n const stderrPreview = buildPreview(result.stderr)\n const stdoutCaptureMetadata = buildOutputCaptureMetadata('stdout', result)\n const stderrCaptureMetadata = buildOutputCaptureMetadata('stderr', result)\n const executionCompletion = resolveLinuxExecutionCompletion(result, controlSignal)\n const stepResult = buildLinuxStepResultPayload({\n executionId: startedExecution.id,\n command,\n result,\n completion: executionCompletion,\n executionMetadata: startedExecution.metadata,\n })\n\n const completion = await dependencies.completeLinuxExecution({\n controlUrl: config.hostControlUrl,\n controlToken: config.hostControlToken,\n runtimeId: config.runtimeId,\n executionId: startedExecution.id,\n claimToken,\n executionStatus: result.status,\n exitCode: result.exitCode,\n durationMs: result.durationMs,\n stdout: result.stdout,\n stderr: result.stderr,\n error: result.error,\n executionMetadata: {\n ...normalizeRecord(startedExecution.metadata),\n runtime_id: config.runtimeId,\n claim_token: claimToken,\n started_by_gateway_mode: 'managed',\n stdout_preview_truncated: stdoutPreview.truncated,\n stderr_preview_truncated: stderrPreview.truncated,\n ...stdoutCaptureMetadata,\n ...stderrCaptureMetadata,\n },\n stepStatus: executionCompletion.stepStatus,\n stepResult,\n stepError: result.error,\n stepUncertaintyReason: executionCompletion.uncertaintyReason ?? null,\n controlSignal: executionCompletion.controlSignal,\n controlTimeoutMs: config.controlTimeoutMs,\n })\n\n if (!completion?.run_id) {\n console.warn(\n `${MANAGED_GATEWAY_LOG_PREFIX} execution was no longer active for this gateway when finalizing step; skipping follow-up`,\n {\n executionId: startedExecution.id,\n runId: completion?.run_id ?? null,\n stepUpdated: completion?.step_updated ?? null,\n }\n )\n return {\n reconciliationRequired: true,\n wakeReason: 'completion_followup_reconcile',\n }\n }\n\n if (completion.step_updated === false) {\n console.warn(\n `${MANAGED_GATEWAY_LOG_PREFIX} execution completed but the linked step was not updated; control plane recovery was queued`,\n {\n executionId: startedExecution.id,\n runId: completion.run_id,\n stepUpdated: completion.step_updated,\n }\n )\n return {\n reconciliationRequired: true,\n wakeReason: 'completion_step_reconcile',\n }\n }\n\n console.log(`${MANAGED_GATEWAY_LOG_PREFIX} completed managed command`, {\n executionId: startedExecution.id,\n status: result.status,\n runId: completion.run_id,\n })\n\n return { reconciliationRequired: false }\n}\n", "const RESERVED_TOOL_RESULT_METADATA_KEYS = new Set([\n 'log_type',\n 'actor',\n 'row_role',\n 'tool_name',\n 'tool_color',\n 'execution_time',\n 'action_summary',\n 'summary_pending',\n 'summary_state',\n 'tool_cost',\n 'cycle_id',\n 'run_id',\n 'tool_call_id',\n 'message_id',\n 'step_index',\n 'cycle_timeline',\n 'summary_started_at',\n 'summary_completed_at',\n 'summary_duration_ms',\n 'summary_error',\n 'tool_call_link_missing',\n 'original_type',\n]);\nfunction appendIfDefined(target, key, value) {\n if (value !== undefined && value !== null) {\n target[key] = value;\n }\n}\nfunction appendExtraMetadata(target, extraMetadata) {\n if (!extraMetadata)\n return;\n for (const [key, value] of Object.entries(extraMetadata)) {\n if (RESERVED_TOOL_RESULT_METADATA_KEYS.has(key)) {\n continue;\n }\n if (value !== undefined) {\n target[key] = value;\n }\n }\n}\nexport function buildCycleStepToolResultMetadata(params) {\n const metadata = {\n log_type: params.logType ?? 'agent_cycle',\n actor: params.actor ?? 'agent',\n row_role: 'tool_result',\n tool_name: params.toolName,\n };\n appendIfDefined(metadata, 'tool_color', params.toolColor);\n appendIfDefined(metadata, 'execution_time', params.executionTimeMs);\n appendIfDefined(metadata, 'action_summary', params.actionSummary);\n if (params.summaryPending === true) {\n metadata.summary_pending = true;\n }\n appendIfDefined(metadata, 'summary_state', params.summaryState ?? (params.summaryPending === true ? 'pending' : null));\n appendIfDefined(metadata, 'tool_cost', params.toolCost);\n appendIfDefined(metadata, 'cycle_id', params.cycleId);\n appendIfDefined(metadata, 'run_id', params.runId);\n appendIfDefined(metadata, 'message_id', params.messageId);\n appendIfDefined(metadata, 'step_index', params.stepIndex);\n appendIfDefined(metadata, 'cycle_timeline', params.cycleTimeline);\n appendIfDefined(metadata, 'summary_started_at', params.summaryStartedAt);\n appendIfDefined(metadata, 'summary_completed_at', params.summaryCompletedAt);\n appendIfDefined(metadata, 'summary_duration_ms', params.summaryDurationMs);\n appendIfDefined(metadata, 'summary_error', params.summaryError);\n if (typeof params.toolCallId === 'string' && params.toolCallId.length > 0) {\n metadata.tool_call_id = params.toolCallId;\n }\n else {\n metadata.tool_call_link_missing = true;\n metadata.original_type = 'tool_call';\n }\n appendExtraMetadata(metadata, params.extraMetadata);\n return metadata;\n}\nexport function buildCycleStepToolResultLog(params) {\n return {\n content: params.content,\n ...(params.formattedContent !== undefined ? { formattedContent: params.formattedContent } : {}),\n timestamp: params.timestamp,\n ...(params.type !== undefined ? { type: params.type } : {}),\n ...(params.title !== undefined ? { title: params.title } : {}),\n ...(params.summary !== undefined ? { summary: params.summary } : {}),\n metadata: buildCycleStepToolResultMetadata(params),\n isExpandable: params.isExpandable ?? true,\n ...(params.cost !== undefined ? { cost: params.cost } : {}),\n };\n}\nexport function buildCycleStepToolCallArtifact(params) {\n return {\n toolName: params.toolName,\n parameters: params.parameters,\n result: params.result,\n status: params.status,\n timestamp: params.timestamp,\n };\n}\nexport function buildCycleStepArtifacts(params) {\n return {\n log: buildCycleStepToolResultLog(params.log),\n ...(params.toolCall ? { toolCall: buildCycleStepToolCallArtifact(params.toolCall) } : {}),\n };\n}\n", "import { buildCycleStepArtifacts } from '@panorama/shared/cycle-step-artifacts'\nimport { createEventLogEntry } from '@panorama/shared/utils'\nimport type { CommandExecutionResult } from './shell-execution.js'\n\nconst PREVIEW_TOTAL_CHARS = 1_000\nconst PREVIEW_EDGE_CHARS = 500\nconst LINUX_SHELL_TOOL_NAME = 'shell.command'\n\nexport type LinuxStepTerminalStatus = 'completed' | 'failed' | 'uncertain'\n\nexport type LinuxExecutionCompletion = {\n stepStatus: LinuxStepTerminalStatus\n toolCallStatus: 'completed' | 'failed'\n controlSignal: 'continue' | 'pause' | 'stop'\n pauseDuration?: number\n uncertaintyReason?: string\n}\n\ntype LinuxExecutionFailureClassification =\n | 'panorama_cli_usage_error'\n | 'command_not_found'\n | 'shell_syntax_error'\n | 'linux_execution_timed_out'\n | 'linux_execution_cancelled'\n | 'runtime_execution_error'\n\nexport function buildPreview(text: string): { preview: string | null; truncated: boolean } {\n if (!text) {\n return { preview: null, truncated: false }\n }\n\n if (text.length <= PREVIEW_TOTAL_CHARS) {\n return { preview: text, truncated: false }\n }\n\n const head = text.slice(0, PREVIEW_EDGE_CHARS)\n const tail = text.slice(-PREVIEW_EDGE_CHARS)\n return {\n preview: `${head}\\n...\\n${tail}`,\n truncated: true,\n }\n}\n\nfunction buildOutputCaptureNotice(\n stream: 'stdout' | 'stderr',\n result: CommandExecutionResult\n): string | null {\n const truncated = stream === 'stdout' ? result.stdoutTruncated : result.stderrTruncated\n if (!truncated) {\n return null\n }\n\n const capturedBytes =\n stream === 'stdout' ? result.stdoutCapturedBytes : result.stderrCapturedBytes\n return [\n `${stream} exceeded the managed runtime capture limit of ${result.outputCaptureBytes} bytes.`,\n `Only the first ${capturedBytes} bytes were sent to Panorama.`,\n 'Exact full output is unavailable unless the command wrote it to a file.',\n ].join('\\n')\n}\n\nexport function buildOutputCaptureMetadata(\n stream: 'stdout' | 'stderr',\n result: CommandExecutionResult\n): Record<string, unknown> {\n const observedBytes =\n stream === 'stdout' ? result.stdoutObservedBytes : result.stderrObservedBytes\n const capturedBytes =\n stream === 'stdout' ? result.stdoutCapturedBytes : result.stderrCapturedBytes\n const truncated = stream === 'stdout' ? result.stdoutTruncated : result.stderrTruncated\n const notice = buildOutputCaptureNotice(stream, result)\n\n return {\n [`${stream}_observed_bytes`]: observedBytes,\n [`${stream}_captured_bytes`]: capturedBytes,\n [`${stream}_capture_limit_bytes`]: result.outputCaptureBytes,\n [`${stream}_runtime_truncated`]: truncated,\n ...(notice\n ? {\n [`${stream}_capture_notice`]: notice,\n [`${stream}_overflow_notice`]: notice,\n }\n : {}),\n }\n}\n\nfunction summarizeCommand(command: string): string {\n const flattened = command.replace(/\\s+/g, ' ').trim()\n return flattened.length > 120 ? `${flattened.slice(0, 117)}...` : flattened\n}\n\nfunction classifyLinuxExecutionFailure(params: {\n command: string\n result: CommandExecutionResult\n}): {\n classification: LinuxExecutionFailureClassification\n failureMessage: string\n} {\n const stderr = params.result.stderr.trim()\n const stderrFirstLine = stderr.split(/\\r?\\n/).find((line) => line.trim().length > 0)?.trim() ?? ''\n const stderrLower = stderr.toLowerCase()\n const commandStartsWithPanorama = params.command.trim().startsWith('panorama ')\n\n if (params.result.status === 'timed_out') {\n return {\n classification: 'linux_execution_timed_out',\n failureMessage: params.result.error || 'Linux shell command timed out before completion.',\n }\n }\n\n if (params.result.status === 'cancelled') {\n return {\n classification: 'linux_execution_cancelled',\n failureMessage: params.result.error || 'Linux shell command was cancelled before completion.',\n }\n }\n\n if (params.result.exitCode === 127 || stderrLower.includes('command not found')) {\n return {\n classification: 'command_not_found',\n failureMessage: stderrFirstLine || 'Linux shell command referenced a command that was not found.',\n }\n }\n\n if (\n stderrLower.includes('syntax error') ||\n stderrLower.includes('unexpected eof') ||\n stderrLower.includes('unexpected token')\n ) {\n return {\n classification: 'shell_syntax_error',\n failureMessage: stderrFirstLine || 'Linux shell command failed shell syntax validation.',\n }\n }\n\n if (\n commandStartsWithPanorama &&\n (stderrLower.includes('unknown option') ||\n stderrLower.includes('unknown argument') ||\n stderrLower.includes('missing required argument') ||\n stderrLower.includes('too many arguments') ||\n stderrLower.includes('invalid value for'))\n ) {\n return {\n classification: 'panorama_cli_usage_error',\n failureMessage: stderrFirstLine || 'Panorama CLI command used invalid arguments.',\n }\n }\n\n return {\n classification: 'runtime_execution_error',\n failureMessage:\n stderrFirstLine ||\n params.result.error ||\n 'Linux shell command failed during execution for an unspecified reason.',\n }\n}\n\nexport function buildLinuxStepResultPayload(params: {\n executionId: string\n command: string\n result: CommandExecutionResult\n completion: LinuxExecutionCompletion\n executionMetadata?: Record<string, unknown> | null\n}): Record<string, unknown> {\n const statusLabel =\n params.result.status === 'succeeded'\n ? 'succeeded'\n : params.result.status === 'timed_out'\n ? 'timed out'\n : params.result.status === 'cancelled'\n ? 'cancelled'\n : 'failed'\n\n const stdoutPreview = buildPreview(params.result.stdout)\n const stderrPreview = buildPreview(params.result.stderr)\n const stdoutCaptureMetadata = buildOutputCaptureMetadata('stdout', params.result)\n const stderrCaptureMetadata = buildOutputCaptureMetadata('stderr', params.result)\n const failureDetails =\n params.result.status === 'succeeded'\n ? null\n : classifyLinuxExecutionFailure({\n command: params.command,\n result: params.result,\n })\n const responseContent: Record<string, unknown> = {\n status: params.result.status,\n exit_code: params.result.exitCode,\n duration_ms: params.result.durationMs,\n stdout_preview: stdoutPreview.preview,\n stderr_preview: stderrPreview.preview,\n execution_id: params.executionId,\n command: params.command,\n ...stdoutCaptureMetadata,\n ...stderrCaptureMetadata,\n }\n\n if (params.result.error) {\n responseContent.error = params.result.error\n }\n\n if (failureDetails) {\n responseContent.failure_classification = failureDetails.classification\n responseContent.failure_message = failureDetails.failureMessage\n }\n\n const rawResponse: Record<string, unknown> = {\n success: params.result.status === 'succeeded',\n content: responseContent,\n metadata: {\n executionTime: params.result.durationMs,\n execution_id: params.executionId,\n agent_runtime: 'linux',\n stdout_preview_truncated: stdoutPreview.truncated,\n stderr_preview_truncated: stderrPreview.truncated,\n ...stdoutCaptureMetadata,\n ...stderrCaptureMetadata,\n ...(failureDetails\n ? {\n failure_classification: failureDetails.classification,\n failure_message: failureDetails.failureMessage,\n workflow_failure_classification: failureDetails.classification,\n }\n : {}),\n },\n }\n\n const stepIndex =\n typeof params.executionMetadata?.step_index === 'number' &&\n Number.isFinite(params.executionMetadata.step_index)\n ? params.executionMetadata.step_index\n : null\n\n if (params.result.error) {\n rawResponse.error = params.result.error\n }\n\n const eventContent = JSON.stringify(\n createEventLogEntry(\n 'tool_call',\n {\n raw_tool_name: LINUX_SHELL_TOOL_NAME,\n resolved_tool_name: LINUX_SHELL_TOOL_NAME,\n raw_parameters: {\n command: params.command,\n },\n raw_response: rawResponse,\n success: params.result.status === 'succeeded',\n execution_time: params.result.durationMs,\n },\n {\n toolName: LINUX_SHELL_TOOL_NAME,\n actor: 'agent',\n error: params.result.error ?? undefined,\n }\n )\n )\n\n const formattedParts = [\n 'Request Parameters:',\n JSON.stringify({ command: params.command }, null, 2),\n '',\n 'Response:',\n JSON.stringify(responseContent, null, 2),\n ]\n\n const artifactTimestamp = new Date().toISOString()\n const { log: stepLog, toolCall: toolCallArtifact } = buildCycleStepArtifacts({\n log: {\n content: eventContent,\n formattedContent: formattedParts.join('\\n'),\n timestamp: artifactTimestamp,\n type: 'system_event',\n title: 'Shell Command',\n summary: `shell ${statusLabel}: ${summarizeCommand(params.command)}`,\n toolName: LINUX_SHELL_TOOL_NAME,\n executionTimeMs: params.result.durationMs,\n actionSummary: 'ran shell command',\n summaryPending: true,\n stepIndex: typeof stepIndex === 'number' ? stepIndex : null,\n extraMetadata: {\n agent_runtime: 'linux',\n execution_id: params.executionId,\n command: params.command,\n status: params.result.status,\n exit_code: params.result.exitCode,\n duration_ms: params.result.durationMs,\n ...stdoutCaptureMetadata,\n ...stderrCaptureMetadata,\n ...(failureDetails\n ? {\n failure_classification: failureDetails.classification,\n failure_message: failureDetails.failureMessage,\n workflow_failure_classification: failureDetails.classification,\n }\n : {}),\n },\n },\n toolCall: {\n toolName: LINUX_SHELL_TOOL_NAME,\n parameters: {\n command: params.command,\n },\n result: responseContent,\n status: params.completion.toolCallStatus,\n timestamp: artifactTimestamp,\n },\n })\n\n const controlSignal: Record<string, unknown> = {\n nextAction: params.completion.controlSignal,\n }\n const pauseDuration =\n params.completion.controlSignal === 'pause' &&\n typeof params.completion.pauseDuration === 'number' &&\n Number.isFinite(params.completion.pauseDuration) &&\n params.completion.pauseDuration > 0\n ? params.completion.pauseDuration\n : undefined\n\n if (typeof pauseDuration === 'number') {\n controlSignal.pauseDuration = pauseDuration\n }\n\n return {\n toolName: LINUX_SHELL_TOOL_NAME,\n result: responseContent,\n logs: [stepLog],\n toolCalls: toolCallArtifact ? [toolCallArtifact] : [],\n nextAction: params.completion.controlSignal,\n ...(pauseDuration ? { pauseDuration } : {}),\n controlSignal,\n controlSignals: [controlSignal],\n }\n}\n", "import { setTimeout as sleep } from 'node:timers/promises'\nimport { asError, MANAGED_GATEWAY_LOG_PREFIX } from './runtime-utils.js'\n\nexport function startHostHeartbeatLoop(params: {\n intervalMs: number\n maxConsecutiveFailures: number\n heartbeatHost: () => Promise<void>\n onFatalFailure: (error: Error) => void\n}): () => void {\n let stopped = false\n let consecutiveFailures = 0\n const abortController = new AbortController()\n\n const loop = async () => {\n while (!stopped) {\n try {\n await sleep(params.intervalMs, undefined, { signal: abortController.signal })\n } catch (error) {\n if (abortController.signal.aborted) {\n break\n }\n throw error\n }\n if (stopped) {\n break\n }\n\n try {\n await params.heartbeatHost()\n consecutiveFailures = 0\n } catch (error) {\n consecutiveFailures += 1\n console.error(`${MANAGED_GATEWAY_LOG_PREFIX} failed to heartbeat managed host`, {\n consecutiveFailures,\n error,\n })\n\n if (consecutiveFailures >= params.maxConsecutiveFailures) {\n params.onFatalFailure(asError(error))\n return\n }\n }\n }\n }\n\n void loop()\n\n return () => {\n stopped = true\n abortController.abort()\n }\n}\n", "export function createWakeSignal(initialReason: string): {\n requestWake: (reason: string) => void\n waitForWake: () => Promise<string>\n} {\n let pending = true\n let pendingReason = initialReason\n let resolver: (() => void) | null = null\n\n return {\n requestWake(reason: string) {\n pendingReason = reason\n if (pending) {\n return\n }\n\n pending = true\n if (resolver) {\n const resolve = resolver\n resolver = null\n resolve()\n }\n },\n async waitForWake() {\n if (!pending) {\n await new Promise<void>((resolve) => {\n resolver = resolve\n })\n }\n\n pending = false\n return pendingReason\n },\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["execFile", "randomUUID", "fsSync", "fs", "os", "path", "process", "promisify", "process", "process", "fsSync", "fsSync", "os", "process", "process", "os", "process", "process", "os", "path", "process", "fs", "path", "process", "fsSync", "fs", "fs", "fsSync", "fs", "path", "path", "fs", "logError", "logError", "buildGatewayChildEnv", "ensureGatewayTmpDir", "getNextRunSequence", "getNextSubagentRunEventSequence", "requestChildTermination", "requestSubagentCancel", "clearPendingCancel", "resolvePendingCancel", "consumePendingCancelFromQueue", "resolveSubagentWorkdirRoot", "createGatewayEventClient", "emitGatewayEvent", "flushGatewayEvents", "sendHeartbeat", "loadGatewayControlState", "isHeartbeatFresh", "refreshRuntimeInstallFullControl", "execFile", "promisify", "truncateText", "execFile", "promisify", "path", "process", "fsSync", "os", "path", "process", "fsSync", "os", "path", "os", "path", "logInfo", "process", "fsSync", "path", "process", "execFileAsync", "promisify", "execFile", "execFile", "promisify", "path", "fsSync", "execFileAsync", "promisify", "execFile", "path", "fsSync", "parsed", "normalized", "execFile", "promisify", "path", "execFileAsync", "promisify", "execFile", "parseJsonFromText", "path", "noopLogger", "logError", "activeModelRuns", "requestChildTermination", "fsSync", "process", "logError", "fsSync", "process", "activeShellExecRuns", "validateMachineControlState", "requestChildTermination", "logError", "randomUUID", "summary", "sources", "SAFE_MODE_APPEND_SYSTEM_PROMPT_PREFIX", "isDefaultSafeAppendPrompt", "normalizeStreamEvents", "path", "SAFE_MODE_APPEND_SYSTEM_PROMPT_PREFIX", "extractUsage", "normalizeStreamEvents", "isDefaultSafeAppendPrompt", "path", "randomUUID", "requestSubagentCancel", "logError", "logError", "execFileAsync", "promisify", "execFile", "handleSubagentCancelJob", "failSubagentRun", "os", "path", "process", "randomUUID", "process", "randomUUID", "process", "process", "os", "resolveClaudeCommand", "resolveCodexCommand", "resolveGeminiCommand", "path", "buildCapabilities", "updateRuntimeProviderHealth", "emitProviderHealthEvents", "os", "process", "spawn", "fs", "path", "process", "readPidFile", "writePidFile", "isProcessAlive", "cliInfo", "cliSuccess", "spawn", "fs", "process", "path", "process", "createClient", "path", "process", "path", "process", "createClient", "spawn", "path", "fsSync", "path", "fileURLToPath", "readCurrentModulePath", "spawn", "path", "getNextSubagentRunEventSequence", "insertSubagentRunEvent", "logError", "runtimeState", "buildCapabilities", "saveConfig", "ensureGatewayTmpDir", "discoverGatewayCliCommands", "refreshRuntimeInstallFullControl", "emitGatewayEvent", "flushGatewayEvents", "emitProviderHealthEvents", "sendHeartbeat", "writePidFile", "removePidFile", "handleSubagentCancelJob", "failSubagentRun", "getNextSubagentRunEventSequence", "insertSubagentRunEvent", "requestChildTermination", "logInfo", "logError", "cliInfo", "cliSuccess", "process", "startGatewayDaemonIfRequested", "process", "os", "startGatewayLocalRuntime", "randomUUID", "sleep", "process", "DEFAULT_HEARTBEAT_INTERVAL_MS", "createClient", "createClient", "spawn", "randomUUID", "DEFAULT_OUTPUT_CAPTURE_BYTES", "spawn", "randomUUID", "path", "process", "process", "sleep", "sleep", "sleep", "randomUUID", "execFileAsync", "promisify", "execFile", "DEFAULT_CLAUDE_TIMEOUT_MS", "SUBAGENT_CANCEL_KILL_TIMEOUT_MS", "PROCESS_KILL_GRACE_MS", "getNextSubagentRunEventSequence", "insertSubagentRunEvent", "resolveSubagentWorkdirRoot", "cliWarn", "resolveClaudeCommand", "resolveCodexCommand", "resolveGeminiCommand", "updateRuntimeProviderHealth", "resolveGatewayPaths", "process", "path", "os", "randomUUID", "fs", "fsSync", "cliSuccess", "cliInfo", "cliError", "readPidFile", "writePidFile", "removePidFile"]
|
|
7
7
|
}
|