test(connector-id): migrate fixtures and assertions to pi-mono ids

Replaces legacy adapter ids (codex_local / claude_local / gemini_local /
claude_compatible) across ~42 test files with pi-mono equivalents:
- codex_local → openai-codex
- claude_local → claude-pro
- gemini_local → gemini-cli
- claude_compatible → anthropic

Hand-rewrites where fixture semantics changed:
- connector-matching: TASK_TYPE_PREFERENCE ordering rebased (claude-pro
  first for code/content/management; google first for research)
- connector-model-policy: getModels(provider) from pi-ai instead of the
  deleted adapter.module.models array
- session-management + edge-case-session: adapter exemption removed;
  rotation now uniform under pi-mono
- ipc-core-admin-handlers: CSV compat model replaced with pi-ai anthropic
- connectors.spec: lookup by openai-codex id (catalog now starts with claude-pro)
- onboarding-model-pool: listProviderModels(provider) helper; label text
  changed to "ChatGPT Plus/Pro (Codex)"
- database integration: added vault insecure-fallback env + electron mock
- command-paths: uses new @main/connector-helpers normalizeCommandValue
- pi-mono-migrations: added `as string` casts for 3 negative-existence
  assertions verifying legacy ids were removed

Drops:
- pnpm-workspace.yaml packages: [] (was "packages/*"; directory empty)
- obsolete CONNECTOR_STRENGTHS import; .module.models probing

Verification:
- pnpm typecheck → 0 errors
- pnpm lint → 0 errors / 0 warnings
- pnpm build:verify → 0 errors / 0 warnings
- pnpm test:unit → 508/508 pass
- pnpm test:integration → 96/96 pass
- All 6 adapter hard gates pass (NOT FOUND / 0 matches / empty)
- pi-ai / pi-agent-core / pi-coding-agent all resolved @0.67.6
This commit is contained in:
ZacharyZhang-NY committed 2026-04-17 02:36:53 -04:00
1 parent 4de9cd0339
commit e94939a562
80 files changed
+2210 -413

No files matched your search

+81
View File
@@ -0,0 +1,81 @@
/**
* Defensive token redactor for worker process logs.
*
* Pi-mono's HTTP clients are not known to log credentials, but stack traces
* from upstream libraries (or future pi versions) could include header
* fragments containing `Authorization: Bearer ...` or `?access_token=...`.
* To prevent any such fragment from reaching the parent's stderr stream,
* `installLogRedactor()` wraps `console.error`, `console.warn`, `console.log`,
* `process.stdout.write`, and `process.stderr.write` so that every string
* argument is filtered through `redactTokens()` before transmission.
*/
const PATTERNS: Array<{ pattern: RegExp; replacement: string }> = [
{ pattern: /Bearer\s+[A-Za-z0-9._\-+/=]{8,}/g, replacement: "Bearer [REDACTED]" },
{ pattern: /(authorization\s*[:=]\s*)([^\s,;]{8,})/gi, replacement: "$1[REDACTED]" },
{ pattern: /(access_token=)([^&\s"']+)/gi, replacement: "$1[REDACTED]" },
{ pattern: /(refresh_token=)([^&\s"']+)/gi, replacement: "$1[REDACTED]" },
{ pattern: /(api[_-]?key\s*[:=]\s*['"]?)([A-Za-z0-9._-]{12,})/gi, replacement: "$1[REDACTED]" },
{ pattern: /sk-(?:ant-)?[A-Za-z0-9_-]{16,}/g, replacement: "sk-[REDACTED]" },
{ pattern: /ghp_[A-Za-z0-9]{16,}/g, replacement: "ghp_[REDACTED]" },
{ pattern: /gho_[A-Za-z0-9]{16,}/g, replacement: "gho_[REDACTED]" },
{ pattern: /AKIA[A-Z0-9]{16}/g, replacement: "AKIA[REDACTED]" },
];
export function redactTokens(text: string): string {
let result = text;
for (const { pattern, replacement } of PATTERNS) {
result = result.replace(pattern, replacement);
}
return result;
}
function redactArg(arg: unknown): unknown {
if (typeof arg === "string") return redactTokens(arg);
if (arg instanceof Error) {
const redacted = new Error(redactTokens(arg.message));
redacted.name = arg.name;
if (arg.stack) redacted.stack = redactTokens(arg.stack);
return redacted;
}
return arg;
}
interface InstallTarget {
console: { log: typeof console.log; warn: typeof console.warn; error: typeof console.error; info: typeof console.info };
stdoutWrite: typeof process.stdout.write;
stderrWrite: typeof process.stderr.write;
}
export function installLogRedactor(target?: Partial<InstallTarget>): () => void {
const cons = target?.console ?? console;
const origLog = cons.log.bind(cons);
const origWarn = cons.warn.bind(cons);
const origError = cons.error.bind(cons);
const origInfo = cons.info.bind(cons);
cons.log = (...args: unknown[]) => origLog(...args.map(redactArg));
cons.warn = (...args: unknown[]) => origWarn(...args.map(redactArg));
cons.error = (...args: unknown[]) => origError(...args.map(redactArg));
cons.info = (...args: unknown[]) => origInfo(...args.map(redactArg));
const stdoutWriteOrig = (target?.stdoutWrite ?? process.stdout.write).bind(process.stdout);
const stderrWriteOrig = (target?.stderrWrite ?? process.stderr.write).bind(process.stderr);
process.stdout.write = ((chunk: unknown, ...rest: unknown[]) => {
if (typeof chunk === "string") return stdoutWriteOrig(redactTokens(chunk), ...rest as never[]);
return stdoutWriteOrig(chunk as never, ...rest as never[]);
}) as typeof process.stdout.write;
process.stderr.write = ((chunk: unknown, ...rest: unknown[]) => {
if (typeof chunk === "string") return stderrWriteOrig(redactTokens(chunk), ...rest as never[]);
return stderrWriteOrig(chunk as never, ...rest as never[]);
}) as typeof process.stderr.write;
return () => {
cons.log = origLog;
cons.warn = origWarn;
cons.error = origError;
cons.info = origInfo;
process.stdout.write = stdoutWriteOrig;
process.stderr.write = stderrWriteOrig;
};
}