Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion packages/cli/src/agent-account.test.ts
Original file line number Diff line number Diff line change
@@ -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'
Expand All @@ -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
Expand Down
6 changes: 6 additions & 0 deletions packages/cli/src/agent-account.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 4 additions & 3 deletions packages/cli/src/bin/pascal.ts
Original file line number Diff line number Diff line change
@@ -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'
Expand Down Expand Up @@ -612,13 +612,14 @@ async function runAgent(args: string[], apiKey: string | undefined): Promise<voi
},
})
const claim = await startAgentClaim(apiKey ?? '')
if (!values['no-open'] && !values.json) openBrowser(claim.claimUrl)
const claimHandoffUrl = agentClaimHandoffUrl(claim)
if (!values['no-open'] && !values.json) openBrowser(claimHandoffUrl)
output(
values.json,
claim,
[
`Claim code: ${claim.claimCode}`,
`Claim page: ${claim.claimUrl}`,
`Claim page: ${claimHandoffUrl}`,
`Expires: ${claim.expiresAt}`,
'',
'Claiming links accountability. It does not transfer project ownership or grant access to private projects.',
Expand Down
3 changes: 3 additions & 0 deletions packages/cli/src/cli.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@ describe('command parsing', () => {

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')
Expand Down
Loading