// Component Registry Worker 型別定義 import { z } from 'zod'; // ── Cloudflare Bindings ────────────────────────────────────────────────────── export type Bindings = { WASM_BUCKET: R2Bucket; AI: Ai; KBDB_URL: string; KBDB_INTERNAL_TOKEN: string; ENVIRONMENT: string; }; // ── Component Contract Schema(Zod)───────────────────────────────────────── export const ConstraintsSchema = z.object({ max_size_kb: z.number().positive().max(2048), max_cold_start_ms: z.number().positive().max(50), no_network_syscall: z.boolean(), io_model: z.literal('stdin_stdout_json'), }); export const GherkinTestSchema = z.object({ scenario: z.string().min(1), given: z.string().min(1), then_contains: z.string().min(1), }); export const ComponentContractSchema = z.object({ canonical_id: z.string().min(1).regex(/^[a-z][a-z0-9_]*$/, 'canonical_id 必須為小寫底線格式'), display_name: z.string().min(1), category: z.enum(['logic', 'api', 'ui', 'style', 'anim']), version: z.string().min(1).regex(/^v\d+$/, 'version 格式必須為 vN'), wasi_target: z.literal('preview1'), stability: z.enum(['floating', 'stable', 'pinned']), runtime_compat: z.array(z.enum(['cf-workers', 'workerd', 'wazero'])).min(1), constraints: ConstraintsSchema, input_schema: z.record(z.unknown()), output_schema: z.record(z.unknown()), gherkin_tests: z.array(GherkinTestSchema).min(2, '至少需要一個 happy path 和一個 error path'), // 選填欄位 component_type: z.enum(['wasm', 'service_binding']).optional(), max_size_kb: z.number().optional(), max_cold_start_ms: z.number().optional(), no_network_syscall: z.boolean().optional(), service_binding_key: z.string().optional(), description: z.string().optional(), tags: z.array(z.string()).optional(), }); export type ComponentContract = z.infer; // ── 沙盒驗收步驟 ───────────────────────────────────────────────────────────── export type SandboxStep = 'size_check' | 'cold_start' | 'syscall_scan' | 'gherkin_tests' | 'runtime_compat'; export interface SandboxResult { success: boolean; failed_step?: SandboxStep; reason?: string; guide_anchor?: string; component_id: string; version: string; } // ── KBDB Block 格式 ────────────────────────────────────────────────────────── export interface KbdbBlock { block_id: string; template_id: string; user_id?: string; page_name?: string; } export interface KbdbSlots { [key: string]: string; } // ── 禁止的 WASM syscall(網路 + 檔案系統)──────────────────────────────────── export const FORBIDDEN_SYSCALLS = [ 'sock_connect', 'sock_accept', 'sock_recv', 'sock_send', 'sock_shutdown', 'fd_open', 'path_open', 'path_create_directory', 'path_remove_directory', 'path_rename', 'path_unlink_file', 'path_filestat_get', 'path_filestat_set_times', 'path_link', 'path_readlink', 'path_symlink', ] as const;