69 lines
3.7 KiB
TypeScript
69 lines
3.7 KiB
TypeScript
import { readFile } from 'node:fs/promises';
|
|
import { resolve } from 'node:path';
|
|
|
|
import { describe, expect, it } from 'vitest';
|
|
|
|
describe('Pi packaged release proof wiring', () => {
|
|
it('keeps extension and proxy Provider scenarios assigned to their own proof entrypoints', async () => {
|
|
const source = await readFile(
|
|
resolve('electron/coding-runtime/pi/release-proof.ts'),
|
|
'utf8',
|
|
);
|
|
const extensionStart = source.indexOf('export async function runFinalAsarExtensionProof');
|
|
const proxyStart = source.indexOf('export async function startFinalAsarProxyCompositionProof');
|
|
const resilienceStart = source.indexOf('export async function startFinalAsarResilienceProof');
|
|
|
|
expect(extensionStart).toBeGreaterThan(-1);
|
|
expect(proxyStart).toBeGreaterThan(extensionStart);
|
|
expect(resilienceStart).toBeGreaterThan(proxyStart);
|
|
expect(source.slice(extensionStart, proxyStart))
|
|
.toContain("startLocalProofProvider('subagent')");
|
|
expect(source.slice(extensionStart, proxyStart))
|
|
.not.toContain("startLocalProofProvider('submit-rejection')");
|
|
expect(source.slice(proxyStart, resilienceStart))
|
|
.toContain("startLocalProofProvider('submit-rejection')");
|
|
expect(source.slice(proxyStart, resilienceStart))
|
|
.not.toContain("startLocalProofProvider('subagent')");
|
|
});
|
|
|
|
it('wires the packaged resilience proof through Main background and intentional-dispose seams', async () => {
|
|
const [mainSource, proofSource, scriptSource] = await Promise.all([
|
|
readFile(resolve('electron/main/index.ts'), 'utf8'),
|
|
readFile(resolve('electron/coding-runtime/pi/release-proof.ts'), 'utf8'),
|
|
readFile(resolve('scripts/run-pi-subagent-packaged-smoke.mjs'), 'utf8'),
|
|
]);
|
|
|
|
expect(mainSource).toContain("codingProducts?.sleep('background_sleep')");
|
|
expect(mainSource).toContain('acquireBackgroundLease: (lease) => backgroundLifecycle!');
|
|
expect(proofSource).toContain("runtime.dispose(run.targetConversationId, 'test_injection')");
|
|
expect(scriptSource).toContain("evaluateProof(electronApplication, 'resilience.idle-status')");
|
|
expect(scriptSource).toContain('setMainWindowVisible(electronApplication, false)');
|
|
expect(scriptSource).toContain("evaluateProof(electronApplication, 'resilience.dispose-target')");
|
|
expect(proofSource).toContain('const PROOF_MUTATION_CONFIRMATION_DELAY_MS = 12_000;');
|
|
expect(proofSource).toContain('keepRecentTokens: 1');
|
|
expect(proofSource).toContain("mode === 'resilience' && delayedCompactionArmed");
|
|
expect(mainSource).toContain("userDataDir: app.getPath('userData')");
|
|
expect(proofSource).toContain('delayNextTopLevelConfirmationForProof');
|
|
expect(mainSource).toContain("'resilience.arm-compact-delay'");
|
|
expect(mainSource).toContain("'resilience.arm-prompt-delay'");
|
|
expect(scriptSource).toContain("evaluateProof(electronApplication, 'resilience.arm-compact-delay')");
|
|
expect(scriptSource).toContain("evaluateProof(electronApplication, 'resilience.arm-prompt-delay')");
|
|
expect(scriptSource).toContain("status?.target?.errorCode === 'CODING_REQUEST_UNCERTAIN'");
|
|
expect(scriptSource).toContain('status?.target?.completedCompactions >= 1');
|
|
const releaseParents = scriptSource.indexOf(
|
|
"await evaluateProof(electronApplication, 'resilience.release-parents')",
|
|
);
|
|
const restoreVisible = scriptSource.indexOf(
|
|
'await setMainWindowVisible(electronApplication, true)',
|
|
releaseParents,
|
|
);
|
|
const awaitSettlement = scriptSource.indexOf(
|
|
'await waitForResilienceProof(',
|
|
releaseParents,
|
|
);
|
|
expect(releaseParents).toBeGreaterThan(-1);
|
|
expect(restoreVisible).toBeGreaterThan(releaseParents);
|
|
expect(restoreVisible).toBeLessThan(awaitSettlement);
|
|
});
|
|
});
|