{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/core/evaluation/identity.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,2BAA2B,EAC3B,6BAA6B,EAC7B,kBAAkB,EAClB,SAAS,EACT,MAAM,YAAY,CAAC;AAEpB,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOtD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAEzD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAE3D;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAExE;AAED,wBAAgB,yBAAyB,CACxC,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,OAAO,CAAC,6BAA6B,CAAC,GAChD,6BAA6B,CAe/B;AAED,wBAAgB,uBAAuB,CAAC,KAAK,GAAE,OAAO,CAAC,2BAA2B,CAAM,GAAG,2BAA2B,CAoBrH;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7F,GAAG,OAAO,CAYV","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { env } from \"node:process\";\nimport type {\n\tEvaluationCandidateIdentity,\n\tEvaluationEnvironmentIdentity,\n\tEvaluationScenario,\n\tJsonValue,\n} from \"./types.js\";\n\nexport function stableStringify(value: unknown): string {\n\tif (value === null || typeof value !== \"object\") return JSON.stringify(value);\n\tif (Array.isArray(value)) return `[${value.map(stableStringify).join(\",\")}]`;\n\tconst entries = Object.entries(value as Record<string, unknown>)\n\t\t.filter(([, entry]) => entry !== undefined)\n\t\t.sort(([left], [right]) => left.localeCompare(right));\n\treturn `{${entries.map(([key, entry]) => `${JSON.stringify(key)}:${stableStringify(entry)}`).join(\",\")}}`;\n}\n\nexport function sha256(value: string | Uint8Array): string {\n\treturn createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nexport function hashJson(value: JsonValue | unknown): string {\n\treturn sha256(stableStringify(value));\n}\n\nexport function scenarioContentHash(scenario: EvaluationScenario): string {\n\treturn hashJson(scenario);\n}\n\nexport function createEnvironmentIdentity(\n\tfixtureHash: string,\n\toverrides?: Partial<EvaluationEnvironmentIdentity>,\n): EvaluationEnvironmentIdentity {\n\treturn {\n\t\tos: overrides?.os ?? process.platform,\n\t\tarchitecture: overrides?.architecture ?? process.arch,\n\t\tnodeVersion: overrides?.nodeVersion ?? process.version,\n\t\tpackageManager: overrides?.packageManager ?? \"npm\",\n\t\tfixtureHash,\n\t\ttimezone: overrides?.timezone ?? Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t\tlocale: overrides?.locale ?? Intl.DateTimeFormat().resolvedOptions().locale,\n\t\tavailableTools: overrides?.availableTools ?? [\"node\", \"git\"],\n\t\tsandboxPolicyVersion: overrides?.sandboxPolicyVersion ?? \"1\",\n\t\tjensenPackageIntegrity: overrides?.jensenPackageIntegrity,\n\t\tgitCommit: overrides?.gitCommit,\n\t\tproviderFixtureVersion: overrides?.providerFixtureVersion,\n\t};\n}\n\nexport function createCandidateIdentity(input: Partial<EvaluationCandidateIdentity> = {}): EvaluationCandidateIdentity {\n\treturn {\n\t\tjensenVersion: input.jensenVersion ?? \"unknown\",\n\t\tproviderProfile: input.providerProfile ?? \"fixture\",\n\t\tprovider: input.provider ?? \"fixture\",\n\t\tconfiguredModel: input.configuredModel ?? \"deterministic-fixture\",\n\t\tresolvedModel: input.resolvedModel,\n\t\tthinkingLevel: input.thinkingLevel,\n\t\ttemperature: input.temperature,\n\t\tseed: input.seed,\n\t\tsystemPromptHash: input.systemPromptHash ?? sha256(\"\"),\n\t\ttoolSchemaHash: input.toolSchemaHash ?? sha256(\"\"),\n\t\tpolicyHash: input.policyHash ?? sha256(\"\"),\n\t\tskillSetHash: input.skillSetHash ?? sha256(\"\"),\n\t\tsubagentRegistryHash: input.subagentRegistryHash ?? sha256(\"\"),\n\t\tretrievalConfigurationHash: input.retrievalConfigurationHash ?? sha256(\"\"),\n\t\truntimeFeatureFlags: input.runtimeFeatureFlags ?? {},\n\t\tgitCommit: input.gitCommit,\n\t\tpackageIntegrity: input.packageIntegrity,\n\t};\n}\n\nexport function hasExplicitLiveOptIn(options: {\n\tmode?: string;\n\tlive?: boolean;\n\tconfirmed?: boolean;\n\tbudget?: { maximumCostUsd?: number; maximumModelCalls?: number; maximumWallTimeMs?: number };\n}): boolean {\n\treturn (\n\t\toptions.mode === \"live\" &&\n\t\toptions.live === true &&\n\t\t(options.confirmed === true || env.JENSEN_EVAL_LIVE === \"1\") &&\n\t\toptions.budget?.maximumCostUsd !== undefined &&\n\t\toptions.budget.maximumCostUsd > 0 &&\n\t\toptions.budget.maximumModelCalls !== undefined &&\n\t\toptions.budget.maximumModelCalls > 0 &&\n\t\toptions.budget.maximumWallTimeMs !== undefined &&\n\t\toptions.budget.maximumWallTimeMs > 0\n\t);\n}\n"]}