pi-background-tasks 2.5.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BACKGROUND-TASKS-INSTRUCTIONS.md +1 -1
- package/README.md +70 -25
- package/TESTING.md +42 -2
- package/TEST_PLAN.md +7 -4
- package/dist/extensions/anthropic-attribution-child.js +4 -0
- package/dist/extensions/anthropic-attribution-child.js.map +1 -0
- package/dist/extensions/anthropic-attribution.js +107 -0
- package/dist/extensions/anthropic-attribution.js.map +1 -0
- package/dist/extensions/background-tasks.js +2 -0
- package/dist/extensions/background-tasks.js.map +1 -0
- package/dist/extensions/delegate-child.js +2 -0
- package/dist/extensions/delegate-child.js.map +1 -0
- package/dist/extensions/fusion-child.js +2 -0
- package/dist/extensions/fusion-child.js.map +1 -0
- package/dist/package.json +5 -0
- package/dist/src/core/anthropic-attribution-path.js +24 -0
- package/dist/src/core/anthropic-attribution-path.js.map +1 -0
- package/dist/src/core/anthropic-attribution.js +2247 -0
- package/dist/src/core/anthropic-attribution.js.map +1 -0
- package/dist/src/core/attested-pi-contract.js +5 -0
- package/dist/src/core/attested-pi-contract.js.map +1 -0
- package/dist/src/core/attested-pi-run.js +749 -0
- package/dist/src/core/attested-pi-run.js.map +1 -0
- package/dist/src/core/canonical-json.js +19 -0
- package/dist/src/core/canonical-json.js.map +1 -0
- package/dist/src/core/common.js +787 -0
- package/dist/src/core/common.js.map +1 -0
- package/dist/src/core/config.js +78 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/context/parent-snapshot.js +75 -0
- package/dist/src/core/context/parent-snapshot.js.map +1 -0
- package/dist/src/core/context/token-budget.js +631 -0
- package/dist/src/core/context/token-budget.js.map +1 -0
- package/dist/src/core/context/visible-conversation-v2.js +390 -0
- package/dist/src/core/context/visible-conversation-v2.js.map +1 -0
- package/dist/src/core/delegate/artifacts.js +357 -0
- package/dist/src/core/delegate/artifacts.js.map +1 -0
- package/dist/src/core/delegate/budget.js +266 -0
- package/dist/src/core/delegate/budget.js.map +1 -0
- package/dist/src/core/delegate/facade-contract.js +7 -0
- package/dist/src/core/delegate/facade-contract.js.map +1 -0
- package/dist/src/core/delegate/hook-contract-evidence.json +18 -0
- package/dist/src/core/delegate/hook-contract.js +124 -0
- package/dist/src/core/delegate/hook-contract.js.map +1 -0
- package/dist/src/core/delegate/launch.js +366 -0
- package/dist/src/core/delegate/launch.js.map +1 -0
- package/dist/src/core/delegate/result-package.js +293 -0
- package/dist/src/core/delegate/result-package.js.map +1 -0
- package/dist/src/core/delegate/runner.js +398 -0
- package/dist/src/core/delegate/runner.js.map +1 -0
- package/dist/src/core/delegate/seed.js +334 -0
- package/dist/src/core/delegate/seed.js.map +1 -0
- package/dist/src/core/delegate/types.js +103 -0
- package/dist/src/core/delegate/types.js.map +1 -0
- package/dist/src/core/durable-fs.js +372 -0
- package/dist/src/core/durable-fs.js.map +1 -0
- package/dist/src/core/extension-api.js +382 -0
- package/dist/src/core/extension-api.js.map +1 -0
- package/dist/src/core/fusion/artifacts.js +654 -0
- package/dist/src/core/fusion/artifacts.js.map +1 -0
- package/dist/src/core/fusion/budget.js +949 -0
- package/dist/src/core/fusion/budget.js.map +1 -0
- package/dist/src/core/fusion/child-protocol.js +176 -0
- package/dist/src/core/fusion/child-protocol.js.map +1 -0
- package/dist/src/core/fusion/claude-cache.js +156 -0
- package/dist/src/core/fusion/claude-cache.js.map +1 -0
- package/dist/src/core/fusion/clean-context.js +64 -0
- package/dist/src/core/fusion/clean-context.js.map +1 -0
- package/dist/src/core/fusion/config.js +349 -0
- package/dist/src/core/fusion/config.js.map +1 -0
- package/dist/src/core/fusion/context.js +184 -0
- package/dist/src/core/fusion/context.js.map +1 -0
- package/dist/src/core/fusion/evaluation.js +696 -0
- package/dist/src/core/fusion/evaluation.js.map +1 -0
- package/dist/src/core/fusion/facade-contract.js +3 -0
- package/dist/src/core/fusion/facade-contract.js.map +1 -0
- package/dist/src/core/fusion/orchestrator.js +867 -0
- package/dist/src/core/fusion/orchestrator.js.map +1 -0
- package/dist/src/core/fusion/output-contract.js +27 -0
- package/dist/src/core/fusion/output-contract.js.map +1 -0
- package/dist/src/core/fusion/pi-child.js +1741 -0
- package/dist/src/core/fusion/pi-child.js.map +1 -0
- package/dist/src/core/fusion/prompts.js +260 -0
- package/dist/src/core/fusion/prompts.js.map +1 -0
- package/dist/src/core/fusion/result-package.js +857 -0
- package/dist/src/core/fusion/result-package.js.map +1 -0
- package/dist/src/core/fusion/source-policy.js +259 -0
- package/dist/src/core/fusion/source-policy.js.map +1 -0
- package/dist/src/core/fusion/types.js +207 -0
- package/dist/src/core/fusion/types.js.map +1 -0
- package/dist/src/core/fusion/web-fetch.js +777 -0
- package/dist/src/core/fusion/web-fetch.js.map +1 -0
- package/dist/src/core/fusion/workflows.js +126 -0
- package/dist/src/core/fusion/workflows.js.map +1 -0
- package/dist/src/core/lazy-module.js +181 -0
- package/dist/src/core/lazy-module.js.map +1 -0
- package/dist/src/core/pi-launch.js +431 -0
- package/dist/src/core/pi-launch.js.map +1 -0
- package/dist/src/core/registry.js +3331 -0
- package/dist/src/core/registry.js.map +1 -0
- package/dist/src/core/reload-shell-owner.js +1396 -0
- package/dist/src/core/reload-shell-owner.js.map +1 -0
- package/dist/src/core/shell-policy.js +80 -0
- package/dist/src/core/shell-policy.js.map +1 -0
- package/dist/src/core/task-durable.js +51 -0
- package/dist/src/core/task-durable.js.map +1 -0
- package/dist/src/core/update-check.js +92 -0
- package/dist/src/core/update-check.js.map +1 -0
- package/dist/src/core/windows-taskkill.js +185 -0
- package/dist/src/core/windows-taskkill.js.map +1 -0
- package/dist/src/delegate-child-extension.js +776 -0
- package/dist/src/delegate-child-extension.js.map +1 -0
- package/dist/src/delegate-extension.js +746 -0
- package/dist/src/delegate-extension.js.map +1 -0
- package/dist/src/extension.js +953 -0
- package/dist/src/extension.js.map +1 -0
- package/dist/src/fusion-child-extension.js +760 -0
- package/dist/src/fusion-child-extension.js.map +1 -0
- package/dist/src/fusion-extension.js +1030 -0
- package/dist/src/fusion-extension.js.map +1 -0
- package/dist/src/ui/background-tasks-manager.js +689 -0
- package/dist/src/ui/background-tasks-manager.js.map +1 -0
- package/dist/src/ui/fusion-model-selector.js +277 -0
- package/dist/src/ui/fusion-model-selector.js.map +1 -0
- package/docs/INDEX.md +35 -33
- package/docs/api/eventbus-v1.md +21 -5
- package/docs/choose-a-workflow.md +2 -0
- package/docs/commands/bg-clear.md +3 -3
- package/docs/commands/bg-update.md +3 -3
- package/docs/commands/bg.md +18 -6
- package/docs/commands/claude-cache.md +4 -4
- package/docs/commands/fusion-models.md +49 -4
- package/docs/commands/fusion.md +3 -3
- package/docs/commands/jobs.md +3 -3
- package/docs/commands/kill.md +3 -3
- package/docs/commands/logs.md +3 -3
- package/docs/commands/task-manager.md +5 -5
- package/docs/concepts/completion-delivery.md +6 -2
- package/docs/getting-started.md +7 -1
- package/docs/manifest.json +228 -42
- package/docs/operations/configuration.md +58 -5
- package/docs/operations/releasing.md +4 -2
- package/docs/operations/testing.md +22 -0
- package/docs/operations/troubleshooting.md +6 -2
- package/docs/read-before-edit.md +44 -31
- package/docs/reference/runtime-contracts.md +87 -51
- package/docs/reference/shortcuts-and-dock.md +28 -14
- package/docs/subsystems/anthropic-attribution.md +23 -11
- package/docs/subsystems/attested-pi-runs.md +12 -7
- package/docs/subsystems/background-task-runtime.md +53 -11
- package/docs/subsystems/child-launch-durability-and-safety.md +28 -9
- package/docs/subsystems/delegation.md +16 -3
- package/docs/subsystems/docs-freshness-gate.md +14 -7
- package/docs/subsystems/fusion.md +36 -11
- package/docs/subsystems/host-ui-and-telemetry.md +22 -9
- package/docs/tools/bg_delegate.md +3 -1
- package/docs/tools/bg_kill.md +3 -1
- package/docs/tools/bg_logs.md +3 -1
- package/docs/tools/bg_result.md +5 -3
- package/docs/tools/bg_run.md +31 -5
- package/docs/tools/bg_run_pi_attested.md +3 -1
- package/docs/tools/bg_status.md +3 -1
- package/docs/tools/fusion_investigate.md +3 -1
- package/docs/tools/fusion_reason.md +3 -1
- package/docs/tools/fusion_research.md +3 -1
- package/docs/tools/fusion_validate.md +3 -1
- package/extensions/anthropic-attribution-child.ts +3 -0
- package/extensions/anthropic-attribution.ts +166 -1
- package/package.json +12 -10
- package/src/core/anthropic-attribution-path.ts +5 -4
- package/src/core/anthropic-attribution.ts +293 -113
- package/src/core/attested-pi-contract.ts +4 -0
- package/src/core/attested-pi-run.ts +468 -81
- package/src/core/canonical-json.ts +21 -0
- package/src/core/common.ts +450 -40
- package/src/core/config.ts +121 -0
- package/src/core/context/visible-conversation-v2.ts +3 -6
- package/src/core/delegate/artifacts.ts +13 -9
- package/src/core/delegate/budget.ts +13 -6
- package/src/core/delegate/facade-contract.ts +6 -0
- package/src/core/delegate/result-package.ts +32 -14
- package/src/core/delegate/runner.ts +129 -58
- package/src/core/delegate/seed.ts +5 -7
- package/src/core/durable-fs.ts +178 -30
- package/src/core/extension-api.ts +36 -8
- package/src/core/fusion/artifacts.ts +17 -16
- package/src/core/fusion/clean-context.ts +8 -5
- package/src/core/fusion/config.ts +2 -1
- package/src/core/fusion/context.ts +2 -6
- package/src/core/fusion/facade-contract.ts +2 -0
- package/src/core/fusion/orchestrator.ts +3 -3
- package/src/core/fusion/prompts.ts +1 -1
- package/src/core/fusion/result-package.ts +259 -72
- package/src/core/fusion/source-policy.ts +43 -17
- package/src/core/lazy-module.ts +215 -0
- package/src/core/pi-launch.ts +390 -65
- package/src/core/registry.ts +2010 -381
- package/src/core/reload-shell-owner.ts +1662 -0
- package/src/core/shell-policy.ts +134 -0
- package/src/core/task-durable.ts +67 -0
- package/src/delegate-extension.ts +404 -144
- package/src/extension.ts +387 -114
- package/src/fusion-extension.ts +202 -96
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attested-pi-run.js","sourceRoot":"","sources":["../../../src/core/attested-pi-run.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn as nodeSpawn, type SpawnOptions } from 'node:child_process';\nimport { randomBytes } from 'node:crypto';\nimport { readFile, realpath, stat } from 'node:fs/promises';\nimport { isAbsolute, join, relative, resolve, sep } from 'node:path';\nimport type { Api, Model } from '@earendil-works/pi-ai';\nimport type {\n BackgroundTaskChildProcess,\n BackgroundTaskContext,\n BackgroundTaskSpawn,\n} from './registry.js';\nimport { isJsonObject, parseJsonText, type BgTaskSnapshot, type JsonObject } from './common.js';\nimport { canonicalJson, sha256Buffer } from './canonical-json.js';\nimport {\n ATTESTED_GIT_KILL_GRACE_MS,\n ATTESTED_GIT_MAX_OUTPUT_BYTES,\n ATTESTED_GIT_TIMEOUT_MS,\n} from './attested-pi-contract.js';\nexport { canonicalJson, sha256Buffer } from './canonical-json.js';\nexport {\n ATTESTED_GIT_KILL_GRACE_MS,\n ATTESTED_GIT_MAX_OUTPUT_BYTES,\n ATTESTED_GIT_TIMEOUT_MS,\n ATTESTED_TASK_ID_PATTERN,\n} from './attested-pi-contract.js';\nexport { closeAndFsyncOutputStream, writeFileFsynced, writeJsonAtomic } from './task-durable.js';\nimport {\n runWindowsTaskkill,\n type TaskkillOutcome,\n type WindowsKillPhase,\n type WindowsTaskkillOptions,\n} from './windows-taskkill.js';\nimport {\n assertWindowsCommandLineWithinLimit,\n piLaunchArgv,\n resolvePiLaunch,\n type PiLaunchSpec,\n} from './pi-launch.js';\n\nexport const PI_TASK_ATTESTATION_SCHEMA_VERSION = 'phase2.pi_task_attestation.v1';\n\nexport interface StructuredPiLaunchRequest {\n name: string;\n provider: string;\n model: string;\n prompt: string;\n reportPath: string;\n extraPiArgs?: string[] | undefined;\n thinking?: string | undefined;\n timeoutSeconds?: number | undefined;\n}\n\nexport interface AttestedTaskPaths {\n outputAbsPath: string;\n metadataAbsPath: string;\n eventsAbsPath: string;\n stderrAbsPath: string;\n wrapperAbsPath: string;\n attestationAbsPath: string;\n outputPath: string;\n metadataPath: string;\n eventsPath: string;\n stderrPath: string;\n wrapperPath: string;\n attestationPath: string;\n}\n\nexport interface GitAuthoritySnapshot {\n commit: string;\n tree: string;\n clean: boolean;\n}\n\ninterface AttestedGitOutputStream {\n on(event: 'data', listener: (data: Buffer | string) => void): unknown;\n off(event: 'data', listener: (data: Buffer | string) => void): unknown;\n}\n\nexport interface AttestedGitChildProcess {\n readonly pid?: number | undefined;\n readonly stdout?: AttestedGitOutputStream | null | undefined;\n readonly stderr?: AttestedGitOutputStream | null | undefined;\n kill(signal?: NodeJS.Signals): boolean;\n on(event: 'error', listener: (error: Error) => void): unknown;\n on(\n event: 'close',\n listener: (code: number | null, signal: NodeJS.Signals | null) => void,\n ): unknown;\n off(event: 'error', listener: (error: Error) => void): unknown;\n off(\n event: 'close',\n listener: (code: number | null, signal: NodeJS.Signals | null) => void,\n ): unknown;\n}\n\nexport type AttestedGitSpawn = (\n command: string,\n args: string[],\n options: SpawnOptions,\n) => AttestedGitChildProcess;\n\nexport type AttestedGitKillProcess = (pid: number, signal?: NodeJS.Signals | number) => boolean;\n\nexport type AttestedGitKillTree = (\n pid: number,\n phase: WindowsKillPhase,\n signal?: AbortSignal,\n) => Promise<TaskkillOutcome>;\n\nexport interface GitCommandOptions {\n readonly signal?: AbortSignal | undefined;\n readonly deadlineAt?: number | undefined;\n readonly spawn?: AttestedGitSpawn | undefined;\n readonly killProcess?: AttestedGitKillProcess | undefined;\n readonly killTree?: AttestedGitKillTree | undefined;\n readonly platform?: NodeJS.Platform | undefined;\n readonly env?: NodeJS.ProcessEnv | undefined;\n readonly killGraceMs?: number | undefined;\n readonly maxOutputBytes?: number | undefined;\n}\n\ninterface GitCloseRecord {\n readonly code: number | null;\n readonly signal: NodeJS.Signals | null;\n}\n\nexport class AttestedGitCommandError extends Error {\n readonly code = 'attested_git_failed';\n\n constructor(message: string) {\n super(message);\n this.name = 'AttestedGitCommandError';\n }\n}\n\nexport class AttestedGitTimeoutError extends Error {\n readonly code = 'attested_git_timeout';\n\n constructor(args: readonly string[]) {\n super(`git ${args.join(' ')} timed out during attested Pi preflight`);\n this.name = 'AttestedGitTimeoutError';\n }\n}\n\nexport class AttestedGitOutputLimitError extends Error {\n readonly code = 'attested_git_output_limit';\n\n constructor(args: readonly string[], maxBytes: number) {\n super(\n `git ${args.join(' ')} output exceeded the explicit ${String(maxBytes)} bytes per-stream limit`,\n );\n this.name = 'AttestedGitOutputLimitError';\n }\n}\n\nclass AttestedGitCleanupError extends Error {\n readonly code = 'attested_git_cleanup_failed';\n readonly primaryError: Error;\n readonly cleanupErrors: readonly string[];\n\n constructor(primaryError: Error, cleanupErrors: readonly string[]) {\n super(`${primaryError.message}; Git process-tree cleanup failed: ${cleanupErrors.join('; ')}`);\n this.name = 'AttestedGitCleanupError';\n this.primaryError = primaryError;\n this.cleanupErrors = [...cleanupErrors];\n }\n}\n\nexport interface ParsedPiEvents {\n piSessionId: string;\n piCwd: string;\n provider: string;\n model: string;\n providerScopedModelId: string;\n finalStopReason: string;\n tokenUsage: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n totalTokens: number;\n costTotal?: number | undefined;\n };\n assistantCount: number;\n toolUsage: { total: number; failed: number; byName: Record<string, number> };\n humanTranscript: string;\n}\n\nexport interface AuthObservation {\n apiIdentity: string;\n authClass: string;\n credentialKind: 'oauth';\n routeClass: 'subscription-agent';\n channel: string;\n directApiKey: false;\n selectedModel: Model<Api>;\n}\n\nexport interface FinalAttestationInputs {\n task: BgTaskSnapshot;\n paths: AttestedTaskPaths;\n sessionDir: string;\n argv: string[];\n cwdRealpath: string;\n repoRootRealpath: string;\n startAuthority: GitAuthoritySnapshot;\n finishAuthority: GitAuthoritySnapshot;\n parsedEvents: ParsedPiEvents;\n auth: AuthObservation;\n prompt: Buffer;\n reportAbsPath: string;\n}\n\nexport function makeAttestedTaskId(): string {\n return `b${randomBytes(16).toString('hex')}`;\n}\n\nexport function validateStructuredPiLaunchRequest(input: StructuredPiLaunchRequest): void {\n if (!input.name.trim()) throw new Error('Attested Pi task requires a concise name');\n if (!input.provider.trim()) throw new Error('Attested Pi task requires provider');\n if (!input.model.trim()) throw new Error('Attested Pi task requires model');\n if (!input.prompt) throw new Error('Attested Pi task requires prompt text');\n if (!input.reportPath.trim()) throw new Error('Attested Pi task requires a report path');\n const args = input.extraPiArgs ?? [];\n for (const arg of args) {\n if (arg === '--api-key' || arg.startsWith('--api-key=')) {\n throw new Error('Attested Pi tasks forbid direct --api-key launch arguments');\n }\n if (arg === '--auth-file' || arg.startsWith('--auth-file=')) {\n throw new Error('Attested Pi tasks forbid alternate auth-file launch arguments');\n }\n if (arg === '-p' || arg === '--print' || arg === '--mode' || arg.startsWith('--mode=')) {\n throw new Error('Attested Pi tasks own print/json mode arguments');\n }\n if (\n arg === '--provider' ||\n arg.startsWith('--provider=') ||\n arg === '--model' ||\n arg.startsWith('--model=')\n ) {\n throw new Error('Use structured provider/model fields, not duplicate Pi args');\n }\n if (arg === '--thinking' || arg.startsWith('--thinking=')) {\n throw new Error('Use the structured thinking field, not duplicate Pi args');\n }\n }\n}\n\nconst ATTESTED_PI_REMOVED_ENV_KEYS = [\n 'OPENROUTER_API_KEY',\n 'OPENROUTER_BASE_URL',\n 'OPENAI_API_KEY',\n 'OPENAI_BASE_URL',\n 'ANTHROPIC_API_KEY',\n 'ANTHROPIC_BASE_URL',\n 'PI_API_KEY',\n 'PI_API_BASE_URL',\n 'PI_AUTH_FILE',\n] as const;\n\nexport function attestedPiChildEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const out: NodeJS.ProcessEnv = { ...env };\n for (const key of ATTESTED_PI_REMOVED_ENV_KEYS) Reflect.deleteProperty(out, key);\n return out;\n}\n\nexport function buildAttestedPiArgv(\n input: StructuredPiLaunchRequest,\n attributionExtensionPath?: string,\n): string[] {\n validateStructuredPiLaunchRequest(input);\n const args = ['pi', '--mode', 'json', '--provider', input.provider, '--model', input.model];\n if (input.provider === 'anthropic') {\n if (!attributionExtensionPath?.trim()) {\n throw new Error('Anthropic attested Pi tasks require the package attribution extension');\n }\n args.push('--extension', attributionExtensionPath);\n }\n if (input.thinking?.trim()) args.push('--thinking', input.thinking.trim());\n args.push(...(input.extraPiArgs ?? []), input.prompt);\n return args;\n}\n\nexport async function resolveReportPath(cwd: string, reportPath: string): Promise<string> {\n if (isAbsolute(reportPath))\n throw new Error('Attested Pi report path must be relative to task cwd');\n const resolved = resolve(cwd, reportPath);\n const relativePath = relative(cwd, resolved);\n if (relativePath === '' || relativePath.startsWith('..') || isAbsolute(relativePath)) {\n throw new Error('Attested Pi report path must stay inside task cwd');\n }\n const parts = relativePath.split(sep);\n if (parts[0] === '.git' || (parts[0] === '.pi' && parts[1] === 'tasks')) {\n throw new Error('Attested Pi report path cannot target Git metadata or the fixed task store');\n }\n return resolved;\n}\n\nfunction positiveInteger(value: number | undefined, fallback: number, label: string): number {\n const candidate = value ?? fallback;\n if (!Number.isFinite(candidate) || candidate <= 0) {\n throw new Error(`${label} must be a positive finite number`);\n }\n return Math.max(1, Math.floor(candidate));\n}\n\nfunction errorCode(error: unknown): string | undefined {\n if (typeof error !== 'object' || error === null) return undefined;\n const code = Reflect.get(error, 'code');\n return typeof code === 'string' ? code : undefined;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction signalError(signal: AbortSignal): Error {\n return signal.reason instanceof Error\n ? signal.reason\n : new Error(\n `Attested Git preflight cancelled${signal.reason === undefined ? '' : `: ${String(signal.reason)}`}`,\n );\n}\n\nfunction gitDeadline(options: GitCommandOptions): number {\n const configured = options.deadlineAt;\n return typeof configured === 'number' && Number.isFinite(configured)\n ? configured\n : Date.now() + ATTESTED_GIT_TIMEOUT_MS;\n}\n\nfunction assertGitBoundary(options: GitCommandOptions, args: readonly string[]): void {\n if (options.signal?.aborted === true) throw signalError(options.signal);\n if (Date.now() >= gitDeadline(options)) throw new AttestedGitTimeoutError(args);\n}\n\nclass BoundedGitCapture {\n private readonly chunks: Buffer[] = [];\n private bytes = 0;\n private exceeded = false;\n\n constructor(private readonly maxBytes: number) {}\n\n append(data: Buffer | string): boolean {\n const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data, 'utf8');\n const remaining = this.maxBytes - this.bytes;\n if (remaining > 0) {\n const kept = buffer.length <= remaining ? buffer : buffer.subarray(0, remaining);\n this.chunks.push(kept);\n this.bytes += kept.length;\n }\n if (buffer.length > Math.max(0, remaining)) this.exceeded = true;\n return this.exceeded;\n }\n\n text(): string {\n return Buffer.concat(this.chunks, this.bytes).toString('utf8');\n }\n\n diagnostic(): string {\n const text = this.text().trim();\n return this.exceeded\n ? `${text}${text.length > 0 ? ' ' : ''}[output exceeded ${String(this.maxBytes)} bytes]`\n : text;\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolvePromise) => {\n setTimeout(resolvePromise, ms);\n });\n}\n\nfunction posixTreeSignal(\n child: AttestedGitChildProcess,\n pid: number | undefined,\n signal: NodeJS.Signals,\n killProcess: AttestedGitKillProcess,\n): string[] {\n const errors: string[] = [];\n if (pid !== undefined) {\n try {\n if (killProcess(-pid, signal)) return errors;\n errors.push(`process group ${signal} returned false`);\n } catch (error) {\n if (errorCode(error) === 'ESRCH') return [];\n errors.push(`process group ${signal} failed: ${errorMessage(error)}`);\n }\n }\n try {\n if (child.kill(signal)) return errors;\n errors.push(`child ${signal} returned false`);\n } catch (error) {\n if (errorCode(error) === 'ESRCH') return errors;\n errors.push(`child ${signal} failed: ${errorMessage(error)}`);\n }\n return errors;\n}\n\nfunction windowsTaskkillSucceeded(outcome: TaskkillOutcome): boolean {\n return outcome.exitCode === 0 || outcome.exitCode === 128;\n}\n\nfunction describeTaskkill(phase: WindowsKillPhase, outcome: TaskkillOutcome): string {\n const stderr = outcome.stderr.trim();\n const stdout = outcome.stdout.trim();\n const detail = stderr || stdout;\n const truncated = outcome.stderrTruncated || outcome.stdoutTruncated ? ' (output truncated)' : '';\n return `taskkill ${phase} exited ${String(outcome.exitCode)}${detail ? `: ${detail}` : ''}${truncated}`;\n}\n\ninterface GitTerminationOptions {\n readonly platform: NodeJS.Platform;\n readonly killProcess: AttestedGitKillProcess;\n readonly killTree: AttestedGitKillTree;\n}\n\nasync function terminateGitProcessTree(\n child: AttestedGitChildProcess,\n options: GitTerminationOptions,\n killGraceMs: number,\n isClosed: () => boolean,\n): Promise<string[]> {\n const pid = child.pid;\n if (options.platform !== 'win32') {\n const errors = posixTreeSignal(child, pid, 'SIGTERM', options.killProcess);\n // Keep the grace timer referenced and always probe/force the process group\n // once. The direct Git process can exit before a descendant that ignored\n // TERM; forcing the detached group closes that tree-shaped race.\n await delay(killGraceMs);\n errors.push(...posixTreeSignal(child, pid, 'SIGKILL', options.killProcess));\n return errors;\n }\n\n if (pid === undefined) return ['Git process has no pid for Windows tree termination'];\n const softController = new AbortController();\n let softOutcome: TaskkillOutcome | undefined;\n let softError: unknown;\n let softSettled = false;\n const soft = Promise.resolve()\n .then(() => options.killTree(pid, 'terminate', softController.signal))\n .then(\n (outcome) => {\n softOutcome = outcome;\n softSettled = true;\n },\n (error: unknown) => {\n softError = error;\n softSettled = true;\n },\n );\n await delay(killGraceMs);\n const softSucceeded = softOutcome !== undefined && windowsTaskkillSucceeded(softOutcome);\n const needsForce = !softSettled || !softSucceeded || !isClosed();\n if (!softSettled) softController.abort();\n await soft;\n\n const errors: string[] = [];\n if (softError !== undefined) errors.push(`taskkill terminate failed: ${errorMessage(softError)}`);\n else if (softOutcome !== undefined && !windowsTaskkillSucceeded(softOutcome))\n errors.push(describeTaskkill('terminate', softOutcome));\n if (!needsForce) return errors;\n\n try {\n const forceOutcome = await options.killTree(pid, 'force');\n if (!windowsTaskkillSucceeded(forceOutcome))\n errors.push(describeTaskkill('force', forceOutcome));\n } catch (error) {\n errors.push(`taskkill force failed: ${errorMessage(error)}`);\n }\n return errors;\n}\n\nfunction defaultGitSpawn(\n command: string,\n args: string[],\n options: SpawnOptions,\n): AttestedGitChildProcess {\n return nodeSpawn(command, args, options);\n}\n\nexport async function runGitCommand(\n cwd: string,\n args: string[],\n options: GitCommandOptions = {},\n): Promise<string> {\n const deadlineAt = gitDeadline(options);\n const boundedOptions: GitCommandOptions = { ...options, deadlineAt };\n assertGitBoundary(boundedOptions, args);\n const platform = options.platform ?? process.platform;\n const env = options.env ?? process.env;\n const spawn = options.spawn ?? defaultGitSpawn;\n const killProcess = options.killProcess ?? process.kill.bind(process);\n const killTree: AttestedGitKillTree =\n options.killTree ??\n ((pid, phase, signal) => {\n const taskkillOptions: WindowsTaskkillOptions =\n signal === undefined ? { env } : { env, signal };\n return runWindowsTaskkill(pid, phase, taskkillOptions);\n });\n const killGraceMs = positiveInteger(\n options.killGraceMs,\n ATTESTED_GIT_KILL_GRACE_MS,\n 'killGraceMs',\n );\n const maxOutputBytes = positiveInteger(\n options.maxOutputBytes,\n ATTESTED_GIT_MAX_OUTPUT_BYTES,\n 'maxOutputBytes',\n );\n\n let child: AttestedGitChildProcess;\n try {\n child = spawn('git', args, {\n cwd,\n detached: platform !== 'win32',\n env,\n shell: false,\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n });\n } catch (error) {\n throw new AttestedGitCommandError(\n `git ${args.join(' ')} failed to spawn: ${errorMessage(error)}`,\n );\n }\n\n const admissionSignal = options.signal;\n const stdout = new BoundedGitCapture(maxOutputBytes);\n const stderr = new BoundedGitCapture(maxOutputBytes);\n let closed = false;\n let closeRecord: GitCloseRecord | undefined;\n let resolveClose: (() => void) | undefined;\n const closePromise = new Promise<void>((resolvePromise) => {\n resolveClose = resolvePromise;\n });\n let primaryError: Error | undefined;\n let processError: Error | undefined;\n let termination: Promise<string[]> | undefined;\n let deadlineTimer: NodeJS.Timeout | undefined;\n\n const requestTermination = (error: Error): void => {\n if (closed) return;\n primaryError ??= error;\n termination ??= terminateGitProcessTree(\n child,\n { platform, killProcess, killTree },\n killGraceMs,\n () => closed,\n );\n };\n const stdoutListener = (data: Buffer | string): void => {\n if (stdout.append(data))\n requestTermination(new AttestedGitOutputLimitError(args, maxOutputBytes));\n };\n const stderrListener = (data: Buffer | string): void => {\n if (stderr.append(data))\n requestTermination(new AttestedGitOutputLimitError(args, maxOutputBytes));\n };\n const errorListener = (error: Error): void => {\n processError = error;\n const wrapped = new AttestedGitCommandError(\n `git ${args.join(' ')} process error: ${error.message}`,\n );\n if (child.pid === undefined) {\n primaryError ??= wrapped;\n closed = true;\n closeRecord = { code: null, signal: null };\n resolveClose?.();\n return;\n }\n requestTermination(wrapped);\n };\n const closeListener = (code: number | null, signal: NodeJS.Signals | null): void => {\n if (closed) return;\n closed = true;\n closeRecord = { code, signal };\n if (deadlineTimer !== undefined) {\n clearTimeout(deadlineTimer);\n deadlineTimer = undefined;\n }\n resolveClose?.();\n };\n const abortListener = (): void => {\n if (admissionSignal !== undefined) requestTermination(signalError(admissionSignal));\n };\n\n child.stdout?.on('data', stdoutListener);\n child.stderr?.on('data', stderrListener);\n child.on('error', errorListener);\n child.on('close', closeListener);\n admissionSignal?.addEventListener('abort', abortListener, { once: true });\n const remainingMs = Math.max(0, deadlineAt - Date.now());\n deadlineTimer = setTimeout(() => {\n requestTermination(new AttestedGitTimeoutError(args));\n }, remainingMs);\n if (admissionSignal?.aborted === true) abortListener();\n\n try {\n await closePromise;\n const cleanupErrors = termination === undefined ? [] : await termination;\n if (primaryError !== undefined) {\n if (cleanupErrors.length > 0) throw new AttestedGitCleanupError(primaryError, cleanupErrors);\n throw primaryError;\n }\n if (processError !== undefined) {\n throw new AttestedGitCommandError(\n `git ${args.join(' ')} process error: ${processError.message}`,\n );\n }\n const close = closeRecord;\n if (close?.code === 0) return stdout.text().trim();\n const exit = close?.code === null || close === undefined ? 'null' : String(close.code);\n const signal = close?.signal ? ` (${close.signal})` : '';\n throw new AttestedGitCommandError(\n `git ${args.join(' ')} failed with exit ${exit}${signal}: ${stderr.diagnostic()}`,\n );\n } finally {\n if (deadlineTimer !== undefined) clearTimeout(deadlineTimer);\n admissionSignal?.removeEventListener('abort', abortListener);\n child.stdout?.off('data', stdoutListener);\n child.stderr?.off('data', stderrListener);\n child.off('error', errorListener);\n child.off('close', closeListener);\n }\n}\n\nfunction withDefaultGitDeadline(options: GitCommandOptions): GitCommandOptions {\n return options.deadlineAt === undefined\n ? { ...options, deadlineAt: Date.now() + ATTESTED_GIT_TIMEOUT_MS }\n : options;\n}\n\nexport async function gitAuthoritySnapshot(\n cwd: string,\n options: GitCommandOptions = {},\n): Promise<GitAuthoritySnapshot> {\n const bounded = withDefaultGitDeadline(options);\n const commit = await runGitCommand(cwd, ['rev-parse', 'HEAD'], bounded);\n const tree = await runGitCommand(cwd, ['rev-parse', 'HEAD^{tree}'], bounded);\n const status = await runGitCommand(\n cwd,\n ['status', '--porcelain=v1', '--untracked-files=all'],\n bounded,\n );\n return { commit, tree, clean: status.length === 0 };\n}\n\nexport async function gitRepoRoot(cwd: string, options: GitCommandOptions = {}): Promise<string> {\n const bounded = withDefaultGitDeadline(options);\n const root = await runGitCommand(cwd, ['rev-parse', '--show-toplevel'], bounded);\n assertGitBoundary(bounded, ['rev-parse', '--show-toplevel']);\n const resolved = await realpath(root);\n assertGitBoundary(bounded, ['rev-parse', '--show-toplevel']);\n return resolved;\n}\n\nexport function observePiOAuth(\n ctx: BackgroundTaskContext,\n provider: string,\n modelId: string,\n): AuthObservation {\n const registry = ctx.modelRegistry;\n const selected = registry.find?.(provider, modelId);\n if (!selected) throw new Error(`Pi model not found in ModelRegistry: ${provider}/${modelId}`);\n if (!registry.isUsingOAuth) throw new Error('ModelRegistry OAuth observation is unavailable');\n if (!registry.isUsingOAuth(selected)) {\n throw new Error(`Attested Pi task requires OAuth credentials for ${provider}/${modelId}`);\n }\n const channel =\n provider === 'openai-codex'\n ? 'subscription-codex'\n : provider === 'anthropic'\n ? 'subscription-anthropic'\n : undefined;\n const authClass =\n provider === 'openai-codex'\n ? 'pi-codex-oauth'\n : provider === 'anthropic'\n ? 'pi-anthropic-oauth'\n : undefined;\n if (!channel || !authClass)\n throw new Error(`Unsupported attested Pi OAuth provider: ${provider}`);\n return {\n apiIdentity: selected.api,\n authClass,\n credentialKind: 'oauth',\n routeClass: 'subscription-agent',\n channel,\n directApiKey: false,\n selectedModel: selected,\n };\n}\n\nfunction readString(record: JsonObject, key: string): string | undefined {\n const value = record[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction readNumber(record: JsonObject, key: string): number | undefined {\n const value = record[key];\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction nonNegativeInteger(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? Math.floor(value) : 0;\n}\n\nfunction normalizeUsage(value: unknown): ParsedPiEvents['tokenUsage'] {\n if (!isJsonObject(value))\n return { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0 };\n const input = nonNegativeInteger(value['input']);\n const output = nonNegativeInteger(value['output']);\n const cacheRead = nonNegativeInteger(value['cacheRead']);\n const cacheWrite = nonNegativeInteger(value['cacheWrite']);\n const totalTokens =\n nonNegativeInteger(value['totalTokens']) || input + output + cacheRead + cacheWrite;\n const cost = isJsonObject(value['cost']) ? readNumber(value['cost'], 'total') : undefined;\n const usage: ParsedPiEvents['tokenUsage'] = { input, output, cacheRead, cacheWrite, totalTokens };\n if (cost !== undefined && cost >= 0) usage.costTotal = cost;\n return usage;\n}\n\nfunction appendUsage(\n target: ParsedPiEvents['tokenUsage'],\n delta: ParsedPiEvents['tokenUsage'],\n): void {\n target.input += delta.input;\n target.output += delta.output;\n target.cacheRead += delta.cacheRead;\n target.cacheWrite += delta.cacheWrite;\n target.totalTokens += delta.totalTokens;\n if (delta.costTotal !== undefined) target.costTotal = (target.costTotal ?? 0) + delta.costTotal;\n}\n\nfunction textFromAssistantMessage(message: JsonObject): string[] {\n const content = message['content'];\n if (!Array.isArray(content)) return [];\n return content.flatMap((part) => {\n if (!isJsonObject(part)) return [];\n if (part['type'] === 'text' && typeof part['text'] === 'string') return [part['text']];\n return [];\n });\n}\n\nfunction countToolCalls(message: JsonObject, tools: ParsedPiEvents['toolUsage']): void {\n const content = message['content'];\n if (!Array.isArray(content)) return;\n for (const part of content) {\n if (!isJsonObject(part) || part['type'] !== 'toolCall') continue;\n const name = typeof part['name'] === 'string' && part['name'] ? part['name'] : 'tool';\n tools.total += 1;\n tools.byName[name] = (tools.byName[name] ?? 0) + 1;\n }\n}\n\nexport function parsePiJsonEvents(raw: Buffer): ParsedPiEvents {\n const text = raw.toString('utf8');\n if (!text.endsWith('\\n')) throw new Error('Pi JSON event stream is not newline-terminated');\n let sessionId: string | undefined;\n let sessionCwd: string | undefined;\n let sessionCount = 0;\n let agentStartCount = 0;\n let agentEndCount = 0;\n let provider: string | undefined;\n let model: string | undefined;\n let finalStopReason: string | undefined;\n let assistantCount = 0;\n const usage: ParsedPiEvents['tokenUsage'] = {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n };\n const tools: ParsedPiEvents['toolUsage'] = { total: 0, failed: 0, byName: {} };\n const transcript: string[] = [];\n for (const line of text.split('\\n')) {\n if (!line) continue;\n const parsed = parseJsonText(line);\n if (!isJsonObject(parsed)) throw new Error('Pi JSON event line is not an object');\n const eventType = parsed['type'];\n if (eventType === 'session') {\n sessionCount += 1;\n sessionId = readString(parsed, 'id');\n sessionCwd = readString(parsed, 'cwd');\n continue;\n }\n if (eventType === 'agent_start') agentStartCount += 1;\n if (eventType === 'agent_end') agentEndCount += 1;\n if (eventType === 'tool_execution_start') {\n const name = readString(parsed, 'toolName') ?? readString(parsed, 'tool_name') ?? 'tool';\n tools.total += 1;\n tools.byName[name] = (tools.byName[name] ?? 0) + 1;\n transcript.push(`→ ${name}`);\n continue;\n }\n if (eventType === 'tool_execution_end') {\n if (parsed['isError'] === true) {\n tools.failed += 1;\n const name = readString(parsed, 'toolName') ?? readString(parsed, 'tool_name') ?? 'tool';\n transcript.push(`✗ ${name} failed`);\n }\n continue;\n }\n if (eventType !== 'message_end' || !isJsonObject(parsed['message'])) continue;\n const message = parsed['message'];\n if (message['role'] !== 'assistant') continue;\n assistantCount += 1;\n const messageProvider = readString(message, 'provider');\n const messageModel = readString(message, 'model');\n if (!messageProvider || !messageModel) {\n throw new Error('Assistant message lacks provider/model in Pi JSON events');\n }\n if (provider !== undefined && provider !== messageProvider)\n throw new Error('Pi assistant provider changed during task');\n if (model !== undefined && model !== messageModel)\n throw new Error('Pi assistant model changed during task');\n provider = messageProvider;\n model = messageModel;\n appendUsage(usage, normalizeUsage(message['usage']));\n countToolCalls(message, tools);\n transcript.push(...textFromAssistantMessage(message));\n if (message['error'] !== undefined && message['error'] !== null)\n throw new Error('Assistant message reported an error');\n const stopReason = readString(message, 'stopReason');\n if (stopReason) finalStopReason = stopReason;\n }\n if (sessionCount !== 1 || !sessionId || !sessionCwd)\n throw new Error('Pi JSON events must contain exactly one session header');\n if (agentStartCount !== 1) throw new Error('Pi JSON events must contain exactly one agent_start');\n if (agentEndCount !== 1) throw new Error('Pi JSON events must contain exactly one agent_end');\n if (assistantCount < 1 || !provider || !model)\n throw new Error('Pi JSON events contain no assistant message');\n if (finalStopReason !== 'stop')\n throw new Error(`Pi final stop reason is not stop: ${finalStopReason ?? 'missing'}`);\n return {\n piSessionId: sessionId,\n piCwd: sessionCwd,\n provider,\n model,\n providerScopedModelId: `${provider}/${model}`,\n finalStopReason,\n tokenUsage: usage,\n assistantCount,\n toolUsage: tools,\n humanTranscript: transcript.filter((line) => line.trim()).join('\\n') + '\\n',\n };\n}\n\nexport async function sha256File(path: string): Promise<{ byteLength: number; sha256: string }> {\n const bytes = await readFile(path);\n return { byteLength: bytes.length, sha256: sha256Buffer(bytes) };\n}\n\nexport function spawnAndCapturePi(\n spawnImpl: BackgroundTaskSpawn,\n argv: string[],\n options: SpawnOptions,\n platform: NodeJS.Platform = process.platform,\n launchOverride?: PiLaunchSpec | undefined,\n): { child: BackgroundTaskChildProcess; stdoutChunks: Buffer[]; stderrChunks: Buffer[] } {\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n const logicalExecutable = argv[0];\n if (logicalExecutable !== 'pi') throw new Error('Attested Pi argv must start with pi');\n const piArgs = argv.slice(1);\n const launch = launchOverride ?? resolvePiLaunch({ platform });\n assertWindowsCommandLineWithinLimit(launch, piArgs, platform, 'attested-pi-run');\n const child = spawnImpl(launch.executable, piLaunchArgv(launch, piArgs), options);\n child.stdout?.on('data', (chunk: Buffer | string) => {\n stdoutChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, 'utf8'));\n });\n child.stderr?.on('data', (chunk: Buffer | string) => {\n stderrChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, 'utf8'));\n });\n return { child, stdoutChunks, stderrChunks };\n}\n\nexport async function buildPiTaskAttestation(input: FinalAttestationInputs): Promise<JsonObject> {\n if (\n input.startAuthority.commit !== input.finishAuthority.commit ||\n input.startAuthority.tree !== input.finishAuthority.tree\n ) {\n throw new Error('Git authority changed during attested Pi task');\n }\n if (!input.startAuthority.clean || !input.finishAuthority.clean) {\n throw new Error('Git worktree must be clean at attested Pi task start and finish');\n }\n if (\n input.parsedEvents.provider !== input.auth.selectedModel.provider ||\n input.parsedEvents.model !== input.auth.selectedModel.id\n ) {\n throw new Error('Observed Pi provider/model do not match selected ModelRegistry model');\n }\n const metadata = await sha256File(input.paths.metadataAbsPath);\n const output = await sha256File(input.paths.outputAbsPath);\n const events = await sha256File(input.paths.eventsAbsPath);\n const stderr = await sha256File(input.paths.stderrAbsPath);\n const wrapper = await sha256File(input.paths.wrapperAbsPath);\n const report = await sha256File(input.reportAbsPath);\n const promptHash = sha256Buffer(input.prompt);\n const attestation: { [key: string]: unknown } = {\n schema_version: PI_TASK_ATTESTATION_SCHEMA_VERSION,\n locator: {\n session_dir: input.sessionDir,\n task_id: input.task.id,\n metadata_ref: input.paths.metadataPath,\n output_ref: input.paths.outputPath,\n events_ref: input.paths.eventsPath,\n stderr_ref: input.paths.stderrPath,\n wrapper_ref: input.paths.wrapperPath,\n },\n source_hashes: {\n metadata_sha256: metadata.sha256,\n output_sha256: output.sha256,\n events_sha256: events.sha256,\n stderr_sha256: stderr.sha256,\n wrapper_sha256: wrapper.sha256,\n },\n lifecycle: {\n status: input.task.status,\n is_agent: input.task.isAgent,\n start_time_ms: input.task.startTime,\n end_time_ms: input.task.endTime ?? input.task.startTime,\n exit_code: input.task.exitCode ?? null,\n signal: input.task.signal ?? null,\n bytes_written: input.task.bytesWritten,\n },\n invocation: {\n pi_session_id: input.parsedEvents.piSessionId,\n argv: input.argv,\n cwd_realpath: input.cwdRealpath,\n provider: input.parsedEvents.provider,\n model_id: input.parsedEvents.model,\n provider_scoped_model_id: input.parsedEvents.providerScopedModelId,\n api_identity: input.auth.apiIdentity,\n auth_class: input.auth.authClass,\n credential_kind: input.auth.credentialKind,\n route_class: input.auth.routeClass,\n channel: input.auth.channel,\n direct_api_key: input.auth.directApiKey,\n final_stop_reason: input.parsedEvents.finalStopReason,\n },\n authority: {\n repo_root_realpath: input.repoRootRealpath,\n start_commit_oid: input.startAuthority.commit,\n start_tree_oid: input.startAuthority.tree,\n finish_commit_oid: input.finishAuthority.commit,\n finish_tree_oid: input.finishAuthority.tree,\n start_worktree_clean: input.startAuthority.clean,\n finish_worktree_clean: input.finishAuthority.clean,\n },\n artifacts: {\n prompt: { byte_length: input.prompt.length, sha256: promptHash },\n task_output: { byte_length: output.byteLength, sha256: output.sha256 },\n stderr: { byte_length: stderr.byteLength, sha256: stderr.sha256 },\n transcript: { byte_length: events.byteLength, sha256: events.sha256 },\n report: { byte_length: report.byteLength, sha256: report.sha256 },\n },\n attestation_sha256: '',\n };\n const withoutSelf = { ...attestation, attestation_sha256: undefined };\n Reflect.deleteProperty(withoutSelf, 'attestation_sha256');\n attestation['attestation_sha256'] = sha256Buffer(Buffer.from(canonicalJson(withoutSelf), 'utf8'));\n return attestation;\n}\n\nexport function makeAttestedTaskPaths(\n runtimeAbs: string,\n runtimeDisplay: string,\n id: string,\n): AttestedTaskPaths {\n return {\n outputAbsPath: join(runtimeAbs, `${id}.output`),\n metadataAbsPath: join(runtimeAbs, `${id}.json`),\n eventsAbsPath: join(runtimeAbs, `${id}.pi-events.jsonl`),\n stderrAbsPath: join(runtimeAbs, `${id}.stderr`),\n wrapperAbsPath: join(runtimeAbs, `${id}.pi-telemetry-wrapper.cjs`),\n attestationAbsPath: join(runtimeAbs, `${id}.attestation.json`),\n outputPath: join(runtimeDisplay, `${id}.output`),\n metadataPath: join(runtimeDisplay, `${id}.json`),\n eventsPath: join(runtimeDisplay, `${id}.pi-events.jsonl`),\n stderrPath: join(runtimeDisplay, `${id}.stderr`),\n wrapperPath: join(runtimeDisplay, `${id}.pi-telemetry-wrapper.cjs`),\n attestationPath: join(runtimeDisplay, `${id}.attestation.json`),\n };\n}\n\nexport function pathInside(parent: string, child: string): boolean {\n const rel = relative(parent, child);\n return (\n rel === '' || (!rel.startsWith('..') && !isAbsolute(rel) && !rel.split(sep).includes('..'))\n );\n}\n\nexport async function assertRegularReadable(path: string): Promise<void> {\n const stats = await stat(path);\n if (!stats.isFile()) throw new Error(`Expected regular file: ${path}`);\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
/** Stable JSON bytes used by every persisted hash-bound package artifact. */
|
|
3
|
+
export function canonicalJson(value) {
|
|
4
|
+
return JSON.stringify(sortJson(value));
|
|
5
|
+
}
|
|
6
|
+
/** SHA-256 label used by persisted package artifacts and attestations. */
|
|
7
|
+
export function sha256Buffer(buffer) {
|
|
8
|
+
return `sha256:${createHash('sha256').update(buffer).digest('hex')}`;
|
|
9
|
+
}
|
|
10
|
+
function sortJson(value) {
|
|
11
|
+
if (Array.isArray(value))
|
|
12
|
+
return value.map(sortJson);
|
|
13
|
+
if (typeof value !== 'object' || value === null)
|
|
14
|
+
return value;
|
|
15
|
+
return Object.fromEntries(Object.keys(value)
|
|
16
|
+
.sort()
|
|
17
|
+
.map((key) => [key, sortJson(Reflect.get(value, key))]));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=canonical-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-json.js","sourceRoot":"","sources":["../../../src/core/canonical-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,6EAA6E;AAC7E,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;SACf,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAC1D,CAAC;AACJ,CAAC","sourcesContent":["import { createHash } from 'node:crypto';\n\n/** Stable JSON bytes used by every persisted hash-bound package artifact. */\nexport function canonicalJson(value: unknown): string {\n return JSON.stringify(sortJson(value));\n}\n\n/** SHA-256 label used by persisted package artifacts and attestations. */\nexport function sha256Buffer(buffer: Buffer): string {\n return `sha256:${createHash('sha256').update(buffer).digest('hex')}`;\n}\n\nfunction sortJson(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortJson);\n if (typeof value !== 'object' || value === null) return value;\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, sortJson(Reflect.get(value, key))]),\n );\n}\n"]}
|