@kynver-app/runtime 0.1.122 → 0.1.128
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/chat/chat-claim-loop.d.ts +11 -0
- package/dist/chat/command-allowlist.d.ts +8 -0
- package/dist/chat/command-executor.d.ts +13 -0
- package/dist/cli.js +54 -17773
- package/dist/cron/cron-cli-bin.d.ts +7 -0
- package/dist/cron/cron-readiness.d.ts +35 -0
- package/dist/disk-gate.d.ts +7 -0
- package/dist/index.js +71 -19272
- package/dist/mesh-liveness/mesh-cron-lease-store.d.ts +9 -0
- package/dist/server/cleanup.js +16 -4054
- package/dist/server/default-repo.js +1 -458
- package/dist/server/harness-notice.js +15 -287
- package/dist/server/heavy-verification.js +1 -223
- package/dist/server/landing.js +1 -44
- package/dist/server/memory-cost-enforce.js +2 -480
- package/dist/server/memory-cost.js +2 -184
- package/dist/server/monitor.js +8 -1805
- package/dist/server/orchestration.js +1 -444
- package/dist/server/pr-evidence.js +1 -163
- package/dist/server/repo-search.js +1 -224
- package/dist/server/worker-policy.js +1 -432
- package/dist/worker-persona-catalog.js +1 -138
- package/package.json +3 -2
- package/dist/cli.js.map +0 -7
- package/dist/index.js.map +0 -7
- package/dist/server/cleanup.js.map +0 -7
- package/dist/server/default-repo.js.map +0 -7
- package/dist/server/harness-notice.js.map +0 -7
- package/dist/server/heavy-verification.js.map +0 -7
- package/dist/server/landing.js.map +0 -7
- package/dist/server/memory-cost-enforce.js.map +0 -7
- package/dist/server/memory-cost.js.map +0 -7
- package/dist/server/monitor.js.map +0 -7
- package/dist/server/orchestration.js.map +0 -7
- package/dist/server/pr-evidence.js.map +0 -7
- package/dist/server/repo-search.js.map +0 -7
- package/dist/server/worker-policy.js.map +0 -7
- package/dist/worker-persona-catalog.js.map +0 -7
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/orchestration-providers/claude-oauth-binding.ts", "../../src/orchestration-providers/oauth-binding-utils.ts", "../../src/orchestration-providers/codex-oauth-binding.ts", "../../src/orchestration-providers/hermes-openai-codex-binding.ts", "../../src/orchestration-providers/codex-orchestration-adapter.ts", "../../src/orchestration-providers/cursor-oauth-binding.ts", "../../src/orchestration-providers/hermes-cli-adapter.ts", "../../src/orchestration-providers/inventory.ts", "../../src/orchestration-providers/capabilities.ts", "../../src/orchestration-enforcement/types.ts", "../../src/orchestration-enforcement/config.ts", "../../src/orchestration-enforcement/idempotency.ts", "../../src/orchestration-enforcement/evaluator.ts"],
|
|
4
|
-
"sourcesContent": ["import { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport type { OrchestrationProviderBindingStatus } from \"./types.js\";\r\nimport {\r\n envKeyFingerprint,\r\n fingerprintAuthStore,\r\n probeCliCommand,\r\n probeCliExitCodeOnly,\r\n resolveCliBin,\r\n} from \"./oauth-binding-utils.js\";\r\n\r\nconst DEFAULT_CLAUDE_BIN = \"claude\";\r\n\r\nfunction claudeAuthStoreCandidates(): string[] {\r\n const home = homedir();\r\n return [path.join(home, \".claude\", \".credentials.json\")];\r\n}\r\n\r\n/**\r\n * Probe Claude Code OAuth on the local runner. Never reads or returns raw OAuth tokens.\r\n * ANTHROPIC_API_KEY is reported separately as api_key_env (cloud credits path).\r\n */\r\nexport function probeClaudeOAuthBinding(\r\n nowIso: string = new Date().toISOString(),\r\n): OrchestrationProviderBindingStatus {\r\n const bin = resolveCliBin(DEFAULT_CLAUDE_BIN, [\"KYNVER_CLAUDE_BIN\", \"CLAUDE_BIN\"]);\r\n\r\n if (process.env.ANTHROPIC_API_KEY?.trim()) {\r\n return {\r\n providerId: \"claude\",\r\n ready: true,\r\n authSource: \"api_key_env\",\r\n sessionFingerprint: envKeyFingerprint(\"ANTHROPIC_API_KEY\"),\r\n checkedAt: nowIso,\r\n note: \"ANTHROPIC_API_KEY present (env binding \u2014 cloud credits path, no token stored in Kynver)\",\r\n };\r\n }\r\n\r\n const cli = probeCliCommand(bin, [\"--version\"], {\r\n okNote: `${bin} CLI available`,\r\n failPrefix: `${bin} CLI not available`,\r\n });\r\n const authPath = claudeAuthStoreCandidates().find((p) => existsSync(p));\r\n const login = probeCliExitCodeOnly(bin, [\"auth\", \"status\"], {\r\n okNote: \"claude auth status: authenticated\",\r\n failNote: \"claude auth status: not authenticated\",\r\n });\r\n const ready = cli.ok && (login.ok || Boolean(authPath));\r\n\r\n return {\r\n providerId: \"claude\",\r\n ready,\r\n authSource: \"oauth_local\",\r\n sessionFingerprint: authPath ? fingerprintAuthStore(authPath) : undefined,\r\n checkedAt: nowIso,\r\n note: ready\r\n ? \"Local Claude Code OAuth session bound on runner\"\r\n : [cli.note, login.note, authPath ? undefined : \"no ~/.claude/.credentials.json\"]\r\n .filter(Boolean)\r\n .join(\"; \"),\r\n };\r\n}\r\n", "import { createHash } from \"node:crypto\";\r\nimport { statSync } from \"node:fs\";\r\nimport { spawnSync } from \"node:child_process\";\r\n\r\n/** Fingerprint from file metadata only \u2014 never reads token payload. */\r\nexport function fingerprintAuthStore(filePath: string): string | undefined {\r\n try {\r\n const st = statSync(filePath);\r\n const material = `${filePath}|${st.size}|${st.mtimeMs}`;\r\n return createHash(\"sha256\").update(material).digest(\"hex\").slice(0, 16);\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nexport function envKeyFingerprint(envKey: string): string {\r\n return createHash(\"sha256\").update(`env:${envKey}`).digest(\"hex\").slice(0, 16);\r\n}\r\n\r\nexport function resolveCliBin(\r\n defaultBin: string,\r\n envKeys: string[],\r\n): string {\r\n for (const key of envKeys) {\r\n const value = process.env[key]?.trim();\r\n if (value) return value;\r\n }\r\n return defaultBin;\r\n}\r\n\r\nexport function probeCliCommand(\r\n bin: string,\r\n args: string[],\r\n options: {\r\n timeoutMs?: number;\r\n okNote?: string;\r\n failPrefix?: string;\r\n } = {},\r\n): { ok: boolean; note?: string } {\r\n const timeoutMs = options.timeoutMs ?? 8_000;\r\n try {\r\n const result = spawnSync(bin, args, {\r\n encoding: \"utf8\",\r\n timeout: timeoutMs,\r\n env: { ...process.env, CI: \"1\", NO_COLOR: \"1\" },\r\n });\r\n if (result.status === 0) {\r\n return { ok: true, note: options.okNote ?? `${bin} ${args.join(\" \")}: ok` };\r\n }\r\n const stderr = (result.stderr || result.stdout || \"\").trim();\r\n const prefix = options.failPrefix ?? `${bin} ${args.join(\" \")} failed`;\r\n return {\r\n ok: false,\r\n note: stderr ? `${prefix}: ${stderr.slice(0, 200)}` : prefix,\r\n };\r\n } catch (err) {\r\n return {\r\n ok: false,\r\n note: err instanceof Error ? err.message : `${bin} probe failed`,\r\n };\r\n }\r\n}\r\n\r\n/** Exit-code-only probe \u2014 stdout/stderr are discarded to avoid leaking auth payloads. */\r\nexport function probeCliExitCodeOnly(\r\n bin: string,\r\n args: string[],\r\n options: { timeoutMs?: number; okNote?: string; failNote?: string } = {},\r\n): { ok: boolean; note?: string } {\r\n const timeoutMs = options.timeoutMs ?? 8_000;\r\n try {\r\n const result = spawnSync(bin, args, {\r\n stdio: \"ignore\",\r\n timeout: timeoutMs,\r\n env: { ...process.env, CI: \"1\", NO_COLOR: \"1\" },\r\n });\r\n if (result.status === 0) {\r\n return { ok: true, note: options.okNote ?? `${bin} authenticated` };\r\n }\r\n return { ok: false, note: options.failNote ?? `${bin} not authenticated` };\r\n } catch (err) {\r\n return {\r\n ok: false,\r\n note: err instanceof Error ? err.message : `${bin} auth probe failed`,\r\n };\r\n }\r\n}\r\n", "import { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport type { OrchestrationProviderBindingStatus } from \"./types.js\";\r\nimport {\r\n envKeyFingerprint,\r\n fingerprintAuthStore,\r\n probeCliCommand,\r\n resolveCliBin,\r\n} from \"./oauth-binding-utils.js\";\r\n\r\nconst DEFAULT_CODEX_BIN = \"codex\";\r\n\r\nfunction authStoreCandidates(): string[] {\r\n const home = homedir();\r\n return [\r\n path.join(home, \".codex\", \"auth.json\"),\r\n path.join(home, \".config\", \"codex\", \"auth.json\"),\r\n ];\r\n}\r\n\r\n/**\r\n * Probe BYO Codex OAuth on the local runner. Never reads or returns raw OAuth tokens.\r\n */\r\nexport function probeCodexOAuthBinding(\r\n nowIso: string = new Date().toISOString(),\r\n): OrchestrationProviderBindingStatus {\r\n const bin = resolveCliBin(DEFAULT_CODEX_BIN, [\"KYNVER_CODEX_BIN\", \"CODEX_BIN\"]);\r\n\r\n if (process.env.CODEX_API_KEY?.trim()) {\r\n return {\r\n providerId: \"codex\",\r\n ready: true,\r\n authSource: \"api_key_env\",\r\n sessionFingerprint: envKeyFingerprint(\"CODEX_API_KEY\"),\r\n checkedAt: nowIso,\r\n note: \"CODEX_API_KEY present (env binding \u2014 cloud credits path, no token stored in Kynver)\",\r\n };\r\n }\r\n\r\n const authPath = authStoreCandidates().find((p) => existsSync(p));\r\n const login = probeCliCommand(bin, [\"login\", \"status\"], {\r\n okNote: \"codex login status: authenticated\",\r\n failPrefix: \"codex login status\",\r\n });\r\n const ready = Boolean(authPath) && login.ok;\r\n\r\n return {\r\n providerId: \"codex\",\r\n ready,\r\n authSource: \"oauth_local\",\r\n sessionFingerprint: authPath ? fingerprintAuthStore(authPath) : undefined,\r\n checkedAt: nowIso,\r\n note: ready\r\n ? \"Local Codex OAuth session bound on runner\"\r\n : [login.note, authPath ? undefined : \"no ~/.codex/auth.json\"].filter(Boolean).join(\"; \"),\r\n };\r\n}\r\n", "import { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport type { OrchestrationAuthSource } from \"./types.js\";\r\nimport {\r\n fingerprintAuthStore,\r\n probeCliCommand,\r\n probeCliExitCodeOnly,\r\n resolveCliBin,\r\n} from \"./oauth-binding-utils.js\";\r\n\r\nexport type HermesOpenAiCodexPath = \"hermes_openai_codex\";\r\n\r\nexport interface HermesOpenAiCodexBindingStatus {\r\n path: HermesOpenAiCodexPath;\r\n ready: boolean;\r\n authSource: OrchestrationAuthSource;\r\n sessionFingerprint?: string;\r\n checkedAt: string;\r\n note?: string;\r\n}\r\n\r\nfunction hermesAuthStorePath(): string {\r\n const configured = process.env.HERMES_HOME?.trim();\r\n const home = configured ? path.resolve(configured) : path.join(homedir(), \".hermes\");\r\n return path.join(home, \"auth.json\");\r\n}\r\n\r\n/**\r\n * Probe Hermes-managed OpenAI Codex subscription (ChatGPT backend-api/codex).\r\n * Uses exit-code-only `hermes auth status` \u2014 never reads auth.json token payloads.\r\n */\r\nexport function probeHermesOpenAiCodexBinding(\r\n nowIso: string = new Date().toISOString(),\r\n): HermesOpenAiCodexBindingStatus {\r\n const bin = resolveCliBin(\"hermes\", [\"KYNVER_HERMES_BIN\", \"HERMES_BIN\"]);\r\n const cli = probeCliCommand(bin, [\"--version\"], {\r\n okNote: `${bin} CLI available`,\r\n failPrefix: `${bin} CLI not available`,\r\n });\r\n const authPath = hermesAuthStorePath();\r\n const authStorePresent = existsSync(authPath);\r\n const auth = probeCliExitCodeOnly(bin, [\"auth\", \"status\", \"openai-codex\"], {\r\n okNote: \"hermes openai-codex: logged in\",\r\n failNote: \"hermes openai-codex: not logged in\",\r\n });\r\n const ready = cli.ok && auth.ok;\r\n const authSource: OrchestrationAuthSource = ready ? \"subscription_hermes\" : \"none\";\r\n\r\n return {\r\n path: \"hermes_openai_codex\",\r\n ready,\r\n authSource,\r\n sessionFingerprint: authStorePresent ? fingerprintAuthStore(authPath) : undefined,\r\n checkedAt: nowIso,\r\n note: ready\r\n ? \"Hermes openai-codex subscription session bound (ChatGPT Codex OAuth)\"\r\n : [cli.note, auth.note, authStorePresent ? undefined : \"no ~/.hermes/auth.json\"]\r\n .filter(Boolean)\r\n .join(\"; \"),\r\n };\r\n}\r\n", "import { probeCodexOAuthBinding } from \"./codex-oauth-binding.js\";\r\nimport {\r\n probeHermesOpenAiCodexBinding,\r\n type HermesOpenAiCodexBindingStatus,\r\n} from \"./hermes-openai-codex-binding.js\";\r\nimport type { OrchestrationProviderBindingStatus } from \"./types.js\";\r\n\r\n/** How low-cost Codex orchestration authenticates on this host. */\r\nexport type CodexOrchestrationPath = \"codex_cli\" | \"hermes_openai_codex\" | \"none\";\r\n\r\nexport interface CodexOrchestrationAdapterStatus extends OrchestrationProviderBindingStatus {\r\n path: CodexOrchestrationPath;\r\n hermesOpenAiCodex?: HermesOpenAiCodexBindingStatus;\r\n}\r\n\r\n/**\r\n * Resolve the best local Codex/OpenAI orchestration path: standalone `codex` CLI first,\r\n * then Hermes-managed `openai-codex` subscription when the CLI is absent or unbound.\r\n */\r\nexport function resolveCodexOrchestrationAdapter(\r\n nowIso: string = new Date().toISOString(),\r\n): CodexOrchestrationAdapterStatus {\r\n const cliBinding = probeCodexOAuthBinding(nowIso);\r\n if (cliBinding.ready) {\r\n return { ...cliBinding, path: \"codex_cli\" };\r\n }\r\n\r\n const hermes = probeHermesOpenAiCodexBinding(nowIso);\r\n if (hermes.ready) {\r\n return {\r\n providerId: \"codex\",\r\n ready: true,\r\n authSource: hermes.authSource,\r\n sessionFingerprint: hermes.sessionFingerprint,\r\n checkedAt: hermes.checkedAt,\r\n note: hermes.note,\r\n path: \"hermes_openai_codex\",\r\n hermesOpenAiCodex: hermes,\r\n };\r\n }\r\n\r\n return {\r\n providerId: \"codex\",\r\n ready: false,\r\n authSource: \"none\",\r\n checkedAt: nowIso,\r\n path: \"none\",\r\n hermesOpenAiCodex: hermes,\r\n note: [cliBinding.note, hermes.note].filter(Boolean).join(\"; \") || \"Codex CLI and Hermes openai-codex unavailable\",\r\n };\r\n}\r\n", "import { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport type { OrchestrationProviderBindingStatus } from \"./types.js\";\r\nimport {\r\n envKeyFingerprint,\r\n fingerprintAuthStore,\r\n probeCliCommand,\r\n resolveCliBin,\r\n} from \"./oauth-binding-utils.js\";\r\n\r\nconst DEFAULT_AGENT_BIN = \"agent\";\r\n\r\nfunction cursorAuthStoreCandidates(): string[] {\r\n const home = homedir();\r\n return [path.join(home, \".config\", \"cursor\", \"auth.json\")];\r\n}\r\n\r\n/**\r\n * Probe Cursor/Composer OAuth on the local runner. Never reads or returns raw OAuth tokens.\r\n */\r\nexport function probeCursorOAuthBinding(\r\n nowIso: string = new Date().toISOString(),\r\n): OrchestrationProviderBindingStatus {\r\n const bin = resolveCliBin(DEFAULT_AGENT_BIN, [\r\n \"KYNVER_CURSOR_AGENT_BIN\",\r\n \"CURSOR_AGENT_BIN\",\r\n ]);\r\n\r\n if (process.env.CURSOR_API_KEY?.trim()) {\r\n return {\r\n providerId: \"cursor\",\r\n ready: true,\r\n authSource: \"api_key_env\",\r\n sessionFingerprint: envKeyFingerprint(\"CURSOR_API_KEY\"),\r\n checkedAt: nowIso,\r\n note: \"CURSOR_API_KEY present (env binding \u2014 cloud credits path, no token stored in Kynver)\",\r\n };\r\n }\r\n\r\n const cli = probeCliCommand(bin, [\"-v\"], {\r\n okNote: `${bin} CLI available`,\r\n failPrefix: `${bin} CLI not available`,\r\n });\r\n const authPath = cursorAuthStoreCandidates().find((p) => existsSync(p));\r\n const ready = Boolean(authPath) && cli.ok;\r\n\r\n return {\r\n providerId: \"cursor\",\r\n ready,\r\n authSource: \"oauth_local\",\r\n sessionFingerprint: authPath ? fingerprintAuthStore(authPath) : undefined,\r\n checkedAt: nowIso,\r\n note: ready\r\n ? \"Local Cursor/Composer OAuth session bound on runner\"\r\n : [cli.note, authPath ? undefined : \"no ~/.config/cursor/auth.json\"].filter(Boolean).join(\"; \"),\r\n };\r\n}\r\n", "import { existsSync, readFileSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport type { OrchestrationAuthSource } from \"./types.js\";\r\nimport {\r\n fingerprintAuthStore,\r\n probeCliCommand,\r\n resolveCliBin,\r\n} from \"./oauth-binding-utils.js\";\r\n\r\nexport interface HermesCliAdapterStatus {\r\n adapterId: \"hermes\";\r\n cliAvailable: boolean;\r\n profileBound: boolean;\r\n authSource: OrchestrationAuthSource;\r\n sessionFingerprint?: string;\r\n checkedAt: string;\r\n note?: string;\r\n}\r\n\r\nconst PROFILE_ENV_KEYS = [\r\n \"OPENAI_API_KEY\",\r\n \"ANTHROPIC_API_KEY\",\r\n \"KYNVER_API_KEY\",\r\n \"KYNVER_BASE_URL\",\r\n] as const;\r\n\r\nfunction hermesProfileEnvPath(): string {\r\n const configured = process.env.HERMES_HOME?.trim();\r\n const home = configured ? path.resolve(configured) : path.join(homedir(), \".hermes\");\r\n return path.join(home, \".env\");\r\n}\r\n\r\n/** Presence-only scan \u2014 records key names configured, never values. */\r\nfunction profileEnvKeyPresence(envPath: string): string[] {\r\n try {\r\n const text = readFileSync(envPath, \"utf8\");\r\n const present: string[] = [];\r\n for (const key of PROFILE_ENV_KEYS) {\r\n const re = new RegExp(`^${key}=`, \"m\");\r\n if (re.test(text)) present.push(key);\r\n }\r\n return present;\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Best-effort Hermes Forge CLI adapter probe. Cloud/API keys in ~/.hermes/.env are\r\n * reported as api_key_env \u2014 distinct from harness worker BYO OAuth inventory.\r\n */\r\nexport function probeHermesCliAdapter(\r\n nowIso: string = new Date().toISOString(),\r\n): HermesCliAdapterStatus {\r\n const bin = resolveCliBin(\"hermes\", [\"KYNVER_HERMES_BIN\", \"HERMES_BIN\"]);\r\n const cli = probeCliCommand(bin, [\"--version\"], {\r\n okNote: `${bin} CLI available`,\r\n failPrefix: `${bin} CLI not available`,\r\n });\r\n const profilePath = hermesProfileEnvPath();\r\n const profileBound = existsSync(profilePath);\r\n const envKeys = profileBound ? profileEnvKeyPresence(profilePath) : [];\r\n const hasApiKeys = envKeys.some((k) => k.endsWith(\"_API_KEY\"));\r\n const authSource: OrchestrationAuthSource = hasApiKeys ? \"api_key_env\" : profileBound ? \"oauth_local\" : \"none\";\r\n const ready = cli.ok && profileBound;\r\n\r\n return {\r\n adapterId: \"hermes\",\r\n cliAvailable: cli.ok,\r\n profileBound,\r\n authSource,\r\n sessionFingerprint: profileBound ? fingerprintAuthStore(profilePath) : undefined,\r\n checkedAt: nowIso,\r\n note: ready\r\n ? `Hermes profile bound (${envKeys.length ? `keys: ${envKeys.join(\", \")}` : \"no API keys detected\"})`\r\n : [cli.note, profileBound ? undefined : \"no ~/.hermes/.env\"].filter(Boolean).join(\"; \"),\r\n };\r\n}\r\n", "import { probeClaudeOAuthBinding } from \"./claude-oauth-binding.js\";\r\nimport { probeCodexOAuthBinding } from \"./codex-oauth-binding.js\";\r\nimport {\r\n resolveCodexOrchestrationAdapter,\r\n type CodexOrchestrationPath,\r\n} from \"./codex-orchestration-adapter.js\";\r\nimport { probeCursorOAuthBinding } from \"./cursor-oauth-binding.js\";\r\nimport { probeHermesCliAdapter, type HermesCliAdapterStatus } from \"./hermes-cli-adapter.js\";\r\nimport {\r\n probeHermesOpenAiCodexBinding,\r\n type HermesOpenAiCodexBindingStatus,\r\n} from \"./hermes-openai-codex-binding.js\";\r\nimport type { OrchestrationProviderBindingStatus, OrchestrationProviderId } from \"./types.js\";\r\n\r\nexport interface OrchestrationCloudApiCredits {\r\n /** ANTHROPIC_API_KEY configured on host (cloud billing \u2014 not BYO OAuth). */\r\n anthropicApiKey: boolean;\r\n /** OPENAI_API_KEY configured on host (cloud billing \u2014 distinct from Codex OAuth). */\r\n openaiApiKey: boolean;\r\n /** CODEX_API_KEY configured on host (OpenAI Codex cloud path). */\r\n codexApiKey: boolean;\r\n}\r\n\r\nexport interface OrchestrationProviderInventory {\r\n generatedAt: string;\r\n bindings: Record<OrchestrationProviderId, OrchestrationProviderBindingStatus>;\r\n /** API-key cloud paths \u2014 separate from local OAuth CLI sessions. */\r\n cloudApiCredits: OrchestrationCloudApiCredits;\r\n hermes: HermesCliAdapterStatus;\r\n hermesOpenAiCodex: HermesOpenAiCodexBindingStatus;\r\n codexAdapterPath: CodexOrchestrationPath;\r\n readyCount: number;\r\n}\r\n\r\nexport interface BuildOrchestrationProviderInventoryOptions {\r\n nowIso?: () => string;\r\n}\r\n\r\n/**\r\n * Probe all harness orchestration CLI providers on this host.\r\n * Never reads or returns raw OAuth tokens or API key values.\r\n */\r\nexport function buildOrchestrationProviderInventory(\r\n options: BuildOrchestrationProviderInventoryOptions = {},\r\n): OrchestrationProviderInventory {\r\n const generatedAt = options.nowIso?.() ?? new Date().toISOString();\r\n const codexAdapter = resolveCodexOrchestrationAdapter(generatedAt);\r\n const bindings = {\r\n codex: codexAdapter,\r\n cursor: probeCursorOAuthBinding(generatedAt),\r\n claude: probeClaudeOAuthBinding(generatedAt),\r\n } satisfies Record<OrchestrationProviderId, OrchestrationProviderBindingStatus>;\r\n\r\n const readyCount = Object.values(bindings).filter((b) => b.ready).length;\r\n\r\n return {\r\n generatedAt,\r\n bindings,\r\n cloudApiCredits: {\r\n anthropicApiKey: Boolean(process.env.ANTHROPIC_API_KEY?.trim()),\r\n openaiApiKey: Boolean(process.env.OPENAI_API_KEY?.trim()),\r\n codexApiKey: Boolean(process.env.CODEX_API_KEY?.trim()),\r\n },\r\n hermes: probeHermesCliAdapter(generatedAt),\r\n hermesOpenAiCodex: probeHermesOpenAiCodexBinding(generatedAt),\r\n codexAdapterPath: codexAdapter.path,\r\n readyCount,\r\n };\r\n}\r\n\r\nexport function probeOrchestrationProviderBinding(\r\n providerId: OrchestrationProviderId,\r\n nowIso?: string,\r\n): OrchestrationProviderBindingStatus {\r\n switch (providerId) {\r\n case \"codex\":\r\n return resolveCodexOrchestrationAdapter(nowIso);\r\n case \"cursor\":\r\n return probeCursorOAuthBinding(nowIso);\r\n case \"claude\":\r\n return probeClaudeOAuthBinding(nowIso);\r\n }\r\n}\r\n", "import type { OrchestrationProviderCapability, OrchestrationProviderId } from \"./types.js\";\r\n\r\nconst CAPABILITIES: Record<OrchestrationProviderId, OrchestrationProviderCapability> = {\r\n codex: {\r\n id: \"codex\",\r\n displayName: \"Codex (BYO OAuth / Hermes openai-codex)\",\r\n costTier: \"low\",\r\n authSources: [\"oauth_local\", \"api_key_env\", \"subscription_hermes\"],\r\n supportsLowRiskOrchestration: true,\r\n supportsPrivilegedPlatformActions: false,\r\n },\r\n cursor: {\r\n id: \"cursor\",\r\n displayName: \"Cursor / Composer\",\r\n costTier: \"medium\",\r\n authSources: [\"oauth_local\", \"api_key_env\"],\r\n supportsLowRiskOrchestration: true,\r\n supportsPrivilegedPlatformActions: true,\r\n },\r\n claude: {\r\n id: \"claude\",\r\n displayName: \"Claude Code\",\r\n costTier: \"high\",\r\n authSources: [\"oauth_local\"],\r\n supportsLowRiskOrchestration: true,\r\n supportsPrivilegedPlatformActions: true,\r\n },\r\n};\r\n\r\nexport function getOrchestrationProviderCapability(\r\n id: OrchestrationProviderId,\r\n): OrchestrationProviderCapability {\r\n return CAPABILITIES[id];\r\n}\r\n\r\nexport function listOrchestrationProviderCapabilities(): OrchestrationProviderCapability[] {\r\n return Object.values(CAPABILITIES);\r\n}\r\n", "/** Kynver-first foreground orchestration policy \u2014 observe before enforce. */\r\n\r\nexport const ORCHESTRATION_POLICY_MODES = [\"off\", \"observe\", \"enforce\"] as const;\r\nexport type OrchestrationPolicyMode = (typeof ORCHESTRATION_POLICY_MODES)[number];\r\n\r\nexport const ORCHESTRATION_ACTION_KINDS = [\r\n \"foreground_harness_spawn\",\r\n \"shell_platform_dispatch\",\r\n] as const;\r\nexport type OrchestrationActionKind = (typeof ORCHESTRATION_ACTION_KINDS)[number];\r\n\r\nexport const ORCHESTRATION_POLICY_DECISIONS = [\r\n \"allow_local\",\r\n \"observe_bypass\",\r\n \"enforce_harness_task\",\r\n] as const;\r\nexport type OrchestrationPolicyDecision = (typeof ORCHESTRATION_POLICY_DECISIONS)[number];\r\n\r\nexport interface OrchestrationPolicyEvaluateInput {\r\n action: OrchestrationActionKind;\r\n toolName?: string | null;\r\n sessionId?: string | null;\r\n planId?: string | null;\r\n parentTaskId?: string | null;\r\n title?: string | null;\r\n description?: string | null;\r\n}\r\n\r\nexport interface OrchestrationPolicyEvaluateResult {\r\n mode: OrchestrationPolicyMode;\r\n decision: OrchestrationPolicyDecision;\r\n /** Stable idempotency key when enforce would create a linked harness task. */\r\n idempotencyKey: string | null;\r\n bypassLogged: boolean;\r\n reason: string;\r\n}\r\n", "import type { OrchestrationPolicyMode } from \"./types.js\";\r\nimport { ORCHESTRATION_POLICY_MODES } from \"./types.js\";\r\n\r\nfunction normalizeMode(raw: string | undefined): OrchestrationPolicyMode {\r\n const value = (raw ?? \"off\").trim().toLowerCase();\r\n if ((ORCHESTRATION_POLICY_MODES as readonly string[]).includes(value)) {\r\n return value as OrchestrationPolicyMode;\r\n }\r\n return \"off\";\r\n}\r\n\r\n/** Resolve orchestration policy mode from env (default off \u2014 local fallback preserved). */\r\nexport function resolveOrchestrationPolicyMode(\r\n env: NodeJS.ProcessEnv = process.env,\r\n): OrchestrationPolicyMode {\r\n return normalizeMode(env.KYNVER_ORCHESTRATION_POLICY_MODE);\r\n}\r\n\r\n/** Feature gate for enforce-mode linked AgentTask creation (default false until explicitly on). */\r\nexport function isOrchestrationEnforceTasksEnabled(\r\n env: NodeJS.ProcessEnv = process.env,\r\n): boolean {\r\n const raw = env.KYNVER_ORCHESTRATION_ENFORCE_TASKS?.trim().toLowerCase();\r\n if (!raw) return resolveOrchestrationPolicyMode(env) === \"enforce\";\r\n return raw === \"1\" || raw === \"true\" || raw === \"yes\" || raw === \"on\";\r\n}\r\n", "import { createHash } from \"node:crypto\";\r\n\r\nfunction trimOrNull(value: string | null | undefined): string | null {\r\n if (value == null) return null;\r\n const t = value.trim();\r\n return t.length ? t : null;\r\n}\r\n\r\n/** Deterministic foreground harness task idempotency key for Hermes/Forge sessions. */\r\nexport function buildForegroundHarnessIdempotencyKey(input: {\r\n sessionId?: string | null;\r\n planId?: string | null;\r\n parentTaskId?: string | null;\r\n title?: string | null;\r\n action?: string | null;\r\n}): string {\r\n const session = trimOrNull(input.sessionId) ?? \"anonymous\";\r\n const title = trimOrNull(input.title) ?? trimOrNull(input.action) ?? \"foreground\";\r\n const digest = createHash(\"sha256\")\r\n .update(\r\n [\r\n trimOrNull(input.planId) ?? \"\",\r\n trimOrNull(input.parentTaskId) ?? \"\",\r\n title.toLowerCase(),\r\n ].join(\"|\"),\r\n )\r\n .digest(\"hex\")\r\n .slice(0, 16);\r\n return `hermes-foreground:${session}:${digest}`;\r\n}\r\n", "import {\r\n isOrchestrationEnforceTasksEnabled,\r\n resolveOrchestrationPolicyMode,\r\n} from \"./config.js\";\r\nimport { buildForegroundHarnessIdempotencyKey } from \"./idempotency.js\";\r\nimport type {\r\n OrchestrationPolicyDecision,\r\n OrchestrationPolicyEvaluateInput,\r\n OrchestrationPolicyEvaluateResult,\r\n OrchestrationPolicyMode,\r\n} from \"./types.js\";\r\n\r\nfunction decisionForMode(\r\n mode: OrchestrationPolicyMode,\r\n enforceEnabled: boolean,\r\n): OrchestrationPolicyDecision {\r\n if (mode === \"enforce\" && enforceEnabled) return \"enforce_harness_task\";\r\n if (mode === \"observe\") return \"observe_bypass\";\r\n return \"allow_local\";\r\n}\r\n\r\n/**\r\n * Evaluate whether a foreground orchestration action should stay local, be\r\n * observed (logged bypass), or route through linked harness AgentTask creation.\r\n */\r\nexport function evaluateOrchestrationPolicy(\r\n input: OrchestrationPolicyEvaluateInput,\r\n env: NodeJS.ProcessEnv = process.env,\r\n): OrchestrationPolicyEvaluateResult {\r\n const mode = resolveOrchestrationPolicyMode(env);\r\n const enforceEnabled = isOrchestrationEnforceTasksEnabled(env);\r\n const decision = decisionForMode(mode, enforceEnabled);\r\n const idempotencyKey =\r\n decision === \"enforce_harness_task\"\r\n ? buildForegroundHarnessIdempotencyKey({\r\n sessionId: input.sessionId,\r\n planId: input.planId,\r\n parentTaskId: input.parentTaskId,\r\n title: input.title,\r\n action: input.action,\r\n })\r\n : null;\r\n\r\n let reason: string;\r\n if (mode === \"off\") {\r\n reason = \"Orchestration policy off \u2014 local foreground path allowed.\";\r\n } else if (decision === \"observe_bypass\") {\r\n reason = `Observe mode: ${input.action} bypass logged; local fallback preserved.`;\r\n } else if (decision === \"enforce_harness_task\") {\r\n reason = `Enforce mode: ${input.action} must create linked harness AgentTask (${idempotencyKey}).`;\r\n } else {\r\n reason = \"Local foreground path allowed.\";\r\n }\r\n\r\n return {\r\n mode,\r\n decision,\r\n idempotencyKey,\r\n bypassLogged: decision === \"observe_bypass\",\r\n reason,\r\n };\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["existsSync", "homedir", "path", "homedir", "path", "existsSync", "existsSync", "homedir", "path", "path", "homedir", "existsSync", "existsSync", "homedir", "path", "homedir", "path", "existsSync", "existsSync", "homedir", "path", "path", "homedir", "existsSync", "createHash"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/vercel/vercel-url.ts", "../../src/vercel/vercel-github-status.ts", "../../src/vercel/vercel-evidence.ts"],
|
|
4
|
-
"sourcesContent": ["// Classify Vercel URLs from GitHub StatusContext.target_url for REST API lookup vs trust-github.\r\n\r\nexport type VercelUrlKind =\r\n | \"deployment_host\"\r\n | \"dashboard\"\r\n | \"deployment_id\"\r\n | \"unknown\";\r\n\r\nexport interface ClassifiedVercelUrl {\r\n kind: VercelUrlKind;\r\n /** Original URL when it is a usable preview/deployment host. */\r\n previewUrl: string | null;\r\n /** Deployment id or host URL suitable for Vercel REST API lookup \u2014 never a dashboard page URL. */\r\n inspectTarget: string | null;\r\n /** Deployment id extracted from dashboard paths when present. */\r\n deploymentId: string | null;\r\n}\r\n\r\nconst VERCEL_HOST_RE = /(^|\\.)vercel\\.app$/i;\r\nconst DPL_ID_RE = /^dpl_[a-z0-9]+$/i;\r\n\r\n/** True when the string is safe for Vercel REST API deployment lookup (never a dashboard page URL). */\r\nexport function isInspectableVercelTarget(target: string): boolean {\r\n const trimmed = target.trim();\r\n if (!trimmed) return false;\r\n if (/vercel\\.com/i.test(trimmed)) return false;\r\n if (DPL_ID_RE.test(trimmed)) return true;\r\n try {\r\n const url = new URL(trimmed.startsWith(\"http\") ? trimmed : `https://${trimmed}`);\r\n return VERCEL_HOST_RE.test(url.hostname);\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction tryParseUrl(raw: string): URL | null {\r\n const trimmed = raw.trim();\r\n if (!trimmed) return null;\r\n try {\r\n return new URL(trimmed);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/** Dashboard deployment pages: /{team}/{project}/{deploymentId} */\r\nfunction parseDashboardDeployment(url: URL): string | null {\r\n const parts = url.pathname.split(\"/\").filter(Boolean);\r\n if (parts.length < 3) return null;\r\n const deploymentId = parts[parts.length - 1]?.trim();\r\n if (!deploymentId || deploymentId === \"deployments\") return null;\r\n return deploymentId;\r\n}\r\n\r\n/** Alternate dashboard shape: .../deployments/{id} */\r\nfunction parseDeploymentsSegment(url: URL): string | null {\r\n const parts = url.pathname.split(\"/\").filter(Boolean);\r\n const idx = parts.indexOf(\"deployments\");\r\n if (idx < 0 || idx >= parts.length - 1) return null;\r\n const deploymentId = parts[idx + 1]?.trim();\r\n return deploymentId || null;\r\n}\r\n\r\n/**\r\n * Classify a Vercel-related URL from GitHub commit status target_url.\r\n * Vercel REST API accepts deployment ids and `*.vercel.app` hosts \u2014 not vercel.com dashboard links.\r\n */\r\nexport function classifyVercelUrl(raw: string): ClassifiedVercelUrl {\r\n const empty: ClassifiedVercelUrl = {\r\n kind: \"unknown\",\r\n previewUrl: null,\r\n inspectTarget: null,\r\n deploymentId: null,\r\n };\r\n\r\n const trimmed = raw.trim();\r\n if (!trimmed) return empty;\r\n\r\n if (/^dpl_[a-z0-9]+$/i.test(trimmed)) {\r\n return {\r\n kind: \"deployment_id\",\r\n previewUrl: null,\r\n inspectTarget: trimmed,\r\n deploymentId: trimmed,\r\n };\r\n }\r\n\r\n const url = tryParseUrl(trimmed);\r\n if (!url) return empty;\r\n\r\n if (VERCEL_HOST_RE.test(url.hostname)) {\r\n const hostUrl = url.origin;\r\n return {\r\n kind: \"deployment_host\",\r\n previewUrl: hostUrl,\r\n inspectTarget: hostUrl,\r\n deploymentId: null,\r\n };\r\n }\r\n\r\n if (url.hostname === \"vercel.com\" || url.hostname.endsWith(\".vercel.com\")) {\r\n const deploymentId =\r\n parseDeploymentsSegment(url) ?? parseDashboardDeployment(url);\r\n const inspectTarget =\r\n deploymentId && DPL_ID_RE.test(deploymentId) ? deploymentId : null;\r\n return {\r\n kind: \"dashboard\",\r\n previewUrl: null,\r\n inspectTarget,\r\n deploymentId,\r\n };\r\n }\r\n\r\n return empty;\r\n}\r\n\r\nexport function isDashboardVercelUrl(raw: string): boolean {\r\n return classifyVercelUrl(raw).kind === \"dashboard\";\r\n}\r\n", "// GitHub commit StatusContext rows for the Vercel GitHub app integration.\r\n\r\nimport { classifyVercelUrl } from \"./vercel-url.js\";\r\n\r\nexport type GitHubStatusState = \"success\" | \"pending\" | \"failure\" | \"error\" | \"unknown\";\r\n\r\nexport interface GitHubCommitStatusRow {\r\n context?: string | null;\r\n state?: string | null;\r\n target_url?: string | null;\r\n description?: string | null;\r\n}\r\n\r\nexport interface GitHubVercelStatusContext {\r\n context: string;\r\n state: GitHubStatusState;\r\n targetUrl: string | null;\r\n description: string | null;\r\n deploymentId: string | null;\r\n previewUrl: string | null;\r\n dashboardUrl: string | null;\r\n}\r\n\r\nconst VERCEL_CONTEXT_RE = /vercel/i;\r\n\r\nexport function normalizeGitHubStatusState(state: unknown): GitHubStatusState {\r\n const value = typeof state === \"string\" ? state.trim().toLowerCase() : \"\";\r\n if (value === \"success\") return \"success\";\r\n if (value === \"pending\") return \"pending\";\r\n if (value === \"failure\") return \"failure\";\r\n if (value === \"error\") return \"error\";\r\n return \"unknown\";\r\n}\r\n\r\nexport function isVercelStatusContext(context: unknown): boolean {\r\n const label = typeof context === \"string\" ? context.trim() : \"\";\r\n return Boolean(label && VERCEL_CONTEXT_RE.test(label));\r\n}\r\n\r\nexport function pickVercelStatusContext(\r\n statuses: GitHubCommitStatusRow[] | null | undefined,\r\n): GitHubVercelStatusContext | null {\r\n const rows = Array.isArray(statuses) ? statuses : [];\r\n const vercelRows = rows.filter((row) => isVercelStatusContext(row.context));\r\n if (vercelRows.length === 0) return null;\r\n\r\n const score = (state: GitHubStatusState): number => {\r\n if (state === \"failure\" || state === \"error\") return 0;\r\n if (state === \"pending\") return 1;\r\n if (state === \"success\") return 2;\r\n return 1;\r\n };\r\n\r\n let best: GitHubCommitStatusRow | null = null;\r\n let bestScore = Infinity;\r\n for (const row of vercelRows) {\r\n const rowScore = score(normalizeGitHubStatusState(row.state));\r\n if (rowScore < bestScore) {\r\n best = row;\r\n bestScore = rowScore;\r\n }\r\n }\r\n if (!best) return null;\r\n\r\n const targetUrl =\r\n typeof best.target_url === \"string\" && best.target_url.trim()\r\n ? best.target_url.trim()\r\n : null;\r\n const classified = targetUrl ? classifyVercelUrl(targetUrl) : null;\r\n\r\n return {\r\n context: String(best.context ?? \"Vercel\").trim(),\r\n state: normalizeGitHubStatusState(best.state),\r\n targetUrl,\r\n description:\r\n typeof best.description === \"string\" && best.description.trim()\r\n ? best.description.trim()\r\n : null,\r\n deploymentId: classified?.deploymentId ?? null,\r\n previewUrl: classified?.previewUrl ?? null,\r\n dashboardUrl: classified?.kind === \"dashboard\" ? targetUrl : null,\r\n };\r\n}\r\n", "// Build merge-gate Vercel evidence from GitHub status and optional Vercel REST API.\r\n\r\nimport {\r\n fetchVercelDeploymentStatus,\r\n mapVercelReadyStateToEvidenceStatus,\r\n type VercelDeploymentLookupResult,\r\n} from \"./vercel-api.js\";\r\nimport {\r\n pickVercelStatusContext,\r\n type GitHubCommitStatusRow,\r\n type GitHubStatusState,\r\n type GitHubVercelStatusContext,\r\n} from \"./vercel-github-status.js\";\r\nimport {\r\n classifyVercelUrl,\r\n isInspectableVercelTarget,\r\n type ClassifiedVercelUrl,\r\n} from \"./vercel-url.js\";\r\n\r\nexport type VercelEvidenceStatus =\r\n | \"ready\"\r\n | \"building\"\r\n | \"error\"\r\n | \"unavailable\"\r\n | \"not_run\";\r\n\r\nexport interface VercelEvidenceResult {\r\n status: VercelEvidenceStatus;\r\n previewUrl: string | null;\r\n deploymentUrl: string | null;\r\n summary: string | null;\r\n observedAt: string | null;\r\n /** True when Vercel API lookup was not run (GitHub-only or missing token). */\r\n inspectSkipped: boolean;\r\n inspectReason: string | null;\r\n githubState: GitHubStatusState | null;\r\n vercelContext: string | null;\r\n}\r\n\r\n/** @deprecated Renamed \u2014 use VercelDeploymentLookupResult from vercel-api. */\r\nexport type VercelInspectCommandResult = VercelDeploymentLookupResult;\r\n\r\nexport type RunVercelDeploymentLookup = (\r\n target: string,\r\n) => Promise<VercelDeploymentLookupResult>;\r\n\r\n/** @deprecated Renamed \u2014 use RunVercelDeploymentLookup. */\r\nexport type RunVercelInspect = RunVercelDeploymentLookup;\r\n\r\nfunction mapGitHubStateToEvidence(state: GitHubStatusState): VercelEvidenceStatus {\r\n if (state === \"success\") return \"ready\";\r\n if (state === \"pending\") return \"building\";\r\n if (state === \"failure\" || state === \"error\") return \"error\";\r\n return \"unavailable\";\r\n}\r\n\r\nfunction evidenceSummary(parts: string[]): string {\r\n return parts.filter(Boolean).join(\"; \");\r\n}\r\n\r\n/**\r\n * Resolve the deployment lookup target. Never returns a vercel.com dashboard page URL.\r\n */\r\nexport function resolveVercelInspectTarget(rawUrl: string | null | undefined): {\r\n target: string | null;\r\n classified: ClassifiedVercelUrl | null;\r\n reason: string | null;\r\n} {\r\n const trimmed = typeof rawUrl === \"string\" ? rawUrl.trim() : \"\";\r\n if (!trimmed) {\r\n return { target: null, classified: null, reason: \"missing target_url\" };\r\n }\r\n\r\n const classified = classifyVercelUrl(trimmed);\r\n if (classified.inspectTarget && isInspectableVercelTarget(classified.inspectTarget)) {\r\n return { target: classified.inspectTarget, classified, reason: null };\r\n }\r\n\r\n if (classified.kind === \"dashboard\") {\r\n return {\r\n target: null,\r\n classified,\r\n reason: classified.deploymentId\r\n ? \"dashboard deployment id is not API-inspectable; trust GitHub Vercel status\"\r\n : \"dashboard URL is not valid for Vercel API lookup\",\r\n };\r\n }\r\n\r\n return { target: null, classified, reason: \"unrecognized Vercel URL\" };\r\n}\r\n\r\nexport function evidenceFromGitHubVercelStatus(\r\n statuses: GitHubCommitStatusRow[] | null | undefined,\r\n options: { observedAt?: string } = {},\r\n): VercelEvidenceResult {\r\n const observedAt = options.observedAt ?? new Date().toISOString();\r\n const row = pickVercelStatusContext(statuses);\r\n\r\n if (!row) {\r\n return {\r\n status: \"not_run\",\r\n previewUrl: null,\r\n deploymentUrl: null,\r\n summary: \"No Vercel GitHub status context on commit\",\r\n observedAt,\r\n inspectSkipped: true,\r\n inspectReason: \"no_vercel_status_context\",\r\n githubState: null,\r\n vercelContext: null,\r\n };\r\n }\r\n\r\n const status = mapGitHubStateToEvidence(row.state);\r\n const previewUrl = row.previewUrl ?? row.dashboardUrl;\r\n const deploymentUrl = row.previewUrl ?? row.dashboardUrl;\r\n\r\n return {\r\n status,\r\n previewUrl,\r\n deploymentUrl,\r\n summary: evidenceSummary([\r\n `GitHub ${row.context}=${row.state}`,\r\n row.description ?? \"\",\r\n row.dashboardUrl ? \"dashboard target_url (API lookup skipped)\" : \"\",\r\n ]),\r\n observedAt,\r\n inspectSkipped: true,\r\n inspectReason:\r\n row.dashboardUrl && row.state === \"success\"\r\n ? \"trusted_github_status_dashboard_url\"\r\n : row.dashboardUrl\r\n ? \"dashboard_url_not_api_inspectable\"\r\n : \"github_status_only\",\r\n githubState: row.state,\r\n vercelContext: row.context,\r\n };\r\n}\r\n\r\nexport interface CollectVercelEvidenceInput {\r\n statuses?: GitHubCommitStatusRow[] | null;\r\n /** When false, never call Vercel REST API (GitHub status only). Default path. */\r\n allowInspect?: boolean;\r\n /** @deprecated waitSeconds was for CLI inspect; ignored for API lookup. */\r\n waitSeconds?: number;\r\n runInspect?: RunVercelDeploymentLookup;\r\n observedAt?: string;\r\n}\r\n\r\n/**\r\n * Prefer GitHub Vercel StatusContext.state for gates. Call Vercel REST API only when\r\n * inspectable (deployment host or id), GitHub state is not terminal success, and\r\n * `allowInspect` is true with VERCEL_TOKEN configured.\r\n */\r\nexport async function collectVercelEvidence(\r\n input: CollectVercelEvidenceInput,\r\n): Promise<VercelEvidenceResult> {\r\n const observedAt = input.observedAt ?? new Date().toISOString();\r\n const base = evidenceFromGitHubVercelStatus(input.statuses ?? [], { observedAt });\r\n const row = pickVercelStatusContext(input.statuses ?? []);\r\n\r\n if (!row) return base;\r\n\r\n if (row.state === \"success\") {\r\n return {\r\n ...base,\r\n inspectSkipped: true,\r\n inspectReason: row.dashboardUrl\r\n ? \"trusted_github_status_dashboard_url\"\r\n : \"trusted_github_status\",\r\n };\r\n }\r\n\r\n if (!input.allowInspect) {\r\n return {\r\n ...base,\r\n inspectSkipped: true,\r\n inspectReason: \"api_lookup_disabled\",\r\n };\r\n }\r\n\r\n const { target, reason } = resolveVercelInspectTarget(row.targetUrl);\r\n if (!target) {\r\n return {\r\n ...base,\r\n inspectSkipped: true,\r\n inspectReason: reason ?? \"not_api_inspectable\",\r\n summary: evidenceSummary([\r\n base.summary ?? \"\",\r\n reason ?? \"skipped Vercel API lookup\",\r\n ]),\r\n };\r\n }\r\n\r\n const runLookup = input.runInspect ?? fetchVercelDeploymentStatus;\r\n const lookedUp = await runLookup(target);\r\n const observed = new Date().toISOString();\r\n\r\n if (!lookedUp.ok && lookedUp.error?.includes(\"VERCEL_TOKEN\")) {\r\n return {\r\n status: \"unavailable\",\r\n previewUrl: base.previewUrl,\r\n deploymentUrl: base.deploymentUrl,\r\n summary: \"VERCEL_TOKEN not configured for API fallback\",\r\n observedAt: observed,\r\n inspectSkipped: true,\r\n inspectReason: \"vercel_token_missing\",\r\n githubState: row.state,\r\n vercelContext: row.context,\r\n };\r\n }\r\n\r\n if (!lookedUp.ok) {\r\n return {\r\n status: row.state === \"pending\" ? \"building\" : \"error\",\r\n previewUrl: base.previewUrl,\r\n deploymentUrl: target.startsWith(\"http\") ? target : base.deploymentUrl,\r\n summary: evidenceSummary([\r\n `Vercel API lookup ${target} failed`,\r\n lookedUp.error ?? \"\",\r\n ]),\r\n observedAt: observed,\r\n inspectSkipped: false,\r\n inspectReason: null,\r\n githubState: row.state,\r\n vercelContext: row.context,\r\n };\r\n }\r\n\r\n const mapped = mapVercelReadyStateToEvidenceStatus(\r\n lookedUp.readyState,\r\n row.state === \"pending\",\r\n );\r\n const previewUrl =\r\n lookedUp.previewUrl ??\r\n (target.startsWith(\"http\") ? target : base.previewUrl);\r\n\r\n return {\r\n status: mapped,\r\n previewUrl,\r\n deploymentUrl: previewUrl ?? base.deploymentUrl,\r\n summary: evidenceSummary([\r\n `Vercel API ${target}=${lookedUp.readyState ?? \"unknown\"}`,\r\n mapped === \"ready\" ? \"preview ready\" : \"\",\r\n ]),\r\n observedAt: observed,\r\n inspectSkipped: false,\r\n inspectReason: null,\r\n githubState: row.state,\r\n vercelContext: row.context,\r\n };\r\n}\r\n\r\nexport type { GitHubVercelStatusContext };\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/repo-search.ts"],
|
|
4
|
-
"sourcesContent": ["/**\r\n * Normalize and classify repo text-search commands for harness operators and chat agents.\r\n *\r\n * Codex/OpenClaw often emit `search \"pattern\" in <scope>` meta that maps poorly to ripgrep\r\n * (e.g. `in !node_modules` instead of `-g '!node_modules/**'`, or `in package.json` as a path).\r\n */\r\n\r\nconst RG_BINARIES = new Set([\"rg\", \"ripgrep\", \"grep\"]);\r\nconst RG_OPTS_WITH_VALUE = new Set([\r\n \"-e\",\r\n \"--regexp\",\r\n \"-f\",\r\n \"--file\",\r\n \"-m\",\r\n \"--max-count\",\r\n \"-A\",\r\n \"--after-context\",\r\n \"-B\",\r\n \"--before-context\",\r\n \"-C\",\r\n \"--context\",\r\n \"-g\",\r\n \"--glob\",\r\n \"--iglob\",\r\n]);\r\n\r\nexport type RepoSearchKind =\r\n | \"not_repo_search\"\r\n | \"bad_scope\"\r\n | \"rg_exclude_syntax\"\r\n | \"no_matches\";\r\n\r\nexport interface RepoSearchContext {\r\n kind: RepoSearchKind;\r\n pattern?: string;\r\n target?: string;\r\n}\r\n\r\nfunction binaryName(token: string | undefined): string | null {\r\n if (!token) return null;\r\n const base = token.split(\"/\").pop() ?? token;\r\n return base.replace(/\\.exe$/i, \"\").toLowerCase();\r\n}\r\n\r\nfunction splitShellWords(input: string): string[] {\r\n if (!input) return [];\r\n const words: string[] = [];\r\n let current = \"\";\r\n let quote: string | undefined;\r\n let escaped = false;\r\n for (const char of input) {\r\n if (escaped) {\r\n current += char;\r\n escaped = false;\r\n continue;\r\n }\r\n if (char === \"\\\\\") {\r\n escaped = true;\r\n continue;\r\n }\r\n if (quote) {\r\n if (char === quote) quote = undefined;\r\n else current += char;\r\n continue;\r\n }\r\n if (char === '\"' || char === \"'\") {\r\n quote = char;\r\n continue;\r\n }\r\n if (/\\s/.test(char)) {\r\n if (current) {\r\n words.push(current);\r\n current = \"\";\r\n }\r\n continue;\r\n }\r\n current += char;\r\n }\r\n if (current) words.push(current);\r\n return words;\r\n}\r\n\r\nfunction isRgArgv(argv: string[]): boolean {\r\n const bin = binaryName(argv[0]);\r\n return Boolean(bin && RG_BINARIES.has(bin));\r\n}\r\n\r\nexport function isSingleFileSearchTarget(target: string | undefined): boolean {\r\n if (!target || target.includes(\"/\") || target.includes(\"*\")) return false;\r\n return /\\.(?:json|md|mjs|cjs|js|ts|tsx|yaml|yml)$/iu.test(target);\r\n}\r\n\r\n/** `!node_modules` as a path is invalid \u2014 ripgrep needs `-g '!node_modules/**'`. */\r\nexport function isRgExcludeScopeTarget(target: string | undefined): boolean {\r\n if (!target) return false;\r\n const t = target.trim();\r\n return t.startsWith(\"!\") && !t.includes(\"/\") && !t.endsWith(\"/**\");\r\n}\r\n\r\nfunction fixRgGlobToken(token: string): string {\r\n if (!token.startsWith(\"--glob=\")) return token;\r\n const value = token.slice(\"--glob=\".length);\r\n if (value.startsWith(\"!\") && !value.includes(\"/\") && !value.endsWith(\"/**\")) {\r\n return `--glob=${value}/**`;\r\n }\r\n return token;\r\n}\r\n\r\nfunction collectRgPositional(argv: string[]): string[] {\r\n const positional: string[] = [];\r\n for (let i = 1; i < argv.length; i += 1) {\r\n const token = argv[i];\r\n if (!token) continue;\r\n if (token === \"--\") {\r\n positional.push(...argv.slice(i + 1));\r\n break;\r\n }\r\n if (token.startsWith(\"-\")) {\r\n if (token.includes(\"=\")) continue;\r\n if (RG_OPTS_WITH_VALUE.has(token)) i += 1;\r\n continue;\r\n }\r\n positional.push(token);\r\n }\r\n return positional;\r\n}\r\n\r\nexport function normalizeRgArgv(argv: string[]): { argv: string[]; changed: boolean } {\r\n let changed = false;\r\n const out = argv.map((token) => {\r\n const fixed = fixRgGlobToken(token);\r\n if (fixed !== token) changed = true;\r\n return fixed;\r\n });\r\n const positional = collectRgPositional(out);\r\n if (positional.length === 2) {\r\n const [pattern, target] = positional;\r\n if (isSingleFileSearchTarget(target)) {\r\n return { argv: [out[0] ?? \"rg\", \"-g\", target, pattern, \".\"], changed: true };\r\n }\r\n }\r\n return { argv: out, changed };\r\n}\r\n\r\nexport function normalizeRepoSearchCommand(command: string): { command: string; changed: boolean } {\r\n const trimmed = command.trim();\r\n if (!trimmed) return { command: trimmed, changed: false };\r\n const joiner = trimmed.includes(\"&&\") ? \" && \" : trimmed.includes(\"||\") ? \" || \" : \"; \";\r\n const stages = trimmed.split(/\\s*(?:&&|\\|\\||;)\\s*/u);\r\n let changed = false;\r\n const normalizedStages = stages.map((stage) => {\r\n const argv = splitShellWords(stage.trim());\r\n if (!argv.length || !isRgArgv(argv)) return stage;\r\n const normalized = normalizeRgArgv(argv);\r\n if (normalized.changed) {\r\n changed = true;\r\n return normalized.argv.join(\" \");\r\n }\r\n return stage;\r\n });\r\n if (!changed) return { command: trimmed, changed: false };\r\n return { command: normalizedStages.join(joiner), changed: true };\r\n}\r\n\r\nexport function extractSearchMeta(meta: string): { pattern?: string; target?: string } {\r\n if (!meta) return {};\r\n const pipelineMatch = meta.match(/search\\s+\"(.+)\"\\s+in\\s+([^()]+?)(?:\\s*\\(|$)/iu);\r\n if (pipelineMatch) {\r\n return { pattern: pipelineMatch[1], target: pipelineMatch[2]?.trim() };\r\n }\r\n const match = meta.match(/^search\\s+\"(.+)\"\\s+in\\s+(.+)$/iu);\r\n if (!match) return {};\r\n return { pattern: match[1], target: match[2]?.trim() };\r\n}\r\n\r\nexport function classifyRepoSearchMeta(meta: string): RepoSearchContext {\r\n const { pattern, target } = extractSearchMeta(meta);\r\n if (!pattern) return { kind: \"not_repo_search\" };\r\n if (isRgExcludeScopeTarget(target)) {\r\n return { kind: \"rg_exclude_syntax\", pattern, target };\r\n }\r\n if (isSingleFileSearchTarget(target)) {\r\n return { kind: \"bad_scope\", pattern, target };\r\n }\r\n return { kind: \"not_repo_search\", pattern, target };\r\n}\r\n\r\nexport function metaToNormalizedRgCommand(meta: string): { command: string; changed: boolean } | null {\r\n const { pattern, target } = extractSearchMeta(meta);\r\n if (!pattern) return null;\r\n if (isRgExcludeScopeTarget(target)) {\r\n const glob = `${target!.trim()}/**`;\r\n return {\r\n command: `rg \"${pattern}\" -g '${glob}' .`,\r\n changed: true,\r\n };\r\n }\r\n if (target && isSingleFileSearchTarget(target)) {\r\n return {\r\n command: `rg -g ${target} \"${pattern}\" .`,\r\n changed: true,\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nexport function formatRepoSearchGuidance(ctx: RepoSearchContext): string | null {\r\n if (\r\n ctx.kind === \"bad_scope\" &&\r\n ctx.pattern?.includes(\"agent-os-land-pr\") &&\r\n ctx.target === \"package.json\"\r\n ) {\r\n return (\r\n \"Search package.json with a glob from the repo root: \" +\r\n \"`rg -g package.json agent-os-land-pr .` \u2014 or run `node scripts/agent-os-land-pr.mjs <pr-url>` directly.\"\r\n );\r\n }\r\n if (ctx.kind === \"bad_scope\" && ctx.pattern && ctx.target) {\r\n return `Use \\`rg -g '${ctx.target}' ${ctx.pattern} .\\` from the repo root instead of treating ${ctx.target} as a folder.`;\r\n }\r\n if (ctx.kind === \"rg_exclude_syntax\" && ctx.pattern) {\r\n const glob = ctx.target ? `${ctx.target.trim()}/**` : \"!node_modules/**\";\r\n return (\r\n `Repo search scope \\`${ctx.target ?? \"!node_modules\"}\\` is not a valid ripgrep path. ` +\r\n `Use \\`rg \"${ctx.pattern}\" -g '${glob}' .\\` from the repo root (exclude globs need a \\`/**\\` suffix).`\r\n );\r\n }\r\n if (ctx.kind === \"no_matches\" && ctx.pattern) {\r\n return `No matches for \"${ctx.pattern}\". Try a broader pattern, drop overly short tokens, or search from the repo root with \\`rg \"${ctx.pattern}\" .\\`.`;\r\n }\r\n return null;\r\n}\r\n\r\n/** Extract `search \"\u2026\" in \u2026` from a tool-failure line or command string. */\r\nexport function extractSearchMetaFromToolLine(line: string): string | null {\r\n const match = line.match(/search\\s+\"(.+)\"\\s+in\\s+([^()]+?)(?:\\s*\\(agent\\)|\\s*failed|$)/iu);\r\n if (!match) return null;\r\n return `search \"${match[1]}\" in ${match[2]?.trim()}`;\r\n}\r\n\r\nexport function diagnoseRepoSearchFailure(input: {\r\n meta?: string;\r\n command?: string;\r\n exitCode?: number;\r\n}): string | null {\r\n const meta =\r\n input.meta?.trim() ||\r\n (input.command ? extractSearchMetaFromToolLine(input.command) : null) ||\r\n null;\r\n if (meta) {\r\n const ctx = classifyRepoSearchMeta(meta);\r\n const guidance = formatRepoSearchGuidance(ctx);\r\n if (guidance) return guidance;\r\n const normalized = metaToNormalizedRgCommand(meta);\r\n if (normalized?.changed) {\r\n return `Repo search used an invalid scope. Retry with: \\`${normalized.command}\\`.`;\r\n }\r\n }\r\n if (input.command && /\\b(rg|ripgrep)\\b/i.test(input.command)) {\r\n const normalized = normalizeRepoSearchCommand(input.command);\r\n if (normalized.changed) {\r\n return `Ripgrep scope may be invalid. Retry with: \\`${normalized.command}\\`.`;\r\n }\r\n if (input.exitCode === 1) {\r\n return \"Ripgrep returned no matches (exit 1). Try a broader pattern or search from the repo root.\";\r\n }\r\n }\r\n return null;\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|