Files
hapi/web/scripts/fixtures/modesCatalog.ts
T
weishu c1ecb4798e feat(fixtures): batch 2 — events, permissions, sidechains, flavors, catalogs (K6)
34 new golden chat fixtures generated from the web pipeline, plus a
machine-generated modes catalog:

- Claude output: away_summary/microcompact_boundary/compact_boundary system
  subtypes, <task-notification> summary extraction, multi-block assistant
  message with an array-of-parts (text+image) tool_result
- AgentEvent union completed: switch/message/error/title-changed(+dedupe)/
  limit-warning(pipe text)/api-error folding/turn-duration/compact-summary/
  abort-restore/unknown-type passthrough; thread-goal updated+cleared (silent)
- Permission lifecycle via agentState.completedRequests: approved_for_session
  (mode+allowTools), denied with reason, canceled, AskUserQuestion flat
  answers, request_user_input nested answers (all with explicit createdAt)
- Sidechain: Task tool_use with parentToolUseId-grouped subagent children
- codex family: error, context_compacted, generated-image, review JSON,
  thread-goal messages, CodexBash call/result pair, exploration tool group
- cli-output: cli-origin command block + stdout merge
- agy flavor (output envelope): agy_message, agy_tool_action run_command
  mapping; cursor ACP plan snapshot (copilot skipped: identical codex shapes)
- generator now also emits shared/fixtures/catalogs/modes.json from
  shared/src/modes.ts (per-flavor permission modes with labels/tones);
  self-conformance test covers it; README documents the catalogs contract
2026-08-17 12:04:22 +08:00

36 lines
1.3 KiB
TypeScript

import {
AGENT_FLAVORS,
getCodexCollaborationModeOptions,
getPermissionModeOptionsForFlavor,
type CodexCollaborationModeOption,
type PermissionModeOption
} from '@hapi/protocol/modes'
export type ModesCatalog = {
/** Codex-only collaboration axis (independent of the permission mode). */
codexCollaborationModes: CodexCollaborationModeOption[]
/**
* Permission modes offered per agent flavor, in offer order, each with its
* display label and tone. An empty array means the flavor exposes no
* runtime permission switching (e.g. pi).
*/
permissionModesByFlavor: Record<string, PermissionModeOption[]>
}
/**
* Built directly from shared/src/modes.ts (the same module the web app
* imports), so the emitted catalog can never drift from the running web
* implementation. Emitted to shared/fixtures/catalogs/modes.json with the
* same canonical serialization as the chat fixtures.
*/
export function buildModesCatalog(): ModesCatalog {
const permissionModesByFlavor: Record<string, PermissionModeOption[]> = {}
for (const flavor of AGENT_FLAVORS) {
permissionModesByFlavor[flavor] = getPermissionModeOptionsForFlavor(flavor)
}
return {
codexCollaborationModes: getCodexCollaborationModeOptions(),
permissionModesByFlavor
}
}