@sidecar-ai/compiler 0.1.0-alpha.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../packages/core/src/index.ts","../../packages/compiler/src/analyze.ts","../../packages/compiler/src/ast.ts","../../packages/compiler/src/errors.ts","../../packages/compiler/src/project.ts","../../packages/compiler/src/utils.ts","../../packages/compiler/src/schema.ts","../../packages/compiler/src/widgets.ts","../../packages/compiler/src/build.ts","../../packages/compiler/src/config.ts","../../packages/compiler/src/diagnostics.ts","../../packages/compiler/src/generated.ts","../../packages/compiler/src/plugins.ts","../../packages/compiler/src/identity.ts","../../packages/compiler/src/plugin-components/agents.ts","../../packages/compiler/src/plugin-components/commands.ts","../../packages/compiler/src/plugin-components/hooks.ts","../../packages/compiler/src/plugin-components/passthrough.ts","../../packages/compiler/src/plugin-components/skills.ts","../../packages/compiler/src/prompts.ts","../../packages/compiler/src/resources.ts"],"sourcesContent":["/**\n * Core Sidecar authoring primitives.\n *\n * This package intentionally has no host or transport dependency. It defines\n * the stable contracts used by the compiler, MCP runtime, auth package, and\n * widget bridge.\n */\nexport type JsonPrimitive = string | number | boolean | null;\n\n/** JSON-compatible data accepted in MCP structured content and metadata. */\nexport type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue };\n\n/** JSON object shorthand used by MCP content blocks and descriptors. */\nexport type JsonObject = { [key: string]: JsonValue };\n\n/** Value that may be returned synchronously or asynchronously. */\nexport type MaybePromise<T> = T | Promise<T>;\n\n/** MIME type required for HTML MCP Apps resources. */\nexport const MCP_APP_RESOURCE_MIME_TYPE = \"text/html;profile=mcp-app\";\n\n/** Project-level metadata declared from `sidecar.config.ts`. */\nexport type SidecarConfig = {\n /** Human-readable app/server name used in generated manifests. */\n name: string;\n /** Semver-ish app version used in generated manifests and plugin output. */\n version: string;\n /** Short app description used by hosts and generated install docs. */\n description: string;\n /** Server-level MCP resource capabilities. */\n resources?: ResourceCapabilityConfig;\n /** Server-level MCP prompt capabilities. */\n prompts?: PromptCapabilityConfig;\n /** Server-level MCP tool capabilities. */\n tools?: ToolCapabilityConfig;\n /** Cursor pagination defaults for MCP list operations. */\n pagination?: PaginationConfig;\n};\n\n/** MCP list operations that support cursor pagination. */\nexport type McpListOperation =\n | \"tools/list\"\n | \"resources/list\"\n | \"resources/templates/list\"\n | \"prompts/list\";\n\n/** Configures server-level resource capabilities. */\nexport type ResourceCapabilityConfig = {\n /** Whether the runtime accepts `resources/subscribe` and `resources/unsubscribe`. */\n subscribe?: boolean;\n /** Whether the runtime may emit `notifications/resources/list_changed`. */\n listChanged?: boolean;\n};\n\n/** Configures server-level prompt capabilities. */\nexport type PromptCapabilityConfig = {\n /** Whether the runtime may emit `notifications/prompts/list_changed`. */\n listChanged?: boolean;\n};\n\n/** Configures server-level tool capabilities. */\nexport type ToolCapabilityConfig = {\n /** Whether the runtime may emit `notifications/tools/list_changed`. */\n listChanged?: boolean;\n};\n\n/** Context passed to project-level pagination overrides. */\nexport type PaginationContext<Auth = unknown> = {\n operation: McpListOperation;\n cursor?: string;\n pageSize: number;\n auth?: Auth;\n};\n\n/** Input accepted by a project-level pagination override. */\nexport type PaginationOverrideInput<Item = unknown, Auth = unknown> =\n PaginationContext<Auth> & {\n items: readonly Item[];\n };\n\n/** Result returned by a project-level pagination override. */\nexport type PaginationResult<Item = unknown> = {\n items: readonly Item[];\n nextCursor?: string;\n};\n\n/** Custom pagination function used for one or more MCP list operations. */\nexport type PaginationOverride<Item = unknown, Auth = unknown> = (\n input: PaginationOverrideInput<Item, Auth>\n) => MaybePromise<PaginationResult<Item>>;\n\n/** Operation-specific pagination overrides. Specific keys win over `default`. */\nexport type PaginationOverrideMap<Auth = unknown> = {\n default?: PaginationOverride<unknown, Auth>;\n toolsList?: PaginationOverride<unknown, Auth>;\n resourcesList?: PaginationOverride<unknown, Auth>;\n resourceTemplatesList?: PaginationOverride<unknown, Auth>;\n promptsList?: PaginationOverride<unknown, Auth>;\n};\n\n/** Project-level cursor pagination config. */\nexport type PaginationConfig<Auth = unknown> = {\n /** Server-chosen page size. Clients must treat cursors as opaque and must not assume this value. */\n pageSize?: number;\n /** One override for all list operations, or specific overrides keyed by operation. */\n override?: PaginationOverride<unknown, Auth> | PaginationOverrideMap<Auth>;\n};\n\n/** Options accepted by the built-in offset cursor pagination helper. */\nexport type OffsetPaginationOptions<Item> = {\n items: readonly Item[];\n cursor?: string;\n pageSize: number;\n};\n\n/**\n * Paginates an in-memory list with opaque offset cursors.\n *\n * Use this inside `pagination.override` when you want Sidecar's standard\n * cursor behavior after applying app-specific filtering or sorting.\n */\nexport function offsetPagination<Item>(\n options: OffsetPaginationOptions<Item>,\n): PaginationResult<Item> {\n const offset = options.cursor ? decodeOffsetCursor(options.cursor) : 0;\n const pageSize = options.pageSize > 0 ? Math.floor(options.pageSize) : 10;\n const page = options.items.slice(offset, offset + pageSize);\n const nextOffset = offset + page.length;\n return {\n items: page,\n nextCursor: nextOffset < options.items.length\n ? encodeOffsetCursor(nextOffset)\n : undefined,\n };\n}\n\n/** MCP content block variants Sidecar currently normalizes. */\nexport type McpContentBlock =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string }\n | { type: \"audio\"; data: string; mimeType: string }\n | { type: \"resource\"; resource: JsonObject };\n\n/** Minimal JSON Schema shape Sidecar needs for MCP tool descriptors. */\nexport type JsonSchema = {\n $schema?: string;\n type?: string | string[];\n title?: string;\n description?: string;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n additionalProperties?: boolean | JsonSchema;\n items?: JsonSchema;\n enum?: JsonValue[];\n const?: JsonValue;\n anyOf?: JsonSchema[];\n oneOf?: JsonSchema[];\n allOf?: JsonSchema[];\n default?: JsonValue;\n minimum?: number;\n maximum?: number;\n minLength?: number;\n maxLength?: number;\n format?: string;\n};\n\n/** Descriptor-level auth scheme advertised to MCP/App clients. */\nexport type SecurityScheme =\n | { type: \"noauth\" }\n | {\n type: \"oauth2\";\n scopes: string[];\n };\n\n/** MCP tool annotation hints used by hosts to understand tool behavior. */\nexport type ToolAnnotations = {\n /** Human-facing display title. Defaults to the tool name. */\n title?: string;\n /** True when the tool only reads data and has no side effects. */\n readOnlyHint?: boolean;\n /** True when the tool may perform destructive updates. Meaningful only for non-read-only tools. */\n destructiveHint?: boolean;\n /** True when repeating the same call has no extra effect. Meaningful only for non-read-only tools. */\n idempotentHint?: boolean;\n /** True when the tool may interact with external systems outside the current account/control boundary. */\n openWorldHint?: boolean;\n};\n\n/** Shared MCP annotations for resources, resource contents, and prompt content. */\nexport type ResourceAnnotations = {\n /** Intended audience for the annotated content. */\n audience?: readonly (\"user\" | \"assistant\")[];\n /** Relative importance from 0.0 to 1.0. */\n priority?: number;\n /** ISO 8601 timestamp describing when the content last changed. */\n lastModified?: string | Date;\n};\n\n/** Icon metadata supported by MCP resources and prompts. */\nexport type McpIcon = {\n src: string;\n mimeType?: string;\n sizes?: readonly string[];\n};\n\n/** User-friendly input accepted by `resourceResult()`. */\nexport type ResourceResultContentInput<\n Meta extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Text, JSON-compatible data, or bytes returned by the resource. */\n content: string | JsonValue | Uint8Array | ArrayBuffer;\n /** Optional MIME type. Sidecar infers a conservative value when omitted. */\n mimeType?: string;\n /** Optional MCP annotations for this returned content block. */\n annotations?: ResourceAnnotations;\n /** Optional host/client-only metadata emitted as MCP `_meta`. */\n meta?: Meta;\n};\n\n/** Options accepted by `resourceResult()`. */\nexport type ResourceResultInput<\n Meta extends Record<string, unknown> = Record<string, unknown>,\n> = ResourceResultContentInput<Meta> | readonly ResourceResultContentInput<Meta>[];\n\ndeclare const resourceResultTypeBrand: unique symbol;\n\n/** Branded Sidecar result returned by every resource read. */\nexport type ResourceResult<\n Meta extends Record<string, unknown> = Record<string, unknown>,\n> = {\n readonly [resourceResultTypeBrand]: true;\n contents: ResourceResultContentInput<Meta>[];\n};\n\n/** MCP resource content emitted on the wire. */\nexport type McpResourceContent =\n | {\n uri: string;\n mimeType?: string;\n text: string;\n annotations?: ResourceAnnotations;\n _meta?: Record<string, unknown>;\n }\n | {\n uri: string;\n mimeType: string;\n blob: string;\n annotations?: ResourceAnnotations;\n _meta?: Record<string, unknown>;\n };\n\n/** Normalized MCP resource read result returned by the runtime. */\nexport type McpResourceReadResult = {\n contents: McpResourceContent[];\n _meta?: Record<string, unknown>;\n};\n\n/** Helper used by resources to return MCP-compliant content. */\nexport type ResourceResultFactory = {\n <Meta extends Record<string, unknown> = Record<string, unknown>>(\n input: ResourceResultInput<Meta>\n ): ResourceResult<Meta>;\n many<Meta extends Record<string, unknown> = Record<string, unknown>>(\n input: readonly ResourceResultContentInput<Meta>[]\n ): ResourceResult<Meta>;\n};\n\n/** Runtime context passed to a resource's `read` method. */\nexport type ResourceContext<Auth = unknown, Services = unknown> = {\n auth: Auth;\n request: ToolRequestContext;\n services: Services;\n log: Logger;\n storage: ScopedStorage;\n env: Readonly<Record<string, string | undefined>>;\n};\n\n/** Author-facing definition accepted by `resource()`. */\nexport type ResourceDefinition<Auth = unknown, Services = unknown> = {\n /** Human-readable name shown to users and clients. */\n name: string;\n /** Optional stable MCP resource URI. Defaults to `sidecar://resources/<folder>`. */\n uri?: string;\n /** Optional display title when the machine-facing name is terse. */\n title?: string;\n /** Optional human-readable description. */\n description?: string;\n /** Optional MIME type advertised from `resources/list` and used as a result default. */\n mimeType?: string;\n /** Optional resource size in bytes. */\n size?: number;\n /** Optional MCP display icons. */\n icons?: readonly McpIcon[];\n /** Optional MCP annotations for the listed resource. */\n annotations?: ResourceAnnotations;\n /** Whether this resource is worth subscribing to when server subscribe is enabled. */\n subscribe?: boolean;\n /** Resource implementation. It may be synchronous or asynchronous. */\n read: (ctx: ResourceContext<Auth, Services>) => MaybePromise<ResourceResult>;\n};\n\n/** Branded Sidecar resource returned by `resource()`. */\nexport type SidecarResource<Auth = unknown, Services = unknown> =\n ResourceDefinition<Auth, Services> & {\n readonly kind: \"sidecar.resource\";\n };\n\n/** MCP descriptor emitted for `resources/list`. */\nexport type McpResourceDescriptor = {\n uri: string;\n name: string;\n title?: string;\n description?: string;\n mimeType?: string;\n size?: number;\n icons?: McpIcon[];\n annotations?: ResourceAnnotations;\n _meta?: Record<string, unknown>;\n};\n\n/** MCP resource template descriptor emitted for `resources/templates/list`. */\nexport type McpResourceTemplateDescriptor = {\n uriTemplate: string;\n name: string;\n title?: string;\n description?: string;\n mimeType?: string;\n icons?: McpIcon[];\n annotations?: ResourceAnnotations;\n _meta?: Record<string, unknown>;\n};\n\n/** Shorthand argument forms accepted by `prompt({ args })`. */\nexport type PromptArgInput =\n | string\n | readonly JsonPrimitive[]\n | {\n description?: string;\n required?: boolean;\n };\n\n/** Prompt argument schema declared in normal TypeScript objects. */\nexport type PromptArgsDefinition = Record<string, PromptArgInput>;\n\n/** MCP prompt argument descriptor emitted for `prompts/list`. */\nexport type McpPromptArgument = {\n name: string;\n description?: string;\n required?: boolean;\n};\n\n/** MCP prompt descriptor emitted for `prompts/list`. */\nexport type McpPromptDescriptor = {\n name: string;\n title?: string;\n description?: string;\n arguments?: McpPromptArgument[];\n icons?: McpIcon[];\n};\n\n/** MCP prompt message content. */\nexport type McpPromptContent = McpContentBlock;\n\n/** MCP prompt message emitted by `prompts/get`. */\nexport type McpPromptMessage = {\n role: \"user\" | \"assistant\";\n content: McpPromptContent;\n};\n\n/** User-friendly value accepted from `prompt().run`. */\nexport type PromptResultInput =\n | string\n | McpPromptMessage\n | McpPromptMessage[]\n | {\n description?: string;\n messages: McpPromptMessage[];\n };\n\n/** Normalized MCP prompt result returned by the runtime. */\nexport type McpPromptResult = {\n description?: string;\n messages: McpPromptMessage[];\n};\n\n/** Runtime context passed to a prompt's `run` method. */\nexport type PromptContext<Auth = unknown, Services = unknown> = {\n auth: Auth;\n request: ToolRequestContext;\n services: Services;\n log: Logger;\n storage: ScopedStorage;\n env: Readonly<Record<string, string | undefined>>;\n};\n\n/** Author-facing definition accepted by `prompt()`. */\nexport type PromptDefinition<\n Args extends Record<string, unknown> = Record<string, unknown>,\n Auth = unknown,\n Services = unknown,\n> = {\n /** Optional MCP prompt machine name. Defaults to the folder name. */\n name?: string;\n /** Human-readable display title. */\n title: string;\n /** Optional human-readable description. */\n description?: string;\n /** Optional simple argument declarations. */\n args?: PromptArgsDefinition;\n /** Optional MCP display icons. */\n icons?: readonly McpIcon[];\n /** Prompt implementation. Returning a string creates one user text message. */\n run: (args: Args, ctx: PromptContext<Auth, Services>) => MaybePromise<PromptResultInput>;\n};\n\n/** Branded Sidecar prompt returned by `prompt()`. */\nexport type SidecarPrompt<\n Args extends Record<string, unknown> = Record<string, unknown>,\n Auth = unknown,\n Services = unknown,\n> = PromptDefinition<Args, Auth, Services> & {\n readonly kind: \"sidecar.prompt\";\n};\n\n/** Controls which callers can see or call a tool. */\nexport type ToolVisibility = {\n model?: boolean;\n widgets?: boolean | string[];\n tools?: boolean | string[];\n};\n\n/** ChatGPT compatibility metadata for tool descriptors. */\nexport type ChatGptToolOptions = {\n /** Short status shown while ChatGPT is invoking the tool. */\n invoking?: string;\n /** Short status shown after ChatGPT has invoked the tool. */\n invoked?: string;\n /** Compatibility hint for legacy ChatGPT clients that allow widget tool calls. */\n widgetAccessible?: boolean;\n /** Compatibility visibility hint for legacy ChatGPT clients. */\n visibility?: \"public\" | \"private\";\n /** Top-level input fields that receive ChatGPT file references. */\n fileParams?: readonly string[];\n};\n\n/** Descriptor target used when filtering host-specific metadata. */\nexport type ToolDescriptorTarget = \"mcp\" | \"chatgpt\" | \"claude\";\n\n/** Widget CSP allowlists emitted on the MCP Apps resource metadata. */\nexport type WidgetCspOptions = {\n /** Domains the widget may contact with fetch/XHR. */\n connectDomains?: readonly string[];\n /** Domains the widget may use for static resources. */\n resourceDomains?: readonly string[];\n /** Origins allowed for subframes. Omit unless the widget embeds iframes. */\n frameDomains?: readonly string[];\n /** Allowed base URI origins. Omit to let hosts enforce the secure default. */\n baseUriDomains?: readonly string[];\n};\n\n/** Browser permissions an MCP Apps host may grant to a widget iframe. */\nexport type WidgetPermissionOptions = {\n camera?: boolean;\n microphone?: boolean;\n geolocation?: boolean;\n clipboardWrite?: boolean;\n};\n\n/** ChatGPT-only widget compatibility options. */\nexport type ChatGptWidgetOptions = {\n /** Dedicated widget origin for broad ChatGPT distribution. */\n domain?: string;\n /** Redirect targets for ChatGPT external-link handling. */\n redirectDomains?: readonly string[];\n};\n\n/** Widget resource metadata declared by `widget(...)` in a sibling widget file. */\nexport type ToolWidgetOptions = {\n /** Host-facing summary of what the rendered widget shows. */\n description?: string;\n /** Whether the widget prefers a host-provided border. */\n prefersBorder?: boolean;\n /** Optional dedicated sandbox origin. Host-specific validation still applies. */\n domain?: string;\n /** Standard MCP Apps CSP allowlists. */\n csp?: WidgetCspOptions;\n /** Standard MCP Apps iframe permission requests. */\n permissions?: WidgetPermissionOptions;\n /** Host-specific widget compatibility metadata. */\n hosts?: {\n chatgpt?: ChatGptWidgetOptions;\n };\n};\n\n/** Host-specific extension options. Keep standard MCP fields primary. */\nexport type ToolHostExtensions = {\n chatgpt?: ChatGptToolOptions;\n};\n\n/** Typed auth scope object imported by tool files. */\nexport type AuthScopeDefinition<\n Id extends string = string,\n Auth = unknown,\n> = {\n readonly kind: \"sidecar.scope\";\n readonly id: Id;\n readonly description: string;\n readonly __auth?: Auth;\n};\n\n/** Per-tool authorization policy. Omitted policy means public tool. */\nexport type ToolAuthPolicy<Auth = unknown> =\n | {\n /** This tool intentionally does not require an authenticated session. */\n public: true;\n authenticated?: never;\n scopes?: never;\n }\n | {\n /** This tool requires a valid authenticated session but no specific scope. */\n authenticated: true;\n public?: false;\n scopes?: never;\n }\n | {\n /** This tool requires an authenticated session with every listed scope. */\n scopes: readonly AuthScopeDefinition<string, Auth>[];\n public?: false;\n authenticated?: true;\n };\n\ndeclare const toolResultTypeBrand: unique symbol;\n\n/** User-friendly content accepted by `toolResult()`. */\nexport type ToolResultContent = string | McpContentBlock | McpContentBlock[];\n\n/** Options for a tool result that only needs model-visible content. */\nexport type TextToolResultInput<\n Meta extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Required model-visible content. Sidecar normalizes strings to MCP text blocks. */\n content: ToolResultContent;\n /** Optional host/widget-only data emitted as MCP `_meta`. */\n meta?: Meta;\n /** Marks the tool result as an error while preserving normal MCP result channels. */\n isError?: boolean;\n /** Omitted for content-only results. */\n structuredContent?: undefined;\n};\n\n/** Options for a tool result with typed structured content. */\nexport type StructuredToolResultInput<\n Structured,\n Meta extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Typed machine-readable output validated against the tool output schema when present. */\n structuredContent: Structured;\n /** Required model-visible content. Sidecar normalizes strings to MCP text blocks. */\n content: ToolResultContent;\n /** Optional host/widget-only data emitted as MCP `_meta`. */\n meta?: Meta;\n /** Marks the tool result as an error while preserving normal MCP result channels. */\n isError?: boolean;\n};\n\n/** Options accepted by `toolResult()`. */\nexport type ToolResultInput<\n Structured = undefined,\n Meta extends Record<string, unknown> = Record<string, unknown>,\n> = [Structured] extends [undefined]\n ? TextToolResultInput<Meta>\n : StructuredToolResultInput<Structured, Meta>;\n\n/** Branded Sidecar result returned by every tool execution. */\nexport type ToolResult<\n Structured = undefined,\n Meta extends Record<string, unknown> = Record<string, unknown>,\n> = {\n readonly [toolResultTypeBrand]: true;\n content: McpContentBlock[];\n _meta?: Meta;\n isError?: boolean;\n} & ([Structured] extends [undefined]\n ? { structuredContent?: Structured }\n : { structuredContent: Structured });\n\n/** Normalized MCP tool result returned by the runtime. */\nexport type McpToolResult = {\n structuredContent?: unknown;\n content: McpContentBlock[];\n _meta?: Record<string, unknown>;\n isError?: boolean;\n};\n\n/** Helper used by tools to return MCP-compliant result envelopes. */\nexport type ToolResultFactory = {\n <Meta extends Record<string, unknown> = Record<string, unknown>>(\n input: TextToolResultInput<Meta>\n ): ToolResult<undefined, Meta>;\n <Structured, Meta extends Record<string, unknown> = Record<string, unknown>>(\n input: StructuredToolResultInput<Structured, Meta>\n ): ToolResult<Structured, Meta>;\n text(text: string): McpContentBlock;\n error<\n Structured = undefined,\n Meta extends Record<string, unknown> = Record<string, unknown>,\n >(\n message: string,\n options?: Omit<ToolResultInput<Structured, Meta>, \"content\" | \"isError\">\n ): ToolResult<Structured, Meta>;\n};\n\n/** Logger surface exposed in `ToolContext`. */\nexport type Logger = {\n debug(message: string, data?: Record<string, unknown>): void;\n info(message: string, data?: Record<string, unknown>): void;\n warn(message: string, data?: Record<string, unknown>): void;\n error(message: string, data?: Record<string, unknown>): void;\n};\n\n/** Minimal tracing hook exposed in `ToolContext`. */\nexport type Trace = {\n span<T>(name: string, run: () => MaybePromise<T>): Promise<T>;\n};\n\n/** Tool-scoped storage abstraction for runtimes that provide persistence. */\nexport type ScopedStorage = {\n get<T = unknown>(key: string): Promise<T | undefined>;\n set<T = unknown>(key: string, value: T): Promise<void>;\n delete(key: string): Promise<void>;\n};\n\n/** Request metadata supplied to each tool invocation. */\nexport type ToolRequestContext = {\n id: string;\n signal: AbortSignal;\n host: \"chatgpt\" | \"claude\" | \"unknown\";\n transport: \"streamable-http\" | \"stdio\";\n};\n\n/** Runtime context passed to a tool's `execute` method. */\nexport type ToolContext<Auth = unknown, Services = unknown, Tools = unknown> = {\n auth: Auth;\n request: ToolRequestContext;\n services: Services;\n tools: Tools;\n log: Logger;\n trace: Trace;\n storage: ScopedStorage;\n env: Readonly<Record<string, string | undefined>>;\n};\n\n/** Small subset of Zod-like validation Sidecar can consume without depending on Zod. */\nexport type ZodLikeSchema<T = unknown> = {\n safeParse(value: unknown): { success: true; data: T } | { success: false; error: unknown };\n};\n\n/** Infers a params type from a validator if one is supplied. */\nexport type InferParams<T> = T extends ZodLikeSchema<infer Output> ? Output : T;\n\n/** Function signature for tool execution. */\nexport type ToolExecute<Params, Output, Auth = unknown, Services = unknown, Tools = unknown> = (\n params: Params,\n ctx: ToolContext<Auth, Services, Tools>\n) => MaybePromise<ToolResult<Output>>;\n\n/** Author-facing definition accepted by `tool()`. */\nexport type ToolDefinition<Params = unknown, Output = unknown, Auth = unknown, Services = unknown, Tools = unknown> = {\n /** Human-readable name shown to users and models. */\n name: string;\n /** Optional MCP machine id. If omitted in a reserved tool file, Sidecar uses the folder name. */\n id?: string;\n /** Model-facing description. This should be specific enough for reliable tool selection. */\n description: string;\n /** Optional runtime validation schema. Zod schemas are supported directly. */\n params?: ZodLikeSchema<Params>;\n /** Optional output schema escape hatch. The compiler normally derives this from `execute`. */\n output?: JsonSchema;\n /** MCP tool behavior hints. */\n annotations?: ToolAnnotations;\n /** Optional visibility policy for model, widget, and tool callers. */\n visibility?: ToolVisibility;\n /** Optional host-specific compatibility metadata. */\n hosts?: ToolHostExtensions;\n /** Low-level descriptor metadata escape hatch. Prefer typed fields when available. */\n meta?: Record<string, unknown>;\n /** Optional authorization policy. Tools are public unless this is declared. */\n auth?: ToolAuthPolicy<Auth>;\n /** Tool implementation. It may be synchronous or asynchronous. */\n execute: ToolExecute<Params, Output, Auth, Services, Tools>;\n};\n\n/** Branded Sidecar tool returned by `tool()`. */\nexport type SidecarTool<Params = unknown, Output = unknown, Auth = unknown> = ToolDefinition<Params, Output, Auth> & {\n readonly kind: \"sidecar.tool\";\n};\n\n/** MCP descriptor emitted for `tools/list`. */\nexport type McpToolDescriptor = {\n name: string;\n title?: string;\n description: string;\n inputSchema: JsonSchema;\n outputSchema?: JsonSchema;\n securitySchemes?: SecurityScheme[];\n annotations?: ToolAnnotations;\n _meta?: Record<string, unknown>;\n};\n\n/** Typed skill declaration used by plugin generation. */\nexport type SkillDefinition = {\n /** Stable skill folder/name. */\n name: string;\n /** Short routing description for the host/model. */\n description: string;\n /** Markdown body emitted to SKILL.md. */\n body: string;\n};\n\nconst toolBrand = Symbol.for(\"sidecar.tool\");\nconst toolResultBrand = Symbol.for(\"sidecar.toolResult\");\nconst resourceBrand = Symbol.for(\"sidecar.resource\");\nconst resourceResultBrand = Symbol.for(\"sidecar.resourceResult\");\nconst promptBrand = Symbol.for(\"sidecar.prompt\");\nconst skillBrand = Symbol.for(\"sidecar.skill\");\n\n/**\n * Declares app identity in `sidecar.config.ts`.\n *\n * The compiler reads the object statically, while the helper gives authors\n * editor completions for every supported config field.\n */\nexport function defineConfig(config: SidecarConfig): SidecarConfig {\n if (!config.name.trim()) {\n throw new SidecarDefinitionError(\"Project name is required.\");\n }\n if (!config.version.trim()) {\n throw new SidecarDefinitionError(`Project \"${config.name}\" must include a version.`);\n }\n if (!config.description.trim()) {\n throw new SidecarDefinitionError(`Project \"${config.name}\" must include a description.`);\n }\n\n return Object.freeze({ ...config });\n}\n\n/**\n * Declares a Sidecar MCP tool.\n *\n * The compiler reads this object statically, while the server executes the\n * returned branded value at runtime.\n */\nexport function tool<Params, Output, Auth = unknown>(\n definition: ToolDefinition<Params, Output, Auth>\n): SidecarTool<Params, Output, Auth> {\n if (!definition.name.trim()) {\n throw new SidecarDefinitionError(\"Tool name is required.\");\n }\n if (!definition.description.trim()) {\n throw new SidecarDefinitionError(`Tool \"${definition.name}\" must include a description.`);\n }\n\n return Object.freeze({\n ...definition,\n kind: \"sidecar.tool\" as const,\n [toolBrand]: true\n }) as SidecarTool<Params, Output, Auth>;\n}\n\n/** Returns true when a value was produced by `tool()`. */\nexport function isSidecarTool(value: unknown): value is SidecarTool {\n return Boolean(value && typeof value === \"object\" && (value as Record<symbol, unknown>)[toolBrand]);\n}\n\n/**\n * Declares a Sidecar MCP resource.\n *\n * The compiler fills default URIs from the reserved folder name, while the\n * runtime executes the returned branded value for `resources/read`.\n */\nexport function resource<Auth = unknown, Services = unknown>(\n definition: ResourceDefinition<Auth, Services>\n): SidecarResource<Auth, Services> {\n if (!definition.name.trim()) {\n throw new SidecarDefinitionError(\"Resource name is required.\");\n }\n if (definition.uri) {\n validateResourceUri(definition.uri);\n }\n\n return Object.freeze({\n ...definition,\n kind: \"sidecar.resource\" as const,\n [resourceBrand]: true\n }) as SidecarResource<Auth, Services>;\n}\n\n/** Returns true when a value was produced by `resource()`. */\nexport function isSidecarResource(value: unknown): value is SidecarResource {\n return Boolean(value && typeof value === \"object\" && (value as Record<symbol, unknown>)[resourceBrand]);\n}\n\n/**\n * Declares a Sidecar MCP prompt.\n *\n * The compiler fills default machine names from the reserved folder name and\n * converts `args` into MCP prompt argument descriptors.\n */\nexport function prompt<Args extends Record<string, unknown> = Record<string, unknown>, Auth = unknown>(\n definition: PromptDefinition<Args, Auth>\n): SidecarPrompt<Args, Auth> {\n if (!definition.title.trim()) {\n throw new SidecarDefinitionError(\"Prompt title is required.\");\n }\n\n return Object.freeze({\n ...definition,\n kind: \"sidecar.prompt\" as const,\n [promptBrand]: true\n }) as SidecarPrompt<Args, Auth>;\n}\n\n/** Returns true when a value was produced by `prompt()`. */\nexport function isSidecarPrompt(value: unknown): value is SidecarPrompt {\n return Boolean(value && typeof value === \"object\" && (value as Record<symbol, unknown>)[promptBrand]);\n}\n\n/** Declares a generated skill that can be emitted as `SKILL.md`. */\nexport function skill(definition: SkillDefinition): SkillDefinition {\n if (!definition.name.trim()) {\n throw new SidecarDefinitionError(\"Skill name is required.\");\n }\n if (!definition.description.trim()) {\n throw new SidecarDefinitionError(`Skill \"${definition.name}\" must include a description.`);\n }\n\n return Object.freeze({\n ...definition,\n [skillBrand]: true\n });\n}\n\n/** Factory for standardized tool results and common content blocks. */\nexport const toolResult = Object.assign(\n createToolResult,\n {\n text(text: string): McpContentBlock {\n return { type: \"text\", text };\n },\n error<\n Structured = undefined,\n Meta extends Record<string, unknown> = Record<string, unknown>,\n >(\n message: string,\n options: Omit<ToolResultInput<Structured, Meta>, \"content\" | \"isError\"> = {} as Omit<\n ToolResultInput<Structured, Meta>,\n \"content\" | \"isError\"\n >,\n ): ToolResult<Structured, Meta> {\n return createToolResult({\n ...options,\n structuredContent: (options as { structuredContent?: Structured }).structuredContent,\n content: message,\n isError: true\n } as ToolResultInput<Structured, Meta>);\n }\n }\n) as ToolResultFactory;\n\n/** Factory for standardized resource results. */\nexport const resourceResult = Object.assign(\n createResourceResult,\n {\n many<Meta extends Record<string, unknown> = Record<string, unknown>>(\n input: readonly ResourceResultContentInput<Meta>[],\n ): ResourceResult<Meta> {\n return createResourceResult(input);\n },\n },\n) as ResourceResultFactory;\n\n/** Creates and brands one standardized Sidecar tool result. */\nfunction createToolResult<\n Structured,\n Meta extends Record<string, unknown> = Record<string, unknown>,\n>(input: ToolResultInput<Structured, Meta>): ToolResult<Structured, Meta> {\n const resultEnvelope = stripUndefined({\n structuredContent: input.structuredContent,\n content: normalizeRequiredContent(input.content),\n _meta: input.meta,\n isError: input.isError\n }) as unknown as ToolResult<Structured, Meta>;\n\n Object.defineProperty(resultEnvelope, toolResultBrand, {\n enumerable: false,\n value: true\n });\n\n return resultEnvelope;\n}\n\n/** Creates and brands one standardized Sidecar resource result. */\nfunction createResourceResult<\n Meta extends Record<string, unknown> = Record<string, unknown>,\n>(input: ResourceResultInput<Meta>): ResourceResult<Meta> {\n const contents = Array.isArray(input) ? [...input] : [input];\n if (!contents.length) {\n throw new SidecarRuntimeError(\n \"resourceResult(...) must include at least one content item.\",\n \"invalid_resource_result\",\n );\n }\n\n const resultEnvelope = {\n contents,\n } as ResourceResult<Meta>;\n\n Object.defineProperty(resultEnvelope, resourceResultBrand, {\n enumerable: false,\n value: true,\n });\n\n return resultEnvelope;\n}\n\n/** Returns true when a value was produced by `toolResult()`. */\nexport function isToolResult(value: unknown): value is ToolResult {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (value as Record<symbol, unknown>)[toolResultBrand] === true\n );\n}\n\n/** Returns true when a value was produced by `resourceResult()`. */\nexport function isResourceResult(value: unknown): value is ResourceResult {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (value as Record<symbol, unknown>)[resourceResultBrand] === true\n );\n}\n\n/** Converts a branded Sidecar tool result into an MCP-compliant tool result. */\nexport function normalizeToolResult(value: unknown): McpToolResult {\n if (!isToolResult(value)) {\n throw new SidecarRuntimeError(\n \"Tool execute() must return toolResult({ structuredContent, content, meta }).\",\n \"invalid_tool_result\",\n );\n }\n\n return stripUndefined({\n structuredContent: value.structuredContent,\n content: value.content ?? [],\n _meta: value._meta,\n isError: value.isError\n });\n}\n\n/** Converts a branded Sidecar resource result into an MCP-compliant read result. */\nexport function normalizeResourceResult(\n value: unknown,\n uri: string,\n defaultMimeType?: string,\n): McpResourceReadResult {\n if (!isResourceResult(value)) {\n throw new SidecarRuntimeError(\n \"Resource read() must return resourceResult(...).\",\n \"invalid_resource_result\",\n );\n }\n\n return {\n contents: value.contents.map((content) =>\n normalizeResourceContent(content, uri, defaultMimeType),\n ),\n };\n}\n\n/** Validates params, runs a tool, and normalizes its result for JSON-RPC. */\nexport async function executeTool<Params, Output>(\n sidecarTool: SidecarTool<Params, Output>,\n params: unknown,\n ctx: ToolContext\n): Promise<McpToolResult> {\n const parsedParams = validateParams(sidecarTool, params);\n const value = await sidecarTool.execute(parsedParams, ctx);\n return normalizeToolResult(value);\n}\n\n/** Reads a resource and normalizes its result for JSON-RPC. */\nexport async function executeResource(\n sidecarResource: SidecarResource,\n ctx: ResourceContext,\n options: { uri: string; mimeType?: string },\n): Promise<McpResourceReadResult> {\n const value = await sidecarResource.read(ctx);\n return normalizeResourceResult(value, options.uri, sidecarResource.mimeType ?? options.mimeType);\n}\n\n/** Runs a prompt and normalizes its messages for JSON-RPC. */\nexport async function executePrompt<Args extends Record<string, unknown>>(\n sidecarPrompt: SidecarPrompt<Args>,\n args: unknown,\n ctx: PromptContext,\n): Promise<McpPromptResult> {\n const parsedArgs = validatePromptArgs(sidecarPrompt, args);\n const value = await sidecarPrompt.run(parsedArgs, ctx);\n return normalizePromptResult(value, sidecarPrompt.description);\n}\n\n/** Builds an MCP descriptor from a Sidecar tool definition. */\nexport function createToolDescriptor(definition: {\n name: string;\n id?: string;\n description: string;\n target?: ToolDescriptorTarget;\n inputSchema?: JsonSchema;\n outputSchema?: JsonSchema;\n annotations?: ToolAnnotations;\n visibility?: ToolVisibility;\n hosts?: ToolHostExtensions;\n meta?: Record<string, unknown>;\n auth?: ToolAuthPolicy<unknown>;\n}): McpToolDescriptor {\n const machineName = definition.id ?? toMachineName(definition.name);\n\n validateToolId(machineName);\n const target = definition.target ?? \"mcp\";\n\n return stripUndefined({\n name: machineName,\n title: definition.name,\n description: definition.description,\n inputSchema: definition.inputSchema ?? emptyObjectSchema(),\n outputSchema: definition.outputSchema,\n securitySchemes: securitySchemes(definition.auth),\n annotations: withAnnotationDefaults(definition.annotations),\n _meta: mergeMeta(\n securitySchemesMeta(definition.auth),\n visibilityMeta(definition.visibility),\n target === \"chatgpt\" ? chatGptToolMeta(definition.hosts?.chatgpt) : undefined,\n definition.meta\n )\n });\n}\n\n/** Builds an MCP resource descriptor from a Sidecar resource definition. */\nexport function createResourceDescriptor(definition: {\n name: string;\n uri: string;\n title?: string;\n description?: string;\n mimeType?: string;\n size?: number;\n icons?: readonly McpIcon[];\n annotations?: ResourceAnnotations;\n meta?: Record<string, unknown>;\n}): McpResourceDescriptor {\n validateResourceUri(definition.uri);\n\n return stripUndefined({\n uri: definition.uri,\n name: definition.name,\n title: definition.title,\n description: definition.description,\n mimeType: definition.mimeType,\n size: definition.size,\n icons: definition.icons ? [...definition.icons] : undefined,\n annotations: normalizeAnnotations(definition.annotations),\n _meta: definition.meta,\n });\n}\n\n/** Builds an MCP prompt descriptor from a Sidecar prompt definition. */\nexport function createPromptDescriptor(definition: {\n name: string;\n title: string;\n description?: string;\n args?: PromptArgsDefinition;\n icons?: readonly McpIcon[];\n}): McpPromptDescriptor {\n validatePromptName(definition.name);\n\n return stripUndefined({\n name: definition.name,\n title: definition.title,\n description: definition.description,\n arguments: promptArguments(definition.args),\n icons: definition.icons ? [...definition.icons] : undefined,\n });\n}\n\n/** Converts a Sidecar auth policy into descriptor security schemes. */\nfunction securitySchemes(policy: ToolAuthPolicy<unknown> | undefined): SecurityScheme[] {\n if (!policy || policy.public === true) {\n return [{ type: \"noauth\" }];\n }\n\n if (\"scopes\" in policy && policy.scopes?.length) {\n return [{ type: \"oauth2\", scopes: policy.scopes.map((entry) => entry.id) }];\n }\n\n return [{ type: \"oauth2\", scopes: [] }];\n}\n\n/** Mirrors security schemes into `_meta` for older Apps clients. */\nfunction securitySchemesMeta(policy: ToolAuthPolicy<unknown> | undefined): Record<string, unknown> {\n return {\n securitySchemes: securitySchemes(policy),\n };\n}\n\n/** Returns scope ids required by a tool's auth policy. */\nexport function toolAuthScopes(toolDefinition: Pick<ToolDefinition, \"auth\">): string[] {\n const authPolicy = toolDefinition.auth;\n if (!authPolicy || authPolicy.public === true || !authPolicy.scopes) {\n return [];\n }\n\n return authPolicy.scopes.map((entry) => entry.id);\n}\n\n/** Converts visibility booleans into the standard MCP Apps `_meta.ui.visibility` list. */\nfunction visibilityMeta(visibility: ToolVisibility | undefined): Record<string, unknown> | undefined {\n if (!visibility) {\n return undefined;\n }\n\n const uiVisibility = [\n visibility.model !== false ? \"model\" : undefined,\n visibility.widgets !== false ? \"app\" : undefined\n ].filter(Boolean) as string[];\n\n return {\n ui: {\n visibility: uiVisibility\n }\n };\n}\n\n/** Converts typed ChatGPT options into optional OpenAI compatibility metadata. */\nfunction chatGptToolMeta(options: ChatGptToolOptions | undefined): Record<string, unknown> | undefined {\n if (!options) {\n return undefined;\n }\n\n return stripUndefined({\n \"openai/widgetAccessible\": options.widgetAccessible,\n \"openai/visibility\": options.visibility,\n \"openai/toolInvocation/invoking\": options.invoking,\n \"openai/toolInvocation/invoked\": options.invoked,\n \"openai/fileParams\": options.fileParams ? [...options.fileParams] : undefined\n });\n}\n\n/** Merges descriptor metadata while preserving nested standard `ui` metadata. */\nfunction mergeMeta(\n ...entries: Array<Record<string, unknown> | undefined>\n): Record<string, unknown> | undefined {\n const merged: Record<string, unknown> = {};\n\n for (const entry of entries) {\n if (!entry) {\n continue;\n }\n\n for (const [key, value] of Object.entries(entry)) {\n if (key === \"ui\" && isRecord(value) && isRecord(merged.ui)) {\n merged.ui = { ...merged.ui, ...value };\n } else {\n merged[key] = value;\n }\n }\n }\n\n return Object.keys(merged).length ? stripUndefined(merged) : undefined;\n}\n\n/** Returns true for plain metadata objects. */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\n/** JSON Schema for a tool with no input parameters. */\nexport function emptyObjectSchema(): JsonSchema {\n return {\n type: \"object\",\n properties: {},\n required: [],\n additionalProperties: false\n };\n}\n\n/** Converts a human tool name into a stable MCP machine name. */\nexport function toMachineName(name: string): string {\n return name\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[^A-Za-z0-9._-]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .replace(/_{2,}/g, \"_\")\n .toLowerCase();\n}\n\n/** Throws when a machine tool id is not MCP-safe. */\nexport function validateToolId(id: string): void {\n if (\n !/^[A-Za-z0-9._-]{1,128}$/.test(id) ||\n id === \".\" ||\n id === \"..\" ||\n id.includes(\"/..\") ||\n id.includes(\"../\")\n ) {\n throw new SidecarDefinitionError(\n `Invalid tool id \"${id}\". Tool ids must be 1-128 ASCII letters, digits, dots, hyphens, or underscores.`\n );\n }\n}\n\n/** Throws when a resource URI is not a valid absolute URI. */\nexport function validateResourceUri(uri: string): void {\n try {\n const parsed = new URL(uri);\n if (!parsed.protocol || parsed.hash) {\n throw new Error(\"invalid uri\");\n }\n } catch {\n throw new SidecarDefinitionError(\n `Invalid resource uri \"${uri}\". Resource URIs must be absolute and must not include fragments.`\n );\n }\n}\n\n/** Throws when a prompt machine name is not MCP-safe. */\nexport function validatePromptName(name: string): void {\n if (!/^[A-Za-z0-9._-]{1,128}$/.test(name) || name === \".\" || name === \"..\") {\n throw new SidecarDefinitionError(\n `Invalid prompt name \"${name}\". Prompt names must be 1-128 ASCII letters, digits, dots, hyphens, or underscores.`\n );\n }\n}\n\n/** Applies conservative annotation defaults when a tool omits them. */\nexport function withAnnotationDefaults(annotations: ToolAnnotations | undefined): ToolAnnotations {\n const readOnlyHint = annotations?.readOnlyHint ?? false;\n\n return {\n title: annotations?.title,\n readOnlyHint,\n destructiveHint: annotations?.destructiveHint ?? !readOnlyHint,\n idempotentHint: annotations?.idempotentHint ?? false,\n openWorldHint: annotations?.openWorldHint ?? true\n };\n}\n\n/** Error thrown for invalid Sidecar declarations. */\nexport class SidecarDefinitionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SidecarDefinitionError\";\n }\n}\n\n/** Error thrown while executing a tool. */\nexport class SidecarRuntimeError extends Error {\n constructor(message: string, readonly code: string) {\n super(message);\n this.name = \"SidecarRuntimeError\";\n }\n}\n\n/** Runs optional runtime schema validation before tool execution. */\nfunction validateParams<Params>(sidecarTool: SidecarTool<Params>, params: unknown): Params {\n if (!sidecarTool.params) {\n return (params ?? {}) as Params;\n }\n\n const parsed = sidecarTool.params.safeParse(params ?? {});\n if (parsed.success) {\n return parsed.data;\n }\n\n throw new SidecarRuntimeError(`Invalid parameters for tool \"${sidecarTool.name}\".`, \"invalid_tool_params\");\n}\n\n/** Normalizes required user-friendly result content into MCP content blocks. */\nfunction normalizeRequiredContent(content: ToolResultContent): McpContentBlock[] {\n if (typeof content === \"string\") {\n return [toolResult.text(content)];\n }\n const blocks = Array.isArray(content) ? content : [content];\n if (blocks.length > 0) {\n return blocks;\n }\n\n throw new SidecarRuntimeError(\n \"toolResult({ content }) must include at least one MCP content block.\",\n \"invalid_tool_result\",\n );\n}\n\n/** Converts one friendly resource content item to the MCP wire shape. */\nfunction normalizeResourceContent(\n content: ResourceResultContentInput,\n uri: string,\n defaultMimeType?: string,\n): McpResourceContent {\n const annotations = normalizeAnnotations(content.annotations);\n const meta = content.meta;\n if (isBinaryLike(content.content)) {\n return stripUndefined({\n uri,\n mimeType: content.mimeType ?? defaultMimeType ?? \"application/octet-stream\",\n blob: bytesToBase64(content.content),\n annotations,\n _meta: meta,\n });\n }\n\n if (typeof content.content === \"string\") {\n return stripUndefined({\n uri,\n mimeType: content.mimeType ?? defaultMimeType ?? \"text/plain\",\n text: content.content,\n annotations,\n _meta: meta,\n });\n }\n\n return stripUndefined({\n uri,\n mimeType: content.mimeType ?? defaultMimeType ?? \"application/json\",\n text: JSON.stringify(content.content),\n annotations,\n _meta: meta,\n });\n}\n\n/** Returns true for byte containers that MCP resources must expose as base64 blobs. */\nfunction isBinaryLike(value: unknown): value is Uint8Array | ArrayBuffer {\n return value instanceof ArrayBuffer || value instanceof Uint8Array;\n}\n\n/** Encodes bytes as base64 in Node and browser-compatible runtimes. */\nfunction bytesToBase64(value: Uint8Array | ArrayBuffer): string {\n const bytes = value instanceof ArrayBuffer ? new Uint8Array(value) : value;\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(bytes).toString(\"base64\");\n }\n\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n}\n\n/** Encodes an offset as an opaque base64url cursor. */\nfunction encodeOffsetCursor(offset: number): string {\n return base64UrlEncode(JSON.stringify({ offset }));\n}\n\n/** Decodes an opaque offset cursor produced by `offsetPagination()`. */\nfunction decodeOffsetCursor(cursor: string): number {\n try {\n const decoded = JSON.parse(base64UrlDecode(cursor)) as { offset?: unknown };\n if (typeof decoded.offset !== \"number\" || !Number.isInteger(decoded.offset) || decoded.offset < 0) {\n throw new Error(\"invalid offset\");\n }\n return decoded.offset;\n } catch {\n throw new SidecarRuntimeError(\"Invalid pagination cursor.\", \"invalid_pagination_cursor\");\n }\n}\n\n/** Base64url-encodes UTF-8 text in Node and browser-compatible runtimes. */\nfunction base64UrlEncode(value: string): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(value, \"utf8\").toString(\"base64url\");\n }\n return btoa(value)\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/g, \"\");\n}\n\n/** Base64url-decodes UTF-8 text in Node and browser-compatible runtimes. */\nfunction base64UrlDecode(value: string): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(value, \"base64url\").toString(\"utf8\");\n }\n const padded = value.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\")\n .padEnd(Math.ceil(value.length / 4) * 4, \"=\");\n return atob(padded);\n}\n\n/** Converts Date annotations to the protocol's ISO timestamp string. */\nfunction normalizeAnnotations(\n annotations: ResourceAnnotations | undefined,\n): ResourceAnnotations | undefined {\n if (!annotations) {\n return undefined;\n }\n\n return stripUndefined({\n audience: annotations.audience ? [...annotations.audience] : undefined,\n priority: annotations.priority,\n lastModified: annotations.lastModified instanceof Date\n ? annotations.lastModified.toISOString()\n : annotations.lastModified,\n });\n}\n\n/** Converts friendly prompt argument declarations to MCP descriptors. */\nfunction promptArguments(args: PromptArgsDefinition | undefined): McpPromptArgument[] | undefined {\n if (!args) {\n return undefined;\n }\n\n const entries = Object.entries(args).map(([name, value]) => {\n if (typeof value === \"string\") {\n return { name, description: value, required: true };\n }\n if (isReadonlyArray(value)) {\n return {\n name,\n description: value.length\n ? `One of: ${value.map(String).join(\", \")}.`\n : undefined,\n required: true,\n };\n }\n return {\n name,\n description: value.description,\n required: value.required ?? true,\n };\n });\n\n return entries.length ? entries : undefined;\n}\n\n/** Narrows readonly argument enum arrays. */\nfunction isReadonlyArray(value: PromptArgInput): value is readonly JsonPrimitive[] {\n return Array.isArray(value);\n}\n\n/** Validates required prompt arguments before running a prompt. */\nfunction validatePromptArgs<Args extends Record<string, unknown>>(\n promptDefinition: SidecarPrompt<Args>,\n args: unknown,\n): Args {\n const input = args && typeof args === \"object\" && !Array.isArray(args)\n ? args as Record<string, unknown>\n : {};\n for (const argument of promptArguments(promptDefinition.args) ?? []) {\n if (argument.required !== false && !(argument.name in input)) {\n throw new SidecarRuntimeError(\n `Prompt \"${promptDefinition.name ?? promptDefinition.title}\" is missing required argument \"${argument.name}\".`,\n \"invalid_prompt_args\",\n );\n }\n }\n return input as Args;\n}\n\n/** Converts a prompt's friendly return value into MCP messages. */\nfunction normalizePromptResult(value: PromptResultInput, defaultDescription?: string): McpPromptResult {\n if (typeof value === \"string\") {\n return {\n description: defaultDescription,\n messages: [{\n role: \"user\",\n content: toolResult.text(value),\n }],\n };\n }\n\n if (Array.isArray(value)) {\n return {\n description: defaultDescription,\n messages: value,\n };\n }\n\n if (\"messages\" in value) {\n return {\n description: value.description ?? defaultDescription,\n messages: value.messages,\n };\n }\n\n return {\n description: defaultDescription,\n messages: [value],\n };\n}\n\n/** Removes `undefined` keys so JSON serialization matches MCP expectations. */\nfunction stripUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined)) as T;\n}\n","/** Static analysis for reserved server tool files. */\nimport {\n createToolDescriptor,\n toMachineName,\n type ChatGptToolOptions,\n type ToolHostExtensions,\n type ToolAnnotations,\n type ToolAuthPolicy,\n type ToolVisibility,\n} from \"@sidecar-ai/core\";\nimport { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n Node,\n type Project,\n SyntaxKind,\n type ArrowFunction,\n type CallExpression,\n type FunctionExpression,\n type MethodDeclaration,\n type ObjectLiteralExpression,\n type SourceFile,\n} from \"ts-morph\";\nimport { resolveDefaultExportCall, unwrapExpression } from \"./ast.js\";\nimport { CompilerError } from \"./errors.js\";\nimport { createProject } from \"./project.js\";\nimport { getOutputSchema, getParamsSchema } from \"./schema.js\";\nimport type { SidecarToolManifestEntry } from \"./types.js\";\nimport { existsSyncSafe } from \"./utils.js\";\nimport { findWidget, mergeWidgetMeta, readWidgetOptions, widgetMeta, widgetResourceMeta } from \"./widgets.js\";\nimport type { SidecarSourceVariant, SidecarTarget } from \"./types.js\";\n\ntype AuthScopeCatalog = Record<string, { id: string; description: string }>;\n\n/** Finds all Sidecar tool files under `server/` and returns manifest entries. */\nexport async function analyzeProjectTools(\n rootDir: string,\n options: { target?: SidecarTarget } = {},\n): Promise<SidecarToolManifestEntry[]> {\n const target = options.target ?? \"mcp\";\n const toolFiles = await findToolFiles(path.join(rootDir, \"server\"), target);\n if (toolFiles.length === 0) {\n return [];\n }\n\n const project = createProject(rootDir);\n const authScopes = readAuthScopeCatalog(project, rootDir);\n return toolFiles.map((candidate) =>\n analyzeToolFile(project.addSourceFileAtPath(candidate.filePath), rootDir, {\n target,\n variant: candidate.variant,\n authScopes,\n }),\n );\n}\n\n/** Analyzes one `tool.ts` source file into a compiler manifest entry. */\nexport function analyzeToolFile(\n sourceFile: SourceFile,\n rootDir: string,\n options: { target?: SidecarTarget; variant?: SidecarSourceVariant; authScopes?: AuthScopeCatalog } = {},\n): SidecarToolManifestEntry {\n const target = options.target ?? \"mcp\";\n const variant = options.variant ?? \"shared\";\n const definition = findToolDefinition(sourceFile);\n const absoluteFile = sourceFile.getFilePath();\n const directory = path.basename(path.dirname(absoluteFile));\n const name = getRequiredStringProperty(definition, \"name\", sourceFile);\n const id = getOptionalStringProperty(definition, \"id\") ?? toMachineName(directory);\n const description = getRequiredStringProperty(\n definition,\n \"description\",\n sourceFile,\n );\n const annotations = readAnnotations(definition);\n const visibility = readVisibility(definition);\n const hosts = readHosts(definition);\n const auth = readAuthPolicy(definition, options.authScopes ?? {});\n const execute = getExecuteFunction(definition, sourceFile);\n\n const inputSchema = getParamsSchema(definition, execute);\n const outputSchema = getOutputSchema(definition, execute);\n const descriptor = createToolDescriptor({\n name,\n id,\n description,\n target,\n inputSchema,\n outputSchema,\n annotations,\n visibility,\n hosts,\n auth,\n meta: undefined,\n });\n\n validateWidgetHierarchy(sourceFile, absoluteFile, target, variant);\n\n const widget = findWidget(rootDir, absoluteFile, id, target, variant);\n if (widget) {\n const widgetFile = path.join(rootDir, widget.sourceFile);\n const project = sourceFile.getProject();\n const widgetSourceFile =\n project.getSourceFile(widgetFile) ?? project.addSourceFileAtPath(widgetFile);\n widget.options = {\n description,\n ...readWidgetOptions(widgetSourceFile),\n };\n widget.resourceMeta = widgetResourceMeta(widget.options, target);\n descriptor._meta = mergeWidgetMeta(descriptor._meta, widgetMeta(widget.resourceUri, widget.options, target));\n }\n\n return {\n sourceFile: path.relative(rootDir, absoluteFile),\n variant,\n target,\n directory,\n id,\n name,\n description,\n inputSchema,\n outputSchema,\n annotations,\n visibility,\n widget,\n descriptor,\n };\n}\n\n/** Extracts static auth shape for descriptor security-scheme generation. */\nfunction readAuthPolicy(\n definition: ObjectLiteralExpression,\n authScopes: AuthScopeCatalog,\n): ToolAuthPolicy | undefined {\n const initializer = readObjectProperty(definition, \"auth\");\n if (!initializer) {\n return undefined;\n }\n\n const publicValue = readBooleanProperty(initializer, \"public\");\n if (publicValue === true) {\n return { public: true };\n }\n\n const scopesProperty = initializer.getProperty(\"scopes\");\n if (scopesProperty && Node.isPropertyAssignment(scopesProperty)) {\n return { scopes: readScopeReferences(scopesProperty.getInitializer(), authScopes) };\n }\n\n return { authenticated: true };\n}\n\n/** Extracts auth.ts scope declarations so generated descriptors can name required scopes. */\nfunction readAuthScopeCatalog(project: Project, rootDir: string): AuthScopeCatalog {\n const authPath = path.join(rootDir, \"auth.ts\");\n if (!existsSyncSafe(authPath)) {\n return {};\n }\n\n const sourceFile = project.addSourceFileAtPath(authPath);\n const catalog: AuthScopeCatalog = {};\n for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {\n if (!isNamedCall(call, \"auth\")) {\n continue;\n }\n\n const definition = unwrapExpression(call.getArguments()[0]);\n if (!definition || !Node.isObjectLiteralExpression(definition)) {\n continue;\n }\n\n const scopes = readObjectProperty(definition, \"scopes\");\n if (!scopes) {\n continue;\n }\n\n for (const property of scopes.getProperties()) {\n if (!Node.isPropertyAssignment(property)) {\n continue;\n }\n\n const scope = readScopeCall(property.getInitializer());\n if (scope) {\n catalog[property.getName().replace(/^[\"']|[\"']$/g, \"\")] = scope;\n }\n }\n }\n\n return catalog;\n}\n\n/** Reads a tool auth `scopes: [...]` initializer into Sidecar scope placeholders. */\nfunction readScopeReferences(\n initializer: Node | undefined,\n authScopes: AuthScopeCatalog,\n): NonNullable<Extract<ToolAuthPolicy, { scopes: unknown }>[\"scopes\"]> {\n const expression = unwrapExpression(initializer);\n if (!expression || !Node.isArrayLiteralExpression(expression)) {\n return [];\n }\n\n return expression.getElements().flatMap((element) => {\n const direct = readScopeCall(element);\n if (direct) {\n return [{ kind: \"sidecar.scope\" as const, ...direct }];\n }\n\n const name = scopeReferenceName(element);\n const declared = name ? authScopes[name] : undefined;\n if (declared) {\n return [{ kind: \"sidecar.scope\" as const, ...declared }];\n }\n\n const literal = unwrapExpression(element);\n if (literal && Node.isStringLiteral(literal)) {\n return [{\n kind: \"sidecar.scope\" as const,\n id: literal.getLiteralText(),\n description: \"\",\n }];\n }\n\n return [];\n });\n}\n\n/** Reads `scope(\"id\", \"description\")` helper calls without executing auth.ts. */\nfunction readScopeCall(node: Node | undefined): { id: string; description: string } | undefined {\n const expression = unwrapExpression(node);\n if (!expression || !Node.isCallExpression(expression) || !isNamedCall(expression, \"scope\")) {\n return undefined;\n }\n\n const [idArg, descriptionArg] = expression.getArguments();\n if (!idArg || !Node.isStringLiteral(idArg)) {\n return undefined;\n }\n\n return {\n id: idArg.getLiteralText(),\n description: Node.isStringLiteral(descriptionArg) ? descriptionArg.getLiteralText() : \"\",\n };\n}\n\n/** Returns the final property name from references like `scopes.expensesRead`. */\nfunction scopeReferenceName(node: Node): string | undefined {\n const expression = unwrapExpression(node);\n if (!expression || !Node.isPropertyAccessExpression(expression)) {\n return undefined;\n }\n\n return expression.getName();\n}\n\n/** Returns true for direct or namespace-qualified helper calls. */\nfunction isNamedCall(call: CallExpression, name: string): boolean {\n const callee = call.getExpression().getText();\n return callee === name || callee.endsWith(`.${name}`);\n}\n\n/** Enforces Sidecar's hierarchical reserved-file platform rule. */\nfunction validateWidgetHierarchy(\n sourceFile: SourceFile,\n toolFile: string,\n target: SidecarTarget,\n variant: SidecarSourceVariant,\n): void {\n const directory = path.dirname(toolFile);\n const platformWidget =\n target === \"chatgpt\"\n ? \"widget.openai.tsx\"\n : target === \"claude\"\n ? \"widget.anthropic.tsx\"\n : undefined;\n\n if (!platformWidget || variant !== \"shared\") {\n return;\n }\n\n if (existsSyncSafe(path.join(directory, platformWidget))) {\n const expectedTool =\n target === \"chatgpt\" ? \"tool.openai.ts\" : \"tool.anthropic.ts\";\n throw new CompilerError(\n sourceFile,\n `${platformWidget} requires a sibling ${expectedTool}; platform-specific widgets cannot attach to a shared tool.ts.`,\n );\n }\n}\n\n/** Finds immediate server child tool files in deterministic order. */\ntype ToolFileCandidate = {\n filePath: string;\n variant: SidecarSourceVariant;\n};\n\nasync function findToolFiles(serverDir: string, target: SidecarTarget): Promise<ToolFileCandidate[]> {\n if (!existsSyncSafe(serverDir)) {\n return [];\n }\n\n const entries = await readdir(serverDir, { withFileTypes: true });\n const files: ToolFileCandidate[] = [];\n\n for (const entry of entries) {\n const entryPath = path.join(serverDir, entry.name);\n if (entry.isDirectory()) {\n const candidate = selectToolFile(entryPath, target);\n if (candidate) {\n files.push(candidate);\n }\n }\n }\n\n return files.sort((left, right) => left.filePath.localeCompare(right.filePath));\n}\n\n/** Picks the platform-specific tool file for a target, falling back to shared code. */\nfunction selectToolFile(directory: string, target: SidecarTarget): ToolFileCandidate | undefined {\n const candidates =\n target === \"chatgpt\"\n ? [\n { name: \"tool.openai.ts\", variant: \"openai\" as const },\n { name: \"tool.ts\", variant: \"shared\" as const },\n ]\n : target === \"claude\"\n ? [\n { name: \"tool.anthropic.ts\", variant: \"anthropic\" as const },\n { name: \"tool.ts\", variant: \"shared\" as const },\n ]\n : [{ name: \"tool.ts\", variant: \"shared\" as const }];\n\n for (const candidate of candidates) {\n const filePath = path.join(directory, candidate.name);\n if (existsSyncSafe(filePath)) {\n return { filePath, variant: candidate.variant };\n }\n }\n\n return undefined;\n}\n\n/** Locates the default-exported `tool({ ... })` object literal. */\nfunction findToolDefinition(sourceFile: SourceFile): ObjectLiteralExpression {\n const call = resolveDefaultExportCall(sourceFile, \"tool\");\n if (!call) {\n throw new CompilerError(\n sourceFile,\n \"tool.ts must default-export tool({ ... }) or an identifier initialized with tool({ ... }).\",\n );\n }\n\n const definition = unwrapExpression(call.getArguments()[0]);\n if (!definition || !Node.isObjectLiteralExpression(definition)) {\n throw new CompilerError(\n sourceFile,\n \"tool(...) must receive one object literal.\",\n );\n }\n\n return definition;\n}\n\n/** Reads the supported `execute` declaration shapes from a tool definition. */\nfunction getExecuteFunction(\n definition: ObjectLiteralExpression,\n sourceFile: SourceFile,\n): MethodDeclaration | ArrowFunction | FunctionExpression {\n const property = definition.getProperty(\"execute\");\n if (!property) {\n throw new CompilerError(\n sourceFile,\n \"tool({ ... }) must include an execute method.\",\n );\n }\n\n if (Node.isMethodDeclaration(property)) {\n return property;\n }\n\n if (Node.isPropertyAssignment(property)) {\n const initializer = property.getInitializer();\n if (\n initializer &&\n (Node.isArrowFunction(initializer) ||\n Node.isFunctionExpression(initializer))\n ) {\n return initializer;\n }\n }\n\n throw new CompilerError(\n sourceFile,\n \"execute must be a method, function expression, or arrow function.\",\n );\n}\n\n/** Reads a required string property from the tool object. */\nfunction getRequiredStringProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n sourceFile: SourceFile,\n): string {\n const value = getOptionalStringProperty(definition, propertyName);\n if (value === undefined || !value.trim()) {\n throw new CompilerError(\n sourceFile,\n `tool({ ... }) must include a non-empty ${propertyName} string.`,\n );\n }\n return value;\n}\n\n/** Reads an optional string literal property from the tool object. */\nfunction getOptionalStringProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = property.getInitializer();\n if (!initializer || !Node.isStringLiteral(initializer)) {\n return undefined;\n }\n\n return initializer.getLiteralText();\n}\n\n/** Extracts static MCP annotation hints from the tool object. */\nfunction readAnnotations(\n definition: ObjectLiteralExpression,\n): ToolAnnotations | undefined {\n const property = definition.getProperty(\"annotations\");\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = property.getInitializer();\n if (!initializer || !Node.isObjectLiteralExpression(initializer)) {\n return undefined;\n }\n\n const annotations: ToolAnnotations = {};\n for (const key of [\n \"title\",\n \"readOnlyHint\",\n \"destructiveHint\",\n \"idempotentHint\",\n \"openWorldHint\",\n ] as const) {\n const value = initializer.getProperty(key);\n if (!value || !Node.isPropertyAssignment(value)) {\n continue;\n }\n\n const expression = value.getInitializer();\n if (!expression) {\n continue;\n }\n\n if (key === \"title\" && Node.isStringLiteral(expression)) {\n annotations.title = expression.getLiteralText();\n } else if (\n key !== \"title\" &&\n (expression.getKind() === SyntaxKind.TrueKeyword ||\n expression.getKind() === SyntaxKind.FalseKeyword)\n ) {\n annotations[key] = expression.getKind() === SyntaxKind.TrueKeyword;\n }\n }\n\n return Object.keys(annotations).length ? annotations : undefined;\n}\n\n/** Extracts static Sidecar visibility policy from the tool object. */\nfunction readVisibility(\n definition: ObjectLiteralExpression,\n): ToolVisibility | undefined {\n const initializer = readObjectProperty(definition, \"visibility\");\n if (!initializer) {\n return undefined;\n }\n\n const visibility: ToolVisibility = {};\n for (const key of [\"model\", \"widgets\", \"tools\"] as const) {\n const property = initializer.getProperty(key);\n if (!property || !Node.isPropertyAssignment(property)) {\n continue;\n }\n\n const value = property.getInitializer();\n if (!value) {\n continue;\n }\n\n if (\n value.getKind() === SyntaxKind.TrueKeyword ||\n value.getKind() === SyntaxKind.FalseKeyword\n ) {\n assignVisibility(visibility, key, value.getKind() === SyntaxKind.TrueKeyword);\n } else if (Node.isArrayLiteralExpression(value)) {\n assignVisibility(visibility, key, value\n .getElements()\n .filter(Node.isStringLiteral)\n .map((element) => element.getLiteralText()));\n }\n }\n\n return Object.keys(visibility).length ? visibility : undefined;\n}\n\n/** Assigns a visibility property without losing the precise key type. */\nfunction assignVisibility<Key extends keyof ToolVisibility>(\n visibility: ToolVisibility,\n key: Key,\n value: ToolVisibility[Key],\n): void {\n visibility[key] = value;\n}\n\n/** Extracts supported host-specific extension metadata from the tool object. */\nfunction readHosts(\n definition: ObjectLiteralExpression,\n): ToolHostExtensions | undefined {\n const initializer = readObjectProperty(definition, \"hosts\");\n if (!initializer) {\n return undefined;\n }\n\n const chatgpt = readObjectProperty(initializer, \"chatgpt\");\n if (!chatgpt) {\n return undefined;\n }\n\n const options: ChatGptToolOptions = {};\n const invoking = readStringProperty(chatgpt, \"invoking\");\n const invoked = readStringProperty(chatgpt, \"invoked\");\n const visibility = readStringProperty(chatgpt, \"visibility\");\n const widgetAccessible = readBooleanProperty(chatgpt, \"widgetAccessible\");\n const fileParams = readStringArrayProperty(chatgpt, \"fileParams\");\n\n if (invoking) options.invoking = invoking;\n if (invoked) options.invoked = invoked;\n if (visibility === \"public\" || visibility === \"private\") {\n options.visibility = visibility;\n }\n if (widgetAccessible !== undefined) {\n options.widgetAccessible = widgetAccessible;\n }\n if (fileParams) {\n options.fileParams = fileParams;\n }\n\n return Object.keys(options).length ? { chatgpt: options } : undefined;\n}\n\n/** Reads a nested object literal property, unwrapping `satisfies` expressions. */\nfunction readObjectProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): ObjectLiteralExpression | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isObjectLiteralExpression(initializer)\n ? initializer\n : undefined;\n}\n\n/** Reads a string literal property from an object literal. */\nfunction readStringProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isStringLiteral(initializer)\n ? initializer.getLiteralText()\n : undefined;\n}\n\n/** Reads a boolean literal property from an object literal. */\nfunction readBooleanProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): boolean | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer) {\n return undefined;\n }\n\n if (initializer.getKind() === SyntaxKind.TrueKeyword) {\n return true;\n }\n if (initializer.getKind() === SyntaxKind.FalseKeyword) {\n return false;\n }\n return undefined;\n}\n\n/** Reads a string literal array property from an object literal. */\nfunction readStringArrayProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string[] | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n return undefined;\n }\n\n return initializer\n .getElements()\n .filter(Node.isStringLiteral)\n .map((element) => element.getLiteralText());\n}\n\n/** Drops undefined properties from small parsed option objects. */\nfunction stripUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n","/** Shared ts-morph helpers for reserved Sidecar files. */\nimport {\n Node,\n type CallExpression,\n type SourceFile,\n type VariableDeclaration,\n} from \"ts-morph\";\n\n/**\n * Resolves a default export into a call to the requested authoring helper.\n *\n * This supports both idiomatic shapes:\n *\n * - `export default tool({ ... })`\n * - `const review = tool({ ... }); export default review`\n */\nexport function resolveDefaultExportCall(\n sourceFile: SourceFile,\n helperName: string,\n): CallExpression | undefined {\n const exportAssignment = sourceFile.getExportAssignment(\n (assignment) => !assignment.isExportEquals(),\n );\n const expression = unwrapExpression(exportAssignment?.getExpression());\n const direct = asHelperCall(expression, helperName);\n if (direct) {\n return direct;\n }\n\n if (!expression || !Node.isIdentifier(expression)) {\n return undefined;\n }\n\n const declaration = findVariableDeclaration(sourceFile, expression.getText());\n const initializer = unwrapExpression(declaration?.getInitializer());\n return asHelperCall(initializer, helperName);\n}\n\n/** Removes TypeScript-only wrappers such as `satisfies` from expressions. */\nexport function unwrapExpression(expression: Node | undefined): Node | undefined {\n if (!expression) {\n return undefined;\n }\n\n if (Node.isSatisfiesExpression(expression) || Node.isAsExpression(expression)) {\n return expression.getExpression();\n }\n\n return expression;\n}\n\n/** Returns a helper call when the expression calls exactly that helper. */\nfunction asHelperCall(\n expression: Node | undefined,\n helperName: string,\n): CallExpression | undefined {\n if (!expression || !Node.isCallExpression(expression)) {\n return undefined;\n }\n\n const callee = expression.getExpression().getText();\n return matchesHelperName(callee, helperName) ? expression : undefined;\n}\n\n/** Finds a top-level variable declaration by identifier name. */\nfunction findVariableDeclaration(\n sourceFile: SourceFile,\n name: string,\n): VariableDeclaration | undefined {\n return sourceFile\n .getVariableDeclarations()\n .find((declaration) => declaration.getName() === name);\n}\n\n/** Checks imported, namespaced, and locally scoped helper call names. */\nfunction matchesHelperName(callee: string, helperName: string): boolean {\n return callee === helperName || callee.endsWith(`.${helperName}`);\n}\n","/** Compiler-specific errors include the source file path in their message. */\nimport type { SourceFile } from \"ts-morph\";\n\n/** Error thrown when a reserved file violates Sidecar's authoring contract. */\nexport class CompilerError extends Error {\n constructor(sourceFile: SourceFile, message: string) {\n super(`${sourceFile.getFilePath()}: ${message}`);\n this.name = \"CompilerError\";\n }\n}\n","/** Shared ts-morph project setup for Sidecar reserved-file analyzers. */\nimport path from \"node:path\";\nimport {\n ModuleKind,\n ModuleResolutionKind,\n Project,\n ScriptTarget,\n} from \"ts-morph\";\nimport { existsSyncSafe } from \"./utils.js\";\n\n/** Creates a ts-morph project using the app tsconfig when available. */\nexport function createProject(rootDir: string): Project {\n const tsconfig = path.join(rootDir, \"tsconfig.json\");\n\n return new Project({\n tsConfigFilePath: existsSyncSafe(tsconfig) ? tsconfig : undefined,\n compilerOptions: existsSyncSafe(tsconfig)\n ? undefined\n : {\n allowJs: false,\n baseUrl: process.cwd(),\n esModuleInterop: true,\n module: ModuleKind.NodeNext,\n moduleResolution: ModuleResolutionKind.NodeNext,\n paths: devSidecarTypePaths(),\n strict: true,\n target: ScriptTarget.ES2022,\n },\n skipAddingFilesFromTsConfig: true,\n });\n}\n\n/** Provides source aliases for repo-local examples before package dist exists. */\nfunction devSidecarTypePaths(): Record<string, string[]> | undefined {\n const repoRoot = process.cwd();\n const corePath = path.join(repoRoot, \"packages\", \"core\", \"src\", \"index.ts\");\n if (!existsSyncSafe(corePath)) {\n return undefined;\n }\n\n return {\n \"sidecar-ai\": [\"packages/sidecar-ai/src/index.ts\"],\n \"@sidecar-ai/core\": [\"packages/core/src/index.ts\"],\n \"@sidecar-ai/client\": [\"packages/client/src/index.ts\"],\n \"@sidecar-ai/react\": [\"packages/react/src/index.ts\"],\n \"@sidecar-ai/native\": [\"packages/native/src/index.ts\"],\n \"@sidecar-ai/native/components\": [\"packages/native/src/components/index.tsx\"],\n \"@sidecar-ai/openai\": [\"packages/openai/src/index.ts\"],\n \"@sidecar-ai/openai/components\": [\"packages/openai/src/components.tsx\"],\n \"@sidecar-ai/anthropic\": [\"packages/anthropic/src/index.ts\"],\n \"@sidecar-ai/anthropic/components\": [\"packages/anthropic/src/components.tsx\"],\n \"@sidecar-ai/anthropic/plugin\": [\"packages/anthropic/src/plugin.ts\"],\n \"@sidecar-ai/anthropic/hooks\": [\"packages/anthropic/src/hooks.ts\"],\n };\n}\n","/** Shared compiler utility helpers. */\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\n\n/** Safe filesystem existence check wrapped for testability and consistency. */\nexport function existsSyncSafe(filePath: string): boolean {\n return existsSync(filePath);\n}\n\n/** Creates an ESM import specifier from one file location to another. */\nexport function toImportSpecifier(\n fromDir: string,\n toFile: string,\n options: { extension?: \"none\" | \"js\" | \"preserve\" } = {},\n): string {\n const relative = path.relative(fromDir, toFile).replaceAll(path.sep, \"/\");\n const normalized = relative.startsWith(\".\") ? relative : `./${relative}`;\n\n switch (options.extension ?? \"none\") {\n case \"js\":\n return normalized.replace(/\\.(tsx|ts)$/, \".js\");\n case \"preserve\":\n return normalized;\n case \"none\":\n return normalized.replace(/\\.(tsx|ts)$/, \"\");\n }\n}\n\n/** Converts a tool id into a valid JavaScript property identifier. */\nexport function toIdentifier(value: string): string {\n const identifier = value\n .replace(/[^A-Za-z0-9]+(.)/g, (_match, char: string) => char.toUpperCase())\n .replace(/^[^A-Za-z_$]+/, \"\")\n .replace(/[^A-Za-z0-9_$]/g, \"\");\n\n return identifier || \"tool\";\n}\n\n/** Sanitizes a value for use as a path segment. */\nexport function safePathSegment(value: string): string {\n const segment = value.replace(/[^A-Za-z0-9._-]+/g, \"_\");\n if (!segment || segment === \".\" || segment === \"..\") {\n return \"_\";\n }\n return segment;\n}\n\n/** Sanitizes a metadata-provided file stem for generated plugin files. */\nexport function safeFileStem(value: string): string {\n return safePathSegment(value).replace(/^\\.+/, \"_\").replace(/^_+/, \"_\");\n}\n\n/** Escapes a scalar value for simple YAML/frontmatter generation. */\nexport function yamlScalar(value: unknown): string {\n return JSON.stringify(String(value ?? \"\"));\n}\n\n/** Escapes text that will be embedded into HTML. */\nexport function escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\");\n}\n\n/** Drops undefined values from JSON-like objects before writing files. */\nexport function stripUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n\n/** Reads a simple string property from a TypeScript object literal string. */\nexport function readObjectString(source: string, key: string): string | undefined {\n const match = source.match(\n new RegExp(`${key}\\\\s*:\\\\s*([\"'\\`])([\\\\s\\\\S]*?)\\\\1`),\n );\n return match?.[2]?.trim();\n}\n\n/** Reads a simple string array property from a TypeScript object literal string. */\nexport function readObjectStringArray(\n source: string,\n key: string,\n): string[] | undefined {\n const match = source.match(new RegExp(`${key}\\\\s*:\\\\s*\\\\[([\\\\s\\\\S]*?)\\\\]`));\n if (!match?.[1]) {\n return undefined;\n }\n\n return [...match[1].matchAll(/[\"']([^\"']+)[\"']/g)]\n .map((item) => item[1]!)\n .filter(Boolean);\n}\n","/** TypeScript and lightweight Zod-to-JSON-Schema extraction. */\nimport { emptyObjectSchema, type JsonSchema } from \"@sidecar-ai/core\";\nimport {\n Node,\n type ArrowFunction,\n type FunctionExpression,\n type MethodDeclaration,\n type ObjectLiteralExpression,\n type PropertyAssignment,\n type Symbol as MorphSymbol,\n type Type,\n} from \"ts-morph\";\n\n/** Supported AST nodes that can execute a Sidecar tool. */\nexport type ExecutableNode = MethodDeclaration | ArrowFunction | FunctionExpression;\n\n/** Builds the input schema from explicit params or the execute param type. */\nexport function getParamsSchema(\n definition: ObjectLiteralExpression,\n execute: ExecutableNode,\n): JsonSchema {\n const explicitParams = definition.getProperty(\"params\");\n if (explicitParams && Node.isPropertyAssignment(explicitParams)) {\n const inferred = getSchemaFromZodProperty(explicitParams);\n if (inferred) {\n return inferred;\n }\n }\n\n const [params] = execute.getParameters();\n if (!params) {\n return emptyObjectSchema();\n }\n\n return typeToJsonSchema(\n params.getType(),\n schemaDescription(params.getSymbol()),\n );\n}\n\n/** Builds the output schema from explicit output or the execute return type. */\nexport function getOutputSchema(\n definition: ObjectLiteralExpression,\n execute: ExecutableNode,\n): JsonSchema | undefined {\n const explicitOutput = definition.getProperty(\"output\");\n if (explicitOutput && Node.isPropertyAssignment(explicitOutput)) {\n return undefined;\n }\n\n const returnType = unwrapToolResultType(unwrapPromiseType(execute.getReturnType()));\n if (returnType.isVoid() || returnType.isUndefined()) {\n return undefined;\n }\n\n return typeToJsonSchema(returnType);\n}\n\n/** Extracts a small JSON Schema subset from `params: z.object(...)`. */\nfunction getSchemaFromZodProperty(\n property: PropertyAssignment,\n): JsonSchema | undefined {\n const initializer = property.getInitializer();\n if (!initializer) {\n return undefined;\n }\n\n if (\n Node.isCallExpression(initializer) &&\n initializer.getExpression().getText().endsWith(\".object\")\n ) {\n const [shape] = initializer.getArguments();\n if (shape && Node.isObjectLiteralExpression(shape)) {\n return zodObjectLiteralToSchema(shape);\n }\n }\n\n return undefined;\n}\n\n/** Converts a Zod object literal shape into JSON Schema. */\nfunction zodObjectLiteralToSchema(shape: ObjectLiteralExpression): JsonSchema {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const property of shape.getProperties()) {\n if (!Node.isPropertyAssignment(property)) {\n continue;\n }\n\n const name = property.getName().replace(/^[\"']|[\"']$/g, \"\");\n const initializer = property.getInitializer();\n if (!initializer) {\n continue;\n }\n\n const propertySchema = zodExpressionToSchema(initializer);\n properties[name] = propertySchema.schema;\n if (!propertySchema.optional) {\n required.push(name);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n };\n}\n\n/** Converts a supported Zod expression into a property schema. */\nfunction zodExpressionToSchema(expression: Node): {\n schema: JsonSchema;\n optional: boolean;\n} {\n const text = expression.getText();\n const optional = /\\.optional\\(\\)/.test(text) || /\\.default\\(/.test(text);\n const schema: JsonSchema = {};\n\n if (/z\\.string\\(\\)/.test(text)) {\n schema.type = \"string\";\n } else if (/z\\.number\\(\\)/.test(text)) {\n schema.type = \"number\";\n } else if (/z\\.boolean\\(\\)/.test(text)) {\n schema.type = \"boolean\";\n } else if (/z\\.array\\(/.test(text)) {\n schema.type = \"array\";\n schema.items = {};\n } else {\n schema.type = \"object\";\n }\n\n const min = text.match(/\\.min\\((\\d+)/);\n const max = text.match(/\\.max\\((\\d+)/);\n if (schema.type === \"string\") {\n if (min) schema.minLength = Number(min[1]);\n if (max) schema.maxLength = Number(max[1]);\n } else {\n if (min) schema.minimum = Number(min[1]);\n if (max) schema.maximum = Number(max[1]);\n }\n\n if (/\\.int\\(\\)/.test(text)) {\n schema.type = \"integer\";\n }\n\n return { schema, optional };\n}\n\n/** Converts a TypeScript type into a JSON Schema object. */\nfunction typeToJsonSchema(type: Type, description?: string): JsonSchema {\n const withoutUndefined = removeUndefined(type);\n const schema = typeToJsonSchemaInner(withoutUndefined);\n if (description) {\n schema.description = description;\n }\n return schema;\n}\n\n/** Recursively maps TypeScript primitives, unions, arrays, tuples, and objects. */\nfunction typeToJsonSchemaInner(type: Type): JsonSchema {\n if (type.isString() || type.isStringLiteral()) {\n return literalOrPrimitive(type, \"string\");\n }\n if (type.isNumber() || type.isNumberLiteral()) {\n return literalOrPrimitive(type, \"number\");\n }\n if (type.isBoolean() || type.isBooleanLiteral()) {\n return literalOrPrimitive(type, \"boolean\");\n }\n if (type.isNull()) {\n return { type: \"null\" };\n }\n if (type.isArray()) {\n return {\n type: \"array\",\n items: typeToJsonSchema(type.getArrayElementTypeOrThrow()),\n };\n }\n if (type.isTuple()) {\n const elements = type.getTupleElements();\n return {\n type: \"array\",\n items:\n elements.length === 1\n ? typeToJsonSchema(elements[0]!)\n : { anyOf: elements.map((item) => typeToJsonSchema(item)) },\n };\n }\n if (type.isUnion()) {\n const parts = type.getUnionTypes().filter((part) => !part.isUndefined());\n if (parts.every(isLiteralType)) {\n return { enum: parts.map((part) => literalValue(part)) };\n }\n return { anyOf: parts.map((part) => typeToJsonSchema(part)) };\n }\n\n const properties = type.getProperties();\n if (properties.length > 0) {\n return objectTypeToSchema(properties);\n }\n\n return {};\n}\n\n/** Converts object properties into JSON Schema properties and required lists. */\nfunction objectTypeToSchema(properties: MorphSymbol[]): JsonSchema {\n const schemaProperties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const property of properties) {\n const declaration =\n property.getValueDeclaration() ?? property.getDeclarations()[0];\n if (!declaration) {\n continue;\n }\n\n const name = property.getName();\n const rawType = property.getTypeAtLocation(declaration);\n const propertyType = removeUndefined(rawType);\n const propertySchema = typeToJsonSchema(\n propertyType,\n schemaDescription(property),\n );\n schemaProperties[name] = propertySchema;\n\n if (!property.isOptional() && !containsUndefined(rawType)) {\n required.push(name);\n }\n }\n\n return {\n type: \"object\",\n properties: schemaProperties,\n required,\n additionalProperties: false,\n };\n}\n\n/** Returns a literal const schema when possible, otherwise a primitive schema. */\nfunction literalOrPrimitive(\n type: Type,\n primitive: \"string\" | \"number\" | \"boolean\",\n): JsonSchema {\n if (isLiteralType(type)) {\n return { const: literalValue(type) };\n }\n return { type: primitive };\n}\n\n/** Returns true for literal string, number, and boolean types. */\nfunction isLiteralType(type: Type): boolean {\n return (\n type.isStringLiteral() || type.isNumberLiteral() || type.isBooleanLiteral()\n );\n}\n\n/** Reads a JavaScript literal value from a TypeScript literal type. */\nfunction literalValue(type: Type): string | number | boolean {\n if (type.isStringLiteral()) return String(type.getLiteralValue());\n if (type.isNumberLiteral()) return Number(type.getLiteralValue());\n const text = type.getText();\n return text === \"true\";\n}\n\n/** Unwraps `Promise<T>` return types for output schema inference. */\nfunction unwrapPromiseType(type: Type): Type {\n if (!type.getText().startsWith(\"Promise<\")) {\n return type;\n }\n const args = type.getTypeArguments();\n return args[0] ?? type;\n}\n\n/** Extracts the structured content type from Sidecar's required `ToolResult<T>`. */\nfunction unwrapToolResultType(type: Type): Type {\n const aliasName = type.getAliasSymbol()?.getName();\n if (aliasName === \"ToolResult\") {\n const [structured] = type.getAliasTypeArguments();\n return structured ?? type;\n }\n\n const structured = type.getProperty(\"structuredContent\");\n const declaration = structured?.getValueDeclaration() ?? structured?.getDeclarations()[0];\n if (!structured || !declaration) {\n return type;\n }\n\n return removeUndefined(structured.getTypeAtLocation(declaration));\n}\n\n/** Removes `undefined` from simple union types. */\nfunction removeUndefined(type: Type): Type {\n if (!type.isUnion()) {\n return type;\n }\n\n const nonUndefined = type\n .getUnionTypes()\n .filter((part) => !part.isUndefined());\n return nonUndefined.length === 1 ? nonUndefined[0]! : type;\n}\n\n/** Returns true when a union includes `undefined`. */\nfunction containsUndefined(type: Type): boolean {\n return (\n type.isUnion() && type.getUnionTypes().some((part) => part.isUndefined())\n );\n}\n\n/** Reads the first JSDoc description attached to a symbol. */\nfunction schemaDescription(\n symbol: MorphSymbol | undefined,\n): string | undefined {\n if (!symbol) {\n return undefined;\n }\n\n return symbol\n .getDeclarations()\n .flatMap((declaration) => {\n if (Node.isJSDocable(declaration)) {\n return declaration.getJsDocs().map((doc) => doc.getCommentText() ?? \"\");\n }\n return [];\n })\n .find((comment) => comment.trim().length > 0);\n}\n","/** Widget discovery and HTML bundling. */\nimport { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { build as esbuild } from \"esbuild\";\nimport postcss from \"postcss\";\nimport {\n Node,\n SyntaxKind,\n type ObjectLiteralExpression,\n type SourceFile,\n} from \"ts-morph\";\nimport type { ChatGptWidgetOptions, ToolWidgetOptions } from \"@sidecar-ai/core\";\nimport { resolveDefaultExportCall, unwrapExpression } from \"./ast.js\";\nimport { CompilerError } from \"./errors.js\";\nimport type { SidecarSourceVariant, SidecarTarget, SidecarToolManifestEntry, SidecarWidgetManifestEntry } from \"./types.js\";\nimport { escapeHtml, safePathSegment, toImportSpecifier } from \"./utils.js\";\n\n/** Bundles every discovered `widget.tsx` into a content-hashed HTML resource. */\nexport async function buildWidgets(\n rootDir: string,\n outDir: string,\n tools: SidecarToolManifestEntry[],\n): Promise<void> {\n const widgets = tools.filter(\n (\n entry,\n ): entry is SidecarToolManifestEntry & {\n widget: SidecarWidgetManifestEntry;\n } => Boolean(entry.widget),\n );\n if (!widgets.length) {\n return;\n }\n\n const cacheDir = path.join(rootDir, \".sidecar\", \"cache\", \"widgets\");\n await mkdir(cacheDir, { recursive: true });\n const appStyle = await prepareAppStyle(rootDir, cacheDir);\n\n for (const entry of widgets) {\n const sourceFile = path.join(rootDir, entry.widget.sourceFile);\n const safeId = safePathSegment(entry.id);\n const entryFile = path.join(cacheDir, `${safeId}.entry.tsx`);\n const importPath = toImportSpecifier(path.dirname(entryFile), sourceFile);\n\n await writeFile(\n entryFile,\n `import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { SidecarWidgetRoot } from \"@sidecar-ai/react\";\nimport \"@sidecar-ai/native/styles.css\";\n${appStyle ? `import ${JSON.stringify(toImportSpecifier(path.dirname(entryFile), appStyle))};` : \"\"}\nimport Component from ${JSON.stringify(importPath)};\n\ncreateRoot(document.getElementById(\"root\")!).render(\n React.createElement(SidecarWidgetRoot, null, React.createElement(Component))\n);\n`,\n );\n\n const bundled = await esbuild({\n absWorkingDir: rootDir,\n alias: devSidecarBundleAliases(rootDir),\n bundle: true,\n entryPoints: [entryFile],\n format: \"iife\",\n jsx: \"automatic\",\n minify: false,\n nodePaths: [\n path.join(rootDir, \"node_modules\"),\n path.join(process.cwd(), \"node_modules\"),\n ],\n outfile: \"widget.js\",\n platform: \"browser\",\n sourcemap: false,\n write: false,\n });\n\n const javascript = bundled.outputFiles.find((file) => file.path.endsWith(\".js\"))?.text ?? \"\";\n const css = bundled.outputFiles\n .filter((file) => file.path.endsWith(\".css\"))\n .map((file) => file.text)\n .join(\"\\n\");\n const html = renderWidgetHtml(entry.name, javascript, css);\n const hash = createHash(\"sha256\").update(html).digest(\"hex\").slice(0, 12);\n const outputDir = path.join(outDir, \"public\", \"widgets\", safeId);\n const outputFile = path.join(outputDir, `widget.${hash}.html`);\n const resourceUri = `ui://${safeId}/widget.${hash}.html`;\n\n await mkdir(outputDir, { recursive: true });\n await writeFile(outputFile, html);\n\n entry.widget.resourceUri = resourceUri;\n entry.widget.resourceMeta = widgetResourceMeta(entry.widget.options, entry.target);\n entry.widget.outputFile = path.relative(outDir, outputFile);\n entry.descriptor._meta = mergeWidgetMeta(entry.descriptor._meta, widgetMeta(resourceUri, entry.widget.options, entry.target));\n }\n}\n\n/** Provides source aliases when bundling repo-local examples before dist exists. */\nfunction devSidecarBundleAliases(rootDir: string): Record<string, string> | undefined {\n const repoRoot = findSidecarRepoRoot(rootDir) ?? findSidecarRepoRoot(process.cwd());\n if (!repoRoot) {\n return undefined;\n }\n const reactEntry = path.join(repoRoot, \"packages\", \"react\", \"src\", \"index.ts\");\n if (!existsSync(reactEntry)) {\n return undefined;\n }\n\n return {\n \"sidecar-ai\": path.join(repoRoot, \"packages\", \"sidecar-ai\", \"src\", \"index.ts\"),\n \"@sidecar-ai/client\": path.join(repoRoot, \"packages\", \"client\", \"src\", \"index.ts\"),\n \"@sidecar-ai/core\": path.join(repoRoot, \"packages\", \"core\", \"src\", \"index.ts\"),\n \"@sidecar-ai/react\": reactEntry,\n \"@sidecar-ai/native\": path.join(repoRoot, \"packages\", \"native\", \"src\", \"index.ts\"),\n \"@sidecar-ai/native/components\": path.join(repoRoot, \"packages\", \"native\", \"src\", \"components\", \"index.tsx\"),\n \"@sidecar-ai/native/styles.css\": path.join(repoRoot, \"packages\", \"native\", \"src\", \"styles.css\"),\n };\n}\n\n/** Finds the repository root for source aliases used by local workspace tests. */\nfunction findSidecarRepoRoot(startDir: string): string | undefined {\n let current = path.resolve(startDir);\n while (true) {\n if (existsSync(path.join(current, \"packages\", \"core\", \"src\", \"index.ts\"))) {\n return current;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n return undefined;\n }\n current = parent;\n }\n}\n\n/** Copies and optionally processes root `style.css` for widget builds. */\nasync function prepareAppStyle(rootDir: string, cacheDir: string): Promise<string | undefined> {\n const sourceFile = path.join(rootDir, \"style.css\");\n if (!existsSync(sourceFile)) {\n return undefined;\n }\n\n const source = await readFile(sourceFile, \"utf8\");\n const css = await processAppStyle(source, sourceFile);\n const outputFile = path.join(cacheDir, \"style.css\");\n await writeFile(outputFile, css);\n return outputFile;\n}\n\n/** Runs Tailwind/PostCSS only when the app stylesheet needs it. */\nasync function processAppStyle(source: string, from: string): Promise<string> {\n if (!needsPostcss(source)) {\n return source;\n }\n\n const cssSource = source\n .replace(/@import\\s+[\"']tailwindcss[\"'];?/g, \"@tailwind utilities;\")\n .replace(/@import\\s+[\"']@openai\\/apps-sdk-ui\\/css[\"'];?/g, \"\");\n const plugins = [];\n if (cssSource.includes(\"@tailwind\")) {\n const tailwind = await import(\"@tailwindcss/postcss\");\n plugins.push(tailwind.default({ base: path.dirname(from) }));\n }\n\n const autoprefixer = await import(\"autoprefixer\");\n plugins.push(autoprefixer.default());\n\n const result = await postcss(plugins).process(cssSource, {\n from,\n map: false,\n });\n return result.css;\n}\n\n/** Returns true when CSS contains framework directives that esbuild does not own. */\nfunction needsPostcss(source: string): boolean {\n return /@import\\s+[\"']tailwindcss[\"']|@tailwind|@source|@theme|@plugin/.test(source);\n}\n\n/** Finds a sibling `widget.tsx` for a tool file. */\nexport function findWidget(\n rootDir: string,\n toolFile: string,\n id: string,\n target: SidecarTarget = \"mcp\",\n toolVariant: SidecarSourceVariant = \"shared\",\n): SidecarWidgetManifestEntry | undefined {\n const selected = selectWidgetFile(path.dirname(toolFile), target, toolVariant);\n if (!selected) {\n return undefined;\n }\n\n const safeId = safePathSegment(id);\n return {\n sourceFile: path.relative(rootDir, selected.filePath),\n variant: selected.variant,\n resourceUri: `ui://${safeId}/widget.html`,\n };\n}\n\n/** Extracts `widget({ ... }, Component)` metadata from a widget source file. */\nexport function readWidgetOptions(\n sourceFile: SourceFile,\n): ToolWidgetOptions | undefined {\n const definition = findWidgetDefinition(sourceFile);\n if (!definition) {\n return undefined;\n }\n\n const options: ToolWidgetOptions = {};\n const description = readStringProperty(definition, \"description\");\n const prefersBorder = readBooleanProperty(definition, \"prefersBorder\");\n const csp = readWidgetCsp(definition);\n const permissions = readWidgetPermissions(definition);\n const chatgpt = readChatGptWidgetOptions(definition);\n const domain = readStringProperty(definition, \"domain\");\n\n if (description) options.description = description;\n if (prefersBorder !== undefined) options.prefersBorder = prefersBorder;\n if (domain) options.domain = domain;\n if (csp) options.csp = csp;\n if (permissions) options.permissions = permissions;\n if (chatgpt) options.hosts = { chatgpt };\n\n return Object.keys(options).length ? options : undefined;\n}\n\n/** Builds standard tool-to-widget and ChatGPT-compatible metadata for a descriptor. */\nexport function widgetMeta(\n resourceUri: string,\n options: ToolWidgetOptions = {},\n target: SidecarTarget = \"mcp\",\n): Record<string, unknown> {\n const chatgptCsp = {\n connect_domains: options.csp?.connectDomains ? [...options.csp.connectDomains] : [],\n resource_domains: options.csp?.resourceDomains ? [...options.csp.resourceDomains] : [],\n frame_domains: options.csp?.frameDomains ? [...options.csp.frameDomains] : undefined,\n redirect_domains: options.hosts?.chatgpt?.redirectDomains\n ? [...options.hosts.chatgpt.redirectDomains]\n : undefined,\n };\n\n const standard = {\n ui: {\n resourceUri,\n },\n };\n\n if (target !== \"chatgpt\") {\n return standard;\n }\n\n return {\n ...standard,\n \"openai/outputTemplate\": resourceUri,\n \"openai/widgetDescription\": options.description,\n \"openai/widgetDomain\": options.hosts?.chatgpt?.domain,\n \"openai/widgetCSP\": stripUndefined(chatgptCsp),\n };\n}\n\n/** Builds MCP Apps metadata for the `ui://` resource content. */\nexport function widgetResourceMeta(\n options: ToolWidgetOptions = {},\n target: SidecarTarget = \"mcp\",\n): Record<string, unknown> | undefined {\n const csp = stripUndefined({\n connectDomains: options.csp?.connectDomains ? [...options.csp.connectDomains] : [],\n resourceDomains: options.csp?.resourceDomains ? [...options.csp.resourceDomains] : [],\n frameDomains: options.csp?.frameDomains ? [...options.csp.frameDomains] : undefined,\n baseUriDomains: options.csp?.baseUriDomains ? [...options.csp.baseUriDomains] : undefined,\n });\n const permissions = widgetPermissionsMeta(options);\n const ui = stripUndefined({\n csp,\n permissions,\n domain: options.domain ?? (target === \"chatgpt\" ? options.hosts?.chatgpt?.domain : undefined),\n prefersBorder: options.prefersBorder,\n });\n\n return Object.keys(ui).length ? { ui } : undefined;\n}\n\n/** Locates the default-exported widget helper call when a widget uses one. */\nfunction findWidgetDefinition(\n sourceFile: SourceFile,\n): ObjectLiteralExpression | undefined {\n const call = resolveDefaultExportCall(sourceFile, \"widget\");\n if (!call) {\n return undefined;\n }\n\n const definition = unwrapExpression(call.getArguments()[0]);\n if (!definition || !Node.isObjectLiteralExpression(definition)) {\n throw new CompilerError(\n sourceFile,\n \"widget(...) must receive its metadata object as the first argument.\",\n );\n }\n\n return definition;\n}\n\n/** Reads standard widget CSP options. */\nfunction readWidgetCsp(\n definition: ObjectLiteralExpression,\n): ToolWidgetOptions[\"csp\"] | undefined {\n const initializer = readObjectProperty(definition, \"csp\");\n if (!initializer) {\n return undefined;\n }\n\n const csp = {\n connectDomains: readStringArrayProperty(initializer, \"connectDomains\"),\n resourceDomains: readStringArrayProperty(initializer, \"resourceDomains\"),\n frameDomains: readStringArrayProperty(initializer, \"frameDomains\"),\n baseUriDomains: readStringArrayProperty(initializer, \"baseUriDomains\"),\n };\n return stripUndefined(csp);\n}\n\n/** Reads standard MCP Apps permission requests. */\nfunction readWidgetPermissions(\n definition: ObjectLiteralExpression,\n): ToolWidgetOptions[\"permissions\"] | undefined {\n const initializer = readObjectProperty(definition, \"permissions\");\n if (!initializer) {\n return undefined;\n }\n\n const permissions = {\n camera: readBooleanProperty(initializer, \"camera\"),\n microphone: readBooleanProperty(initializer, \"microphone\"),\n geolocation: readBooleanProperty(initializer, \"geolocation\"),\n clipboardWrite: readBooleanProperty(initializer, \"clipboardWrite\"),\n };\n return stripUndefined(permissions);\n}\n\n/** Converts boolean permission flags into the standard empty-object shape. */\nfunction widgetPermissionsMeta(options: ToolWidgetOptions): Record<string, unknown> | undefined {\n const permissions = options.permissions;\n if (!permissions) {\n return undefined;\n }\n\n const meta = stripUndefined({\n camera: permissions.camera ? {} : undefined,\n microphone: permissions.microphone ? {} : undefined,\n geolocation: permissions.geolocation ? {} : undefined,\n clipboardWrite: permissions.clipboardWrite ? {} : undefined,\n });\n return Object.keys(meta).length ? meta : undefined;\n}\n\n/** Reads ChatGPT-only widget compatibility options. */\nfunction readChatGptWidgetOptions(\n definition: ObjectLiteralExpression,\n): ChatGptWidgetOptions | undefined {\n const hosts = readObjectProperty(definition, \"hosts\");\n const chatgpt = hosts ? readObjectProperty(hosts, \"chatgpt\") : undefined;\n if (!chatgpt) {\n return undefined;\n }\n\n const options = {\n domain: readStringProperty(chatgpt, \"domain\"),\n redirectDomains: readStringArrayProperty(chatgpt, \"redirectDomains\"),\n };\n return stripUndefined(options);\n}\n\n/** Reads a nested object literal property, unwrapping TS-only expressions. */\nfunction readObjectProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): ObjectLiteralExpression | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isObjectLiteralExpression(initializer)\n ? initializer\n : undefined;\n}\n\n/** Reads a string literal property from an object literal. */\nfunction readStringProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isStringLiteral(initializer)\n ? initializer.getLiteralText()\n : undefined;\n}\n\n/** Reads a boolean literal property from an object literal. */\nfunction readBooleanProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): boolean | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer) {\n return undefined;\n }\n\n if (initializer.getKind() === SyntaxKind.TrueKeyword) {\n return true;\n }\n if (initializer.getKind() === SyntaxKind.FalseKeyword) {\n return false;\n }\n return undefined;\n}\n\n/** Reads a string literal array property from an object literal. */\nfunction readStringArrayProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string[] | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n return undefined;\n }\n\n return initializer\n .getElements()\n .filter(Node.isStringLiteral)\n .map((element) => element.getLiteralText());\n}\n\n/** Selects the widget source for a target, preferring platform overrides. */\nfunction selectWidgetFile(\n directory: string,\n target: SidecarTarget,\n toolVariant: SidecarSourceVariant,\n): { filePath: string; variant: SidecarSourceVariant } | undefined {\n if (toolVariant === \"openai\") {\n const filePath = path.join(directory, \"widget.openai.tsx\");\n return existsSync(filePath) ? { filePath, variant: \"openai\" } : undefined;\n }\n\n if (toolVariant === \"anthropic\") {\n const filePath = path.join(directory, \"widget.anthropic.tsx\");\n return existsSync(filePath) ? { filePath, variant: \"anthropic\" } : undefined;\n }\n\n const candidates =\n target === \"chatgpt\" || target === \"claude\" || target === \"mcp\"\n ? [{ name: \"widget.tsx\", variant: \"shared\" as const }]\n : [];\n\n for (const candidate of candidates) {\n const filePath = path.join(directory, candidate.name);\n if (existsSync(filePath)) {\n return { filePath, variant: candidate.variant };\n }\n }\n\n return undefined;\n}\n\n/** Merges widget metadata into existing descriptor metadata without losing `ui`. */\nexport function mergeWidgetMeta(\n existing: Record<string, unknown> | undefined,\n widget: Record<string, unknown>,\n): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...(existing ?? {}) };\n for (const [key, value] of Object.entries(widget)) {\n if (key === \"ui\" && isRecord(value) && isRecord(merged.ui)) {\n merged.ui = { ...merged.ui, ...value };\n } else {\n merged[key] = value;\n }\n }\n return merged;\n}\n\n/** Wraps bundled JavaScript in the minimal transparent widget document. */\nfunction renderWidgetHtml(title: string, javascript: string, css = \"\"): string {\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(title)}</title>\n <style>\n :root { color-scheme: light dark; font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; }\n html, body, #root { min-height: 100%; margin: 0; background: transparent; }\n body { color: CanvasText; }\n * { box-sizing: border-box; }\n ${css}\n </style>\n </head>\n <body>\n <div id=\"root\"></div>\n <script>${javascript}</script>\n </body>\n</html>\n`;\n}\n\n/** Returns true for metadata objects that can be shallow-merged. */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\n/** Drops undefined keys from emitted metadata objects. */\nfunction stripUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n","/** Build orchestration for Sidecar projects. */\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { analyzeProjectTools } from \"./analyze.js\";\nimport { analyzeProjectConfig } from \"./config.js\";\nimport { collectProjectDiagnostics, formatDiagnostic } from \"./diagnostics.js\";\nimport { writeGeneratedTypes } from \"./generated.js\";\nimport { buildPluginPackages } from \"./plugins.js\";\nimport { analyzeProjectPrompts } from \"./prompts.js\";\nimport { analyzeProjectResources } from \"./resources.js\";\nimport type { BuildProjectOptions, SidecarManifest, SidecarResourceTemplateManifestEntry } from \"./types.js\";\nimport { buildWidgets } from \"./widgets.js\";\n\n/** Builds the MCP output, generated types, and optional plugin packages. */\nexport async function buildProject(\n options: BuildProjectOptions,\n): Promise<SidecarManifest> {\n const rootDir = path.resolve(options.rootDir);\n const target = options.target ?? \"mcp\";\n const config = analyzeProjectConfig(rootDir);\n const tools = await analyzeProjectTools(rootDir, { target });\n const resources = await analyzeProjectResources(rootDir);\n const resourceTemplates: SidecarResourceTemplateManifestEntry[] = [];\n const prompts = await analyzeProjectPrompts(rootDir);\n const diagnostics = await collectProjectDiagnostics(rootDir, {\n tools,\n resources,\n prompts,\n config,\n });\n const errors = diagnostics.filter((diagnostic) => diagnostic.severity === \"error\");\n if (errors.length) {\n throw new Error(errors.map(formatDiagnostic).join(\"\\n\"));\n }\n\n const outDir = resolveInsideRoot(rootDir, options.outDir ?? \"out/mcp\");\n await buildWidgets(rootDir, outDir, tools);\n\n const manifest: SidecarManifest = {\n version: 1,\n target,\n rootDir: \".\",\n generatedAt: new Date().toISOString(),\n config,\n tools,\n resources,\n resourceTemplates,\n prompts,\n diagnostics,\n };\n\n await mkdir(outDir, { recursive: true });\n await writeFile(\n path.join(outDir, \"manifest.sidecar.json\"),\n `${JSON.stringify(manifest, null, 2)}\\n`,\n );\n await writeFile(path.join(outDir, \"README.md\"), renderMcpReadme(manifest));\n await writeGeneratedTypes(rootDir, tools);\n if (options.plugins) {\n await buildPluginPackages(rootDir, path.dirname(outDir), manifest);\n }\n\n return manifest;\n}\n\n/** Resolves build output paths while preventing writes outside the project. */\nfunction resolveInsideRoot(rootDir: string, output: string): string {\n const resolved = path.resolve(rootDir, output);\n const relative = path.relative(rootDir, resolved);\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`Build output must stay inside the project root: ${output}`);\n }\n return resolved;\n}\n\n/** Renders a short build README with detected tools and install context. */\nfunction renderMcpReadme(manifest: SidecarManifest): string {\n const tools = manifest.tools\n .map((toolEntry) => `- \\`${toolEntry.id}\\`: ${toolEntry.description}`)\n .join(\"\\n\");\n const resources = manifest.resources\n .map((resourceEntry) => `- \\`${resourceEntry.uri}\\`: ${resourceEntry.description ?? resourceEntry.name}`)\n .join(\"\\n\");\n const prompts = manifest.prompts\n .map((promptEntry) => `- \\`${promptEntry.name}\\`: ${promptEntry.description ?? promptEntry.title}`)\n .join(\"\\n\");\n\n return `# Sidecar MCP Build\n\nGenerated by Sidecar.\n\n## Tools\n\n${tools || \"No tools detected.\"}\n\n## Resources\n\n${resources || \"No resources detected.\"}\n\n## Prompts\n\n${prompts || \"No prompts detected.\"}\n\n## Local HTTPS Testing\n\nRun \\`sidecar dev --tunnel\\` from the project root to start the local MCP server on Streamable HTTP and print an HTTPS MCP URL that can be added to ChatGPT, Claude, or a Claude plugin install.\n`;\n}\n","/** Static Sidecar config extraction for build manifests. */\nimport path from \"node:path\";\nimport {\n Node,\n SyntaxKind,\n type ObjectLiteralExpression,\n} from \"ts-morph\";\nimport { resolveDefaultExportCall, unwrapExpression } from \"./ast.js\";\nimport { createProject } from \"./project.js\";\nimport type { SidecarCompilerConfig } from \"./types.js\";\nimport { existsSyncSafe } from \"./utils.js\";\n\n/** Reads the serializable subset of `sidecar.config.ts` without executing app code. */\nexport function analyzeProjectConfig(rootDir: string): SidecarCompilerConfig {\n const configPath = path.join(rootDir, \"sidecar.config.ts\");\n if (!existsSyncSafe(configPath)) {\n return defaultCompilerConfig();\n }\n\n const project = createProject(rootDir);\n const sourceFile = project.addSourceFileAtPath(configPath);\n const call = resolveDefaultExportCall(sourceFile, \"defineConfig\");\n const definition = unwrapExpression(call?.getArguments()[0]);\n if (!definition || !Node.isObjectLiteralExpression(definition)) {\n return defaultCompilerConfig();\n }\n\n return {\n resources: {\n subscribe: readBooleanNested(definition, \"resources\", \"subscribe\") ?? false,\n listChanged: readBooleanNested(definition, \"resources\", \"listChanged\") ?? false,\n },\n prompts: {\n listChanged: readBooleanNested(definition, \"prompts\", \"listChanged\") ?? false,\n },\n tools: {\n listChanged: readBooleanNested(definition, \"tools\", \"listChanged\") ?? false,\n },\n pagination: {\n pageSize: readNumberNested(definition, \"pagination\", \"pageSize\") ?? 10,\n hasOverride: hasProperty(readObjectProperty(definition, \"pagination\"), \"override\"),\n },\n };\n}\n\n/** Returns compiler defaults when config is absent. */\nexport function defaultCompilerConfig(): SidecarCompilerConfig {\n return {\n resources: {\n subscribe: false,\n listChanged: false,\n },\n prompts: {\n listChanged: false,\n },\n tools: {\n listChanged: false,\n },\n pagination: {\n pageSize: 10,\n hasOverride: false,\n },\n };\n}\n\n/** Reads a boolean nested object property. */\nfunction readBooleanNested(\n definition: ObjectLiteralExpression,\n section: string,\n propertyName: string,\n): boolean | undefined {\n const object = readObjectProperty(definition, section);\n if (!object) {\n return undefined;\n }\n const property = object.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer) {\n return undefined;\n }\n if (initializer.getKind() === SyntaxKind.TrueKeyword) return true;\n if (initializer.getKind() === SyntaxKind.FalseKeyword) return false;\n return undefined;\n}\n\n/** Reads a number nested object property. */\nfunction readNumberNested(\n definition: ObjectLiteralExpression,\n section: string,\n propertyName: string,\n): number | undefined {\n const object = readObjectProperty(definition, section);\n if (!object) {\n return undefined;\n }\n const property = object.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isNumericLiteral(initializer)\n ? Number(initializer.getLiteralText())\n : undefined;\n}\n\n/** Reads a nested object literal property. */\nfunction readObjectProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): ObjectLiteralExpression | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isObjectLiteralExpression(initializer)\n ? initializer\n : undefined;\n}\n\n/** Returns true when an object literal has the named property. */\nfunction hasProperty(\n definition: ObjectLiteralExpression | undefined,\n propertyName: string,\n): boolean {\n return Boolean(definition?.getProperty(propertyName));\n}\n","/** Static diagnostics for Sidecar projects. */\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport type { JsonSchema } from \"@sidecar-ai/core\";\nimport type {\n SidecarCompilerConfig,\n SidecarPromptManifestEntry,\n SidecarResourceManifestEntry,\n SidecarToolManifestEntry,\n} from \"./types.js\";\n\n/** Diagnostic severity surfaced by the CLI and future editor integrations. */\nexport type DiagnosticSeverity = \"warning\" | \"error\";\n\n/** Stable diagnostic emitted for a concrete project source location. */\nexport type SidecarDiagnostic = {\n severity: DiagnosticSeverity;\n code: string;\n message: string;\n filePath: string;\n line: number;\n column: number;\n hint?: string;\n};\n\n/** Collects project-level warnings that do not block compilation by default. */\nexport async function collectProjectDiagnostics(\n rootDir: string,\n input: SidecarToolManifestEntry[] | {\n tools: SidecarToolManifestEntry[];\n resources?: SidecarResourceManifestEntry[];\n prompts?: SidecarPromptManifestEntry[];\n config?: SidecarCompilerConfig;\n },\n): Promise<SidecarDiagnostic[]> {\n const diagnostics: SidecarDiagnostic[] = [];\n const tools = Array.isArray(input) ? input : input.tools;\n const resources = Array.isArray(input) ? [] : input.resources ?? [];\n const prompts = Array.isArray(input) ? [] : input.prompts ?? [];\n const config = Array.isArray(input) ? undefined : input.config;\n const hasAuthConfig = existsSync(path.join(rootDir, \"auth.ts\"));\n const hasOpenAiAppsSdkUi = canResolveOpenAiAppsSdkUi(rootDir);\n\n for (const entry of tools) {\n const toolPath = path.join(rootDir, entry.sourceFile);\n const toolSource = await readFile(toolPath, \"utf8\");\n diagnostics.push(...diagnoseToolSource(rootDir, entry, toolSource, hasAuthConfig));\n\n if (entry.widget) {\n const widgetPath = path.join(rootDir, entry.widget.sourceFile);\n const widgetSource = await readFile(widgetPath, \"utf8\");\n diagnostics.push(...diagnoseWidgetSource(rootDir, entry, widgetSource, hasOpenAiAppsSdkUi));\n }\n }\n\n for (const entry of resources) {\n const resourcePath = path.join(rootDir, entry.sourceFile);\n const resourceSource = await readFile(resourcePath, \"utf8\");\n diagnostics.push(...diagnoseResourceSource(entry, resourceSource));\n }\n\n for (const entry of prompts) {\n const promptPath = path.join(rootDir, entry.sourceFile);\n const promptSource = await readFile(promptPath, \"utf8\");\n diagnostics.push(...diagnosePromptSource(entry, promptSource));\n }\n\n if (config) {\n diagnostics.push(...diagnoseCapabilities(config, resources));\n }\n\n return diagnostics;\n}\n\n/** Formats diagnostics in a TypeScript-style shape understood by many editors. */\nexport function formatDiagnostic(diagnostic: SidecarDiagnostic): string {\n const location = `${diagnostic.filePath}:${diagnostic.line}:${diagnostic.column}`;\n const hint = diagnostic.hint ? `\\n hint: ${diagnostic.hint}` : \"\";\n return `${location} - ${diagnostic.severity} ${diagnostic.code}: ${diagnostic.message}${hint}`;\n}\n\n/** Emits warnings for one reserved `tool.ts` file. */\nfunction diagnoseToolSource(\n rootDir: string,\n entry: SidecarToolManifestEntry,\n source: string,\n hasAuthConfig: boolean,\n): SidecarDiagnostic[] {\n const diagnostics: SidecarDiagnostic[] = [];\n const toolLocation = locate(source, \"tool({\");\n\n if (!entry.description.trim().startsWith(\"Use this when\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_METADATA_DESCRIPTION\",\n message: `Tool \"${entry.id}\" description should start with \"Use this when...\" for better model routing.`,\n filePath: entry.sourceFile,\n ...toolLocation,\n hint: \"Keep the first sentence specific and include explicit disallowed cases when useful.\",\n });\n }\n\n for (const key of [\"readOnlyHint\", \"destructiveHint\", \"openWorldHint\"] as const) {\n if (!(key in (entry.annotations ?? {}))) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_TOOL_ANNOTATION\",\n message: `Tool \"${entry.id}\" should explicitly declare annotations.${key}.`,\n filePath: entry.sourceFile,\n ...toolLocation,\n hint: \"Hosts use these hints to frame approval and safety UX; Sidecar applies conservative defaults only as a fallback.\",\n });\n }\n }\n\n if (/auth\\s*:/.test(source) && !hasAuthConfig && !isIgnored(source, \"SIDECAR_AUTH_MISSING_CONFIG\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_AUTH_MISSING_CONFIG\",\n message: `Tool \"${entry.id}\" declares auth but the project has no reserved auth.ts file.`,\n filePath: entry.sourceFile,\n ...locate(source, \"auth\"),\n hint: \"Add auth.ts at the project root or mark the tool auth policy as public.\",\n });\n }\n\n if (!returnsToolResult(source) && !isIgnored(source, \"SIDECAR_TOOL_RESULT_REQUIRED\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_TOOL_RESULT_REQUIRED\",\n message: `Tool \"${entry.id}\" should return toolResult(...) from execute.`,\n filePath: entry.sourceFile,\n ...locate(source, \"execute\"),\n hint: \"The runtime rejects plain objects so content, structuredContent, and meta always map cleanly to MCP result channels.\",\n });\n }\n\n if (/[\"']openai\\//.test(source) && !/@sidecar-ai\\/openai/.test(source) && !isIgnored(source, \"SIDECAR_OPENAI_MAGIC_META\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_OPENAI_MAGIC_META\",\n message: `Tool \"${entry.id}\" uses raw ChatGPT metadata strings.`,\n filePath: entry.sourceFile,\n ...locate(source, \"openai/\"),\n hint: \"Use @sidecar-ai/openai helpers or the typed hosts.chatgpt field so platform metadata stays typed.\",\n });\n }\n\n for (const parameterName of missingParameterDescriptions(entry.inputSchema)) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_PARAM_DESCRIPTION\",\n message: `Parameter \"${parameterName}\" on tool \"${entry.id}\" is missing a JSDoc/schema description.`,\n filePath: entry.sourceFile,\n ...locate(source, parameterName),\n hint: \"Add a JSDoc comment to the TypeScript field or provide a schema description.\",\n });\n }\n\n if (looksLikeKnowledgeTool(entry) && !hasCompanyKnowledgeShape(entry.inputSchema) && !isIgnored(source, \"SIDECAR_COMPANY_KNOWLEDGE_SHAPE\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_COMPANY_KNOWLEDGE_SHAPE\",\n message: `Tool \"${entry.id}\" looks like a search/fetch knowledge tool but does not use the expected simple input shape.`,\n filePath: entry.sourceFile,\n ...toolLocation,\n hint: \"Use a string query for search tools or a string id/url for fetch tools, or add // sidecar-ignore SIDECAR_COMPANY_KNOWLEDGE_SHAPE.\",\n });\n }\n\n return diagnostics.filter((diagnostic) => !isIgnored(source, diagnostic.code));\n}\n\n/** Emits warnings for one sibling `widget.tsx` file. */\nfunction diagnoseWidgetSource(\n _rootDir: string,\n entry: SidecarToolManifestEntry,\n source: string,\n hasOpenAiAppsSdkUi: boolean,\n): SidecarDiagnostic[] {\n const diagnostics: SidecarDiagnostic[] = [];\n const widgetFile = entry.widget?.sourceFile;\n if (!widgetFile) {\n return diagnostics;\n }\n\n if (/window\\s*\\.\\s*openai|\\(\\s*window\\s+as\\s+[^)]*\\)\\s*\\.\\s*openai/.test(source) && !isIgnored(source, \"SIDECAR_OPENAI_RAW_BRIDGE\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_OPENAI_RAW_BRIDGE\",\n message: `Widget for \"${entry.id}\" reads window.openai directly.`,\n filePath: widgetFile,\n ...locate(source, \"openai\"),\n hint: \"Use @sidecar-ai/openai runtime helpers in ChatGPT-only widgets, or @sidecar-ai/native/@sidecar-ai/client for portable behavior.\",\n });\n }\n\n if (entry.widget?.variant !== \"openai\" && /@sidecar-ai\\/openai/.test(source) && !/@sidecar-ai\\/native/.test(source) && !isIgnored(source, \"SIDECAR_OPENAI_FALLBACK\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_OPENAI_FALLBACK\",\n message: `Widget for \"${entry.id}\" imports @sidecar-ai/openai without a portable fallback.`,\n filePath: widgetFile,\n ...locate(source, \"@sidecar-ai/openai\"),\n hint: \"Prefer @sidecar-ai/native for user-facing behavior and reserve @sidecar-ai/openai for typed metadata or explicit ChatGPT-only code paths.\",\n });\n }\n\n if (entry.widget?.variant !== \"openai\" && /@sidecar-ai\\/openai\\/components/.test(source) && !isIgnored(source, \"SIDECAR_OPENAI_COMPONENT_CROSS_HOST\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_OPENAI_COMPONENT_CROSS_HOST\",\n message: `Widget for \"${entry.id}\" imports ChatGPT-only components.`,\n filePath: widgetFile,\n ...locate(source, \"@sidecar-ai/openai/components\"),\n hint: \"Use @sidecar-ai/native for portable primitives. Keep @sidecar-ai/openai/components for widgets intentionally targeted to ChatGPT.\",\n });\n }\n\n if (/@sidecar-ai\\/openai\\/components/.test(source) && !hasOpenAiAppsSdkUi && !isIgnored(source, \"SIDECAR_OPENAI_UI_SDK_MISSING\")) {\n diagnostics.push({\n severity: \"error\",\n code: \"SIDECAR_OPENAI_UI_SDK_MISSING\",\n message: `Widget for \"${entry.id}\" imports @sidecar-ai/openai/components but @openai/apps-sdk-ui is not installed.`,\n filePath: widgetFile,\n ...locate(source, \"@sidecar-ai/openai/components\"),\n hint: \"Install it with: npm install @openai/apps-sdk-ui\",\n });\n }\n\n if (entry.widget?.variant !== \"anthropic\" && /@sidecar-ai\\/anthropic\\/components/.test(source) && !isIgnored(source, \"SIDECAR_ANTHROPIC_COMPONENT_CROSS_HOST\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_ANTHROPIC_COMPONENT_CROSS_HOST\",\n message: `Widget for \"${entry.id}\" imports Claude-only components.`,\n filePath: widgetFile,\n ...locate(source, \"@sidecar-ai/anthropic/components\"),\n hint: \"Use @sidecar-ai/native for portable primitives. Keep @sidecar-ai/anthropic/components for widgets intentionally targeted to Claude.\",\n });\n }\n\n if (/\\bPopover\\b/.test(source) && /@sidecar-ai\\/native/.test(source) && !isIgnored(source, \"SIDECAR_NATIVE_NON_PORTABLE_COMPONENT\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_NATIVE_NON_PORTABLE_COMPONENT\",\n message: `Widget for \"${entry.id}\" appears to expect a native Popover.`,\n filePath: widgetFile,\n ...locate(source, \"Popover\"),\n hint: \"Popover is host-specific because Claude inline apps discourage clipped overlay UI. Use @sidecar-ai/openai/components for ChatGPT-only popovers.\",\n });\n }\n\n return diagnostics.filter((diagnostic) => !isIgnored(source, diagnostic.code));\n}\n\n/** Emits warnings for one reserved `resource.ts` file. */\nfunction diagnoseResourceSource(\n entry: SidecarResourceManifestEntry,\n source: string,\n): SidecarDiagnostic[] {\n const diagnostics: SidecarDiagnostic[] = [];\n if (!returnsResourceResult(source) && !isIgnored(source, \"SIDECAR_RESOURCE_RESULT_REQUIRED\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_RESOURCE_RESULT_REQUIRED\",\n message: `Resource \"${entry.uri}\" should return resourceResult(...) from read.`,\n filePath: entry.sourceFile,\n ...locate(source, \"read\"),\n hint: \"The runtime rejects plain objects so text/blob content maps cleanly to MCP resource contents.\",\n });\n }\n return diagnostics.filter((diagnostic) => !isIgnored(source, diagnostic.code));\n}\n\n/** Emits warnings for one reserved `prompt.ts` file. */\nfunction diagnosePromptSource(\n entry: SidecarPromptManifestEntry,\n source: string,\n): SidecarDiagnostic[] {\n const diagnostics: SidecarDiagnostic[] = [];\n if (!source.includes(\"run\") && !isIgnored(source, \"SIDECAR_PROMPT_RUN_REQUIRED\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"SIDECAR_PROMPT_RUN_REQUIRED\",\n message: `Prompt \"${entry.name}\" should include a run method.`,\n filePath: entry.sourceFile,\n ...locate(source, \"prompt({\"),\n hint: \"Prompt run methods return a string for the common case or MCP prompt messages for advanced cases.\",\n });\n }\n return diagnostics.filter((diagnostic) => !isIgnored(source, diagnostic.code));\n}\n\n/** Emits build-time errors when config claims unsupported capability wiring. */\nfunction diagnoseCapabilities(\n config: SidecarCompilerConfig,\n resources: SidecarResourceManifestEntry[],\n): SidecarDiagnostic[] {\n const diagnostics: SidecarDiagnostic[] = [];\n if (!config.resources.subscribe && resources.some((entry) => entry.subscribe)) {\n const entry = resources.find((resource) => resource.subscribe);\n if (entry) {\n diagnostics.push({\n severity: \"error\",\n code: \"SIDECAR_RESOURCE_SUBSCRIBE_DISABLED\",\n message: `Resource \"${entry.uri}\" sets subscribe: true but sidecar.config.ts does not enable resources.subscribe.`,\n filePath: entry.sourceFile,\n line: 1,\n column: 1,\n hint: \"Add resources: { subscribe: true } to sidecar.config.ts or remove subscribe: true from this resource.\",\n });\n }\n }\n return diagnostics;\n}\n\n/** Returns true when the source visibly returns the standardized result helper. */\nfunction returnsToolResult(source: string): boolean {\n return /\\breturn\\s+toolResult(?:\\.\\w+)?\\s*\\(/.test(source);\n}\n\n/** Returns true when the source visibly returns the standardized resource helper. */\nfunction returnsResourceResult(source: string): boolean {\n return /\\breturn\\s+resourceResult(?:\\.\\w+)?\\s*\\(/.test(source);\n}\n\n/** Finds required parameters without model-facing descriptions. */\nfunction missingParameterDescriptions(schema: JsonSchema): string[] {\n const properties = schema.properties ?? {};\n return Object.entries(properties)\n .filter(([, value]) => !value.description?.trim())\n .map(([key]) => key);\n}\n\n/** Returns true for tools named like knowledge search/fetch operations. */\nfunction looksLikeKnowledgeTool(entry: SidecarToolManifestEntry): boolean {\n const text = `${entry.id} ${entry.name}`.toLowerCase();\n return /\\b(search|fetch)\\b/.test(text) || /(^|[._-])(search|fetch)([._-]|$)/.test(text);\n}\n\n/** Checks the minimum predictable shape Sidecar expects for knowledge tools. */\nfunction hasCompanyKnowledgeShape(schema: JsonSchema): boolean {\n const properties = schema.properties ?? {};\n const query = properties.query;\n const url = properties.url;\n const id = properties.id;\n return query?.type === \"string\" || url?.type === \"string\" || id?.type === \"string\";\n}\n\n/** Returns true when the official OpenAI Apps UI SDK is resolvable from the app root. */\nfunction canResolveOpenAiAppsSdkUi(rootDir: string): boolean {\n try {\n createRequire(path.join(rootDir, \"package.json\")).resolve(\"@openai/apps-sdk-ui/css\");\n return true;\n } catch {\n return false;\n }\n}\n\n/** Locates text within a source file using 1-based editor coordinates. */\nfunction locate(source: string, needle: string): { line: number; column: number } {\n const index = Math.max(0, source.indexOf(needle));\n const prefix = source.slice(0, index);\n const lines = prefix.split(\"\\n\");\n return {\n line: lines.length,\n column: (lines.at(-1)?.length ?? 0) + 1,\n };\n}\n\n/** Allows authors to silence a warning with a visible source comment. */\nfunction isIgnored(source: string, code: string): boolean {\n return source.includes(`sidecar-ignore ${code}`) || source.includes(`sidecar-ignore all`);\n}\n","/** Generated widget client writer. */\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { SidecarToolManifestEntry } from \"./types.js\";\nimport { toIdentifier, toImportSpecifier } from \"./utils.js\";\n\n/** Writes `.sidecar/generated/tools.ts` for typed widget-initiated calls. */\nexport async function writeGeneratedTypes(\n rootDir: string,\n tools: SidecarToolManifestEntry[],\n): Promise<void> {\n const generatedDir = path.join(rootDir, \".sidecar\", \"generated\");\n await mkdir(generatedDir, { recursive: true });\n const appCallableTools = tools.filter(isAppCallable);\n const methodNames = uniqueMethodNames(appCallableTools.map((entry) => toIdentifier(entry.id)));\n\n const imports = appCallableTools\n .map(\n (entry, index) =>\n `import type tool${index} from ${JSON.stringify(toImportSpecifier(generatedDir, path.join(rootDir, entry.sourceFile), { extension: \"js\" }))};`,\n )\n .join(\"\\n\");\n const ids = appCallableTools\n .map((entry, index) => ` ${methodNames[index]}: ${JSON.stringify(entry.id)}`)\n .join(\",\\n\");\n const toolTypes = appCallableTools\n .map(\n (entry, index) =>\n ` ${methodNames[index]}(params: ToolParams<typeof tool${index}>): Promise<ToolOutput<typeof tool${index}>>;`,\n )\n .join(\"\\n\");\n\n await writeFile(\n path.join(generatedDir, \"tools.ts\"),\n `/**\n * Generated Sidecar widget tool client.\n *\n * Do not edit this file directly; it is regenerated by sidecar build and\n * sidecar dev.\n */\n${imports}\nimport { createToolClient } from \"@sidecar-ai/client\";\nimport type { ToolResult } from \"@sidecar-ai/core\";\n\ntype ExecuteOf<T> = T extends { execute: infer Execute } ? Execute : never;\ntype ToolParams<T> = ExecuteOf<T> extends (params: infer Params, ...args: any[]) => unknown ? Params : never;\ntype RawToolOutput<T> = Awaited<ReturnType<Extract<ExecuteOf<T>, (...args: any[]) => unknown>>>;\ntype ToolOutput<T> = RawToolOutput<T> extends ToolResult<infer Structured, any> ? Structured : never;\n\n/** Machine names keyed by widget-friendly method names. */\nexport const toolIds = {\n${ids}\n} as const;\n\n/** Typed callable tools available to widgets. */\nexport type WidgetTools = {\n${toolTypes}\n};\n\n/** Default widget tool client backed by the host bridge. */\nexport const tools = createToolClient<WidgetTools>(toolIds);\n`,\n );\n}\n\n/** Returns true when MCP Apps metadata allows widgets to call the tool. */\nfunction isAppCallable(entry: SidecarToolManifestEntry): boolean {\n const ui = entry.descriptor._meta?.ui;\n if (!ui || typeof ui !== \"object\" || Array.isArray(ui)) {\n return true;\n }\n\n const visibility = (ui as { visibility?: unknown }).visibility;\n return !Array.isArray(visibility) || visibility.includes(\"app\");\n}\n\n/** Ensures generated widget method names cannot silently collide. */\nfunction uniqueMethodNames(names: string[]): string[] {\n const seen = new Map<string, number>();\n return names.map((name) => {\n const count = seen.get(name) ?? 0;\n seen.set(name, count + 1);\n return count === 0 ? name : `${name}${count + 1}`;\n });\n}\n","/** Plugin package generation for Claude desktop hosts. */\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { loadProjectIdentity } from \"./identity.js\";\nimport { emitClaudeAgents } from \"./plugin-components/agents.js\";\nimport { copyCommands } from \"./plugin-components/commands.js\";\nimport { copyHooks } from \"./plugin-components/hooks.js\";\nimport { copyClaudePassthroughDirectories } from \"./plugin-components/passthrough.js\";\nimport { copySkills } from \"./plugin-components/skills.js\";\nimport type { ProjectIdentity, SidecarManifest } from \"./types.js\";\nimport { stripUndefined } from \"./utils.js\";\n\n/** Emits all plugin package targets for the current MCP manifest. */\nexport async function buildPluginPackages(\n rootDir: string,\n outRoot: string,\n manifest: SidecarManifest,\n): Promise<void> {\n const identity = await loadProjectIdentity(rootDir);\n await buildClaudePlugin(rootDir, outRoot, identity, manifest);\n}\n\n/** Emits a Claude/Cowork plugin package that references the hosted MCP server. */\nasync function buildClaudePlugin(\n rootDir: string,\n outRoot: string,\n identity: ProjectIdentity,\n manifest: SidecarManifest,\n): Promise<void> {\n const pluginDir = path.join(outRoot, \"claude-plugin\");\n await mkdir(path.join(pluginDir, \".claude-plugin\"), { recursive: true });\n await copySkills(rootDir, path.join(pluginDir, \"skills\"));\n await copyCommands(rootDir, path.join(pluginDir, \"commands\"));\n await copyHooks(rootDir, path.join(pluginDir, \"hooks\"));\n await emitClaudeAgents(rootDir, path.join(pluginDir, \"agents\"));\n await copyClaudePassthroughDirectories(rootDir, pluginDir);\n\n await writeJson(path.join(pluginDir, \".claude-plugin\", \"plugin.json\"), {\n name: identity.slug,\n version: identity.version,\n description: identity.description,\n displayName: identity.name,\n installationPreference: \"available\",\n });\n\n await writeJson(path.join(pluginDir, \"version.json\"), {\n version: identity.version,\n generatedBy: \"sidecar\",\n });\n\n await writeJson(path.join(pluginDir, \".mcp.json\"), {\n mcpServers: {\n [identity.slug]: {\n type: \"http\",\n url: \"${SIDECAR_MCP_URL}\",\n },\n },\n });\n\n await writeJson(path.join(pluginDir, \"settings.json\"), {\n sidecar: {\n tools: manifest.tools.map((entry) => entry.id),\n resources: manifest.resources.map((entry) => entry.uri),\n prompts: manifest.prompts.map((entry) => entry.name),\n },\n });\n\n await writeFile(\n path.join(pluginDir, \"README.md\"),\n `# ${identity.name} Claude Plugin\n\nThis package was generated by Sidecar.\n\nSet \\`SIDECAR_MCP_URL\\` to the hosted MCP endpoint for this app.\n\nFor local testing, run \\`sidecar dev --tunnel\\` and use the printed HTTPS MCP URL.\n\nClaude/Cowork plugin-specific components such as skills, slash commands, agents, hooks, output styles, themes, monitors, assets, and bin scripts will be emitted here when the source project defines them.\n`,\n );\n}\n\n/** Writes formatted JSON while dropping undefined fields. */\nasync function writeJson(\n filePath: string,\n value: Record<string, unknown>,\n): Promise<void> {\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(\n filePath,\n `${JSON.stringify(stripUndefined(value), null, 2)}\\n`,\n );\n}\n","/** Project identity loading for generated manifests and plugin packages. */\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { toMachineName } from \"@sidecar-ai/core\";\nimport type { ProjectIdentity } from \"./types.js\";\nimport { existsSyncSafe } from \"./utils.js\";\n\n/** Loads project name, slug, version, and description from config/package metadata. */\nexport async function loadProjectIdentity(\n rootDir: string,\n): Promise<ProjectIdentity> {\n const packageJson = await readOptionalJson(path.join(rootDir, \"package.json\"));\n const configText = await readOptionalText(\n path.join(rootDir, \"sidecar.config.ts\"),\n );\n const name =\n readConfigString(configText, \"name\") ??\n packageJson?.name ??\n path.basename(rootDir);\n const version =\n readConfigString(configText, \"version\") ??\n packageJson?.version ??\n \"0.0.0-dev\";\n const description =\n readConfigString(configText, \"description\") ??\n packageJson?.description ??\n `${name} Sidecar app.`;\n\n return {\n name,\n slug: toMachineName(name).replaceAll(\"_\", \"-\"),\n version,\n description,\n };\n}\n\n/** Reads JSON when the file exists. */\nasync function readOptionalJson(\n filePath: string,\n): Promise<Record<string, string> | undefined> {\n if (!existsSyncSafe(filePath)) {\n return undefined;\n }\n\n return JSON.parse(await readFile(filePath, \"utf8\")) as Record<string, string>;\n}\n\n/** Reads text when the file exists. */\nasync function readOptionalText(filePath: string): Promise<string | undefined> {\n if (!existsSyncSafe(filePath)) {\n return undefined;\n }\n\n return readFile(filePath, \"utf8\");\n}\n\n/** Extracts a simple string property from `sidecar.config.ts` without executing it. */\nfunction readConfigString(\n configText: string | undefined,\n key: string,\n): string | undefined {\n if (!configText) {\n return undefined;\n }\n\n const match = configText.match(\n new RegExp(`${key}\\\\s*:\\\\s*[\"'\\`]([^\"'\\`]+)[\"'\\`]`),\n );\n return match?.[1];\n}\n","/** Claude agent generation from typed Sidecar agent files. */\nimport { mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n existsSyncSafe,\n readObjectString,\n readObjectStringArray,\n safeFileStem,\n stripUndefined,\n yamlScalar,\n} from \"../utils.js\";\n\n/** Emits `agents/*.md` from reserved agent directories. */\nexport async function emitClaudeAgents(\n rootDir: string,\n destination: string,\n): Promise<void> {\n const source = path.join(rootDir, \"agents\");\n if (!existsSyncSafe(source)) {\n return;\n }\n\n const entries = await readdir(source, { withFileTypes: true });\n const agentDirs = entries.filter(\n (entry) => entry.isDirectory() && existsSyncSafe(path.join(source, entry.name, \"agent.ts\")),\n );\n if (!agentDirs.length) {\n return;\n }\n\n await mkdir(destination, { recursive: true });\n for (const entry of agentDirs) {\n const sourceText = await readFile(path.join(source, entry.name, \"agent.ts\"), \"utf8\");\n const markdown = parseClaudeAgent(\n sourceText,\n entry.name,\n );\n const agentName =\n readObjectString(sourceText, \"name\") ??\n entry.name;\n await writeFile(path.join(destination, `${safeFileStem(agentName)}.md`), markdown);\n }\n}\n\n/** Parses the object-literal agent declaration into Claude markdown. */\nfunction parseClaudeAgent(source: string, fallbackName: string): string {\n const name = readObjectString(source, \"name\") ?? fallbackName;\n const description =\n readObjectString(source, \"description\") ?? `${name} agent.`;\n const prompt = readObjectString(source, \"prompt\") ?? \"\";\n const tools = readObjectStringArray(source, \"tools\");\n const disallowedTools = readObjectStringArray(source, \"disallowedTools\");\n const model = readObjectString(source, \"model\");\n const color = readObjectString(source, \"color\");\n\n const frontmatter = stripUndefined({\n name,\n description,\n model,\n color,\n tools: tools?.join(\", \"),\n \"disallowed-tools\": disallowedTools?.join(\", \"),\n });\n\n return `---\n${Object.entries(frontmatter)\n .map(([key, value]) => `${key}: ${yamlScalar(value)}`)\n .join(\"\\n\")}\n---\n\n${prompt.trim()}\n`;\n}\n","/** Claude slash-command generation from static markdown or typed command files. */\nimport { cp, lstat, mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n existsSyncSafe,\n readObjectString,\n readObjectStringArray,\n safeFileStem,\n stripUndefined,\n yamlScalar,\n} from \"../utils.js\";\n\n/** Copies markdown commands and emits `command.ts` declarations as markdown. */\nexport async function copyCommands(\n rootDir: string,\n destination: string,\n): Promise<void> {\n const source = path.join(rootDir, \"commands\");\n if (!existsSyncSafe(source)) {\n return;\n }\n\n await mkdir(destination, { recursive: true });\n const entries = await readdir(source, { withFileTypes: true });\n for (const entry of entries) {\n const sourcePath = path.join(source, entry.name);\n if (entry.isFile() && entry.name.endsWith(\".md\")) {\n if (await safeCommandCopyFilter(sourcePath)) {\n await cp(sourcePath, path.join(destination, safeFileStem(entry.name.replace(/\\.md$/, \"\")) + \".md\"));\n }\n continue;\n }\n\n if (!entry.isDirectory()) {\n continue;\n }\n\n const dynamicCommand = path.join(sourcePath, \"command.ts\");\n if (existsSyncSafe(dynamicCommand)) {\n const sourceText = await readFile(dynamicCommand, \"utf8\");\n const markdown = parseDynamicCommand(sourceText, entry.name);\n const commandName = readObjectString(sourceText, \"name\") ?? entry.name;\n await writeFile(path.join(destination, `${safeFileStem(commandName)}.md`), markdown);\n continue;\n }\n\n await cp(sourcePath, path.join(destination, entry.name), {\n recursive: true,\n filter: safeCommandCopyFilter,\n });\n }\n}\n\n/** Avoids copying symlinks and common secret files into generated commands. */\nasync function safeCommandCopyFilter(sourcePath: string): Promise<boolean> {\n const basename = path.basename(sourcePath);\n if (basename === \".env\" || basename.startsWith(\".env.\") || basename === \"node_modules\" || basename === \".git\") {\n return false;\n }\n const stat = await lstat(sourcePath);\n return !stat.isSymbolicLink();\n}\n\n/** Parses a typed command declaration into Claude slash-command markdown. */\nfunction parseDynamicCommand(source: string, fallbackName: string): string {\n const name = readObjectString(source, \"name\") ?? fallbackName;\n const description = readObjectString(source, \"description\");\n const prompt = readObjectString(source, \"prompt\") ?? \"\";\n const argumentHint = readObjectString(source, \"argumentHint\");\n const allowedTools = readObjectStringArray(source, \"allowedTools\");\n\n const frontmatter = stripUndefined({\n description,\n \"argument-hint\": argumentHint,\n \"allowed-tools\": allowedTools?.join(\", \"),\n });\n\n const header = Object.keys(frontmatter).length\n ? `---\n${Object.entries(frontmatter)\n .map(([key, value]) => `${key}: ${yamlScalar(value)}`)\n .join(\"\\n\")}\n---\n\n`\n : \"\";\n\n return `${header}${prompt.trim() || `# ${name}`}\\n`;\n}\n","/** Claude hook generation from typed reserved hook files. */\nimport { mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n Node,\n Project,\n SyntaxKind,\n type ArrayLiteralExpression,\n type CallExpression,\n type Expression,\n type ObjectLiteralExpression,\n} from \"ts-morph\";\nimport { resolveDefaultExportCall, unwrapExpression } from \"../ast.js\";\nimport { existsSyncSafe, stripUndefined } from \"../utils.js\";\n\ntype HookHandler = Record<string, unknown> & {\n type: \"command\" | \"http\";\n};\n\ntype HookMatcher = {\n matcher?: string;\n hooks: HookHandler[];\n};\n\ntype HookConfig = Record<string, HookMatcher[]>;\n\n/** Emits one merged `hooks.json` from reserved hook directories. */\nexport async function copyHooks(\n rootDir: string,\n destination: string,\n): Promise<void> {\n const source = path.join(rootDir, \"hooks\");\n if (!existsSyncSafe(source)) {\n return;\n }\n\n const entries = await readdir(source, { withFileTypes: true });\n const hookDirs = entries.filter(\n (entry) => entry.isDirectory() && existsSyncSafe(path.join(source, entry.name, \"hook.ts\")),\n );\n if (!hookDirs.length) {\n return;\n }\n\n const config: HookConfig = {};\n for (const entry of hookDirs) {\n const filePath = path.join(source, entry.name, \"hook.ts\");\n mergeHooks(config, parseHookFile(await readFile(filePath, \"utf8\"), entry.name));\n }\n\n await mkdir(destination, { recursive: true });\n await writeFile(\n path.join(destination, \"hooks.json\"),\n `${JSON.stringify(config, null, 2)}\\n`,\n );\n}\n\n/** Parses a single reserved hook file into Claude hook JSON fragments. */\nfunction parseHookFile(source: string, fallbackName: string): HookConfig {\n const project = new Project({ useInMemoryFileSystem: true });\n const sourceFile = project.createSourceFile(`${fallbackName}.ts`, source);\n const call =\n resolveDefaultExportCall(sourceFile, \"hook\") ??\n resolveDefaultExportCall(sourceFile, \"hooks\");\n if (!call) {\n throw new Error(`hooks/${fallbackName}/hook.ts must default-export hook({ ... }) or hooks({ ... }).`);\n }\n\n const definition = unwrapExpression(call.getArguments()[0]);\n if (!definition || !Node.isObjectLiteralExpression(definition)) {\n throw new Error(`hooks/${fallbackName}/hook.ts must default-export hook({ ... }) or hooks({ ... }).`);\n }\n\n const callee = call.getExpression().getText();\n if (callee === \"hook\" || callee.endsWith(\".hook\")) {\n const entry = parseHookDefinition(definition, fallbackName);\n return { [entry.event]: [stripUndefined({ matcher: entry.matcher, hooks: entry.run })] };\n }\n\n if (callee === \"hooks\" || callee.endsWith(\".hooks\")) {\n return parseHooksDefinition(definition, fallbackName);\n }\n\n throw new Error(`hooks/${fallbackName}/hook.ts must default-export hook({ ... }) or hooks({ ... }).`);\n}\n\n/** Parses `hook({ event, matcher, hooks })`. */\nfunction parseHookDefinition(\n definition: ObjectLiteralExpression,\n fallbackName: string,\n): { event: string; matcher?: string; run: HookHandler[] } {\n const event = readStringProperty(definition, \"event\");\n if (!event) {\n throw new Error(`hooks/${fallbackName}/hook.ts must declare an event string.`);\n }\n\n const hooks = readHookArray(definition, \"run\", fallbackName);\n if (!hooks.length) {\n throw new Error(`hooks/${fallbackName}/hook.ts must declare at least one run handler.`);\n }\n\n return {\n event,\n matcher: readStringProperty(definition, \"matcher\"),\n run: hooks,\n };\n}\n\n/** Parses `hooks({ EventName: [{ matcher, run: [...] }] })`. */\nfunction parseHooksDefinition(\n definition: ObjectLiteralExpression,\n fallbackName: string,\n): HookConfig {\n const config: HookConfig = {};\n\n for (const property of definition.getProperties()) {\n if (!Node.isPropertyAssignment(property)) {\n continue;\n }\n\n const event = property.getName().replace(/^[\"']|[\"']$/g, \"\");\n const initializer = property.getInitializer();\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n throw new Error(`hooks/${fallbackName}/hook.ts event \"${event}\" must be an array.`);\n }\n\n config[event] = initializer.getElements().map((entry) => {\n if (!Node.isObjectLiteralExpression(entry)) {\n throw new Error(`hooks/${fallbackName}/hook.ts event \"${event}\" entries must be objects.`);\n }\n\n return stripUndefined({\n matcher: readStringProperty(entry, \"matcher\"),\n hooks: readHookArray(entry, \"run\", fallbackName),\n });\n });\n }\n\n return config;\n}\n\n/** Reads a hook handler array from an object literal property. */\nfunction readHookArray(\n definition: ObjectLiteralExpression,\n propertyName: string,\n fallbackName: string,\n): HookHandler[] {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return [];\n }\n\n const initializer = property.getInitializer();\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n throw new Error(`hooks/${fallbackName}/hook.ts ${propertyName} must be an array.`);\n }\n\n return parseHookHandlers(initializer, fallbackName);\n}\n\n/** Parses hook handlers written as object literals or helper calls. */\nfunction parseHookHandlers(\n handlers: ArrayLiteralExpression,\n fallbackName: string,\n): HookHandler[] {\n return handlers.getElements().map((handler) => parseHookHandler(handler, fallbackName));\n}\n\n/** Parses one command/http hook handler. */\nfunction parseHookHandler(\n handler: Expression,\n fallbackName: string,\n): HookHandler {\n if (Node.isObjectLiteralExpression(handler)) {\n const type = readStringProperty(handler, \"type\");\n if (type !== \"command\" && type !== \"http\") {\n throw new Error(`hooks/${fallbackName}/hook.ts hook handlers need type \"command\" or \"http\".`);\n }\n return objectLiteralToRecord(handler) as HookHandler;\n }\n\n if (Node.isCallExpression(handler)) {\n return parseHookHandlerCall(handler, fallbackName);\n }\n\n throw new Error(`hooks/${fallbackName}/hook.ts hook handlers must be objects or helper calls.`);\n}\n\n/** Parses `commandHook(...)` and `httpHook(...)` helper calls. */\nfunction parseHookHandlerCall(\n handler: CallExpression,\n fallbackName: string,\n): HookHandler {\n const callee = handler.getExpression().getText();\n const [firstArg, optionsArg] = handler.getArguments();\n const first = firstArg ? stringFromExpression(firstArg) : undefined;\n if (!first) {\n throw new Error(`hooks/${fallbackName}/hook.ts hook helper calls require a string first argument.`);\n }\n\n const options =\n optionsArg && Node.isObjectLiteralExpression(optionsArg)\n ? objectLiteralToRecord(optionsArg)\n : {};\n\n if (callee.endsWith(\"commandHook\")) {\n return stripUndefined({\n type: \"command\",\n command: first,\n ...options,\n }) as HookHandler;\n }\n\n if (callee.endsWith(\"httpHook\")) {\n return stripUndefined({\n type: \"http\",\n url: first,\n ...options,\n }) as HookHandler;\n }\n\n throw new Error(`hooks/${fallbackName}/hook.ts uses an unsupported hook helper \"${callee}\".`);\n}\n\n/** Converts a simple object literal into JSON-compatible data. */\nfunction objectLiteralToRecord(object: ObjectLiteralExpression): Record<string, unknown> {\n const record: Record<string, unknown> = {};\n\n for (const property of object.getProperties()) {\n if (!Node.isPropertyAssignment(property)) {\n continue;\n }\n\n const key = property.getName().replace(/^[\"']|[\"']$/g, \"\");\n const initializer = property.getInitializer();\n if (!initializer) {\n continue;\n }\n record[key] = valueFromExpression(initializer);\n }\n\n return stripUndefined(record);\n}\n\n/** Reads a simple string property from an object literal. */\nfunction readStringProperty(\n object: ObjectLiteralExpression,\n propertyName: string,\n): string | undefined {\n const property = object.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n\n const initializer = property.getInitializer();\n return initializer ? stringFromExpression(initializer) : undefined;\n}\n\n/** Converts supported literal expressions into JSON-compatible values. */\nfunction valueFromExpression(expression: Expression): unknown {\n const string = stringFromExpression(expression);\n if (string !== undefined) {\n return string;\n }\n\n if (expression.getKind() === SyntaxKind.TrueKeyword) {\n return true;\n }\n if (expression.getKind() === SyntaxKind.FalseKeyword) {\n return false;\n }\n if (Node.isNumericLiteral(expression)) {\n return Number(expression.getLiteralText());\n }\n if (Node.isArrayLiteralExpression(expression)) {\n return expression.getElements().map(valueFromExpression);\n }\n if (Node.isObjectLiteralExpression(expression)) {\n return objectLiteralToRecord(expression);\n }\n\n return undefined;\n}\n\n/** Reads string literals and no-substitution template literals. */\nfunction stringFromExpression(expression: Node): string | undefined {\n if (Node.isStringLiteral(expression) || Node.isNoSubstitutionTemplateLiteral(expression)) {\n return expression.getLiteralText();\n }\n return undefined;\n}\n\n/** Merges parsed hook config fragments preserving event order. */\nfunction mergeHooks(target: HookConfig, source: HookConfig): void {\n for (const [event, matchers] of Object.entries(source)) {\n target[event] = [...(target[event] ?? []), ...matchers];\n }\n}\n","/** Claude plugin directory passthrough helpers. */\nimport { cp, lstat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { existsSyncSafe } from \"../utils.js\";\n\n/** Copies Claude-specific directories that Sidecar does not transform yet. */\nexport async function copyClaudePassthroughDirectories(\n rootDir: string,\n pluginDir: string,\n): Promise<void> {\n for (const directory of [\n \"assets\",\n \"bin\",\n \"monitors\",\n \"output-styles\",\n \"themes\",\n ]) {\n const source = path.join(rootDir, directory);\n if (!existsSyncSafe(source)) {\n continue;\n }\n\n await cp(source, path.join(pluginDir, directory), {\n recursive: true,\n filter: safePluginCopyFilter,\n });\n }\n}\n\n/** Avoids accidentally packaging symlinks, env files, or package managers' metadata. */\nasync function safePluginCopyFilter(sourcePath: string): Promise<boolean> {\n const basename = path.basename(sourcePath);\n if (\n basename === \"node_modules\" ||\n basename === \".git\" ||\n basename === \".env\" ||\n basename.startsWith(\".env.\")\n ) {\n return false;\n }\n\n const stat = await lstat(sourcePath);\n return !stat.isSymbolicLink();\n}\n","/** Skill copying and typed skill generation for plugin outputs. */\nimport { existsSync } from \"node:fs\";\nimport { cp, lstat, mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { existsSyncSafe, readObjectString, yamlScalar } from \"../utils.js\";\n\n/** Copies static skills or emits `skill.ts` declarations as `SKILL.md`. */\nexport async function copySkills(\n rootDir: string,\n destination: string,\n): Promise<void> {\n const source = path.join(rootDir, \"skills\");\n if (!existsSyncSafe(source)) {\n return;\n }\n\n await mkdir(destination, { recursive: true });\n const entries = await readdir(source, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const sourceDir = path.join(source, entry.name);\n const destinationDir = path.join(destination, entry.name);\n const staticSkill = path.join(sourceDir, \"SKILL.md\");\n const dynamicSkill = path.join(sourceDir, \"skill.ts\");\n\n await mkdir(destinationDir, { recursive: true });\n if (existsSync(staticSkill)) {\n await cp(sourceDir, destinationDir, {\n recursive: true,\n filter: async (sourcePath) =>\n !sourcePath.endsWith(`${path.sep}skill.ts`) &&\n await safeSkillCopyFilter(sourcePath),\n });\n } else if (existsSync(dynamicSkill)) {\n const generated = parseDynamicSkill(\n await readFile(dynamicSkill, \"utf8\"),\n entry.name,\n );\n await writeFile(path.join(destinationDir, \"SKILL.md\"), generated);\n }\n }\n}\n\n/** Avoids copying symlinks and common secret files into generated plugins. */\nasync function safeSkillCopyFilter(sourcePath: string): Promise<boolean> {\n const basename = path.basename(sourcePath);\n if (basename === \".env\" || basename.startsWith(\".env.\") || basename === \"node_modules\" || basename === \".git\") {\n return false;\n }\n const stat = await lstat(sourcePath);\n return !stat.isSymbolicLink();\n}\n\n/** Parses a typed skill declaration into a `SKILL.md` document. */\nfunction parseDynamicSkill(source: string, fallbackName: string): string {\n const name = readObjectString(source, \"name\") ?? fallbackName;\n const description =\n readObjectString(source, \"description\") ?? `${name} skill.`;\n const body = readObjectString(source, \"body\") ?? \"\";\n\nreturn `---\nname: ${yamlScalar(name)}\ndescription: ${yamlScalar(description)}\n---\n\n${body.trim()}\n`;\n}\n","/** Static analysis for reserved MCP prompt files. */\nimport {\n createPromptDescriptor,\n type McpIcon,\n type PromptArgInput,\n type PromptArgsDefinition,\n} from \"@sidecar-ai/core\";\nimport { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n Node,\n SyntaxKind,\n type ObjectLiteralExpression,\n type SourceFile,\n} from \"ts-morph\";\nimport { resolveDefaultExportCall, unwrapExpression } from \"./ast.js\";\nimport { CompilerError } from \"./errors.js\";\nimport { createProject } from \"./project.js\";\nimport type { SidecarPromptManifestEntry } from \"./types.js\";\nimport { existsSyncSafe, safePathSegment } from \"./utils.js\";\n\n/** Finds all Sidecar prompt files under `prompts/`. */\nexport async function analyzeProjectPrompts(rootDir: string): Promise<SidecarPromptManifestEntry[]> {\n const promptFiles = await findPromptFiles(path.join(rootDir, \"prompts\"));\n if (promptFiles.length === 0) {\n return [];\n }\n\n const project = createProject(rootDir);\n return promptFiles.map((filePath) =>\n analyzePromptFile(project.addSourceFileAtPath(filePath), rootDir),\n );\n}\n\n/** Analyzes one `prompt.ts` source file into a compiler manifest entry. */\nexport function analyzePromptFile(\n sourceFile: SourceFile,\n rootDir: string,\n): SidecarPromptManifestEntry {\n const definition = findPromptDefinition(sourceFile);\n const absoluteFile = sourceFile.getFilePath();\n const directory = path.basename(path.dirname(absoluteFile));\n const name = getOptionalStringProperty(definition, \"name\") ?? safePathSegment(directory);\n const title = getRequiredStringProperty(definition, \"title\", sourceFile);\n const description = getOptionalStringProperty(definition, \"description\");\n const args = readArgs(definition);\n const descriptor = createPromptDescriptor({\n name,\n title,\n description,\n args,\n icons: readIcons(definition),\n });\n\n if (!getMethodOrFunctionProperty(definition, \"run\")) {\n throw new CompilerError(sourceFile, \"prompt({ ... }) must include a run method.\");\n }\n\n return {\n sourceFile: path.relative(rootDir, absoluteFile),\n directory,\n name,\n title,\n description,\n args,\n descriptor,\n };\n}\n\n/** Finds immediate `prompts/<name>/prompt.ts` files in deterministic order. */\nasync function findPromptFiles(promptsDir: string): Promise<string[]> {\n if (!existsSyncSafe(promptsDir)) {\n return [];\n }\n\n const entries = await readdir(promptsDir, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const filePath = path.join(promptsDir, entry.name, \"prompt.ts\");\n if (existsSyncSafe(filePath)) {\n files.push(filePath);\n }\n }\n return files.sort((left, right) => left.localeCompare(right));\n}\n\n/** Locates the default-exported `prompt({ ... })` object literal. */\nfunction findPromptDefinition(sourceFile: SourceFile): ObjectLiteralExpression {\n const call = resolveDefaultExportCall(sourceFile, \"prompt\");\n if (!call) {\n throw new CompilerError(\n sourceFile,\n \"prompt.ts must default-export prompt({ ... }) or an identifier initialized with prompt({ ... }).\",\n );\n }\n\n const definition = unwrapExpression(call.getArguments()[0]);\n if (!definition || !Node.isObjectLiteralExpression(definition)) {\n throw new CompilerError(sourceFile, \"prompt(...) must receive one object literal.\");\n }\n return definition;\n}\n\n/** Reads a required string property from the prompt object. */\nfunction getRequiredStringProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n sourceFile: SourceFile,\n): string {\n const value = getOptionalStringProperty(definition, propertyName);\n if (value === undefined || !value.trim()) {\n throw new CompilerError(\n sourceFile,\n `prompt({ ... }) must include a non-empty ${propertyName} string.`,\n );\n }\n return value;\n}\n\n/** Reads an optional string literal property. */\nfunction getOptionalStringProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isStringLiteral(initializer)\n ? initializer.getLiteralText()\n : undefined;\n}\n\n/** Reads `args` into prompt argument descriptors. */\nfunction readArgs(definition: ObjectLiteralExpression): PromptArgsDefinition | undefined {\n const initializer = readObjectProperty(definition, \"args\");\n if (!initializer) {\n return undefined;\n }\n\n const args: PromptArgsDefinition = {};\n for (const property of initializer.getProperties()) {\n if (!Node.isPropertyAssignment(property)) {\n continue;\n }\n const value = readArgInput(property.getInitializer());\n if (value !== undefined) {\n args[property.getName().replace(/^[\"']|[\"']$/g, \"\")] = value;\n }\n }\n return Object.keys(args).length ? args : undefined;\n}\n\n/** Reads one supported prompt arg declaration. */\nfunction readArgInput(node: Node | undefined): PromptArgInput | undefined {\n const initializer = unwrapExpression(node);\n if (!initializer) {\n return undefined;\n }\n if (Node.isStringLiteral(initializer)) {\n return initializer.getLiteralText();\n }\n if (Node.isArrayLiteralExpression(initializer)) {\n return initializer\n .getElements()\n .filter(Node.isLiteralExpression)\n .map((element) => element.getLiteralText());\n }\n if (Node.isObjectLiteralExpression(initializer)) {\n return {\n description: getOptionalStringProperty(initializer, \"description\"),\n required: readBooleanProperty(initializer, \"required\"),\n };\n }\n return undefined;\n}\n\n/** Reads an optional boolean literal property. */\nfunction readBooleanProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): boolean | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer) {\n return undefined;\n }\n if (initializer.getKind() === SyntaxKind.TrueKeyword) return true;\n if (initializer.getKind() === SyntaxKind.FalseKeyword) return false;\n return undefined;\n}\n\n/** Reads a supported method/function property without executing code. */\nfunction getMethodOrFunctionProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): Node | undefined {\n const property = definition.getProperty(propertyName);\n if (Node.isMethodDeclaration(property)) {\n return property;\n }\n if (property && Node.isPropertyAssignment(property)) {\n const initializer = property.getInitializer();\n if (\n initializer &&\n (Node.isArrowFunction(initializer) || Node.isFunctionExpression(initializer))\n ) {\n return initializer;\n }\n }\n return undefined;\n}\n\n/** Reads MCP icon metadata from a simple object array. */\nfunction readIcons(definition: ObjectLiteralExpression): McpIcon[] | undefined {\n const property = definition.getProperty(\"icons\");\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n return undefined;\n }\n\n const icons = initializer.getElements().flatMap((element) => {\n const object = unwrapExpression(element);\n if (!object || !Node.isObjectLiteralExpression(object)) {\n return [];\n }\n const src = getOptionalStringProperty(object, \"src\");\n if (!src) {\n return [];\n }\n return [{\n src,\n mimeType: getOptionalStringProperty(object, \"mimeType\"),\n sizes: readStringArrayProperty(object, \"sizes\"),\n }];\n });\n return icons.length ? icons : undefined;\n}\n\n/** Reads a nested object literal property. */\nfunction readObjectProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): ObjectLiteralExpression | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isObjectLiteralExpression(initializer)\n ? initializer\n : undefined;\n}\n\n/** Reads a string literal array property. */\nfunction readStringArrayProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string[] | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n return undefined;\n }\n return initializer\n .getElements()\n .filter(Node.isStringLiteral)\n .map((element) => element.getLiteralText());\n}\n","/** Static analysis for reserved MCP resource files. */\nimport {\n createResourceDescriptor,\n type McpIcon,\n type McpResourceDescriptor,\n type ResourceAnnotations,\n} from \"@sidecar-ai/core\";\nimport { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n Node,\n SyntaxKind,\n type ObjectLiteralExpression,\n type SourceFile,\n} from \"ts-morph\";\nimport { resolveDefaultExportCall, unwrapExpression } from \"./ast.js\";\nimport { CompilerError } from \"./errors.js\";\nimport { createProject } from \"./project.js\";\nimport type { SidecarResourceManifestEntry } from \"./types.js\";\nimport { existsSyncSafe, safePathSegment } from \"./utils.js\";\n\n/** Finds all Sidecar resource files under `resources/`. */\nexport async function analyzeProjectResources(rootDir: string): Promise<SidecarResourceManifestEntry[]> {\n const resourceFiles = await findResourceFiles(path.join(rootDir, \"resources\"));\n if (resourceFiles.length === 0) {\n return [];\n }\n\n const project = createProject(rootDir);\n return resourceFiles.map((filePath) =>\n analyzeResourceFile(project.addSourceFileAtPath(filePath), rootDir),\n );\n}\n\n/** Analyzes one `resource.ts` source file into a compiler manifest entry. */\nexport function analyzeResourceFile(\n sourceFile: SourceFile,\n rootDir: string,\n): SidecarResourceManifestEntry {\n const definition = findResourceDefinition(sourceFile);\n const absoluteFile = sourceFile.getFilePath();\n const directory = path.basename(path.dirname(absoluteFile));\n const defaultUri = `sidecar://resources/${safePathSegment(directory)}`;\n const name = getRequiredStringProperty(definition, \"name\", sourceFile);\n const uri = getOptionalStringProperty(definition, \"uri\") ?? defaultUri;\n const descriptor = createResourceDescriptor({\n uri,\n name,\n title: getOptionalStringProperty(definition, \"title\"),\n description: getOptionalStringProperty(definition, \"description\"),\n mimeType: getOptionalStringProperty(definition, \"mimeType\"),\n size: getOptionalNumberProperty(definition, \"size\"),\n icons: readIcons(definition),\n annotations: readAnnotations(definition),\n });\n\n if (!getMethodOrFunctionProperty(definition, \"read\")) {\n throw new CompilerError(sourceFile, \"resource({ ... }) must include a read method.\");\n }\n\n return {\n sourceFile: path.relative(rootDir, absoluteFile),\n directory,\n uri,\n name,\n title: descriptor.title,\n description: descriptor.description,\n mimeType: descriptor.mimeType,\n size: descriptor.size,\n annotations: descriptor.annotations,\n subscribe: readBooleanProperty(definition, \"subscribe\"),\n descriptor,\n };\n}\n\n/** Finds immediate `resources/<name>/resource.ts` files in deterministic order. */\nasync function findResourceFiles(resourcesDir: string): Promise<string[]> {\n if (!existsSyncSafe(resourcesDir)) {\n return [];\n }\n\n const entries = await readdir(resourcesDir, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const filePath = path.join(resourcesDir, entry.name, \"resource.ts\");\n if (existsSyncSafe(filePath)) {\n files.push(filePath);\n }\n }\n return files.sort((left, right) => left.localeCompare(right));\n}\n\n/** Locates the default-exported `resource({ ... })` object literal. */\nfunction findResourceDefinition(sourceFile: SourceFile): ObjectLiteralExpression {\n const call = resolveDefaultExportCall(sourceFile, \"resource\");\n if (!call) {\n throw new CompilerError(\n sourceFile,\n \"resource.ts must default-export resource({ ... }) or an identifier initialized with resource({ ... }).\",\n );\n }\n\n const definition = unwrapExpression(call.getArguments()[0]);\n if (!definition || !Node.isObjectLiteralExpression(definition)) {\n throw new CompilerError(sourceFile, \"resource(...) must receive one object literal.\");\n }\n return definition;\n}\n\n/** Reads a required string property from the resource object. */\nfunction getRequiredStringProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n sourceFile: SourceFile,\n): string {\n const value = getOptionalStringProperty(definition, propertyName);\n if (value === undefined || !value.trim()) {\n throw new CompilerError(\n sourceFile,\n `resource({ ... }) must include a non-empty ${propertyName} string.`,\n );\n }\n return value;\n}\n\n/** Reads an optional string literal property. */\nfunction getOptionalStringProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isStringLiteral(initializer)\n ? initializer.getLiteralText()\n : undefined;\n}\n\n/** Reads an optional number literal property. */\nfunction getOptionalNumberProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): number | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isNumericLiteral(initializer)\n ? Number(initializer.getLiteralText())\n : undefined;\n}\n\n/** Reads an optional boolean literal property. */\nfunction readBooleanProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): boolean | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer) {\n return undefined;\n }\n if (initializer.getKind() === SyntaxKind.TrueKeyword) return true;\n if (initializer.getKind() === SyntaxKind.FalseKeyword) return false;\n return undefined;\n}\n\n/** Reads a supported method/function property without executing code. */\nfunction getMethodOrFunctionProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): Node | undefined {\n const property = definition.getProperty(propertyName);\n if (Node.isMethodDeclaration(property)) {\n return property;\n }\n if (property && Node.isPropertyAssignment(property)) {\n const initializer = property.getInitializer();\n if (\n initializer &&\n (Node.isArrowFunction(initializer) || Node.isFunctionExpression(initializer))\n ) {\n return initializer;\n }\n }\n return undefined;\n}\n\n/** Extracts static MCP annotations from the resource object. */\nfunction readAnnotations(\n definition: ObjectLiteralExpression,\n): ResourceAnnotations | undefined {\n const initializer = readObjectProperty(definition, \"annotations\");\n if (!initializer) {\n return undefined;\n }\n\n const annotations: ResourceAnnotations = {};\n const audience = readStringArrayProperty(initializer, \"audience\")\n ?.filter((value): value is \"user\" | \"assistant\" => value === \"user\" || value === \"assistant\");\n const priority = getOptionalNumberProperty(initializer, \"priority\");\n const lastModified = getOptionalStringProperty(initializer, \"lastModified\");\n if (audience?.length) annotations.audience = audience;\n if (priority !== undefined) annotations.priority = priority;\n if (lastModified) annotations.lastModified = lastModified;\n return Object.keys(annotations).length ? annotations : undefined;\n}\n\n/** Reads MCP icon metadata from a simple object array. */\nfunction readIcons(definition: ObjectLiteralExpression): McpIcon[] | undefined {\n const property = definition.getProperty(\"icons\");\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n return undefined;\n }\n\n const icons = initializer.getElements().flatMap((element) => {\n const object = unwrapExpression(element);\n if (!object || !Node.isObjectLiteralExpression(object)) {\n return [];\n }\n const src = getOptionalStringProperty(object, \"src\");\n if (!src) {\n return [];\n }\n return [{\n src,\n mimeType: getOptionalStringProperty(object, \"mimeType\"),\n sizes: readStringArrayProperty(object, \"sizes\"),\n }];\n });\n return icons.length ? icons : undefined;\n}\n\n/** Reads a nested object literal property. */\nfunction readObjectProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): ObjectLiteralExpression | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n return initializer && Node.isObjectLiteralExpression(initializer)\n ? initializer\n : undefined;\n}\n\n/** Reads a string literal array property. */\nfunction readStringArrayProperty(\n definition: ObjectLiteralExpression,\n propertyName: string,\n): string[] | undefined {\n const property = definition.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return undefined;\n }\n const initializer = unwrapExpression(property.getInitializer());\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n return undefined;\n }\n return initializer\n .getElements()\n .filter(Node.isStringLiteral)\n .map((element) => element.getLiteralText());\n}\n"],"mappings":"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","names":["path","Node","SyntaxKind","path","stripUndefined","path","Node","structured","existsSync","path","Node","path","existsSync","stripUndefined","Node","isRecord","path","readObjectProperty","readBooleanProperty","Node","SyntaxKind","readStringProperty","readStringArrayProperty","mkdir","writeFile","path","path","Node","SyntaxKind","path","Node","readObjectProperty","SyntaxKind","existsSync","readFile","path","mkdir","writeFile","path","path","mkdir","writeFile","mkdir","writeFile","path","readFile","path","path","readFile","mkdir","readdir","readFile","writeFile","path","path","readdir","mkdir","readFile","writeFile","stripUndefined","mkdir","readdir","readFile","writeFile","path","path","mkdir","readdir","readFile","writeFile","stripUndefined","mkdir","readdir","readFile","writeFile","path","Node","Project","SyntaxKind","path","readdir","readFile","mkdir","writeFile","Project","Node","stripUndefined","readStringProperty","SyntaxKind","cp","lstat","path","path","cp","lstat","existsSync","cp","lstat","mkdir","readdir","readFile","writeFile","path","path","mkdir","readdir","existsSync","cp","readFile","writeFile","lstat","path","mkdir","writeFile","stripUndefined","readdir","path","Node","SyntaxKind","path","getOptionalStringProperty","getRequiredStringProperty","readdir","Node","readObjectProperty","readBooleanProperty","SyntaxKind","readStringArrayProperty","readdir","path","Node","SyntaxKind","path","getRequiredStringProperty","getOptionalStringProperty","readIcons","readAnnotations","getMethodOrFunctionProperty","readBooleanProperty","readdir","Node","SyntaxKind","readObjectProperty","readStringArrayProperty","path","mkdir","writeFile"]}