diff --git a/packages/cli/src/agent-account.test.ts b/packages/cli/src/agent-account.test.ts index f2682a0b9..a7c94008e 100644 --- a/packages/cli/src/agent-account.test.ts +++ b/packages/cli/src/agent-account.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from 'bun:test' -import { startAgentClaim } from './agent-account.js' +import { agentClaimHandoffUrl, startAgentClaim } from './agent-account.js' import { CliError } from './errors.js' const API_KEY = 'sk_live_private-agent-key' @@ -10,6 +10,13 @@ const VALID_CLAIM = { } describe('agent account claims', () => { + test('builds a prefilled handoff URL without changing the API result', () => { + expect(agentClaimHandoffUrl(VALID_CLAIM)).toBe( + 'https://editor.pascal.app/settings/agents/claim?code=BCDF-GHJK-LMNP', + ) + expect(VALID_CLAIM.claimUrl).toBe('https://editor.pascal.app/settings/agents/claim') + }) + test('starts a claim with the agent credential and returns the bounded public result', async () => { let authorization: string | null = null let redirect: RequestRedirect | undefined diff --git a/packages/cli/src/agent-account.ts b/packages/cli/src/agent-account.ts index d1757f2f2..ca01c26e4 100644 --- a/packages/cli/src/agent-account.ts +++ b/packages/cli/src/agent-account.ts @@ -13,6 +13,12 @@ export interface AgentClaim { expiresAt: string } +export function agentClaimHandoffUrl(claim: AgentClaim): string { + const url = new URL(claim.claimUrl) + url.searchParams.set('code', claim.claimCode) + return url.toString() +} + interface StartAgentClaimOptions { fetch?: typeof fetch timeoutMs?: number diff --git a/packages/cli/src/bin/pascal.ts b/packages/cli/src/bin/pascal.ts index 8c7441f56..8a84ada5b 100755 --- a/packages/cli/src/bin/pascal.ts +++ b/packages/cli/src/bin/pascal.ts @@ -1,7 +1,7 @@ #!/usr/bin/env node import { spawn } from 'node:child_process' import { parseArgs } from 'node:util' -import { startAgentClaim } from '../agent-account.js' +import { agentClaimHandoffUrl, startAgentClaim } from '../agent-account.js' import { openBrowser } from '../browser.js' import { installGlobalPascalCommand, isNpxInvocation } from '../command-install.js' import { collectInfo, runDoctor } from '../diagnostics.js' @@ -612,13 +612,14 @@ async function runAgent(args: string[], apiKey: string | undefined): Promise { expect(result.exitCode).toBe(0) expect(result.stdout).toContain('Claim code: BCDF-GHJK-LMNP') + expect(result.stdout).toContain( + 'Claim page: https://editor.pascal.app/settings/agents/claim?code=BCDF-GHJK-LMNP', + ) expect(result.stdout).toContain('Claiming links accountability.') expect(result.stdout).not.toContain('malicious') expect(result.stdout).not.toContain('\u001b')