diff --git a/.prettierignore b/.prettierignore index 4cc05dbb..d8a14825 100644 --- a/.prettierignore +++ b/.prettierignore @@ -4,3 +4,6 @@ node_modules/ package-lock.json *.tgz .sdk-source/ + +# Preserve the upstream golden vectors byte-for-byte. +test/fixtures/machine-credentials-v1.json diff --git a/README.md b/README.md index a6f427dd..63ea0194 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ polymorfa version ## Requirements - Node.js 22 or newer -- A Polymorfa organization API key or exact-project token for developer requests +- A Polymorfa team key or exact-project token for developer requests - A server API key or short-lived client token for Messaging requests ## Development installation @@ -65,7 +65,7 @@ access but do not use your Polymorfa credentials. ## Authentication profiles Until the backend exposes a revocable CLI device-authorization flow, login -accepts an organization API key or exact-project token through standard input: +accepts an team key or exact-project token through standard input: ```shell printf '%s' "$POLYMORFA_API_KEY" | \ @@ -85,6 +85,12 @@ Secret Service. A keyring failure stops the command; the CLI never silently falls back to plaintext. `auth status` reports local secure-store availability in this development slice and does not yet claim remote identity validation. +Treat all Polymorfa credentials as opaque strings. Pass them unchanged; never +parse them or assume a fixed length. Credential columns must store at least 512 +characters, preferably unrestricted text. Client-token length varies with its +bindings, Customer block and signing key ID. Local prefix, encoding and checksum +checks do not authenticate a credential; the service checks live authority. + Environment credentials take precedence over the active profile for automation. An explicit `--profile ` takes precedence over environment credentials. @@ -182,7 +188,7 @@ your shell to its startup file if you want completion in later sessions. ## Inspect sessions -Use an organization API key with `sessions:read` to inspect stored session +Use an team key with `sessions:read` to inspect stored session metadata: ```shell @@ -197,7 +203,7 @@ Use a session ID from the list for `view` or `status`; these commands do not accept `--project`. `status` reads the stored status and optional reason from the session record. It does not probe the device or wait for a connection. Key metadata listing and revocation are available through `key list` and -`key revoke`; the CLI does not mint or rotate organization keys. +`key revoke`; the CLI does not mint or rotate team keys. ## QuickLinks @@ -215,7 +221,7 @@ The request accepts `customerId`, `externalId`, and `configuration`. See [Guided session creation and configuration](#guided-session-creation-and-configuration) for the configuration fields. -Inspect or cancel a link with an organization API key or an exact-project +Inspect or cancel a link with an team key or an exact-project token that has `quicklink:manage`: ```shell @@ -418,7 +424,7 @@ header. ### Flow drafts and provider lifecycle -Flow commands require a project scope and an organization API key or project +Flow commands require a project scope and an team key or project token. Reads use `sessions:read`; mutations use `sessions:manage`. ```shell @@ -501,7 +507,7 @@ linked to another project; the API checks that the credential can access it. ### Official API observations and templates -The `cloud` commands require an organization API key or a project token with the +The `cloud` commands require an team key or a project token with the listed scope. Client tokens cannot use these commands. Server-side feature access still applies: an installed command does not enroll a Number or enable a beta feature. @@ -1151,7 +1157,7 @@ sox greeting.wav -t raw -r 16000 -e signed -b 16 -c 1 - | \ Polymorfa checks every call against the team's call policy before the destination rings. `calls policy` and `calls opt-outs` read and change that -policy and require an organization API key (`POLYMORFA_API_KEY` or a profile). +policy and require an team key (`POLYMORFA_API_KEY` or a profile). A project token used as the API key reaches the API, which refuses it with `403` (exit code 3). A client token is not a Platform credential, so the CLI refuses the command before sending a request (exit code 2). @@ -1230,9 +1236,9 @@ polymorfa calls check +14155550123 --session support ### Call statistics and export `calls stats` summarizes calls and `calls export` writes call detail records. -Both accept an organization API key or an exact-project token with the +Both accept an team key or an exact-project token with the `sessions:read` scope. Pass `--project` to read one project. Without it, an -organization API key reads every project in the organization. A project token +team key reads every project in the organization. A project token reads only its own project and requires `--project`. ```shell @@ -1321,7 +1327,7 @@ or times out, the command keeps the password on screen and exits successfully. Voice Automation is a beta (`calls.voice-automation`) for enrolled teams only. For other teams, every change except delete fails with `voice_not_enabled`. Reads, previews and deletes keep working after a team leaves the beta. The -commands require an organization server API key with `voice:read` (lists, +commands require an team key with `voice:read` (lists, views, previews) or `voice:manage` (changes). ### Audio library @@ -1596,7 +1602,7 @@ request metadata. ## Platform access and security -Organization server API keys can inspect the credential, membership, audit, +Team keys can inspect the credential, membership, audit, ban, incident, saved QuickLink settings, and project-token metadata made available by the Platform API: @@ -2159,7 +2165,7 @@ status, and safe counters, never primary credentials, listener credentials, forwarding secrets, or unrestricted payloads. `polymorfa_session_list` is a read-only discovery tool for one explicit project -UUID. It uses the selected CLI organization API key with `sessions:read` and +UUID. It uses the selected CLI team key with `sessions:read` and returns session ID, name, stored status, and test-mode flag. It omits phone numbers, credentials, and message data. The tool does not probe the live device. Project tokens and Messaging client tokens cannot use this tool. A failed read @@ -2371,7 +2377,7 @@ the CLI never creates or confirms a replacement purchase automatically. ### Number tier changes -Tier changes use an organization API key. Quote first, review the credit charge +Tier changes use an team key. Quote first, review the credit charge and effective time, then confirm that exact quote: ```shell @@ -2460,7 +2466,7 @@ polymorfa hybrid-link resume --session NUMBER --expected-revision REVISION For project and session routing scopes, `--project`, the nearest linked project, and the selected profile determine the project in that order. A project-token profile fails when its project differs from the linked directory. Team routing -scope uses an organization API key and ignores directory project links. `quicklink +scope uses an team key and ignores directory project links. `quicklink availability` shows existing connection status and any QuickLink that can be resumed. @@ -2481,7 +2487,7 @@ transports within the restrictions inherited from the team and project. ### Functions -Functions are project-owned. Select `--project` or use the linked project/profile context. The commands accept an organization API key or a project token; browser client tokens are refused. Access also depends on the team's enabled Functions release and the configured execution region. +Functions are project-owned. Select `--project` or use the linked project/profile context. The commands accept an team key or a project token; browser client tokens are refused. Access also depends on the team's enabled Functions release and the configured execution region. ```bash polymorfa function list --project PROJECT_UUID @@ -2566,7 +2572,7 @@ does not retrieve media or webhook deliveries. ### Spending limits and funding priority -With an organization key carrying `billing:read`, inspect current controls: +With an team key carrying `billing:read`, inspect current controls: ```bash polymorfa billing limits list --project --json diff --git a/docs/command-research/call-consent.md b/docs/command-research/call-consent.md index 1838411e..13ebb9ea 100644 --- a/docs/command-research/call-consent.md +++ b/docs/command-research/call-consent.md @@ -69,7 +69,7 @@ package metadata. ## Credential rules - `calls policy` and `calls opt-outs` resolve Platform credentials, so they - require an organization API key. The API answers a project token or client + require an team key. The API answers a project token or client token with `403 permission_denied`, which exits with code 3. - `calls permission get` and `calls check` require a server API key. The CLI refuses a Messaging client token before sending a request, because the API diff --git a/docs/command-research/calls.md b/docs/command-research/calls.md index b85b1798..f158e048 100644 --- a/docs/command-research/calls.md +++ b/docs/command-research/calls.md @@ -111,10 +111,10 @@ internal SDK module. Messaging client; the CLI builds that client from the Platform environment. `calls settings set --expected-revision` sends `expectedRevision`; a stale revision returns 409 `state_conflict`, which exits with code 4. -- `calls stats` and `calls export` accept an organization API key or an +- `calls stats` and `calls export` accept an team key or an exact-project token (`sessions:read`), resolved like the developer commands. `--project` (or a project token, which requires it) reads one - project; an organization key without `--project` reads the whole + project; an team key without `--project` reads the whole organization. `--owner` still overrides the inferred owner. - `calls retention` resolves a team API key or a project token (`resolveTeamSettingEnvironment`), from the environment or a profile, with diff --git a/docs/command-research/customers.md b/docs/command-research/customers.md index 36148233..26faea55 100644 --- a/docs/command-research/customers.md +++ b/docs/command-research/customers.md @@ -1,7 +1,7 @@ # Customer command contract The Customer command family maps the complete public Customers surface in the -Platform contract. Every request uses an organization server API key and an +Platform contract. Every request uses an team key and an explicit project ID. | Command | Platform operation | diff --git a/docs/command-research/platform-management.md b/docs/command-research/platform-management.md index 7ee1b727..8fbbfed4 100644 --- a/docs/command-research/platform-management.md +++ b/docs/command-research/platform-management.md @@ -57,7 +57,7 @@ session ``` The management commands use the public typed organization resources on the -unified SDK `Client`. They require an organization server API key. Reads require +unified SDK `Client`. They require an team key. Reads require `sessions:read`; key revocation and incident acknowledgement require `sessions:manage`; batch session stop/delete also require `sessions:manage`. Project tokens and Messaging browser client tokens are rejected before @@ -85,7 +85,7 @@ without cursor semantics. `session-ban list --active` keeps one discovery command while selecting the SDK's distinct active-only operation. Incident acknowledgement is repeatable, has no confirmation gate, and sends no body. `acknowledgedBy` may be empty when -an organization key performed the acknowledgement. +an team key performed the acknowledgement. The original singular Platform operation view was removed. Operation inspection is console-only at API contract 1600403, and the pinned SDK has no diff --git a/docs/command-research/quicklinks.md b/docs/command-research/quicklinks.md index 6afffae7..ad119f98 100644 --- a/docs/command-research/quicklinks.md +++ b/docs/command-research/quicklinks.md @@ -21,16 +21,16 @@ on the hosted page and preserves entitlement boundaries around direct pairing. | `quicklink view` | `MessagingClient.quickLinks.retrieve` | `GET /messaging/quicklinks/{id}` | Read one link's status and onboarding progress | | `quicklink cancel` | `MessagingClient.quickLinks.cancel` | `DELETE /messaging/quicklinks/{id}` | Invalidate an unconnected link; initial Number/session cleanup can continue after acceptance | -All three routes require `quicklink:manage`. The API accepts organization keys +All three routes require `quicklink:manage`. The API accepts team keys and exact-project tokens and scopes project tokens to their own project. `quicklink create` takes one JSON object from `--input` with `projectId`, `customerId`, `externalId`, and `configuration`, and rejects other top-level fields before transport. Presentation and callbacks belong in saved settings -(`widget view|update`). It uses an organization API key; project-token support +(`widget view|update`). It uses an team key; project-token support for creation is not exposed by this command. -`quicklink view` and `quicklink cancel` accept an organization API key or an +`quicklink view` and `quicklink cancel` accept an team key or an exact-project token and require explicit project context. Browser client tokens fail before transport. Cancellation requires TTY confirmation or `--yes` before a client is constructed. The route does not read an `Idempotency-Key`, so the diff --git a/docs/command-research/voice.md b/docs/command-research/voice.md index 1cb61ad9..3b398555 100644 --- a/docs/command-research/voice.md +++ b/docs/command-research/voice.md @@ -79,7 +79,7 @@ URL itself with no credential, no redirects, a bounded response, and a timeout. ## Credential rules -- The commands resolve Platform credentials: an organization server API key +- The commands resolve Platform credentials: an team key (`POLYMORFA_API_KEY` or an API-key profile). Client tokens fail before any request. The API also accepts project tokens; the CLI does not use them for these commands, matching `sip-trunk`. diff --git a/docs/development/bansafe-sdk-integration.md b/docs/development/bansafe-sdk-integration.md index 2dc9b2fc..c74543d2 100644 --- a/docs/development/bansafe-sdk-integration.md +++ b/docs/development/bansafe-sdk-integration.md @@ -64,7 +64,7 @@ dependency. The CLI mapping covers all 25 Platform BanSafe operations in the SDK coverage ledger. The SDK also covers the 10 equivalent Messaging settings routes through `MessagingClient.banSafe`; the CLI uses the Platform routes for those settings -because BanSafe commands authenticate with an organization server API key. +because BanSafe commands authenticate with an team key. | SDK operations | CLI commands | | ------------------------------------------------------------ | ---------------------------------------------------------- | diff --git a/docs/opaque-credentials-cutover.md b/docs/opaque-credentials-cutover.md new file mode 100644 index 00000000..eae33ced --- /dev/null +++ b/docs/opaque-credentials-cutover.md @@ -0,0 +1,25 @@ +# Credential cutover acceptance + +API source: polymorfa/polymorfa #647 at f4a82c014e8ea8deb476fce4d81bf27591981c63. +SDK source: polymorfa/sdks #355. CLI credential validation continues to use the +public SDK; it adds no parser or exact-length validator. Tests use the public +20-byte CRC32 opaque-key fixture and check that invalid checksums fail before +secure-storage writes. + +The committed SDK dependency predates this contract. Before merging/releasing, +pin the exact accepted SDK registry version and update package-lock.json. A local +candidate tarball can prove behavior but cannot substitute for registry integrity, +matching environment acceptance or the release receipt required by RELEASING.md. +No guessed package version or permissive compatibility fallback is allowed. + +Test keys are ordinary project tokens. The CLI never reveals or creates a Test +key and never attempts to infer test-only authority from credential contents. + +The copied `test/fixtures/machine-credentials-v1.json` is byte-for-byte identical +to that API source, SHA-256 +`7694d8eb61dca6aed69f41392d2e5fae585084e330b276ee6a71844ef9e2365d`. +The CLI accepts the public opaque key vectors through the published SDK, without +adding a second parser. Current registry dependency +`0.1.0-dev.20261004024706` rejects these vectors as legacy-format credentials. +The SDKs thread owns #355. Its accepted registry artifact is the external gate; +this branch keeps the published dependency and does not publish packages. diff --git a/docs/superpowers/specs/2026-08-19-polymorfa-cli-design.md b/docs/superpowers/specs/2026-08-19-polymorfa-cli-design.md index b1b24a4e..1c88fdb9 100644 --- a/docs/superpowers/specs/2026-08-19-polymorfa-cli-design.md +++ b/docs/superpowers/specs/2026-08-19-polymorfa-cli-design.md @@ -136,7 +136,7 @@ collections, orders, compliance, observation policies, webhooks, client tokens, project templates, project-scoped campaigns, and all 33 signed event payload schemas plus Platform organizations, projects, sessions, billing, campaigns, audiences, opt-outs, -media, organization API keys, members, audit logs, session bans, security +media, team keys, members, audit logs, session bans, security incidents, project-token metadata, saved QuickLink (widget) settings, and batch session stop/delete. Curated commands do not use the SDK's raw escape hatch to paper over a missing public contract. The explicit `api` command is @@ -585,7 +585,7 @@ group ``` Number pairing uses a persistent hosted QuickLink. `quicklink create` accepts a -JSON request with an organization API key and returns the link URL, +JSON request with an team key and returns the link URL, `quicklink view` reads its status, and `quicklink cancel` invalidates a link that has not connected. View and cancel also accept an exact-project token. Saved QuickLink settings are managed with `widget view` and `widget update`; the CLI @@ -814,7 +814,7 @@ bounded concurrency, and machine-readable partial-failure artifacts. The `flow` top-level command name remains reserved but is not shipped against this SDK baseline. The separate Platform template and Flow routes require -dashboard JWTs and reject organization keys. The CLI must not collect, persist, +dashboard JWTs and reject team keys. The CLI must not collect, persist, or replay dashboard session JWTs to bypass that boundary, and neither MCP tools nor skills may expose those routes. Platform template management and Flow commands can enter the implementation plan only after the Platform API provides @@ -1079,8 +1079,8 @@ slices: commands, with accepted-work receipts and direct requeue; - explicit owner-scoped event list/view/replay, webhook CRUD/test/secret rotation, delivery and attempt inspection, and retry commands; -- persistent QuickLink create with organization keys, view/cancel with - organization keys or exact-project tokens, and no direct session QR fallback; +- persistent QuickLink create with team keys, view/cancel with + team keys or exact-project tokens, and no direct session QR fallback; - the bounded SSE listener with JSONL and human sinks, fail-closed gap handling, cumulative acknowledgement, checkpointed reconnects, exact-byte local signing, and redirect-safe forwarding; diff --git a/package-lock.json b/package-lock.json index 2da282d3..d4c1a04c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0-dev.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/server": "2.0.0", + "@modelcontextprotocol/server": "2.3.1", "@napi-rs/keyring": "1.3.0", "@oclif/core": "^4.13.5", "@polymorfa/sdk": "0.1.0-dev.20261004024706", @@ -708,9 +708,10 @@ "dev": true }, "node_modules/@modelcontextprotocol/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/core/-/core-2.0.0.tgz", - "integrity": "sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/core/-/core-2.3.1.tgz", + "integrity": "sha512-laVmIhPGpWi7rG9q+0UigblRN0Hws/Yjlb6qLFtVqryXVLkc4h+yN8z731POD2LnAGQlFe7/tXhUm7Bi0YB91g==", + "license": "Apache-2.0", "dependencies": { "zod": "^4.2.0" }, @@ -719,11 +720,12 @@ } }, "node_modules/@modelcontextprotocol/server": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/server/-/server-2.0.0.tgz", - "integrity": "sha512-YhHWdHfpFMQfd0prsEnxKeS3Qz3ytIGmsS0sth4KDjnacIT7hxk6hXHkJ9KysxlkvTM+WZAtQbbcUhdoP4Hvtw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/server/-/server-2.3.1.tgz", + "integrity": "sha512-e59MfWuSssj6DoQ96JCTqdW1AXT5/XtnTl0WWd6MU1Ka434fFUGGosCLJbGNySDhHGvxQWoRWK137FXYFkYNWw==", + "license": "Apache-2.0", "dependencies": { - "@modelcontextprotocol/core": "2.0.0", + "@modelcontextprotocol/core": "2.3.1", "zod": "^4.2.0" }, "engines": { diff --git a/package.json b/package.json index 97f2c5b9..1f8f8949 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "verify": "npm run format:check && npm run lint && npm run typecheck && npm test && npm run build && npm pack --dry-run --ignore-scripts && npm run audit:prod" }, "dependencies": { - "@modelcontextprotocol/server": "2.0.0", + "@modelcontextprotocol/server": "2.3.1", "@napi-rs/keyring": "1.3.0", "@oclif/core": "^4.13.5", "@polymorfa/sdk": "0.1.0-dev.20261004024706", @@ -175,7 +175,7 @@ "description": "Resolve phone numbers and usernames to Polymorfa user IDs." }, "key": { - "description": "Inspect and revoke organization API keys." + "description": "Inspect and revoke team keys." }, "label": { "description": "Manage Messaging labels and chat assignments." diff --git a/skills/polymorfa/SKILL.md b/skills/polymorfa/SKILL.md index bdd25c97..c923f9b3 100644 --- a/skills/polymorfa/SKILL.md +++ b/skills/polymorfa/SKILL.md @@ -14,11 +14,11 @@ Use `polymorfa --help` and `polymorfa --help` as the installed command a 3. For resources that may be project- or organization-owned, supply `--owner project|organization` unless the stored profile fixes the owner. 4. Supply the exact project context for project-owned resources. Never infer ownership from an ID, credential shape, failed request, or route. -Organization API keys and exact-project tokens are durable principals. Browser client tokens and listener credentials are not general CLI credentials. Do not print, log, persist in project files, or pass credentials in command arguments. +Team keys and exact-project tokens are durable principals. Browser client tokens and listener credentials are not general CLI credentials. Do not print, log, persist in project files, or pass credentials in command arguments. Voice Automation commands (`polymorfa voice audio`, `polymorfa voice credential`) are a beta for enrolled teams; `voice_not_enabled` (exit 6) means the team is not enrolled and `gate_limit_reached` (exit 7) means a voice limit is reached, so do not retry either. Pass a provider key to `polymorfa voice credential add` only through standard input or the environment variable named by `--key-env`, never as an argument. -Use `polymorfa quicklink create --project PROJECT --input request.json` with an organization API key for standard number pairing. Treat the returned hosted URL as credential material; do not request direct session QR payloads or pairing codes. +Use `polymorfa quicklink create --project PROJECT --input request.json` with an team key for standard number pairing. Treat the returned hosted URL as credential material; do not request direct session QR payloads or pairing codes. ## Choose an interface diff --git a/src/base-command.ts b/src/base-command.ts index 16567413..597ea74d 100644 --- a/src/base-command.ts +++ b/src/base-command.ts @@ -102,9 +102,9 @@ export abstract class BaseCommand extends Command { } /** - * Resolve an organization API key or exact-project token without building a + * Resolve an team key or exact-project token without building a * typed client, for commands that span projects. With `inferOwner`, --project - * or a project token reads one project and an organization key otherwise + * or a project token reads one project and an team key otherwise * reads the whole organization. */ protected async developerEnvironment( diff --git a/src/commands/auth/login.ts b/src/commands/auth/login.ts index 0292b780..8f724188 100644 --- a/src/commands/auth/login.ts +++ b/src/commands/auth/login.ts @@ -7,7 +7,7 @@ import {readSecretFromStdin} from '../../input/stdin.js' export default class AuthLogin extends BaseCommand { static override description = - 'Store an organization key or project token in the operating-system keyring.' + 'Store an opaque team key or project token in the operating-system keyring. Never parse credentials or assume a fixed length.' static override flags = { 'with-api-key': Flags.boolean({ diff --git a/src/commands/billing/limits/list.ts b/src/commands/billing/limits/list.ts index 0e2a2f2b..91e89bda 100644 --- a/src/commands/billing/limits/list.ts +++ b/src/commands/billing/limits/list.ts @@ -3,7 +3,7 @@ import {getLimits, renderLimits} from '../../../services/billing-controls.js' export default class LimitsList extends BaseCommand { static override summary = 'Read monthly project and number spending limits.' static override description = - 'Requires an organization key with billing:read. Use --project to include its number limits. Months reset on the first day at 00:00 UTC.' + 'Requires an team key with billing:read. Use --project to include its number limits. Months reset on the first day at 00:00 UTC.' async run(): Promise { const {flags} = await this.parse(LimitsList) const result = await getLimits( diff --git a/src/commands/billing/limits/set.ts b/src/commands/billing/limits/set.ts index 9e321787..efe94b00 100644 --- a/src/commands/billing/limits/set.ts +++ b/src/commands/billing/limits/set.ts @@ -4,7 +4,7 @@ import {setLimit, limitValue} from '../../../services/billing-controls.js' export default class LimitsSet extends BaseCommand { static override summary = 'Set or remove a monthly spending limit.' static override description = - 'Requires Pay-As-You-Go and an organization key with billing:manage. Zero blocks new charges; already-paid service continues. A stale observed revision fails without overwriting newer settings.' + 'Requires Pay-As-You-Go and an team key with billing:manage. Zero blocks new charges; already-paid service continues. A stale observed revision fails without overwriting newer settings.' static override args = { id: Args.string({required: true, description: 'Project or number UUID.'}), } diff --git a/src/commands/billing/priority/list.ts b/src/commands/billing/priority/list.ts index de5a123e..1292d586 100644 --- a/src/commands/billing/priority/list.ts +++ b/src/commands/billing/priority/list.ts @@ -7,7 +7,7 @@ export default class PriorityList extends BaseCommand { static override summary = 'Read project, customer and number funding priorities.' static override description = - 'Requires an organization key with billing:read. Project priority takes precedence. Numbers inherit customer priority; a higher number priority overrides it. Use --project for its funding controls. Includes the revision used for changes.' + 'Requires an team key with billing:read. Project priority takes precedence. Numbers inherit customer priority; a higher number priority overrides it. Use --project for its funding controls. Includes the revision used for changes.' async run(): Promise { const {flags} = await this.parse(PriorityList) const result = await getPriorities( diff --git a/src/commands/billing/priority/reorder.ts b/src/commands/billing/priority/reorder.ts index 7d9aff3f..919abbb1 100644 --- a/src/commands/billing/priority/reorder.ts +++ b/src/commands/billing/priority/reorder.ts @@ -6,7 +6,7 @@ import {reorderPriorities} from '../../../services/billing-controls.js' export default class PriorityReorder extends BaseCommand { static override summary = 'Save a complete funding order atomically.' static override description = - 'Requires Pay-As-You-Go and an organization key with billing:manage. Pass every active project, customer or real number for its scope. Resource scope mixes all customers and numbers in --project, highest first. Incomplete or stale orders fail without partial changes.' + 'Requires Pay-As-You-Go and an team key with billing:manage. Pass every active project, customer or real number for its scope. Resource scope mixes all customers and numbers in --project, highest first. Incomplete or stale orders fail without partial changes.' static override flags = { scope: Flags.string({ options: ['project', 'customer', 'number', 'resource'], diff --git a/src/commands/billing/priority/set.ts b/src/commands/billing/priority/set.ts index 4058883e..af291d1e 100644 --- a/src/commands/billing/priority/set.ts +++ b/src/commands/billing/priority/set.ts @@ -4,7 +4,7 @@ import {setPriority} from '../../../services/billing-controls.js' export default class PrioritySet extends BaseCommand { static override summary = 'Set a project or number funding priority.' static override description = - 'Requires Pay-As-You-Go and an organization key with billing:manage. Changes future renewal protection and recovery; paid windows keep their expiry.' + 'Requires Pay-As-You-Go and an team key with billing:manage. Changes future renewal protection and recovery; paid windows keep their expiry.' static override args = { id: Args.string({required: true, description: 'Project or number UUID.'}), } diff --git a/src/commands/calls/export.ts b/src/commands/calls/export.ts index 10a74e73..bd09cba2 100644 --- a/src/commands/calls/export.ts +++ b/src/commands/calls/export.ts @@ -26,7 +26,7 @@ Each record has callId, projectId, sessionId, direction, upstream, outcome, stat The command requests every page until no records remain and writes one CSV header. Records go to standard output, or to --output. Progress and the next cursor go to standard error, as JSON lines with --json. --max-pages stops early; resume with --cursor and the same filters. When a page fails, the command reports the cursor that resumes from that page and exits non-zero. -Pass --project to read one project. Without it, an organization API key reads every project in the organization. A project token reads only its own project and requires --project. Credentials need the sessions:read scope.` +Pass --project to read one project. Without it, an team key reads every project in the organization. A project token reads only its own project and requires --project. Credentials need the sessions:read scope.` static override examples = [ '<%= config.bin %> calls export --since 2026-09-01T00:00:00Z --output calls.csv', diff --git a/src/commands/calls/opt-outs/add.ts b/src/commands/calls/opt-outs/add.ts index 41456123..e798d988 100644 --- a/src/commands/calls/opt-outs/add.ts +++ b/src/commands/calls/opt-outs/add.ts @@ -8,7 +8,7 @@ import { export default class CallsOptOutsAdd extends BaseCommand { static override description = - 'Add a person to the team’s do-not-call list by phone number or BSUID. From then on, calls to them are refused with call_recipient_opted_out, including calls your PBX places through a SIP trunk. Adding a person already on the list changes nothing and returns their entry (metadata.status 200 instead of 201). The list holds up to 100,000 entries; a full list fails with call_opt_out_limit (exit code 4). Requires an organization API key.' + 'Add a person to the team’s do-not-call list by phone number or BSUID. From then on, calls to them are refused with call_recipient_opted_out, including calls your PBX places through a SIP trunk. Adding a person already on the list changes nothing and returns their entry (metadata.status 200 instead of 201). The list holds up to 100,000 entries; a full list fails with call_opt_out_limit (exit code 4). Requires an team key.' static override examples = [ '<%= config.bin %> calls opt-outs add --phone-number +14155550123 --note "Asked by phone on 2026-09-19"', diff --git a/src/commands/calls/opt-outs/import.ts b/src/commands/calls/opt-outs/import.ts index d12abed1..47471773 100644 --- a/src/commands/calls/opt-outs/import.ts +++ b/src/commands/calls/opt-outs/import.ts @@ -20,7 +20,7 @@ export default class CallsOptOutsImport extends BaseCommand { }), } - static override description = `Add many people to the team’s do-not-call list from a file of up to 10 MiB. CSV needs a header row naming phoneNumber, bsuid and optionally note; each row names a phone number (E.164) or a BSUID. JSON is an array of {"phoneNumber" | "bsuid", "note"} objects, or an object with that array as "entries". The CLI sends ${IMPORT_BATCH_SIZE.toLocaleString('en-US')} entries per request and reports the entries added, already listed and rejected, with each rejected entry's zero-based position (and CSV line). Running an import again is safe: entries already on the list are counted as already listed. Exit codes: 0 when every entry is listed; 12 when some entries were rejected, or when a later request failed after earlier batches were stored (run the import again); the request's own exit code when nothing was stored. Requires an organization API key.` + static override description = `Add many people to the team’s do-not-call list from a file of up to 10 MiB. CSV needs a header row naming phoneNumber, bsuid and optionally note; each row names a phone number (E.164) or a BSUID. JSON is an array of {"phoneNumber" | "bsuid", "note"} objects, or an object with that array as "entries". The CLI sends ${IMPORT_BATCH_SIZE.toLocaleString('en-US')} entries per request and reports the entries added, already listed and rejected, with each rejected entry's zero-based position (and CSV line). Running an import again is safe: entries already on the list are counted as already listed. Exit codes: 0 when every entry is listed; 12 when some entries were rejected, or when a later request failed after earlier batches were stored (run the import again); the request's own exit code when nothing was stored. Requires an team key.` static override examples = [ '<%= config.bin %> calls opt-outs import do-not-call.csv', diff --git a/src/commands/calls/opt-outs/list.ts b/src/commands/calls/opt-outs/list.ts index cfefcfaa..17d39cc4 100644 --- a/src/commands/calls/opt-outs/list.ts +++ b/src/commands/calls/opt-outs/list.ts @@ -9,7 +9,7 @@ import { export default class CallsOptOutsList extends BaseCommand { static override description = - 'List the team’s do-not-call list, newest first. One page is returned unless --paginate follows page.nextCursor up to --max-items entries; human output ends with the --cursor for the next page. --phone-number or --bsuid returns only that person’s entry, if any. Requires an organization API key.' + 'List the team’s do-not-call list, newest first. One page is returned unless --paginate follows page.nextCursor up to --max-items entries; human output ends with the --cursor for the next page. --phone-number or --bsuid returns only that person’s entry, if any. Requires an team key.' static override examples = [ '<%= config.bin %> calls opt-outs list', diff --git a/src/commands/calls/opt-outs/remove.ts b/src/commands/calls/opt-outs/remove.ts index c2611b51..f5f94772 100644 --- a/src/commands/calls/opt-outs/remove.ts +++ b/src/commands/calls/opt-outs/remove.ts @@ -15,7 +15,7 @@ export default class CallsOptOutsRemove extends BaseCommand { } static override description = - 'Remove one entry from the team’s do-not-call list. The person can be called again at once. Requires --yes and an organization API key; an unknown ID fails with exit code 4.' + 'Remove one entry from the team’s do-not-call list. The person can be called again at once. Requires --yes and an team key; an unknown ID fails with exit code 4.' static override examples = [ '<%= config.bin %> calls opt-outs remove 0b9f6a52-8f0e-4a44-9d51-3c1f9d6f2a10 --yes', diff --git a/src/commands/calls/policy/get.ts b/src/commands/calls/policy/get.ts index 8019c4ce..38e1bec3 100644 --- a/src/commands/calls/policy/get.ts +++ b/src/commands/calls/policy/get.ts @@ -6,7 +6,7 @@ import { export default class CallsPolicyGet extends BaseCommand { static override description = - 'Read the team call policy: the blocked country codes, the number of entries on the do-not-call list, and the revision to pass to `calls policy set --expected-revision`. The revision is 0 before the codes are first saved. Requires an organization API key: a project token used as the API key is refused by the API (exit code 3), and a client token is not accepted for this command (exit code 2).' + 'Read the team call policy: the blocked country codes, the number of entries on the do-not-call list, and the revision to pass to `calls policy set --expected-revision`. The revision is 0 before the codes are first saved. Requires an team key: a project token used as the API key is refused by the API (exit code 3), and a client token is not accepted for this command (exit code 2).' static override examples = ['<%= config.bin %> calls policy get'] diff --git a/src/commands/calls/policy/set.ts b/src/commands/calls/policy/set.ts index 28942fda..f5ced314 100644 --- a/src/commands/calls/policy/set.ts +++ b/src/commands/calls/policy/set.ts @@ -9,7 +9,7 @@ import { export default class CallsPolicySet extends BaseCommand { static override description = - 'Replace the team’s blocked country codes. Calls to phone numbers that start with a blocked code are refused with call_destination_blocked, and while any code is blocked, calls to a person whose phone number is not known are refused too. The list you pass replaces the stored list; --clear allows every country. Codes are country calling codes or longer dialing prefixes of 1 to 4 digits (44, 1876), at most 300. New calls use the new list at once; calls in progress continue. --expected-revision applies the change only if the policy still has that revision (see `calls policy get`); otherwise the command fails with state_conflict (exit code 4) and changes nothing. Requires an organization API key.' + 'Replace the team’s blocked country codes. Calls to phone numbers that start with a blocked code are refused with call_destination_blocked, and while any code is blocked, calls to a person whose phone number is not known are refused too. The list you pass replaces the stored list; --clear allows every country. Codes are country calling codes or longer dialing prefixes of 1 to 4 digits (44, 1876), at most 300. New calls use the new list at once; calls in progress continue. --expected-revision applies the change only if the policy still has that revision (see `calls policy get`); otherwise the command fails with state_conflict (exit code 4) and changes nothing. Requires an team key.' static override examples = [ '<%= config.bin %> calls policy set --blocked-country-codes 44,1876', diff --git a/src/commands/calls/stats.ts b/src/commands/calls/stats.ts index f40d1eef..0cfb0885 100644 --- a/src/commands/calls/stats.ts +++ b/src/commands/calls/stats.ts @@ -17,7 +17,7 @@ export default class CallsStats extends BaseCommand { The range defaults to the last 7 days. --group-by day covers at most 366 days and --group-by hour at most 31. Day and hour buckets, and the heatmap, use --timezone (UTC by default). -Pass --project to read one project. Without it, an organization API key reads every project in the organization. A project token reads only its own project and requires --project. Credentials need the sessions:read scope.` +Pass --project to read one project. Without it, an team key reads every project in the organization. A project token reads only its own project and requires --project. Credentials need the sessions:read scope.` static override examples = [ '<%= config.bin %> calls stats', diff --git a/src/commands/key/revoke.ts b/src/commands/key/revoke.ts index 40b37847..29d9b5cb 100644 --- a/src/commands/key/revoke.ts +++ b/src/commands/key/revoke.ts @@ -8,7 +8,7 @@ export default class KeyRevoke extends BaseCommand { key: Args.string({description: 'API key ID.', required: true}), } - static override description = 'Revoke an organization API key.' + static override description = 'Revoke an team key.' static override flags = { 'idempotency-key': Flags.string({ diff --git a/src/commands/listen.ts b/src/commands/listen.ts index 274cf045..6e9adaca 100644 --- a/src/commands/listen.ts +++ b/src/commands/listen.ts @@ -74,7 +74,7 @@ export default class Listen extends BaseCommand { }), project: Flags.string({ description: - 'Use a project UUID; organization API keys may use a unique slug. Defaults to the linked or profile project.', + 'Use a project UUID; team keys may use a unique slug. Defaults to the linked or profile project.', }), } diff --git a/src/commands/session/list.ts b/src/commands/session/list.ts index 0eb5559c..0137bdfa 100644 --- a/src/commands/session/list.ts +++ b/src/commands/session/list.ts @@ -6,7 +6,7 @@ import { export default class SessionList extends BaseCommand { static override description = - 'List session metadata for the team or one project. Requires an organization API key with sessions:read.' + 'List session metadata for the team or one project. Requires an team key with sessions:read.' static override examples = [ '<%= config.bin %> session list', '<%= config.bin %> session list --project PROJECT_ID --json', diff --git a/src/commands/session/status.ts b/src/commands/session/status.ts index 97e308db..d009713a 100644 --- a/src/commands/session/status.ts +++ b/src/commands/session/status.ts @@ -6,7 +6,7 @@ import {viewManagedSession} from '../../services/platform-management.js' export default class SessionStatus extends BaseCommand { static override description = - 'Read the stored session status and reason. Requires an organization API key with sessions:read.' + 'Read the stored session status and reason. Requires an team key with sessions:read.' static override args = { session: Args.string({description: 'Session ID.', required: true}), } diff --git a/src/commands/session/view.ts b/src/commands/session/view.ts index 2d9e6b51..5651aadf 100644 --- a/src/commands/session/view.ts +++ b/src/commands/session/view.ts @@ -9,7 +9,7 @@ import { export default class SessionView extends BaseCommand { static override description = - 'Read one session by its ID. Requires an organization API key with sessions:read.' + 'Read one session by its ID. Requires an team key with sessions:read.' static override args = { session: Args.string({description: 'Session ID.', required: true}), } diff --git a/src/context/environment.ts b/src/context/environment.ts index 0f64c622..55f5ed83 100644 --- a/src/context/environment.ts +++ b/src/context/environment.ts @@ -75,7 +75,7 @@ export interface ResolveDeveloperEnvironmentInput { /** * Choose the owner when neither --owner nor the profile names one: a * project context (--project, or a project token) reads one project, and - * an organization key otherwise reads the whole organization. For commands + * an team key otherwise reads the whole organization. For commands * whose results span projects rather than belong to one owner. */ readonly inferOwner?: boolean | undefined @@ -464,8 +464,8 @@ export async function resolveCommandEnvironment( ) { throw new PolymorfaConfigurationError( input.surface === 'platform' - ? `Profile ${selected} contains a project token; this Platform command requires an organization API key.` - : `Profile ${selected} contains a project token; this Messaging command requires an organization API key or a Messaging client token.`, + ? `Profile ${selected} contains a project token; this Platform command requires an team key.` + : `Profile ${selected} contains a project token; this Messaging command requires an team key or a Messaging client token.`, 'credential', ) } diff --git a/src/mcp/server.ts b/src/mcp/server.ts index c1ebd143..8a2e4a60 100644 --- a/src/mcp/server.ts +++ b/src/mcp/server.ts @@ -92,7 +92,7 @@ export function createMcpServer( readOnlyHint: true, }, description: - 'List stored session summaries in one project. Requires a CLI organization API key with sessions:read.', + 'List stored session summaries in one project. Requires a CLI team key with sessions:read.', inputSchema: z.object({ projectId: z.string().regex(LISTENER_PROJECT_ID_PATTERN), }), @@ -105,7 +105,7 @@ export function createMcpServer( return { content: [ { - text: 'Could not list project sessions with the selected CLI organization API key.', + text: 'Could not list project sessions with the selected CLI team key.', type: 'text' as const, }, ], diff --git a/src/mcp/session-discovery.ts b/src/mcp/session-discovery.ts index b6feee06..59ac2620 100644 --- a/src/mcp/session-discovery.ts +++ b/src/mcp/session-discovery.ts @@ -34,7 +34,7 @@ export async function listMcpSessions( process.env.POLYMORFA_CLIENT_TOKEN?.trim()) ) { throw new PolymorfaConfigurationError( - 'Select only one organization API key for MCP session discovery.', + 'Select only one team key for MCP session discovery.', 'credential', ) } diff --git a/src/services/projects.ts b/src/services/projects.ts index 8f81e84f..32c2a7ba 100644 --- a/src/services/projects.ts +++ b/src/services/projects.ts @@ -280,7 +280,7 @@ export class ProjectContextService { if (projectToken !== undefined) { // The token does not name its project, so an explicit UUID is the // only way to identify it locally. A slug cannot be resolved without - // an organization credential. + // an team key. const declared = nonEmpty(options.project)?.trim() if (declared !== undefined && PROJECT_UUID.test(declared)) { return { diff --git a/test/commands/analytics.test.ts b/test/commands/analytics.test.ts index 616f73a3..3bf084e9 100644 --- a/test/commands/analytics.test.ts +++ b/test/commands/analytics.test.ts @@ -34,8 +34,7 @@ test('runs the JSON analytics command against the project-confined public route' { POLYMORFA_API_KEY: undefined, POLYMORFA_CLIENT_TOKEN: undefined, - POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_PROJECT_TOKEN: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, }, () => @@ -68,8 +67,7 @@ test('rejects an invalid range before making a request', async () => { servers.push(server) const result = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_PROJECT_TOKEN: undefined, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_BASE_URL: server.baseUrl, @@ -120,8 +118,7 @@ test('shows call vitals when messaging measurements are unavailable', async () = servers.push(server) const result = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_PROJECT_TOKEN: undefined, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_BASE_URL: server.baseUrl, @@ -136,8 +133,7 @@ test('shows call vitals when messaging measurements are unavailable', async () = const json = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_PROJECT_TOKEN: undefined, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_BASE_URL: server.baseUrl, @@ -165,8 +161,7 @@ test('exports raw collector text through the project-confined SDK transport', as { POLYMORFA_API_KEY: undefined, POLYMORFA_CLIENT_TOKEN: undefined, - POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_PROJECT_TOKEN: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, }, () => @@ -199,8 +194,7 @@ test('rejects an HTML response instead of printing it as collector data', async servers.push(server) const result = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_PROJECT_TOKEN: undefined, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_BASE_URL: server.baseUrl, diff --git a/test/commands/api-gh.test.ts b/test/commands/api-gh.test.ts index 361800de..3bcf599a 100644 --- a/test/commands/api-gh.test.ts +++ b/test/commands/api-gh.test.ts @@ -8,8 +8,7 @@ import { type TestHttpServer, } from '../helpers/http-server.js' -const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const API_KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' describe('api gh-style options', () => { let server: TestHttpServer | undefined diff --git a/test/commands/api.test.ts b/test/commands/api.test.ts index a0237750..daa54b38 100644 --- a/test/commands/api.test.ts +++ b/test/commands/api.test.ts @@ -17,7 +17,7 @@ describe('api', () => { test('sends raw Messaging requests with a project token', async () => { server = await startHttpServer({body: {success: true, data: {ready: true}}}) - const projectToken = `pmfa_pt_${'A'.repeat(94)}` + const projectToken = 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const result = await withEnvironment( { POLYMORFA_API_KEY: undefined, @@ -38,9 +38,9 @@ describe('api', () => { server = await startHttpServer({body: {success: true}}) const result = await withEnvironment( { - POLYMORFA_API_KEY: `pmfa_${'A'.repeat(72)}`, + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_CLIENT_TOKEN: undefined, - POLYMORFA_PROJECT_TOKEN: `pmfa_pt_${'A'.repeat(94)}`, + POLYMORFA_PROJECT_TOKEN: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, }, () => runCommand('api /messaging/health --surface messaging --json'), @@ -57,7 +57,7 @@ describe('api', () => { const previousDirectory = process.cwd() const keyring = vi .spyOn(AsyncEntry.prototype, 'getPassword') - .mockResolvedValue(`pmfa_pt_${'A'.repeat(94)}`) + .mockResolvedValue('pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k') tempDirectories.push(directory) try { await mkdir(configDirectory) @@ -125,7 +125,7 @@ describe('api', () => { process.chdir(directory) const result = await withEnvironment( { - POLYMORFA_API_KEY: `pmfa_${'A'.repeat(72)}`, + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, POLYMORFA_BASE_URL: server.baseUrl, @@ -145,8 +145,7 @@ describe('api', () => { }) const result = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -177,8 +176,7 @@ describe('api', () => { }) const result = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -218,8 +216,7 @@ describe('api', () => { const result = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -239,7 +236,7 @@ describe('api', () => { url: '/v1/projects', }) expect(server.requests[0]?.headers.authorization).toBe( - 'Bearer pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'Bearer pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', ) }) @@ -251,8 +248,7 @@ describe('api', () => { const result = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -281,8 +277,7 @@ describe('api', () => { const result = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -309,8 +304,7 @@ describe('api', () => { const result = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -331,8 +325,7 @@ describe('api', () => { test('redacts credentials from API errors and preserves the request ID', async () => { server = await startHttpServer({ body: { - error: - 'Invalid API key pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.', + error: 'Invalid API key pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k.', }, headers: {'request-id': 'req_auth'}, status: 401, @@ -340,8 +333,7 @@ describe('api', () => { const result = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -360,9 +352,7 @@ describe('api', () => { }, schemaVersion: 1, }) - expect(result.stderr).not.toContain( - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', - ) + expect(result.stderr).not.toContain('pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k') expect(result.stdout).toBe('') }) @@ -371,8 +361,7 @@ describe('api', () => { const result = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -395,8 +384,7 @@ describe('api', () => { const result = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -423,8 +411,7 @@ describe('api', () => { const result = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -457,8 +444,7 @@ describe('api', () => { const result = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -475,8 +461,7 @@ describe('api', () => { const result = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -495,8 +480,7 @@ describe('api', () => { const result = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/audiences-optouts.test.ts b/test/commands/audiences-optouts.test.ts index 78763a96..fd1db3e9 100644 --- a/test/commands/audiences-optouts.test.ts +++ b/test/commands/audiences-optouts.test.ts @@ -172,7 +172,7 @@ describe('Audience and opt-out commands', () => { expect(result.stdout).not.toContain('Removed') }) - test('reads the organization keyword settings', async () => { + test('reads the team keyword settings', async () => { server = await startHttpServer({body: {data: settings()}}) const result = await apiKeyEnvironment(() => @@ -224,8 +224,7 @@ describe('Audience and opt-out commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/auth.test.ts b/test/commands/auth.test.ts index e06e9277..0e02ae9b 100644 --- a/test/commands/auth.test.ts +++ b/test/commands/auth.test.ts @@ -55,7 +55,7 @@ describe('auth commands', () => { test('logs in from stdin, lists profiles, and switches active profile', async () => { await withConfig(async () => { const login = await withStdin( - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n', + 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k\n', async () => runCommand('auth login --with-api-key --profile work --json'), ) @@ -78,10 +78,8 @@ describe('auth commands', () => { test('reports keyring availability and logs out only the selected profile', async () => { await withConfig(async () => { - await withStdin( - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n', - async () => - runCommand('auth login --with-api-key --profile work --json'), + await withStdin('pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k\n', async () => + runCommand('auth login --with-api-key --profile work --json'), ) const status = await runCommand('auth status --profile work --json') @@ -104,8 +102,7 @@ describe('auth commands', () => { test('reports environment credential validation separately from remote exercise', async () => { await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC', + POLYMORFA_API_KEY: 'pmfa_YmJiYmJiYmJiYmJiYmJiYmJiYmKK0GQs', POLYMORFA_CLIENT_TOKEN: undefined, }, async () => { @@ -124,7 +121,7 @@ describe('auth commands', () => { test('stores a project-token profile with exact project ownership', async () => { await withConfig(async () => { - const token = `pmfa_pt_${'A'.repeat(94)}\n` + const token = `pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k\n` const login = await withStdin(token, async () => runCommand( 'auth login --with-project-token --profile project --project project_1 --json', @@ -156,7 +153,7 @@ describe('auth commands', () => { }) test('reports an environment project token without exposing it', async () => { - const token = `pmfa_pt_${'A'.repeat(94)}` + const token = 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' await withEnvironment( { POLYMORFA_API_KEY: undefined, diff --git a/test/commands/bansafe.test.ts b/test/commands/bansafe.test.ts index 57f0e315..18ea2c1a 100644 --- a/test/commands/bansafe.test.ts +++ b/test/commands/bansafe.test.ts @@ -430,8 +430,7 @@ describe('BanSafe commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/billing-controls.test.ts b/test/commands/billing-controls.test.ts index 1841264b..5adc32c4 100644 --- a/test/commands/billing-controls.test.ts +++ b/test/commands/billing-controls.test.ts @@ -8,8 +8,7 @@ import { withEnvironment, type TestHttpServer, } from '../helpers/http-server.js' -const key = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const key = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const project = '22222222-2222-4222-8222-222222222222', number = '33333333-3333-4333-8333-333333333333' const priorities = { diff --git a/test/commands/business.test.ts b/test/commands/business.test.ts index 9bf7cd06..b6e903e6 100644 --- a/test/commands/business.test.ts +++ b/test/commands/business.test.ts @@ -544,8 +544,7 @@ describe('business commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -559,7 +558,8 @@ describe('business commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', }, run, ) diff --git a/test/commands/call-analytics.test.ts b/test/commands/call-analytics.test.ts index 7df50f74..26920c21 100644 --- a/test/commands/call-analytics.test.ts +++ b/test/commands/call-analytics.test.ts @@ -14,10 +14,8 @@ import { } from '../helpers/http-server.js' import {temporaryDirectory} from '../support/fs.js' -const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' -const PROJECT_TOKEN = - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const API_KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' +const PROJECT_TOKEN = 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const PROJECT = '11111111-1111-4111-8111-111111111111' const HEADER = diff --git a/test/commands/call-consent.test.ts b/test/commands/call-consent.test.ts index d7120986..7cee67d4 100644 --- a/test/commands/call-consent.test.ts +++ b/test/commands/call-consent.test.ts @@ -11,9 +11,9 @@ import { type TestHttpServer, } from '../helpers/http-server.js' -const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' -const CLIENT_TOKEN = 'pmfa_ct_browser_token' +const API_KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' +const CLIENT_TOKEN = + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO' const OPT_OUT_ID = '0b9f6a52-8f0e-4a44-9d51-3c1f9d6f2a10' const NEXT_CURSOR = '1c9f6a52-8f0e-4a44-9d51-3c1f9d6f2a11' @@ -135,7 +135,7 @@ describe('call consent commands', () => { body: { error: { code: 'permission_denied', - message: "The team's call policy needs an organization credential.", + message: "The team's call policy needs an team key.", }, success: false, }, @@ -155,7 +155,7 @@ describe('call consent commands', () => { error: {category: 'conflict', code: 'state_conflict'}, }) expect(exitCode(refused.error)).toBe(3) - expect(refused.stderr).toContain('organization credential') + expect(refused.stderr).toContain('team key') }, 30_000) test('reports malformed SDK collection envelopes as server failures', async () => { diff --git a/test/commands/call-links.test.ts b/test/commands/call-links.test.ts index 457d7771..8a9d3e00 100644 --- a/test/commands/call-links.test.ts +++ b/test/commands/call-links.test.ts @@ -10,9 +10,9 @@ import { type TestHttpServer, } from '../helpers/http-server.js' -const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' -const CLIENT_TOKEN = 'pmfa_ct_browser_token' +const API_KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' +const CLIENT_TOKEN = + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO' const TOKEN = 'AbCdEf0123456789_link-token' describe('call link commands', () => { diff --git a/test/commands/call-records.test.ts b/test/commands/call-records.test.ts index fcc74723..88851fe7 100644 --- a/test/commands/call-records.test.ts +++ b/test/commands/call-records.test.ts @@ -7,8 +7,7 @@ import { type TestHttpServer, } from '../helpers/http-server.js' -const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const API_KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const PROJECT = '11111111-1111-4111-8111-111111111111' const record = { callId: 'call_1', diff --git a/test/commands/calls-and-identities.test.ts b/test/commands/calls-and-identities.test.ts index ed0c8bee..6d8f4e07 100644 --- a/test/commands/calls-and-identities.test.ts +++ b/test/commands/calls-and-identities.test.ts @@ -163,8 +163,7 @@ describe('call and identity commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -178,7 +177,8 @@ describe('call and identity commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', }, run, ) diff --git a/test/commands/calls.test.ts b/test/commands/calls.test.ts index f60ca33a..cf267981 100644 --- a/test/commands/calls.test.ts +++ b/test/commands/calls.test.ts @@ -9,11 +9,10 @@ import { type TestHttpServer, } from '../helpers/http-server.js' -const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' -const CLIENT_TOKEN = 'pmfa_ct_browser_token' -const PROJECT_TOKEN = - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const API_KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' +const CLIENT_TOKEN = + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO' +const PROJECT_TOKEN = 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const TRUNK_ID = '6f1c2f0e-1d5b-4d8e-9a55-0d4b8a6c1f10' const DEFAULT_RETENTION = { appliesTo: ['call_records', 'call_events', 'client_reports'], diff --git a/test/commands/campaign-conversions.test.ts b/test/commands/campaign-conversions.test.ts index 1628e216..1df8d3a1 100644 --- a/test/commands/campaign-conversions.test.ts +++ b/test/commands/campaign-conversions.test.ts @@ -118,8 +118,7 @@ describe('Campaign conversion commands (beta)', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/campaign-follow-ups.test.ts b/test/commands/campaign-follow-ups.test.ts index 5fbb5c67..7bdd4652 100644 --- a/test/commands/campaign-follow-ups.test.ts +++ b/test/commands/campaign-follow-ups.test.ts @@ -178,8 +178,7 @@ describe('campaign follow-up output (beta)', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/campaign-recipients.test.ts b/test/commands/campaign-recipients.test.ts index f8bcfe7a..0b1959b7 100644 --- a/test/commands/campaign-recipients.test.ts +++ b/test/commands/campaign-recipients.test.ts @@ -414,8 +414,7 @@ describe('Campaign recipient commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/campaigns.test.ts b/test/commands/campaigns.test.ts index 41c71447..cbc28fa3 100644 --- a/test/commands/campaigns.test.ts +++ b/test/commands/campaigns.test.ts @@ -316,8 +316,7 @@ describe('Messaging campaign commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -331,7 +330,8 @@ describe('Messaging campaign commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', }, run, ) diff --git a/test/commands/channels.test.ts b/test/commands/channels.test.ts index 3c1f5035..ce72ac8d 100644 --- a/test/commands/channels.test.ts +++ b/test/commands/channels.test.ts @@ -344,8 +344,7 @@ describe('channel commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -359,7 +358,8 @@ describe('channel commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', }, run, ) diff --git a/test/commands/cloud-group.test.ts b/test/commands/cloud-group.test.ts index d20b8e44..9d4dd4fa 100644 --- a/test/commands/cloud-group.test.ts +++ b/test/commands/cloud-group.test.ts @@ -18,10 +18,12 @@ describe('Official group commands (beta)', () => { return withEnvironment( { POLYMORFA_API_KEY: - kind === 'api' ? `pmfa_${'A'.repeat(72)}` : undefined, + kind === 'api' ? 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' : undefined, POLYMORFA_PROJECT_TOKEN: undefined, POLYMORFA_CLIENT_TOKEN: - kind === 'client' ? `pmfa_ct_${'A'.repeat(94)}` : undefined, + kind === 'client' + ? `pmfa_ct_AAECAwQFBgcICQoLDA0ODxAREhM73f-k` + : undefined, POLYMORFA_BASE_URL: server.baseUrl, }, () => runCommand(command), diff --git a/test/commands/cloud.test.ts b/test/commands/cloud.test.ts index bf7477fd..54138ebd 100644 --- a/test/commands/cloud.test.ts +++ b/test/commands/cloud.test.ts @@ -113,7 +113,7 @@ describe('Official API commands', () => { ) const keyring = vi .spyOn(AsyncEntry.prototype, 'getPassword') - .mockResolvedValue(`pmfa_pt_${'A'.repeat(94)}`) + .mockResolvedValue('pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k') server = await startHttpServer({ status: 202, body: {success: true, data: {accepted: true}}, @@ -466,11 +466,15 @@ describe('Official API commands', () => { return withEnvironment( { POLYMORFA_API_KEY: - kind === 'api' ? `pmfa_${'A'.repeat(72)}` : undefined, + kind === 'api' ? 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' : undefined, POLYMORFA_PROJECT_TOKEN: - kind === 'project' ? `pmfa_pt_${'A'.repeat(94)}` : undefined, + kind === 'project' + ? 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' + : undefined, POLYMORFA_CLIENT_TOKEN: - kind === 'client' ? `pmfa_ct_${'A'.repeat(94)}` : undefined, + kind === 'client' + ? `pmfa_ct_AAECAwQFBgcICQoLDA0ODxAREhM73f-k` + : undefined, POLYMORFA_BASE_URL: server.baseUrl, }, run, diff --git a/test/commands/contacts.test.ts b/test/commands/contacts.test.ts index d92e5a1e..bc86bca7 100644 --- a/test/commands/contacts.test.ts +++ b/test/commands/contacts.test.ts @@ -218,8 +218,7 @@ describe('contact commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -233,7 +232,8 @@ describe('contact commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', }, run, ) diff --git a/test/commands/customers.test.ts b/test/commands/customers.test.ts index 682a6272..843e590b 100644 --- a/test/commands/customers.test.ts +++ b/test/commands/customers.test.ts @@ -302,8 +302,7 @@ describe('Customer commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/developer-webhooks.test.ts b/test/commands/developer-webhooks.test.ts index b79c1e4c..9da67c76 100644 --- a/test/commands/developer-webhooks.test.ts +++ b/test/commands/developer-webhooks.test.ts @@ -881,8 +881,7 @@ function findCall(method: string) { function developerEnvironment(run: () => Promise): Promise { return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: 'https://api.example.test', POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, diff --git a/test/commands/doctor.test.ts b/test/commands/doctor.test.ts index 5a005d20..70d5a08f 100644 --- a/test/commands/doctor.test.ts +++ b/test/commands/doctor.test.ts @@ -18,8 +18,7 @@ import { type TestHttpServer, } from '../helpers/http-server.js' -const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const API_KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' describe('doctor command exit status', () => { let server: TestHttpServer diff --git a/test/commands/event-stream.test.ts b/test/commands/event-stream.test.ts index 26f215fc..376c18d6 100644 --- a/test/commands/event-stream.test.ts +++ b/test/commands/event-stream.test.ts @@ -251,8 +251,7 @@ function item(id: string, cursor: string, withBody = true) { function environment(run: () => Promise): Promise { return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: 'https://api.example.test', POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, diff --git a/test/commands/events.test.ts b/test/commands/events.test.ts index 7fcd2097..c01533f5 100644 --- a/test/commands/events.test.ts +++ b/test/commands/events.test.ts @@ -295,8 +295,7 @@ function replayReceipt() { function environment(run: () => Promise): Promise { return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: 'https://api.example.test', POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, diff --git a/test/commands/flow-endpoints.test.ts b/test/commands/flow-endpoints.test.ts index 3362c8f6..af79a57c 100644 --- a/test/commands/flow-endpoints.test.ts +++ b/test/commands/flow-endpoints.test.ts @@ -18,7 +18,7 @@ describe('dynamic Flow endpoint commands', () => { return withEnvironment( { POLYMORFA_API_KEY: undefined, - POLYMORFA_PROJECT_TOKEN: `pmfa_pt_${'A'.repeat(94)}`, + POLYMORFA_PROJECT_TOKEN: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_BASE_URL: server!.baseUrl, }, diff --git a/test/commands/flows.test.ts b/test/commands/flows.test.ts index 48bcaf3c..918be090 100644 --- a/test/commands/flows.test.ts +++ b/test/commands/flows.test.ts @@ -25,9 +25,13 @@ describe('project Flow commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_PROJECT_TOKEN: - kind === 'project' ? `pmfa_pt_${'A'.repeat(94)}` : undefined, + kind === 'project' + ? 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' + : undefined, POLYMORFA_CLIENT_TOKEN: - kind === 'client' ? `pmfa_ct_${'A'.repeat(94)}` : undefined, + kind === 'client' + ? `pmfa_ct_AAECAwQFBgcICQoLDA0ODxAREhM73f-k` + : undefined, POLYMORFA_BASE_URL: server!.baseUrl, }, () => runCommand(command), diff --git a/test/commands/functions.test.ts b/test/commands/functions.test.ts index 69bc63da..30fffa86 100644 --- a/test/commands/functions.test.ts +++ b/test/commands/functions.test.ts @@ -9,8 +9,7 @@ import { withEnvironment, type TestHttpServer, } from '../helpers/http-server.js' -const KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const PROJECT = '018f0000-0000-7000-8000-000000000001', FN = '018f0000-0000-7000-8000-000000000002', DEPLOY = '018f0000-0000-7000-8000-000000000003', @@ -391,11 +390,11 @@ describe('Function commands', () => { expect(result.stderr).toContain('reconcile') expect(server.requests).toHaveLength(1) }) - test('uses project tokens without silently treating them as organization credentials', async () => { + test('uses project tokens without silently treating them as team keys', async () => { server = await startHttpServer({ body: {data: {items: [], nextCursor: null}}, }) - const token = 'pmfa_pt_' + 'A'.repeat(94) + const token = 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const result = await withEnvironment( { POLYMORFA_API_KEY: undefined, diff --git a/test/commands/group-mutations.test.ts b/test/commands/group-mutations.test.ts index 840e247b..2d998f90 100644 --- a/test/commands/group-mutations.test.ts +++ b/test/commands/group-mutations.test.ts @@ -8,8 +8,7 @@ import { type TestHttpServer, } from '../helpers/http-server.js' -const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const API_KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' describe('group mutation commands', () => { let server: TestHttpServer | undefined diff --git a/test/commands/groups.test.ts b/test/commands/groups.test.ts index ee3946ff..5f775f7f 100644 --- a/test/commands/groups.test.ts +++ b/test/commands/groups.test.ts @@ -96,7 +96,8 @@ describe('group commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', }, () => runCommand('group list --session session_1 --json'), ) @@ -176,8 +177,7 @@ describe('group commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/history.test.ts b/test/commands/history.test.ts index ac4ee258..f1f7b9cb 100644 --- a/test/commands/history.test.ts +++ b/test/commands/history.test.ts @@ -86,7 +86,7 @@ describe('stored chat history commands', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: undefined, - POLYMORFA_PROJECT_TOKEN: `pmfa_pt_${'A'.repeat(94)}`, + POLYMORFA_PROJECT_TOKEN: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_BASE_URL: server.baseUrl, }, @@ -140,7 +140,8 @@ describe('stored chat history commands', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: undefined, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', POLYMORFA_BASE_URL: server.baseUrl, }, () => runCommand('chat list --session number_1 --json'), @@ -209,8 +210,7 @@ describe('stored chat history commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_BASE_URL: server.baseUrl, }, diff --git a/test/commands/hybrid-credentials.test.ts b/test/commands/hybrid-credentials.test.ts index 1fa6818f..c0bdaf06 100644 --- a/test/commands/hybrid-credentials.test.ts +++ b/test/commands/hybrid-credentials.test.ts @@ -10,8 +10,8 @@ import { } from '../helpers/http-server.js' const project = '11111111-1111-4111-8111-111111111111' -const apiKey = `pmfa_${'A'.repeat(72)}` -const projectToken = `pmfa_pt_${'A'.repeat(94)}` +const apiKey = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' +const projectToken = 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const cases = [ { command: 'hybrid-link state --session existing', @@ -301,7 +301,8 @@ test.each(cases)( POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_API_KEY: undefined, POLYMORFA_PROJECT_TOKEN: undefined, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', }, async () => { const result = await runCommand(`${command} --json`) @@ -309,7 +310,9 @@ test.each(cases)( expect(JSON.parse(result.stderr)).toMatchObject({ error: {category: 'configuration'}, }) - expect(result.stderr).not.toContain('pmfa_ct_browser') + expect(result.stderr).not.toContain( + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', + ) }, ) expect(server.requests).toEqual([]) @@ -362,7 +365,7 @@ test('invalid project-token format is rejected before transport', async () => { 'hybrid-link state --session existing --json', ) expect(result.error).toBeDefined() - expect(result.stderr).toContain('canonical pmfa_pt_ v1 format') + expect(result.stderr).toContain('canonical pmfa_pt_ opaque format') expect(result.stderr).not.toContain('pmfa_pt_invalid') }, ) diff --git a/test/commands/hybrid-link.test.ts b/test/commands/hybrid-link.test.ts index 37fc4a14..e2db599c 100644 --- a/test/commands/hybrid-link.test.ts +++ b/test/commands/hybrid-link.test.ts @@ -9,7 +9,7 @@ import { } from '../helpers/http-server.js' const project = '11111111-1111-4111-8111-111111111111' const env = (url: string) => ({ - POLYMORFA_API_KEY: `pmfa_${'A'.repeat(72)}`, + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: url, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, diff --git a/test/commands/labels.test.ts b/test/commands/labels.test.ts index 6b8ebf43..dee0a28e 100644 --- a/test/commands/labels.test.ts +++ b/test/commands/labels.test.ts @@ -63,7 +63,8 @@ describe('label commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', }, () => runCommand('label list --session session_1 --json'), ) @@ -220,8 +221,7 @@ describe('label commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/listen.test.ts b/test/commands/listen.test.ts index cc3e9284..b3cc3f83 100644 --- a/test/commands/listen.test.ts +++ b/test/commands/listen.test.ts @@ -42,8 +42,7 @@ describe('listen', () => { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, - POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_PROJECT_TOKEN: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, () => runCommand(`listen --project ${PROJECT} --event message.* --json`), ) @@ -122,8 +121,7 @@ describe('listen', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_CLIENT_TOKEN: undefined, - POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_PROJECT_TOKEN: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, () => runCommand( @@ -158,8 +156,7 @@ describe('listen', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_CLIENT_TOKEN: undefined, - POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_PROJECT_TOKEN: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, () => runCommand( @@ -176,8 +173,7 @@ describe('listen', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_CLIENT_TOKEN: undefined, - POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_PROJECT_TOKEN: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, () => runCommand( @@ -193,8 +189,7 @@ describe('listen', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_CLIENT_TOKEN: undefined, - POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_PROJECT_TOKEN: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, () => runCommand( diff --git a/test/commands/media.test.ts b/test/commands/media.test.ts index 43b3b2b0..6090bb99 100644 --- a/test/commands/media.test.ts +++ b/test/commands/media.test.ts @@ -52,7 +52,8 @@ describe('media commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', }, () => runCommand('media view media_1 --json'), ) @@ -449,8 +450,7 @@ describe('media commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/message-sends.test.ts b/test/commands/message-sends.test.ts index e474ea9b..2be5a02c 100644 --- a/test/commands/message-sends.test.ts +++ b/test/commands/message-sends.test.ts @@ -11,8 +11,7 @@ import { type TestHttpServer, } from '../helpers/http-server.js' -const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const API_KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' describe('typed message send commands', () => { let server: TestHttpServer | undefined diff --git a/test/commands/messages.test.ts b/test/commands/messages.test.ts index ff13d345..aeea43f3 100644 --- a/test/commands/messages.test.ts +++ b/test/commands/messages.test.ts @@ -134,7 +134,8 @@ describe('message commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', }, () => runCommand( @@ -256,8 +257,7 @@ describe('message commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/number-tiers.test.ts b/test/commands/number-tiers.test.ts index d16b61a8..a01346c6 100644 --- a/test/commands/number-tiers.test.ts +++ b/test/commands/number-tiers.test.ts @@ -451,8 +451,7 @@ describe('session tier commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, diff --git a/test/commands/operations.test.ts b/test/commands/operations.test.ts index bccea36e..c732811c 100644 --- a/test/commands/operations.test.ts +++ b/test/commands/operations.test.ts @@ -329,8 +329,7 @@ function operation(status: string, sequence: number) { function environment(run: () => Promise): Promise { return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: api.url, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, diff --git a/test/commands/platform-management.test.ts b/test/commands/platform-management.test.ts index 2eafd47a..8501275b 100644 --- a/test/commands/platform-management.test.ts +++ b/test/commands/platform-management.test.ts @@ -137,7 +137,7 @@ describe('Platform management commands', () => { const result = await withEnvironment( { POLYMORFA_API_KEY: undefined, - POLYMORFA_PROJECT_TOKEN: `pmfa_pt_${'A'.repeat(94)}`, + POLYMORFA_PROJECT_TOKEN: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, }, () => runCommand('session list --json'), @@ -738,8 +738,7 @@ describe('Platform management commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/presence.test.ts b/test/commands/presence.test.ts index d005f98d..f803c3d5 100644 --- a/test/commands/presence.test.ts +++ b/test/commands/presence.test.ts @@ -183,8 +183,7 @@ describe('presence commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, @@ -198,7 +197,8 @@ describe('presence commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', }, run, ) diff --git a/test/commands/privacy.test.ts b/test/commands/privacy.test.ts index 12f44985..49faf70c 100644 --- a/test/commands/privacy.test.ts +++ b/test/commands/privacy.test.ts @@ -57,7 +57,8 @@ describe('privacy commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', }, () => runCommand('privacy view --session session_1 --json'), ) @@ -164,8 +165,7 @@ describe('privacy commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/profile.test.ts b/test/commands/profile.test.ts index 1db44ec7..23edf7d0 100644 --- a/test/commands/profile.test.ts +++ b/test/commands/profile.test.ts @@ -83,7 +83,8 @@ describe('profile commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', }, () => runCommand('profile view --session session_1 --json'), ) @@ -273,8 +274,7 @@ describe('profile commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/project-context.test.ts b/test/commands/project-context.test.ts index 9092e7a4..3e734776 100644 --- a/test/commands/project-context.test.ts +++ b/test/commands/project-context.test.ts @@ -11,8 +11,7 @@ import { type TestHttpServer, } from '../helpers/http-server.js' -const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const API_KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const APP = '11111111-1111-4111-8111-111111111111' describe('link and project commands', () => { diff --git a/test/commands/quick-replies.test.ts b/test/commands/quick-replies.test.ts index 13e0ca80..5d16fd48 100644 --- a/test/commands/quick-replies.test.ts +++ b/test/commands/quick-replies.test.ts @@ -54,7 +54,8 @@ describe('quick-reply commands', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_BASE_URL: server.baseUrl, - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', }, () => runCommand('quick-reply list --session session_1 --json'), ) @@ -186,8 +187,7 @@ describe('quick-reply commands', () => { if (server === undefined) throw new Error('Test server was not started.') return withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, }, diff --git a/test/commands/quicklinks.test.ts b/test/commands/quicklinks.test.ts index c05894a5..36fa9417 100644 --- a/test/commands/quicklinks.test.ts +++ b/test/commands/quicklinks.test.ts @@ -35,7 +35,7 @@ test('creates a QuickLink and uploads separate test history with exact project s try { await withEnvironment( { - POLYMORFA_API_KEY: `pmfa_${'A'.repeat(72)}`, + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: server.baseUrl, POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, @@ -69,8 +69,8 @@ test('creates a QuickLink and uploads separate test history with exact project s }) const projectId = '11111111-1111-4111-8111-111111111111' -const apiKey = `pmfa_${'A'.repeat(72)}` -const projectToken = `pmfa_pt_${'A'.repeat(94)}` +const apiKey = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' +const projectToken = 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' test('retrieves QuickLink status with an exact-project token and encoded ID', async () => { const server = await startHttpSequenceServer([ diff --git a/test/commands/request-logs.test.ts b/test/commands/request-logs.test.ts index 1043d7d7..22247ae1 100644 --- a/test/commands/request-logs.test.ts +++ b/test/commands/request-logs.test.ts @@ -7,8 +7,7 @@ import { type TestHttpServer, } from '../helpers/http-server.js' -const key = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const key = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const project = '22222222-2222-4222-8222-222222222222' let server: TestHttpServer diff --git a/test/commands/sip-trunks.test.ts b/test/commands/sip-trunks.test.ts index 95c75fb1..eedcaafa 100644 --- a/test/commands/sip-trunks.test.ts +++ b/test/commands/sip-trunks.test.ts @@ -15,8 +15,7 @@ import { type TestHttpServer, } from '../helpers/http-server.js' -const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const API_KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const PROJECT = '018f0000-0000-7000-8000-000000000002' const TRUNK_ID = '6f1c2f0e-1d5b-4d8e-9a55-0d4b8a6c1f10' diff --git a/test/commands/trigger.test.ts b/test/commands/trigger.test.ts index 67909f7e..912d43de 100644 --- a/test/commands/trigger.test.ts +++ b/test/commands/trigger.test.ts @@ -7,7 +7,7 @@ import { } from '../helpers/http-server.js' const projectId = '11111111-1111-4111-8111-111111111111' -const apiKey = `pmfa_${'A'.repeat(72)}` +const apiKey = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const eventId = '0199f1c2-7a4e-7c55-9d1e-3f0b8a2c6d10' async function run( diff --git a/test/commands/usage.test.ts b/test/commands/usage.test.ts index 1aa474c1..5b49e184 100644 --- a/test/commands/usage.test.ts +++ b/test/commands/usage.test.ts @@ -7,10 +7,8 @@ import { type TestHttpServer, } from '../helpers/http-server.js' -const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' -const PROJECT_TOKEN = - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const API_KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' +const PROJECT_TOKEN = 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const PROJECT_A = '22222222-2222-4222-8222-222222222222' const PROJECT_B = '33333333-3333-4333-8333-333333333333' diff --git a/test/commands/voice-wait-timeout.test.ts b/test/commands/voice-wait-timeout.test.ts index 032d06d5..2fe357fa 100644 --- a/test/commands/voice-wait-timeout.test.ts +++ b/test/commands/voice-wait-timeout.test.ts @@ -7,8 +7,7 @@ import {expect, test} from 'vitest' import {temporaryDirectory} from '../support/fs.js' -const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const API_KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const ASSET_ID = '6f1c2f0e-1d5b-4d8e-9a55-0d4b8a6c1f10' const PROJECT = '018f0000-0000-7000-8000-000000000002' diff --git a/test/commands/voice.test.ts b/test/commands/voice.test.ts index 7f3109da..a6f6a1ae 100644 --- a/test/commands/voice.test.ts +++ b/test/commands/voice.test.ts @@ -11,8 +11,7 @@ import { type TestHttpServer, } from '../helpers/http-server.js' -const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const API_KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const PROVIDER_KEY = 'sk-provider-secret-0123456789' const PROJECT = '018f0000-0000-7000-8000-000000000002' const ASSET_ID = '6f1c2f0e-1d5b-4d8e-9a55-0d4b8a6c1f10' diff --git a/test/config/credential-vectors.test.ts b/test/config/credential-vectors.test.ts new file mode 100644 index 00000000..faffd295 --- /dev/null +++ b/test/config/credential-vectors.test.ts @@ -0,0 +1,28 @@ +import {readFileSync} from 'node:fs' +import {validateOrganizationApiKey} from '@polymorfa/sdk' +import {describe, expect, test} from 'vitest' + +import {validateProjectToken} from '../../src/config/credentials.js' + +// Byte-for-byte copy of #647's public golden vectors. Provenance is recorded in +// docs/opaque-credentials-cutover.md. These are test secrets, never credentials. +const vectors = JSON.parse( + readFileSync( + new URL('../fixtures/machine-credentials-v1.json', import.meta.url), + 'utf8', + ), +) as {opaque: {kind: 'key' | 'project'; token: string}[]} + +describe('canonical API credential vectors through the published SDK', () => { + for (const fixture of vectors.opaque) { + test(`accepts the ${fixture.kind} vector without rewriting its opaque bytes`, () => { + const validate = + fixture.kind === 'key' + ? validateOrganizationApiKey + : validateProjectToken + expect(validate(fixture.token)).toBe(fixture.token) + const changed = `${fixture.token.slice(0, -1)}A` + expect(() => validate(changed)).toThrow() + }) + } +}) diff --git a/test/context/environment.test.ts b/test/context/environment.test.ts index 0d6a8518..aa91a6ad 100644 --- a/test/context/environment.test.ts +++ b/test/context/environment.test.ts @@ -16,8 +16,7 @@ describe('resolveEnvironment', () => { resolveListenerEnvironment({ env: { POLYMORFA_BASE_URL: 'http://127.0.0.1:4567', - POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_PROJECT_TOKEN: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, apiVersion: '2026-09-01', project: PROJECT, @@ -26,8 +25,7 @@ describe('resolveEnvironment', () => { ).resolves.toMatchObject({ apiVersion: '2026-09-01', baseUrl: 'http://127.0.0.1:4567', - credential: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + credential: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', principalType: 'project_token', projectId: PROJECT, timeoutMs: 4321, @@ -67,9 +65,7 @@ describe('resolveEnvironment', () => { resolveDeveloperEnvironment( {env: {}, profile: 'project'}, {load: () => Promise.resolve(profile), save: () => Promise.resolve()}, - fakeCredentials( - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', - ), + fakeCredentials('pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k'), ), ).resolves.toMatchObject({ context: { @@ -78,8 +74,7 @@ describe('resolveEnvironment', () => { profile: 'project', projectId: PROJECT, }, - credential: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + credential: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }) }) @@ -130,13 +125,10 @@ describe('resolveEnvironment', () => { profile: 'project', }, {load: () => Promise.resolve(profile), save: () => Promise.resolve()}, - fakeCredentials( - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', - ), + fakeCredentials('pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k'), ), ).resolves.toMatchObject({ - credential: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + credential: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', profile: 'project', projectId: '11111111-1111-4111-8111-111111111111', }) @@ -151,8 +143,7 @@ describe('resolveEnvironment', () => { resolveListenerEnvironment( { env: { - POLYMORFA_API_KEY: - 'pmfa_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC', + POLYMORFA_API_KEY: 'pmfa_YmJiYmJiYmJiYmJiYmJiYmJiYmKK0GQs', }, project: '11111111-1111-4111-8111-111111111111', }, @@ -160,8 +151,7 @@ describe('resolveEnvironment', () => { credentials, ), ).resolves.toMatchObject({ - credential: - 'pmfa_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC', + credential: 'pmfa_YmJiYmJiYmJiYmJiYmJiYmJiYmKK0GQs', principalType: 'organization_key', }) expect(credentials.get).not.toHaveBeenCalled() @@ -257,8 +247,7 @@ describe('resolveEnvironment', () => { await expect( resolveDeveloperEnvironment({ env: { - POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_PROJECT_TOKEN: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, project: PROJECT, }), @@ -269,8 +258,7 @@ describe('resolveEnvironment', () => { expect( resolveEnvironment({ env: { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_BASE_URL: 'http://127.0.0.1:4567', UNRELATED_SECRET: 'do-not-copy', }, @@ -281,8 +269,7 @@ describe('resolveEnvironment', () => { surface: 'platform', credential: { type: 'apiKey', - value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + value: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, baseUrl: 'http://127.0.0.1:4567', timeoutMs: 5000, @@ -292,7 +279,10 @@ describe('resolveEnvironment', () => { test('rejects a client token for the Platform surface', () => { expect(() => resolveEnvironment({ - env: {POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser'}, + env: { + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', + }, surface: 'platform', }), ).toThrow('Platform API requests require POLYMORFA_API_KEY.') @@ -301,12 +291,19 @@ describe('resolveEnvironment', () => { test('resolves a client token for the Messaging surface', () => { expect( resolveEnvironment({ - env: {POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser'}, + env: { + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', + }, surface: 'messaging', }), ).toEqual({ surface: 'messaging', - credential: {type: 'clientToken', value: 'pmfa_ct_browser'}, + credential: { + type: 'clientToken', + value: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', + }, }) }) @@ -314,8 +311,7 @@ describe('resolveEnvironment', () => { expect( resolveEnvironment({ env: { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, surface: 'messaging', }), @@ -323,8 +319,7 @@ describe('resolveEnvironment', () => { surface: 'messaging', credential: { type: 'apiKey', - value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + value: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, }) }) @@ -333,9 +328,9 @@ describe('resolveEnvironment', () => { expect(() => resolveEnvironment({ env: { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', - POLYMORFA_CLIENT_TOKEN: 'pmfa_ct_browser', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', + POLYMORFA_CLIENT_TOKEN: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', }, surface: 'messaging', }), @@ -451,7 +446,7 @@ describe('resolveEnvironment', () => { projectProfiles(), credentials, ), - ).rejects.toThrow('organization API key') + ).rejects.toThrow('team key') expect(credentials.get).not.toHaveBeenCalled() }) @@ -474,8 +469,7 @@ describe('resolveEnvironment', () => { resolveCommandEnvironment( { env: { - POLYMORFA_API_KEY: - 'pmfa_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC', + POLYMORFA_API_KEY: 'pmfa_YmJiYmJiYmJiYmJiYmJiYmJiYmKK0GQs', }, surface: 'platform', }, @@ -485,8 +479,7 @@ describe('resolveEnvironment', () => { ).resolves.toMatchObject({ credential: { type: 'apiKey', - value: - 'pmfa_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC', + value: 'pmfa_YmJiYmJiYmJiYmJiYmJiYmJiYmKK0GQs', }, source: 'environment', }) @@ -518,8 +511,7 @@ describe('resolveEnvironment', () => { resolveCommandEnvironment( { env: { - POLYMORFA_API_KEY: - 'pmfa_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC', + POLYMORFA_API_KEY: 'pmfa_YmJiYmJiYmJiYmJiYmJiYmJiYmKK0GQs', }, profile: 'work', surface: 'messaging', @@ -581,7 +573,7 @@ describe('resolveDeveloperEnvironment owner inference', () => { }) }) - test('reads the organization with an organization key and no project', async () => { + test('reads the organization with an team key and no project', async () => { await expect( resolveDeveloperEnvironment( {env: {POLYMORFA_API_KEY: key}, inferOwner: true}, @@ -610,8 +602,7 @@ describe('resolveDeveloperEnvironment owner inference', () => { resolveDeveloperEnvironment( { env: { - POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_PROJECT_TOKEN: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, inferOwner: true, }, @@ -678,7 +669,7 @@ function fakeCredentials(value: string): CredentialStore { } } -const PROJECT_TOKEN = `pmfa_pt_${'A'.repeat(94)}` +const PROJECT_TOKEN = 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' function projectProfiles() { const config: ProfileConfig = { version: 2, diff --git a/test/developer/client.test.ts b/test/developer/client.test.ts index 6abdfa6c..3c32e6c2 100644 --- a/test/developer/client.test.ts +++ b/test/developer/client.test.ts @@ -11,8 +11,7 @@ describe('createDeveloperSession', () => { ) const session = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, }, @@ -28,11 +27,10 @@ describe('createDeveloperSession', () => { expect(loadLinkedProject).not.toHaveBeenCalled() }) - test('creates an immutable project view from an organization key', async () => { + test('creates an immutable project view from an team key', async () => { const session = await withEnvironment( { - POLYMORFA_API_KEY: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_API_KEY: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', POLYMORFA_CLIENT_TOKEN: undefined, POLYMORFA_PROJECT_TOKEN: undefined, }, @@ -58,8 +56,7 @@ describe('createDeveloperSession', () => { { POLYMORFA_API_KEY: undefined, POLYMORFA_CLIENT_TOKEN: undefined, - POLYMORFA_PROJECT_TOKEN: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + POLYMORFA_PROJECT_TOKEN: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, () => createDeveloperSession({ diff --git a/test/fixtures/machine-credentials-v1.json b/test/fixtures/machine-credentials-v1.json new file mode 100644 index 00000000..a40eb086 --- /dev/null +++ b/test/fixtures/machine-credentials-v1.json @@ -0,0 +1,516 @@ +{ + "testOnlySeedHex": "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", + "now": 1792195200000, + "key": { + "kid": "mc1", + "purpose": "machine-credentials", + "algorithm": "Ed25519", + "activatesAt": 0, + "retiresAt": null, + "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEA11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo=\n-----END PUBLIC KEY-----\n" + }, + "context": { + "environment": "test", + "issuer": "https://platform.example.test", + "audience": "polymorfa-api" + }, + "formatRevision": 1, + "crcAlgorithm": "CRC-32/ISO-HDLC", + "kidRegistry": [ + { + "kid": "mc1", + "environment": "test" + } + ], + "opaque": [ + { + "name": "key", + "kind": "key", + "environment": "test", + "secretHex": "000102030405060708090a0b0c0d0e0f10111213", + "checksumHex": "3bddffa4", + "body": "AAECAwQFBgcICQoLDA0ODxAREhM73f-k", + "token": "pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k", + "tokenLength": 37, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e6f70617175652e7368613235360074657374006b657900000102030405060708090a0b0c0d0e0f10111213", + "tokenHashHex": "6e10862b045a45183f5173969a2f5aa7cb93841ddbda52f32e4c55a9b3a9dded" + }, + { + "name": "project", + "kind": "project", + "environment": "test", + "secretHex": "000102030405060708090a0b0c0d0e0f10111213", + "checksumHex": "3bddffa4", + "body": "AAECAwQFBgcICQoLDA0ODxAREhM73f-k", + "token": "pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k", + "tokenLength": 40, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e6f70617175652e73686132353600746573740070726f6a65637400000102030405060708090a0b0c0d0e0f10111213", + "tokenHashHex": "a69d6a7ca7dc5052993dc6bdb0f7a3483543bc2ca9c4e5cbd265535b6722211a" + } + ], + "client": { + "testOnlySeedHex": "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", + "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEA11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo=\n-----END PUBLIC KEY-----\n", + "keyMetadata": { + "kid": "mc1", + "purpose": "machine-credentials", + "algorithm": "Ed25519", + "activatesAt": 0, + "retiresAt": null, + "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEA11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo=\n-----END PUBLIC KEY-----\n" + }, + "cases": [ + { + "name": "project-issued", + "claims": { + "id": "33333333-3333-4333-8333-333333333333", + "kind": "client", + "issuedAt": 1792195200000, + "ttlSecs": 3600, + "orgId": "44444444-4444-4444-8444-444444444444", + "sessionName": "test-number", + "ephemeralId": "browser", + "issuerKind": "project", + "issuerId": "22222222-2222-4222-8222-222222222222", + "permissionCeiling": "18446744073709551615", + "testNumbersOnly": false + }, + "payloadHex": "01036d633133333333333343338333333333333333000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720122222222222242228222222222222222ffffffffffffffff00", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633133333333333343338333333333333333000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720122222222222242228222222222222222ffffffffffffffff00", + "signatureHex": "535f855c526ae4e6e2a36398271f4d0b72b58ac3d7967b5f0f544809b3567fe3d94b61db836ac404a17814d10c55e66b72e6be50e4cf481bab58bc2bdb50810e", + "token": "pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO", + "tokenLength": 220, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633133333333333343338333333333333333000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720122222222222242228222222222222222ffffffffffffffff00535f855c526ae4e6e2a36398271f4d0b72b58ac3d7967b5f0f544809b3567fe3d94b61db836ac404a17814d10c55e66b72e6be50e4cf481bab58bc2bdb50810e", + "tokenHashHex": "db38b609c61c987c5e4b18d2ccdc990ace4cb9818db503ace80633321b96336d" + }, + { + "name": "project-issued-test-only", + "claims": { + "id": "33333333-3333-4333-8333-333333333333", + "kind": "client", + "issuedAt": 1792195200000, + "ttlSecs": 3600, + "orgId": "44444444-4444-4444-8444-444444444444", + "sessionName": "test-number", + "ephemeralId": "browser", + "issuerKind": "project", + "issuerId": "22222222-2222-4222-8222-222222222222", + "permissionCeiling": "18446744073709551615", + "testNumbersOnly": true + }, + "payloadHex": "01036d633133333333333343338333333333333333000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720122222222222242228222222222222222ffffffffffffffff02", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633133333333333343338333333333333333000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720122222222222242228222222222222222ffffffffffffffff02", + "signatureHex": "5ce274c4ee5bb2d9b184e60e02b175988cb38708c7bf80ff667de89d0a31192fb1597cc1cc21be7d907c07295fffe9ed53e02f463b5e0a617333ee77650a1307", + "token": "pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wJc4nTE7luy2bGE5g4CsXWYjLOHCMe_gP9mfeidCjEZL7FZfMHMIb59kHwHKV__6e1T4C9GO14KYXMz7ndlChMH", + "tokenLength": 220, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633133333333333343338333333333333333000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720122222222222242228222222222222222ffffffffffffffff025ce274c4ee5bb2d9b184e60e02b175988cb38708c7bf80ff667de89d0a31192fb1597cc1cc21be7d907c07295fffe9ed53e02f463b5e0a617333ee77650a1307", + "tokenHashHex": "55520a4f87639e29dee3eb478d12b351edefde44639189a151168ddcdfa156a1" + }, + { + "name": "customer", + "claims": { + "id": "55555555-5555-4555-8555-555555555555", + "kind": "client", + "issuedAt": 1792195200000, + "ttlSecs": 3600, + "orgId": "44444444-4444-4444-8444-444444444444", + "sessionName": "", + "ephemeralId": "browser", + "issuerKind": "project", + "issuerId": "22222222-2222-4222-8222-222222222222", + "permissionCeiling": "18446744073709551615", + "customer": { + "customerId": "66666666-6666-4666-8666-666666666666", + "sessionIds": [ + "77777777-7777-4777-8777-777777777777" + ], + "allowMask": 7 + }, + "testNumbersOnly": false + }, + "payloadHex": "01036d633155555555555545558555555555555555000001a14728840000000e1044444444444444448444444444444444000762726f777365720122222222222242228222222222222222ffffffffffffffff016666666666664666866666666666666601777777777777477787777777777777770007", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633155555555555545558555555555555555000001a14728840000000e1044444444444444448444444444444444000762726f777365720122222222222242228222222222222222ffffffffffffffff016666666666664666866666666666666601777777777777477787777777777777770007", + "signatureHex": "bd2e4c8303f04927cca6040c238913faeb09a6fe824c18179f5d4f6c724e5a51e76c1e16783b099a85214706b9144ef98928a45bd3ad55b054460f138890a50b", + "token": "pmfa_ct_AQNtYzFVVVVVVVVFVYVVVVVVVVVVAAABoUcohAAAAA4QRERERERERESERERERERERAAHYnJvd3NlcgEiIiIiIiJCIoIiIiIiIiIi__________8BZmZmZmZmRmaGZmZmZmZmZgF3d3d3d3dHd4d3d3d3d3d3AAe9LkyDA_BJJ8ymBAwjiRP66wmm_oJMGBefXU9sck5aUedsHhZ4OwmahSFHBrkUTvmJKKRb061VsFRGDxOIkKUL", + "tokenLength": 252, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633155555555555545558555555555555555000001a14728840000000e1044444444444444448444444444444444000762726f777365720122222222222242228222222222222222ffffffffffffffff016666666666664666866666666666666601777777777777477787777777777777770007bd2e4c8303f04927cca6040c238913faeb09a6fe824c18179f5d4f6c724e5a51e76c1e16783b099a85214706b9144ef98928a45bd3ad55b054460f138890a50b", + "tokenHashHex": "0f5aeca52b39e6321f1d98cf8729c10f9f5339ed31342dc525e4a58a198c72dd" + }, + { + "name": "customer-test-only", + "claims": { + "id": "55555555-5555-4555-8555-555555555555", + "kind": "client", + "issuedAt": 1792195200000, + "ttlSecs": 3600, + "orgId": "44444444-4444-4444-8444-444444444444", + "sessionName": "", + "ephemeralId": "browser", + "issuerKind": "project", + "issuerId": "22222222-2222-4222-8222-222222222222", + "permissionCeiling": "18446744073709551615", + "customer": { + "customerId": "66666666-6666-4666-8666-666666666666", + "sessionIds": [ + "77777777-7777-4777-8777-777777777777" + ], + "allowMask": 7 + }, + "testNumbersOnly": true + }, + "payloadHex": "01036d633155555555555545558555555555555555000001a14728840000000e1044444444444444448444444444444444000762726f777365720122222222222242228222222222222222ffffffffffffffff036666666666664666866666666666666601777777777777477787777777777777770007", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633155555555555545558555555555555555000001a14728840000000e1044444444444444448444444444444444000762726f777365720122222222222242228222222222222222ffffffffffffffff036666666666664666866666666666666601777777777777477787777777777777770007", + "signatureHex": "00bc981be2745c7b8339e2c7421ec6d5efcb3044257a5c626755f6ade8c936f92a500c3ebf6ec09cf0d889b66819c399b0a9ab78dfa082899618d88c0ad6170a", + "token": "pmfa_ct_AQNtYzFVVVVVVVVFVYVVVVVVVVVVAAABoUcohAAAAA4QRERERERERESERERERERERAAHYnJvd3NlcgEiIiIiIiJCIoIiIiIiIiIi__________8DZmZmZmZmRmaGZmZmZmZmZgF3d3d3d3dHd4d3d3d3d3d3AAcAvJgb4nRce4M54sdCHsbV78swRCV6XGJnVfat6Mk2-SpQDD6_bsCc8NiJtmgZw5mwqat436CCiZYY2IwK1hcK", + "tokenLength": 252, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633155555555555545558555555555555555000001a14728840000000e1044444444444444448444444444444444000762726f777365720122222222222242228222222222222222ffffffffffffffff03666666666666466686666666666666660177777777777747778777777777777777000700bc981be2745c7b8339e2c7421ec6d5efcb3044257a5c626755f6ade8c936f92a500c3ebf6ec09cf0d889b66819c399b0a9ab78dfa082899618d88c0ad6170a", + "tokenHashHex": "bbb27eea340d8119e42bf6ccc27d527bd001898abac562fdc309f38a64acb586" + }, + { + "name": "human", + "claims": { + "id": "88888888-8888-4888-8888-888888888888", + "kind": "client", + "issuedAt": 1792195200000, + "ttlSecs": 3600, + "orgId": "44444444-4444-4444-8444-444444444444", + "sessionName": "test-number", + "ephemeralId": "browser", + "issuerKind": "human", + "issuerId": "user-test", + "permissionCeiling": "18446744073709551615", + "userId": "user-test", + "sessionId": "session-test", + "region": "br", + "testNumbersOnly": false + }, + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff000c73657373696f6e2d74657374026272", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff000c73657373696f6e2d74657374026272", + "signatureHex": "b0867675c35f9931c4ee48935f880eecc70966bbdc942c02d98588d565bbc09076a397209a8e3377062699d010bb1dab6ccb31021258afd4abedba19887c5f02", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyAgl1c2VyLXRlc3T__________wAMc2Vzc2lvbi10ZXN0AmJysIZ2dcNfmTHE7kiTX4gO7McJZrvclCwC2YWI1WW7wJB2o5cgmo4zdwYmmdAQux2rbMsxAhJYr9Sr7boZiHxfAg", + "tokenLength": 234, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff000c73657373696f6e2d74657374026272b0867675c35f9931c4ee48935f880eecc70966bbdc942c02d98588d565bbc09076a397209a8e3377062699d010bb1dab6ccb31021258afd4abedba19887c5f02", + "tokenHashHex": "04bc4b1681f7464cdb9cc73c39bf1f85fe0699f03e480872b540078e5719e624" + }, + { + "name": "human-test-only", + "claims": { + "id": "88888888-8888-4888-8888-888888888888", + "kind": "client", + "issuedAt": 1792195200000, + "ttlSecs": 3600, + "orgId": "44444444-4444-4444-8444-444444444444", + "sessionName": "test-number", + "ephemeralId": "browser", + "issuerKind": "human", + "issuerId": "user-test", + "permissionCeiling": "18446744073709551615", + "userId": "user-test", + "sessionId": "session-test", + "region": "br", + "testNumbersOnly": true + }, + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff020c73657373696f6e2d74657374026272", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff020c73657373696f6e2d74657374026272", + "signatureHex": "cc9840f3dcacc013a31ad88e0fbe30b3d49ac9823e1e8b9e8ea0f4d95426a0c63eb0b50e7a4a65b3a49f1c21231802b0f8d338879232a22f45d44d3220e7810d", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyAgl1c2VyLXRlc3T__________wIMc2Vzc2lvbi10ZXN0AmJyzJhA89yswBOjGtiOD74ws9SayYI-HouejqD02VQmoMY-sLUOekpls6SfHCEjGAKw-NM4h5Iyoi9F1E0yIOeBDQ", + "tokenLength": 234, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff020c73657373696f6e2d74657374026272cc9840f3dcacc013a31ad88e0fbe30b3d49ac9823e1e8b9e8ea0f4d95426a0c63eb0b50e7a4a65b3a49f1c21231802b0f8d338879232a22f45d44d3220e7810d", + "tokenHashHex": "1c80f128a7dbc9fef87b4917eae8f14cef960b8c0d9a18c8f6da28e98f39f573" + }, + { + "name": "console-www", + "claims": { + "id": "88888888-8888-4888-8888-888888888888", + "kind": "client", + "issuedAt": 1792195200000, + "ttlSecs": 3600, + "orgId": "44444444-4444-4444-8444-444444444444", + "sessionName": "test-number", + "ephemeralId": "browser", + "issuerKind": "human", + "issuerId": "user-test", + "permissionCeiling": "18446744073709551615", + "userId": "user-test", + "sessionId": "session-test", + "region": "br", + "testNumbersOnly": false, + "console": { + "projectId": "22222222-2222-4222-8222-222222222222", + "sessionIds": [ + "77777777-7777-4777-8777-777777777777" + ], + "origin": "https://www.polymorfa.com" + } + }, + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d", + "signatureHex": "4261a093bf65fc5e340121a9ecfa87251faaa6d380d734777f87d88a5e2fb2700213943622205b15a85a9593a49f50ca37a410df7f7dd6f6d6a3a1c27c487c0c", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyAgl1c2VyLXRlc3T__________wQMc2Vzc2lvbi10ZXN0AmJyIiIiIiIiQiKCIiIiIiIiIgF3d3d3d3dHd4d3d3d3d3d3GWh0dHBzOi8vd3d3LnBvbHltb3JmYS5jb21CYaCTv2X8XjQBIans-oclH6qm04DXNHd_h9iKXi-ycAITlDYiIFsVqFqVk6SfUMo3pBDff33W9tajocJ8SHwM", + "tokenLength": 312, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d4261a093bf65fc5e340121a9ecfa87251faaa6d380d734777f87d88a5e2fb2700213943622205b15a85a9593a49f50ca37a410df7f7dd6f6d6a3a1c27c487c0c", + "tokenHashHex": "fc0a354da098db2d4459889a3d615956d30adb9c6fc907bebb9ce89791540568" + }, + { + "name": "console-www-test-only", + "claims": { + "id": "88888888-8888-4888-8888-888888888888", + "kind": "client", + "issuedAt": 1792195200000, + "ttlSecs": 3600, + "orgId": "44444444-4444-4444-8444-444444444444", + "sessionName": "test-number", + "ephemeralId": "browser", + "issuerKind": "human", + "issuerId": "user-test", + "permissionCeiling": "18446744073709551615", + "userId": "user-test", + "sessionId": "session-test", + "region": "br", + "testNumbersOnly": true, + "console": { + "projectId": "22222222-2222-4222-8222-222222222222", + "sessionIds": [ + "77777777-7777-4777-8777-777777777777" + ], + "origin": "https://www.polymorfa.com" + } + }, + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff060c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff060c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d", + "signatureHex": "eb726490d835ac4fb9f9757d176b4a87368eff119b788ae23f0ede3ed41ffce6c85d4d49da8f369e3d02940bff3379f367206f1d62d2e1afb38efab3c7daa00a", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyAgl1c2VyLXRlc3T__________wYMc2Vzc2lvbi10ZXN0AmJyIiIiIiIiQiKCIiIiIiIiIgF3d3d3d3dHd4d3d3d3d3d3GWh0dHBzOi8vd3d3LnBvbHltb3JmYS5jb23rcmSQ2DWsT7n5dX0Xa0qHNo7_EZt4iuI_Dt4-1B_85shdTUnajzaePQKUC_8zefNnIG8dYtLhr7OO-rPH2qAK", + "tokenLength": 312, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff060c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6deb726490d835ac4fb9f9757d176b4a87368eff119b788ae23f0ede3ed41ffce6c85d4d49da8f369e3d02940bff3379f367206f1d62d2e1afb38efab3c7daa00a", + "tokenHashHex": "8335b2391c91ef7cbf99eb9cc6762fc9fcd267724c4c46037d162b183c19c0ee" + }, + { + "name": "console-docs-all-blocks", + "claims": { + "id": "88888888-8888-4888-8888-888888888888", + "kind": "client", + "issuedAt": 1792195200000, + "ttlSecs": 3600, + "orgId": "44444444-4444-4444-8444-444444444444", + "sessionName": "", + "ephemeralId": "browser", + "issuerKind": "human", + "issuerId": "user-test", + "permissionCeiling": "18446744073709551615", + "userId": "user-test", + "sessionId": "session-test", + "region": "br", + "testNumbersOnly": false, + "customer": { + "customerId": "66666666-6666-4666-8666-666666666666", + "sessionIds": [ + "77777777-7777-4777-8777-777777777777" + ], + "allowMask": 7 + }, + "console": { + "projectId": "22222222-2222-4222-8222-222222222222", + "sessionIds": [ + "77777777-7777-4777-8777-777777777777" + ], + "origin": "https://docs.polymorfa.com" + } + }, + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e1044444444444444448444444444444444000762726f777365720209757365722d74657374ffffffffffffffff0566666666666646668666666666666666017777777777774777877777777777777700070c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771a68747470733a2f2f646f63732e706f6c796d6f7266612e636f6d", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e1044444444444444448444444444444444000762726f777365720209757365722d74657374ffffffffffffffff0566666666666646668666666666666666017777777777774777877777777777777700070c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771a68747470733a2f2f646f63732e706f6c796d6f7266612e636f6d", + "signatureHex": "4a441052fba43e67ec4b7a8357d4a5ce9ea3d381db745536158f0c71766ae26eba08c7e1d4886e312e60b983ffd8231fdea8a6de5b3689347f87fed1248f6805", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAAHYnJvd3NlcgIJdXNlci10ZXN0__________8FZmZmZmZmRmaGZmZmZmZmZgF3d3d3d3dHd4d3d3d3d3d3AAcMc2Vzc2lvbi10ZXN0AmJyIiIiIiIiQiKCIiIiIiIiIgF3d3d3d3dHd4d3d3d3d3d3Gmh0dHBzOi8vZG9jcy5wb2x5bW9yZmEuY29tSkQQUvukPmfsS3qDV9Slzp6j04HbdFU2FY8McXZq4m66CMfh1IhuMS5guYP_2CMf3qim3ls2iTR_h_7RJI9oBQ", + "tokenLength": 346, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e1044444444444444448444444444444444000762726f777365720209757365722d74657374ffffffffffffffff0566666666666646668666666666666666017777777777774777877777777777777700070c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771a68747470733a2f2f646f63732e706f6c796d6f7266612e636f6d4a441052fba43e67ec4b7a8357d4a5ce9ea3d381db745536158f0c71766ae26eba08c7e1d4886e312e60b983ffd8231fdea8a6de5b3689347f87fed1248f6805", + "tokenHashHex": "21f27fd09e9eed68d910122e1c06f3a54a0c8018c6d7262f4ec89e2be1f94bfd" + }, + { + "name": "console-docs-all-blocks-test-only", + "claims": { + "id": "88888888-8888-4888-8888-888888888888", + "kind": "client", + "issuedAt": 1792195200000, + "ttlSecs": 3600, + "orgId": "44444444-4444-4444-8444-444444444444", + "sessionName": "", + "ephemeralId": "browser", + "issuerKind": "human", + "issuerId": "user-test", + "permissionCeiling": "18446744073709551615", + "userId": "user-test", + "sessionId": "session-test", + "region": "br", + "testNumbersOnly": true, + "customer": { + "customerId": "66666666-6666-4666-8666-666666666666", + "sessionIds": [ + "77777777-7777-4777-8777-777777777777" + ], + "allowMask": 7 + }, + "console": { + "projectId": "22222222-2222-4222-8222-222222222222", + "sessionIds": [ + "77777777-7777-4777-8777-777777777777" + ], + "origin": "https://docs.polymorfa.com" + } + }, + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e1044444444444444448444444444444444000762726f777365720209757365722d74657374ffffffffffffffff0766666666666646668666666666666666017777777777774777877777777777777700070c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771a68747470733a2f2f646f63732e706f6c796d6f7266612e636f6d", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e1044444444444444448444444444444444000762726f777365720209757365722d74657374ffffffffffffffff0766666666666646668666666666666666017777777777774777877777777777777700070c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771a68747470733a2f2f646f63732e706f6c796d6f7266612e636f6d", + "signatureHex": "8d06f148b2405d1b8d4e36d5f48fa1dd04bf1f8800c52f6bfeb3ae9ba78d240178b4a4bf2c40cb0d275173f7eef578854e6de5a26a4905bcd0e8e9996c8e8a0e", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAAHYnJvd3NlcgIJdXNlci10ZXN0__________8HZmZmZmZmRmaGZmZmZmZmZgF3d3d3d3dHd4d3d3d3d3d3AAcMc2Vzc2lvbi10ZXN0AmJyIiIiIiIiQiKCIiIiIiIiIgF3d3d3d3dHd4d3d3d3d3d3Gmh0dHBzOi8vZG9jcy5wb2x5bW9yZmEuY29tjQbxSLJAXRuNTjbV9I-h3QS_H4gAxS9r_rOum6eNJAF4tKS_LEDLDSdRc_fu9XiFTm3lompJBbzQ6OmZbI6KDg", + "tokenLength": 346, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e1044444444444444448444444444444444000762726f777365720209757365722d74657374ffffffffffffffff0766666666666646668666666666666666017777777777774777877777777777777700070c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771a68747470733a2f2f646f63732e706f6c796d6f7266612e636f6d8d06f148b2405d1b8d4e36d5f48fa1dd04bf1f8800c52f6bfeb3ae9ba78d240178b4a4bf2c40cb0d275173f7eef578854e6de5a26a4905bcd0e8e9996c8e8a0e", + "tokenHashHex": "1c028f72d26f22febf7ac15087c6bcdcf508d534e753d55927eab7fd6951ccfc" + } + ], + "rejections": [ + { + "name": "console-count-0", + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222200777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222200777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d", + "signatureHex": "1f79ff8699e78ae6644dd0d4fdbb080064028fb9cca75fdadbbd3f1133e145de46452b154995f6ca94831a6fb46602330965d5af8b46be22159a594e5f9dcb0c", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyAgl1c2VyLXRlc3T__________wQMc2Vzc2lvbi10ZXN0AmJyIiIiIiIiQiKCIiIiIiIiIgB3d3d3d3dHd4d3d3d3d3d3GWh0dHBzOi8vd3d3LnBvbHltb3JmYS5jb20fef-GmeeK5mRN0NT9uwgAZAKPucynX9rbvT8RM-FF3kZFKxVJlfbKlIMab7RmAjMJZdWvi0a-IhWaWU5fncsM", + "tokenLength": 312, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222200777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d1f79ff8699e78ae6644dd0d4fdbb080064028fb9cca75fdadbbd3f1133e145de46452b154995f6ca94831a6fb46602330965d5af8b46be22159a594e5f9dcb0c", + "tokenHashHex": "2774cd35e2a8a89ab704f6d1facdd3370b7ac27f6d8714733d45717a51a42d65", + "expectedError": "invalid credential" + }, + { + "name": "console-count-65", + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222241777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222241777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d", + "signatureHex": "db4d67537cfd9dd4337f788c3b8737324864950c6b35c1db2cffbda3f59b86475a58d1c7b6a8938d106595a67fa5224b16b993df3031976c1db15d0da3ec0a0c", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyAgl1c2VyLXRlc3T__________wQMc2Vzc2lvbi10ZXN0AmJyIiIiIiIiQiKCIiIiIiIiIkF3d3d3d3dHd4d3d3d3d3d3GWh0dHBzOi8vd3d3LnBvbHltb3JmYS5jb23bTWdTfP2d1DN_eIw7hzcySGSVDGs1wdss_72j9ZuGR1pY0ce2qJONEGWVpn-lIksWuZPfMDGXbB2xXQ2j7AoM", + "tokenLength": 312, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222241777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6ddb4d67537cfd9dd4337f788c3b8737324864950c6b35c1db2cffbda3f59b86475a58d1c7b6a8938d106595a67fa5224b16b993df3031976c1db15d0da3ec0a0c", + "tokenHashHex": "7fc5152457aa110d956187f119521a8372a2c5a3eb0a65f00c1ede1e002dfaf4", + "expectedError": "invalid credential" + }, + { + "name": "console-duplicate", + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d74657374026272222222222222422282222222222222220277777777777747778777777777777777777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d74657374026272222222222222422282222222222222220277777777777747778777777777777777777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d", + "signatureHex": "45f4fcf4fb03089132977e9ed3775c7671f6065423b2e490f198690593b9edd3901664ddceb7daa455c150ed272f30ed65f67317b4f4c6c53582aa8b19a1af0b", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyAgl1c2VyLXRlc3T__________wQMc2Vzc2lvbi10ZXN0AmJyIiIiIiIiQiKCIiIiIiIiIgJ3d3d3d3dHd4d3d3d3d3d3d3d3d3d3R3eHd3d3d3d3dxlodHRwczovL3d3dy5wb2x5bW9yZmEuY29tRfT89PsDCJEyl36e03dcdnH2BlQjsuSQ8ZhpBZO57dOQFmTdzrfapFXBUO0nLzDtZfZzF7T0xsU1gqqLGaGvCw", + "tokenLength": 334, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d74657374026272222222222222422282222222222222220277777777777747778777777777777777777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d45f4fcf4fb03089132977e9ed3775c7671f6065423b2e490f198690593b9edd3901664ddceb7daa455c150ed272f30ed65f67317b4f4c6c53582aa8b19a1af0b", + "tokenHashHex": "8a342e88bf10e6e0934184ddc44a59af81715e7a89be5a0da275c076097909ad", + "expectedError": "invalid credential" + }, + { + "name": "console-unsorted", + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d74657374026272222222222222422282222222222222220288888888888848888888888888888888777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d74657374026272222222222222422282222222222222220288888888888848888888888888888888777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d", + "signatureHex": "1b9dd31b3175075c6bd62b0465a5c0f5c8ea116875d0961640b9ceed1d2f59db55bfbc86397c8606154e32aa60dd9f58d03a97e8b9cfd0c368b72374a31d2b0d", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyAgl1c2VyLXRlc3T__________wQMc2Vzc2lvbi10ZXN0AmJyIiIiIiIiQiKCIiIiIiIiIgKIiIiIiIhIiIiIiIiIiIiId3d3d3d3R3eHd3d3d3d3dxlodHRwczovL3d3dy5wb2x5bW9yZmEuY29tG53TGzF1B1xr1isEZaXA9cjqEWh10JYWQLnO7R0vWdtVv7yGOXyGBhVOMqpg3Z9Y0DqX6LnP0MNotyN0ox0rDQ", + "tokenLength": 334, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d74657374026272222222222222422282222222222222220288888888888848888888888888888888777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d1b9dd31b3175075c6bd62b0465a5c0f5c8ea116875d0961640b9ceed1d2f59db55bfbc86397c8606154e32aa60dd9f58d03a97e8b9cfd0c368b72374a31d2b0d", + "tokenHashHex": "05325595cd10d34deb5f567fdec1df8e54985605910f2ed80d8397534e9f7e0d", + "expectedError": "invalid credential" + }, + { + "name": "console-origin-https://attacker.example", + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771868747470733a2f2f61747461636b65722e6578616d706c65", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771868747470733a2f2f61747461636b65722e6578616d706c65", + "signatureHex": "d01f216ff2b4b6751a9290ae03af64c15a0403b6cee01fa3013b5e5f2ee8ebaed2ed05daa01f6c2e31c25ea1391a148a93cfa69f046a560842b18ccd1be1f401", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyAgl1c2VyLXRlc3T__________wQMc2Vzc2lvbi10ZXN0AmJyIiIiIiIiQiKCIiIiIiIiIgF3d3d3d3dHd4d3d3d3d3d3GGh0dHBzOi8vYXR0YWNrZXIuZXhhbXBsZdAfIW_ytLZ1GpKQrgOvZMFaBAO2zuAfowE7Xl8u6Ouu0u0F2qAfbC4xwl6hORoUipPPpp8EalYIQrGMzRvh9AE", + "tokenLength": 311, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771868747470733a2f2f61747461636b65722e6578616d706c65d01f216ff2b4b6751a9290ae03af64c15a0403b6cee01fa3013b5e5f2ee8ebaed2ed05daa01f6c2e31c25ea1391a148a93cfa69f046a560842b18ccd1be1f401", + "tokenHashHex": "3595e0a875fc25aa193924b14eaf05365419732bf86f891af7b28a4e27616205", + "expectedError": "invalid credential" + }, + { + "name": "console-origin-https://www.polymorfa.com/", + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771a68747470733a2f2f7777772e706f6c796d6f7266612e636f6d2f", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771a68747470733a2f2f7777772e706f6c796d6f7266612e636f6d2f", + "signatureHex": "caad7224806615ad2b7bbcb8a84411dbbdd9d1d77d6ea1926a0ed43a97b12b12d3b46ca630a0531af131b685c8d9a1ba7d0e001478aed2f8c2bfd93c184b9904", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyAgl1c2VyLXRlc3T__________wQMc2Vzc2lvbi10ZXN0AmJyIiIiIiIiQiKCIiIiIiIiIgF3d3d3d3dHd4d3d3d3d3d3Gmh0dHBzOi8vd3d3LnBvbHltb3JmYS5jb20vyq1yJIBmFa0re7y4qEQR273Z0dd9bqGSag7UOpexKxLTtGymMKBTGvExtoXI2aG6fQ4AFHiu0vjCv9k8GEuZBA", + "tokenLength": 314, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771a68747470733a2f2f7777772e706f6c796d6f7266612e636f6d2fcaad7224806615ad2b7bbcb8a84411dbbdd9d1d77d6ea1926a0ed43a97b12b12d3b46ca630a0531af131b685c8d9a1ba7d0e001478aed2f8c2bfd93c184b9904", + "tokenHashHex": "878a52987e8403584b34f31fa5266188b643bee112a592ae21d0f4610d2c7787", + "expectedError": "invalid credential" + }, + { + "name": "console-origin-https://www.polymorfa.com.attacker.example", + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777772a68747470733a2f2f7777772e706f6c796d6f7266612e636f6d2e61747461636b65722e6578616d706c65", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777772a68747470733a2f2f7777772e706f6c796d6f7266612e636f6d2e61747461636b65722e6578616d706c65", + "signatureHex": "333b1efcb02c44c019ec3447c89ad23b8bc7eb0674d588295daa37da59aad3641affdc76a96f8e225306b845a20763f9276f0944d8a4d81123531f3fd2e51400", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyAgl1c2VyLXRlc3T__________wQMc2Vzc2lvbi10ZXN0AmJyIiIiIiIiQiKCIiIiIiIiIgF3d3d3d3dHd4d3d3d3d3d3Kmh0dHBzOi8vd3d3LnBvbHltb3JmYS5jb20uYXR0YWNrZXIuZXhhbXBsZTM7HvywLETAGew0R8ia0juLx-sGdNWIKV2qN9pZqtNkGv_cdqlvjiJTBrhFogdj-SdvCUTYpNgRI1MfP9LlFAA", + "tokenLength": 335, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777772a68747470733a2f2f7777772e706f6c796d6f7266612e636f6d2e61747461636b65722e6578616d706c65333b1efcb02c44c019ec3447c89ad23b8bc7eb0674d588295daa37da59aad3641affdc76a96f8e225306b845a20763f9276f0944d8a4d81123531f3fd2e51400", + "tokenHashHex": "0c77d7ec6d79df1abebd939565a4032640f1b2153d08ccec9950fc093f5e30cb", + "expectedError": "invalid credential" + }, + { + "name": "console-nil-project", + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262720000000000000000000000000000000001777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262720000000000000000000000000000000001777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d", + "signatureHex": "9e0f685a33f24c0baa9debcf0c26a6bca09d8ad4337e831c761bd3e832ba916a81db22a478acf4a301a79d977a06baf707a95ca3ac476b5b16fabee19a9ad90f", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyAgl1c2VyLXRlc3T__________wQMc2Vzc2lvbi10ZXN0AmJyAAAAAAAAAAAAAAAAAAAAAAF3d3d3d3dHd4d3d3d3d3d3GWh0dHBzOi8vd3d3LnBvbHltb3JmYS5jb22eD2haM_JMC6qd688MJqa8oJ2K1DN-gxx2G9PoMrqRaoHbIqR4rPSjAaedl3oGuvcHqVyjrEdrWxb6vuGamtkP", + "tokenLength": 312, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262720000000000000000000000000000000001777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d9e0f685a33f24c0baa9debcf0c26a6bca09d8ad4337e831c761bd3e832ba916a81db22a478acf4a301a79d977a06baf707a95ca3ac476b5b16fabee19a9ad90f", + "tokenHashHex": "04f462708a86aede99364862e9b88e8d12e21f645db989447e639f893f0873e9", + "expectedError": "invalid credential" + }, + { + "name": "console-truncated", + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f", + "signatureHex": "7b2093c293eb5821490a4014f80e91c1a05ba16a6085345f8a10a07925c59c4a020848865a9da8724220e1570ae317c11f978b1ef8cc21979450931e8f64430e", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyAgl1c2VyLXRlc3T__________wQMc2Vzc2lvbi10ZXN0AmJyIiIiIiIiQiKCIiIiIiIiIgF3d3d3d3dHd4d3d3d3d3d3GWh0dHBzOi8vd3d3LnBvbHltb3JmYS5jb3sgk8KT61ghSQpAFPgOkcGgW6FqYIU0X4oQoHklxZxKAghIhlqdqHJCIOFXCuMXwR-Xix74zCGXlFCTHo9kQw4", + "tokenLength": 311, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f7b2093c293eb5821490a4014f80e91c1a05ba16a6085345f8a10a07925c59c4a020848865a9da8724220e1570ae317c11f978b1ef8cc21979450931e8f64430e", + "tokenHashHex": "89622c7897d7cf30c4a6881278fecc484dba8e546485f36e812cee127022022f", + "expectedError": "invalid credential" + }, + { + "name": "console-trailing", + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d00", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d00", + "signatureHex": "e703ca91e8a33515d7ec3dcff0fe4c851a2d52ac107b928217afcd8279e2e382d0c32a6a2da8017f7e12fbb7e427c8efb344330b245820bd563bd2d56f122609", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyAgl1c2VyLXRlc3T__________wQMc2Vzc2lvbi10ZXN0AmJyIiIiIiIiQiKCIiIiIiIiIgF3d3d3d3dHd4d3d3d3d3d3GWh0dHBzOi8vd3d3LnBvbHltb3JmYS5jb20A5wPKkeijNRXX7D3P8P5MhRotUqwQe5KCF6_Ngnni44LQwypqLagBf34S-7fkJ8jvs0QzCyRYIL1WO9LVbxImCQ", + "tokenLength": 314, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff040c73657373696f6e2d746573740262722222222222224222822222222222222201777777777777477787777777777777771968747470733a2f2f7777772e706f6c796d6f7266612e636f6d00e703ca91e8a33515d7ec3dcff0fe4c851a2d52ac107b928217afcd8279e2e382d0c32a6a2da8017f7e12fbb7e427c8efb344330b245820bd563bd2d56f122609", + "tokenHashHex": "890e6f274f2aac3dc264ab06aec9d47ca29e75c3b1c9f9cc8f3dc492c77cf0b5", + "expectedError": "invalid credential" + }, + { + "name": "reserved-bit3", + "payloadHex": "01036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff080c73657373696f6e2d74657374026272", + "signedInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e456432353531392e636c69656e7400746573740068747470733a2f2f706c6174666f726d2e6578616d706c652e7465737400706f6c796d6f7266612d6170690001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff080c73657373696f6e2d74657374026272", + "signatureHex": "d0bfcd42444d91414a2c554e74e71ec1967218817a6890a7d5b08f3e16a8bb8f17f13392b415350de50995fb078720423fcb8289398c40f060b400354bb7c209", + "token": "pmfa_ct_AQNtYzGIiIiIiIhIiIiIiIiIiIiIAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyAgl1c2VyLXRlc3T__________wgMc2Vzc2lvbi10ZXN0AmJy0L_NQkRNkUFKLFVOdOcewZZyGIF6aJCn1bCPPhaou48X8TOStBU1DeUJlfsHhyBCP8uCiTmMQPBgtAA1S7fCCQ", + "tokenLength": 234, + "fingerprintInputHex": "706f6c796d6f7266612e6d616368696e652d63726564656e7469616c732e76312e686173682e636c69656e740001036d633188888888888848888888888888888888000001a14728840000000e10444444444444444484444444444444440b746573742d6e756d6265720762726f777365720209757365722d74657374ffffffffffffffff080c73657373696f6e2d74657374026272d0bfcd42444d91414a2c554e74e71ec1967218817a6890a7d5b08f3e16a8bb8f17f13392b415350de50995fb078720423fcb8289398c40f060b400354bb7c209", + "tokenHashHex": "88ece95bd41718f55c0a73337dbd82077e48eb7cec9e453cc0f13cf08c941d29", + "expectedError": "invalid credential" + } + ] + }, + "negative": [ + { + "name": "test-client-against-live-number", + "operation": "authorize-number", + "input": { + "clientCase": "project-issued-test-only", + "numberTestMode": false + }, + "expectedError": "forbidden" + }, + { + "name": "test-client-unknown-number-mode", + "operation": "authorize-number", + "input": { + "clientCase": "project-issued-test-only", + "numberTestMode": null + }, + "expectedError": "forbidden" + } + ], + "consoleOrigins": [ + "https://www.polymorfa.com", + "https://docs.polymorfa.com" + ] +} diff --git a/test/input/stdin.test.ts b/test/input/stdin.test.ts index abaa3e46..5e691800 100644 --- a/test/input/stdin.test.ts +++ b/test/input/stdin.test.ts @@ -7,13 +7,9 @@ describe('readSecretFromStdin', () => { test('reads one trimmed secret without returning extra input', async () => { await expect( readSecretFromStdin( - Readable.from([ - ' pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n', - ]), + Readable.from([' pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k\n']), ), - ).resolves.toBe( - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', - ) + ).resolves.toBe('pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k') }) test('rejects empty and oversized input', async () => { diff --git a/test/mcp/session-discovery.test.ts b/test/mcp/session-discovery.test.ts index 0c7dcc87..1437f7c2 100644 --- a/test/mcp/session-discovery.test.ts +++ b/test/mcp/session-discovery.test.ts @@ -8,7 +8,7 @@ import { } from '../helpers/http-server.js' const PROJECT_ID = '11111111-1111-4111-8111-111111111111' -const API_KEY = `pmfa_${'A'.repeat(72)}` +const API_KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' describe('MCP session discovery', () => { let server: TestHttpServer | undefined @@ -79,7 +79,7 @@ describe('MCP session discovery', () => { }, () => listMcpSessions(PROJECT_ID), ), - ).rejects.toThrow('Select only one organization API key') + ).rejects.toThrow('Select only one team key') expect(server.requests).toHaveLength(0) }) }) diff --git a/test/sdk/client.test.ts b/test/sdk/client.test.ts index ef7a8423..fd34fb35 100644 --- a/test/sdk/client.test.ts +++ b/test/sdk/client.test.ts @@ -20,8 +20,7 @@ describe('createRawClient', () => { surface: 'platform', credential: { type: 'apiKey', - value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + value: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, }) @@ -31,7 +30,11 @@ describe('createRawClient', () => { test('returns the public Messaging raw client', () => { const client = createRawClient({ surface: 'messaging', - credential: {type: 'clientToken', value: 'pmfa_ct_browser'}, + credential: { + type: 'clientToken', + value: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', + }, }) expect(client).toBeInstanceOf(RawClient) @@ -41,11 +44,13 @@ describe('createRawClient', () => { expect(() => createRawClient({ surface: 'platform', - credential: {type: 'clientToken', value: 'pmfa_ct_browser'}, + credential: { + type: 'clientToken', + value: + 'pmfa_ct_AQNtYzEzMzMzMzNDM4MzMzMzMzMzAAABoUcohAAAAA4QRERERERERESERERERERERAt0ZXN0LW51bWJlcgdicm93c2VyASIiIiIiIkIigiIiIiIiIiL__________wBTX4VcUmrk5uKjY5gnH00LcrWKw9eWe18PVEgJs1Z_49lLYduDasQEoXgU0QxV5mty5r5Q5M9IG6tYvCvbUIEO', + }, }), - ).toThrow( - 'Client and project tokens cannot be used as organization server API keys.', - ) + ).toThrow('Client and project tokens cannot be used as team keys.') }) test('creates a typed Messaging client with session and operation resources', () => { @@ -53,8 +58,7 @@ describe('createRawClient', () => { surface: 'messaging', credential: { type: 'apiKey', - value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + value: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, timeoutMs: 1234, }) @@ -72,8 +76,7 @@ describe('createRawClient', () => { const client = createMessagingClient({ credential: { type: 'projectToken', - value: - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + value: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, surface: 'messaging', }) @@ -87,8 +90,7 @@ describe('createRawClient', () => { surface: 'platform', credential: { type: 'apiKey', - value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + value: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, }) @@ -110,8 +112,7 @@ describe('createRawClient', () => { surface: 'messaging', credential: { type: 'apiKey', - value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + value: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, }), ).toThrow('requires the Platform API surface') @@ -127,8 +128,7 @@ describe('createRawClient', () => { baseUrl: server.baseUrl, credential: { type: 'apiKey', - value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + value: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, surface: 'platform', }).project('11111111-1111-4111-8111-111111111111') @@ -143,7 +143,7 @@ describe('createRawClient', () => { url: '/platform/projects/11111111-1111-4111-8111-111111111111/events?limit=25', }) expect(server.requests[0]?.headers.authorization).toBe( - 'Bearer pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'Bearer pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', ) } finally { await server.close() diff --git a/test/services/auth.test.ts b/test/services/auth.test.ts index d0501c27..2ac78d4d 100644 --- a/test/services/auth.test.ts +++ b/test/services/auth.test.ts @@ -9,8 +9,7 @@ describe('AuthService', () => { const fixture = createFixture() const result = await fixture.service.login({ - apiKey: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + apiKey: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', profile: 'work', }) @@ -21,7 +20,7 @@ describe('AuthService', () => { }) expect(fixture.credentials.set).toHaveBeenCalledWith( 'profile:work:apiKey', - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', ) expect(fixture.saved()).toEqual({ activeProfile: 'work', @@ -33,17 +32,41 @@ describe('AuthService', () => { version: 2, }) expect(JSON.stringify(fixture.saved())).not.toContain( - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', ) }) + test('delegates checksum checks without fixing credential lengths', async () => { + const fixture = createFixture() + for (const projectToken of [ + 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', + 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh-RJn6K', + ]) { + await expect( + fixture.service.loginProjectToken({ + profile: 'growth', + project: 'project_1', + projectToken, + }), + ).resolves.toMatchObject({credentialKind: 'projectToken'}) + } + vi.mocked(fixture.credentials.set).mockClear() + await expect( + fixture.service.loginProjectToken({ + profile: 'growth', + project: 'project_1', + projectToken: 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-A', + }), + ).rejects.toThrow('canonical pmfa_pt_ opaque format') + expect(fixture.credentials.set).not.toHaveBeenCalled() + }) + test('rejects an invalid profile name before touching secure storage', async () => { const fixture = createFixture() await expect( fixture.service.login({ - apiKey: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + apiKey: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', profile: '../work', }), ).rejects.toThrow('Profile names may contain') @@ -55,13 +78,13 @@ describe('AuthService', () => { await expect( fixture.service.login({apiKey: 'secret', profile: 'work'}), - ).rejects.toThrow('must use the canonical pmfa_ v1 format') + ).rejects.toThrow('must use the canonical pmfa_ opaque format') expect(fixture.credentials.set).not.toHaveBeenCalled() }) test('stores an exact-project token only with explicit project ownership', async () => { const fixture = createFixture() - const token = `pmfa_pt_${'A'.repeat(94)}` + const token = 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' await expect( fixture.service.loginProjectToken({ @@ -88,13 +111,12 @@ describe('AuthService', () => { await fixture.service.loginProjectToken({ profile: 'project', project: 'project_1', - projectToken: - ' pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ', + projectToken: ' pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k ', }) expect(fixture.credentials.set).toHaveBeenCalledWith( 'profile:project:projectToken', - 'pmfa_pt_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', ) await expect( fixture.service.loginProjectToken({ @@ -102,7 +124,7 @@ describe('AuthService', () => { project: 'project_1', projectToken: 'pmfa_pt_', }), - ).rejects.toThrow('canonical pmfa_pt_ v1 format') + ).rejects.toThrow('canonical pmfa_pt_ opaque format') }) test('removes the previous project-token keyring entry after switching a profile to an API key', async () => { @@ -120,12 +142,11 @@ describe('AuthService', () => { version: 2, }) vi.mocked(fixture.credentials.get).mockResolvedValue( - `pmfa_pt_${'A'.repeat(94)}`, + 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', ) await fixture.service.login({ - apiKey: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + apiKey: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', profile: 'work', }) @@ -157,7 +178,7 @@ describe('AuthService', () => { }, version: 2, }) - const oldToken = `pmfa_pt_${'A'.repeat(94)}` + const oldToken = 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' vi.mocked(fixture.credentials.get).mockResolvedValue(oldToken) vi.mocked(fixture.repository.save).mockRejectedValue( new Error('profile save failed'), @@ -165,8 +186,7 @@ describe('AuthService', () => { await expect( fixture.service.login({ - apiKey: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + apiKey: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', profile: 'work', }), ).rejects.toThrow('profile save failed') @@ -216,7 +236,7 @@ describe('AuthService', () => { test('switches the active profile and reports secure credential availability', async () => { const fixture = createFixture(profileConfig()) vi.mocked(fixture.credentials.get).mockResolvedValue( - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', ) await expect(fixture.service.use('work')).resolves.toMatchObject({ @@ -250,7 +270,7 @@ describe('AuthService', () => { version: 2, }) vi.mocked(fixture.credentials.get).mockResolvedValue( - `pmfa_pt_${'A'.repeat(94)}`, + 'pmfa_pt_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', ) await expect(fixture.service.status('project')).resolves.toMatchObject({ diff --git a/test/services/doctor.test.ts b/test/services/doctor.test.ts index 67337e1d..653110b4 100644 --- a/test/services/doctor.test.ts +++ b/test/services/doctor.test.ts @@ -9,8 +9,7 @@ import type {CredentialStore} from '../../src/config/credentials.js' import type {ProfileConfig} from '../../src/config/profiles.js' import {runDoctor, type DoctorDependencies} from '../../src/services/doctor.js' -const KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const config: ProfileConfig = { activeProfile: 'work', profiles: { diff --git a/test/services/groups.test.ts b/test/services/groups.test.ts index 6306df2c..11efc5b8 100644 --- a/test/services/groups.test.ts +++ b/test/services/groups.test.ts @@ -106,8 +106,7 @@ function client(baseUrl: string) { baseUrl, credential: { type: 'apiKey', - value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + value: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, surface: 'messaging', }) diff --git a/test/services/projects.test.ts b/test/services/projects.test.ts index b27158da..972201af 100644 --- a/test/services/projects.test.ts +++ b/test/services/projects.test.ts @@ -17,8 +17,7 @@ import { } from '../../src/context/environment.js' import {ProjectContextService} from '../../src/services/projects.js' -const API_KEY = - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +const API_KEY = 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k' const APP = '11111111-1111-4111-8111-111111111111' const WEB = '22222222-2222-4222-8222-222222222222' diff --git a/test/services/voice.test.ts b/test/services/voice.test.ts index c4d8744a..abd30a89 100644 --- a/test/services/voice.test.ts +++ b/test/services/voice.test.ts @@ -145,8 +145,7 @@ describe('voice transfers', () => { baseUrl: 'https://api.example.test', credential: { type: 'apiKey' as const, - value: - 'pmfa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + value: 'pmfa_AAECAwQFBgcICQoLDA0ODxAREhM73f-k', }, surface: 'platform' as const, ...(timeoutMs === undefined ? {} : {timeoutMs}),