Files
zooqueenandHanzo Dev f717dd89ad keys: the key a user pastes is sk-, not the retired hk-
28 apps told the user to paste an `hk-` key — input placeholders, settings
help text, READMEs, the error thrown when the field is empty — and five of
them validated that paste against /^hk-/ before sending it as a bearer.
Nothing mints that prefix any more: cloud accepts pk- and sk-, IAM mints
sk-. So the guard admitted a credential that authenticates nothing, and the
panel failed later at the gateway with nothing on screen to explain it.

The three leak detectors keep hk- and gain sk-. Salesforce's source scan
and the two Zendesk tests exist to catch a key committed to source or
echoed back through a request; retired keys are still in circulation and
leak exactly as badly, while a detector that only knew hk- would have gone
blind to every key minted from here on.

`sk-` used to be the example of the foreign key the guard screened out — an
OpenAI key. It cannot mean that now, and shape alone cannot tell one
vendor's sk- from another's, so those comments say what the check really
proves and point at the /v1/models call that proves the rest. The three
tests that pinned "sk- is rejected" now pin "hk- is rejected", which is the
invariant that survived.

Verified: 2029 tests pass across the 28 packages; typecheck clean on 25 of
them (hubspot, jupyter and teams fail identically at HEAD on JSX and ESM
type conflicts in files this does not touch); salesforce validate-source
green.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-13 18:07:16 -07:00

37 lines
1.2 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import {
HANZO_API_BASE_URL,
DEFAULT_MODEL,
chatCompletionsURL,
modelsURL,
isHanzoKey,
} from '../src/config';
describe('gateway config', () => {
it('points at api.hanzo.ai with /v1 endpoints (never /api/)', () => {
expect(HANZO_API_BASE_URL).toBe('https://api.hanzo.ai');
expect(chatCompletionsURL()).toBe('https://api.hanzo.ai/v1/chat/completions');
expect(modelsURL()).toBe('https://api.hanzo.ai/v1/models');
expect(chatCompletionsURL()).not.toContain('/api/');
});
it('defaults to a Zen model', () => {
expect(DEFAULT_MODEL).toBe('zen5');
});
});
describe('isHanzoKey', () => {
it('accepts a well-formed sk- key (trimming whitespace)', () => {
expect(isHanzoKey('sk-abcdef0123456789ABCDEF')).toBe(true);
expect(isHanzoKey(' sk-abcdef0123456789ABCDEF ')).toBe(true);
});
it('rejects the wrong prefix, too-short, or non-string', () => {
expect(isHanzoKey('hk-abcdef0123456789ABCDEF')).toBe(false); // the retired prefix
expect(isHanzoKey('sk-short')).toBe(false);
expect(isHanzoKey('')).toBe(false);
expect(isHanzoKey(undefined)).toBe(false);
expect(isHanzoKey(null)).toBe(false);
});
});