@kb-labs/shared-command-kit 2.119.0-canary.bb3d7f2f1 → 2.119.0-canary.ce846d079
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/helpers/use-platform.ts","../src/flags/types.ts","../src/flags/define.ts","../src/flags/validate.ts","../src/analytics/with-analytics.ts","../src/errors/format-validation.ts","../src/errors/format.ts","../src/errors/factory.ts","../src/helpers/index.ts","../src/helpers/use-config.ts","../src/helpers/use-logger.ts","../src/helpers/use-llm.ts","../src/helpers/use-embeddings.ts","../src/helpers/use-vector-store.ts","../src/helpers/use-analytics.ts","../src/helpers/use-storage.ts","../src/helpers/use-cache.ts","../src/helpers/use-document-database.ts","../src/helpers/use-kv-store.ts","../src/helpers/use-notifications.ts","../src/helpers/use-env.ts","../src/define-system-command.ts","../src/manifest.ts","../src/manifest-builder.ts","../src/validation/schema-builders.ts","../src/rest/define-handler.ts","../src/lifecycle/define-handlers.ts","../src/jobs.ts","../src/define-command.ts","../src/define-route.ts","../src/define-webhook.ts","../src/define-websocket.ts","../src/define-event-stream.ts","../src/define-action.ts","../src/ws-types.ts"],"names":["globalPlatform","schema","json","message","usePlatform","trace","optionsWithTrace","path","text","filePath"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/shared-command-kit/helpers/use-platform\n * Platform access hook with execution-scoped context.\n *\n * Uses AsyncLocalStorage to return the correct platform for the current\n * handler execution (governed, with correct permissions and proxy adapters).\n * Falls back to global singleton for code running outside handler context.\n *\n * @example\n * ```typescript\n * import { usePlatform } from '@kb-labs/shared-command-kit';\n *\n * // In any command handler — automatically gets the right platform\n * async handler(ctx, argv, flags) {\n * const platform = usePlatform();\n * const result = await platform.llm.complete('prompt');\n * }\n * ```\n */\n\nimport { platformContext } from '@kb-labs/plugin-contracts';\nimport { platform as globalPlatform } from '@kb-labs/core-runtime';\n\n/**\n * Access platform services for the current execution context.\n *\n * Priority:\n * 1. AsyncLocalStorage context (set by runInProcess) — per-execution, governed\n * 2. Global singleton fallback (core-runtime) — for code outside handler context\n *\n * @returns Platform services with correct adapters for current context\n */\nexport function usePlatform(): typeof globalPlatform {\n // ALS stores PlatformServices (governed wrapper); at runtime it is always\n // structurally compatible with PlatformContainer — the cast is safe.\n return (platformContext.getStore() as unknown as typeof globalPlatform) ?? globalPlatform;\n}\n\n/**\n * Check if specific platform adapter is configured\n *\n * Useful for conditional logic based on available services.\n *\n * @param adapterName - Name of the adapter to check\n * @returns true if adapter is configured and available\n *\n * @example\n * ```typescript\n * if (isPlatformConfigured('llm')) {\n * // Use LLM-powered feature\n * } else {\n * // Use deterministic fallback\n * }\n * ```\n */\nexport function isPlatformConfigured(adapterName: keyof typeof globalPlatform): boolean {\n const platform = usePlatform();\n\n // Check if adapter exists and is not a noop/fallback\n const adapter = platform[adapterName];\n\n if (!adapter) {\n return false;\n }\n\n // For adapters with hasAdapter method (like platform itself)\n if ('hasAdapter' in platform && typeof platform.hasAdapter === 'function') {\n return platform.hasAdapter(adapterName as string);\n }\n\n // Fallback: check if adapter is not noop\n // Noop adapters usually have a specific constructor name or are simple objects\n if (typeof adapter === 'object' && adapter.constructor) {\n const constructorName = adapter.constructor.name;\n return !constructorName.toLowerCase().includes('noop') &&\n !constructorName.toLowerCase().includes('fallback');\n }\n\n return true;\n}\n","/**\n * @module @kb-labs/shared-command-kit/flags/types\n * Types for flag validation and schema definition\n */\n\n/**\n * Flag type definition\n */\nexport type FlagType = 'boolean' | 'string' | 'number' | 'array';\n\n/**\n * Base flag schema definition\n */\nexport interface BaseFlagSchema<T extends FlagType = FlagType> {\n /** Flag name */\n name?: string;\n /** Flag type */\n type: T;\n /** Short alias (e.g., 'n' for 'dry-run') */\n alias?: string;\n /** Description for help text */\n description?: string;\n /** Default value if flag is not provided */\n default?: unknown;\n /** Whether flag is required */\n required?: boolean;\n /** Flags that conflict with this flag */\n conflicts?: string[];\n /** Flags that this flag depends on */\n dependsOn?: string[];\n /** Flags that are implied when this flag is set */\n implies?: string[] | [string, unknown][];\n // Note: transform is defined in child interfaces with specific types\n}\n\n/**\n * Boolean flag schema\n */\nexport interface BooleanFlagSchema extends BaseFlagSchema<'boolean'> {\n type: 'boolean';\n default?: boolean;\n /** Transform function to apply to the value */\n transform?: (value: boolean) => boolean | Promise<boolean>;\n}\n\n/**\n * String flag schema\n */\nexport interface StringFlagSchema extends BaseFlagSchema<'string'> {\n type: 'string';\n default?: string;\n /** Allowed values (enum) */\n choices?: readonly string[];\n /** Regex pattern for validation */\n pattern?: RegExp;\n /** Minimum string length */\n minLength?: number;\n /** Maximum string length */\n maxLength?: number;\n /** Custom validation function */\n validate?: (value: string) => true | string | Promise<true | string>;\n /** Transform function to apply to the value */\n transform?: (value: string) => string | Promise<string>;\n}\n\n/**\n * Number flag schema\n */\nexport interface NumberFlagSchema extends BaseFlagSchema<'number'> {\n type: 'number';\n default?: number;\n /** Minimum value */\n min?: number;\n /** Maximum value */\n max?: number;\n /** Custom validation function */\n validate?: (value: number) => true | string | Promise<true | string>;\n /** Transform function to apply to the value */\n transform?: (value: number) => number | Promise<number>;\n}\n\n/**\n * Array flag schema\n */\nexport interface ArrayFlagSchema extends BaseFlagSchema<'array'> {\n type: 'array';\n default?: unknown[];\n /** Type of array items */\n items?: 'string' | 'number' | 'boolean';\n /** Minimum array length */\n minLength?: number;\n /** Maximum array length */\n maxLength?: number;\n /** Transform function to apply to the value */\n transform?: (value: unknown[]) => unknown[] | Promise<unknown[]>;\n}\n\n/**\n * Union of all flag schema types\n */\nexport type FlagSchema =\n | BooleanFlagSchema\n | StringFlagSchema\n | NumberFlagSchema\n | ArrayFlagSchema;\n\n/**\n * Flag schema definition object (for defineFlags)\n */\nexport type FlagSchemaDefinition = Record<string, Omit<FlagSchema, 'name'>>;\n\n/**\n * Validation error\n */\nexport class FlagValidationError extends Error {\n constructor(\n public readonly flag: string,\n message: string,\n public readonly value?: unknown,\n public readonly schema?: FlagSchemaDefinition,\n public readonly commandName?: string\n ) {\n super(message);\n this.name = 'FlagValidationError';\n }\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult<T = Record<string, unknown>> {\n success: boolean;\n data?: T;\n errors?: Array<{\n flag: string;\n message: string;\n value?: unknown;\n }>;\n}\n\n/**\n * Safe validation result (doesn't throw)\n */\nexport interface SafeValidationResult<T = Record<string, unknown>> {\n success: boolean;\n data?: T;\n errors: Array<{\n flag: string;\n message: string;\n value?: unknown;\n }>;\n}\n\n","/**\n * @module @kb-labs/shared-command-kit/flags/define\n * Define flag schemas with automatic type inference\n */\n\nimport type {\n FlagSchemaDefinition,\n BooleanFlagSchema,\n StringFlagSchema,\n NumberFlagSchema,\n ArrayFlagSchema,\n} from './types';\n\n/**\n * Flag schema with type inference\n */\nexport interface FlagSchemaWithInfer<T extends FlagSchemaDefinition> {\n /** Original schema definition */\n readonly schema: T;\n /** Infer TypeScript type from schema */\n infer: InferFlags<T>;\n}\n\n/**\n * Infer TypeScript type from flag schema definition\n */\nexport type InferFlags<T extends FlagSchemaDefinition> = {\n [K in keyof T]: T[K] extends BooleanFlagSchema\n ? T[K]['default'] extends boolean\n ? boolean\n : T[K]['required'] extends true\n ? boolean\n : boolean | undefined\n : T[K] extends StringFlagSchema\n ? T[K]['choices'] extends readonly string[]\n ? T[K]['required'] extends true\n ? T[K]['choices'][number]\n : T[K]['default'] extends string\n ? T[K]['choices'][number]\n : T[K]['choices'][number] | undefined\n : T[K]['required'] extends true\n ? string\n : T[K]['default'] extends string\n ? string\n : string | undefined\n : T[K] extends NumberFlagSchema\n ? T[K]['required'] extends true\n ? number\n : T[K]['default'] extends number\n ? number\n : number | undefined\n : T[K] extends ArrayFlagSchema\n ? T[K]['items'] extends 'string'\n ? string[]\n : T[K]['items'] extends 'number'\n ? number[]\n : T[K]['items'] extends 'boolean'\n ? boolean[]\n : unknown[]\n : unknown;\n};\n\n/**\n * Define a flag schema with automatic type inference\n *\n * @example\n * ```typescript\n * const schema = defineFlags({\n * scope: {\n * type: 'string',\n * required: true,\n * pattern: /^[@a-z0-9-/]+$/i,\n * },\n * 'dry-run': {\n * type: 'boolean',\n * default: false,\n * },\n * });\n *\n * type Flags = typeof schema.infer;\n * // Flags = { scope: string; 'dry-run': boolean }\n * ```\n */\nexport function defineFlags<T extends FlagSchemaDefinition>(\n definition: T\n): FlagSchemaWithInfer<T> {\n return {\n schema: definition,\n infer: {} as InferFlags<T>,\n };\n}\n\n","/**\n * @module @kb-labs/shared-command-kit/flags/validate\n * Validate flags against schema\n */\n\nimport {\n FlagValidationError,\n type FlagSchema,\n type FlagSchemaDefinition,\n type SafeValidationResult,\n} from './types';\nimport type { InferFlags } from './define';\n\n/**\n * Parse and coerce flag value based on type\n */\nfunction coerceValue(value: unknown, type: FlagSchema['type']): unknown {\n if (value === undefined || value === null) {\n return value;\n }\n\n switch (type) {\n case 'boolean':\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n const lower = value.toLowerCase().trim();\n if (lower === 'true' || lower === '1' || lower === 'yes') {\n return true;\n }\n if (lower === 'false' || lower === '0' || lower === 'no' || lower === '') {\n return false;\n }\n }\n return Boolean(value);\n\n case 'number':\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = Number(value);\n if (!Number.isNaN(parsed) && Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return Number(value);\n\n case 'array':\n if (Array.isArray(value)) {\n return value;\n }\n if (typeof value === 'string') {\n return value.split(',').map((item) => item.trim());\n }\n return [value];\n\n case 'string':\n return String(value);\n\n default:\n return value;\n }\n}\n\n/**\n * Validate a single flag value against its schema\n */\nasync function validateFlag(\n flagName: string,\n value: unknown,\n schema: FlagSchema\n): Promise<true | string> {\n const { type, required } = schema;\n \n // Type-specific properties (using type guards)\n const choices = 'choices' in schema ? schema.choices : undefined;\n const pattern = 'pattern' in schema ? schema.pattern : undefined;\n const min = 'min' in schema ? schema.min : undefined;\n const max = 'max' in schema ? schema.max : undefined;\n const validate = 'validate' in schema ? schema.validate : undefined;\n const minLength = 'minLength' in schema ? schema.minLength : undefined;\n const maxLength = 'maxLength' in schema ? schema.maxLength : undefined;\n const items = 'items' in schema ? schema.items : undefined;\n const transform = 'transform' in schema ? schema.transform : undefined;\n\n // Check required\n if (required && (value === undefined || value === null || value === '')) {\n return `Flag --${flagName} is required`;\n }\n\n // Skip validation if value is undefined and not required\n if (value === undefined || value === null) {\n return true;\n }\n\n // Coerce value to correct type\n const coerced = coerceValue(value, type);\n\n // Type-specific validation\n switch (type) {\n case 'boolean':\n if (typeof coerced !== 'boolean') {\n return `Flag --${flagName} must be a boolean`;\n }\n break;\n\n case 'string':\n if (typeof coerced !== 'string') {\n return `Flag --${flagName} must be a string`;\n }\n if (minLength !== undefined && coerced.length < minLength) {\n return `Flag --${flagName} must be at least ${minLength} characters long`;\n }\n if (maxLength !== undefined && coerced.length > maxLength) {\n return `Flag --${flagName} must be at most ${maxLength} characters long`;\n }\n if (choices && !choices.includes(coerced)) {\n return `Flag --${flagName} must be one of: ${choices.join(', ')} (got: ${coerced})`;\n }\n if (pattern && !pattern.test(coerced)) {\n return `Flag --${flagName} must match pattern ${pattern.toString()}`;\n }\n if (validate) {\n const stringValidate = validate as (value: string) => true | string | Promise<true | string>;\n const result = await stringValidate(coerced as string);\n if (result !== true) {\n return result;\n }\n }\n break;\n\n case 'number':\n if (typeof coerced !== 'number' || !Number.isFinite(coerced)) {\n return `Flag --${flagName} must be a number`;\n }\n if (min !== undefined && coerced < min) {\n return `Flag --${flagName} must be >= ${min} (got: ${coerced})`;\n }\n if (max !== undefined && coerced > max) {\n return `Flag --${flagName} must be <= ${max} (got: ${coerced})`;\n }\n if (validate) {\n const numberValidate = validate as (value: number) => true | string | Promise<true | string>;\n const result = await numberValidate(coerced as number);\n if (result !== true) {\n return result;\n }\n }\n break;\n\n case 'array':\n if (!Array.isArray(coerced)) {\n return `Flag --${flagName} must be an array`;\n }\n if (minLength !== undefined && coerced.length < minLength) {\n return `Flag --${flagName} must have at least ${minLength} items`;\n }\n if (maxLength !== undefined && coerced.length > maxLength) {\n return `Flag --${flagName} must have at most ${maxLength} items`;\n }\n if (items) {\n for (let i = 0; i < coerced.length; i++) {\n const item = coerced[i];\n if (items === 'string' && typeof item !== 'string') {\n return `Flag --${flagName}[${i}] must be a string`;\n }\n if (items === 'number' && typeof item !== 'number') {\n return `Flag --${flagName}[${i}] must be a number`;\n }\n if (items === 'boolean' && typeof item !== 'boolean') {\n return `Flag --${flagName}[${i}] must be a boolean`;\n }\n }\n }\n break;\n }\n\n return true;\n}\n\n/**\n * Validate flags against schema and return typed result\n *\n * @throws {FlagValidationError} If validation fails and safe mode is not used\n */\nexport async function validateFlags<T extends FlagSchemaDefinition>(\n rawFlags: Record<string, unknown>,\n schemaDefinition: { schema: T } | T\n): Promise<InferFlags<T>> {\n const schema = 'schema' in schemaDefinition ? schemaDefinition.schema : schemaDefinition;\n const errors: Array<{ flag: string; message: string; value?: unknown }> = [];\n const result: Record<string, unknown> = {};\n const flagValues: Record<string, unknown> = { ...rawFlags };\n\n // First pass: apply implies\n for (const [flagName, flagSchema] of Object.entries(schema)) {\n const value = flagValues[flagName];\n if (value !== undefined && value !== null && value !== false && value !== '') {\n const implies = flagSchema.implies;\n if (implies) {\n for (const implied of implies) {\n if (Array.isArray(implied) && implied.length === 2) {\n // [flagName, value] format\n const [impliedFlag, impliedValue] = implied;\n if (flagValues[impliedFlag] === undefined) {\n flagValues[impliedFlag] = impliedValue;\n }\n } else if (typeof implied === 'string') {\n // Just flag name - set to true\n if (flagValues[implied] === undefined) {\n flagValues[implied] = true;\n }\n }\n }\n }\n }\n }\n\n // Second pass: validate each flag\n for (const [flagName, flagSchema] of Object.entries(schema)) {\n const value = flagValues[flagName];\n const schemaWithName: FlagSchema = { ...flagSchema, name: flagName };\n\n // Check conflicts\n const conflicts = flagSchema.conflicts;\n if (conflicts && value !== undefined && value !== null && value !== false && value !== '') {\n for (const conflictingFlag of conflicts) {\n const conflictingValue = flagValues[conflictingFlag];\n if (conflictingValue !== undefined && conflictingValue !== null && conflictingValue !== false && conflictingValue !== '') {\n errors.push({\n flag: flagName,\n message: `Flag --${flagName} conflicts with --${conflictingFlag}`,\n value,\n });\n break;\n }\n }\n if (errors.some(e => e.flag === flagName)) {\n continue;\n }\n }\n\n // Check dependsOn\n const dependsOn = flagSchema.dependsOn;\n if (dependsOn && value !== undefined && value !== null && value !== '') {\n for (const dependency of dependsOn) {\n const dependencyValue = flagValues[dependency];\n if (dependencyValue === undefined || dependencyValue === null || dependencyValue === '') {\n errors.push({\n flag: flagName,\n message: `Flag --${flagName} depends on --${dependency}`,\n value,\n });\n break;\n }\n }\n if (errors.some(e => e.flag === flagName)) {\n continue;\n }\n }\n\n // Check required\n if (flagSchema.required && (value === undefined || value === null || value === '')) {\n errors.push({\n flag: flagName,\n message: `Flag --${flagName} is required`,\n value,\n });\n continue;\n }\n\n // Apply default if value is missing\n const finalValue = value !== undefined ? value : flagSchema.default;\n\n // Skip validation if value is undefined and not required\n if (finalValue === undefined && !flagSchema.required) {\n continue;\n }\n\n // Validate flag\n const validationResult = await validateFlag(flagName, finalValue, schemaWithName);\n if (validationResult !== true) {\n errors.push({\n flag: flagName,\n message: validationResult,\n value: finalValue,\n });\n continue;\n }\n\n // Apply transform if present\n let transformedValue = coerceValue(finalValue, flagSchema.type);\n const transform = flagSchema.transform;\n if (transform) {\n transformedValue = await transform(transformedValue);\n }\n\n // Store value\n result[flagName] = transformedValue;\n }\n\n // Check for unknown flags (optional - could be enabled via option)\n // for (const flagName of Object.keys(rawFlags)) {\n // if (!(flagName in schema)) {\n // errors.push({\n // flag: flagName,\n // message: `Unknown flag: --${flagName}`,\n // value: rawFlags[flagName],\n // });\n // }\n // }\n\n if (errors.length > 0) {\n const firstError = errors[0]!;\n throw new FlagValidationError(\n firstError.flag,\n firstError.message,\n firstError.value,\n schema as FlagSchemaDefinition // Pass schema for usage generation\n );\n }\n\n return result as InferFlags<T>;\n}\n\n/**\n * Safe version of validateFlags that doesn't throw\n */\nexport async function validateFlagsSafe<T extends FlagSchemaDefinition>(\n rawFlags: Record<string, unknown>,\n schemaDefinition: { schema: T } | T\n): Promise<SafeValidationResult<InferFlags<T>>> {\n try {\n const data = await validateFlags(rawFlags, schemaDefinition);\n return {\n success: true,\n data,\n errors: [],\n };\n } catch (error) {\n if (error instanceof FlagValidationError) {\n return {\n success: false,\n errors: [\n {\n flag: error.flag,\n message: error.message,\n value: error.value,\n },\n ],\n };\n }\n throw error;\n }\n}\n\n","/**\n * Analytics Wrapper\n *\n * Optional helper for wrapping operations with analytics events.\n * You can always use ctx.platform.analytics.track() directly - this is just convenience.\n *\n * @example\n * ```typescript\n * import { withAnalytics } from '@kb-labs/shared-command-kit';\n *\n * const result = await withAnalytics(ctx, 'mind.query', {\n * started: { queryId, text, mode },\n * completed: (result) => ({ tokensIn: result.tokensIn, tokensOut: result.tokensOut }),\n * failed: (error) => ({ errorMessage: error.message }),\n * }, async () => {\n * return await executeQuery(...);\n * });\n * ```\n */\n\nimport type { IAnalytics } from '@kb-labs/core-platform';\n\n/**\n * Context with optional analytics\n */\nexport interface AnalyticsContext {\n platform?: {\n analytics?: IAnalytics;\n };\n}\n\n/**\n * Analytics event configuration\n */\nexport interface AnalyticsEvents<TResult> {\n /** Event properties when operation starts */\n started?: Record<string, unknown>;\n /** Event properties when operation completes (can be function of result) */\n completed?: Record<string, unknown> | ((result: TResult) => Record<string, unknown>);\n /** Event properties when operation fails (can be function of error) */\n failed?: Record<string, unknown> | ((error: Error) => Record<string, unknown>);\n}\n\n/**\n * Wrap an async operation with analytics tracking\n *\n * Automatically tracks:\n * - `{eventName}.started` when operation begins\n * - `{eventName}.completed` when operation succeeds\n * - `{eventName}.failed` when operation fails\n *\n * @param ctx - Context with platform.analytics\n * @param eventName - Base event name (e.g., 'mind.query', 'workflow.run')\n * @param events - Event properties for started/completed/failed events\n * @param operation - Async operation to execute\n * @returns Result of the operation\n *\n * @example\n * ```typescript\n * const result = await withAnalytics(ctx, 'mind.query', {\n * started: { queryId: '123', text: 'search query' },\n * completed: (result) => ({\n * tokensIn: result.tokensIn,\n * tokensOut: result.tokensOut,\n * resultsCount: result.results.length,\n * }),\n * failed: (error) => ({\n * errorCode: error.code,\n * errorMessage: error.message,\n * }),\n * }, async () => {\n * return await executeQuery('search query');\n * });\n * ```\n */\nexport async function withAnalytics<TResult>(\n ctx: AnalyticsContext,\n eventName: string,\n events: AnalyticsEvents<TResult>,\n operation: () => Promise<TResult>\n): Promise<TResult> {\n const analytics = ctx.platform?.analytics;\n const startTime = Date.now();\n\n // Track started event\n if (analytics && events.started) {\n await analytics.track(`${eventName}.started`, {\n ...events.started,\n timestamp: new Date().toISOString(),\n });\n }\n\n try {\n // Execute operation\n const result = await operation();\n\n // Track completed event\n if (analytics && events.completed) {\n const completedProps = typeof events.completed === 'function'\n ? events.completed(result)\n : events.completed;\n\n await analytics.track(`${eventName}.completed`, {\n ...completedProps,\n durationMs: Date.now() - startTime,\n timestamp: new Date().toISOString(),\n });\n }\n\n return result;\n } catch (error: unknown) {\n // Track failed event\n if (analytics && events.failed) {\n const failedProps = typeof events.failed === 'function'\n ? events.failed(error as Error)\n : events.failed;\n\n await analytics.track(`${eventName}.failed`, {\n ...failedProps,\n durationMs: Date.now() - startTime,\n timestamp: new Date().toISOString(),\n });\n }\n\n // Re-throw error\n throw error;\n }\n}\n\n/**\n * Create a reusable analytics wrapper for a specific event\n *\n * @param eventName - Base event name\n * @param defaultEvents - Default event properties\n * @returns Function that wraps operations with analytics\n *\n * @example\n * ```typescript\n * const trackQuery = createAnalyticsWrapper('mind.query', {\n * started: { source: 'cli' },\n * completed: (result) => ({ resultsCount: result.results.length }),\n * });\n *\n * // Use multiple times\n * const result1 = await trackQuery(ctx, { text: 'query 1' }, async () => {...});\n * const result2 = await trackQuery(ctx, { text: 'query 2' }, async () => {...});\n * ```\n */\nexport function createAnalyticsWrapper<TResult>(\n eventName: string,\n defaultEvents: AnalyticsEvents<TResult>\n) {\n return async (\n ctx: AnalyticsContext,\n additionalEvents: Partial<AnalyticsEvents<TResult>>,\n operation: () => Promise<TResult>\n ): Promise<TResult> => {\n const mergedEvents: AnalyticsEvents<TResult> = {\n started: { ...defaultEvents.started, ...additionalEvents.started },\n completed: additionalEvents.completed || defaultEvents.completed,\n failed: additionalEvents.failed || defaultEvents.failed,\n };\n\n return withAnalytics(ctx, eventName, mergedEvents, operation);\n };\n}\n\n/**\n * Track a simple event (no wrapping)\n *\n * Convenience helper for tracking single events without wrapping an operation.\n *\n * @param ctx - Context with platform.analytics\n * @param eventName - Event name\n * @param properties - Event properties\n *\n * @example\n * ```typescript\n * await trackEvent(ctx, 'button.clicked', { buttonId: 'submit', page: 'settings' });\n * ```\n */\nexport async function trackEvent(\n ctx: AnalyticsContext,\n eventName: string,\n properties?: Record<string, unknown>\n): Promise<void> {\n const analytics = ctx.platform?.analytics;\n\n if (analytics) {\n await analytics.track(eventName, {\n ...properties,\n timestamp: new Date().toISOString(),\n });\n }\n}\n","/**\n * @module @kb-labs/shared-command-kit/errors/format-validation\n * User-friendly formatting for flag validation errors\n */\n\nimport type { FlagValidationError, StringFlagSchema } from '../flags/types';\nimport type { FlagSchemaDefinition } from '../flags/types';\n\n/**\n * Format a validation error into a user-friendly message\n *\n * @example\n * ```\n * ❌ Missing required flag: --text\n *\n * Usage: kb mind search --text <query>\n * Hint: Try kb mind search --help\n * ```\n */\nexport function formatValidationError(\n error: FlagValidationError,\n options: {\n commandName?: string;\n schema?: FlagSchemaDefinition;\n } = {}\n): string {\n const { commandName, schema } = options;\n const lines: string[] = [];\n\n // Main error message with emoji\n const errorMsg = error.message;\n\n // Determine error type and format accordingly\n if (errorMsg.includes('is required')) {\n lines.push(`❌ Missing required flag: --${error.flag}`);\n } else if (errorMsg.includes('must be one of')) {\n // Extract the invalid value if available\n const valueStr = error.value !== undefined ? ` ${error.value}` : '';\n lines.push(`❌ Invalid value for --${error.flag}:${valueStr}`);\n } else if (errorMsg.includes('must be a')) {\n lines.push(`❌ Invalid type for --${error.flag}`);\n } else if (errorMsg.includes('conflicts with')) {\n lines.push(`❌ Flag conflict: --${error.flag}`);\n } else if (errorMsg.includes('depends on')) {\n lines.push(`❌ Missing dependency for --${error.flag}`);\n } else {\n // Fallback: use the original message\n lines.push(`❌ ${errorMsg}`);\n }\n\n lines.push(''); // Empty line for spacing\n\n // Generate usage hint if we have schema and command name\n if (commandName && schema) {\n const usageLine = generateUsageLine(commandName, schema, error.flag);\n if (usageLine) {\n lines.push(`Usage: ${usageLine}`);\n }\n }\n\n // Add help hint\n if (commandName) {\n lines.push(`Hint: Try ${commandName} --help`);\n } else {\n lines.push('Hint: Try --help for more information');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate a usage line from command name and schema\n *\n * @example\n * generateUsageLine('kb mind search', schema, 'text')\n * // Returns: 'kb mind search --text <query> [options]'\n */\nfunction generateUsageLine(\n commandName: string,\n schema: FlagSchemaDefinition,\n errorFlag: string\n): string {\n const parts: string[] = [commandName];\n\n // Add the flag that caused the error first\n const errorFlagSchema = schema[errorFlag];\n if (errorFlagSchema) {\n const flagStr = formatFlagForUsage(errorFlag, errorFlagSchema);\n parts.push(flagStr);\n }\n\n // Check if there are other required flags\n const otherRequiredFlags = Object.entries(schema)\n .filter(([name, flagSchema]) =>\n name !== errorFlag && flagSchema.required\n );\n\n if (otherRequiredFlags.length > 0) {\n // Add other required flags\n for (const [name, flagSchema] of otherRequiredFlags) {\n parts.push(formatFlagForUsage(name, flagSchema));\n }\n }\n\n // Add [options] if there are optional flags\n const hasOptionalFlags = Object.values(schema).some(s => !s.required);\n if (hasOptionalFlags) {\n parts.push('[options]');\n }\n\n return parts.join(' ');\n}\n\n/**\n * Format a single flag for usage display\n *\n * @example\n * formatFlagForUsage('text', { type: 'string', required: true })\n * // Returns: '--text <text>'\n *\n * formatFlagForUsage('mode', { type: 'string', choices: ['local', 'auto'] })\n * // Returns: '[--mode <local|auto>]'\n */\nfunction formatFlagForUsage(\n name: string,\n schema: FlagSchemaDefinition[string]\n): string {\n let valueHint: string;\n\n if ('choices' in schema && (schema as StringFlagSchema).choices && (schema as StringFlagSchema).choices!.length > 0) {\n // Show choices: <local|auto>\n valueHint = `<${(schema as StringFlagSchema).choices!.join('|')}>`;\n } else if (schema.type === 'boolean') {\n // Boolean flags don't need a value hint\n return schema.required ? `--${name}` : `[--${name}]`;\n } else {\n // Generic type hint: <text>, <number>, etc.\n valueHint = `<${name}>`;\n }\n\n const flagPart = `--${name} ${valueHint}`;\n\n return schema.required ? flagPart : `[${flagPart}]`;\n}\n","/**\n * @module @kb-labs/shared-command-kit/errors/format\n * Error formatting utilities\n */\n\nimport type { FormattedError, FormatErrorOptions } from './types';\nimport { FlagValidationError } from '../flags/types';\nimport { formatValidationError } from './format-validation';\n\n/**\n * Format error for display\n * \n * @example\n * ```typescript\n * const formatted = formatError(error, {\n * jsonMode: Boolean(flags.json),\n * showStack: Boolean(flags.debug),\n * timingMs: tracker.total(),\n * });\n * \n * if (flags.json) {\n * ctx.output?.json(formatted.json);\n * } else {\n * ctx.output?.error(formatted.message);\n * }\n * ```\n */\nexport function formatError(\n error: unknown,\n options: FormatErrorOptions = {}\n): FormattedError {\n const { showStack = false, timingMs } = options;\n\n // Special handling for FlagValidationError\n if (error instanceof FlagValidationError) {\n const friendlyMessage = formatValidationError(error, {\n commandName: error.commandName,\n schema: error.schema,\n });\n\n const json: FormattedError['json'] = {\n ok: false,\n error: error.message,\n };\n\n if (timingMs !== undefined) {\n json.timingMs = timingMs;\n }\n\n if (showStack && error.stack) {\n json.stack = error.stack;\n }\n\n let message = friendlyMessage;\n if (showStack && error.stack) {\n message = `${friendlyMessage}\\n\\nStack trace:\\n${error.stack}`;\n }\n\n return {\n message,\n json,\n };\n }\n\n // Standard error formatting for other errors\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n const json: FormattedError['json'] = {\n ok: false,\n error: errorMessage,\n };\n\n if (timingMs !== undefined) {\n json.timingMs = timingMs;\n }\n\n if (showStack && errorStack) {\n json.stack = errorStack;\n }\n\n let message = errorMessage;\n if (showStack && errorStack) {\n message = `${errorMessage}\\n\\n${errorStack}`;\n }\n\n return {\n message,\n json,\n };\n}\n\n","/**\n * Error Factory for KB Labs Plugins\n *\n * Optional helper for defining plugin errors without boilerplate.\n * You can always use standard Error classes - this is just convenience.\n *\n * @example\n * ```typescript\n * import { defineError } from '@kb-labs/shared-command-kit';\n *\n * export const MindError = defineError('MIND', {\n * ValidationFailed: { code: 400, message: 'Validation failed' },\n * IndexNotFound: { code: 404, message: (scope: string) => `Index '${scope}' not found` },\n * QueryFailed: { code: 500, message: 'Query execution failed' },\n * });\n *\n * // Usage:\n * throw new MindError.IndexNotFound('default');\n * throw new MindError.ValidationFailed({ details: { field: 'cwd' } });\n * ```\n */\n\n/**\n * Error definition with HTTP code and message\n */\nexport interface ErrorDefinition {\n /** HTTP status code (400, 404, 500, etc.) */\n code: number;\n /** Error message - can be string or function for parameterized messages */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n message: string | ((...args: any[]) => string);\n /** Optional additional details */\n details?: Record<string, unknown>;\n}\n\n/**\n * Error definitions map\n */\nexport type ErrorDefinitions = Record<string, ErrorDefinition>;\n\n/**\n * Base error class with HTTP status code support\n */\nexport class PluginError extends Error {\n public readonly statusCode: number;\n public readonly errorCode: string;\n public readonly details?: Record<string, unknown>;\n\n constructor(\n errorCode: string,\n message: string,\n statusCode: number,\n details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'PluginError';\n this.errorCode = errorCode;\n this.statusCode = statusCode;\n this.details = details;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, PluginError);\n }\n }\n\n /**\n * Convert error to JSON for logging/serialization\n */\n toJSON() {\n return {\n name: this.name,\n errorCode: this.errorCode,\n message: this.message,\n statusCode: this.statusCode,\n details: this.details,\n stack: this.stack,\n };\n }\n\n /**\n * Check if error is a PluginError\n */\n static isPluginError(error: unknown): error is PluginError {\n return error instanceof PluginError;\n }\n}\n\n/**\n * Type for error constructor created by defineError\n */\ntype ErrorConstructor<TArgs extends unknown[] = unknown[]> = {\n new (details?: Record<string, unknown>): PluginError;\n new (...args: TArgs): PluginError;\n};\n\n/**\n * Type for error namespace created by defineError\n */\ntype ErrorNamespace<TDefs extends ErrorDefinitions> = {\n [K in keyof TDefs]: ErrorConstructor;\n} & {\n /** Check if error is from this namespace */\n is(error: unknown): error is PluginError;\n /** Check if error has specific error code */\n hasCode(error: unknown, code: keyof TDefs): boolean;\n};\n\n/**\n * Define a namespace of plugin errors\n *\n * @param prefix - Error code prefix (e.g., 'MIND', 'WORKFLOW')\n * @param definitions - Error definitions map\n * @returns Error namespace with error constructors\n *\n * @example\n * ```typescript\n * export const MindError = defineError('MIND', {\n * IndexNotFound: {\n * code: 404,\n * message: (scope: string) => `Index '${scope}' not found`\n * },\n * QueryFailed: {\n * code: 500,\n * message: 'Query execution failed'\n * },\n * });\n *\n * // Throw with template params\n * throw new MindError.IndexNotFound('default');\n * // Error message: \"Index 'default' not found\"\n *\n * // Throw with details\n * throw new MindError.QueryFailed({\n * details: { query: 'test', reason: 'timeout' }\n * });\n * ```\n */\nexport function defineError<TDefs extends ErrorDefinitions>(\n prefix: string,\n definitions: TDefs\n): ErrorNamespace<TDefs> {\n const errorNamespace: Record<string, unknown> = {};\n\n // Create error constructor for each definition\n for (const [key, def] of Object.entries(definitions)) {\n const errorCode = `${prefix}_${key.toUpperCase()}`;\n\n // Create error class\n class DefinedError extends PluginError {\n constructor(...args: unknown[]) {\n const { message, details } = buildMessageAndDetails(def, args);\n super(errorCode, message, def.code, details);\n this.name = `${prefix}Error`;\n }\n }\n\n errorNamespace[key] = DefinedError;\n }\n\n // Add helper methods\n errorNamespace.is = (error: unknown): error is PluginError => {\n return PluginError.isPluginError(error) && error.errorCode.startsWith(prefix + '_');\n };\n\n errorNamespace.hasCode = (error: unknown, code: keyof TDefs): boolean => {\n const errorCode = `${prefix}_${String(code).toUpperCase()}`;\n return PluginError.isPluginError(error) && error.errorCode === errorCode;\n };\n\n return errorNamespace as ErrorNamespace<TDefs>;\n}\n\n/**\n * Build error message and details from definition and constructor args\n */\nfunction buildMessageAndDetails(\n def: ErrorDefinition,\n args: unknown[]\n): { message: string; details?: Record<string, unknown> } {\n let message: string;\n let details: Record<string, unknown> | undefined;\n\n if (typeof def.message === 'function') {\n // Template message - args are template params\n const lastArg = args[args.length - 1];\n\n // Check if last arg is details object (has 'details' key)\n const hasDetails = lastArg && typeof lastArg === 'object' && 'details' in lastArg;\n\n if (hasDetails) {\n // Last arg is details, rest are template params\n const templateArgs = args.slice(0, -1);\n message = def.message(...templateArgs);\n details = { ...def.details, ...(lastArg as { details?: Record<string, unknown> }).details };\n } else {\n // All args are template params\n message = def.message(...args);\n details = def.details;\n }\n } else {\n // Static message\n message = def.message;\n\n // First arg can be details object\n if (args.length > 0 && typeof args[0] === 'object' && args[0] !== null) {\n details = { ...def.details, ...(args[0] as { details?: Record<string, unknown> }).details };\n } else {\n details = def.details;\n }\n }\n\n return { message, details };\n}\n\n/**\n * Common error definitions that can be reused across plugins\n */\nexport const commonErrors = {\n /**\n * Validation error (400)\n */\n ValidationFailed: {\n code: 400,\n message: 'Validation failed',\n },\n\n /**\n * Resource not found (404)\n */\n NotFound: {\n code: 404,\n message: (resource: string) => `${resource} not found`,\n },\n\n /**\n * Unauthorized access (401)\n */\n Unauthorized: {\n code: 401,\n message: 'Unauthorized',\n },\n\n /**\n * Forbidden access (403)\n */\n Forbidden: {\n code: 403,\n message: 'Forbidden',\n },\n\n /**\n * Internal server error (500)\n */\n InternalError: {\n code: 500,\n message: 'Internal server error',\n },\n\n /**\n * Service unavailable (503)\n */\n ServiceUnavailable: {\n code: 503,\n message: (service: string) => `Service '${service}' is unavailable`,\n },\n\n /**\n * Timeout error (504)\n */\n Timeout: {\n code: 504,\n message: (operation: string) => `Operation '${operation}' timed out`,\n },\n\n /**\n * Conflict error (409)\n */\n Conflict: {\n code: 409,\n message: (resource: string) => `${resource} already exists`,\n },\n} satisfies ErrorDefinitions;\n","/**\n * @module @kb-labs/shared-command-kit/helpers\n * Global platform access helpers\n *\n * Provides clean, type-safe access to platform services without context drilling.\n * Similar to React hooks pattern, but for KB Labs platform.\n *\n * @example\n * ```typescript\n * import { useLLM, useLogger, useAnalytics } from '@kb-labs/shared-command-kit/helpers';\n *\n * async handler(ctx, argv, flags) {\n * const logger = useLogger();\n * const llm = useLLM();\n *\n * await logger.info('Processing started');\n *\n * if (llm) {\n * const result = await llm.complete('prompt');\n * await logger.info('LLM result', { length: result.content.length });\n * }\n * }\n * ```\n */\n\n// Platform singleton\nexport { usePlatform, isPlatformConfigured } from './use-platform';\n\n// Context types and helpers\nexport type { PluginContextV3 } from './context';\n\n// Config access\nexport { useConfig } from './use-config';\n\n// Core services\nexport { useLogger, useLoggerWithContext } from './use-logger.js';\nexport { useLLM, isLLMAvailable, getLLMTier, type LLMTier, type UseLLMOptions } from './use-llm.js';\nexport { useEmbeddings, isEmbeddingsAvailable } from './use-embeddings.js';\nexport { useVectorStore, isVectorStoreAvailable } from './use-vector-store.js';\nexport { useAnalytics, trackAnalyticsEvent } from './use-analytics.js';\nexport { useStorage } from './use-storage.js';\nexport { useCache, isCacheAvailable } from './use-cache.js';\nexport { useDocumentDatabase, isDocumentDatabaseAvailable } from './use-document-database.js';\nexport { useKVStore, isKVStoreAvailable } from './use-kv-store.js';\n\n// Notifications\nexport { useNotifications } from './use-notifications.js';\n\n// Runtime shims\nexport { useEnv } from './use-env.js';\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-config\n * Global config access helper\n *\n * Provides clean access to product-specific configuration without context drilling.\n * Similar to React hooks pattern, but for KB Labs config.\n *\n * @example\n * ```typescript\n * import { useConfig } from '@kb-labs/shared-command-kit';\n *\n * // In any command handler\n * async handler(ctx, argv, flags) {\n * const config = await useConfig('mind');\n *\n * if (config) {\n * const scopes = config.scopes;\n * // Use config...\n * }\n * }\n * ```\n */\n\n/**\n * Access product-specific configuration from kb.config.json\n *\n * Returns ONLY the config for the specified product and profile.\n * Uses platform.config adapter (works across parent/child processes via IPC).\n * Supports both Profiles v2 and legacy config structures.\n *\n * **Security:** This function returns ONLY the product-specific config,\n * not the entire kb.config.json. This prevents cross-product config access.\n *\n * **Auto-detection:** If productId is not provided, it's automatically inferred\n * from the plugin's manifest.configSection field (passed via execution context).\n *\n * **Profiles v2 structure:**\n * ```json\n * {\n * \"profiles\": [\n * {\n * \"id\": \"default\",\n * \"products\": {\n * \"mind\": { \"scopes\": [...] },\n * \"workflow\": { \"maxConcurrency\": 10 }\n * }\n * }\n * ]\n * }\n * ```\n *\n * **Legacy structure:**\n * ```json\n * {\n * \"knowledge\": { \"scopes\": [...] }, // for \"mind\" product\n * \"workflow\": { \"maxConcurrency\": 10 }\n * }\n * ```\n *\n * @param productId - Product identifier (e.g., 'mind', 'workflow', 'plugins'). Optional - auto-detected from context.\n * @param profileId - Profile identifier (defaults to 'default' or KB_PROFILE env var)\n * @returns Promise resolving to product-specific config or undefined\n *\n * @example\n * ```typescript\n * // Auto-detect from context (recommended)\n * const config = await useConfig();\n *\n * // Explicit product ID\n * const mindConfig = await useConfig('mind');\n * if (mindConfig?.scopes) {\n * // Use scopes\n * }\n *\n * // With explicit profile\n * const workflowConfig = await useConfig('workflow', 'production');\n * ```\n */\nexport async function useConfig<T = any>(productId?: string, profileId?: string): Promise<T | undefined> {\n // Auto-detect productId from manifest.configSection if not provided\n let effectiveProductId = productId;\n if (!effectiveProductId) {\n effectiveProductId = (globalThis as typeof globalThis & { __KB_CONFIG_SECTION__?: string }).__KB_CONFIG_SECTION__;\n }\n\n if (!effectiveProductId) {\n return undefined;\n }\n\n // ── EXPLICIT OVERRIDE (2026-06-07) ──────────────────────────────────────────\n // Config is read DIRECTLY from the global the service already loaded\n // (`service-bootstrap` sets `__KB_RAW_CONFIG__` / `__KB_EFFECTIVE_CONFIG__`),\n // NOT through the `platform.config` adapter.\n //\n // Rationale: in-process the adapter was pure indirection over this same global,\n // and on the isolated/worker path it crashed — config is attached post-assembly\n // only on the parent path, so `platform.config` was undefined in worker handlers\n // (the \"F2\" bug). The global IS populated even in those workers, so reading it\n // directly is correct AND removes the adapter from the hot path.\n //\n // The `platform.config` proxy is kept ONLY as a fallback for a genuinely remote\n // worker that has no shared memory (future client/server execution).\n // ────────────────────────────────────────────────────────────────────────────\n const g = globalThis as typeof globalThis & {\n __KB_EFFECTIVE_CONFIG__?: Record<string, unknown>;\n __KB_RAW_CONFIG__?: Record<string, unknown>;\n };\n const rawConfig = g.__KB_EFFECTIVE_CONFIG__ ?? g.__KB_RAW_CONFIG__;\n\n if (rawConfig) {\n return selectProductSection<T>(rawConfig, effectiveProductId, profileId);\n }\n\n // Fallback: no global in this process (genuinely remote/isolated worker without\n // shared memory) → use the platform.config IPC proxy if present.\n const { usePlatform } = await import('./use-platform.js');\n const platform = usePlatform();\n if (platform?.config) {\n return (await platform.config.getConfig(effectiveProductId, profileId)) as T | undefined;\n }\n\n return undefined;\n}\n\n/**\n * Select a product's config section from the raw kb.config.json object.\n *\n * Mirrors core-runtime `ConfigAdapter.getConfig`: Profiles v2 first\n * (`profiles[].products[productId]`), then the legacy flat structure\n * (top-level key, with the `mind` → `knowledge` alias). Returns ONLY the\n * product-specific section, never the whole config.\n */\nfunction selectProductSection<T = any>(\n rawConfig: Record<string, unknown>,\n productId: string,\n profileId?: string,\n): T | undefined {\n const effectiveProfileId = profileId ?? process.env.KB_PROFILE ?? 'default';\n\n // Profiles v2 structure\n const profilesField = (rawConfig as { profiles?: unknown }).profiles;\n if (Array.isArray(profilesField)) {\n type RawProfile = { id?: string; products?: Record<string, unknown> };\n const profiles = profilesField as RawProfile[];\n const profile = profiles.find((p) => p.id === effectiveProfileId) ?? profiles[0];\n if (profile?.products?.[productId] !== undefined) {\n return profile.products[productId] as T;\n }\n }\n\n // Legacy flat structure (mind → knowledge alias)\n const legacyKeyMap: Record<string, string> = { mind: 'knowledge' };\n const legacyKey = legacyKeyMap[productId] ?? productId;\n if (rawConfig[legacyKey] !== undefined) {\n return rawConfig[legacyKey] as T;\n }\n\n return undefined;\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-logger\n * Global logger access helper\n *\n * Provides clean access to structured logging without context drilling.\n *\n * @example\n * ```typescript\n * import { useLogger } from '@kb-labs/shared-command-kit';\n *\n * async handler(ctx, argv, flags) {\n * const logger = useLogger();\n *\n * await logger.info('Processing started');\n * await logger.debug('Details', { userId: 123 });\n * await logger.error('Failed', { error: err });\n * }\n * ```\n */\n\nimport { usePlatform } from './use-platform';\nimport type { ILogger } from '@kb-labs/core-platform';\n\n/**\n * Access global logger\n *\n * Returns the platform logger with structured logging capabilities.\n * Supports child loggers with additional context.\n *\n * **Methods:**\n * - `logger.trace(message, meta?)` - Trace-level logs (most verbose)\n * - `logger.debug(message, meta?)` - Debug-level logs\n * - `logger.info(message, meta?)` - Info-level logs\n * - `logger.warn(message, meta?)` - Warning-level logs\n * - `logger.error(message, meta?)` - Error-level logs\n * - `logger.child(meta)` - Create child logger with additional context\n *\n * @returns Platform logger instance\n *\n * @example\n * ```typescript\n * const logger = useLogger();\n *\n * await logger.info('Task started', { taskId: '123' });\n * await logger.error('Task failed', { taskId: '123', error: err.message });\n *\n * // Child logger with persistent context\n * const taskLogger = logger.child({ taskId: '123', userId: 'user-1' });\n * await taskLogger.info('Step 1 completed');\n * await taskLogger.info('Step 2 completed');\n * ```\n */\nexport function useLogger(): ILogger {\n const platform = usePlatform();\n return platform.logger;\n}\n\n/**\n * Create child logger with additional context\n *\n * Useful for scoped logging within a specific operation.\n *\n * @param context - Additional context to attach to all log entries\n * @returns Child logger with persistent context\n *\n * @example\n * ```typescript\n * const logger = useLoggerWithContext({ operation: 'release', version: '1.0.0' });\n *\n * await logger.info('Started'); // Automatically includes operation + version\n * await logger.info('Completed');\n * ```\n */\nexport function useLoggerWithContext(context: Record<string, unknown>): ILogger {\n const logger = useLogger();\n return logger.child(context);\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-llm\n * Global LLM access helper with tier-based model selection.\n *\n * Provides clean access to LLM with adaptive tier routing.\n * Plugins specify tiers (small/medium/large), platform resolves to actual models.\n *\n * @example\n * ```typescript\n * import { useLLM } from '@kb-labs/shared-command-kit';\n *\n * async handler(ctx, argv, flags) {\n * // Simple usage (uses configured default tier)\n * const llm = useLLM();\n *\n * // Request specific tier (platform adapts if needed)\n * const llm = useLLM({ tier: 'small' }); // Simple tasks\n * const llm = useLLM({ tier: 'large' }); // Complex tasks\n *\n * // Request capabilities\n * const llm = useLLM({ tier: 'medium', capabilities: ['coding'] });\n *\n * if (llm) {\n * const result = await llm.complete('Explain this code');\n * console.log(result.content);\n * }\n * }\n * ```\n */\n\nimport { usePlatform } from './use-platform.js';\nimport type {\n ILLM,\n LLMTier,\n LLMOptions,\n LLMResponse,\n LLMMessage,\n LLMToolCallOptions,\n LLMToolCallResponse,\n UseLLMOptions,\n ILLMRouter,\n LLMAdapterBinding,\n LLMExecutionPolicy,\n LLMProtocolCapabilities,\n LLMCacheDecisionTrace,\n} from '@kb-labs/core-platform';\n\n/**\n * Access global LLM adapter with tier-based selection.\n *\n * Platform automatically adapts to available models:\n * - If plugin requests 'small' but 'medium' configured → uses 'medium' (escalation)\n * - If plugin requests 'large' but 'medium' configured → uses 'medium' with warning (degradation)\n *\n * **Tiers are user-defined slots:**\n * - `small` - Plugin says: \"This task is simple\"\n * - `medium` - Plugin says: \"Standard task\"\n * - `large` - Plugin says: \"Complex task, need maximum quality\"\n *\n * User decides what model maps to each tier in their config.\n *\n * @param options - Optional tier and capability requirements\n * @returns LLM adapter or undefined if not configured\n *\n * @example\n * ```typescript\n * // Simple usage (uses configured default)\n * const llm = useLLM();\n *\n * // Request specific tier\n * const llm = useLLM({ tier: 'small' }); // Simple tasks\n * const llm = useLLM({ tier: 'large' }); // Complex tasks\n *\n * // Request capabilities\n * const llm = useLLM({ tier: 'medium', capabilities: ['coding'] });\n * const llm = useLLM({ capabilities: ['vision'] });\n *\n * if (llm) {\n * const result = await llm.complete('Generate commit message');\n * console.log(result.content);\n * }\n * ```\n */\nexport function useLLM(options?: UseLLMOptions): ILLM | undefined {\n const platform = usePlatform();\n const llm = platform.llm;\n\n if (!llm) {\n return undefined;\n }\n\n // If router and options given → return immutable LazyBoundLLM (no state mutation)\n if (options && isLLMRouter(llm)) {\n return new LazyBoundLLM(llm, options);\n }\n\n return llm;\n}\n\n/**\n * Lazy adapter binding that resolves tier on first use.\n * Immutable — does NOT mutate the global LLMRouter state.\n * This fixes the race condition where useLLM({ tier: 'large' }) was immediately\n * overwritten by useLLM({ tier: 'small' }) from SmartSummarizer.\n */\nclass LazyBoundLLM implements ILLM {\n private _resolved: Promise<LLMAdapterBinding> | null = null;\n\n constructor(\n private readonly router: ILLM & ILLMRouter,\n private readonly options: UseLLMOptions,\n ) {}\n\n private resolve(): Promise<LLMAdapterBinding> {\n if (!this._resolved) {\n this._resolved = this.router.resolveAdapter(this.options);\n }\n return this._resolved;\n }\n\n private mergeExecutionPolicy(callOptions?: LLMOptions): LLMExecutionPolicy | undefined {\n const globalPolicy = this.options.execution;\n const localPolicy = callOptions?.execution;\n if (!globalPolicy && !localPolicy) {\n return undefined;\n }\n return {\n ...globalPolicy,\n ...localPolicy,\n cache: { ...globalPolicy?.cache, ...localPolicy?.cache },\n stream: { ...globalPolicy?.stream, ...localPolicy?.stream },\n };\n }\n\n private async resolveProtocolCapabilities(adapter: ILLM): Promise<LLMProtocolCapabilities> {\n if (!adapter.getProtocolCapabilities) {\n return {\n cache: { supported: false },\n stream: { supported: true },\n };\n }\n return adapter.getProtocolCapabilities();\n }\n\n private enforceCachePolicy(caps: LLMProtocolCapabilities, execution?: LLMExecutionPolicy): void {\n if (execution?.cache?.mode === 'require' && !caps.cache.supported) {\n throw new Error('CACHE_NOT_SUPPORTED: adapter does not support required cache policy');\n }\n }\n\n private buildDecisionTrace(\n caps: LLMProtocolCapabilities,\n execution: LLMExecutionPolicy | undefined,\n streamAppliedMode: 'prefer' | 'require' | 'off',\n streamFallback?: 'complete',\n reason?: string,\n ): LLMCacheDecisionTrace {\n const requestedCacheMode = execution?.cache?.mode ?? 'prefer';\n const requestedStreamMode = execution?.stream?.mode ?? 'prefer';\n\n return {\n cacheRequestedMode: requestedCacheMode,\n cacheSupported: caps.cache.supported,\n cacheAppliedMode:\n requestedCacheMode === 'require' || requestedCacheMode === 'bypass'\n ? requestedCacheMode\n : caps.cache.supported\n ? 'prefer'\n : 'bypass',\n streamRequestedMode: requestedStreamMode,\n streamSupported: caps.stream.supported,\n streamAppliedMode,\n streamFallback,\n reason,\n };\n }\n\n private withDecisionMetadata(\n options: LLMOptions | undefined,\n trace: LLMCacheDecisionTrace,\n ): LLMOptions | undefined {\n if (!options) {\n return { metadata: { cacheDecisionTrace: trace } };\n }\n\n return {\n ...options,\n metadata: {\n ...options.metadata,\n cacheDecisionTrace: trace,\n },\n };\n }\n\n async complete(prompt: string, options?: LLMOptions): Promise<LLMResponse> {\n const { adapter, model } = await this.resolve();\n const execution = this.mergeExecutionPolicy(options);\n const caps = await this.resolveProtocolCapabilities(adapter);\n this.enforceCachePolicy(caps, execution);\n const trace = this.buildDecisionTrace(caps, execution, 'off');\n const optionsWithTrace = this.withDecisionMetadata(options, trace);\n return adapter.complete(prompt, { ...optionsWithTrace, model, execution });\n }\n\n async *stream(prompt: string, options?: LLMOptions): AsyncIterable<string> {\n const { adapter, model } = await this.resolve();\n const execution = this.mergeExecutionPolicy(options);\n const caps = await this.resolveProtocolCapabilities(adapter);\n this.enforceCachePolicy(caps, execution);\n\n const streamMode = execution?.stream?.mode ?? 'prefer';\n const canStream = caps.stream.supported;\n const allowFallback = execution?.stream?.fallbackToComplete ?? true;\n\n if (streamMode === 'off' || (!canStream && streamMode === 'prefer' && allowFallback)) {\n const fallbackReason =\n streamMode === 'off'\n ? 'STREAM_OFF'\n : 'STREAM_UNSUPPORTED_FALLBACK_TO_COMPLETE';\n const trace = this.buildDecisionTrace(caps, execution, 'off', 'complete', fallbackReason);\n const optionsWithTrace = this.withDecisionMetadata(options, trace);\n const response = await adapter.complete(prompt, { ...optionsWithTrace, model, execution });\n if (response.content) {\n yield response.content;\n }\n return;\n }\n\n if (!canStream && streamMode === 'require') {\n throw new Error('STREAM_NOT_SUPPORTED: adapter does not support required streaming');\n }\n\n const trace = this.buildDecisionTrace(caps, execution, streamMode);\n const optionsWithTrace = this.withDecisionMetadata(options, trace);\n yield* adapter.stream(prompt, { ...optionsWithTrace, model, execution });\n }\n\n async chatWithTools(\n messages: LLMMessage[],\n options: LLMToolCallOptions,\n ): Promise<LLMToolCallResponse> {\n const { adapter, model, tier } = await this.resolve();\n const execution = this.mergeExecutionPolicy(options);\n const caps = await this.resolveProtocolCapabilities(adapter);\n this.enforceCachePolicy(caps, execution);\n if (!adapter.chatWithTools) {\n throw new Error('Current adapter does not support chatWithTools');\n }\n const trace = this.buildDecisionTrace(caps, execution, 'off');\n const optionsWithTrace = this.withDecisionMetadata(options, trace) as LLMToolCallOptions;\n return adapter.chatWithTools(messages, {\n ...optionsWithTrace,\n model,\n execution,\n metadata: { ...optionsWithTrace.metadata, tier },\n });\n }\n}\n\n/**\n * Check if LLM is available.\n *\n * Useful for conditional logic (LLM-powered vs deterministic fallback).\n *\n * @returns true if LLM is configured and ready\n *\n * @example\n * ```typescript\n * if (isLLMAvailable()) {\n * const summary = await generateWithLLM(data);\n * } else {\n * const summary = generateDeterministic(data);\n * }\n * ```\n */\nexport function isLLMAvailable(): boolean {\n const llm = useLLM();\n return !!llm;\n}\n\n/**\n * Get configured LLM tier.\n *\n * Useful for diagnostics and logging.\n *\n * @returns Configured tier or undefined if LLM not available/not a router\n *\n * @example\n * ```typescript\n * const tier = getLLMTier();\n * console.log(`Using LLM tier: ${tier ?? 'default'}`);\n * ```\n */\nexport function getLLMTier(): LLMTier | undefined {\n const platform = usePlatform();\n const llm = platform.llm;\n\n if (llm && isLLMRouter(llm)) {\n return llm.getConfiguredTier();\n }\n\n return undefined;\n}\n\n/**\n * Type guard for ILLMRouter.\n */\nfunction isLLMRouter(llm: ILLM): llm is ILLM & ILLMRouter {\n return (\n typeof (llm as unknown as ILLMRouter).getConfiguredTier === 'function' &&\n typeof (llm as unknown as ILLMRouter).resolve === 'function'\n );\n}\n\n// Re-export types for convenience\nexport type { LLMTier, UseLLMOptions } from '@kb-labs/core-platform';\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-embeddings\n * Global Embeddings access helper\n */\n\nimport { usePlatform } from './use-platform';\nimport type { IEmbeddings } from '@kb-labs/core-platform';\n\n/**\n * Access global Embeddings adapter\n *\n * Returns the platform embeddings adapter (OpenAI, etc.).\n * Returns undefined if embeddings is not configured (graceful degradation).\n *\n * @returns Embeddings adapter or undefined if not configured\n *\n * @example\n * ```typescript\n * const embeddings = useEmbeddings();\n *\n * if (embeddings) {\n * const vector = await embeddings.embed('Hello, world!');\n * console.log(vector.length); // e.g., 1536 for OpenAI\n * }\n * ```\n */\nexport function useEmbeddings(): IEmbeddings | undefined {\n const platform = usePlatform();\n return platform.embeddings;\n}\n\n/**\n * Check if Embeddings is available\n *\n * @returns true if embeddings is configured and ready\n *\n * @example\n * ```typescript\n * if (isEmbeddingsAvailable()) {\n * const vector = await embeddings.embed(text);\n * } else {\n * // Use deterministic fallback\n * }\n * ```\n */\nexport function isEmbeddingsAvailable(): boolean {\n const embeddings = useEmbeddings();\n return !!embeddings;\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-vector-store\n * Global VectorStore access helper\n */\n\nimport { usePlatform } from './use-platform';\nimport type { IVectorStore } from '@kb-labs/core-platform';\n\n/**\n * Access global VectorStore adapter\n *\n * Returns the platform vector store adapter (Qdrant, local, etc.).\n * Returns undefined if vectorStore is not configured (graceful degradation).\n *\n * @returns VectorStore adapter or undefined if not configured\n *\n * @example\n * ```typescript\n * const vectorStore = useVectorStore();\n *\n * if (vectorStore) {\n * await vectorStore.upsert([{ id: '1', vector: [0.1, 0.2], metadata: {} }]);\n * const results = await vectorStore.search([0.1, 0.2], 10);\n * }\n * ```\n */\nexport function useVectorStore(): IVectorStore | undefined {\n const platform = usePlatform();\n return platform.vectorStore;\n}\n\n/**\n * Check if VectorStore is available\n *\n * @returns true if vectorStore is configured and ready\n *\n * @example\n * ```typescript\n * if (isVectorStoreAvailable()) {\n * await vectorStore.upsert(records);\n * } else {\n * // Use local fallback\n * }\n * ```\n */\nexport function isVectorStoreAvailable(): boolean {\n const vectorStore = useVectorStore();\n return !!vectorStore;\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-analytics\n * Global analytics access helper\n *\n * Provides clean access to analytics/telemetry without context drilling.\n *\n * @example\n * ```typescript\n * import { useAnalytics } from '@kb-labs/shared-command-kit';\n *\n * async handler(ctx, argv, flags) {\n * const analytics = useAnalytics();\n *\n * if (analytics) {\n * await analytics.track('release_started', { version: '1.0.0' });\n * analytics.metric('release_duration_ms', 1234);\n * }\n * }\n * ```\n */\n\nimport { usePlatform } from './use-platform';\nimport type { IAnalytics } from '@kb-labs/core-platform';\n\n/**\n * Access global analytics adapter\n *\n * Returns the platform analytics adapter for tracking events and metrics.\n * Returns undefined if analytics is not configured (graceful degradation).\n *\n * **Methods:**\n * - `analytics.track(event, properties?)` - Track events\n * - `analytics.metric(name, value, tags?)` - Record metrics\n *\n * **Always check availability:**\n * ```typescript\n * const analytics = useAnalytics();\n * if (analytics) {\n * await analytics.track('event');\n * }\n * ```\n *\n * @returns Analytics adapter or undefined if not configured\n *\n * @example\n * ```typescript\n * const analytics = useAnalytics();\n *\n * if (analytics) {\n * await analytics.track('command_executed', {\n * command: 'release:run',\n * duration_ms: 1234,\n * success: true,\n * });\n *\n * analytics.metric('release_packages_count', 5, {\n * project: 'kb-labs',\n * });\n * }\n * ```\n */\nexport function useAnalytics(): IAnalytics | undefined {\n const platform = usePlatform();\n return platform.analytics;\n}\n\n/**\n * Track event with analytics (safe, global singleton)\n *\n * Convenience wrapper that uses global platform analytics.\n * Does nothing if analytics is not configured.\n *\n * NOTE: For context-based analytics, use trackEvent() from '../analytics/with-analytics'.\n * This helper uses global singleton, not request-scoped context.\n *\n * @param event - Event name\n * @param properties - Event properties\n *\n * @example\n * ```typescript\n * import { trackAnalyticsEvent } from '@kb-labs/shared-command-kit/helpers';\n *\n * // No need to check if analytics exists\n * await trackAnalyticsEvent('release_completed', { version: '1.0.0', packages: 5 });\n * ```\n */\nexport async function trackAnalyticsEvent(\n event: string,\n properties?: Record<string, unknown>\n): Promise<void> {\n const analytics = useAnalytics();\n if (analytics) {\n await analytics.track(event, properties);\n }\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-storage\n * Global storage access helper\n *\n * Provides clean access to file/blob storage adapter.\n *\n * @example\n * ```typescript\n * import { useStorage } from '@kb-labs/shared-command-kit';\n *\n * async handler(ctx, argv, flags) {\n * const storage = useStorage();\n *\n * if (storage) {\n * await storage.write('path/to/file.txt', 'content');\n * const content = await storage.read('path/to/file.txt');\n * }\n * }\n * ```\n */\n\nimport { usePlatform } from './use-platform';\nimport type { IStorage } from '@kb-labs/core-platform';\n\n/**\n * Access global storage adapter\n *\n * Returns the platform storage adapter for file/blob operations.\n * Returns undefined if storage is not configured (graceful degradation).\n *\n * **Methods:**\n * - `storage.read(path)` - Read file content\n * - `storage.write(path, content)` - Write file content\n * - `storage.exists(path)` - Check if file exists\n * - `storage.delete(path)` - Delete file\n * - `storage.list(prefix?)` - List files\n *\n * **Always check availability:**\n * ```typescript\n * const storage = useStorage();\n * if (storage) {\n * await storage.write('file.txt', 'content');\n * }\n * ```\n *\n * @returns Storage adapter or undefined if not configured\n *\n * @example\n * ```typescript\n * const storage = useStorage();\n *\n * if (storage) {\n * // Write file\n * await storage.write('releases/v1.0.0.json', JSON.stringify(data));\n *\n * // Read file\n * const content = await storage.read('releases/v1.0.0.json');\n * const data = JSON.parse(content);\n *\n * // Check existence\n * const exists = await storage.exists('releases/v1.0.0.json');\n *\n * // List files\n * const files = await storage.list('releases/');\n * }\n * ```\n */\nexport function useStorage(): IStorage | undefined {\n const platform = usePlatform();\n return platform.storage;\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-cache\n * Global Cache access helper\n *\n * Provides clean access to platform cache (Redis, InMemory, or custom adapter).\n *\n * @example\n * ```typescript\n * import { useCache } from '@kb-labs/shared-command-kit';\n *\n * async handler(ctx, argv, flags) {\n * const cache = useCache();\n *\n * if (cache) {\n * await cache.set('key', { data: 'value' }, 60000); // TTL: 60s\n * const value = await cache.get('key');\n * console.log(value);\n * }\n * }\n * ```\n */\n\nimport { usePlatform } from './use-platform.js';\nimport type { ICache } from '@kb-labs/core-platform';\n\n/**\n * Access global cache adapter\n *\n * Returns the platform cache adapter (Redis, InMemory, or custom).\n * Returns undefined if cache is not configured (graceful degradation).\n *\n * **Methods:**\n * - `cache.set(key, value, ttlMs?)` - Store value with optional TTL\n * - `cache.get<T>(key)` - Retrieve value by key\n * - `cache.delete(key)` - Remove value\n * - `cache.clear()` - Clear all cached values\n *\n * **Always check availability:**\n * ```typescript\n * const cache = useCache();\n * if (cache) {\n * await cache.set('query-123', result, 60000);\n * } else {\n * // No caching, compute every time\n * }\n * ```\n *\n * @returns Cache adapter or undefined if not configured\n *\n * @example\n * ```typescript\n * const cache = useCache();\n *\n * if (cache) {\n * // Check cache first\n * const cached = await cache.get<QueryResult>('query-123');\n * if (cached) {\n * return cached;\n * }\n *\n * // Compute result\n * const result = await expensiveQuery();\n *\n * // Cache for 5 minutes\n * await cache.set('query-123', result, 5 * 60 * 1000);\n *\n * return result;\n * }\n * ```\n */\nexport function useCache(): ICache | undefined {\n const platform = usePlatform();\n return platform.cache;\n}\n\n/**\n * Check if cache is available\n *\n * Useful for conditional logic (cached vs non-cached execution).\n *\n * @returns true if cache is configured and ready\n *\n * @example\n * ```typescript\n * if (isCacheAvailable()) {\n * // Use cached results\n * const result = await getCachedOrCompute(key);\n * } else {\n * // Compute every time\n * const result = await compute();\n * }\n * ```\n */\nexport function isCacheAvailable(): boolean {\n const cache = useCache();\n return !!cache;\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-document-database\n *\n * Hook for the per-plugin document database — structured persistence with\n * filters, transactions, and indexed collections.\n *\n * The adapter is resolved from the current `usePlatform()` context, so the\n * instance you receive is already wrapped with this plugin's permissions:\n * collection names are namespaced under `<pluginId>__<name>`, and any call\n * to a collection the plugin didn't declare in\n * `permissions.platform.database.document.owns` / `.access` rejects with\n * `PermissionError`.\n *\n * @example\n * ```typescript\n * import { useDocumentDatabase } from '@kb-labs/shared-command-kit';\n *\n * interface Run extends BaseDocument {\n * status: 'queued' | 'running' | 'done';\n * startedAt: number;\n * }\n *\n * async function handler() {\n * const docs = useDocumentDatabase();\n * if (!docs) {\n * throw new Error('Plugin needs documentDatabase configured');\n * }\n *\n * await docs.ensureCollection('runs', {\n * indexes: [{ path: 'status' }],\n * });\n *\n * const queued = await docs.find<Run>('runs', { status: { $eq: 'queued' } });\n * return queued;\n * }\n * ```\n */\n\nimport type { IDocumentDatabase } from '@kb-labs/core-platform';\nimport { usePlatform } from './use-platform.js';\n\n/**\n * Resolve the document database for the current execution.\n *\n * Returns `undefined` when no adapter is configured at all. When a plugin\n * declared permissions but is missing the wiring (NoOp adapter on the\n * platform side) you still get an instance — calls just throw on use.\n *\n * Always check before using:\n *\n * ```ts\n * const docs = useDocumentDatabase();\n * if (!docs) {\n * // The platform was started without a document database;\n * // either skip the feature or fail fast with a clear error.\n * return;\n * }\n * ```\n */\nexport function useDocumentDatabase(): IDocumentDatabase | undefined {\n const platform = usePlatform();\n return platform.documentDatabase;\n}\n\n/**\n * Cheap check for \"is the document database available?\". Returns true even\n * for NoOp adapters configured by the platform — use this to gate optional\n * features, not as a security check.\n */\nexport function isDocumentDatabaseAvailable(): boolean {\n return useDocumentDatabase() !== undefined;\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-kv-store\n *\n * Hook for the per-plugin durable key-value store.\n *\n * Unlike `useCache`, KV is the source of truth — entries persist until\n * explicitly deleted or until their TTL expires. Use it for sessions,\n * distributed locks, idempotency keys, counters — anything where losing\n * the entry is a bug.\n *\n * Keys are namespaced under `<pluginId>:` transparently. Two plugins\n * setting `\"counter\"` do not collide. `scan` only yields the calling\n * plugin's own keys.\n *\n * @example\n * ```typescript\n * import { useKVStore } from '@kb-labs/shared-command-kit';\n *\n * async function withLock<T>(name: string, fn: () => Promise<T>): Promise<T> {\n * const kv = useKVStore();\n * if (!kv) throw new Error('KV store not configured');\n *\n * const token = crypto.randomUUID();\n * const acquired = await kv.setIfNotExists(`lock:${name}`, token, { ttlMs: 30_000 });\n * if (!acquired) throw new Error('lock held');\n *\n * try {\n * return await fn();\n * } finally {\n * // Release only if we still hold the token (cas guards against ttl-takeover).\n * await kv.cas(`lock:${name}`, token, null);\n * }\n * }\n * ```\n */\n\nimport type { IKVStore } from '@kb-labs/core-platform';\nimport { usePlatform } from './use-platform.js';\n\n/**\n * Resolve the KV store for the current execution.\n *\n * Returns `undefined` only when no adapter is wired at all. A plugin\n * that didn't declare `permissions.platform.database.kvStore` still gets\n * an instance — every method throws `PermissionError` on use.\n */\nexport function useKVStore(): IKVStore | undefined {\n const platform = usePlatform();\n return platform.kvStore;\n}\n\n/**\n * Cheap check used to gate optional features. Note that it returns true\n * even when the plugin lacks `permissions.platform.database.kvStore` —\n * the runtime will replace the adapter with a deny stub in that case, so\n * this check tells you \"is the slot wired?\", not \"can I actually use it?\".\n */\nexport function isKVStoreAvailable(): boolean {\n return useKVStore() !== undefined;\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-notifications\n * Platform notifier access helper.\n *\n * @example\n * ```typescript\n * import { useNotifications } from '@kb-labs/shared-command-kit';\n *\n * async handler(ctx, argv, flags) {\n * const notifier = useNotifications();\n * await notifier?.notify({ title: 'Done', body: 'Workflow complete', severity: 'info' });\n * }\n * ```\n */\n\nimport { usePlatform } from './use-platform';\nimport type { INotifier } from '@kb-labs/core-platform';\n\n/**\n * Access the platform notifier adapter.\n * Returns undefined if the notifier adapter is not configured.\n *\n * @example\n * ```typescript\n * const notifier = useNotifications();\n * if (notifier) {\n * await notifier.notify({ title: 'Alert', body: 'Something failed', severity: 'critical' });\n * }\n * ```\n */\nexport function useNotifications(): INotifier | undefined {\n const platform = usePlatform();\n return platform.notifier;\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-env\n *\n * Sandboxed environment variable access.\n *\n * Reads from runtimeContext (AsyncLocalStorage) when running inside\n * a governed handler execution (worker-pool, subprocess).\n * Falls back to process.env when no runtime context is set\n * (direct CLI, tests, code outside handler).\n *\n * @example\n * ```typescript\n * import { useEnv } from '@kb-labs/sdk';\n *\n * const token = useEnv('NPM_TOKEN');\n * const ci = useEnv('CI');\n * ```\n */\n\nimport { runtimeContext } from '@kb-labs/plugin-contracts';\n\n/**\n * Read an environment variable through the sandboxed runtime context.\n *\n * Inside a governed handler: reads through env-shim (permission-checked).\n * Outside handler context: reads process.env directly (backward compat).\n */\nexport function useEnv(key: string): string | undefined {\n const runtime = runtimeContext.getStore();\n if (runtime?.env) {\n return runtime.env(key);\n }\n return process.env[key];\n}\n","/**\n * @module @kb-labs/shared-command-kit\n * System Command Definition - For KB Labs official commands with full privileges\n */\n\nimport {\n type CommandResult,\n type FlagSchemaDefinition,\n type InferFlags,\n defineFlags,\n validateFlags,\n FlagValidationError,\n} from './index';\nimport type { PluginContextV3 } from '@kb-labs/plugin-contracts';\nimport { formatError } from './errors/index';\n\n/**\n * Flag definition for Command interface\n */\ninterface FlagDefinition {\n name: string;\n type: 'string' | 'boolean' | 'number' | 'array';\n alias?: string;\n description?: string;\n default?: unknown;\n required?: boolean;\n choices?: string[];\n}\n\n/**\n * Command definition for system commands\n */\nexport interface Command {\n name: string;\n describe: string;\n longDescription?: string;\n category?: string;\n aliases?: string[];\n flags?: FlagDefinition[];\n examples?: string[];\n run: (ctx: PluginContextV3, argv: string[], flags: Record<string, unknown>) => Promise<number>;\n}\n\n/**\n * Command group definition\n */\nexport interface CommandGroup {\n name: string;\n describe: string;\n commands: Command[];\n subgroups?: CommandGroup[];\n}\n\n/**\n * Convert flag schema definition to FlagDefinition[] format\n * Used for compatibility with Command interface\n */\nfunction convertFlagSchema(schema: FlagSchemaDefinition): FlagDefinition[] {\n return Object.entries(schema).map(([name, def]) => {\n const result: FlagDefinition = {\n name,\n type: def.type,\n alias: def.alias,\n description: def.description,\n default: def.default,\n required: def.required,\n };\n \n // Add choices if present (for string flags with choices)\n if (def.type === 'string' && 'choices' in def && Array.isArray(def.choices)) {\n result.choices = [...def.choices];\n }\n \n return result;\n });\n}\n\n/**\n * Extended command config for system commands\n *\n * All type parameters are optional - use them when you want type safety, skip them for simplicity.\n *\n * TFlags can be inferred from the flags schema, but can also be explicitly provided\n * for better type inference in complex cases.\n *\n * TResult must extend CommandResult (requires ok: boolean field).\n */\nexport interface SystemCommandConfig<\n TFlags extends FlagSchemaDefinition = FlagSchemaDefinition,\n TResult extends CommandResult = CommandResult,\n TArgv extends readonly string[] = string[]\n> {\n /** Command name (required for system commands) */\n name: string;\n /** Command description (required for system commands) */\n description: string;\n /** Long description for help */\n longDescription?: string;\n /** Category (defaults to 'system') */\n category?: string;\n /** Command aliases */\n aliases?: string[];\n /** Usage examples */\n examples?: string[];\n /** Flag schema definition - TypeScript will infer TFlags from this */\n flags: TFlags;\n /**\n * Analytics configuration (legacy field, kept for backward compatibility)\n * Use ctx.platform.analytics.track() or withAnalytics() helper instead\n */\n analytics?: {\n command?: string;\n startEvent?: string;\n finishEvent?: string;\n actor?: string;\n context?: Record<string, unknown>;\n includeFlags?: boolean;\n };\n /** Command handler - receives PluginContextV3 and must return TResult */\n handler: (ctx: PluginContextV3, argv: TArgv, flags: InferFlags<TFlags>) => Promise<number | TResult> | number | TResult;\n /** Optional formatter - receives TResult with inferred flags */\n formatter?: (result: TResult, ctx: PluginContextV3, flags: InferFlags<TFlags>, argv?: TArgv) => void;\n}\n\n/**\n * Define a system command with full privileges\n * \n * System commands are KB Labs official commands that run with full system access,\n * bypassing sandbox restrictions. They are architecturally separated from plugin\n * commands - plugins can NEVER gain system privileges.\n * \n * TResult is REQUIRED - every command must explicitly declare its result contract.\n * This ensures type safety and enables future contract validation.\n * \n * @example\n * ```typescript\n * import { defineSystemCommand, type CommandResult, type FlagSchemaDefinition } from '@kb-labs/shared-command-kit';\n *\n * // Simple command with automatic flag type inference (RECOMMENDED)\n * export const helloCommand = defineSystemCommand<CommandResult & { message: string }>({\n * name: 'hello',\n * description: 'Print a friendly greeting',\n * category: 'system',\n * flags: {\n * name: { type: 'string', description: 'Name to greet' },\n * json: { type: 'boolean', default: false },\n * } satisfies FlagSchemaDefinition, // Preserves literal types for type inference\n * async handler(ctx, argv, flags) {\n * // ctx is EnhancedCliContext (extends PluginContextV3)\n * // ctx.cwd - working directory (V2 promoted field)\n * // ctx.ui - UI output API with new convenience methods\n * // flags.name is inferred as string | undefined\n * const message = `Hello, ${flags.name || 'World'}!`;\n *\n * // UI output (CLI only, no-op in REST/Workflow)\n * if (!flags.json) {\n * if (ctx.ui?.success) {\n * ctx.ui.success('Greeting', [\n * { items: [message] },\n * ]);\n * }\n * } else {\n * ctx.ui?.json({ message });\n * }\n *\n * return { ok: true, message };\n * },\n * });\n * \n * // Command with explicit result type and automatic flag inference\n * type WorkflowListResult = CommandResult & {\n * workflows: Array<{ id: string }>;\n * total: number;\n * };\n *\n * export const wfList = defineSystemCommand<WorkflowListResult>({\n * name: 'list',\n * description: 'List workflows',\n * flags: {\n * source: { type: 'string', default: 'all' },\n * tag: { type: 'string' },\n * json: { type: 'boolean', default: false },\n * } satisfies FlagSchemaDefinition, // TypeScript infers flag types automatically\n * async handler(ctx, argv, flags) {\n * // flags.source is inferred as string\n * // flags.tag is inferred as string | undefined\n * // flags.json is inferred as boolean\n * const workflows = await listWorkflows(flags.source, flags.tag);\n *\n * // UI output (new convenience methods)\n * if (!flags.json) {\n * if (ctx.ui?.success) {\n * ctx.ui.success('Workflows', [\n * { header: 'Summary', items: [`Total: ${workflows.length}`, `Source: ${flags.source}`] },\n * { items: workflows.map(w => `• ${w.id}`) },\n * ]);\n * }\n * } else {\n * ctx.ui?.json({ workflows, total: workflows.length });\n * }\n *\n * return { ok: true, workflows, total: workflows.length };\n * },\n * });\n * \n * // Command with explicit flag types (for complex cases)\n * export const wfRun = defineSystemCommand<\n * { 'workflow-id': { type: 'string'; required: true } },\n * CommandResult & { run: WorkflowRun }\n * >({\n * name: 'run',\n * description: 'Execute a workflow',\n * flags: {\n * 'workflow-id': { type: 'string', required: true },\n * },\n * async handler(ctx, argv, flags) {\n * // flags['workflow-id'] is inferred as string (required)\n *\n * // Progress tracking (CLI only, no-op in REST/Workflow)\n * ctx.ui?.startProgress('running', 'Starting workflow...');\n * const run = await executeWorkflow(flags['workflow-id']);\n * ctx.ui?.completeProgress('running', 'Workflow started!');\n *\n * return { ok: true, run };\n * },\n * });\n *\n * // Note: System commands support all UI convenience methods:\n * // - ctx.ui.success() / showError() / warning() / info() - Result display with sideBox\n * // - ctx.ui.startProgress() / completeProgress() / failProgress() - Progress tracking\n * // - ctx.ui.table() / keyValue() / list() - Low-level formatting\n * // All UI methods are CLI-only and no-op in REST/Workflow contexts\n * ```\n */\n// Overload for explicit TFlags and TResult\nexport function defineSystemCommand<\n TFlags extends FlagSchemaDefinition,\n TResult extends CommandResult = CommandResult,\n TArgv extends readonly string[] = string[]\n>(\n config: SystemCommandConfig<TFlags, TResult, TArgv>\n): Command;\n// Implementation - all parameters optional with defaults\nexport function defineSystemCommand<\n TFlags extends FlagSchemaDefinition = FlagSchemaDefinition,\n TResult extends CommandResult = CommandResult,\n TArgv extends readonly string[] = string[]\n>(\n config: SystemCommandConfig<TFlags, TResult, TArgv>\n): Command {\n const { name, description, longDescription, category, aliases, examples, flags, handler, formatter } = config;\n\n // Return command with direct handler (no wrapping needed - system commands don't use V3 defineCommand)\n return {\n name,\n describe: description,\n longDescription,\n category: category || 'system',\n aliases: aliases || [],\n flags: flags ? convertFlagSchema(flags) : [],\n examples: examples || [],\n run: async (ctx: PluginContextV3, argv: string[], rawFlags: Record<string, unknown>) => {\n const jsonMode = Boolean(rawFlags.json);\n\n // Log command start\n ctx.platform?.logger?.info?.(`Command ${name} started`);\n\n // Validate flags only if schema is defined\n let validatedFlags: InferFlags<TFlags>;\n\n if (flags) {\n const flagSchema = defineFlags(flags);\n try {\n validatedFlags = await validateFlags(rawFlags, flagSchema) as InferFlags<TFlags>;\n } catch (error) {\n // Enhance validation error with command name\n if (error instanceof FlagValidationError && name && !error.commandName) {\n (error as { commandName?: string }).commandName = name;\n }\n\n // Show stack trace only in debug mode\n const showStack = Boolean(rawFlags.debug);\n const formatted = formatError(error, { showStack, jsonMode });\n\n if (jsonMode) {\n ctx.ui?.json(formatted.json);\n } else {\n ctx.ui?.error(formatted.message);\n }\n\n // Return specific exit code for validation errors\n return 3; // EXIT_CODES.INVALID_FLAGS\n }\n } else {\n // No schema defined - pass raw flags as-is\n validatedFlags = rawFlags as InferFlags<TFlags>;\n }\n\n // Call handler with error handling\n let result: number | TResult;\n try {\n result = await handler(ctx, argv as unknown as TArgv, validatedFlags);\n } catch (error) {\n // Log error to platform logger\n const errorMessage = error instanceof Error ? error.message : String(error);\n ctx.platform?.logger?.error?.(`Command ${name} failed: ${errorMessage}`);\n\n // Display error to user\n if (jsonMode) {\n ctx.ui?.json({ ok: false, error: errorMessage });\n } else {\n ctx.ui?.error(errorMessage);\n }\n\n // Return error exit code\n return 1;\n }\n\n // Call formatter if provided and result is not a number\n if (formatter && typeof result !== 'number') {\n formatter(result as TResult, ctx, validatedFlags, argv as unknown as TArgv);\n }\n\n // Log command completion\n ctx.platform?.logger?.info?.(`Command ${name} completed`);\n\n // Convert result to exit code\n if (typeof result === 'number') {\n return result;\n }\n return result.ok ? 0 : 1;\n },\n };\n}\n\n/**\n * Create a system command group\n * \n * Groups organize related system commands for better help organization\n * and registration.\n * \n * @example\n * ```typescript\n * export const systemInfoGroup = defineSystemCommandGroup(\n * 'system:info',\n * 'System information commands',\n * [helloCommand, versionCommand, healthCommand]\n * );\n * ```\n */\nexport function defineSystemCommandGroup(\n name: string,\n describe: string,\n commands: Command[]\n): CommandGroup {\n return {\n name,\n describe,\n commands,\n };\n}\n","/**\n * Manifest definition helpers\n * @module @kb-labs/shared-command-kit/manifest\n */\n\nimport type { ManifestV3 } from '@kb-labs/plugin-contracts';\n\n/**\n * Define a ManifestV3 with type safety\n *\n * This is a type-safe wrapper for creating ManifestV3 objects.\n * It provides compile-time validation via TypeScript and optional\n * runtime validation via Zod (if enabled).\n *\n * For built plugins (dist/), this function is compiled away and only\n * the plain object remains, avoiding runtime dependencies.\n *\n * @example\n * ```typescript\n * // Basic usage\n * export const manifest = defineManifest({\n * schema: 'kb.plugin/2',\n * id: '@kb-labs/my-plugin',\n * version: '1.0.0',\n * cli: {\n * commands: [...]\n * }\n * });\n *\n * // With contracts typing (Level 2)\n * import type { PluginContracts } from '@kb-labs/my-plugin-contracts';\n *\n * export const manifest = defineManifest<typeof pluginContractsManifest>({\n * schema: 'kb.plugin/2',\n * id: '@kb-labs/my-plugin',\n * artifacts: [\n * { id: 'my.artifact.id' } // ✅ Type-checked against contracts\n * ],\n * cli: {\n * commands: [{\n * id: 'my:command', // ✅ Type-checked against contracts\n * // ...\n * }]\n * }\n * });\n * ```\n *\n * @param manifest - Manifest configuration\n * @returns ManifestV3 object\n */\nexport function defineManifest<TContracts = unknown>(\n manifest: ManifestV3\n): ManifestV3 {\n // In development, you could add runtime validation here if needed:\n // if (process.env.NODE_ENV === 'development') {\n // validateManifestV3(manifest);\n // }\n\n // For production builds, this is just an identity function\n // that provides type safety at compile time\n return manifest;\n}\n\n/**\n * Flag schema definition (compatible with defineFlags)\n */\ntype FlagSchemaDefinition = Record<\n string,\n {\n type: 'string' | 'boolean' | 'number' | 'array';\n alias?: string;\n default?: unknown;\n description?: string;\n choices?: string[];\n required?: boolean;\n }\n>;\n\n/**\n * Convert flag schema definition to CliFlagDecl[] for manifest\n *\n * This helper converts the flag schema format used in defineCommand\n * to the array format expected in ManifestV3.\n *\n * @example\n * ```typescript\n * const helloFlags = {\n * name: { type: 'string', description: 'Name to greet', alias: 'n' },\n * json: { type: 'boolean', description: 'Emit JSON', default: false }\n * };\n *\n * const manifestFlags = defineCommandFlags(helloFlags);\n * // Use in manifest: flags: manifestFlags\n *\n * // In manifest.v2.ts:\n * export const manifest = defineManifest({\n * cli: {\n * commands: [{\n * id: 'hello',\n * flags: defineCommandFlags(helloFlags),\n * // ...\n * }]\n * }\n * });\n * ```\n */\nexport function defineCommandFlags<TFlags extends FlagSchemaDefinition>(\n flags: TFlags\n): Array<{\n name: string;\n type: 'string' | 'boolean' | 'number' | 'array';\n alias?: string;\n default?: unknown;\n description?: string;\n choices?: string[];\n required?: boolean;\n}> {\n return Object.entries(flags).map(([name, flag]) => ({\n name,\n type: flag.type,\n ...(flag.alias !== undefined && { alias: flag.alias }),\n ...(flag.default !== undefined && { default: flag.default }),\n ...(flag.description !== undefined && { description: flag.description }),\n ...(flag.choices !== undefined && { choices: flag.choices }),\n ...(flag.required !== undefined && { required: flag.required }),\n }));\n}\n","/**\n * Manifest helpers — optional, additive utilities for reducing boilerplate.\n *\n * Manifests can always be written as plain TypeScript literal objects.\n * These helpers exist purely to cut repetition in the CLI commands and REST\n * routes sections, which are the two highest-density areas.\n *\n * Inspired by:\n * - Commander.js → cmd() fluent builder for CLI commands\n * - Hono → GET/POST/... standalone functions for HTTP routes\n * - Vite → createManifest() thin wrapper for type safety\n */\n\nimport type {\n ManifestV3,\n CliCommandDecl,\n CliGroupMeta,\n RestRouteDecl,\n WebhookHandlerDecl,\n WebhookAuthConfig,\n PermissionSpec,\n} from '@kb-labs/plugin-contracts';\nimport { defineCommandFlags } from './manifest.js';\n\n// ─── Branded types ────────────────────────────────────────────────────────────\n\n/** Plugin identifier: must follow `@scope/name` format */\nexport type PluginId = `@${string}/${string}`;\n\n/** Semver string: `major.minor.patch[suffix]` */\nexport type SemVer = `${number}.${number}.${number}${string}`;\n\n/**\n * Handler file reference.\n * Must start with `./` and end with `.js` (optionally with `#exportName`).\n * @example './commands/health.js'\n * @example './commands/health.js#default'\n */\nexport type HandlerRef =\n | `./${string}.js`\n | `./${string}.js#${string}`;\n\n/** Base path for REST routes under the gateway. */\nexport type RestBase = `/v1/plugins/${string}`;\n\n/** Base path for WebSocket channels. */\nexport type WsBase = `/v1/ws/plugins/${string}`;\n\n// ─── Flag schema (narrow subset that defineCommandFlags accepts) ───────────────\n\ntype ManifestFlagDef = Record<\n string,\n {\n type: 'string' | 'boolean' | 'number' | 'array';\n alias?: string;\n default?: unknown;\n description?: string;\n choices?: string[];\n required?: boolean;\n }\n>;\n\n// ─── CLI helpers ──────────────────────────────────────────────────────────────\n\n/** Internal mutable state for CmdBuilder */\ninterface CmdState {\n path: string;\n handler: string;\n describe: string;\n operationType?: CliCommandDecl['operationType'];\n longDescription?: string;\n flags?: CliCommandDecl['flags'];\n examples?: string[];\n category?: string;\n aliases?: string[];\n permissions?: PermissionSpec;\n}\n\n/**\n * Fluent builder for a single CLI command declaration.\n *\n * Constructed via `cmd()` — not instantiated directly.\n *\n * @example\n * ```ts\n * cmd('workflow health', './commands/health.js#default', 'Check daemon health.')\n * .read()\n * .flags(healthFlags)\n * .examples(['kb workflow health', 'kb workflow health --json'])\n * ```\n */\nexport class CmdBuilder {\n private readonly _state: CmdState;\n\n constructor(path: string, handler: string, describe: string) {\n this._state = { path, handler, describe };\n }\n\n /** operationType: 'read' — auto-injects --output, --limit, --offset */\n read(): this {\n this._state.operationType = 'read';\n return this;\n }\n\n /** operationType: 'mutate' — auto-injects --output, --dry-run, --yes */\n mutate(): this {\n this._state.operationType = 'mutate';\n return this;\n }\n\n /** operationType: 'execute' — auto-injects --output, --wait, --watch, --timeout, --yes */\n execute(): this {\n this._state.operationType = 'execute';\n return this;\n }\n\n /** operationType: 'analyze' — auto-injects --output, --format, --stream */\n analyze(): this {\n this._state.operationType = 'analyze';\n return this;\n }\n\n /**\n * Define command flags.\n * Calls `defineCommandFlags()` internally — no need to wrap manually.\n */\n flags(def: ManifestFlagDef): this {\n this._state.flags = defineCommandFlags(def);\n return this;\n }\n\n /** Long description shown in `--help` output. */\n long(text: string): this {\n this._state.longDescription = text;\n return this;\n }\n\n /** Usage examples shown in `--help` output. */\n examples(list: string[]): this {\n this._state.examples = list;\n return this;\n }\n\n /**\n * Display category label.\n * When using `group()`, the group's `category` is applied to commands\n * that don't have their own category set.\n */\n category(cat: string): this {\n this._state.category = cat;\n return this;\n }\n\n /** Alternative full paths for this command. */\n aliases(list: string[]): this {\n this._state.aliases = list;\n return this;\n }\n\n /** Command-specific permissions (override plugin defaults). */\n perms(spec: PermissionSpec): this {\n this._state.permissions = spec;\n return this;\n }\n\n /** Build the final `CliCommandDecl`. */\n build(): CliCommandDecl {\n const decl: CliCommandDecl = {\n path: this._state.path,\n handler: this._state.handler,\n describe: this._state.describe,\n };\n if (this._state.operationType !== undefined) { decl.operationType = this._state.operationType; }\n if (this._state.longDescription !== undefined) { decl.longDescription = this._state.longDescription; }\n if (this._state.flags !== undefined) { decl.flags = this._state.flags; }\n if (this._state.examples !== undefined) { decl.examples = this._state.examples; }\n if (this._state.category !== undefined) { decl.category = this._state.category; }\n if (this._state.aliases !== undefined) { decl.aliases = this._state.aliases; }\n if (this._state.permissions !== undefined) { decl.permissions = this._state.permissions; }\n return decl;\n }\n}\n\n/**\n * Create a CLI command builder.\n *\n * Three required positional args cover the most repetitive fields.\n * Everything else is chained: `.read()`, `.flags(def)`, `.examples([...])`.\n *\n * Eliminates:\n * - `operationType: 'read' as const` → `.read()`\n * - `flags: defineCommandFlags(def)` → `.flags(def)`\n * - repeated `category: 'X'` → set once in `group()`\n *\n * @example\n * ```ts\n * cmd('workflow health', './commands/health.js#default', 'Check daemon health.')\n * .read()\n * .flags(healthFlags)\n * .examples(['kb workflow health'])\n * ```\n */\nexport function cmd(\n path: string,\n handler: HandlerRef,\n describe: string,\n): CmdBuilder {\n return new CmdBuilder(path, handler, describe);\n}\n\n// ─── Group helpers ────────────────────────────────────────────────────────────\n\n/** Result of `group()` — passed to `mergeCliGroups()` or spread manually. */\nexport interface CliGroup {\n meta: CliGroupMeta;\n commands: CliCommandDecl[];\n}\n\n/**\n * Group a set of commands under a shared `groupMeta` entry.\n *\n * If `meta.category` is provided, it is applied to every command inside\n * that does not already have its own category set.\n *\n * @example\n * ```ts\n * const runsGroup = group(\n * { path: 'workflow runs', describe: 'Run management', category: 'Runs' },\n * [\n * cmd('workflow runs list', './commands/runs-list.js#default', 'List runs.').read().flags(runsListFlags),\n * cmd('workflow runs view', './commands/runs-view.js#default', 'View run details.').read().flags(runsViewFlags),\n * ]\n * );\n * ```\n */\nexport function group(\n meta: { path: string; describe: string; category?: string },\n cmds: Array<CmdBuilder | CliCommandDecl>,\n): CliGroup {\n const commands = cmds.map((c) => {\n const decl = c instanceof CmdBuilder ? c.build() : c;\n if (meta.category !== undefined && decl.category === undefined) {\n return { ...decl, category: meta.category };\n }\n return decl;\n });\n return {\n meta: { path: meta.path, describe: meta.describe },\n commands,\n };\n}\n\n/**\n * Merge multiple `CliGroup` results into a single `cli` section object.\n *\n * @example\n * ```ts\n * cli: mergeCliGroups(daemonGroup, jobsGroup, runsGroup),\n * // → { commands: [...all commands], groupMeta: [...all group metas] }\n * ```\n */\nexport function mergeCliGroups(\n ...groups: CliGroup[]\n): Required<ManifestV3>['cli'] {\n return {\n commands: groups.flatMap((g) => g.commands),\n groupMeta: groups.map((g) => g.meta),\n };\n}\n\n// ─── HTTP route helpers ───────────────────────────────────────────────────────\n\ntype RouteOpts = Omit<RestRouteDecl, 'method' | 'path' | 'handler'>;\n\nfunction routeHelper(\n method: RestRouteDecl['method'],\n path: string,\n handler: HandlerRef,\n opts?: RouteOpts,\n): RestRouteDecl {\n return { method, path, handler, ...opts };\n}\n\n/**\n * Declare a GET route.\n * @example GET(ROUTES.STATS, './rest/stats.js#default', { describe: 'Get stats' })\n */\nexport const GET = (path: string, handler: HandlerRef, opts?: RouteOpts): RestRouteDecl =>\n routeHelper('GET', path, handler, opts);\n\n/**\n * Declare a POST route.\n * @example POST(ROUTES.RUN, './rest/run.js#default', { describe: 'Run workflow' })\n */\nexport const POST = (path: string, handler: HandlerRef, opts?: RouteOpts): RestRouteDecl =>\n routeHelper('POST', path, handler, opts);\n\n/**\n * Declare a PUT route.\n */\nexport const PUT = (path: string, handler: HandlerRef, opts?: RouteOpts): RestRouteDecl =>\n routeHelper('PUT', path, handler, opts);\n\n/**\n * Declare a PATCH route.\n */\nexport const PATCH = (path: string, handler: HandlerRef, opts?: RouteOpts): RestRouteDecl =>\n routeHelper('PATCH', path, handler, opts);\n\n/**\n * Declare a DELETE route.\n */\nexport const DELETE = (path: string, handler: HandlerRef, opts?: RouteOpts): RestRouteDecl =>\n routeHelper('DELETE', path, handler, opts);\n\n// ─── Webhook handler helpers ──────────────────────────────────────────────────\n\ntype WebhookOpts = Omit<WebhookHandlerDecl, 'event' | 'handler'>;\n\n/**\n * Declare a webhook handler in the plugin manifest.\n *\n * `auth` is required at the call site — the gateway will refuse to start if\n * any webhook handler has no auth config.\n *\n * @example\n * ```ts\n * webhook('alert', './webhooks/alert.js#default', {\n * auth: { type: 'secret', header: 'X-Webhook-Secret' },\n * async: true,\n * })\n * ```\n */\nexport function webhook(\n event: string,\n handler: HandlerRef,\n opts: WebhookOpts & { auth: WebhookAuthConfig },\n): WebhookHandlerDecl {\n return { event, handler, ...opts };\n}\n\n// ─── Manifest entry point ─────────────────────────────────────────────────────\n\n/**\n * Create a type-safe `ManifestV3`.\n *\n * Provides branded-type validation for `id` and `version`, and\n * automatically injects `schema: 'kb.plugin/3'`.\n * Everything else is a plain literal object — no fluent chain.\n *\n * Writing manifests as plain object literals without this wrapper\n * is always valid.\n *\n * @example\n * ```ts\n * export const manifest = createManifest('@kb-labs/workflow', '1.0.0', {\n * display: { name: 'Workflow CLI' },\n * cli: mergeCliGroups(daemonGroup, runsGroup),\n * rest: {\n * basePath: WORKFLOW_BASE_PATH,\n * routes: [\n * GET(ROUTES.STATS, './rest/stats.js#default', { describe: 'Dashboard stats' }),\n * ],\n * },\n * permissions: pluginPermissions,\n * });\n * ```\n */\nexport function createManifest(\n id: PluginId,\n version: SemVer,\n body: Omit<ManifestV3, 'id' | 'version' | 'schema'>,\n): ManifestV3 {\n return {\n schema: 'kb.plugin/3',\n id,\n version,\n ...body,\n };\n}\n","/**\n * Schema Builders for KB Labs Plugins\n *\n * Optional helpers for common Zod validation patterns.\n * You can always use plain Zod - these are just conveniences for repetitive patterns.\n *\n * @example\n * ```typescript\n * import { schema } from '@kb-labs/shared-command-kit';\n *\n * const RequestSchema = schema.object({\n * cwd: schema.cwd(),\n * scope: schema.scopeId(),\n * text: schema.text({ min: 1, max: 10000 }),\n * mode: schema.enum(['instant', 'auto', 'thinking'], { default: 'auto' }),\n * limit: schema.positiveInt({ max: 100, default: 10 }),\n * });\n * ```\n */\n\nimport { z } from 'zod';\n\n/**\n * Current working directory path (optional string)\n * Commonly used in CLI and REST handlers\n *\n * @example\n * ```typescript\n * const schema = z.object({\n * cwd: schema.cwd(),\n * });\n * // Equivalent to: cwd: z.string().optional()\n * ```\n */\nexport function cwd() {\n return z.string().optional().describe('Current working directory path');\n}\n\n/**\n * Scope identifier (required non-empty string)\n * Used for Mind RAG scopes, workflow scopes, etc.\n *\n * @example\n * ```typescript\n * const schema = z.object({\n * scope: schema.scopeId(),\n * });\n * // Equivalent to: scope: z.string().min(1)\n * ```\n */\nexport function scopeId() {\n return z.string().min(1).describe('Scope identifier');\n}\n\n/**\n * Text string with optional length constraints\n *\n * @example\n * ```typescript\n * schema.text({ min: 1, max: 10000 })\n * // Equivalent to: z.string().min(1).max(10000)\n * ```\n */\nexport function text(options?: { min?: number; max?: number; default?: string }): z.ZodString | z.ZodDefault<z.ZodString> {\n let schema = z.string();\n\n if (options?.min !== undefined) {\n schema = schema.min(options.min);\n }\n\n if (options?.max !== undefined) {\n schema = schema.max(options.max);\n }\n\n if (options?.default !== undefined) {\n return schema.default(options.default).describe('Text string');\n }\n\n return schema.describe('Text string');\n}\n\n/**\n * Positive integer with optional constraints\n *\n * @example\n * ```typescript\n * schema.positiveInt({ max: 100, default: 10 })\n * // Equivalent to: z.number().int().positive().max(100).default(10)\n * ```\n */\nexport function positiveInt(options?: { min?: number; max?: number; default?: number }): z.ZodNumber | z.ZodDefault<z.ZodNumber> {\n let schema = z.number().int().positive();\n\n if (options?.min !== undefined) {\n schema = schema.min(options.min);\n }\n\n if (options?.max !== undefined) {\n schema = schema.max(options.max);\n }\n\n if (options?.default !== undefined) {\n return schema.default(options.default).describe('Positive integer');\n }\n\n return schema.describe('Positive integer');\n}\n\n/**\n * Non-negative integer (0 or positive)\n *\n * @example\n * ```typescript\n * schema.nonNegativeInt({ max: 100 })\n * // Equivalent to: z.number().int().min(0).max(100)\n * ```\n */\nexport function nonNegativeInt(options?: { max?: number; default?: number }): z.ZodNumber | z.ZodDefault<z.ZodNumber> {\n let schema = z.number().int().min(0);\n\n if (options?.max !== undefined) {\n schema = schema.max(options.max);\n }\n\n if (options?.default !== undefined) {\n return schema.default(options.default).describe('Non-negative integer');\n }\n\n return schema.describe('Non-negative integer');\n}\n\n/**\n * Enum with optional default value\n *\n * @example\n * ```typescript\n * schema.enum(['instant', 'auto', 'thinking'], { default: 'auto' })\n * // Equivalent to: z.enum(['instant', 'auto', 'thinking']).default('auto')\n * ```\n */\nexport function enumSchema<T extends [string, ...string[]]>(\n values: T,\n options?: { default?: T[number] }\n): z.ZodDefault<z.ZodEnum<T>> | z.ZodEnum<T> {\n const schema = z.enum(values);\n\n if (options?.default !== undefined) {\n return schema.default(options.default as T[number]);\n }\n\n return schema;\n}\n\n/**\n * Plugin ID (@kb-labs/package-name format)\n *\n * @example\n * ```typescript\n * schema.pluginId()\n * // Matches: @kb-labs/mind, @kb-labs/workflow, etc.\n * ```\n */\nexport function pluginId() {\n return z\n .string()\n .regex(/^@kb-labs\\/[a-z][a-z0-9-]*$/, 'Must be in format @kb-labs/package-name')\n .describe('Plugin ID');\n}\n\n/**\n * Command ID (plugin:command format)\n *\n * @example\n * ```typescript\n * schema.commandId()\n * // Matches: mind:query, workflow:run, etc.\n * ```\n */\nexport function commandId() {\n return z\n .string()\n .regex(/^[a-z][a-z0-9-]*:[a-z][a-z0-9-]*$/, 'Must be in format plugin:command')\n .describe('Command ID');\n}\n\n/**\n * Artifact ID (plugin.artifact.id format)\n *\n * @example\n * ```typescript\n * schema.artifactId()\n * // Matches: mind.index.vector, workflow.run.result, etc.\n * ```\n */\nexport function artifactId() {\n return z\n .string()\n .regex(/^[a-z][a-z0-9-]*\\.[a-z][a-z0-9-]*(\\.[a-z][a-z0-9-]*)*$/, 'Must be in format plugin.artifact.id')\n .describe('Artifact ID');\n}\n\n/**\n * File path (string)\n * Optional with default to undefined\n *\n * @example\n * ```typescript\n * schema.filePath()\n * // Equivalent to: z.string()\n * ```\n */\nexport function filePath(options?: { optional?: boolean }) {\n const schema = z.string().describe('File path');\n\n if (options?.optional) {\n return schema.optional();\n }\n\n return schema;\n}\n\n/**\n * URL string\n *\n * @example\n * ```typescript\n * schema.url()\n * // Equivalent to: z.string().url()\n * ```\n */\nexport function url(options?: { optional?: boolean }) {\n const schema = z.string().url().describe('URL');\n\n if (options?.optional) {\n return schema.optional();\n }\n\n return schema;\n}\n\n/**\n * Email string\n *\n * @example\n * ```typescript\n * schema.email()\n * // Equivalent to: z.string().email()\n * ```\n */\nexport function email(options?: { optional?: boolean }) {\n const schema = z.string().email().describe('Email address');\n\n if (options?.optional) {\n return schema.optional();\n }\n\n return schema;\n}\n\n/**\n * UUID string\n *\n * @example\n * ```typescript\n * schema.uuid()\n * // Equivalent to: z.string().uuid()\n * ```\n */\nexport function uuid(options?: { optional?: boolean }) {\n const schema = z.string().uuid().describe('UUID');\n\n if (options?.optional) {\n return schema.optional();\n }\n\n return schema;\n}\n\n/**\n * ISO datetime string\n *\n * @example\n * ```typescript\n * schema.datetime()\n * // Equivalent to: z.string().datetime()\n * ```\n */\nexport function datetime(options?: { optional?: boolean }) {\n const schema = z.string().datetime().describe('ISO datetime');\n\n if (options?.optional) {\n return schema.optional();\n }\n\n return schema;\n}\n\n/**\n * JSON object (any valid JSON object)\n *\n * @example\n * ```typescript\n * schema.json()\n * // Equivalent to: z.record(z.unknown())\n * ```\n */\nexport function json() {\n return z.record(z.unknown()).describe('JSON object');\n}\n\n/**\n * Boolean with optional default\n *\n * @example\n * ```typescript\n * schema.boolean({ default: false })\n * // Equivalent to: z.boolean().default(false)\n * ```\n */\nexport function boolean(options?: { default?: boolean }) {\n const schema = z.boolean();\n\n if (options?.default !== undefined) {\n return schema.default(options.default);\n }\n\n return schema;\n}\n\n/**\n * Array of items with optional length constraints\n *\n * @example\n * ```typescript\n * schema.array(z.string(), { min: 1, max: 10 })\n * // Equivalent to: z.array(z.string()).min(1).max(10)\n * ```\n */\nexport function array<T extends z.ZodTypeAny>(\n itemSchema: T,\n options?: { min?: number; max?: number }\n) {\n let schema = z.array(itemSchema);\n\n if (options?.min !== undefined) {\n schema = schema.min(options.min);\n }\n\n if (options?.max !== undefined) {\n schema = schema.max(options.max);\n }\n\n return schema;\n}\n\n/**\n * Object schema builder (alias for z.object)\n *\n * @example\n * ```typescript\n * schema.object({ name: z.string() })\n * // Equivalent to: z.object({ name: z.string() })\n * ```\n */\nexport function object<T extends z.ZodRawShape>(shape: T) {\n return z.object(shape);\n}\n\n/**\n * Export schema builders namespace\n *\n * @example\n * ```typescript\n * import { schema } from '@kb-labs/shared-command-kit';\n *\n * const MySchema = schema.object({\n * cwd: schema.cwd(),\n * scope: schema.scopeId(),\n * text: schema.text({ min: 1, max: 10000 }),\n * });\n * ```\n */\nexport const schema = {\n // Path and ID builders\n cwd,\n scopeId,\n pluginId,\n commandId,\n artifactId,\n filePath,\n\n // String builders\n text,\n url,\n email,\n uuid,\n datetime,\n\n // Number builders\n positiveInt,\n nonNegativeInt,\n\n // Other builders\n enum: enumSchema,\n boolean,\n json,\n array,\n object,\n};\n","/**\n * REST Handler Definition (V3)\n *\n * Define REST handlers compatible with plugin-runtime's runInProcess().\n * Returns { execute } object with (ctx, input) signature.\n *\n * @example\n * ```typescript\n * import { defineHandler } from '@kb-labs/shared-command-kit';\n *\n * export default defineHandler({\n * async execute(ctx, input: { scope?: string }) {\n * const plan = await loadPlan(ctx.cwd);\n * return plan;\n * }\n * });\n * ```\n */\n\nimport type { PluginContextV3 } from '@kb-labs/plugin-contracts';\n\n/**\n * REST input structure from route-mounter.\n * Query params, body, and route params are separated to avoid conflicts.\n */\nexport interface RestInput<TQuery = unknown, TBody = unknown, TParams = unknown> {\n query?: TQuery;\n body?: TBody;\n params?: TParams;\n}\n\n/**\n * Handler interface expected by runInProcess().\n */\nexport interface Handler<TConfig = unknown, TInput = unknown, TOutput = unknown> {\n /**\n * Execute the handler\n */\n execute(\n ctx: PluginContextV3<TConfig>,\n input: TInput\n ): Promise<TOutput>;\n}\n\n/**\n * Handler definition options.\n * Extensible for future features (inputSchema, middleware, etc.)\n */\nexport interface HandlerDefinition<TConfig = unknown, TInput = unknown, TOutput = unknown> {\n /**\n * Execute the handler.\n * Returns data directly - no need for exitCode/CommandResult wrapper.\n *\n * @param ctx - Plugin context with runtime APIs (fs, fetch, env, ui, etc.)\n * @param input - Request input (body for POST, query for GET, etc.)\n * @returns Response data (will be serialized as JSON)\n * @throws Error on failure (will be converted to HTTP 500)\n */\n execute(\n ctx: PluginContextV3<TConfig>,\n input: TInput\n ): Promise<TOutput>;\n\n // Future options (non-breaking additions):\n // inputSchema?: ZodType<TInput>;\n // outputSchema?: ZodType<TOutput>;\n // middleware?: Middleware[];\n // timeout?: number;\n}\n\n/**\n * Define a REST handler\n *\n * Creates a handler object compatible with runInProcess() from plugin-runtime.\n * The handler receives full PluginContextV3 with runtime APIs.\n *\n * @example\n * ```typescript\n * // Simple handler\n * export default defineHandler({\n * async execute(ctx, input: { scope?: string }) {\n * const plan = await loadPlan(ctx.cwd);\n * return plan;\n * }\n * });\n *\n * // With typed query parameters using RestInput\n * import { defineHandler, type RestInput } from '@kb-labs/sdk';\n *\n * export default defineHandler({\n * async execute(ctx, input: RestInput<{ workspace?: string }>) {\n * const workspace = input.query?.workspace || 'root';\n * return { workspace };\n * }\n * });\n *\n * // With typed query and body\n * interface QueryParams {\n * workspace?: string;\n * }\n *\n * interface BodyParams {\n * name: string;\n * description?: string;\n * }\n *\n * export default defineHandler({\n * async execute(ctx, input: RestInput<QueryParams, BodyParams>) {\n * const workspace = input.query?.workspace || 'root';\n * const name = input.body?.name;\n * return { workspace, name };\n * }\n * });\n *\n * // With typed generics\n * interface GetPlanInput {\n * scope?: string;\n * includeHistory?: boolean;\n * }\n *\n * interface ReleasePlan {\n * version: string;\n * packages: string[];\n * }\n *\n * export default defineHandler<unknown, GetPlanInput, ReleasePlan>({\n * async execute(ctx, input) {\n * // ctx: PluginContextV3 with runtime.fs, ui, etc.\n * // input: GetPlanInput (typed)\n * // return: ReleasePlan (typed)\n * return await loadPlan(ctx.cwd, input.scope);\n * }\n * });\n *\n * // Using runtime APIs\n * export default defineHandler({\n * async execute(ctx, input: { path: string }) {\n * // File system access\n * const content = await ctx.runtime.fs.readFile(input.path, 'utf-8');\n *\n * // Environment variables\n * const apiKey = ctx.runtime.env('API_KEY');\n *\n * // Logging\n * ctx.runtime.log('info', 'Processing file', { path: input.path });\n *\n * return { content, hasApiKey: !!apiKey };\n * }\n * });\n * ```\n */\nexport function defineHandler<TConfig = unknown, TInput = unknown, TOutput = unknown>(\n definition: HandlerDefinition<TConfig, TInput, TOutput>\n): Handler<TConfig, TInput, TOutput> {\n // Return handler object compatible with runInProcess()\n // Currently passes through, but this wrapper enables:\n // - Future input validation via inputSchema\n // - Future output validation via outputSchema\n // - Middleware execution\n // - Logging/tracing hooks\n // - Error normalization\n return {\n execute: async (ctx, input) => {\n // Future: validate input against schema\n // if (definition.inputSchema) {\n // input = definition.inputSchema.parse(input);\n // }\n\n // Future: run pre-middleware\n // for (const mw of definition.middleware ?? []) {\n // await mw.before?.(ctx, input);\n // }\n\n // Future: validate output against schema\n // if (definition.outputSchema) {\n // definition.outputSchema.parse(result);\n // }\n\n // Future: run post-middleware\n // for (const mw of definition.middleware ?? []) {\n // await mw.after?.(ctx, input, result);\n // }\n\n return definition.execute(ctx, input);\n },\n };\n}\n","/**\n * Lifecycle Hook Helpers\n *\n * Optional helpers for plugin lifecycle hooks (setup, destroy, upgrade).\n * You can always use plain functions - this is just convenience.\n *\n * @example\n * ```typescript\n * import { defineSetupHandler } from '@kb-labs/shared-command-kit';\n *\n * export const setup = defineSetupHandler({\n * name: 'mind:setup',\n * workspace: {\n * directories: ['.kb/mind/index', '.kb/mind/cache'],\n * },\n * config: {\n * 'kb.config.json': {\n * mind: { enabled: true, scopes: ['default'] },\n * },\n * },\n * async handler(ctx) {\n * ctx.log('Mind workspace initialized');\n * return { ok: true };\n * },\n * });\n * ```\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { existsSync } from 'node:fs';\n\n/**\n * Lifecycle handler context\n */\nexport interface LifecycleContext {\n /** Output directory (plugin workspace root) */\n outdir: string;\n /** Plugin ID */\n pluginId: string;\n /** Request ID for tracing */\n requestId?: string;\n /** Logger */\n log?: (level: 'debug' | 'info' | 'warn' | 'error', msg: string, meta?: Record<string, unknown>) => void;\n /** Environment getter */\n env?: (key: string) => string | undefined;\n}\n\n/**\n * Workspace setup configuration\n */\nexport interface WorkspaceConfig {\n /** Directories to create (relative to outdir or absolute) */\n directories?: string[];\n /** Files to create with content */\n files?: Record<string, string>;\n}\n\n/**\n * Config file updates\n */\nexport type ConfigUpdates = Record<string, Record<string, unknown>>;\n\n/**\n * Setup handler definition\n */\nexport interface SetupHandlerDefinition {\n /** Handler name (for logging) */\n name: string;\n /** Workspace configuration (directories/files to create) */\n workspace?: WorkspaceConfig;\n /** Config file updates (will be merged with existing config) */\n config?: ConfigUpdates;\n /** Custom setup logic (optional) */\n handler?: (ctx: LifecycleContext) => Promise<{ ok: boolean; message?: string }>;\n}\n\n/**\n * Destroy handler definition\n */\nexport interface DestroyHandlerDefinition {\n /** Handler name (for logging) */\n name: string;\n /** Workspace cleanup (directories/files to remove) */\n workspace?: {\n /** Directories to remove */\n directories?: string[];\n /** Files to remove */\n files?: string[];\n };\n /** Config cleanup (keys to remove from config files) */\n config?: Record<string, string[]>; // file -> keys to remove\n /** Custom destroy logic (optional) */\n handler?: (ctx: LifecycleContext) => Promise<{ ok: boolean; message?: string }>;\n}\n\n/**\n * Setup handler result\n */\nexport interface SetupResult {\n ok: boolean;\n message?: string;\n}\n\n/**\n * Define a setup handler with declarative workspace and config setup\n *\n * @example\n * ```typescript\n * export const setup = defineSetupHandler({\n * name: 'mind:setup',\n * workspace: {\n * directories: [\n * '.kb/mind/index',\n * '.kb/mind/cache',\n * '.kb/mind/pack',\n * ],\n * files: {\n * '.kb/mind/.gitignore': 'cache/\\npack/\\n',\n * },\n * },\n * config: {\n * 'kb.config.json': {\n * mind: {\n * enabled: true,\n * scopes: ['default'],\n * },\n * },\n * },\n * async handler(ctx) {\n * ctx.log?.('info', 'Custom setup logic', {});\n * return { ok: true };\n * },\n * });\n * ```\n */\nexport function defineSetupHandler(\n definition: SetupHandlerDefinition\n): (ctx: LifecycleContext) => Promise<SetupResult> {\n return async (ctx: LifecycleContext) => {\n const log = ctx.log || ((level: string, msg: string, meta?: Record<string, unknown>) => {\n console.log(`[${level}] ${msg}`, meta || '');\n });\n\n try {\n log('info', 'Setup started', { handler: definition.name, outdir: ctx.outdir });\n\n // 1. Create workspace directories and files\n if (definition.workspace) {\n await setupWorkspace(ctx.outdir, definition.workspace, log);\n }\n\n // 2. Update config files\n if (definition.config) {\n await updateConfigFiles(ctx.outdir, definition.config, log);\n }\n\n // 3. Run custom handler logic\n if (definition.handler) {\n const result = await definition.handler(ctx);\n if (!result.ok) {\n return result;\n }\n }\n\n log('info', 'Setup completed', { handler: definition.name });\n return { ok: true, message: `${definition.name} setup completed` };\n } catch (error: unknown) {\n const errMsg = error instanceof Error ? error.message : String(error);\n log('error', 'Setup failed', {\n handler: definition.name,\n error: errMsg,\n stack: error instanceof Error ? error.stack : undefined,\n });\n return { ok: false, message: `Setup failed: ${errMsg}` };\n }\n };\n}\n\n/**\n * Define a destroy handler with declarative cleanup\n *\n * @example\n * ```typescript\n * export const destroy = defineDestroyHandler({\n * name: 'mind:destroy',\n * workspace: {\n * directories: ['.kb/mind'],\n * },\n * config: {\n * 'kb.config.json': ['mind'], // Remove 'mind' key\n * },\n * });\n * ```\n */\nexport function defineDestroyHandler(\n definition: DestroyHandlerDefinition\n): (ctx: LifecycleContext) => Promise<SetupResult> {\n return async (ctx: LifecycleContext) => {\n const log = ctx.log || ((level: string, msg: string, meta?: Record<string, unknown>) => {\n console.log(`[${level}] ${msg}`, meta || '');\n });\n\n try {\n log('info', 'Destroy started', { handler: definition.name, outdir: ctx.outdir });\n\n // 1. Clean up config files\n if (definition.config) {\n await cleanupConfigFiles(ctx.outdir, definition.config, log);\n }\n\n // 2. Remove workspace directories and files\n if (definition.workspace) {\n await cleanupWorkspace(ctx.outdir, definition.workspace, log);\n }\n\n // 3. Run custom handler logic\n if (definition.handler) {\n const result = await definition.handler(ctx);\n if (!result.ok) {\n return result;\n }\n }\n\n log('info', 'Destroy completed', { handler: definition.name });\n return { ok: true, message: `${definition.name} destroy completed` };\n } catch (error: unknown) {\n const errMsg = error instanceof Error ? error.message : String(error);\n log('error', 'Destroy failed', {\n handler: definition.name,\n error: errMsg,\n stack: error instanceof Error ? error.stack : undefined,\n });\n return { ok: false, message: `Destroy failed: ${errMsg}` };\n }\n };\n}\n\n/**\n * Setup workspace directories and files\n */\nasync function setupWorkspace(\n outdir: string,\n config: WorkspaceConfig,\n log: (level: 'error' | 'info' | 'debug' | 'warn', msg: string, meta?: Record<string, unknown>) => void\n): Promise<void> {\n // Create directories\n if (config.directories) {\n for (const dir of config.directories) {\n const dirPath = path.resolve(outdir, dir);\n await fs.mkdir(dirPath, { recursive: true });\n log('debug', 'Created directory', { path: dirPath });\n }\n }\n\n // Create files\n if (config.files) {\n for (const [filePath, content] of Object.entries(config.files)) {\n const fullPath = path.resolve(outdir, filePath);\n const dirPath = path.dirname(fullPath);\n await fs.mkdir(dirPath, { recursive: true });\n await fs.writeFile(fullPath, content, 'utf-8');\n log('debug', 'Created file', { path: fullPath });\n }\n }\n}\n\n/**\n * Update config files (merge with existing config)\n */\nasync function updateConfigFiles(\n outdir: string,\n updates: ConfigUpdates,\n log: (level: 'error' | 'info' | 'debug' | 'warn', msg: string, meta?: Record<string, unknown>) => void\n): Promise<void> {\n for (const [configFile, configUpdates] of Object.entries(updates)) {\n const configPath = path.resolve(outdir, configFile);\n\n // Read existing config or create empty\n let config: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n const content = await fs.readFile(configPath, 'utf-8');\n try {\n config = JSON.parse(content);\n } catch (error) {\n log('warn', 'Failed to parse existing config, starting fresh', { path: configPath });\n }\n }\n\n // Merge updates\n config = { ...config, ...configUpdates };\n\n // Write updated config\n const dirPath = path.dirname(configPath);\n await fs.mkdir(dirPath, { recursive: true });\n await fs.writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');\n log('debug', 'Updated config file', { path: configPath });\n }\n}\n\n/**\n * Cleanup workspace directories and files\n */\nasync function cleanupWorkspace(\n outdir: string,\n config: DestroyHandlerDefinition['workspace'],\n log: (level: 'error' | 'info' | 'debug' | 'warn', msg: string, meta?: Record<string, unknown>) => void\n): Promise<void> {\n if (!config) {return;}\n\n // Remove files first\n if (config.files) {\n for (const file of config.files) {\n const filePath = path.resolve(outdir, file);\n if (existsSync(filePath)) {\n await fs.unlink(filePath);\n log('debug', 'Removed file', { path: filePath });\n }\n }\n }\n\n // Remove directories\n if (config.directories) {\n for (const dir of config.directories) {\n const dirPath = path.resolve(outdir, dir);\n if (existsSync(dirPath)) {\n await fs.rm(dirPath, { recursive: true, force: true });\n log('debug', 'Removed directory', { path: dirPath });\n }\n }\n }\n}\n\n/**\n * Cleanup config files (remove keys)\n */\nasync function cleanupConfigFiles(\n outdir: string,\n cleanups: Record<string, string[]>,\n log: (level: 'error' | 'info' | 'debug' | 'warn', msg: string, meta?: Record<string, unknown>) => void\n): Promise<void> {\n for (const [configFile, keysToRemove] of Object.entries(cleanups)) {\n const configPath = path.resolve(outdir, configFile);\n\n if (!existsSync(configPath)) {\n continue;\n }\n\n // Read config\n const content = await fs.readFile(configPath, 'utf-8');\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(content);\n } catch (error) {\n log('warn', 'Failed to parse config for cleanup', { path: configPath });\n continue;\n }\n\n // Remove keys\n for (const key of keysToRemove) {\n delete config[key];\n }\n\n // Write updated config\n await fs.writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');\n log('debug', 'Cleaned up config file', { path: configPath, removed: keysToRemove });\n }\n}\n","/**\n * Job definition helpers\n * @module @kb-labs/shared-command-kit/jobs\n */\n\nimport type { JobDecl, PermissionSpec, PluginContextV3 } from '@kb-labs/plugin-contracts';\n\n/**\n * Job input passed to handler at runtime\n */\nexport interface JobInput {\n /** Job identifier */\n jobId: string;\n /** When the job was scheduled to execute */\n executedAt: Date;\n /** How many times this job has run */\n runCount: number;\n}\n\n/**\n * Job handler function signature\n *\n * @template TInput - Custom input type (extends JobInput)\n * @template TOutput - Handler return type\n */\nexport type JobHandler<\n TInput extends JobInput = JobInput,\n TOutput = { ok: boolean; [key: string]: unknown }\n> = (input: TInput, ctx: PluginContextV3) => Promise<TOutput>;\n\n/**\n * Job definition configuration\n *\n * Combines JobDecl manifest fields with the actual handler function\n * for type-safe job creation.\n */\nexport interface JobDefinition<\n TInput extends JobInput = JobInput,\n TOutput = { ok: boolean; [key: string]: unknown }\n> {\n /** Unique job identifier within plugin (e.g., 'auto-index') */\n id: string;\n\n /**\n * Cron schedule expression\n * Supports shortcuts (@hourly, @daily, @weekly, @monthly, @yearly) and standard cron format\n */\n schedule: string;\n\n /** Human-readable description */\n describe?: string;\n\n /** Whether job is enabled (default: true) */\n enabled?: boolean;\n\n /** Job priority (1-10, default: 5, higher = more important) */\n priority?: number;\n\n /** Execution timeout in milliseconds (default: 60000 = 1min) */\n timeout?: number;\n\n /** Number of retry attempts on failure (default: 2) */\n retries?: number;\n\n /** Tags for filtering and organization */\n tags?: string[];\n\n /** Permissions for job execution (filesystem, network, quotas) */\n permissions?: PermissionSpec;\n\n /** Job handler function */\n handler: JobHandler<TInput, TOutput>;\n}\n\n/**\n * Defined job object with manifest conversion\n */\nexport interface DefinedJob<\n TInput extends JobInput = JobInput,\n TOutput = { ok: boolean; [key: string]: unknown }\n> {\n /** Job configuration */\n readonly config: Omit<JobDefinition<TInput, TOutput>, 'handler'> & { handler: string };\n\n /** Job handler function */\n readonly handler: JobHandler<TInput, TOutput>;\n\n /** Convert to manifest JobDecl */\n toManifest(handlerPath: string): JobDecl;\n}\n\n/**\n * Define a type-safe job with handler\n *\n * This helper provides compile-time type safety for job definitions\n * and allows sharing the same handler function between manifest and runtime.\n *\n * The handler function can be exported from a separate file and the manifest\n * references it via the handler path.\n *\n * See plugin-template/src/jobs/hello.ts for a complete example.\n *\n * @param definition - Job configuration with handler\n * @returns DefinedJob object with handler and manifest conversion\n */\nexport function defineJob<\n TInput extends JobInput = JobInput,\n TOutput = { ok: boolean; [key: string]: unknown }\n>(\n definition: JobDefinition<TInput, TOutput>\n): DefinedJob<TInput, TOutput> {\n const { handler, ...config } = definition;\n\n return {\n config: { ...config, handler: '' }, // handler path will be set in toManifest()\n handler,\n toManifest(handlerPath: string): JobDecl {\n // JobDecl now extends CronDecl, which has job.type instead of handler\n return {\n id: config.id,\n schedule: config.schedule,\n job: {\n type: config.id, // Use job id as type\n payload: {}, // Empty payload by default\n },\n describe: config.describe,\n enabled: config.enabled,\n permissions: definition.permissions,\n };\n },\n };\n}\n","/**\n * Define a CLI command handler\n */\n\nimport type { PluginContextV3, CommandResult, HostContext, MutateIntent, ExecuteIntent, UIFacade } from '@kb-labs/plugin-contracts';\n\n/**\n * CLI input wrapper - V3 plugin system wraps flags in this structure\n */\nexport interface CLIInput<TFlags = unknown> {\n flags: TFlags;\n argv: string[];\n}\n\nexport interface CommandHandlerV3<TConfig = unknown, TInput = unknown, TResult = unknown> {\n /**\n * Execute the command\n */\n execute(\n context: PluginContextV3<TConfig>,\n input: TInput\n ): Promise<CommandResult<TResult>> | CommandResult<TResult>;\n\n /**\n * Describe what the command *would* do without executing.\n * Implement this to support `--dry-run` for mutate/execute commands.\n * When present and `input.flags['dry-run']` is true, `defineCommand` calls\n * this instead of `execute` and renders the intent output automatically.\n */\n intent?(\n context: PluginContextV3<TConfig>,\n input: TInput\n ): Promise<MutateIntent | ExecuteIntent>;\n\n /**\n * Optional cleanup - called after execute completes\n */\n cleanup?(): Promise<void> | void;\n}\n\nexport interface CommandDefinition<TConfig = unknown, TInput = unknown, TResult = unknown> {\n /**\n * Command ID (e.g., \"my-plugin:greet\")\n */\n id: string;\n\n /**\n * Command description\n */\n description?: string;\n\n /**\n * Handler implementation\n */\n handler: CommandHandlerV3<TConfig, TInput, TResult>;\n\n /**\n * Optional input schema validation (future: use Zod/JSON Schema)\n */\n schema?: unknown;\n}\n\n/**\n * Define a CLI command\n *\n * For CLI commands, use CLIInput<TFlags> as TInput type to get proper typing\n * for the V3 plugin system's { flags, argv } structure.\n *\n * @example\n * ```typescript\n * interface GreetFlags {\n * name?: string;\n * }\n *\n * interface GreetResult {\n * message: string;\n * target: string;\n * }\n *\n * export default defineCommand<unknown, CLIInput<GreetFlags>, GreetResult>({\n * id: 'greet',\n * description: 'Greet a user',\n * handler: {\n * async execute(context, input) {\n * const target = input.flags.name || 'World';\n * context.ui.success(`Hello, ${target}!`);\n *\n * return {\n * ok: true,\n * result: { message: `Hello, ${target}!`, target },\n * meta: { version: 'v3' }\n * };\n * }\n * }\n * });\n * ```\n */\nexport function defineCommand<TConfig = unknown, TInput = unknown, TResult = unknown>(\n definition: CommandDefinition<TConfig, TInput, TResult>\n): CommandHandlerV3<TConfig, TInput, TResult> {\n return {\n execute: (context, input) => {\n if (context.host !== 'cli' && context.host !== 'workflow') {\n throw new Error(\n `Command ${definition.id} can only run in CLI or workflow host (current: ${context.host})`\n );\n }\n\n const flags = (input as { flags?: Record<string, unknown> })?.flags;\n if (flags?.['dry-run'] && typeof definition.handler.intent === 'function') {\n return (async () => {\n const intent = await definition.handler.intent!(context, input);\n renderDryRunIntent(context.ui, intent);\n return { ok: true, result: intent as unknown as TResult };\n })();\n }\n\n return definition.handler.execute(context, input);\n },\n\n cleanup: definition.handler.cleanup,\n } as CommandHandlerV3<TConfig, TInput, TResult>;\n}\n\nfunction renderDryRunIntent(ui: UIFacade, intent: MutateIntent | ExecuteIntent): void {\n if ('operations' in intent) {\n ui.info(`Dry-run: ${intent.summary}`, {\n sections: [{\n header: 'Operations',\n items: intent.operations.map((op) => {\n const detail = op.details ? ` — ${JSON.stringify(op.details)}` : '';\n return `${op.type.toUpperCase()} ${op.resource}${detail}`;\n }),\n }],\n });\n } else {\n const hint = intent.estimatedDurationMs\n ? ` (~${Math.round(intent.estimatedDurationMs / 1000)}s)`\n : '';\n ui.info(`Dry-run: ${intent.summary}${hint}`);\n }\n}\n\n/**\n * Type guard to check if host context is CLI\n */\nexport function isCLIHost(hostContext: HostContext): hostContext is Extract<HostContext, { host: 'cli' }> {\n return hostContext.host === 'cli';\n}\n","/**\n * Define a REST API route handler\n */\n\nimport type { PluginContextV3, CommandResult, HostContext } from '@kb-labs/plugin-contracts';\n\nexport interface RouteHandler<TConfig = unknown, TInput = unknown> {\n /**\n * Execute the route handler\n */\n execute(\n context: PluginContextV3<TConfig>,\n input: TInput\n ): Promise<CommandResult | void> | CommandResult | void;\n\n /**\n * Optional cleanup - called after execute completes\n */\n cleanup?(): Promise<void> | void;\n}\n\nexport interface RouteDefinition<TConfig = unknown, TInput = unknown> {\n /**\n * Route path (e.g., \"/api/greet\")\n */\n path: string;\n\n /**\n * HTTP method (e.g., \"GET\", \"POST\")\n */\n method: string;\n\n /**\n * Route description\n */\n description?: string;\n\n /**\n * Handler implementation\n */\n handler: RouteHandler<TConfig, TInput>;\n\n /**\n * Optional input schema validation (future: use Zod/JSON Schema)\n */\n schema?: unknown;\n}\n\n/**\n * Define a REST API route\n *\n * @example\n * ```typescript\n * export default defineRoute({\n * path: '/greet',\n * method: 'POST',\n * description: 'Greet a user',\n * handler: {\n * async execute(context, input: { name: string }) {\n * return {\n * ok: true,\n * result: { message: `Hello, ${input.name}!` },\n * };\n * }\n * }\n * });\n * ```\n */\nexport function defineRoute<TConfig = unknown, TInput = unknown>(\n definition: RouteDefinition<TConfig, TInput>\n): RouteHandler<TConfig, TInput> {\n // Validate host type at runtime\n const wrappedHandler: RouteHandler<TConfig, TInput> = {\n execute: async (context, input) => {\n // Ensure we're running in REST host\n if (context.host !== 'rest') {\n throw new Error(\n `Route ${definition.path} can only run in REST host (current: ${context.host})`\n );\n }\n\n // Validate method if provided in host context\n if (isRESTHost(context.hostContext)) {\n const expectedMethod = definition.method.toUpperCase();\n const actualMethod = context.hostContext.method.toUpperCase();\n if (actualMethod !== expectedMethod) {\n throw new Error(\n `Route ${definition.path} expects ${expectedMethod} but got ${actualMethod}`\n );\n }\n }\n\n // Call the actual handler with error handling\n try {\n return await definition.handler.execute(context, input);\n } finally {\n // Always call cleanup, even if handler throws\n await definition.handler.cleanup?.();\n }\n },\n\n cleanup: definition.handler.cleanup,\n };\n\n return wrappedHandler;\n}\n\n/**\n * Type guard to check if host context is REST\n */\nexport function isRESTHost(hostContext: HostContext): hostContext is Extract<HostContext, { host: 'rest' }> {\n return hostContext.host === 'rest';\n}\n","/**\n * Define a webhook handler\n */\n\nimport type { PluginContextV3, CommandResult, HostContext } from '@kb-labs/plugin-contracts';\n\nexport interface WebhookHandler<TConfig = unknown, TInput = unknown> {\n /**\n * Execute the webhook handler\n */\n execute(\n context: PluginContextV3<TConfig>,\n input: TInput\n ): Promise<CommandResult | void> | CommandResult | void;\n\n /**\n * Optional cleanup - called after execute completes\n */\n cleanup?(): Promise<void> | void;\n}\n\nexport interface WebhookDefinition<TConfig = unknown, TInput = unknown> {\n /**\n * Event name (e.g., \"github:push\", \"stripe:payment.success\")\n */\n event: string;\n\n /**\n * Webhook description\n */\n description?: string;\n\n /**\n * Handler implementation\n */\n handler: WebhookHandler<TConfig, TInput>;\n\n /**\n * Optional input schema validation (future: use Zod/JSON Schema)\n */\n schema?: unknown;\n}\n\n/**\n * Define a webhook handler\n *\n * @example\n * ```typescript\n * export default defineWebhook({\n * event: 'github:push',\n * description: 'Handle GitHub push events',\n * handler: {\n * async execute(context, input: { ref: string; commits: any[] }) {\n * const { event, source, payload } = context.hostContext as WebhookHost;\n *\n * context.ui.info(`Received ${event} from ${source}`);\n *\n * // Process webhook...\n *\n * return {\n * ok: true,\n * result: { processed: true },\n * };\n * }\n * }\n * });\n * ```\n */\nexport function defineWebhook<TConfig = unknown, TInput = unknown>(\n definition: WebhookDefinition<TConfig, TInput>\n): WebhookHandler<TConfig, TInput> {\n // Validate host type at runtime\n const wrappedHandler: WebhookHandler<TConfig, TInput> = {\n execute: async (context, input) => {\n // Ensure we're running in webhook host\n if (context.host !== 'webhook') {\n throw new Error(\n `Webhook ${definition.event} can only run in webhook host (current: ${context.host})`\n );\n }\n\n // Validate event if provided in host context\n if (isWebhookHost(context.hostContext)) {\n const expectedEvent = definition.event;\n const actualEvent = context.hostContext.event;\n if (actualEvent !== expectedEvent) {\n throw new Error(\n `Webhook expects event ${expectedEvent} but got ${actualEvent}`\n );\n }\n }\n\n // Call the actual handler with error handling\n try {\n return await definition.handler.execute(context, input);\n } finally {\n // Always call cleanup, even if handler throws\n await definition.handler.cleanup?.();\n }\n },\n\n cleanup: definition.handler.cleanup,\n };\n\n return wrappedHandler;\n}\n\n/**\n * Type guard to check if host context is webhook\n */\nexport function isWebhookHost(\n hostContext: HostContext\n): hostContext is Extract<HostContext, { host: 'webhook' }> {\n return hostContext.host === 'webhook';\n}\n","/**\n * Define a WebSocket channel handler with enhanced DX\n *\n * Provides type-safe WebSocket handlers following the same pattern as defineCommand, defineRoute, etc.\n */\n\nimport type { PluginContextV3, CommandResult, HostContext } from '@kb-labs/plugin-contracts';\nimport type { WSSender, WSInput, WSMessage } from '@kb-labs/plugin-contracts';\n\n/**\n * Validate that a message conforms to WSMessage structure\n * @throws {Error} if message is invalid\n */\nfunction validateWSMessage(message: unknown): asserts message is WSMessage {\n if (!message || typeof message !== 'object') {\n throw new Error('Invalid WebSocket message: must be an object');\n }\n\n const msg = message as Record<string, unknown>;\n\n if (typeof msg.type !== 'string' || msg.type.length === 0) {\n throw new Error('Invalid WebSocket message: type must be a non-empty string');\n }\n\n if (msg.timestamp !== undefined && typeof msg.timestamp !== 'number') {\n throw new Error('Invalid WebSocket message: timestamp must be a number');\n }\n\n if (msg.messageId !== undefined && typeof msg.messageId !== 'string') {\n throw new Error('Invalid WebSocket message: messageId must be a string');\n }\n}\n\n/**\n * Typed sender with message builders\n *\n * Wraps WSSender to provide generic type support for outgoing messages.\n */\nexport interface TypedSender<TOutgoing = WSMessage> extends Omit<WSSender, 'send' | 'broadcast' | 'sendTo'> {\n /** Send typed message to this client */\n send(message: TOutgoing): Promise<void>;\n /** Broadcast typed message to all clients in channel */\n broadcast(message: TOutgoing, excludeSelf?: boolean): Promise<void>;\n /** Send typed message to specific connections */\n sendTo(connectionIds: string[], message: TOutgoing): Promise<void>;\n /** Original WSSender methods for raw messages */\n raw: WSSender;\n}\n\n/**\n * Create typed sender wrapper\n */\nfunction createTypedSender<TOutgoing = WSMessage>(raw: WSSender): TypedSender<TOutgoing> {\n return {\n send: (msg) => raw.send(msg as WSMessage),\n broadcast: (msg, exclude) => raw.broadcast(msg as WSMessage, exclude),\n sendTo: (ids, msg) => raw.sendTo(ids, msg as WSMessage),\n close: raw.close.bind(raw),\n getConnectionId: raw.getConnectionId.bind(raw),\n raw,\n };\n}\n\n/**\n * WebSocket handler with typed messages\n */\nexport interface WebSocketHandler<TConfig = unknown, TIncoming = unknown, TOutgoing = WSMessage> {\n /**\n * Called when client connects\n */\n onConnect?(\n context: PluginContextV3<TConfig>,\n sender: TypedSender<TOutgoing>\n ): Promise<void> | void;\n\n /**\n * Called when message received from client\n */\n onMessage?(\n context: PluginContextV3<TConfig>,\n message: TIncoming,\n sender: TypedSender<TOutgoing>\n ): Promise<void> | void;\n\n /**\n * Called when client disconnects\n */\n onDisconnect?(\n context: PluginContextV3<TConfig>,\n code: number,\n reason: string\n ): Promise<void> | void;\n\n /**\n * Called on error\n */\n onError?(\n context: PluginContextV3<TConfig>,\n error: Error,\n sender: TypedSender<TOutgoing>\n ): Promise<void> | void;\n\n /**\n * Optional cleanup - called after any lifecycle event\n */\n cleanup?(): Promise<void> | void;\n}\n\nexport interface WebSocketDefinition<TConfig = unknown, TIncoming = unknown, TOutgoing = WSMessage> {\n /**\n * Channel path (e.g., \"/live\", \"/chat\")\n */\n path: string;\n\n /**\n * Channel description\n */\n description?: string;\n\n /**\n * Handler implementation\n */\n handler: WebSocketHandler<TConfig, TIncoming, TOutgoing>;\n\n /**\n * Optional message schema validation (future: use Zod/JSON Schema)\n */\n schema?: unknown;\n}\n\n/**\n * Define a WebSocket channel handler\n *\n * @example Basic usage\n * ```typescript\n * export default defineWebSocket({\n * path: '/chat',\n * handler: {\n * async onConnect(ctx, sender) {\n * await sender.send({ type: 'ready', payload: {}, timestamp: Date.now() });\n * },\n * async onMessage(ctx, message, sender) {\n * console.log('Received:', message);\n * },\n * }\n * });\n * ```\n *\n * @example With typed messages\n * ```typescript\n * interface IncomingMsg {\n * type: 'start' | 'stop';\n * payload: { scope?: string };\n * }\n *\n * interface OutgoingMsg {\n * type: 'progress' | 'complete';\n * payload: { progress: number; message: string };\n * }\n *\n * export default defineWebSocket<unknown, IncomingMsg, OutgoingMsg>({\n * path: '/live',\n * handler: {\n * async onMessage(ctx, message, sender) {\n * if (message.type === 'start') {\n * await sender.send({\n * type: 'progress',\n * payload: { progress: 50, message: 'Processing...' },\n * });\n * }\n * }\n * }\n * });\n * ```\n *\n * @example With message router (advanced pattern matching)\n * ```typescript\n * import { defineMessage, MessageRouter } from '@kb-labs/sdk';\n *\n * // Define message types\n * const StartMsg = defineMessage<{ scope?: string }>('start');\n * const StopMsg = defineMessage<object>('stop');\n *\n * // Create outgoing message builders\n * const ProgressMsg = defineMessage<{ phase: string; progress: number }>('progress');\n * const CompleteMsg = defineMessage<{ commits: any[] }>('complete');\n *\n * export default defineWebSocket({\n * path: '/live',\n * handler: {\n * async onMessage(ctx, message, sender) {\n * const router = new MessageRouter()\n * .on(StartMsg, async (ctx, payload, sender) => {\n * await sender.send(ProgressMsg.create({\n * phase: 'analyzing',\n * progress: 0,\n * }));\n * })\n * .on(StopMsg, async (ctx, payload, sender) => {\n * sender.close(1000, 'Stopped by user');\n * });\n *\n * await router.handle(ctx, message, sender.raw);\n * }\n * }\n * });\n * ```\n */\nexport function defineWebSocket<TConfig = unknown, TIncoming = unknown, TOutgoing = WSMessage>(\n definition: WebSocketDefinition<TConfig, TIncoming, TOutgoing>\n) {\n // Return a unified handler that router can call with WSInput\n return {\n async execute(context: PluginContextV3<TConfig>, input: WSInput): Promise<CommandResult | void> {\n // Validate host type at runtime\n if (context.host !== 'ws') {\n throw new Error(\n `WebSocket channel ${definition.path} can only run in ws host (current: ${context.host})`\n );\n }\n\n // Validate channel path if provided in host context\n if (isWSHost(context.hostContext)) {\n const expectedPath = definition.path;\n const actualPath = context.hostContext.channelPath;\n if (actualPath !== expectedPath) {\n throw new Error(\n `WebSocket expects channel ${expectedPath} but got ${actualPath}`\n );\n }\n }\n\n // Get sender from input (passed from channel-mounter)\n const sender = input.sender;\n if (!sender && input.event !== 'disconnect') {\n throw new Error('WebSocket sender not provided in input');\n }\n\n // Create typed sender wrapper (only if sender is available)\n const typedSender = sender ? createTypedSender<TOutgoing>(sender) : undefined;\n\n // Route to appropriate lifecycle handler\n try {\n switch (input.event) {\n case 'connect':\n if (typedSender) {\n await definition.handler.onConnect?.(context, typedSender);\n }\n break;\n\n case 'message':\n if (input.message && typedSender && sender) {\n // Validate message structure before processing\n try {\n validateWSMessage(input.message);\n } catch (error) {\n // Log validation error and send error message to client\n context.platform.logger.error('Invalid WebSocket message received', error as Error, {\n connectionId: sender.getConnectionId(),\n message: input.message,\n });\n // Send error response to client\n await sender.send({\n type: 'error',\n payload: { error: 'Invalid message format' },\n timestamp: Date.now(),\n });\n break;\n }\n\n // Parse incoming message as TIncoming (now validated)\n const incomingMessage = input.message as unknown as TIncoming;\n await definition.handler.onMessage?.(context, incomingMessage, typedSender);\n }\n break;\n\n case 'disconnect':\n await definition.handler.onDisconnect?.(\n context,\n input.disconnectCode ?? 1000,\n input.disconnectReason ?? ''\n );\n break;\n\n case 'error':\n if (input.error && typedSender) {\n await definition.handler.onError?.(context, input.error, typedSender);\n }\n break;\n }\n } finally {\n // Always call cleanup after lifecycle event\n await definition.handler.cleanup?.();\n }\n\n return { ok: true };\n },\n };\n}\n\n/**\n * Type guard to check if host context is WebSocket\n */\nexport function isWSHost(\n hostContext: HostContext\n): hostContext is Extract<HostContext, { host: 'ws' }> {\n return hostContext.host === 'ws';\n}\n","import type {\n CommandResult,\n EventStreamInput,\n EventStreamSender,\n PluginContextV3,\n} from \"@kb-labs/plugin-contracts\";\n\nexport interface EventStreamHandler<TConfig = unknown> {\n onConnect?(\n context: PluginContextV3<TConfig>,\n stream: EventStreamSender,\n ): Promise<void> | void;\n onDisconnect?(context: PluginContextV3<TConfig>): Promise<void> | void;\n onError?(\n context: PluginContextV3<TConfig>,\n error: Error,\n stream: EventStreamSender,\n ): Promise<void> | void;\n}\n\nexport interface EventStreamDefinition<TConfig = unknown> {\n path: string;\n description?: string;\n handler: EventStreamHandler<TConfig>;\n}\n\n/**\n * Defines a declarative plugin SSE endpoint. The REST host owns the HTTP\n * connection and invokes this lifecycle in-process, just like defineWebSocket.\n */\nexport function defineEventStream<TConfig = unknown>(\n definition: EventStreamDefinition<TConfig>,\n) {\n return {\n async execute(\n context: PluginContextV3<TConfig>,\n input: EventStreamInput,\n ): Promise<CommandResult> {\n if (context.host !== \"rest\") {\n throw new Error(\n `Event stream ${definition.path} can only run in rest host (current: ${context.host})`,\n );\n }\n if (\n (input.event === \"connect\" || input.event === \"error\") &&\n !input.sender\n ) {\n throw new Error(\"Event stream sender not provided in input\");\n }\n switch (input.event) {\n case \"connect\":\n await definition.handler.onConnect?.(context, input.sender!);\n break;\n case \"disconnect\":\n await definition.handler.onDisconnect?.(context);\n break;\n case \"error\":\n await definition.handler.onError?.(\n context,\n input.error ?? new Error(\"Event stream error\"),\n input.sender!,\n );\n break;\n }\n return { ok: true };\n },\n };\n}\n","/**\n * Define a workflow action handler\n */\n\nimport type { PluginContextV3, CommandResult, HostContext } from '@kb-labs/plugin-contracts';\n\nexport interface ActionHandler<TConfig = unknown, TInput = unknown> {\n /**\n * Execute the workflow action\n */\n execute(\n context: PluginContextV3<TConfig>,\n input: TInput\n ): Promise<CommandResult | void> | CommandResult | void;\n\n /**\n * Optional cleanup - called after execute completes\n */\n cleanup?(): Promise<void> | void;\n}\n\nexport interface ActionDefinition<TConfig = unknown, TInput = unknown> {\n /**\n * Action ID (e.g., \"send-email\")\n */\n id: string;\n\n /**\n * Action description\n */\n description?: string;\n\n /**\n * Handler implementation\n */\n handler: ActionHandler<TConfig, TInput>;\n\n /**\n * Optional input schema validation (future: use Zod/JSON Schema)\n */\n schema?: unknown;\n}\n\n/**\n * Define a workflow action\n *\n * @example\n * ```typescript\n * export default defineAction({\n * id: 'send-email',\n * description: 'Send an email notification',\n * handler: {\n * async execute(context, input: { to: string; subject: string; body: string }) {\n * // Access workflow context\n * const { workflowId, runId, stepId } = context.hostContext as WorkflowHost;\n *\n * context.ui.info(`Sending email in workflow ${workflowId}`);\n *\n * // Send email...\n *\n * return {\n * ok: true,\n * result: { sent: true, messageId: '123' },\n * };\n * }\n * }\n * });\n * ```\n */\nexport function defineAction<TConfig = unknown, TInput = unknown>(\n definition: ActionDefinition<TConfig, TInput>\n): ActionHandler<TConfig, TInput> {\n // Validate host type at runtime\n const wrappedHandler: ActionHandler<TConfig, TInput> = {\n execute: (context, input) => {\n // Ensure we're running in workflow host\n if (context.host !== 'workflow') {\n throw new Error(\n `Action ${definition.id} can only run in workflow host (current: ${context.host})`\n );\n }\n\n // Call the actual handler\n return definition.handler.execute(context, input);\n },\n\n cleanup: definition.handler.cleanup,\n };\n\n return wrappedHandler;\n}\n\n/**\n * Type guard to check if host context is workflow\n */\nexport function isWorkflowHost(\n hostContext: HostContext\n): hostContext is Extract<HostContext, { host: 'workflow' }> {\n return hostContext.host === 'workflow';\n}\n","/**\n * Enhanced WebSocket types for better DX\n *\n * Provides type-safe message builders and pattern matching utilities.\n */\n\nimport type { PluginContextV3 } from '@kb-labs/plugin-contracts';\nimport type { WSSender, WSMessage } from '@kb-labs/plugin-contracts';\n\n/**\n * Type-safe message builder\n *\n * @example\n * ```typescript\n * const Progress = defineMessage<{ phase: string; progress: number }>('progress');\n * const msg = Progress.create({ phase: 'analyzing', progress: 50 });\n * // msg: { type: 'progress', payload: { phase: 'analyzing', progress: 50 }, timestamp: number }\n * ```\n */\nexport class MessageBuilder<TPayload = unknown> {\n constructor(private type: string) {}\n\n /**\n * Create message with payload\n */\n create(payload: TPayload, messageId?: string): WSMessage {\n return {\n type: this.type,\n payload,\n messageId,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Match against incoming message type (type guard)\n */\n is(message: WSMessage): message is WSMessage & { payload: TPayload } {\n return message.type === this.type;\n }\n}\n\n/**\n * Helper to define typed messages\n *\n * @example\n * ```typescript\n * const StartMsg = defineMessage<{ scope?: string }>('start');\n * const ProgressMsg = defineMessage<{ phase: string; progress: number }>('progress');\n * ```\n */\nexport function defineMessage<TPayload = unknown>(type: string) {\n return new MessageBuilder<TPayload>(type);\n}\n\n/**\n * Message router for pattern matching\n *\n * Provides elegant routing of incoming WebSocket messages to typed handlers.\n *\n * @example\n * ```typescript\n * const router = new MessageRouter()\n * .on(StartMsg, async (ctx, payload, sender) => {\n * // payload is typed as { scope?: string }\n * console.log('Starting with scope:', payload.scope);\n * })\n * .on(StopMsg, async (ctx, payload, sender) => {\n * // Different message type, different payload type\n * sender.close(1000, 'Stopped by user');\n * });\n *\n * await router.handle(ctx, message, sender);\n * ```\n */\nexport class MessageRouter<TConfig = unknown> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private handlers = new Map<string, (ctx: PluginContextV3<TConfig>, payload: any, sender: WSSender) => Promise<void> | void>();\n\n /**\n * Register message handler\n */\n on<TPayload>(\n message: MessageBuilder<TPayload>,\n handler: (ctx: PluginContextV3<TConfig>, payload: TPayload, sender: WSSender) => Promise<void> | void\n ): this {\n this.handlers.set(message['type'], handler);\n return this;\n }\n\n /**\n * Handle incoming message\n *\n * @returns true if message was handled, false otherwise\n */\n async handle(ctx: PluginContextV3<TConfig>, message: WSMessage, sender: WSSender): Promise<boolean> {\n const handler = this.handlers.get(message.type);\n if (handler) {\n await handler(ctx, message.payload, sender);\n return true;\n }\n return false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/helpers/use-platform.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/flags/types.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/flags/define.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/flags/validate.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/analytics/with-analytics.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/errors/format-validation.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/errors/format.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/errors/factory.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/helpers/index.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/helpers/use-config.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/helpers/use-logger.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/helpers/use-llm.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/helpers/use-embeddings.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/helpers/use-vector-store.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/helpers/use-analytics.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/helpers/use-storage.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/helpers/use-cache.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/helpers/use-document-database.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/helpers/use-kv-store.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/helpers/use-notifications.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/helpers/use-env.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/define-system-command.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/manifest.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/manifest-builder.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/validation/schema-builders.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/rest/define-handler.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/lifecycle/define-handlers.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/jobs.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/define-command.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/define-route.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/define-webhook.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/define-websocket.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/define-event-stream.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/define-action.ts","../../home/runner/work/kb-labs/kb-labs/shared/command-kit/src/ws-types.ts"],"names":["globalPlatform","schema","json","message","usePlatform","trace","optionsWithTrace","path","text","filePath"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/shared-command-kit/helpers/use-platform\n * Platform access hook with execution-scoped context.\n *\n * Uses AsyncLocalStorage to return the correct platform for the current\n * handler execution (governed, with correct permissions and proxy adapters).\n * Falls back to global singleton for code running outside handler context.\n *\n * @example\n * ```typescript\n * import { usePlatform } from '@kb-labs/shared-command-kit';\n *\n * // In any command handler — automatically gets the right platform\n * async handler(ctx, argv, flags) {\n * const platform = usePlatform();\n * const result = await platform.llm.complete('prompt');\n * }\n * ```\n */\n\nimport { platformContext } from '@kb-labs/plugin-contracts';\nimport { platform as globalPlatform } from '@kb-labs/core-runtime';\n\n/**\n * Access platform services for the current execution context.\n *\n * Priority:\n * 1. AsyncLocalStorage context (set by runInProcess) — per-execution, governed\n * 2. Global singleton fallback (core-runtime) — for code outside handler context\n *\n * @returns Platform services with correct adapters for current context\n */\nexport function usePlatform(): typeof globalPlatform {\n // ALS stores PlatformServices (governed wrapper); at runtime it is always\n // structurally compatible with PlatformContainer — the cast is safe.\n return (platformContext.getStore() as unknown as typeof globalPlatform) ?? globalPlatform;\n}\n\n/**\n * Check if specific platform adapter is configured\n *\n * Useful for conditional logic based on available services.\n *\n * @param adapterName - Name of the adapter to check\n * @returns true if adapter is configured and available\n *\n * @example\n * ```typescript\n * if (isPlatformConfigured('llm')) {\n * // Use LLM-powered feature\n * } else {\n * // Use deterministic fallback\n * }\n * ```\n */\nexport function isPlatformConfigured(adapterName: keyof typeof globalPlatform): boolean {\n const platform = usePlatform();\n\n // Check if adapter exists and is not a noop/fallback\n const adapter = platform[adapterName];\n\n if (!adapter) {\n return false;\n }\n\n // For adapters with hasAdapter method (like platform itself)\n if ('hasAdapter' in platform && typeof platform.hasAdapter === 'function') {\n return platform.hasAdapter(adapterName as string);\n }\n\n // Fallback: check if adapter is not noop\n // Noop adapters usually have a specific constructor name or are simple objects\n if (typeof adapter === 'object' && adapter.constructor) {\n const constructorName = adapter.constructor.name;\n return !constructorName.toLowerCase().includes('noop') &&\n !constructorName.toLowerCase().includes('fallback');\n }\n\n return true;\n}\n","/**\n * @module @kb-labs/shared-command-kit/flags/types\n * Types for flag validation and schema definition\n */\n\n/**\n * Flag type definition\n */\nexport type FlagType = 'boolean' | 'string' | 'number' | 'array';\n\n/**\n * Base flag schema definition\n */\nexport interface BaseFlagSchema<T extends FlagType = FlagType> {\n /** Flag name */\n name?: string;\n /** Flag type */\n type: T;\n /** Short alias (e.g., 'n' for 'dry-run') */\n alias?: string;\n /** Description for help text */\n description?: string;\n /** Default value if flag is not provided */\n default?: unknown;\n /** Whether flag is required */\n required?: boolean;\n /** Flags that conflict with this flag */\n conflicts?: string[];\n /** Flags that this flag depends on */\n dependsOn?: string[];\n /** Flags that are implied when this flag is set */\n implies?: string[] | [string, unknown][];\n // Note: transform is defined in child interfaces with specific types\n}\n\n/**\n * Boolean flag schema\n */\nexport interface BooleanFlagSchema extends BaseFlagSchema<'boolean'> {\n type: 'boolean';\n default?: boolean;\n /** Transform function to apply to the value */\n transform?: (value: boolean) => boolean | Promise<boolean>;\n}\n\n/**\n * String flag schema\n */\nexport interface StringFlagSchema extends BaseFlagSchema<'string'> {\n type: 'string';\n default?: string;\n /** Allowed values (enum) */\n choices?: readonly string[];\n /** Regex pattern for validation */\n pattern?: RegExp;\n /** Minimum string length */\n minLength?: number;\n /** Maximum string length */\n maxLength?: number;\n /** Custom validation function */\n validate?: (value: string) => true | string | Promise<true | string>;\n /** Transform function to apply to the value */\n transform?: (value: string) => string | Promise<string>;\n}\n\n/**\n * Number flag schema\n */\nexport interface NumberFlagSchema extends BaseFlagSchema<'number'> {\n type: 'number';\n default?: number;\n /** Minimum value */\n min?: number;\n /** Maximum value */\n max?: number;\n /** Custom validation function */\n validate?: (value: number) => true | string | Promise<true | string>;\n /** Transform function to apply to the value */\n transform?: (value: number) => number | Promise<number>;\n}\n\n/**\n * Array flag schema\n */\nexport interface ArrayFlagSchema extends BaseFlagSchema<'array'> {\n type: 'array';\n default?: unknown[];\n /** Type of array items */\n items?: 'string' | 'number' | 'boolean';\n /** Minimum array length */\n minLength?: number;\n /** Maximum array length */\n maxLength?: number;\n /** Transform function to apply to the value */\n transform?: (value: unknown[]) => unknown[] | Promise<unknown[]>;\n}\n\n/**\n * Union of all flag schema types\n */\nexport type FlagSchema =\n | BooleanFlagSchema\n | StringFlagSchema\n | NumberFlagSchema\n | ArrayFlagSchema;\n\n/**\n * Flag schema definition object (for defineFlags)\n */\nexport type FlagSchemaDefinition = Record<string, Omit<FlagSchema, 'name'>>;\n\n/**\n * Validation error\n */\nexport class FlagValidationError extends Error {\n constructor(\n public readonly flag: string,\n message: string,\n public readonly value?: unknown,\n public readonly schema?: FlagSchemaDefinition,\n public readonly commandName?: string\n ) {\n super(message);\n this.name = 'FlagValidationError';\n }\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult<T = Record<string, unknown>> {\n success: boolean;\n data?: T;\n errors?: Array<{\n flag: string;\n message: string;\n value?: unknown;\n }>;\n}\n\n/**\n * Safe validation result (doesn't throw)\n */\nexport interface SafeValidationResult<T = Record<string, unknown>> {\n success: boolean;\n data?: T;\n errors: Array<{\n flag: string;\n message: string;\n value?: unknown;\n }>;\n}\n\n","/**\n * @module @kb-labs/shared-command-kit/flags/define\n * Define flag schemas with automatic type inference\n */\n\nimport type {\n FlagSchemaDefinition,\n BooleanFlagSchema,\n StringFlagSchema,\n NumberFlagSchema,\n ArrayFlagSchema,\n} from './types';\n\n/**\n * Flag schema with type inference\n */\nexport interface FlagSchemaWithInfer<T extends FlagSchemaDefinition> {\n /** Original schema definition */\n readonly schema: T;\n /** Infer TypeScript type from schema */\n infer: InferFlags<T>;\n}\n\n/**\n * Infer TypeScript type from flag schema definition\n */\nexport type InferFlags<T extends FlagSchemaDefinition> = {\n [K in keyof T]: T[K] extends BooleanFlagSchema\n ? T[K]['default'] extends boolean\n ? boolean\n : T[K]['required'] extends true\n ? boolean\n : boolean | undefined\n : T[K] extends StringFlagSchema\n ? T[K]['choices'] extends readonly string[]\n ? T[K]['required'] extends true\n ? T[K]['choices'][number]\n : T[K]['default'] extends string\n ? T[K]['choices'][number]\n : T[K]['choices'][number] | undefined\n : T[K]['required'] extends true\n ? string\n : T[K]['default'] extends string\n ? string\n : string | undefined\n : T[K] extends NumberFlagSchema\n ? T[K]['required'] extends true\n ? number\n : T[K]['default'] extends number\n ? number\n : number | undefined\n : T[K] extends ArrayFlagSchema\n ? T[K]['items'] extends 'string'\n ? string[]\n : T[K]['items'] extends 'number'\n ? number[]\n : T[K]['items'] extends 'boolean'\n ? boolean[]\n : unknown[]\n : unknown;\n};\n\n/**\n * Define a flag schema with automatic type inference\n *\n * @example\n * ```typescript\n * const schema = defineFlags({\n * scope: {\n * type: 'string',\n * required: true,\n * pattern: /^[@a-z0-9-/]+$/i,\n * },\n * 'dry-run': {\n * type: 'boolean',\n * default: false,\n * },\n * });\n *\n * type Flags = typeof schema.infer;\n * // Flags = { scope: string; 'dry-run': boolean }\n * ```\n */\nexport function defineFlags<T extends FlagSchemaDefinition>(\n definition: T\n): FlagSchemaWithInfer<T> {\n return {\n schema: definition,\n infer: {} as InferFlags<T>,\n };\n}\n\n","/**\n * @module @kb-labs/shared-command-kit/flags/validate\n * Validate flags against schema\n */\n\nimport {\n FlagValidationError,\n type FlagSchema,\n type FlagSchemaDefinition,\n type SafeValidationResult,\n} from './types';\nimport type { InferFlags } from './define';\n\n/**\n * Parse and coerce flag value based on type\n */\nfunction coerceValue(value: unknown, type: FlagSchema['type']): unknown {\n if (value === undefined || value === null) {\n return value;\n }\n\n switch (type) {\n case 'boolean':\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n const lower = value.toLowerCase().trim();\n if (lower === 'true' || lower === '1' || lower === 'yes') {\n return true;\n }\n if (lower === 'false' || lower === '0' || lower === 'no' || lower === '') {\n return false;\n }\n }\n return Boolean(value);\n\n case 'number':\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = Number(value);\n if (!Number.isNaN(parsed) && Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return Number(value);\n\n case 'array':\n if (Array.isArray(value)) {\n return value;\n }\n if (typeof value === 'string') {\n return value.split(',').map((item) => item.trim());\n }\n return [value];\n\n case 'string':\n return String(value);\n\n default:\n return value;\n }\n}\n\n/**\n * Validate a single flag value against its schema\n */\nasync function validateFlag(\n flagName: string,\n value: unknown,\n schema: FlagSchema\n): Promise<true | string> {\n const { type, required } = schema;\n \n // Type-specific properties (using type guards)\n const choices = 'choices' in schema ? schema.choices : undefined;\n const pattern = 'pattern' in schema ? schema.pattern : undefined;\n const min = 'min' in schema ? schema.min : undefined;\n const max = 'max' in schema ? schema.max : undefined;\n const validate = 'validate' in schema ? schema.validate : undefined;\n const minLength = 'minLength' in schema ? schema.minLength : undefined;\n const maxLength = 'maxLength' in schema ? schema.maxLength : undefined;\n const items = 'items' in schema ? schema.items : undefined;\n const transform = 'transform' in schema ? schema.transform : undefined;\n\n // Check required\n if (required && (value === undefined || value === null || value === '')) {\n return `Flag --${flagName} is required`;\n }\n\n // Skip validation if value is undefined and not required\n if (value === undefined || value === null) {\n return true;\n }\n\n // Coerce value to correct type\n const coerced = coerceValue(value, type);\n\n // Type-specific validation\n switch (type) {\n case 'boolean':\n if (typeof coerced !== 'boolean') {\n return `Flag --${flagName} must be a boolean`;\n }\n break;\n\n case 'string':\n if (typeof coerced !== 'string') {\n return `Flag --${flagName} must be a string`;\n }\n if (minLength !== undefined && coerced.length < minLength) {\n return `Flag --${flagName} must be at least ${minLength} characters long`;\n }\n if (maxLength !== undefined && coerced.length > maxLength) {\n return `Flag --${flagName} must be at most ${maxLength} characters long`;\n }\n if (choices && !choices.includes(coerced)) {\n return `Flag --${flagName} must be one of: ${choices.join(', ')} (got: ${coerced})`;\n }\n if (pattern && !pattern.test(coerced)) {\n return `Flag --${flagName} must match pattern ${pattern.toString()}`;\n }\n if (validate) {\n const stringValidate = validate as (value: string) => true | string | Promise<true | string>;\n const result = await stringValidate(coerced as string);\n if (result !== true) {\n return result;\n }\n }\n break;\n\n case 'number':\n if (typeof coerced !== 'number' || !Number.isFinite(coerced)) {\n return `Flag --${flagName} must be a number`;\n }\n if (min !== undefined && coerced < min) {\n return `Flag --${flagName} must be >= ${min} (got: ${coerced})`;\n }\n if (max !== undefined && coerced > max) {\n return `Flag --${flagName} must be <= ${max} (got: ${coerced})`;\n }\n if (validate) {\n const numberValidate = validate as (value: number) => true | string | Promise<true | string>;\n const result = await numberValidate(coerced as number);\n if (result !== true) {\n return result;\n }\n }\n break;\n\n case 'array':\n if (!Array.isArray(coerced)) {\n return `Flag --${flagName} must be an array`;\n }\n if (minLength !== undefined && coerced.length < minLength) {\n return `Flag --${flagName} must have at least ${minLength} items`;\n }\n if (maxLength !== undefined && coerced.length > maxLength) {\n return `Flag --${flagName} must have at most ${maxLength} items`;\n }\n if (items) {\n for (let i = 0; i < coerced.length; i++) {\n const item = coerced[i];\n if (items === 'string' && typeof item !== 'string') {\n return `Flag --${flagName}[${i}] must be a string`;\n }\n if (items === 'number' && typeof item !== 'number') {\n return `Flag --${flagName}[${i}] must be a number`;\n }\n if (items === 'boolean' && typeof item !== 'boolean') {\n return `Flag --${flagName}[${i}] must be a boolean`;\n }\n }\n }\n break;\n }\n\n return true;\n}\n\n/**\n * Validate flags against schema and return typed result\n *\n * @throws {FlagValidationError} If validation fails and safe mode is not used\n */\nexport async function validateFlags<T extends FlagSchemaDefinition>(\n rawFlags: Record<string, unknown>,\n schemaDefinition: { schema: T } | T\n): Promise<InferFlags<T>> {\n const schema = 'schema' in schemaDefinition ? schemaDefinition.schema : schemaDefinition;\n const errors: Array<{ flag: string; message: string; value?: unknown }> = [];\n const result: Record<string, unknown> = {};\n const flagValues: Record<string, unknown> = { ...rawFlags };\n\n // First pass: apply implies\n for (const [flagName, flagSchema] of Object.entries(schema)) {\n const value = flagValues[flagName];\n if (value !== undefined && value !== null && value !== false && value !== '') {\n const implies = flagSchema.implies;\n if (implies) {\n for (const implied of implies) {\n if (Array.isArray(implied) && implied.length === 2) {\n // [flagName, value] format\n const [impliedFlag, impliedValue] = implied;\n if (flagValues[impliedFlag] === undefined) {\n flagValues[impliedFlag] = impliedValue;\n }\n } else if (typeof implied === 'string') {\n // Just flag name - set to true\n if (flagValues[implied] === undefined) {\n flagValues[implied] = true;\n }\n }\n }\n }\n }\n }\n\n // Second pass: validate each flag\n for (const [flagName, flagSchema] of Object.entries(schema)) {\n const value = flagValues[flagName];\n const schemaWithName: FlagSchema = { ...flagSchema, name: flagName };\n\n // Check conflicts\n const conflicts = flagSchema.conflicts;\n if (conflicts && value !== undefined && value !== null && value !== false && value !== '') {\n for (const conflictingFlag of conflicts) {\n const conflictingValue = flagValues[conflictingFlag];\n if (conflictingValue !== undefined && conflictingValue !== null && conflictingValue !== false && conflictingValue !== '') {\n errors.push({\n flag: flagName,\n message: `Flag --${flagName} conflicts with --${conflictingFlag}`,\n value,\n });\n break;\n }\n }\n if (errors.some(e => e.flag === flagName)) {\n continue;\n }\n }\n\n // Check dependsOn\n const dependsOn = flagSchema.dependsOn;\n if (dependsOn && value !== undefined && value !== null && value !== '') {\n for (const dependency of dependsOn) {\n const dependencyValue = flagValues[dependency];\n if (dependencyValue === undefined || dependencyValue === null || dependencyValue === '') {\n errors.push({\n flag: flagName,\n message: `Flag --${flagName} depends on --${dependency}`,\n value,\n });\n break;\n }\n }\n if (errors.some(e => e.flag === flagName)) {\n continue;\n }\n }\n\n // Check required\n if (flagSchema.required && (value === undefined || value === null || value === '')) {\n errors.push({\n flag: flagName,\n message: `Flag --${flagName} is required`,\n value,\n });\n continue;\n }\n\n // Apply default if value is missing\n const finalValue = value !== undefined ? value : flagSchema.default;\n\n // Skip validation if value is undefined and not required\n if (finalValue === undefined && !flagSchema.required) {\n continue;\n }\n\n // Validate flag\n const validationResult = await validateFlag(flagName, finalValue, schemaWithName);\n if (validationResult !== true) {\n errors.push({\n flag: flagName,\n message: validationResult,\n value: finalValue,\n });\n continue;\n }\n\n // Apply transform if present\n let transformedValue = coerceValue(finalValue, flagSchema.type);\n const transform = flagSchema.transform;\n if (transform) {\n transformedValue = await transform(transformedValue);\n }\n\n // Store value\n result[flagName] = transformedValue;\n }\n\n // Check for unknown flags (optional - could be enabled via option)\n // for (const flagName of Object.keys(rawFlags)) {\n // if (!(flagName in schema)) {\n // errors.push({\n // flag: flagName,\n // message: `Unknown flag: --${flagName}`,\n // value: rawFlags[flagName],\n // });\n // }\n // }\n\n if (errors.length > 0) {\n const firstError = errors[0]!;\n throw new FlagValidationError(\n firstError.flag,\n firstError.message,\n firstError.value,\n schema as FlagSchemaDefinition // Pass schema for usage generation\n );\n }\n\n return result as InferFlags<T>;\n}\n\n/**\n * Safe version of validateFlags that doesn't throw\n */\nexport async function validateFlagsSafe<T extends FlagSchemaDefinition>(\n rawFlags: Record<string, unknown>,\n schemaDefinition: { schema: T } | T\n): Promise<SafeValidationResult<InferFlags<T>>> {\n try {\n const data = await validateFlags(rawFlags, schemaDefinition);\n return {\n success: true,\n data,\n errors: [],\n };\n } catch (error) {\n if (error instanceof FlagValidationError) {\n return {\n success: false,\n errors: [\n {\n flag: error.flag,\n message: error.message,\n value: error.value,\n },\n ],\n };\n }\n throw error;\n }\n}\n\n","/**\n * Analytics Wrapper\n *\n * Optional helper for wrapping operations with analytics events.\n * You can always use ctx.platform.analytics.track() directly - this is just convenience.\n *\n * @example\n * ```typescript\n * import { withAnalytics } from '@kb-labs/shared-command-kit';\n *\n * const result = await withAnalytics(ctx, 'mind.query', {\n * started: { queryId, text, mode },\n * completed: (result) => ({ tokensIn: result.tokensIn, tokensOut: result.tokensOut }),\n * failed: (error) => ({ errorMessage: error.message }),\n * }, async () => {\n * return await executeQuery(...);\n * });\n * ```\n */\n\nimport type { IAnalytics } from '@kb-labs/core-platform';\n\n/**\n * Context with optional analytics\n */\nexport interface AnalyticsContext {\n platform?: {\n analytics?: IAnalytics;\n };\n}\n\n/**\n * Analytics event configuration\n */\nexport interface AnalyticsEvents<TResult> {\n /** Event properties when operation starts */\n started?: Record<string, unknown>;\n /** Event properties when operation completes (can be function of result) */\n completed?: Record<string, unknown> | ((result: TResult) => Record<string, unknown>);\n /** Event properties when operation fails (can be function of error) */\n failed?: Record<string, unknown> | ((error: Error) => Record<string, unknown>);\n}\n\n/**\n * Wrap an async operation with analytics tracking\n *\n * Automatically tracks:\n * - `{eventName}.started` when operation begins\n * - `{eventName}.completed` when operation succeeds\n * - `{eventName}.failed` when operation fails\n *\n * @param ctx - Context with platform.analytics\n * @param eventName - Base event name (e.g., 'mind.query', 'workflow.run')\n * @param events - Event properties for started/completed/failed events\n * @param operation - Async operation to execute\n * @returns Result of the operation\n *\n * @example\n * ```typescript\n * const result = await withAnalytics(ctx, 'mind.query', {\n * started: { queryId: '123', text: 'search query' },\n * completed: (result) => ({\n * tokensIn: result.tokensIn,\n * tokensOut: result.tokensOut,\n * resultsCount: result.results.length,\n * }),\n * failed: (error) => ({\n * errorCode: error.code,\n * errorMessage: error.message,\n * }),\n * }, async () => {\n * return await executeQuery('search query');\n * });\n * ```\n */\nexport async function withAnalytics<TResult>(\n ctx: AnalyticsContext,\n eventName: string,\n events: AnalyticsEvents<TResult>,\n operation: () => Promise<TResult>\n): Promise<TResult> {\n const analytics = ctx.platform?.analytics;\n const startTime = Date.now();\n\n // Track started event\n if (analytics && events.started) {\n await analytics.track(`${eventName}.started`, {\n ...events.started,\n timestamp: new Date().toISOString(),\n });\n }\n\n try {\n // Execute operation\n const result = await operation();\n\n // Track completed event\n if (analytics && events.completed) {\n const completedProps = typeof events.completed === 'function'\n ? events.completed(result)\n : events.completed;\n\n await analytics.track(`${eventName}.completed`, {\n ...completedProps,\n durationMs: Date.now() - startTime,\n timestamp: new Date().toISOString(),\n });\n }\n\n return result;\n } catch (error: unknown) {\n // Track failed event\n if (analytics && events.failed) {\n const failedProps = typeof events.failed === 'function'\n ? events.failed(error as Error)\n : events.failed;\n\n await analytics.track(`${eventName}.failed`, {\n ...failedProps,\n durationMs: Date.now() - startTime,\n timestamp: new Date().toISOString(),\n });\n }\n\n // Re-throw error\n throw error;\n }\n}\n\n/**\n * Create a reusable analytics wrapper for a specific event\n *\n * @param eventName - Base event name\n * @param defaultEvents - Default event properties\n * @returns Function that wraps operations with analytics\n *\n * @example\n * ```typescript\n * const trackQuery = createAnalyticsWrapper('mind.query', {\n * started: { source: 'cli' },\n * completed: (result) => ({ resultsCount: result.results.length }),\n * });\n *\n * // Use multiple times\n * const result1 = await trackQuery(ctx, { text: 'query 1' }, async () => {...});\n * const result2 = await trackQuery(ctx, { text: 'query 2' }, async () => {...});\n * ```\n */\nexport function createAnalyticsWrapper<TResult>(\n eventName: string,\n defaultEvents: AnalyticsEvents<TResult>\n) {\n return async (\n ctx: AnalyticsContext,\n additionalEvents: Partial<AnalyticsEvents<TResult>>,\n operation: () => Promise<TResult>\n ): Promise<TResult> => {\n const mergedEvents: AnalyticsEvents<TResult> = {\n started: { ...defaultEvents.started, ...additionalEvents.started },\n completed: additionalEvents.completed || defaultEvents.completed,\n failed: additionalEvents.failed || defaultEvents.failed,\n };\n\n return withAnalytics(ctx, eventName, mergedEvents, operation);\n };\n}\n\n/**\n * Track a simple event (no wrapping)\n *\n * Convenience helper for tracking single events without wrapping an operation.\n *\n * @param ctx - Context with platform.analytics\n * @param eventName - Event name\n * @param properties - Event properties\n *\n * @example\n * ```typescript\n * await trackEvent(ctx, 'button.clicked', { buttonId: 'submit', page: 'settings' });\n * ```\n */\nexport async function trackEvent(\n ctx: AnalyticsContext,\n eventName: string,\n properties?: Record<string, unknown>\n): Promise<void> {\n const analytics = ctx.platform?.analytics;\n\n if (analytics) {\n await analytics.track(eventName, {\n ...properties,\n timestamp: new Date().toISOString(),\n });\n }\n}\n","/**\n * @module @kb-labs/shared-command-kit/errors/format-validation\n * User-friendly formatting for flag validation errors\n */\n\nimport type { FlagValidationError, StringFlagSchema } from '../flags/types';\nimport type { FlagSchemaDefinition } from '../flags/types';\n\n/**\n * Format a validation error into a user-friendly message\n *\n * @example\n * ```\n * ❌ Missing required flag: --text\n *\n * Usage: kb mind search --text <query>\n * Hint: Try kb mind search --help\n * ```\n */\nexport function formatValidationError(\n error: FlagValidationError,\n options: {\n commandName?: string;\n schema?: FlagSchemaDefinition;\n } = {}\n): string {\n const { commandName, schema } = options;\n const lines: string[] = [];\n\n // Main error message with emoji\n const errorMsg = error.message;\n\n // Determine error type and format accordingly\n if (errorMsg.includes('is required')) {\n lines.push(`❌ Missing required flag: --${error.flag}`);\n } else if (errorMsg.includes('must be one of')) {\n // Extract the invalid value if available\n const valueStr = error.value !== undefined ? ` ${error.value}` : '';\n lines.push(`❌ Invalid value for --${error.flag}:${valueStr}`);\n } else if (errorMsg.includes('must be a')) {\n lines.push(`❌ Invalid type for --${error.flag}`);\n } else if (errorMsg.includes('conflicts with')) {\n lines.push(`❌ Flag conflict: --${error.flag}`);\n } else if (errorMsg.includes('depends on')) {\n lines.push(`❌ Missing dependency for --${error.flag}`);\n } else {\n // Fallback: use the original message\n lines.push(`❌ ${errorMsg}`);\n }\n\n lines.push(''); // Empty line for spacing\n\n // Generate usage hint if we have schema and command name\n if (commandName && schema) {\n const usageLine = generateUsageLine(commandName, schema, error.flag);\n if (usageLine) {\n lines.push(`Usage: ${usageLine}`);\n }\n }\n\n // Add help hint\n if (commandName) {\n lines.push(`Hint: Try ${commandName} --help`);\n } else {\n lines.push('Hint: Try --help for more information');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate a usage line from command name and schema\n *\n * @example\n * generateUsageLine('kb mind search', schema, 'text')\n * // Returns: 'kb mind search --text <query> [options]'\n */\nfunction generateUsageLine(\n commandName: string,\n schema: FlagSchemaDefinition,\n errorFlag: string\n): string {\n const parts: string[] = [commandName];\n\n // Add the flag that caused the error first\n const errorFlagSchema = schema[errorFlag];\n if (errorFlagSchema) {\n const flagStr = formatFlagForUsage(errorFlag, errorFlagSchema);\n parts.push(flagStr);\n }\n\n // Check if there are other required flags\n const otherRequiredFlags = Object.entries(schema)\n .filter(([name, flagSchema]) =>\n name !== errorFlag && flagSchema.required\n );\n\n if (otherRequiredFlags.length > 0) {\n // Add other required flags\n for (const [name, flagSchema] of otherRequiredFlags) {\n parts.push(formatFlagForUsage(name, flagSchema));\n }\n }\n\n // Add [options] if there are optional flags\n const hasOptionalFlags = Object.values(schema).some(s => !s.required);\n if (hasOptionalFlags) {\n parts.push('[options]');\n }\n\n return parts.join(' ');\n}\n\n/**\n * Format a single flag for usage display\n *\n * @example\n * formatFlagForUsage('text', { type: 'string', required: true })\n * // Returns: '--text <text>'\n *\n * formatFlagForUsage('mode', { type: 'string', choices: ['local', 'auto'] })\n * // Returns: '[--mode <local|auto>]'\n */\nfunction formatFlagForUsage(\n name: string,\n schema: FlagSchemaDefinition[string]\n): string {\n let valueHint: string;\n\n if ('choices' in schema && (schema as StringFlagSchema).choices && (schema as StringFlagSchema).choices!.length > 0) {\n // Show choices: <local|auto>\n valueHint = `<${(schema as StringFlagSchema).choices!.join('|')}>`;\n } else if (schema.type === 'boolean') {\n // Boolean flags don't need a value hint\n return schema.required ? `--${name}` : `[--${name}]`;\n } else {\n // Generic type hint: <text>, <number>, etc.\n valueHint = `<${name}>`;\n }\n\n const flagPart = `--${name} ${valueHint}`;\n\n return schema.required ? flagPart : `[${flagPart}]`;\n}\n","/**\n * @module @kb-labs/shared-command-kit/errors/format\n * Error formatting utilities\n */\n\nimport type { FormattedError, FormatErrorOptions } from './types';\nimport { FlagValidationError } from '../flags/types';\nimport { formatValidationError } from './format-validation';\n\n/**\n * Format error for display\n * \n * @example\n * ```typescript\n * const formatted = formatError(error, {\n * jsonMode: Boolean(flags.json),\n * showStack: Boolean(flags.debug),\n * timingMs: tracker.total(),\n * });\n * \n * if (flags.json) {\n * ctx.output?.json(formatted.json);\n * } else {\n * ctx.output?.error(formatted.message);\n * }\n * ```\n */\nexport function formatError(\n error: unknown,\n options: FormatErrorOptions = {}\n): FormattedError {\n const { showStack = false, timingMs } = options;\n\n // Special handling for FlagValidationError\n if (error instanceof FlagValidationError) {\n const friendlyMessage = formatValidationError(error, {\n commandName: error.commandName,\n schema: error.schema,\n });\n\n const json: FormattedError['json'] = {\n ok: false,\n error: error.message,\n };\n\n if (timingMs !== undefined) {\n json.timingMs = timingMs;\n }\n\n if (showStack && error.stack) {\n json.stack = error.stack;\n }\n\n let message = friendlyMessage;\n if (showStack && error.stack) {\n message = `${friendlyMessage}\\n\\nStack trace:\\n${error.stack}`;\n }\n\n return {\n message,\n json,\n };\n }\n\n // Standard error formatting for other errors\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n const json: FormattedError['json'] = {\n ok: false,\n error: errorMessage,\n };\n\n if (timingMs !== undefined) {\n json.timingMs = timingMs;\n }\n\n if (showStack && errorStack) {\n json.stack = errorStack;\n }\n\n let message = errorMessage;\n if (showStack && errorStack) {\n message = `${errorMessage}\\n\\n${errorStack}`;\n }\n\n return {\n message,\n json,\n };\n}\n\n","/**\n * Error Factory for KB Labs Plugins\n *\n * Optional helper for defining plugin errors without boilerplate.\n * You can always use standard Error classes - this is just convenience.\n *\n * @example\n * ```typescript\n * import { defineError } from '@kb-labs/shared-command-kit';\n *\n * export const MindError = defineError('MIND', {\n * ValidationFailed: { code: 400, message: 'Validation failed' },\n * IndexNotFound: { code: 404, message: (scope: string) => `Index '${scope}' not found` },\n * QueryFailed: { code: 500, message: 'Query execution failed' },\n * });\n *\n * // Usage:\n * throw new MindError.IndexNotFound('default');\n * throw new MindError.ValidationFailed({ details: { field: 'cwd' } });\n * ```\n */\n\n/**\n * Error definition with HTTP code and message\n */\nexport interface ErrorDefinition {\n /** HTTP status code (400, 404, 500, etc.) */\n code: number;\n /** Error message - can be string or function for parameterized messages */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n message: string | ((...args: any[]) => string);\n /** Optional additional details */\n details?: Record<string, unknown>;\n}\n\n/**\n * Error definitions map\n */\nexport type ErrorDefinitions = Record<string, ErrorDefinition>;\n\n/**\n * Base error class with HTTP status code support\n */\nexport class PluginError extends Error {\n public readonly statusCode: number;\n public readonly errorCode: string;\n public readonly details?: Record<string, unknown>;\n\n constructor(\n errorCode: string,\n message: string,\n statusCode: number,\n details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'PluginError';\n this.errorCode = errorCode;\n this.statusCode = statusCode;\n this.details = details;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, PluginError);\n }\n }\n\n /**\n * Convert error to JSON for logging/serialization\n */\n toJSON() {\n return {\n name: this.name,\n errorCode: this.errorCode,\n message: this.message,\n statusCode: this.statusCode,\n details: this.details,\n stack: this.stack,\n };\n }\n\n /**\n * Check if error is a PluginError\n */\n static isPluginError(error: unknown): error is PluginError {\n return error instanceof PluginError;\n }\n}\n\n/**\n * Type for error constructor created by defineError\n */\ntype ErrorConstructor<TArgs extends unknown[] = unknown[]> = {\n new (details?: Record<string, unknown>): PluginError;\n new (...args: TArgs): PluginError;\n};\n\n/**\n * Type for error namespace created by defineError\n */\ntype ErrorNamespace<TDefs extends ErrorDefinitions> = {\n [K in keyof TDefs]: ErrorConstructor;\n} & {\n /** Check if error is from this namespace */\n is(error: unknown): error is PluginError;\n /** Check if error has specific error code */\n hasCode(error: unknown, code: keyof TDefs): boolean;\n};\n\n/**\n * Define a namespace of plugin errors\n *\n * @param prefix - Error code prefix (e.g., 'MIND', 'WORKFLOW')\n * @param definitions - Error definitions map\n * @returns Error namespace with error constructors\n *\n * @example\n * ```typescript\n * export const MindError = defineError('MIND', {\n * IndexNotFound: {\n * code: 404,\n * message: (scope: string) => `Index '${scope}' not found`\n * },\n * QueryFailed: {\n * code: 500,\n * message: 'Query execution failed'\n * },\n * });\n *\n * // Throw with template params\n * throw new MindError.IndexNotFound('default');\n * // Error message: \"Index 'default' not found\"\n *\n * // Throw with details\n * throw new MindError.QueryFailed({\n * details: { query: 'test', reason: 'timeout' }\n * });\n * ```\n */\nexport function defineError<TDefs extends ErrorDefinitions>(\n prefix: string,\n definitions: TDefs\n): ErrorNamespace<TDefs> {\n const errorNamespace: Record<string, unknown> = {};\n\n // Create error constructor for each definition\n for (const [key, def] of Object.entries(definitions)) {\n const errorCode = `${prefix}_${key.toUpperCase()}`;\n\n // Create error class\n class DefinedError extends PluginError {\n constructor(...args: unknown[]) {\n const { message, details } = buildMessageAndDetails(def, args);\n super(errorCode, message, def.code, details);\n this.name = `${prefix}Error`;\n }\n }\n\n errorNamespace[key] = DefinedError;\n }\n\n // Add helper methods\n errorNamespace.is = (error: unknown): error is PluginError => {\n return PluginError.isPluginError(error) && error.errorCode.startsWith(prefix + '_');\n };\n\n errorNamespace.hasCode = (error: unknown, code: keyof TDefs): boolean => {\n const errorCode = `${prefix}_${String(code).toUpperCase()}`;\n return PluginError.isPluginError(error) && error.errorCode === errorCode;\n };\n\n return errorNamespace as ErrorNamespace<TDefs>;\n}\n\n/**\n * Build error message and details from definition and constructor args\n */\nfunction buildMessageAndDetails(\n def: ErrorDefinition,\n args: unknown[]\n): { message: string; details?: Record<string, unknown> } {\n let message: string;\n let details: Record<string, unknown> | undefined;\n\n if (typeof def.message === 'function') {\n // Template message - args are template params\n const lastArg = args[args.length - 1];\n\n // Check if last arg is details object (has 'details' key)\n const hasDetails = lastArg && typeof lastArg === 'object' && 'details' in lastArg;\n\n if (hasDetails) {\n // Last arg is details, rest are template params\n const templateArgs = args.slice(0, -1);\n message = def.message(...templateArgs);\n details = { ...def.details, ...(lastArg as { details?: Record<string, unknown> }).details };\n } else {\n // All args are template params\n message = def.message(...args);\n details = def.details;\n }\n } else {\n // Static message\n message = def.message;\n\n // First arg can be details object\n if (args.length > 0 && typeof args[0] === 'object' && args[0] !== null) {\n details = { ...def.details, ...(args[0] as { details?: Record<string, unknown> }).details };\n } else {\n details = def.details;\n }\n }\n\n return { message, details };\n}\n\n/**\n * Common error definitions that can be reused across plugins\n */\nexport const commonErrors = {\n /**\n * Validation error (400)\n */\n ValidationFailed: {\n code: 400,\n message: 'Validation failed',\n },\n\n /**\n * Resource not found (404)\n */\n NotFound: {\n code: 404,\n message: (resource: string) => `${resource} not found`,\n },\n\n /**\n * Unauthorized access (401)\n */\n Unauthorized: {\n code: 401,\n message: 'Unauthorized',\n },\n\n /**\n * Forbidden access (403)\n */\n Forbidden: {\n code: 403,\n message: 'Forbidden',\n },\n\n /**\n * Internal server error (500)\n */\n InternalError: {\n code: 500,\n message: 'Internal server error',\n },\n\n /**\n * Service unavailable (503)\n */\n ServiceUnavailable: {\n code: 503,\n message: (service: string) => `Service '${service}' is unavailable`,\n },\n\n /**\n * Timeout error (504)\n */\n Timeout: {\n code: 504,\n message: (operation: string) => `Operation '${operation}' timed out`,\n },\n\n /**\n * Conflict error (409)\n */\n Conflict: {\n code: 409,\n message: (resource: string) => `${resource} already exists`,\n },\n} satisfies ErrorDefinitions;\n","/**\n * @module @kb-labs/shared-command-kit/helpers\n * Global platform access helpers\n *\n * Provides clean, type-safe access to platform services without context drilling.\n * Similar to React hooks pattern, but for KB Labs platform.\n *\n * @example\n * ```typescript\n * import { useLLM, useLogger, useAnalytics } from '@kb-labs/shared-command-kit/helpers';\n *\n * async handler(ctx, argv, flags) {\n * const logger = useLogger();\n * const llm = useLLM();\n *\n * await logger.info('Processing started');\n *\n * if (llm) {\n * const result = await llm.complete('prompt');\n * await logger.info('LLM result', { length: result.content.length });\n * }\n * }\n * ```\n */\n\n// Platform singleton\nexport { usePlatform, isPlatformConfigured } from './use-platform';\n\n// Context types and helpers\nexport type { PluginContextV3 } from './context';\n\n// Config access\nexport { useConfig } from './use-config';\n\n// Core services\nexport { useLogger, useLoggerWithContext } from './use-logger.js';\nexport { useLLM, isLLMAvailable, getLLMTier, type LLMTier, type UseLLMOptions } from './use-llm.js';\nexport { useEmbeddings, isEmbeddingsAvailable } from './use-embeddings.js';\nexport { useVectorStore, isVectorStoreAvailable } from './use-vector-store.js';\nexport { useAnalytics, trackAnalyticsEvent } from './use-analytics.js';\nexport { useStorage } from './use-storage.js';\nexport { useCache, isCacheAvailable } from './use-cache.js';\nexport { useDocumentDatabase, isDocumentDatabaseAvailable } from './use-document-database.js';\nexport { useKVStore, isKVStoreAvailable } from './use-kv-store.js';\n\n// Notifications\nexport { useNotifications } from './use-notifications.js';\n\n// Runtime shims\nexport { useEnv } from './use-env.js';\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-config\n * Global config access helper\n *\n * Provides clean access to product-specific configuration without context drilling.\n * Similar to React hooks pattern, but for KB Labs config.\n *\n * @example\n * ```typescript\n * import { useConfig } from '@kb-labs/shared-command-kit';\n *\n * // In any command handler\n * async handler(ctx, argv, flags) {\n * const config = await useConfig('mind');\n *\n * if (config) {\n * const scopes = config.scopes;\n * // Use config...\n * }\n * }\n * ```\n */\n\n/**\n * Access product-specific configuration from kb.config.json\n *\n * Returns ONLY the config for the specified product and profile.\n * Uses platform.config adapter (works across parent/child processes via IPC).\n * Supports both Profiles v2 and legacy config structures.\n *\n * **Security:** This function returns ONLY the product-specific config,\n * not the entire kb.config.json. This prevents cross-product config access.\n *\n * **Auto-detection:** If productId is not provided, it's automatically inferred\n * from the plugin's manifest.configSection field (passed via execution context).\n *\n * **Profiles v2 structure:**\n * ```json\n * {\n * \"profiles\": [\n * {\n * \"id\": \"default\",\n * \"products\": {\n * \"mind\": { \"scopes\": [...] },\n * \"workflow\": { \"maxConcurrency\": 10 }\n * }\n * }\n * ]\n * }\n * ```\n *\n * **Legacy structure:**\n * ```json\n * {\n * \"knowledge\": { \"scopes\": [...] }, // for \"mind\" product\n * \"workflow\": { \"maxConcurrency\": 10 }\n * }\n * ```\n *\n * @param productId - Product identifier (e.g., 'mind', 'workflow', 'plugins'). Optional - auto-detected from context.\n * @param profileId - Profile identifier (defaults to 'default' or KB_PROFILE env var)\n * @returns Promise resolving to product-specific config or undefined\n *\n * @example\n * ```typescript\n * // Auto-detect from context (recommended)\n * const config = await useConfig();\n *\n * // Explicit product ID\n * const mindConfig = await useConfig('mind');\n * if (mindConfig?.scopes) {\n * // Use scopes\n * }\n *\n * // With explicit profile\n * const workflowConfig = await useConfig('workflow', 'production');\n * ```\n */\nexport async function useConfig<T = any>(productId?: string, profileId?: string): Promise<T | undefined> {\n // Auto-detect productId from manifest.configSection if not provided\n let effectiveProductId = productId;\n if (!effectiveProductId) {\n effectiveProductId = (globalThis as typeof globalThis & { __KB_CONFIG_SECTION__?: string }).__KB_CONFIG_SECTION__;\n }\n\n if (!effectiveProductId) {\n return undefined;\n }\n\n // ── EXPLICIT OVERRIDE (2026-06-07) ──────────────────────────────────────────\n // Config is read DIRECTLY from the global the service already loaded\n // (`service-bootstrap` sets `__KB_RAW_CONFIG__` / `__KB_EFFECTIVE_CONFIG__`),\n // NOT through the `platform.config` adapter.\n //\n // Rationale: in-process the adapter was pure indirection over this same global,\n // and on the isolated/worker path it crashed — config is attached post-assembly\n // only on the parent path, so `platform.config` was undefined in worker handlers\n // (the \"F2\" bug). The global IS populated even in those workers, so reading it\n // directly is correct AND removes the adapter from the hot path.\n //\n // The `platform.config` proxy is kept ONLY as a fallback for a genuinely remote\n // worker that has no shared memory (future client/server execution).\n // ────────────────────────────────────────────────────────────────────────────\n const g = globalThis as typeof globalThis & {\n __KB_EFFECTIVE_CONFIG__?: Record<string, unknown>;\n __KB_RAW_CONFIG__?: Record<string, unknown>;\n };\n const rawConfig = g.__KB_EFFECTIVE_CONFIG__ ?? g.__KB_RAW_CONFIG__;\n\n if (rawConfig) {\n return selectProductSection<T>(rawConfig, effectiveProductId, profileId);\n }\n\n // Fallback: no global in this process (genuinely remote/isolated worker without\n // shared memory) → use the platform.config IPC proxy if present.\n const { usePlatform } = await import('./use-platform.js');\n const platform = usePlatform();\n if (platform?.config) {\n return (await platform.config.getConfig(effectiveProductId, profileId)) as T | undefined;\n }\n\n return undefined;\n}\n\n/**\n * Select a product's config section from the raw kb.config.json object.\n *\n * Mirrors core-runtime `ConfigAdapter.getConfig`: Profiles v2 first\n * (`profiles[].products[productId]`), then the legacy flat structure\n * (top-level key, with the `mind` → `knowledge` alias). Returns ONLY the\n * product-specific section, never the whole config.\n */\nfunction selectProductSection<T = any>(\n rawConfig: Record<string, unknown>,\n productId: string,\n profileId?: string,\n): T | undefined {\n const effectiveProfileId = profileId ?? process.env.KB_PROFILE ?? 'default';\n\n // Profiles v2 structure\n const profilesField = (rawConfig as { profiles?: unknown }).profiles;\n if (Array.isArray(profilesField)) {\n type RawProfile = { id?: string; products?: Record<string, unknown> };\n const profiles = profilesField as RawProfile[];\n const profile = profiles.find((p) => p.id === effectiveProfileId) ?? profiles[0];\n if (profile?.products?.[productId] !== undefined) {\n return profile.products[productId] as T;\n }\n }\n\n // Legacy flat structure (mind → knowledge alias)\n const legacyKeyMap: Record<string, string> = { mind: 'knowledge' };\n const legacyKey = legacyKeyMap[productId] ?? productId;\n if (rawConfig[legacyKey] !== undefined) {\n return rawConfig[legacyKey] as T;\n }\n\n return undefined;\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-logger\n * Global logger access helper\n *\n * Provides clean access to structured logging without context drilling.\n *\n * @example\n * ```typescript\n * import { useLogger } from '@kb-labs/shared-command-kit';\n *\n * async handler(ctx, argv, flags) {\n * const logger = useLogger();\n *\n * await logger.info('Processing started');\n * await logger.debug('Details', { userId: 123 });\n * await logger.error('Failed', { error: err });\n * }\n * ```\n */\n\nimport { usePlatform } from './use-platform';\nimport type { ILogger } from '@kb-labs/core-platform';\n\n/**\n * Access global logger\n *\n * Returns the platform logger with structured logging capabilities.\n * Supports child loggers with additional context.\n *\n * **Methods:**\n * - `logger.trace(message, meta?)` - Trace-level logs (most verbose)\n * - `logger.debug(message, meta?)` - Debug-level logs\n * - `logger.info(message, meta?)` - Info-level logs\n * - `logger.warn(message, meta?)` - Warning-level logs\n * - `logger.error(message, meta?)` - Error-level logs\n * - `logger.child(meta)` - Create child logger with additional context\n *\n * @returns Platform logger instance\n *\n * @example\n * ```typescript\n * const logger = useLogger();\n *\n * await logger.info('Task started', { taskId: '123' });\n * await logger.error('Task failed', { taskId: '123', error: err.message });\n *\n * // Child logger with persistent context\n * const taskLogger = logger.child({ taskId: '123', userId: 'user-1' });\n * await taskLogger.info('Step 1 completed');\n * await taskLogger.info('Step 2 completed');\n * ```\n */\nexport function useLogger(): ILogger {\n const platform = usePlatform();\n return platform.logger;\n}\n\n/**\n * Create child logger with additional context\n *\n * Useful for scoped logging within a specific operation.\n *\n * @param context - Additional context to attach to all log entries\n * @returns Child logger with persistent context\n *\n * @example\n * ```typescript\n * const logger = useLoggerWithContext({ operation: 'release', version: '1.0.0' });\n *\n * await logger.info('Started'); // Automatically includes operation + version\n * await logger.info('Completed');\n * ```\n */\nexport function useLoggerWithContext(context: Record<string, unknown>): ILogger {\n const logger = useLogger();\n return logger.child(context);\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-llm\n * Global LLM access helper with tier-based model selection.\n *\n * Provides clean access to LLM with adaptive tier routing.\n * Plugins specify tiers (small/medium/large), platform resolves to actual models.\n *\n * @example\n * ```typescript\n * import { useLLM } from '@kb-labs/shared-command-kit';\n *\n * async handler(ctx, argv, flags) {\n * // Simple usage (uses configured default tier)\n * const llm = useLLM();\n *\n * // Request specific tier (platform adapts if needed)\n * const llm = useLLM({ tier: 'small' }); // Simple tasks\n * const llm = useLLM({ tier: 'large' }); // Complex tasks\n *\n * // Request capabilities\n * const llm = useLLM({ tier: 'medium', capabilities: ['coding'] });\n *\n * if (llm) {\n * const result = await llm.complete('Explain this code');\n * console.log(result.content);\n * }\n * }\n * ```\n */\n\nimport { usePlatform } from './use-platform.js';\nimport type {\n ILLM,\n LLMTier,\n LLMOptions,\n LLMResponse,\n LLMMessage,\n LLMToolCallOptions,\n LLMToolCallResponse,\n UseLLMOptions,\n ILLMRouter,\n LLMAdapterBinding,\n LLMExecutionPolicy,\n LLMProtocolCapabilities,\n LLMCacheDecisionTrace,\n} from '@kb-labs/core-platform';\n\n/**\n * Access global LLM adapter with tier-based selection.\n *\n * Platform automatically adapts to available models:\n * - If plugin requests 'small' but 'medium' configured → uses 'medium' (escalation)\n * - If plugin requests 'large' but 'medium' configured → uses 'medium' with warning (degradation)\n *\n * **Tiers are user-defined slots:**\n * - `small` - Plugin says: \"This task is simple\"\n * - `medium` - Plugin says: \"Standard task\"\n * - `large` - Plugin says: \"Complex task, need maximum quality\"\n *\n * User decides what model maps to each tier in their config.\n *\n * @param options - Optional tier and capability requirements\n * @returns LLM adapter or undefined if not configured\n *\n * @example\n * ```typescript\n * // Simple usage (uses configured default)\n * const llm = useLLM();\n *\n * // Request specific tier\n * const llm = useLLM({ tier: 'small' }); // Simple tasks\n * const llm = useLLM({ tier: 'large' }); // Complex tasks\n *\n * // Request capabilities\n * const llm = useLLM({ tier: 'medium', capabilities: ['coding'] });\n * const llm = useLLM({ capabilities: ['vision'] });\n *\n * if (llm) {\n * const result = await llm.complete('Generate commit message');\n * console.log(result.content);\n * }\n * ```\n */\nexport function useLLM(options?: UseLLMOptions): ILLM | undefined {\n const platform = usePlatform();\n const llm = platform.llm;\n\n if (!llm) {\n return undefined;\n }\n\n // If router and options given → return immutable LazyBoundLLM (no state mutation)\n if (options && isLLMRouter(llm)) {\n return new LazyBoundLLM(llm, options);\n }\n\n return llm;\n}\n\n/**\n * Lazy adapter binding that resolves tier on first use.\n * Immutable — does NOT mutate the global LLMRouter state.\n * This fixes the race condition where useLLM({ tier: 'large' }) was immediately\n * overwritten by useLLM({ tier: 'small' }) from SmartSummarizer.\n */\nclass LazyBoundLLM implements ILLM {\n private _resolved: Promise<LLMAdapterBinding> | null = null;\n\n constructor(\n private readonly router: ILLM & ILLMRouter,\n private readonly options: UseLLMOptions,\n ) {}\n\n private resolve(): Promise<LLMAdapterBinding> {\n if (!this._resolved) {\n this._resolved = this.router.resolveAdapter(this.options);\n }\n return this._resolved;\n }\n\n private mergeExecutionPolicy(callOptions?: LLMOptions): LLMExecutionPolicy | undefined {\n const globalPolicy = this.options.execution;\n const localPolicy = callOptions?.execution;\n if (!globalPolicy && !localPolicy) {\n return undefined;\n }\n return {\n ...globalPolicy,\n ...localPolicy,\n cache: { ...globalPolicy?.cache, ...localPolicy?.cache },\n stream: { ...globalPolicy?.stream, ...localPolicy?.stream },\n };\n }\n\n private async resolveProtocolCapabilities(adapter: ILLM): Promise<LLMProtocolCapabilities> {\n if (!adapter.getProtocolCapabilities) {\n return {\n cache: { supported: false },\n stream: { supported: true },\n };\n }\n return adapter.getProtocolCapabilities();\n }\n\n private enforceCachePolicy(caps: LLMProtocolCapabilities, execution?: LLMExecutionPolicy): void {\n if (execution?.cache?.mode === 'require' && !caps.cache.supported) {\n throw new Error('CACHE_NOT_SUPPORTED: adapter does not support required cache policy');\n }\n }\n\n private buildDecisionTrace(\n caps: LLMProtocolCapabilities,\n execution: LLMExecutionPolicy | undefined,\n streamAppliedMode: 'prefer' | 'require' | 'off',\n streamFallback?: 'complete',\n reason?: string,\n ): LLMCacheDecisionTrace {\n const requestedCacheMode = execution?.cache?.mode ?? 'prefer';\n const requestedStreamMode = execution?.stream?.mode ?? 'prefer';\n\n return {\n cacheRequestedMode: requestedCacheMode,\n cacheSupported: caps.cache.supported,\n cacheAppliedMode:\n requestedCacheMode === 'require' || requestedCacheMode === 'bypass'\n ? requestedCacheMode\n : caps.cache.supported\n ? 'prefer'\n : 'bypass',\n streamRequestedMode: requestedStreamMode,\n streamSupported: caps.stream.supported,\n streamAppliedMode,\n streamFallback,\n reason,\n };\n }\n\n private withDecisionMetadata(\n options: LLMOptions | undefined,\n trace: LLMCacheDecisionTrace,\n ): LLMOptions | undefined {\n if (!options) {\n return { metadata: { cacheDecisionTrace: trace } };\n }\n\n return {\n ...options,\n metadata: {\n ...options.metadata,\n cacheDecisionTrace: trace,\n },\n };\n }\n\n async complete(prompt: string, options?: LLMOptions): Promise<LLMResponse> {\n const { adapter, model } = await this.resolve();\n const execution = this.mergeExecutionPolicy(options);\n const caps = await this.resolveProtocolCapabilities(adapter);\n this.enforceCachePolicy(caps, execution);\n const trace = this.buildDecisionTrace(caps, execution, 'off');\n const optionsWithTrace = this.withDecisionMetadata(options, trace);\n return adapter.complete(prompt, { ...optionsWithTrace, model, execution });\n }\n\n async *stream(prompt: string, options?: LLMOptions): AsyncIterable<string> {\n const { adapter, model } = await this.resolve();\n const execution = this.mergeExecutionPolicy(options);\n const caps = await this.resolveProtocolCapabilities(adapter);\n this.enforceCachePolicy(caps, execution);\n\n const streamMode = execution?.stream?.mode ?? 'prefer';\n const canStream = caps.stream.supported;\n const allowFallback = execution?.stream?.fallbackToComplete ?? true;\n\n if (streamMode === 'off' || (!canStream && streamMode === 'prefer' && allowFallback)) {\n const fallbackReason =\n streamMode === 'off'\n ? 'STREAM_OFF'\n : 'STREAM_UNSUPPORTED_FALLBACK_TO_COMPLETE';\n const trace = this.buildDecisionTrace(caps, execution, 'off', 'complete', fallbackReason);\n const optionsWithTrace = this.withDecisionMetadata(options, trace);\n const response = await adapter.complete(prompt, { ...optionsWithTrace, model, execution });\n if (response.content) {\n yield response.content;\n }\n return;\n }\n\n if (!canStream && streamMode === 'require') {\n throw new Error('STREAM_NOT_SUPPORTED: adapter does not support required streaming');\n }\n\n const trace = this.buildDecisionTrace(caps, execution, streamMode);\n const optionsWithTrace = this.withDecisionMetadata(options, trace);\n yield* adapter.stream(prompt, { ...optionsWithTrace, model, execution });\n }\n\n async chatWithTools(\n messages: LLMMessage[],\n options: LLMToolCallOptions,\n ): Promise<LLMToolCallResponse> {\n const { adapter, model, tier } = await this.resolve();\n const execution = this.mergeExecutionPolicy(options);\n const caps = await this.resolveProtocolCapabilities(adapter);\n this.enforceCachePolicy(caps, execution);\n if (!adapter.chatWithTools) {\n throw new Error('Current adapter does not support chatWithTools');\n }\n const trace = this.buildDecisionTrace(caps, execution, 'off');\n const optionsWithTrace = this.withDecisionMetadata(options, trace) as LLMToolCallOptions;\n return adapter.chatWithTools(messages, {\n ...optionsWithTrace,\n model,\n execution,\n metadata: { ...optionsWithTrace.metadata, tier },\n });\n }\n}\n\n/**\n * Check if LLM is available.\n *\n * Useful for conditional logic (LLM-powered vs deterministic fallback).\n *\n * @returns true if LLM is configured and ready\n *\n * @example\n * ```typescript\n * if (isLLMAvailable()) {\n * const summary = await generateWithLLM(data);\n * } else {\n * const summary = generateDeterministic(data);\n * }\n * ```\n */\nexport function isLLMAvailable(): boolean {\n const llm = useLLM();\n return !!llm;\n}\n\n/**\n * Get configured LLM tier.\n *\n * Useful for diagnostics and logging.\n *\n * @returns Configured tier or undefined if LLM not available/not a router\n *\n * @example\n * ```typescript\n * const tier = getLLMTier();\n * console.log(`Using LLM tier: ${tier ?? 'default'}`);\n * ```\n */\nexport function getLLMTier(): LLMTier | undefined {\n const platform = usePlatform();\n const llm = platform.llm;\n\n if (llm && isLLMRouter(llm)) {\n return llm.getConfiguredTier();\n }\n\n return undefined;\n}\n\n/**\n * Type guard for ILLMRouter.\n */\nfunction isLLMRouter(llm: ILLM): llm is ILLM & ILLMRouter {\n return (\n typeof (llm as unknown as ILLMRouter).getConfiguredTier === 'function' &&\n typeof (llm as unknown as ILLMRouter).resolve === 'function'\n );\n}\n\n// Re-export types for convenience\nexport type { LLMTier, UseLLMOptions } from '@kb-labs/core-platform';\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-embeddings\n * Global Embeddings access helper\n */\n\nimport { usePlatform } from './use-platform';\nimport type { IEmbeddings } from '@kb-labs/core-platform';\n\n/**\n * Access global Embeddings adapter\n *\n * Returns the platform embeddings adapter (OpenAI, etc.).\n * Returns undefined if embeddings is not configured (graceful degradation).\n *\n * @returns Embeddings adapter or undefined if not configured\n *\n * @example\n * ```typescript\n * const embeddings = useEmbeddings();\n *\n * if (embeddings) {\n * const vector = await embeddings.embed('Hello, world!');\n * console.log(vector.length); // e.g., 1536 for OpenAI\n * }\n * ```\n */\nexport function useEmbeddings(): IEmbeddings | undefined {\n const platform = usePlatform();\n return platform.embeddings;\n}\n\n/**\n * Check if Embeddings is available\n *\n * @returns true if embeddings is configured and ready\n *\n * @example\n * ```typescript\n * if (isEmbeddingsAvailable()) {\n * const vector = await embeddings.embed(text);\n * } else {\n * // Use deterministic fallback\n * }\n * ```\n */\nexport function isEmbeddingsAvailable(): boolean {\n const embeddings = useEmbeddings();\n return !!embeddings;\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-vector-store\n * Global VectorStore access helper\n */\n\nimport { usePlatform } from './use-platform';\nimport type { IVectorStore } from '@kb-labs/core-platform';\n\n/**\n * Access global VectorStore adapter\n *\n * Returns the platform vector store adapter (Qdrant, local, etc.).\n * Returns undefined if vectorStore is not configured (graceful degradation).\n *\n * @returns VectorStore adapter or undefined if not configured\n *\n * @example\n * ```typescript\n * const vectorStore = useVectorStore();\n *\n * if (vectorStore) {\n * await vectorStore.upsert([{ id: '1', vector: [0.1, 0.2], metadata: {} }]);\n * const results = await vectorStore.search([0.1, 0.2], 10);\n * }\n * ```\n */\nexport function useVectorStore(): IVectorStore | undefined {\n const platform = usePlatform();\n return platform.vectorStore;\n}\n\n/**\n * Check if VectorStore is available\n *\n * @returns true if vectorStore is configured and ready\n *\n * @example\n * ```typescript\n * if (isVectorStoreAvailable()) {\n * await vectorStore.upsert(records);\n * } else {\n * // Use local fallback\n * }\n * ```\n */\nexport function isVectorStoreAvailable(): boolean {\n const vectorStore = useVectorStore();\n return !!vectorStore;\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-analytics\n * Global analytics access helper\n *\n * Provides clean access to analytics/telemetry without context drilling.\n *\n * @example\n * ```typescript\n * import { useAnalytics } from '@kb-labs/shared-command-kit';\n *\n * async handler(ctx, argv, flags) {\n * const analytics = useAnalytics();\n *\n * if (analytics) {\n * await analytics.track('release_started', { version: '1.0.0' });\n * analytics.metric('release_duration_ms', 1234);\n * }\n * }\n * ```\n */\n\nimport { usePlatform } from './use-platform';\nimport type { IAnalytics } from '@kb-labs/core-platform';\n\n/**\n * Access global analytics adapter\n *\n * Returns the platform analytics adapter for tracking events and metrics.\n * Returns undefined if analytics is not configured (graceful degradation).\n *\n * **Methods:**\n * - `analytics.track(event, properties?)` - Track events\n * - `analytics.metric(name, value, tags?)` - Record metrics\n *\n * **Always check availability:**\n * ```typescript\n * const analytics = useAnalytics();\n * if (analytics) {\n * await analytics.track('event');\n * }\n * ```\n *\n * @returns Analytics adapter or undefined if not configured\n *\n * @example\n * ```typescript\n * const analytics = useAnalytics();\n *\n * if (analytics) {\n * await analytics.track('command_executed', {\n * command: 'release:run',\n * duration_ms: 1234,\n * success: true,\n * });\n *\n * analytics.metric('release_packages_count', 5, {\n * project: 'kb-labs',\n * });\n * }\n * ```\n */\nexport function useAnalytics(): IAnalytics | undefined {\n const platform = usePlatform();\n return platform.analytics;\n}\n\n/**\n * Track event with analytics (safe, global singleton)\n *\n * Convenience wrapper that uses global platform analytics.\n * Does nothing if analytics is not configured.\n *\n * NOTE: For context-based analytics, use trackEvent() from '../analytics/with-analytics'.\n * This helper uses global singleton, not request-scoped context.\n *\n * @param event - Event name\n * @param properties - Event properties\n *\n * @example\n * ```typescript\n * import { trackAnalyticsEvent } from '@kb-labs/shared-command-kit/helpers';\n *\n * // No need to check if analytics exists\n * await trackAnalyticsEvent('release_completed', { version: '1.0.0', packages: 5 });\n * ```\n */\nexport async function trackAnalyticsEvent(\n event: string,\n properties?: Record<string, unknown>\n): Promise<void> {\n const analytics = useAnalytics();\n if (analytics) {\n await analytics.track(event, properties);\n }\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-storage\n * Global storage access helper\n *\n * Provides clean access to file/blob storage adapter.\n *\n * @example\n * ```typescript\n * import { useStorage } from '@kb-labs/shared-command-kit';\n *\n * async handler(ctx, argv, flags) {\n * const storage = useStorage();\n *\n * if (storage) {\n * await storage.write('path/to/file.txt', 'content');\n * const content = await storage.read('path/to/file.txt');\n * }\n * }\n * ```\n */\n\nimport { usePlatform } from './use-platform';\nimport type { IStorage } from '@kb-labs/core-platform';\n\n/**\n * Access global storage adapter\n *\n * Returns the platform storage adapter for file/blob operations.\n * Returns undefined if storage is not configured (graceful degradation).\n *\n * **Methods:**\n * - `storage.read(path)` - Read file content\n * - `storage.write(path, content)` - Write file content\n * - `storage.exists(path)` - Check if file exists\n * - `storage.delete(path)` - Delete file\n * - `storage.list(prefix?)` - List files\n *\n * **Always check availability:**\n * ```typescript\n * const storage = useStorage();\n * if (storage) {\n * await storage.write('file.txt', 'content');\n * }\n * ```\n *\n * @returns Storage adapter or undefined if not configured\n *\n * @example\n * ```typescript\n * const storage = useStorage();\n *\n * if (storage) {\n * // Write file\n * await storage.write('releases/v1.0.0.json', JSON.stringify(data));\n *\n * // Read file\n * const content = await storage.read('releases/v1.0.0.json');\n * const data = JSON.parse(content);\n *\n * // Check existence\n * const exists = await storage.exists('releases/v1.0.0.json');\n *\n * // List files\n * const files = await storage.list('releases/');\n * }\n * ```\n */\nexport function useStorage(): IStorage | undefined {\n const platform = usePlatform();\n return platform.storage;\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-cache\n * Global Cache access helper\n *\n * Provides clean access to platform cache (Redis, InMemory, or custom adapter).\n *\n * @example\n * ```typescript\n * import { useCache } from '@kb-labs/shared-command-kit';\n *\n * async handler(ctx, argv, flags) {\n * const cache = useCache();\n *\n * if (cache) {\n * await cache.set('key', { data: 'value' }, 60000); // TTL: 60s\n * const value = await cache.get('key');\n * console.log(value);\n * }\n * }\n * ```\n */\n\nimport { usePlatform } from './use-platform.js';\nimport type { ICache } from '@kb-labs/core-platform';\n\n/**\n * Access global cache adapter\n *\n * Returns the platform cache adapter (Redis, InMemory, or custom).\n * Returns undefined if cache is not configured (graceful degradation).\n *\n * **Methods:**\n * - `cache.set(key, value, ttlMs?)` - Store value with optional TTL\n * - `cache.get<T>(key)` - Retrieve value by key\n * - `cache.delete(key)` - Remove value\n * - `cache.clear()` - Clear all cached values\n *\n * **Always check availability:**\n * ```typescript\n * const cache = useCache();\n * if (cache) {\n * await cache.set('query-123', result, 60000);\n * } else {\n * // No caching, compute every time\n * }\n * ```\n *\n * @returns Cache adapter or undefined if not configured\n *\n * @example\n * ```typescript\n * const cache = useCache();\n *\n * if (cache) {\n * // Check cache first\n * const cached = await cache.get<QueryResult>('query-123');\n * if (cached) {\n * return cached;\n * }\n *\n * // Compute result\n * const result = await expensiveQuery();\n *\n * // Cache for 5 minutes\n * await cache.set('query-123', result, 5 * 60 * 1000);\n *\n * return result;\n * }\n * ```\n */\nexport function useCache(): ICache | undefined {\n const platform = usePlatform();\n return platform.cache;\n}\n\n/**\n * Check if cache is available\n *\n * Useful for conditional logic (cached vs non-cached execution).\n *\n * @returns true if cache is configured and ready\n *\n * @example\n * ```typescript\n * if (isCacheAvailable()) {\n * // Use cached results\n * const result = await getCachedOrCompute(key);\n * } else {\n * // Compute every time\n * const result = await compute();\n * }\n * ```\n */\nexport function isCacheAvailable(): boolean {\n const cache = useCache();\n return !!cache;\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-document-database\n *\n * Hook for the per-plugin document database — structured persistence with\n * filters, transactions, and indexed collections.\n *\n * The adapter is resolved from the current `usePlatform()` context, so the\n * instance you receive is already wrapped with this plugin's permissions:\n * collection names are namespaced under `<pluginId>__<name>`, and any call\n * to a collection the plugin didn't declare in\n * `permissions.platform.database.document.owns` / `.access` rejects with\n * `PermissionError`.\n *\n * @example\n * ```typescript\n * import { useDocumentDatabase } from '@kb-labs/shared-command-kit';\n *\n * interface Run extends BaseDocument {\n * status: 'queued' | 'running' | 'done';\n * startedAt: number;\n * }\n *\n * async function handler() {\n * const docs = useDocumentDatabase();\n * if (!docs) {\n * throw new Error('Plugin needs documentDatabase configured');\n * }\n *\n * await docs.ensureCollection('runs', {\n * indexes: [{ path: 'status' }],\n * });\n *\n * const queued = await docs.find<Run>('runs', { status: { $eq: 'queued' } });\n * return queued;\n * }\n * ```\n */\n\nimport type { IDocumentDatabase } from '@kb-labs/core-platform';\nimport { usePlatform } from './use-platform.js';\n\n/**\n * Resolve the document database for the current execution.\n *\n * Returns `undefined` when no adapter is configured at all. When a plugin\n * declared permissions but is missing the wiring (NoOp adapter on the\n * platform side) you still get an instance — calls just throw on use.\n *\n * Always check before using:\n *\n * ```ts\n * const docs = useDocumentDatabase();\n * if (!docs) {\n * // The platform was started without a document database;\n * // either skip the feature or fail fast with a clear error.\n * return;\n * }\n * ```\n */\nexport function useDocumentDatabase(): IDocumentDatabase | undefined {\n const platform = usePlatform();\n return platform.documentDatabase;\n}\n\n/**\n * Cheap check for \"is the document database available?\". Returns true even\n * for NoOp adapters configured by the platform — use this to gate optional\n * features, not as a security check.\n */\nexport function isDocumentDatabaseAvailable(): boolean {\n return useDocumentDatabase() !== undefined;\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-kv-store\n *\n * Hook for the per-plugin durable key-value store.\n *\n * Unlike `useCache`, KV is the source of truth — entries persist until\n * explicitly deleted or until their TTL expires. Use it for sessions,\n * distributed locks, idempotency keys, counters — anything where losing\n * the entry is a bug.\n *\n * Keys are namespaced under `<pluginId>:` transparently. Two plugins\n * setting `\"counter\"` do not collide. `scan` only yields the calling\n * plugin's own keys.\n *\n * @example\n * ```typescript\n * import { useKVStore } from '@kb-labs/shared-command-kit';\n *\n * async function withLock<T>(name: string, fn: () => Promise<T>): Promise<T> {\n * const kv = useKVStore();\n * if (!kv) throw new Error('KV store not configured');\n *\n * const token = crypto.randomUUID();\n * const acquired = await kv.setIfNotExists(`lock:${name}`, token, { ttlMs: 30_000 });\n * if (!acquired) throw new Error('lock held');\n *\n * try {\n * return await fn();\n * } finally {\n * // Release only if we still hold the token (cas guards against ttl-takeover).\n * await kv.cas(`lock:${name}`, token, null);\n * }\n * }\n * ```\n */\n\nimport type { IKVStore } from '@kb-labs/core-platform';\nimport { usePlatform } from './use-platform.js';\n\n/**\n * Resolve the KV store for the current execution.\n *\n * Returns `undefined` only when no adapter is wired at all. A plugin\n * that didn't declare `permissions.platform.database.kvStore` still gets\n * an instance — every method throws `PermissionError` on use.\n */\nexport function useKVStore(): IKVStore | undefined {\n const platform = usePlatform();\n return platform.kvStore;\n}\n\n/**\n * Cheap check used to gate optional features. Note that it returns true\n * even when the plugin lacks `permissions.platform.database.kvStore` —\n * the runtime will replace the adapter with a deny stub in that case, so\n * this check tells you \"is the slot wired?\", not \"can I actually use it?\".\n */\nexport function isKVStoreAvailable(): boolean {\n return useKVStore() !== undefined;\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-notifications\n * Platform notifier access helper.\n *\n * @example\n * ```typescript\n * import { useNotifications } from '@kb-labs/shared-command-kit';\n *\n * async handler(ctx, argv, flags) {\n * const notifier = useNotifications();\n * await notifier?.notify({ title: 'Done', body: 'Workflow complete', severity: 'info' });\n * }\n * ```\n */\n\nimport { usePlatform } from './use-platform';\nimport type { INotifier } from '@kb-labs/core-platform';\n\n/**\n * Access the platform notifier adapter.\n * Returns undefined if the notifier adapter is not configured.\n *\n * @example\n * ```typescript\n * const notifier = useNotifications();\n * if (notifier) {\n * await notifier.notify({ title: 'Alert', body: 'Something failed', severity: 'critical' });\n * }\n * ```\n */\nexport function useNotifications(): INotifier | undefined {\n const platform = usePlatform();\n return platform.notifier;\n}\n","/**\n * @module @kb-labs/shared-command-kit/helpers/use-env\n *\n * Sandboxed environment variable access.\n *\n * Reads from runtimeContext (AsyncLocalStorage) when running inside\n * a governed handler execution (worker-pool, subprocess).\n * Falls back to process.env when no runtime context is set\n * (direct CLI, tests, code outside handler).\n *\n * @example\n * ```typescript\n * import { useEnv } from '@kb-labs/sdk';\n *\n * const token = useEnv('NPM_TOKEN');\n * const ci = useEnv('CI');\n * ```\n */\n\nimport { runtimeContext } from '@kb-labs/plugin-contracts';\n\n/**\n * Read an environment variable through the sandboxed runtime context.\n *\n * Inside a governed handler: reads through env-shim (permission-checked).\n * Outside handler context: reads process.env directly (backward compat).\n */\nexport function useEnv(key: string): string | undefined {\n const runtime = runtimeContext.getStore();\n if (runtime?.env) {\n return runtime.env(key);\n }\n return process.env[key];\n}\n","/**\n * @module @kb-labs/shared-command-kit\n * System Command Definition - For KB Labs official commands with full privileges\n */\n\nimport {\n type CommandResult,\n type FlagSchemaDefinition,\n type InferFlags,\n defineFlags,\n validateFlags,\n FlagValidationError,\n} from './index';\nimport type { PluginContextV3 } from '@kb-labs/plugin-contracts';\nimport { formatError } from './errors/index';\n\n/**\n * Flag definition for Command interface\n */\ninterface FlagDefinition {\n name: string;\n type: 'string' | 'boolean' | 'number' | 'array';\n alias?: string;\n description?: string;\n default?: unknown;\n required?: boolean;\n choices?: string[];\n}\n\n/**\n * Command definition for system commands\n */\nexport interface Command {\n name: string;\n describe: string;\n longDescription?: string;\n category?: string;\n aliases?: string[];\n flags?: FlagDefinition[];\n examples?: string[];\n run: (ctx: PluginContextV3, argv: string[], flags: Record<string, unknown>) => Promise<number>;\n}\n\n/**\n * Command group definition\n */\nexport interface CommandGroup {\n name: string;\n describe: string;\n commands: Command[];\n subgroups?: CommandGroup[];\n}\n\n/**\n * Convert flag schema definition to FlagDefinition[] format\n * Used for compatibility with Command interface\n */\nfunction convertFlagSchema(schema: FlagSchemaDefinition): FlagDefinition[] {\n return Object.entries(schema).map(([name, def]) => {\n const result: FlagDefinition = {\n name,\n type: def.type,\n alias: def.alias,\n description: def.description,\n default: def.default,\n required: def.required,\n };\n \n // Add choices if present (for string flags with choices)\n if (def.type === 'string' && 'choices' in def && Array.isArray(def.choices)) {\n result.choices = [...def.choices];\n }\n \n return result;\n });\n}\n\n/**\n * Extended command config for system commands\n *\n * All type parameters are optional - use them when you want type safety, skip them for simplicity.\n *\n * TFlags can be inferred from the flags schema, but can also be explicitly provided\n * for better type inference in complex cases.\n *\n * TResult must extend CommandResult (requires ok: boolean field).\n */\nexport interface SystemCommandConfig<\n TFlags extends FlagSchemaDefinition = FlagSchemaDefinition,\n TResult extends CommandResult = CommandResult,\n TArgv extends readonly string[] = string[]\n> {\n /** Command name (required for system commands) */\n name: string;\n /** Command description (required for system commands) */\n description: string;\n /** Long description for help */\n longDescription?: string;\n /** Category (defaults to 'system') */\n category?: string;\n /** Command aliases */\n aliases?: string[];\n /** Usage examples */\n examples?: string[];\n /** Flag schema definition - TypeScript will infer TFlags from this */\n flags: TFlags;\n /**\n * Analytics configuration (legacy field, kept for backward compatibility)\n * Use ctx.platform.analytics.track() or withAnalytics() helper instead\n */\n analytics?: {\n command?: string;\n startEvent?: string;\n finishEvent?: string;\n actor?: string;\n context?: Record<string, unknown>;\n includeFlags?: boolean;\n };\n /** Command handler - receives PluginContextV3 and must return TResult */\n handler: (ctx: PluginContextV3, argv: TArgv, flags: InferFlags<TFlags>) => Promise<number | TResult> | number | TResult;\n /** Optional formatter - receives TResult with inferred flags */\n formatter?: (result: TResult, ctx: PluginContextV3, flags: InferFlags<TFlags>, argv?: TArgv) => void;\n}\n\n/**\n * Define a system command with full privileges\n * \n * System commands are KB Labs official commands that run with full system access,\n * bypassing sandbox restrictions. They are architecturally separated from plugin\n * commands - plugins can NEVER gain system privileges.\n * \n * TResult is REQUIRED - every command must explicitly declare its result contract.\n * This ensures type safety and enables future contract validation.\n * \n * @example\n * ```typescript\n * import { defineSystemCommand, type CommandResult, type FlagSchemaDefinition } from '@kb-labs/shared-command-kit';\n *\n * // Simple command with automatic flag type inference (RECOMMENDED)\n * export const helloCommand = defineSystemCommand<CommandResult & { message: string }>({\n * name: 'hello',\n * description: 'Print a friendly greeting',\n * category: 'system',\n * flags: {\n * name: { type: 'string', description: 'Name to greet' },\n * json: { type: 'boolean', default: false },\n * } satisfies FlagSchemaDefinition, // Preserves literal types for type inference\n * async handler(ctx, argv, flags) {\n * // ctx is EnhancedCliContext (extends PluginContextV3)\n * // ctx.cwd - working directory (V2 promoted field)\n * // ctx.ui - UI output API with new convenience methods\n * // flags.name is inferred as string | undefined\n * const message = `Hello, ${flags.name || 'World'}!`;\n *\n * // UI output (CLI only, no-op in REST/Workflow)\n * if (!flags.json) {\n * if (ctx.ui?.success) {\n * ctx.ui.success('Greeting', [\n * { items: [message] },\n * ]);\n * }\n * } else {\n * ctx.ui?.json({ message });\n * }\n *\n * return { ok: true, message };\n * },\n * });\n * \n * // Command with explicit result type and automatic flag inference\n * type WorkflowListResult = CommandResult & {\n * workflows: Array<{ id: string }>;\n * total: number;\n * };\n *\n * export const wfList = defineSystemCommand<WorkflowListResult>({\n * name: 'list',\n * description: 'List workflows',\n * flags: {\n * source: { type: 'string', default: 'all' },\n * tag: { type: 'string' },\n * json: { type: 'boolean', default: false },\n * } satisfies FlagSchemaDefinition, // TypeScript infers flag types automatically\n * async handler(ctx, argv, flags) {\n * // flags.source is inferred as string\n * // flags.tag is inferred as string | undefined\n * // flags.json is inferred as boolean\n * const workflows = await listWorkflows(flags.source, flags.tag);\n *\n * // UI output (new convenience methods)\n * if (!flags.json) {\n * if (ctx.ui?.success) {\n * ctx.ui.success('Workflows', [\n * { header: 'Summary', items: [`Total: ${workflows.length}`, `Source: ${flags.source}`] },\n * { items: workflows.map(w => `• ${w.id}`) },\n * ]);\n * }\n * } else {\n * ctx.ui?.json({ workflows, total: workflows.length });\n * }\n *\n * return { ok: true, workflows, total: workflows.length };\n * },\n * });\n * \n * // Command with explicit flag types (for complex cases)\n * export const wfRun = defineSystemCommand<\n * { 'workflow-id': { type: 'string'; required: true } },\n * CommandResult & { run: WorkflowRun }\n * >({\n * name: 'run',\n * description: 'Execute a workflow',\n * flags: {\n * 'workflow-id': { type: 'string', required: true },\n * },\n * async handler(ctx, argv, flags) {\n * // flags['workflow-id'] is inferred as string (required)\n *\n * // Progress tracking (CLI only, no-op in REST/Workflow)\n * ctx.ui?.startProgress('running', 'Starting workflow...');\n * const run = await executeWorkflow(flags['workflow-id']);\n * ctx.ui?.completeProgress('running', 'Workflow started!');\n *\n * return { ok: true, run };\n * },\n * });\n *\n * // Note: System commands support all UI convenience methods:\n * // - ctx.ui.success() / showError() / warning() / info() - Result display with sideBox\n * // - ctx.ui.startProgress() / completeProgress() / failProgress() - Progress tracking\n * // - ctx.ui.table() / keyValue() / list() - Low-level formatting\n * // All UI methods are CLI-only and no-op in REST/Workflow contexts\n * ```\n */\n// Overload for explicit TFlags and TResult\nexport function defineSystemCommand<\n TFlags extends FlagSchemaDefinition,\n TResult extends CommandResult = CommandResult,\n TArgv extends readonly string[] = string[]\n>(\n config: SystemCommandConfig<TFlags, TResult, TArgv>\n): Command;\n// Implementation - all parameters optional with defaults\nexport function defineSystemCommand<\n TFlags extends FlagSchemaDefinition = FlagSchemaDefinition,\n TResult extends CommandResult = CommandResult,\n TArgv extends readonly string[] = string[]\n>(\n config: SystemCommandConfig<TFlags, TResult, TArgv>\n): Command {\n const { name, description, longDescription, category, aliases, examples, flags, handler, formatter } = config;\n\n // Return command with direct handler (no wrapping needed - system commands don't use V3 defineCommand)\n return {\n name,\n describe: description,\n longDescription,\n category: category || 'system',\n aliases: aliases || [],\n flags: flags ? convertFlagSchema(flags) : [],\n examples: examples || [],\n run: async (ctx: PluginContextV3, argv: string[], rawFlags: Record<string, unknown>) => {\n const jsonMode = Boolean(rawFlags.json);\n\n // Log command start\n ctx.platform?.logger?.info?.(`Command ${name} started`);\n\n // Validate flags only if schema is defined\n let validatedFlags: InferFlags<TFlags>;\n\n if (flags) {\n const flagSchema = defineFlags(flags);\n try {\n validatedFlags = await validateFlags(rawFlags, flagSchema) as InferFlags<TFlags>;\n } catch (error) {\n // Enhance validation error with command name\n if (error instanceof FlagValidationError && name && !error.commandName) {\n (error as { commandName?: string }).commandName = name;\n }\n\n // Show stack trace only in debug mode\n const showStack = Boolean(rawFlags.debug);\n const formatted = formatError(error, { showStack, jsonMode });\n\n if (jsonMode) {\n ctx.ui?.json(formatted.json);\n } else {\n ctx.ui?.error(formatted.message);\n }\n\n // Return specific exit code for validation errors\n return 3; // EXIT_CODES.INVALID_FLAGS\n }\n } else {\n // No schema defined - pass raw flags as-is\n validatedFlags = rawFlags as InferFlags<TFlags>;\n }\n\n // Call handler with error handling\n let result: number | TResult;\n try {\n result = await handler(ctx, argv as unknown as TArgv, validatedFlags);\n } catch (error) {\n // Log error to platform logger\n const errorMessage = error instanceof Error ? error.message : String(error);\n ctx.platform?.logger?.error?.(`Command ${name} failed: ${errorMessage}`);\n\n // Display error to user\n if (jsonMode) {\n ctx.ui?.json({ ok: false, error: errorMessage });\n } else {\n ctx.ui?.error(errorMessage);\n }\n\n // Return error exit code\n return 1;\n }\n\n // Call formatter if provided and result is not a number\n if (formatter && typeof result !== 'number') {\n formatter(result as TResult, ctx, validatedFlags, argv as unknown as TArgv);\n }\n\n // Log command completion\n ctx.platform?.logger?.info?.(`Command ${name} completed`);\n\n // Convert result to exit code\n if (typeof result === 'number') {\n return result;\n }\n return result.ok ? 0 : 1;\n },\n };\n}\n\n/**\n * Create a system command group\n * \n * Groups organize related system commands for better help organization\n * and registration.\n * \n * @example\n * ```typescript\n * export const systemInfoGroup = defineSystemCommandGroup(\n * 'system:info',\n * 'System information commands',\n * [helloCommand, versionCommand, healthCommand]\n * );\n * ```\n */\nexport function defineSystemCommandGroup(\n name: string,\n describe: string,\n commands: Command[]\n): CommandGroup {\n return {\n name,\n describe,\n commands,\n };\n}\n","/**\n * Manifest definition helpers\n * @module @kb-labs/shared-command-kit/manifest\n */\n\nimport type { ManifestV3 } from '@kb-labs/plugin-contracts';\n\n/**\n * Define a ManifestV3 with type safety\n *\n * This is a type-safe wrapper for creating ManifestV3 objects.\n * It provides compile-time validation via TypeScript and optional\n * runtime validation via Zod (if enabled).\n *\n * For built plugins (dist/), this function is compiled away and only\n * the plain object remains, avoiding runtime dependencies.\n *\n * @example\n * ```typescript\n * // Basic usage\n * export const manifest = defineManifest({\n * schema: 'kb.plugin/2',\n * id: '@kb-labs/my-plugin',\n * version: '1.0.0',\n * cli: {\n * commands: [...]\n * }\n * });\n *\n * // With contracts typing (Level 2)\n * import type { PluginContracts } from '@kb-labs/my-plugin-contracts';\n *\n * export const manifest = defineManifest<typeof pluginContractsManifest>({\n * schema: 'kb.plugin/2',\n * id: '@kb-labs/my-plugin',\n * artifacts: [\n * { id: 'my.artifact.id' } // ✅ Type-checked against contracts\n * ],\n * cli: {\n * commands: [{\n * id: 'my:command', // ✅ Type-checked against contracts\n * // ...\n * }]\n * }\n * });\n * ```\n *\n * @param manifest - Manifest configuration\n * @returns ManifestV3 object\n */\nexport function defineManifest<TContracts = unknown>(\n manifest: ManifestV3\n): ManifestV3 {\n // In development, you could add runtime validation here if needed:\n // if (process.env.NODE_ENV === 'development') {\n // validateManifestV3(manifest);\n // }\n\n // For production builds, this is just an identity function\n // that provides type safety at compile time\n return manifest;\n}\n\n/**\n * Flag schema definition (compatible with defineFlags)\n */\ntype FlagSchemaDefinition = Record<\n string,\n {\n type: 'string' | 'boolean' | 'number' | 'array';\n alias?: string;\n default?: unknown;\n description?: string;\n choices?: string[];\n required?: boolean;\n }\n>;\n\n/**\n * Convert flag schema definition to CliFlagDecl[] for manifest\n *\n * This helper converts the flag schema format used in defineCommand\n * to the array format expected in ManifestV3.\n *\n * @example\n * ```typescript\n * const helloFlags = {\n * name: { type: 'string', description: 'Name to greet', alias: 'n' },\n * json: { type: 'boolean', description: 'Emit JSON', default: false }\n * };\n *\n * const manifestFlags = defineCommandFlags(helloFlags);\n * // Use in manifest: flags: manifestFlags\n *\n * // In manifest.v2.ts:\n * export const manifest = defineManifest({\n * cli: {\n * commands: [{\n * id: 'hello',\n * flags: defineCommandFlags(helloFlags),\n * // ...\n * }]\n * }\n * });\n * ```\n */\nexport function defineCommandFlags<TFlags extends FlagSchemaDefinition>(\n flags: TFlags\n): Array<{\n name: string;\n type: 'string' | 'boolean' | 'number' | 'array';\n alias?: string;\n default?: unknown;\n description?: string;\n choices?: string[];\n required?: boolean;\n}> {\n return Object.entries(flags).map(([name, flag]) => ({\n name,\n type: flag.type,\n ...(flag.alias !== undefined && { alias: flag.alias }),\n ...(flag.default !== undefined && { default: flag.default }),\n ...(flag.description !== undefined && { description: flag.description }),\n ...(flag.choices !== undefined && { choices: flag.choices }),\n ...(flag.required !== undefined && { required: flag.required }),\n }));\n}\n","/**\n * Manifest helpers — optional, additive utilities for reducing boilerplate.\n *\n * Manifests can always be written as plain TypeScript literal objects.\n * These helpers exist purely to cut repetition in the CLI commands and REST\n * routes sections, which are the two highest-density areas.\n *\n * Inspired by:\n * - Commander.js → cmd() fluent builder for CLI commands\n * - Hono → GET/POST/... standalone functions for HTTP routes\n * - Vite → createManifest() thin wrapper for type safety\n */\n\nimport type {\n ManifestV3,\n CliCommandDecl,\n CliGroupMeta,\n RestRouteDecl,\n WebhookHandlerDecl,\n WebhookAuthConfig,\n PermissionSpec,\n} from '@kb-labs/plugin-contracts';\nimport { defineCommandFlags } from './manifest.js';\n\n// ─── Branded types ────────────────────────────────────────────────────────────\n\n/** Plugin identifier: must follow `@scope/name` format */\nexport type PluginId = `@${string}/${string}`;\n\n/** Semver string: `major.minor.patch[suffix]` */\nexport type SemVer = `${number}.${number}.${number}${string}`;\n\n/**\n * Handler file reference.\n * Must start with `./` and end with `.js` (optionally with `#exportName`).\n * @example './commands/health.js'\n * @example './commands/health.js#default'\n */\nexport type HandlerRef =\n | `./${string}.js`\n | `./${string}.js#${string}`;\n\n/** Base path for REST routes under the gateway. */\nexport type RestBase = `/v1/plugins/${string}`;\n\n/** Base path for WebSocket channels. */\nexport type WsBase = `/v1/ws/plugins/${string}`;\n\n// ─── Flag schema (narrow subset that defineCommandFlags accepts) ───────────────\n\ntype ManifestFlagDef = Record<\n string,\n {\n type: 'string' | 'boolean' | 'number' | 'array';\n alias?: string;\n default?: unknown;\n description?: string;\n choices?: string[];\n required?: boolean;\n }\n>;\n\n// ─── CLI helpers ──────────────────────────────────────────────────────────────\n\n/** Internal mutable state for CmdBuilder */\ninterface CmdState {\n path: string;\n handler: string;\n describe: string;\n operationType?: CliCommandDecl['operationType'];\n longDescription?: string;\n flags?: CliCommandDecl['flags'];\n examples?: string[];\n category?: string;\n aliases?: string[];\n permissions?: PermissionSpec;\n}\n\n/**\n * Fluent builder for a single CLI command declaration.\n *\n * Constructed via `cmd()` — not instantiated directly.\n *\n * @example\n * ```ts\n * cmd('workflow health', './commands/health.js#default', 'Check daemon health.')\n * .read()\n * .flags(healthFlags)\n * .examples(['kb workflow health', 'kb workflow health --json'])\n * ```\n */\nexport class CmdBuilder {\n private readonly _state: CmdState;\n\n constructor(path: string, handler: string, describe: string) {\n this._state = { path, handler, describe };\n }\n\n /** operationType: 'read' — auto-injects --output, --limit, --offset */\n read(): this {\n this._state.operationType = 'read';\n return this;\n }\n\n /** operationType: 'mutate' — auto-injects --output, --dry-run, --yes */\n mutate(): this {\n this._state.operationType = 'mutate';\n return this;\n }\n\n /** operationType: 'execute' — auto-injects --output, --wait, --watch, --timeout, --yes */\n execute(): this {\n this._state.operationType = 'execute';\n return this;\n }\n\n /** operationType: 'analyze' — auto-injects --output, --format, --stream */\n analyze(): this {\n this._state.operationType = 'analyze';\n return this;\n }\n\n /**\n * Define command flags.\n * Calls `defineCommandFlags()` internally — no need to wrap manually.\n */\n flags(def: ManifestFlagDef): this {\n this._state.flags = defineCommandFlags(def);\n return this;\n }\n\n /** Long description shown in `--help` output. */\n long(text: string): this {\n this._state.longDescription = text;\n return this;\n }\n\n /** Usage examples shown in `--help` output. */\n examples(list: string[]): this {\n this._state.examples = list;\n return this;\n }\n\n /**\n * Display category label.\n * When using `group()`, the group's `category` is applied to commands\n * that don't have their own category set.\n */\n category(cat: string): this {\n this._state.category = cat;\n return this;\n }\n\n /** Alternative full paths for this command. */\n aliases(list: string[]): this {\n this._state.aliases = list;\n return this;\n }\n\n /** Command-specific permissions (override plugin defaults). */\n perms(spec: PermissionSpec): this {\n this._state.permissions = spec;\n return this;\n }\n\n /** Build the final `CliCommandDecl`. */\n build(): CliCommandDecl {\n const decl: CliCommandDecl = {\n path: this._state.path,\n handler: this._state.handler,\n describe: this._state.describe,\n };\n if (this._state.operationType !== undefined) { decl.operationType = this._state.operationType; }\n if (this._state.longDescription !== undefined) { decl.longDescription = this._state.longDescription; }\n if (this._state.flags !== undefined) { decl.flags = this._state.flags; }\n if (this._state.examples !== undefined) { decl.examples = this._state.examples; }\n if (this._state.category !== undefined) { decl.category = this._state.category; }\n if (this._state.aliases !== undefined) { decl.aliases = this._state.aliases; }\n if (this._state.permissions !== undefined) { decl.permissions = this._state.permissions; }\n return decl;\n }\n}\n\n/**\n * Create a CLI command builder.\n *\n * Three required positional args cover the most repetitive fields.\n * Everything else is chained: `.read()`, `.flags(def)`, `.examples([...])`.\n *\n * Eliminates:\n * - `operationType: 'read' as const` → `.read()`\n * - `flags: defineCommandFlags(def)` → `.flags(def)`\n * - repeated `category: 'X'` → set once in `group()`\n *\n * @example\n * ```ts\n * cmd('workflow health', './commands/health.js#default', 'Check daemon health.')\n * .read()\n * .flags(healthFlags)\n * .examples(['kb workflow health'])\n * ```\n */\nexport function cmd(\n path: string,\n handler: HandlerRef,\n describe: string,\n): CmdBuilder {\n return new CmdBuilder(path, handler, describe);\n}\n\n// ─── Group helpers ────────────────────────────────────────────────────────────\n\n/** Result of `group()` — passed to `mergeCliGroups()` or spread manually. */\nexport interface CliGroup {\n meta: CliGroupMeta;\n commands: CliCommandDecl[];\n}\n\n/**\n * Group a set of commands under a shared `groupMeta` entry.\n *\n * If `meta.category` is provided, it is applied to every command inside\n * that does not already have its own category set.\n *\n * @example\n * ```ts\n * const runsGroup = group(\n * { path: 'workflow runs', describe: 'Run management', category: 'Runs' },\n * [\n * cmd('workflow runs list', './commands/runs-list.js#default', 'List runs.').read().flags(runsListFlags),\n * cmd('workflow runs view', './commands/runs-view.js#default', 'View run details.').read().flags(runsViewFlags),\n * ]\n * );\n * ```\n */\nexport function group(\n meta: { path: string; describe: string; category?: string },\n cmds: Array<CmdBuilder | CliCommandDecl>,\n): CliGroup {\n const commands = cmds.map((c) => {\n const decl = c instanceof CmdBuilder ? c.build() : c;\n if (meta.category !== undefined && decl.category === undefined) {\n return { ...decl, category: meta.category };\n }\n return decl;\n });\n return {\n meta: { path: meta.path, describe: meta.describe },\n commands,\n };\n}\n\n/**\n * Merge multiple `CliGroup` results into a single `cli` section object.\n *\n * @example\n * ```ts\n * cli: mergeCliGroups(daemonGroup, jobsGroup, runsGroup),\n * // → { commands: [...all commands], groupMeta: [...all group metas] }\n * ```\n */\nexport function mergeCliGroups(\n ...groups: CliGroup[]\n): Required<ManifestV3>['cli'] {\n return {\n commands: groups.flatMap((g) => g.commands),\n groupMeta: groups.map((g) => g.meta),\n };\n}\n\n// ─── HTTP route helpers ───────────────────────────────────────────────────────\n\ntype RouteOpts = Omit<RestRouteDecl, 'method' | 'path' | 'handler'>;\n\nfunction routeHelper(\n method: RestRouteDecl['method'],\n path: string,\n handler: HandlerRef,\n opts?: RouteOpts,\n): RestRouteDecl {\n return { method, path, handler, ...opts };\n}\n\n/**\n * Declare a GET route.\n * @example GET(ROUTES.STATS, './rest/stats.js#default', { describe: 'Get stats' })\n */\nexport const GET = (path: string, handler: HandlerRef, opts?: RouteOpts): RestRouteDecl =>\n routeHelper('GET', path, handler, opts);\n\n/**\n * Declare a POST route.\n * @example POST(ROUTES.RUN, './rest/run.js#default', { describe: 'Run workflow' })\n */\nexport const POST = (path: string, handler: HandlerRef, opts?: RouteOpts): RestRouteDecl =>\n routeHelper('POST', path, handler, opts);\n\n/**\n * Declare a PUT route.\n */\nexport const PUT = (path: string, handler: HandlerRef, opts?: RouteOpts): RestRouteDecl =>\n routeHelper('PUT', path, handler, opts);\n\n/**\n * Declare a PATCH route.\n */\nexport const PATCH = (path: string, handler: HandlerRef, opts?: RouteOpts): RestRouteDecl =>\n routeHelper('PATCH', path, handler, opts);\n\n/**\n * Declare a DELETE route.\n */\nexport const DELETE = (path: string, handler: HandlerRef, opts?: RouteOpts): RestRouteDecl =>\n routeHelper('DELETE', path, handler, opts);\n\n// ─── Webhook handler helpers ──────────────────────────────────────────────────\n\ntype WebhookOpts = Omit<WebhookHandlerDecl, 'event' | 'handler'>;\n\n/**\n * Declare a webhook handler in the plugin manifest.\n *\n * `auth` is required at the call site — the gateway will refuse to start if\n * any webhook handler has no auth config.\n *\n * @example\n * ```ts\n * webhook('alert', './webhooks/alert.js#default', {\n * auth: { type: 'secret', header: 'X-Webhook-Secret' },\n * async: true,\n * })\n * ```\n */\nexport function webhook(\n event: string,\n handler: HandlerRef,\n opts: WebhookOpts & { auth: WebhookAuthConfig },\n): WebhookHandlerDecl {\n return { event, handler, ...opts };\n}\n\n// ─── Manifest entry point ─────────────────────────────────────────────────────\n\n/**\n * Create a type-safe `ManifestV3`.\n *\n * Provides branded-type validation for `id` and `version`, and\n * automatically injects `schema: 'kb.plugin/3'`.\n * Everything else is a plain literal object — no fluent chain.\n *\n * Writing manifests as plain object literals without this wrapper\n * is always valid.\n *\n * @example\n * ```ts\n * export const manifest = createManifest('@kb-labs/workflow', '1.0.0', {\n * display: { name: 'Workflow CLI' },\n * cli: mergeCliGroups(daemonGroup, runsGroup),\n * rest: {\n * basePath: WORKFLOW_BASE_PATH,\n * routes: [\n * GET(ROUTES.STATS, './rest/stats.js#default', { describe: 'Dashboard stats' }),\n * ],\n * },\n * permissions: pluginPermissions,\n * });\n * ```\n */\nexport function createManifest(\n id: PluginId,\n version: SemVer,\n body: Omit<ManifestV3, 'id' | 'version' | 'schema'>,\n): ManifestV3 {\n return {\n schema: 'kb.plugin/3',\n id,\n version,\n ...body,\n };\n}\n","/**\n * Schema Builders for KB Labs Plugins\n *\n * Optional helpers for common Zod validation patterns.\n * You can always use plain Zod - these are just conveniences for repetitive patterns.\n *\n * @example\n * ```typescript\n * import { schema } from '@kb-labs/shared-command-kit';\n *\n * const RequestSchema = schema.object({\n * cwd: schema.cwd(),\n * scope: schema.scopeId(),\n * text: schema.text({ min: 1, max: 10000 }),\n * mode: schema.enum(['instant', 'auto', 'thinking'], { default: 'auto' }),\n * limit: schema.positiveInt({ max: 100, default: 10 }),\n * });\n * ```\n */\n\nimport { z } from 'zod';\n\n/**\n * Current working directory path (optional string)\n * Commonly used in CLI and REST handlers\n *\n * @example\n * ```typescript\n * const schema = z.object({\n * cwd: schema.cwd(),\n * });\n * // Equivalent to: cwd: z.string().optional()\n * ```\n */\nexport function cwd() {\n return z.string().optional().describe('Current working directory path');\n}\n\n/**\n * Scope identifier (required non-empty string)\n * Used for Mind RAG scopes, workflow scopes, etc.\n *\n * @example\n * ```typescript\n * const schema = z.object({\n * scope: schema.scopeId(),\n * });\n * // Equivalent to: scope: z.string().min(1)\n * ```\n */\nexport function scopeId() {\n return z.string().min(1).describe('Scope identifier');\n}\n\n/**\n * Text string with optional length constraints\n *\n * @example\n * ```typescript\n * schema.text({ min: 1, max: 10000 })\n * // Equivalent to: z.string().min(1).max(10000)\n * ```\n */\nexport function text(options?: { min?: number; max?: number; default?: string }): z.ZodString | z.ZodDefault<z.ZodString> {\n let schema = z.string();\n\n if (options?.min !== undefined) {\n schema = schema.min(options.min);\n }\n\n if (options?.max !== undefined) {\n schema = schema.max(options.max);\n }\n\n if (options?.default !== undefined) {\n return schema.default(options.default).describe('Text string');\n }\n\n return schema.describe('Text string');\n}\n\n/**\n * Positive integer with optional constraints\n *\n * @example\n * ```typescript\n * schema.positiveInt({ max: 100, default: 10 })\n * // Equivalent to: z.number().int().positive().max(100).default(10)\n * ```\n */\nexport function positiveInt(options?: { min?: number; max?: number; default?: number }): z.ZodNumber | z.ZodDefault<z.ZodNumber> {\n let schema = z.number().int().positive();\n\n if (options?.min !== undefined) {\n schema = schema.min(options.min);\n }\n\n if (options?.max !== undefined) {\n schema = schema.max(options.max);\n }\n\n if (options?.default !== undefined) {\n return schema.default(options.default).describe('Positive integer');\n }\n\n return schema.describe('Positive integer');\n}\n\n/**\n * Non-negative integer (0 or positive)\n *\n * @example\n * ```typescript\n * schema.nonNegativeInt({ max: 100 })\n * // Equivalent to: z.number().int().min(0).max(100)\n * ```\n */\nexport function nonNegativeInt(options?: { max?: number; default?: number }): z.ZodNumber | z.ZodDefault<z.ZodNumber> {\n let schema = z.number().int().min(0);\n\n if (options?.max !== undefined) {\n schema = schema.max(options.max);\n }\n\n if (options?.default !== undefined) {\n return schema.default(options.default).describe('Non-negative integer');\n }\n\n return schema.describe('Non-negative integer');\n}\n\n/**\n * Enum with optional default value\n *\n * @example\n * ```typescript\n * schema.enum(['instant', 'auto', 'thinking'], { default: 'auto' })\n * // Equivalent to: z.enum(['instant', 'auto', 'thinking']).default('auto')\n * ```\n */\nexport function enumSchema<T extends [string, ...string[]]>(\n values: T,\n options?: { default?: T[number] }\n): z.ZodDefault<z.ZodEnum<T>> | z.ZodEnum<T> {\n const schema = z.enum(values);\n\n if (options?.default !== undefined) {\n return schema.default(options.default as T[number]);\n }\n\n return schema;\n}\n\n/**\n * Plugin ID (@kb-labs/package-name format)\n *\n * @example\n * ```typescript\n * schema.pluginId()\n * // Matches: @kb-labs/mind, @kb-labs/workflow, etc.\n * ```\n */\nexport function pluginId() {\n return z\n .string()\n .regex(/^@kb-labs\\/[a-z][a-z0-9-]*$/, 'Must be in format @kb-labs/package-name')\n .describe('Plugin ID');\n}\n\n/**\n * Command ID (plugin:command format)\n *\n * @example\n * ```typescript\n * schema.commandId()\n * // Matches: mind:query, workflow:run, etc.\n * ```\n */\nexport function commandId() {\n return z\n .string()\n .regex(/^[a-z][a-z0-9-]*:[a-z][a-z0-9-]*$/, 'Must be in format plugin:command')\n .describe('Command ID');\n}\n\n/**\n * Artifact ID (plugin.artifact.id format)\n *\n * @example\n * ```typescript\n * schema.artifactId()\n * // Matches: mind.index.vector, workflow.run.result, etc.\n * ```\n */\nexport function artifactId() {\n return z\n .string()\n .regex(/^[a-z][a-z0-9-]*\\.[a-z][a-z0-9-]*(\\.[a-z][a-z0-9-]*)*$/, 'Must be in format plugin.artifact.id')\n .describe('Artifact ID');\n}\n\n/**\n * File path (string)\n * Optional with default to undefined\n *\n * @example\n * ```typescript\n * schema.filePath()\n * // Equivalent to: z.string()\n * ```\n */\nexport function filePath(options?: { optional?: boolean }) {\n const schema = z.string().describe('File path');\n\n if (options?.optional) {\n return schema.optional();\n }\n\n return schema;\n}\n\n/**\n * URL string\n *\n * @example\n * ```typescript\n * schema.url()\n * // Equivalent to: z.string().url()\n * ```\n */\nexport function url(options?: { optional?: boolean }) {\n const schema = z.string().url().describe('URL');\n\n if (options?.optional) {\n return schema.optional();\n }\n\n return schema;\n}\n\n/**\n * Email string\n *\n * @example\n * ```typescript\n * schema.email()\n * // Equivalent to: z.string().email()\n * ```\n */\nexport function email(options?: { optional?: boolean }) {\n const schema = z.string().email().describe('Email address');\n\n if (options?.optional) {\n return schema.optional();\n }\n\n return schema;\n}\n\n/**\n * UUID string\n *\n * @example\n * ```typescript\n * schema.uuid()\n * // Equivalent to: z.string().uuid()\n * ```\n */\nexport function uuid(options?: { optional?: boolean }) {\n const schema = z.string().uuid().describe('UUID');\n\n if (options?.optional) {\n return schema.optional();\n }\n\n return schema;\n}\n\n/**\n * ISO datetime string\n *\n * @example\n * ```typescript\n * schema.datetime()\n * // Equivalent to: z.string().datetime()\n * ```\n */\nexport function datetime(options?: { optional?: boolean }) {\n const schema = z.string().datetime().describe('ISO datetime');\n\n if (options?.optional) {\n return schema.optional();\n }\n\n return schema;\n}\n\n/**\n * JSON object (any valid JSON object)\n *\n * @example\n * ```typescript\n * schema.json()\n * // Equivalent to: z.record(z.unknown())\n * ```\n */\nexport function json() {\n return z.record(z.unknown()).describe('JSON object');\n}\n\n/**\n * Boolean with optional default\n *\n * @example\n * ```typescript\n * schema.boolean({ default: false })\n * // Equivalent to: z.boolean().default(false)\n * ```\n */\nexport function boolean(options?: { default?: boolean }) {\n const schema = z.boolean();\n\n if (options?.default !== undefined) {\n return schema.default(options.default);\n }\n\n return schema;\n}\n\n/**\n * Array of items with optional length constraints\n *\n * @example\n * ```typescript\n * schema.array(z.string(), { min: 1, max: 10 })\n * // Equivalent to: z.array(z.string()).min(1).max(10)\n * ```\n */\nexport function array<T extends z.ZodTypeAny>(\n itemSchema: T,\n options?: { min?: number; max?: number }\n) {\n let schema = z.array(itemSchema);\n\n if (options?.min !== undefined) {\n schema = schema.min(options.min);\n }\n\n if (options?.max !== undefined) {\n schema = schema.max(options.max);\n }\n\n return schema;\n}\n\n/**\n * Object schema builder (alias for z.object)\n *\n * @example\n * ```typescript\n * schema.object({ name: z.string() })\n * // Equivalent to: z.object({ name: z.string() })\n * ```\n */\nexport function object<T extends z.ZodRawShape>(shape: T) {\n return z.object(shape);\n}\n\n/**\n * Export schema builders namespace\n *\n * @example\n * ```typescript\n * import { schema } from '@kb-labs/shared-command-kit';\n *\n * const MySchema = schema.object({\n * cwd: schema.cwd(),\n * scope: schema.scopeId(),\n * text: schema.text({ min: 1, max: 10000 }),\n * });\n * ```\n */\nexport const schema = {\n // Path and ID builders\n cwd,\n scopeId,\n pluginId,\n commandId,\n artifactId,\n filePath,\n\n // String builders\n text,\n url,\n email,\n uuid,\n datetime,\n\n // Number builders\n positiveInt,\n nonNegativeInt,\n\n // Other builders\n enum: enumSchema,\n boolean,\n json,\n array,\n object,\n};\n","/**\n * REST Handler Definition (V3)\n *\n * Define REST handlers compatible with plugin-runtime's runInProcess().\n * Returns { execute } object with (ctx, input) signature.\n *\n * @example\n * ```typescript\n * import { defineHandler } from '@kb-labs/shared-command-kit';\n *\n * export default defineHandler({\n * async execute(ctx, input: { scope?: string }) {\n * const plan = await loadPlan(ctx.cwd);\n * return plan;\n * }\n * });\n * ```\n */\n\nimport type { PluginContextV3 } from '@kb-labs/plugin-contracts';\n\n/**\n * REST input structure from route-mounter.\n * Query params, body, and route params are separated to avoid conflicts.\n */\nexport interface RestInput<TQuery = unknown, TBody = unknown, TParams = unknown> {\n query?: TQuery;\n body?: TBody;\n params?: TParams;\n}\n\n/**\n * Handler interface expected by runInProcess().\n */\nexport interface Handler<TConfig = unknown, TInput = unknown, TOutput = unknown> {\n /**\n * Execute the handler\n */\n execute(\n ctx: PluginContextV3<TConfig>,\n input: TInput\n ): Promise<TOutput>;\n}\n\n/**\n * Handler definition options.\n * Extensible for future features (inputSchema, middleware, etc.)\n */\nexport interface HandlerDefinition<TConfig = unknown, TInput = unknown, TOutput = unknown> {\n /**\n * Execute the handler.\n * Returns data directly - no need for exitCode/CommandResult wrapper.\n *\n * @param ctx - Plugin context with runtime APIs (fs, fetch, env, ui, etc.)\n * @param input - Request input (body for POST, query for GET, etc.)\n * @returns Response data (will be serialized as JSON)\n * @throws Error on failure (will be converted to HTTP 500)\n */\n execute(\n ctx: PluginContextV3<TConfig>,\n input: TInput\n ): Promise<TOutput>;\n\n // Future options (non-breaking additions):\n // inputSchema?: ZodType<TInput>;\n // outputSchema?: ZodType<TOutput>;\n // middleware?: Middleware[];\n // timeout?: number;\n}\n\n/**\n * Define a REST handler\n *\n * Creates a handler object compatible with runInProcess() from plugin-runtime.\n * The handler receives full PluginContextV3 with runtime APIs.\n *\n * @example\n * ```typescript\n * // Simple handler\n * export default defineHandler({\n * async execute(ctx, input: { scope?: string }) {\n * const plan = await loadPlan(ctx.cwd);\n * return plan;\n * }\n * });\n *\n * // With typed query parameters using RestInput\n * import { defineHandler, type RestInput } from '@kb-labs/sdk';\n *\n * export default defineHandler({\n * async execute(ctx, input: RestInput<{ workspace?: string }>) {\n * const workspace = input.query?.workspace || 'root';\n * return { workspace };\n * }\n * });\n *\n * // With typed query and body\n * interface QueryParams {\n * workspace?: string;\n * }\n *\n * interface BodyParams {\n * name: string;\n * description?: string;\n * }\n *\n * export default defineHandler({\n * async execute(ctx, input: RestInput<QueryParams, BodyParams>) {\n * const workspace = input.query?.workspace || 'root';\n * const name = input.body?.name;\n * return { workspace, name };\n * }\n * });\n *\n * // With typed generics\n * interface GetPlanInput {\n * scope?: string;\n * includeHistory?: boolean;\n * }\n *\n * interface ReleasePlan {\n * version: string;\n * packages: string[];\n * }\n *\n * export default defineHandler<unknown, GetPlanInput, ReleasePlan>({\n * async execute(ctx, input) {\n * // ctx: PluginContextV3 with runtime.fs, ui, etc.\n * // input: GetPlanInput (typed)\n * // return: ReleasePlan (typed)\n * return await loadPlan(ctx.cwd, input.scope);\n * }\n * });\n *\n * // Using runtime APIs\n * export default defineHandler({\n * async execute(ctx, input: { path: string }) {\n * // File system access\n * const content = await ctx.runtime.fs.readFile(input.path, 'utf-8');\n *\n * // Environment variables\n * const apiKey = ctx.runtime.env('API_KEY');\n *\n * // Logging\n * ctx.runtime.log('info', 'Processing file', { path: input.path });\n *\n * return { content, hasApiKey: !!apiKey };\n * }\n * });\n * ```\n */\nexport function defineHandler<TConfig = unknown, TInput = unknown, TOutput = unknown>(\n definition: HandlerDefinition<TConfig, TInput, TOutput>\n): Handler<TConfig, TInput, TOutput> {\n // Return handler object compatible with runInProcess()\n // Currently passes through, but this wrapper enables:\n // - Future input validation via inputSchema\n // - Future output validation via outputSchema\n // - Middleware execution\n // - Logging/tracing hooks\n // - Error normalization\n return {\n execute: async (ctx, input) => {\n // Future: validate input against schema\n // if (definition.inputSchema) {\n // input = definition.inputSchema.parse(input);\n // }\n\n // Future: run pre-middleware\n // for (const mw of definition.middleware ?? []) {\n // await mw.before?.(ctx, input);\n // }\n\n // Future: validate output against schema\n // if (definition.outputSchema) {\n // definition.outputSchema.parse(result);\n // }\n\n // Future: run post-middleware\n // for (const mw of definition.middleware ?? []) {\n // await mw.after?.(ctx, input, result);\n // }\n\n return definition.execute(ctx, input);\n },\n };\n}\n","/**\n * Lifecycle Hook Helpers\n *\n * Optional helpers for plugin lifecycle hooks (setup, destroy, upgrade).\n * You can always use plain functions - this is just convenience.\n *\n * @example\n * ```typescript\n * import { defineSetupHandler } from '@kb-labs/shared-command-kit';\n *\n * export const setup = defineSetupHandler({\n * name: 'mind:setup',\n * workspace: {\n * directories: ['.kb/mind/index', '.kb/mind/cache'],\n * },\n * config: {\n * 'kb.config.json': {\n * mind: { enabled: true, scopes: ['default'] },\n * },\n * },\n * async handler(ctx) {\n * ctx.log('Mind workspace initialized');\n * return { ok: true };\n * },\n * });\n * ```\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { existsSync } from 'node:fs';\n\n/**\n * Lifecycle handler context\n */\nexport interface LifecycleContext {\n /** Output directory (plugin workspace root) */\n outdir: string;\n /** Plugin ID */\n pluginId: string;\n /** Request ID for tracing */\n requestId?: string;\n /** Logger */\n log?: (level: 'debug' | 'info' | 'warn' | 'error', msg: string, meta?: Record<string, unknown>) => void;\n /** Environment getter */\n env?: (key: string) => string | undefined;\n}\n\n/**\n * Workspace setup configuration\n */\nexport interface WorkspaceConfig {\n /** Directories to create (relative to outdir or absolute) */\n directories?: string[];\n /** Files to create with content */\n files?: Record<string, string>;\n}\n\n/**\n * Config file updates\n */\nexport type ConfigUpdates = Record<string, Record<string, unknown>>;\n\n/**\n * Setup handler definition\n */\nexport interface SetupHandlerDefinition {\n /** Handler name (for logging) */\n name: string;\n /** Workspace configuration (directories/files to create) */\n workspace?: WorkspaceConfig;\n /** Config file updates (will be merged with existing config) */\n config?: ConfigUpdates;\n /** Custom setup logic (optional) */\n handler?: (ctx: LifecycleContext) => Promise<{ ok: boolean; message?: string }>;\n}\n\n/**\n * Destroy handler definition\n */\nexport interface DestroyHandlerDefinition {\n /** Handler name (for logging) */\n name: string;\n /** Workspace cleanup (directories/files to remove) */\n workspace?: {\n /** Directories to remove */\n directories?: string[];\n /** Files to remove */\n files?: string[];\n };\n /** Config cleanup (keys to remove from config files) */\n config?: Record<string, string[]>; // file -> keys to remove\n /** Custom destroy logic (optional) */\n handler?: (ctx: LifecycleContext) => Promise<{ ok: boolean; message?: string }>;\n}\n\n/**\n * Setup handler result\n */\nexport interface SetupResult {\n ok: boolean;\n message?: string;\n}\n\n/**\n * Define a setup handler with declarative workspace and config setup\n *\n * @example\n * ```typescript\n * export const setup = defineSetupHandler({\n * name: 'mind:setup',\n * workspace: {\n * directories: [\n * '.kb/mind/index',\n * '.kb/mind/cache',\n * '.kb/mind/pack',\n * ],\n * files: {\n * '.kb/mind/.gitignore': 'cache/\\npack/\\n',\n * },\n * },\n * config: {\n * 'kb.config.json': {\n * mind: {\n * enabled: true,\n * scopes: ['default'],\n * },\n * },\n * },\n * async handler(ctx) {\n * ctx.log?.('info', 'Custom setup logic', {});\n * return { ok: true };\n * },\n * });\n * ```\n */\nexport function defineSetupHandler(\n definition: SetupHandlerDefinition\n): (ctx: LifecycleContext) => Promise<SetupResult> {\n return async (ctx: LifecycleContext) => {\n const log = ctx.log || ((level: string, msg: string, meta?: Record<string, unknown>) => {\n console.log(`[${level}] ${msg}`, meta || '');\n });\n\n try {\n log('info', 'Setup started', { handler: definition.name, outdir: ctx.outdir });\n\n // 1. Create workspace directories and files\n if (definition.workspace) {\n await setupWorkspace(ctx.outdir, definition.workspace, log);\n }\n\n // 2. Update config files\n if (definition.config) {\n await updateConfigFiles(ctx.outdir, definition.config, log);\n }\n\n // 3. Run custom handler logic\n if (definition.handler) {\n const result = await definition.handler(ctx);\n if (!result.ok) {\n return result;\n }\n }\n\n log('info', 'Setup completed', { handler: definition.name });\n return { ok: true, message: `${definition.name} setup completed` };\n } catch (error: unknown) {\n const errMsg = error instanceof Error ? error.message : String(error);\n log('error', 'Setup failed', {\n handler: definition.name,\n error: errMsg,\n stack: error instanceof Error ? error.stack : undefined,\n });\n return { ok: false, message: `Setup failed: ${errMsg}` };\n }\n };\n}\n\n/**\n * Define a destroy handler with declarative cleanup\n *\n * @example\n * ```typescript\n * export const destroy = defineDestroyHandler({\n * name: 'mind:destroy',\n * workspace: {\n * directories: ['.kb/mind'],\n * },\n * config: {\n * 'kb.config.json': ['mind'], // Remove 'mind' key\n * },\n * });\n * ```\n */\nexport function defineDestroyHandler(\n definition: DestroyHandlerDefinition\n): (ctx: LifecycleContext) => Promise<SetupResult> {\n return async (ctx: LifecycleContext) => {\n const log = ctx.log || ((level: string, msg: string, meta?: Record<string, unknown>) => {\n console.log(`[${level}] ${msg}`, meta || '');\n });\n\n try {\n log('info', 'Destroy started', { handler: definition.name, outdir: ctx.outdir });\n\n // 1. Clean up config files\n if (definition.config) {\n await cleanupConfigFiles(ctx.outdir, definition.config, log);\n }\n\n // 2. Remove workspace directories and files\n if (definition.workspace) {\n await cleanupWorkspace(ctx.outdir, definition.workspace, log);\n }\n\n // 3. Run custom handler logic\n if (definition.handler) {\n const result = await definition.handler(ctx);\n if (!result.ok) {\n return result;\n }\n }\n\n log('info', 'Destroy completed', { handler: definition.name });\n return { ok: true, message: `${definition.name} destroy completed` };\n } catch (error: unknown) {\n const errMsg = error instanceof Error ? error.message : String(error);\n log('error', 'Destroy failed', {\n handler: definition.name,\n error: errMsg,\n stack: error instanceof Error ? error.stack : undefined,\n });\n return { ok: false, message: `Destroy failed: ${errMsg}` };\n }\n };\n}\n\n/**\n * Setup workspace directories and files\n */\nasync function setupWorkspace(\n outdir: string,\n config: WorkspaceConfig,\n log: (level: 'error' | 'info' | 'debug' | 'warn', msg: string, meta?: Record<string, unknown>) => void\n): Promise<void> {\n // Create directories\n if (config.directories) {\n for (const dir of config.directories) {\n const dirPath = path.resolve(outdir, dir);\n await fs.mkdir(dirPath, { recursive: true });\n log('debug', 'Created directory', { path: dirPath });\n }\n }\n\n // Create files\n if (config.files) {\n for (const [filePath, content] of Object.entries(config.files)) {\n const fullPath = path.resolve(outdir, filePath);\n const dirPath = path.dirname(fullPath);\n await fs.mkdir(dirPath, { recursive: true });\n await fs.writeFile(fullPath, content, 'utf-8');\n log('debug', 'Created file', { path: fullPath });\n }\n }\n}\n\n/**\n * Update config files (merge with existing config)\n */\nasync function updateConfigFiles(\n outdir: string,\n updates: ConfigUpdates,\n log: (level: 'error' | 'info' | 'debug' | 'warn', msg: string, meta?: Record<string, unknown>) => void\n): Promise<void> {\n for (const [configFile, configUpdates] of Object.entries(updates)) {\n const configPath = path.resolve(outdir, configFile);\n\n // Read existing config or create empty\n let config: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n const content = await fs.readFile(configPath, 'utf-8');\n try {\n config = JSON.parse(content);\n } catch (error) {\n log('warn', 'Failed to parse existing config, starting fresh', { path: configPath });\n }\n }\n\n // Merge updates\n config = { ...config, ...configUpdates };\n\n // Write updated config\n const dirPath = path.dirname(configPath);\n await fs.mkdir(dirPath, { recursive: true });\n await fs.writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');\n log('debug', 'Updated config file', { path: configPath });\n }\n}\n\n/**\n * Cleanup workspace directories and files\n */\nasync function cleanupWorkspace(\n outdir: string,\n config: DestroyHandlerDefinition['workspace'],\n log: (level: 'error' | 'info' | 'debug' | 'warn', msg: string, meta?: Record<string, unknown>) => void\n): Promise<void> {\n if (!config) {return;}\n\n // Remove files first\n if (config.files) {\n for (const file of config.files) {\n const filePath = path.resolve(outdir, file);\n if (existsSync(filePath)) {\n await fs.unlink(filePath);\n log('debug', 'Removed file', { path: filePath });\n }\n }\n }\n\n // Remove directories\n if (config.directories) {\n for (const dir of config.directories) {\n const dirPath = path.resolve(outdir, dir);\n if (existsSync(dirPath)) {\n await fs.rm(dirPath, { recursive: true, force: true });\n log('debug', 'Removed directory', { path: dirPath });\n }\n }\n }\n}\n\n/**\n * Cleanup config files (remove keys)\n */\nasync function cleanupConfigFiles(\n outdir: string,\n cleanups: Record<string, string[]>,\n log: (level: 'error' | 'info' | 'debug' | 'warn', msg: string, meta?: Record<string, unknown>) => void\n): Promise<void> {\n for (const [configFile, keysToRemove] of Object.entries(cleanups)) {\n const configPath = path.resolve(outdir, configFile);\n\n if (!existsSync(configPath)) {\n continue;\n }\n\n // Read config\n const content = await fs.readFile(configPath, 'utf-8');\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(content);\n } catch (error) {\n log('warn', 'Failed to parse config for cleanup', { path: configPath });\n continue;\n }\n\n // Remove keys\n for (const key of keysToRemove) {\n delete config[key];\n }\n\n // Write updated config\n await fs.writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');\n log('debug', 'Cleaned up config file', { path: configPath, removed: keysToRemove });\n }\n}\n","/**\n * Job definition helpers\n * @module @kb-labs/shared-command-kit/jobs\n */\n\nimport type { JobDecl, PermissionSpec, PluginContextV3 } from '@kb-labs/plugin-contracts';\n\n/**\n * Job input passed to handler at runtime\n */\nexport interface JobInput {\n /** Job identifier */\n jobId: string;\n /** When the job was scheduled to execute */\n executedAt: Date;\n /** How many times this job has run */\n runCount: number;\n}\n\n/**\n * Job handler function signature\n *\n * @template TInput - Custom input type (extends JobInput)\n * @template TOutput - Handler return type\n */\nexport type JobHandler<\n TInput extends JobInput = JobInput,\n TOutput = { ok: boolean; [key: string]: unknown }\n> = (input: TInput, ctx: PluginContextV3) => Promise<TOutput>;\n\n/**\n * Job definition configuration\n *\n * Combines JobDecl manifest fields with the actual handler function\n * for type-safe job creation.\n */\nexport interface JobDefinition<\n TInput extends JobInput = JobInput,\n TOutput = { ok: boolean; [key: string]: unknown }\n> {\n /** Unique job identifier within plugin (e.g., 'auto-index') */\n id: string;\n\n /**\n * Cron schedule expression\n * Supports shortcuts (@hourly, @daily, @weekly, @monthly, @yearly) and standard cron format\n */\n schedule: string;\n\n /** Human-readable description */\n describe?: string;\n\n /** Whether job is enabled (default: true) */\n enabled?: boolean;\n\n /** Job priority (1-10, default: 5, higher = more important) */\n priority?: number;\n\n /** Execution timeout in milliseconds (default: 60000 = 1min) */\n timeout?: number;\n\n /** Number of retry attempts on failure (default: 2) */\n retries?: number;\n\n /** Tags for filtering and organization */\n tags?: string[];\n\n /** Permissions for job execution (filesystem, network, quotas) */\n permissions?: PermissionSpec;\n\n /** Job handler function */\n handler: JobHandler<TInput, TOutput>;\n}\n\n/**\n * Defined job object with manifest conversion\n */\nexport interface DefinedJob<\n TInput extends JobInput = JobInput,\n TOutput = { ok: boolean; [key: string]: unknown }\n> {\n /** Job configuration */\n readonly config: Omit<JobDefinition<TInput, TOutput>, 'handler'> & { handler: string };\n\n /** Job handler function */\n readonly handler: JobHandler<TInput, TOutput>;\n\n /** Convert to manifest JobDecl */\n toManifest(handlerPath: string): JobDecl;\n}\n\n/**\n * Define a type-safe job with handler\n *\n * This helper provides compile-time type safety for job definitions\n * and allows sharing the same handler function between manifest and runtime.\n *\n * The handler function can be exported from a separate file and the manifest\n * references it via the handler path.\n *\n * See plugin-template/src/jobs/hello.ts for a complete example.\n *\n * @param definition - Job configuration with handler\n * @returns DefinedJob object with handler and manifest conversion\n */\nexport function defineJob<\n TInput extends JobInput = JobInput,\n TOutput = { ok: boolean; [key: string]: unknown }\n>(\n definition: JobDefinition<TInput, TOutput>\n): DefinedJob<TInput, TOutput> {\n const { handler, ...config } = definition;\n\n return {\n config: { ...config, handler: '' }, // handler path will be set in toManifest()\n handler,\n toManifest(handlerPath: string): JobDecl {\n // JobDecl now extends CronDecl, which has job.type instead of handler\n return {\n id: config.id,\n schedule: config.schedule,\n job: {\n type: config.id, // Use job id as type\n payload: {}, // Empty payload by default\n },\n describe: config.describe,\n enabled: config.enabled,\n permissions: definition.permissions,\n };\n },\n };\n}\n","/**\n * Define a CLI command handler\n */\n\nimport type { PluginContextV3, CommandResult, HostContext, MutateIntent, ExecuteIntent, UIFacade } from '@kb-labs/plugin-contracts';\n\n/**\n * CLI input wrapper - V3 plugin system wraps flags in this structure\n */\nexport interface CLIInput<TFlags = unknown> {\n flags: TFlags;\n argv: string[];\n}\n\nexport interface CommandHandlerV3<TConfig = unknown, TInput = unknown, TResult = unknown> {\n /**\n * Execute the command\n */\n execute(\n context: PluginContextV3<TConfig>,\n input: TInput\n ): Promise<CommandResult<TResult>> | CommandResult<TResult>;\n\n /**\n * Describe what the command *would* do without executing.\n * Implement this to support `--dry-run` for mutate/execute commands.\n * When present and `input.flags['dry-run']` is true, `defineCommand` calls\n * this instead of `execute` and renders the intent output automatically.\n */\n intent?(\n context: PluginContextV3<TConfig>,\n input: TInput\n ): Promise<MutateIntent | ExecuteIntent>;\n\n /**\n * Optional cleanup - called after execute completes\n */\n cleanup?(): Promise<void> | void;\n}\n\nexport interface CommandDefinition<TConfig = unknown, TInput = unknown, TResult = unknown> {\n /**\n * Command ID (e.g., \"my-plugin:greet\")\n */\n id: string;\n\n /**\n * Command description\n */\n description?: string;\n\n /**\n * Handler implementation\n */\n handler: CommandHandlerV3<TConfig, TInput, TResult>;\n\n /**\n * Optional input schema validation (future: use Zod/JSON Schema)\n */\n schema?: unknown;\n}\n\n/**\n * Define a CLI command\n *\n * For CLI commands, use CLIInput<TFlags> as TInput type to get proper typing\n * for the V3 plugin system's { flags, argv } structure.\n *\n * @example\n * ```typescript\n * interface GreetFlags {\n * name?: string;\n * }\n *\n * interface GreetResult {\n * message: string;\n * target: string;\n * }\n *\n * export default defineCommand<unknown, CLIInput<GreetFlags>, GreetResult>({\n * id: 'greet',\n * description: 'Greet a user',\n * handler: {\n * async execute(context, input) {\n * const target = input.flags.name || 'World';\n * context.ui.success(`Hello, ${target}!`);\n *\n * return {\n * ok: true,\n * result: { message: `Hello, ${target}!`, target },\n * meta: { version: 'v3' }\n * };\n * }\n * }\n * });\n * ```\n */\nexport function defineCommand<TConfig = unknown, TInput = unknown, TResult = unknown>(\n definition: CommandDefinition<TConfig, TInput, TResult>\n): CommandHandlerV3<TConfig, TInput, TResult> {\n return {\n execute: (context, input) => {\n if (context.host !== 'cli' && context.host !== 'workflow') {\n throw new Error(\n `Command ${definition.id} can only run in CLI or workflow host (current: ${context.host})`\n );\n }\n\n const flags = (input as { flags?: Record<string, unknown> })?.flags;\n if (flags?.['dry-run'] && typeof definition.handler.intent === 'function') {\n return (async () => {\n const intent = await definition.handler.intent!(context, input);\n renderDryRunIntent(context.ui, intent);\n return { ok: true, result: intent as unknown as TResult };\n })();\n }\n\n return definition.handler.execute(context, input);\n },\n\n cleanup: definition.handler.cleanup,\n } as CommandHandlerV3<TConfig, TInput, TResult>;\n}\n\nfunction renderDryRunIntent(ui: UIFacade, intent: MutateIntent | ExecuteIntent): void {\n if ('operations' in intent) {\n ui.info(`Dry-run: ${intent.summary}`, {\n sections: [{\n header: 'Operations',\n items: intent.operations.map((op) => {\n const detail = op.details ? ` — ${JSON.stringify(op.details)}` : '';\n return `${op.type.toUpperCase()} ${op.resource}${detail}`;\n }),\n }],\n });\n } else {\n const hint = intent.estimatedDurationMs\n ? ` (~${Math.round(intent.estimatedDurationMs / 1000)}s)`\n : '';\n ui.info(`Dry-run: ${intent.summary}${hint}`);\n }\n}\n\n/**\n * Type guard to check if host context is CLI\n */\nexport function isCLIHost(hostContext: HostContext): hostContext is Extract<HostContext, { host: 'cli' }> {\n return hostContext.host === 'cli';\n}\n","/**\n * Define a REST API route handler\n */\n\nimport type { PluginContextV3, CommandResult, HostContext } from '@kb-labs/plugin-contracts';\n\nexport interface RouteHandler<TConfig = unknown, TInput = unknown> {\n /**\n * Execute the route handler\n */\n execute(\n context: PluginContextV3<TConfig>,\n input: TInput\n ): Promise<CommandResult | void> | CommandResult | void;\n\n /**\n * Optional cleanup - called after execute completes\n */\n cleanup?(): Promise<void> | void;\n}\n\nexport interface RouteDefinition<TConfig = unknown, TInput = unknown> {\n /**\n * Route path (e.g., \"/api/greet\")\n */\n path: string;\n\n /**\n * HTTP method (e.g., \"GET\", \"POST\")\n */\n method: string;\n\n /**\n * Route description\n */\n description?: string;\n\n /**\n * Handler implementation\n */\n handler: RouteHandler<TConfig, TInput>;\n\n /**\n * Optional input schema validation (future: use Zod/JSON Schema)\n */\n schema?: unknown;\n}\n\n/**\n * Define a REST API route\n *\n * @example\n * ```typescript\n * export default defineRoute({\n * path: '/greet',\n * method: 'POST',\n * description: 'Greet a user',\n * handler: {\n * async execute(context, input: { name: string }) {\n * return {\n * ok: true,\n * result: { message: `Hello, ${input.name}!` },\n * };\n * }\n * }\n * });\n * ```\n */\nexport function defineRoute<TConfig = unknown, TInput = unknown>(\n definition: RouteDefinition<TConfig, TInput>\n): RouteHandler<TConfig, TInput> {\n // Validate host type at runtime\n const wrappedHandler: RouteHandler<TConfig, TInput> = {\n execute: async (context, input) => {\n // Ensure we're running in REST host\n if (context.host !== 'rest') {\n throw new Error(\n `Route ${definition.path} can only run in REST host (current: ${context.host})`\n );\n }\n\n // Validate method if provided in host context\n if (isRESTHost(context.hostContext)) {\n const expectedMethod = definition.method.toUpperCase();\n const actualMethod = context.hostContext.method.toUpperCase();\n if (actualMethod !== expectedMethod) {\n throw new Error(\n `Route ${definition.path} expects ${expectedMethod} but got ${actualMethod}`\n );\n }\n }\n\n // Call the actual handler with error handling\n try {\n return await definition.handler.execute(context, input);\n } finally {\n // Always call cleanup, even if handler throws\n await definition.handler.cleanup?.();\n }\n },\n\n cleanup: definition.handler.cleanup,\n };\n\n return wrappedHandler;\n}\n\n/**\n * Type guard to check if host context is REST\n */\nexport function isRESTHost(hostContext: HostContext): hostContext is Extract<HostContext, { host: 'rest' }> {\n return hostContext.host === 'rest';\n}\n","/**\n * Define a webhook handler\n */\n\nimport type { PluginContextV3, CommandResult, HostContext } from '@kb-labs/plugin-contracts';\n\nexport interface WebhookHandler<TConfig = unknown, TInput = unknown> {\n /**\n * Execute the webhook handler\n */\n execute(\n context: PluginContextV3<TConfig>,\n input: TInput\n ): Promise<CommandResult | void> | CommandResult | void;\n\n /**\n * Optional cleanup - called after execute completes\n */\n cleanup?(): Promise<void> | void;\n}\n\nexport interface WebhookDefinition<TConfig = unknown, TInput = unknown> {\n /**\n * Event name (e.g., \"github:push\", \"stripe:payment.success\")\n */\n event: string;\n\n /**\n * Webhook description\n */\n description?: string;\n\n /**\n * Handler implementation\n */\n handler: WebhookHandler<TConfig, TInput>;\n\n /**\n * Optional input schema validation (future: use Zod/JSON Schema)\n */\n schema?: unknown;\n}\n\n/**\n * Define a webhook handler\n *\n * @example\n * ```typescript\n * export default defineWebhook({\n * event: 'github:push',\n * description: 'Handle GitHub push events',\n * handler: {\n * async execute(context, input: { ref: string; commits: any[] }) {\n * const { event, source, payload } = context.hostContext as WebhookHost;\n *\n * context.ui.info(`Received ${event} from ${source}`);\n *\n * // Process webhook...\n *\n * return {\n * ok: true,\n * result: { processed: true },\n * };\n * }\n * }\n * });\n * ```\n */\nexport function defineWebhook<TConfig = unknown, TInput = unknown>(\n definition: WebhookDefinition<TConfig, TInput>\n): WebhookHandler<TConfig, TInput> {\n // Validate host type at runtime\n const wrappedHandler: WebhookHandler<TConfig, TInput> = {\n execute: async (context, input) => {\n // Ensure we're running in webhook host\n if (context.host !== 'webhook') {\n throw new Error(\n `Webhook ${definition.event} can only run in webhook host (current: ${context.host})`\n );\n }\n\n // Validate event if provided in host context\n if (isWebhookHost(context.hostContext)) {\n const expectedEvent = definition.event;\n const actualEvent = context.hostContext.event;\n if (actualEvent !== expectedEvent) {\n throw new Error(\n `Webhook expects event ${expectedEvent} but got ${actualEvent}`\n );\n }\n }\n\n // Call the actual handler with error handling\n try {\n return await definition.handler.execute(context, input);\n } finally {\n // Always call cleanup, even if handler throws\n await definition.handler.cleanup?.();\n }\n },\n\n cleanup: definition.handler.cleanup,\n };\n\n return wrappedHandler;\n}\n\n/**\n * Type guard to check if host context is webhook\n */\nexport function isWebhookHost(\n hostContext: HostContext\n): hostContext is Extract<HostContext, { host: 'webhook' }> {\n return hostContext.host === 'webhook';\n}\n","/**\n * Define a WebSocket channel handler with enhanced DX\n *\n * Provides type-safe WebSocket handlers following the same pattern as defineCommand, defineRoute, etc.\n */\n\nimport type { PluginContextV3, CommandResult, HostContext } from '@kb-labs/plugin-contracts';\nimport type { WSSender, WSInput, WSMessage } from '@kb-labs/plugin-contracts';\n\n/**\n * Validate that a message conforms to WSMessage structure\n * @throws {Error} if message is invalid\n */\nfunction validateWSMessage(message: unknown): asserts message is WSMessage {\n if (!message || typeof message !== 'object') {\n throw new Error('Invalid WebSocket message: must be an object');\n }\n\n const msg = message as Record<string, unknown>;\n\n if (typeof msg.type !== 'string' || msg.type.length === 0) {\n throw new Error('Invalid WebSocket message: type must be a non-empty string');\n }\n\n if (msg.timestamp !== undefined && typeof msg.timestamp !== 'number') {\n throw new Error('Invalid WebSocket message: timestamp must be a number');\n }\n\n if (msg.messageId !== undefined && typeof msg.messageId !== 'string') {\n throw new Error('Invalid WebSocket message: messageId must be a string');\n }\n}\n\n/**\n * Typed sender with message builders\n *\n * Wraps WSSender to provide generic type support for outgoing messages.\n */\nexport interface TypedSender<TOutgoing = WSMessage> extends Omit<WSSender, 'send' | 'broadcast' | 'sendTo'> {\n /** Send typed message to this client */\n send(message: TOutgoing): Promise<void>;\n /** Broadcast typed message to all clients in channel */\n broadcast(message: TOutgoing, excludeSelf?: boolean): Promise<void>;\n /** Send typed message to specific connections */\n sendTo(connectionIds: string[], message: TOutgoing): Promise<void>;\n /** Original WSSender methods for raw messages */\n raw: WSSender;\n}\n\n/**\n * Create typed sender wrapper\n */\nfunction createTypedSender<TOutgoing = WSMessage>(raw: WSSender): TypedSender<TOutgoing> {\n return {\n send: (msg) => raw.send(msg as WSMessage),\n broadcast: (msg, exclude) => raw.broadcast(msg as WSMessage, exclude),\n sendTo: (ids, msg) => raw.sendTo(ids, msg as WSMessage),\n close: raw.close.bind(raw),\n getConnectionId: raw.getConnectionId.bind(raw),\n raw,\n };\n}\n\n/**\n * WebSocket handler with typed messages\n */\nexport interface WebSocketHandler<TConfig = unknown, TIncoming = unknown, TOutgoing = WSMessage> {\n /**\n * Called when client connects\n */\n onConnect?(\n context: PluginContextV3<TConfig>,\n sender: TypedSender<TOutgoing>\n ): Promise<void> | void;\n\n /**\n * Called when message received from client\n */\n onMessage?(\n context: PluginContextV3<TConfig>,\n message: TIncoming,\n sender: TypedSender<TOutgoing>\n ): Promise<void> | void;\n\n /**\n * Called when client disconnects\n */\n onDisconnect?(\n context: PluginContextV3<TConfig>,\n code: number,\n reason: string\n ): Promise<void> | void;\n\n /**\n * Called on error\n */\n onError?(\n context: PluginContextV3<TConfig>,\n error: Error,\n sender: TypedSender<TOutgoing>\n ): Promise<void> | void;\n\n /**\n * Optional cleanup - called after any lifecycle event\n */\n cleanup?(): Promise<void> | void;\n}\n\nexport interface WebSocketDefinition<TConfig = unknown, TIncoming = unknown, TOutgoing = WSMessage> {\n /**\n * Channel path (e.g., \"/live\", \"/chat\")\n */\n path: string;\n\n /**\n * Channel description\n */\n description?: string;\n\n /**\n * Handler implementation\n */\n handler: WebSocketHandler<TConfig, TIncoming, TOutgoing>;\n\n /**\n * Optional message schema validation (future: use Zod/JSON Schema)\n */\n schema?: unknown;\n}\n\n/**\n * Define a WebSocket channel handler\n *\n * @example Basic usage\n * ```typescript\n * export default defineWebSocket({\n * path: '/chat',\n * handler: {\n * async onConnect(ctx, sender) {\n * await sender.send({ type: 'ready', payload: {}, timestamp: Date.now() });\n * },\n * async onMessage(ctx, message, sender) {\n * console.log('Received:', message);\n * },\n * }\n * });\n * ```\n *\n * @example With typed messages\n * ```typescript\n * interface IncomingMsg {\n * type: 'start' | 'stop';\n * payload: { scope?: string };\n * }\n *\n * interface OutgoingMsg {\n * type: 'progress' | 'complete';\n * payload: { progress: number; message: string };\n * }\n *\n * export default defineWebSocket<unknown, IncomingMsg, OutgoingMsg>({\n * path: '/live',\n * handler: {\n * async onMessage(ctx, message, sender) {\n * if (message.type === 'start') {\n * await sender.send({\n * type: 'progress',\n * payload: { progress: 50, message: 'Processing...' },\n * });\n * }\n * }\n * }\n * });\n * ```\n *\n * @example With message router (advanced pattern matching)\n * ```typescript\n * import { defineMessage, MessageRouter } from '@kb-labs/sdk';\n *\n * // Define message types\n * const StartMsg = defineMessage<{ scope?: string }>('start');\n * const StopMsg = defineMessage<object>('stop');\n *\n * // Create outgoing message builders\n * const ProgressMsg = defineMessage<{ phase: string; progress: number }>('progress');\n * const CompleteMsg = defineMessage<{ commits: any[] }>('complete');\n *\n * export default defineWebSocket({\n * path: '/live',\n * handler: {\n * async onMessage(ctx, message, sender) {\n * const router = new MessageRouter()\n * .on(StartMsg, async (ctx, payload, sender) => {\n * await sender.send(ProgressMsg.create({\n * phase: 'analyzing',\n * progress: 0,\n * }));\n * })\n * .on(StopMsg, async (ctx, payload, sender) => {\n * sender.close(1000, 'Stopped by user');\n * });\n *\n * await router.handle(ctx, message, sender.raw);\n * }\n * }\n * });\n * ```\n */\nexport function defineWebSocket<TConfig = unknown, TIncoming = unknown, TOutgoing = WSMessage>(\n definition: WebSocketDefinition<TConfig, TIncoming, TOutgoing>\n) {\n // Return a unified handler that router can call with WSInput\n return {\n async execute(context: PluginContextV3<TConfig>, input: WSInput): Promise<CommandResult | void> {\n // Validate host type at runtime\n if (context.host !== 'ws') {\n throw new Error(\n `WebSocket channel ${definition.path} can only run in ws host (current: ${context.host})`\n );\n }\n\n // Validate channel path if provided in host context\n if (isWSHost(context.hostContext)) {\n const expectedPath = definition.path;\n const actualPath = context.hostContext.channelPath;\n if (actualPath !== expectedPath) {\n throw new Error(\n `WebSocket expects channel ${expectedPath} but got ${actualPath}`\n );\n }\n }\n\n // Get sender from input (passed from channel-mounter)\n const sender = input.sender;\n if (!sender && input.event !== 'disconnect') {\n throw new Error('WebSocket sender not provided in input');\n }\n\n // Create typed sender wrapper (only if sender is available)\n const typedSender = sender ? createTypedSender<TOutgoing>(sender) : undefined;\n\n // Route to appropriate lifecycle handler\n try {\n switch (input.event) {\n case 'connect':\n if (typedSender) {\n await definition.handler.onConnect?.(context, typedSender);\n }\n break;\n\n case 'message':\n if (input.message && typedSender && sender) {\n // Validate message structure before processing\n try {\n validateWSMessage(input.message);\n } catch (error) {\n // Log validation error and send error message to client\n context.platform.logger.error('Invalid WebSocket message received', error as Error, {\n connectionId: sender.getConnectionId(),\n message: input.message,\n });\n // Send error response to client\n await sender.send({\n type: 'error',\n payload: { error: 'Invalid message format' },\n timestamp: Date.now(),\n });\n break;\n }\n\n // Parse incoming message as TIncoming (now validated)\n const incomingMessage = input.message as unknown as TIncoming;\n await definition.handler.onMessage?.(context, incomingMessage, typedSender);\n }\n break;\n\n case 'disconnect':\n await definition.handler.onDisconnect?.(\n context,\n input.disconnectCode ?? 1000,\n input.disconnectReason ?? ''\n );\n break;\n\n case 'error':\n if (input.error && typedSender) {\n await definition.handler.onError?.(context, input.error, typedSender);\n }\n break;\n }\n } finally {\n // Always call cleanup after lifecycle event\n await definition.handler.cleanup?.();\n }\n\n return { ok: true };\n },\n };\n}\n\n/**\n * Type guard to check if host context is WebSocket\n */\nexport function isWSHost(\n hostContext: HostContext\n): hostContext is Extract<HostContext, { host: 'ws' }> {\n return hostContext.host === 'ws';\n}\n","import type {\n CommandResult,\n EventStreamInput,\n EventStreamSender,\n PluginContextV3,\n} from \"@kb-labs/plugin-contracts\";\n\nexport interface EventStreamHandler<TConfig = unknown> {\n onConnect?(\n context: PluginContextV3<TConfig>,\n stream: EventStreamSender,\n ): Promise<void> | void;\n onDisconnect?(context: PluginContextV3<TConfig>): Promise<void> | void;\n onError?(\n context: PluginContextV3<TConfig>,\n error: Error,\n stream: EventStreamSender,\n ): Promise<void> | void;\n}\n\nexport interface EventStreamDefinition<TConfig = unknown> {\n path: string;\n description?: string;\n handler: EventStreamHandler<TConfig>;\n}\n\n/**\n * Defines a declarative plugin SSE endpoint. The REST host owns the HTTP\n * connection and invokes this lifecycle in-process, just like defineWebSocket.\n */\nexport function defineEventStream<TConfig = unknown>(\n definition: EventStreamDefinition<TConfig>,\n) {\n return {\n async execute(\n context: PluginContextV3<TConfig>,\n input: EventStreamInput,\n ): Promise<CommandResult> {\n if (context.host !== \"rest\") {\n throw new Error(\n `Event stream ${definition.path} can only run in rest host (current: ${context.host})`,\n );\n }\n if (\n (input.event === \"connect\" || input.event === \"error\") &&\n !input.sender\n ) {\n throw new Error(\"Event stream sender not provided in input\");\n }\n switch (input.event) {\n case \"connect\":\n await definition.handler.onConnect?.(context, input.sender!);\n break;\n case \"disconnect\":\n await definition.handler.onDisconnect?.(context);\n break;\n case \"error\":\n await definition.handler.onError?.(\n context,\n input.error ?? new Error(\"Event stream error\"),\n input.sender!,\n );\n break;\n }\n return { ok: true };\n },\n };\n}\n","/**\n * Define a workflow action handler\n */\n\nimport type { PluginContextV3, CommandResult, HostContext } from '@kb-labs/plugin-contracts';\n\nexport interface ActionHandler<TConfig = unknown, TInput = unknown> {\n /**\n * Execute the workflow action\n */\n execute(\n context: PluginContextV3<TConfig>,\n input: TInput\n ): Promise<CommandResult | void> | CommandResult | void;\n\n /**\n * Optional cleanup - called after execute completes\n */\n cleanup?(): Promise<void> | void;\n}\n\nexport interface ActionDefinition<TConfig = unknown, TInput = unknown> {\n /**\n * Action ID (e.g., \"send-email\")\n */\n id: string;\n\n /**\n * Action description\n */\n description?: string;\n\n /**\n * Handler implementation\n */\n handler: ActionHandler<TConfig, TInput>;\n\n /**\n * Optional input schema validation (future: use Zod/JSON Schema)\n */\n schema?: unknown;\n}\n\n/**\n * Define a workflow action\n *\n * @example\n * ```typescript\n * export default defineAction({\n * id: 'send-email',\n * description: 'Send an email notification',\n * handler: {\n * async execute(context, input: { to: string; subject: string; body: string }) {\n * // Access workflow context\n * const { workflowId, runId, stepId } = context.hostContext as WorkflowHost;\n *\n * context.ui.info(`Sending email in workflow ${workflowId}`);\n *\n * // Send email...\n *\n * return {\n * ok: true,\n * result: { sent: true, messageId: '123' },\n * };\n * }\n * }\n * });\n * ```\n */\nexport function defineAction<TConfig = unknown, TInput = unknown>(\n definition: ActionDefinition<TConfig, TInput>\n): ActionHandler<TConfig, TInput> {\n // Validate host type at runtime\n const wrappedHandler: ActionHandler<TConfig, TInput> = {\n execute: (context, input) => {\n // Ensure we're running in workflow host\n if (context.host !== 'workflow') {\n throw new Error(\n `Action ${definition.id} can only run in workflow host (current: ${context.host})`\n );\n }\n\n // Call the actual handler\n return definition.handler.execute(context, input);\n },\n\n cleanup: definition.handler.cleanup,\n };\n\n return wrappedHandler;\n}\n\n/**\n * Type guard to check if host context is workflow\n */\nexport function isWorkflowHost(\n hostContext: HostContext\n): hostContext is Extract<HostContext, { host: 'workflow' }> {\n return hostContext.host === 'workflow';\n}\n","/**\n * Enhanced WebSocket types for better DX\n *\n * Provides type-safe message builders and pattern matching utilities.\n */\n\nimport type { PluginContextV3 } from '@kb-labs/plugin-contracts';\nimport type { WSSender, WSMessage } from '@kb-labs/plugin-contracts';\n\n/**\n * Type-safe message builder\n *\n * @example\n * ```typescript\n * const Progress = defineMessage<{ phase: string; progress: number }>('progress');\n * const msg = Progress.create({ phase: 'analyzing', progress: 50 });\n * // msg: { type: 'progress', payload: { phase: 'analyzing', progress: 50 }, timestamp: number }\n * ```\n */\nexport class MessageBuilder<TPayload = unknown> {\n constructor(private type: string) {}\n\n /**\n * Create message with payload\n */\n create(payload: TPayload, messageId?: string): WSMessage {\n return {\n type: this.type,\n payload,\n messageId,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Match against incoming message type (type guard)\n */\n is(message: WSMessage): message is WSMessage & { payload: TPayload } {\n return message.type === this.type;\n }\n}\n\n/**\n * Helper to define typed messages\n *\n * @example\n * ```typescript\n * const StartMsg = defineMessage<{ scope?: string }>('start');\n * const ProgressMsg = defineMessage<{ phase: string; progress: number }>('progress');\n * ```\n */\nexport function defineMessage<TPayload = unknown>(type: string) {\n return new MessageBuilder<TPayload>(type);\n}\n\n/**\n * Message router for pattern matching\n *\n * Provides elegant routing of incoming WebSocket messages to typed handlers.\n *\n * @example\n * ```typescript\n * const router = new MessageRouter()\n * .on(StartMsg, async (ctx, payload, sender) => {\n * // payload is typed as { scope?: string }\n * console.log('Starting with scope:', payload.scope);\n * })\n * .on(StopMsg, async (ctx, payload, sender) => {\n * // Different message type, different payload type\n * sender.close(1000, 'Stopped by user');\n * });\n *\n * await router.handle(ctx, message, sender);\n * ```\n */\nexport class MessageRouter<TConfig = unknown> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private handlers = new Map<string, (ctx: PluginContextV3<TConfig>, payload: any, sender: WSSender) => Promise<void> | void>();\n\n /**\n * Register message handler\n */\n on<TPayload>(\n message: MessageBuilder<TPayload>,\n handler: (ctx: PluginContextV3<TConfig>, payload: TPayload, sender: WSSender) => Promise<void> | void\n ): this {\n this.handlers.set(message['type'], handler);\n return this;\n }\n\n /**\n * Handle incoming message\n *\n * @returns true if message was handled, false otherwise\n */\n async handle(ctx: PluginContextV3<TConfig>, message: WSMessage, sender: WSSender): Promise<boolean> {\n const handler = this.handlers.get(message.type);\n if (handler) {\n await handler(ctx, message.payload, sender);\n return true;\n }\n return false;\n }\n}\n"]}
|