@canmi/seam-server 0.4.11 → 0.4.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -152,6 +152,12 @@ interface LayoutDef {
|
|
|
152
152
|
loaders: Record<string, LoaderFn>;
|
|
153
153
|
i18nKeys?: string[];
|
|
154
154
|
}
|
|
155
|
+
interface PageAssets {
|
|
156
|
+
styles: string[];
|
|
157
|
+
scripts: string[];
|
|
158
|
+
preload: string[];
|
|
159
|
+
prefetch: string[];
|
|
160
|
+
}
|
|
155
161
|
interface PageDef {
|
|
156
162
|
template: string;
|
|
157
163
|
localeTemplates?: Record<string, string>;
|
|
@@ -160,6 +166,7 @@ interface PageDef {
|
|
|
160
166
|
headMeta?: string;
|
|
161
167
|
dataId?: string;
|
|
162
168
|
i18nKeys?: string[];
|
|
169
|
+
pageAssets?: PageAssets;
|
|
163
170
|
}
|
|
164
171
|
interface I18nConfig {
|
|
165
172
|
locales: string[];
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types/schema.ts","../src/types/primitives.ts","../src/types/composites.ts","../src/types/index.ts","../src/channel.ts","../src/manifest/index.ts","../src/procedure.ts","../src/router/handler.ts","../src/page/index.ts","../src/page/handler.ts","../src/resolve.ts","../src/router/index.ts","../src/errors.ts","../src/http.ts","../src/page/build-loader.ts","../src/subscription.ts","../src/ws.ts","../src/proxy.ts","../src/dev/reload-watcher.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types/schema.ts","../src/types/primitives.ts","../src/types/composites.ts","../src/types/index.ts","../src/channel.ts","../src/manifest/index.ts","../src/procedure.ts","../src/router/handler.ts","../src/page/index.ts","../src/page/handler.ts","../src/resolve.ts","../src/router/index.ts","../src/errors.ts","../src/http.ts","../src/page/build-loader.ts","../src/subscription.ts","../src/ws.ts","../src/proxy.ts","../src/dev/reload-watcher.ts"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -328,6 +328,7 @@ async function handlePageRequest(page, params, procedures, i18nOpts) {
|
|
|
328
328
|
data_id: page.dataId ?? "__data",
|
|
329
329
|
head_meta: page.headMeta
|
|
330
330
|
};
|
|
331
|
+
if (page.pageAssets) config.page_assets = page.pageAssets;
|
|
331
332
|
let i18nOptsJson;
|
|
332
333
|
if (i18nOpts) {
|
|
333
334
|
const { config: i18nConfig, routePattern } = i18nOpts;
|
|
@@ -1063,7 +1064,8 @@ function loadBuildOutput(distDir) {
|
|
|
1063
1064
|
layoutChain,
|
|
1064
1065
|
headMeta: entry.head_meta,
|
|
1065
1066
|
dataId: manifest.data_id,
|
|
1066
|
-
i18nKeys
|
|
1067
|
+
i18nKeys,
|
|
1068
|
+
pageAssets: entry.assets
|
|
1067
1069
|
};
|
|
1068
1070
|
}
|
|
1069
1071
|
return pages;
|
|
@@ -1087,7 +1089,8 @@ function loadBuildOutputDev(distDir) {
|
|
|
1087
1089
|
loaders,
|
|
1088
1090
|
layoutChain,
|
|
1089
1091
|
dataId: manifest.data_id,
|
|
1090
|
-
i18nKeys
|
|
1092
|
+
i18nKeys,
|
|
1093
|
+
pageAssets: entry.assets
|
|
1091
1094
|
};
|
|
1092
1095
|
Object.defineProperty(page, "template", {
|
|
1093
1096
|
get: () => readFileSync(templatePath, "utf-8"),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["primitives"],"sources":["../src/types/schema.ts","../src/types/primitives.ts","../src/types/composites.ts","../src/types/index.ts","../src/manifest/index.ts","../src/errors.ts","../src/validation/index.ts","../src/router/handler.ts","../src/page/handler.ts","../src/page/route-matcher.ts","../src/resolve.ts","../src/router/index.ts","../src/channel.ts","../src/page/index.ts","../src/mime.ts","../src/http.ts","../src/page/build-loader.ts","../src/subscription.ts","../src/ws.ts","../src/proxy.ts","../src/dev/reload-watcher.ts"],"sourcesContent":["/* src/server/core/typescript/src/types/schema.ts */\n\nimport type { Schema } from \"jtd\";\n\nexport type JTDSchema = Schema;\n\nexport interface SchemaNode<TOutput = unknown> {\n readonly _schema: JTDSchema;\n /** Phantom type marker — never exists at runtime */\n readonly _output: TOutput;\n}\n\nexport interface OptionalSchemaNode<TOutput = unknown> extends SchemaNode<TOutput> {\n readonly _optional: true;\n}\n\nexport type Infer<T extends SchemaNode> = T[\"_output\"];\n\nexport function createSchemaNode<T>(schema: JTDSchema): SchemaNode<T> {\n return { _schema: schema } as SchemaNode<T>;\n}\n\nexport function createOptionalSchemaNode<T>(schema: JTDSchema): OptionalSchemaNode<T> {\n return { _schema: schema, _optional: true } as OptionalSchemaNode<T>;\n}\n","/* src/server/core/typescript/src/types/primitives.ts */\n\nimport type { SchemaNode } from \"./schema.js\";\nimport { createSchemaNode } from \"./schema.js\";\n\nexport function string(): SchemaNode<string> {\n return createSchemaNode<string>({ type: \"string\" });\n}\n\nexport function boolean(): SchemaNode<boolean> {\n return createSchemaNode<boolean>({ type: \"boolean\" });\n}\n\nexport function int8(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"int8\" });\n}\n\nexport function int16(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"int16\" });\n}\n\nexport function int32(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"int32\" });\n}\n\nexport function uint8(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"uint8\" });\n}\n\nexport function uint16(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"uint16\" });\n}\n\nexport function uint32(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"uint32\" });\n}\n\nexport function float32(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"float32\" });\n}\n\nexport function float64(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"float64\" });\n}\n\nexport function timestamp(): SchemaNode<string> {\n return createSchemaNode<string>({ type: \"timestamp\" });\n}\n\nexport function html(): SchemaNode<string> {\n return createSchemaNode<string>({ type: \"string\", metadata: { format: \"html\" } });\n}\n","/* src/server/core/typescript/src/types/composites.ts */\n\nimport type { SchemaNode, OptionalSchemaNode, Infer, JTDSchema } from \"./schema.js\";\nimport { createSchemaNode, createOptionalSchemaNode } from \"./schema.js\";\n\n// -- Type-level utilities --\n\ntype Simplify<T> = { [K in keyof T]: T[K] } & {};\n\ntype RequiredKeys<T extends Record<string, SchemaNode>> = {\n [K in keyof T]: T[K] extends OptionalSchemaNode ? never : K;\n}[keyof T];\n\ntype OptionalKeys<T extends Record<string, SchemaNode>> = {\n [K in keyof T]: T[K] extends OptionalSchemaNode ? K : never;\n}[keyof T];\n\ntype InferObject<T extends Record<string, SchemaNode>> = Simplify<\n { [K in RequiredKeys<T>]: Infer<T[K]> } & { [K in OptionalKeys<T>]?: Infer<T[K]> }\n>;\n\n// -- Builders --\n\nexport function object<T extends Record<string, SchemaNode>>(\n fields: T,\n): SchemaNode<InferObject<T>> {\n const properties: Record<string, JTDSchema> = {};\n const optionalProperties: Record<string, JTDSchema> = {};\n\n for (const [key, node] of Object.entries(fields)) {\n if (\"_optional\" in node && node._optional === true) {\n optionalProperties[key] = node._schema;\n } else {\n properties[key] = node._schema;\n }\n }\n\n const schema: Record<string, unknown> = {};\n if (Object.keys(properties).length > 0 || Object.keys(optionalProperties).length === 0) {\n schema.properties = properties;\n }\n if (Object.keys(optionalProperties).length > 0) {\n schema.optionalProperties = optionalProperties;\n }\n\n return createSchemaNode<InferObject<T>>(schema as JTDSchema);\n}\n\nexport function optional<T>(node: SchemaNode<T>): OptionalSchemaNode<T> {\n return createOptionalSchemaNode<T>(node._schema);\n}\n\nexport function array<T>(node: SchemaNode<T>): SchemaNode<T[]> {\n return createSchemaNode<T[]>({ elements: node._schema });\n}\n\nexport function nullable<T>(node: SchemaNode<T>): SchemaNode<T | null> {\n return createSchemaNode<T | null>({ ...node._schema, nullable: true } as JTDSchema);\n}\n\nexport function enumType<const T extends readonly string[]>(values: T): SchemaNode<T[number]> {\n return createSchemaNode<T[number]>({ enum: [...values] } as JTDSchema);\n}\n\nexport function values<T>(node: SchemaNode<T>): SchemaNode<Record<string, T>> {\n return createSchemaNode<Record<string, T>>({ values: node._schema });\n}\n\ntype DiscriminatorUnion<TTag extends string, TMapping extends Record<string, SchemaNode>> = {\n [K in keyof TMapping & string]: Simplify<{ [P in TTag]: K } & Infer<TMapping[K]>>;\n}[keyof TMapping & string];\n\nexport function discriminator<\n TTag extends string,\n TMapping extends Record<string, SchemaNode<Record<string, unknown>>>,\n>(tag: TTag, mapping: TMapping): SchemaNode<DiscriminatorUnion<TTag, TMapping>> {\n const jtdMapping: Record<string, JTDSchema> = {};\n for (const [key, node] of Object.entries(mapping)) {\n jtdMapping[key] = node._schema;\n }\n return createSchemaNode<DiscriminatorUnion<TTag, TMapping>>({\n discriminator: tag,\n mapping: jtdMapping,\n } as JTDSchema);\n}\n","/* src/server/core/typescript/src/types/index.ts */\n\nimport * as primitives from \"./primitives.js\";\nimport {\n object,\n optional,\n array,\n nullable,\n enumType,\n values,\n discriminator,\n} from \"./composites.js\";\n\nexport const t = {\n ...primitives,\n object,\n optional,\n array,\n nullable,\n enum: enumType,\n values,\n discriminator,\n} as const;\n","/* src/server/core/typescript/src/manifest/index.ts */\n\nimport type { Schema } from \"jtd\";\nimport type { SchemaNode } from \"../types/schema.js\";\nimport type { ChannelMeta } from \"../channel.js\";\n\nexport type ProcedureType = \"query\" | \"command\" | \"subscription\";\n\nexport interface ProcedureEntry {\n type: ProcedureType;\n input: Schema;\n output: Schema;\n error?: Schema;\n}\n\nexport interface ProcedureManifest {\n version: number;\n procedures: Record<string, ProcedureEntry>;\n channels?: Record<string, ChannelMeta>;\n}\n\nexport function buildManifest(\n definitions: Record<\n string,\n { input: SchemaNode; output: SchemaNode; type?: string; error?: SchemaNode }\n >,\n channels?: Record<string, ChannelMeta>,\n): ProcedureManifest {\n const mapped: ProcedureManifest[\"procedures\"] = {};\n\n for (const [name, def] of Object.entries(definitions)) {\n const type: ProcedureType =\n def.type === \"subscription\" ? \"subscription\" : def.type === \"command\" ? \"command\" : \"query\";\n const entry: ProcedureEntry = {\n type,\n input: def.input._schema,\n output: def.output._schema,\n };\n if (def.error) {\n entry.error = def.error._schema;\n }\n mapped[name] = entry;\n }\n\n const manifest: ProcedureManifest = { version: 1, procedures: mapped };\n if (channels && Object.keys(channels).length > 0) {\n manifest.channels = channels;\n }\n return manifest;\n}\n","/* src/server/core/typescript/src/errors.ts */\n\nexport type ErrorCode =\n | \"VALIDATION_ERROR\"\n | \"NOT_FOUND\"\n | \"UNAUTHORIZED\"\n | \"FORBIDDEN\"\n | \"RATE_LIMITED\"\n | \"INTERNAL_ERROR\"\n | (string & {});\n\nexport const DEFAULT_STATUS: Record<string, number> = {\n VALIDATION_ERROR: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n RATE_LIMITED: 429,\n INTERNAL_ERROR: 500,\n};\n\nexport class SeamError extends Error {\n readonly code: string;\n readonly status: number;\n\n constructor(code: string, message: string, status?: number) {\n super(message);\n this.code = code;\n this.status = status ?? DEFAULT_STATUS[code] ?? 500;\n this.name = \"SeamError\";\n }\n\n toJSON() {\n return {\n ok: false,\n error: {\n code: this.code,\n message: this.message,\n transient: false,\n },\n };\n }\n}\n","/* src/server/core/typescript/src/validation/index.ts */\n\nimport { validate } from \"jtd\";\nimport type { Schema, ValidationError as JTDValidationError } from \"jtd\";\n\nexport interface ValidationResult {\n valid: boolean;\n errors: JTDValidationError[];\n}\n\nexport function validateInput(schema: Schema, data: unknown): ValidationResult {\n const errors = validate(schema, data, { maxDepth: 32, maxErrors: 10 });\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function formatValidationErrors(errors: JTDValidationError[]): string {\n return errors\n .map((e) => {\n const path = e.instancePath.length > 0 ? e.instancePath.join(\"/\") : \"(root)\";\n const schema = e.schemaPath.join(\"/\");\n return `${path} (schema: ${schema})`;\n })\n .join(\"; \");\n}\n","/* src/server/core/typescript/src/router/handler.ts */\n\nimport { SeamError } from \"../errors.js\";\nimport type { HandleResult, InternalProcedure, InternalSubscription } from \"../procedure.js\";\nimport { validateInput, formatValidationErrors } from \"../validation/index.js\";\n\nexport type { HandleResult, InternalProcedure } from \"../procedure.js\";\n\nexport async function handleRequest(\n procedures: Map<string, InternalProcedure>,\n procedureName: string,\n rawBody: unknown,\n validateOutput?: boolean,\n): Promise<HandleResult> {\n const procedure = procedures.get(procedureName);\n if (!procedure) {\n return {\n status: 404,\n body: new SeamError(\"NOT_FOUND\", `Procedure '${procedureName}' not found`).toJSON(),\n };\n }\n\n const validation = validateInput(procedure.inputSchema, rawBody);\n if (!validation.valid) {\n const details = formatValidationErrors(validation.errors);\n return {\n status: 400,\n body: new SeamError(\"VALIDATION_ERROR\", `Input validation failed: ${details}`).toJSON(),\n };\n }\n\n try {\n const result = await procedure.handler({ input: rawBody });\n\n if (validateOutput) {\n const outValidation = validateInput(procedure.outputSchema, result);\n if (!outValidation.valid) {\n const details = formatValidationErrors(outValidation.errors);\n return {\n status: 500,\n body: new SeamError(\"INTERNAL_ERROR\", `Output validation failed: ${details}`).toJSON(),\n };\n }\n }\n\n return { status: 200, body: { ok: true, data: result } };\n } catch (error) {\n if (error instanceof SeamError) {\n return { status: error.status, body: error.toJSON() };\n }\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n status: 500,\n body: new SeamError(\"INTERNAL_ERROR\", message).toJSON(),\n };\n }\n}\n\nexport interface BatchCall {\n procedure: string;\n input: unknown;\n}\n\nexport type BatchResultItem =\n | { ok: true; data: unknown }\n | { ok: false; error: { code: string; message: string; transient: boolean } };\n\nexport async function handleBatchRequest(\n procedures: Map<string, InternalProcedure>,\n calls: BatchCall[],\n validateOutput?: boolean,\n): Promise<{ results: BatchResultItem[] }> {\n const results = await Promise.all(\n calls.map(async (call) => {\n const result = await handleRequest(procedures, call.procedure, call.input, validateOutput);\n if (result.status === 200) {\n const envelope = result.body as { ok: true; data: unknown };\n return { ok: true as const, data: envelope.data };\n }\n const envelope = result.body as {\n ok: false;\n error: { code: string; message: string; transient: boolean };\n };\n return { ok: false as const, error: envelope.error };\n }),\n );\n return { results };\n}\n\nexport async function* handleSubscription(\n subscriptions: Map<string, InternalSubscription>,\n name: string,\n rawInput: unknown,\n validateOutput?: boolean,\n): AsyncIterable<unknown> {\n const sub = subscriptions.get(name);\n if (!sub) {\n throw new SeamError(\"NOT_FOUND\", `Subscription '${name}' not found`);\n }\n\n const validation = validateInput(sub.inputSchema, rawInput);\n if (!validation.valid) {\n const details = formatValidationErrors(validation.errors);\n throw new SeamError(\"VALIDATION_ERROR\", `Input validation failed: ${details}`);\n }\n\n for await (const value of sub.handler({ input: rawInput })) {\n if (validateOutput) {\n const outValidation = validateInput(sub.outputSchema, value);\n if (!outValidation.valid) {\n const details = formatValidationErrors(outValidation.errors);\n throw new SeamError(\"INTERNAL_ERROR\", `Output validation failed: ${details}`);\n }\n }\n yield value;\n }\n}\n","/* src/server/core/typescript/src/page/handler.ts */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { renderPage, escapeHtml } from \"@canmi/seam-engine\";\nimport { SeamError } from \"../errors.js\";\nimport type { InternalProcedure } from \"../procedure.js\";\nimport type { PageDef, LoaderFn, I18nConfig } from \"./index.js\";\n\nexport interface PageTiming {\n /** Procedure execution time in milliseconds */\n dataFetch: number;\n /** Template injection time in milliseconds */\n inject: number;\n}\n\nexport interface HandlePageResult {\n status: number;\n html: string;\n timing?: PageTiming;\n}\n\nexport interface I18nOpts {\n locale: string;\n config: I18nConfig;\n /** Route pattern for hash-based message lookup */\n routePattern: string;\n}\n\n/** Execute loaders, returning keyed results */\nasync function executeLoaders(\n loaders: Record<string, LoaderFn>,\n params: Record<string, string>,\n procedures: Map<string, InternalProcedure>,\n): Promise<Record<string, unknown>> {\n const entries = Object.entries(loaders);\n const results = await Promise.all(\n entries.map(async ([key, loader]) => {\n const { procedure, input } = loader(params);\n const proc = procedures.get(procedure);\n if (!proc) throw new SeamError(\"INTERNAL_ERROR\", `Procedure '${procedure}' not found`);\n // Skip JTD validation -- loader input is trusted server-side code\n const result = await proc.handler({ input });\n return [key, result] as const;\n }),\n );\n return Object.fromEntries(results);\n}\n\n/** Select the template for a given locale, falling back to the default template */\nfunction selectTemplate(\n defaultTemplate: string,\n localeTemplates: Record<string, string> | undefined,\n locale: string | undefined,\n): string {\n if (locale && localeTemplates) {\n return localeTemplates[locale] ?? defaultTemplate;\n }\n return defaultTemplate;\n}\n\n/** Look up pre-resolved messages for a route + locale. Zero merge, zero filter. */\nfunction lookupMessages(\n config: I18nConfig,\n routePattern: string,\n locale: string,\n): Record<string, string> {\n const routeHash = config.routeHashes[routePattern];\n if (!routeHash) return {};\n\n if (config.mode === \"paged\" && config.distDir) {\n const filePath = join(config.distDir, \"i18n\", routeHash, `${locale}.json`);\n if (existsSync(filePath)) {\n return JSON.parse(readFileSync(filePath, \"utf-8\")) as Record<string, string>;\n }\n return {};\n }\n\n return config.messages[locale]?.[routeHash] ?? {};\n}\n\nexport async function handlePageRequest(\n page: PageDef,\n params: Record<string, string>,\n procedures: Map<string, InternalProcedure>,\n i18nOpts?: I18nOpts,\n): Promise<HandlePageResult> {\n try {\n const t0 = performance.now();\n const layoutChain = page.layoutChain ?? [];\n const locale = i18nOpts?.locale;\n\n // Execute all loaders (layout chain + page) in parallel\n const loaderResults = await Promise.all([\n ...layoutChain.map((layout) => executeLoaders(layout.loaders, params, procedures)),\n executeLoaders(page.loaders, params, procedures),\n ]);\n\n const t1 = performance.now();\n\n // Merge all loader data into a single object\n const allData: Record<string, unknown> = {};\n for (const result of loaderResults) {\n Object.assign(allData, result);\n }\n\n // Compose template: nest page inside layouts via outlet substitution\n const pageTemplate = selectTemplate(page.template, page.localeTemplates, locale);\n let composedTemplate = pageTemplate;\n for (let i = layoutChain.length - 1; i >= 0; i--) {\n const layout = layoutChain[i];\n const layoutTemplate = selectTemplate(layout.template, layout.localeTemplates, locale);\n composedTemplate = layoutTemplate.replace(\"<!--seam:outlet-->\", composedTemplate);\n }\n\n // Build PageConfig for engine\n const config = {\n layout_chain: layoutChain.map((l) => ({\n id: l.id,\n loader_keys: Object.keys(l.loaders),\n })),\n data_id: page.dataId ?? \"__data\",\n head_meta: page.headMeta,\n };\n\n // Build I18nOpts for engine (hash-based lookup — zero merge, zero filter)\n let i18nOptsJson: string | undefined;\n if (i18nOpts) {\n const { config: i18nConfig, routePattern } = i18nOpts;\n const messages = lookupMessages(i18nConfig, routePattern, i18nOpts.locale);\n const routeHash = i18nConfig.routeHashes[routePattern];\n const i18nData: Record<string, unknown> = {\n locale: i18nOpts.locale,\n default_locale: i18nConfig.default,\n messages,\n };\n // Inject content hash and router table when cache is enabled\n if (i18nConfig.cache && routeHash) {\n i18nData.hash = i18nConfig.contentHashes[routeHash]?.[i18nOpts.locale];\n i18nData.router = i18nConfig.contentHashes;\n }\n i18nOptsJson = JSON.stringify(i18nData);\n }\n\n // Single WASM call: inject slots, compose data script, apply locale/meta\n const html = renderPage(\n composedTemplate,\n JSON.stringify(allData),\n JSON.stringify(config),\n i18nOptsJson,\n );\n\n const t2 = performance.now();\n\n return {\n status: 200,\n html,\n timing: { dataFetch: t1 - t0, inject: t2 - t1 },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n status: 500,\n html: `<!DOCTYPE html><html><body><h1>500 Internal Server Error</h1><p>${escapeHtml(message)}</p></body></html>`,\n };\n }\n}\n","/* src/server/core/typescript/src/page/route-matcher.ts */\n\ninterface CompiledRoute {\n segments: RouteSegment[];\n}\n\ntype RouteSegment = { kind: \"static\"; value: string } | { kind: \"param\"; name: string };\n\nfunction compileRoute(pattern: string): CompiledRoute {\n const segments: RouteSegment[] = pattern\n .split(\"/\")\n .filter(Boolean)\n .map((seg) =>\n seg.startsWith(\":\") ? { kind: \"param\", name: seg.slice(1) } : { kind: \"static\", value: seg },\n );\n return { segments };\n}\n\nfunction matchRoute(segments: RouteSegment[], pathParts: string[]): Record<string, string> | null {\n if (segments.length !== pathParts.length) return null;\n const params: Record<string, string> = {};\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n if (seg.kind === \"static\") {\n if (seg.value !== pathParts[i]) return null;\n } else {\n params[seg.name] = pathParts[i];\n }\n }\n return params;\n}\n\nexport class RouteMatcher<T> {\n private routes: { pattern: string; compiled: CompiledRoute; value: T }[] = [];\n\n add(pattern: string, value: T): void {\n this.routes.push({ pattern, compiled: compileRoute(pattern), value });\n }\n\n match(path: string): { value: T; params: Record<string, string>; pattern: string } | null {\n const parts = path.split(\"/\").filter(Boolean);\n for (const route of this.routes) {\n const params = matchRoute(route.compiled.segments, parts);\n if (params) return { value: route.value, params, pattern: route.pattern };\n }\n return null;\n }\n}\n","/* src/server/core/typescript/src/resolve.ts */\n\n// -- New strategy-based API --\n\nexport interface ResolveStrategy {\n readonly kind: string;\n resolve(data: ResolveData): string | null;\n}\n\nexport interface ResolveData {\n readonly url: string;\n readonly pathLocale: string | null;\n readonly cookie: string | undefined;\n readonly acceptLanguage: string | undefined;\n readonly locales: string[];\n readonly defaultLocale: string;\n}\n\n/** URL prefix strategy: trusts pathLocale if it is a known locale */\nexport function fromUrlPrefix(): ResolveStrategy {\n return {\n kind: \"url_prefix\",\n resolve(data) {\n if (data.pathLocale && data.locales.includes(data.pathLocale)) {\n return data.pathLocale;\n }\n return null;\n },\n };\n}\n\n/** Cookie strategy: reads a named cookie and validates against known locales */\nexport function fromCookie(name = \"seam-locale\"): ResolveStrategy {\n return {\n kind: \"cookie\",\n resolve(data) {\n if (!data.cookie) return null;\n for (const pair of data.cookie.split(\";\")) {\n const [k, v] = pair.trim().split(\"=\");\n if (k === name && v && data.locales.includes(v)) return v;\n }\n return null;\n },\n };\n}\n\n/** Accept-Language strategy: parses header with q-value sorting + prefix match */\nexport function fromAcceptLanguage(): ResolveStrategy {\n return {\n kind: \"accept_language\",\n resolve(data) {\n if (!data.acceptLanguage) return null;\n const entries: { lang: string; q: number }[] = [];\n for (const part of data.acceptLanguage.split(\",\")) {\n const trimmed = part.trim();\n const [lang, ...rest] = trimmed.split(\";\");\n let q = 1;\n for (const r of rest) {\n const match = r.trim().match(/^q=(\\d+(?:\\.\\d+)?)$/);\n if (match) q = parseFloat(match[1]);\n }\n entries.push({ lang: lang.trim(), q });\n }\n entries.sort((a, b) => b.q - a.q);\n const localeSet = new Set(data.locales);\n for (const { lang } of entries) {\n if (localeSet.has(lang)) return lang;\n // Prefix match: zh-CN -> zh\n const prefix = lang.split(\"-\")[0];\n if (prefix !== lang && localeSet.has(prefix)) return prefix;\n }\n return null;\n },\n };\n}\n\n/** URL query strategy: reads a query parameter and validates against known locales */\nexport function fromUrlQuery(param = \"lang\"): ResolveStrategy {\n return {\n kind: \"url_query\",\n resolve(data) {\n if (!data.url) return null;\n try {\n const url = new URL(data.url, \"http://localhost\");\n const value = url.searchParams.get(param);\n if (value && data.locales.includes(value)) return value;\n } catch {\n // Invalid URL — skip\n }\n return null;\n },\n };\n}\n\n/** Run strategies in order; first non-null wins, otherwise defaultLocale */\nexport function resolveChain(strategies: ResolveStrategy[], data: ResolveData): string {\n for (const s of strategies) {\n const result = s.resolve(data);\n if (result !== null) return result;\n }\n return data.defaultLocale;\n}\n\n/** Default strategy chain: url_prefix -> cookie -> accept_language */\nexport function defaultStrategies(): ResolveStrategy[] {\n return [fromUrlPrefix(), fromCookie(), fromAcceptLanguage()];\n}\n","/* src/server/core/typescript/src/router/index.ts */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SchemaNode } from \"../types/schema.js\";\nimport type { ProcedureManifest } from \"../manifest/index.js\";\nimport type { HandleResult, InternalProcedure } from \"./handler.js\";\nimport type { InternalSubscription } from \"../procedure.js\";\nimport type { HandlePageResult } from \"../page/handler.js\";\nimport type { PageDef, I18nConfig } from \"../page/index.js\";\nimport type { ChannelResult, ChannelMeta } from \"../channel.js\";\nimport { buildManifest } from \"../manifest/index.js\";\nimport { handleRequest, handleSubscription, handleBatchRequest } from \"./handler.js\";\nimport type { BatchCall, BatchResultItem } from \"./handler.js\";\nimport { handlePageRequest } from \"../page/handler.js\";\nimport { RouteMatcher } from \"../page/route-matcher.js\";\nimport { defaultStrategies, resolveChain } from \"../resolve.js\";\nimport type { ResolveStrategy } from \"../resolve.js\";\n\nexport interface ProcedureDef<TIn = unknown, TOut = unknown> {\n input: SchemaNode<TIn>;\n output: SchemaNode<TOut>;\n error?: SchemaNode;\n handler: (params: { input: TIn }) => TOut | Promise<TOut>;\n}\n\nexport interface CommandDef<TIn = unknown, TOut = unknown> {\n type: \"command\";\n input: SchemaNode<TIn>;\n output: SchemaNode<TOut>;\n error?: SchemaNode;\n handler: (params: { input: TIn }) => TOut | Promise<TOut>;\n}\n\nexport interface SubscriptionDef<TIn = unknown, TOut = unknown> {\n type: \"subscription\";\n input: SchemaNode<TIn>;\n output: SchemaNode<TOut>;\n error?: SchemaNode;\n handler: (params: { input: TIn }) => AsyncIterable<TOut>;\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport type DefinitionMap = Record<\n string,\n ProcedureDef<any, any> | CommandDef<any, any> | SubscriptionDef<any, any>\n>;\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\nfunction isSubscriptionDef(\n def: ProcedureDef | CommandDef | SubscriptionDef,\n): def is SubscriptionDef {\n return \"type\" in def && def.type === \"subscription\";\n}\n\nexport interface RouterOptions {\n pages?: Record<string, PageDef>;\n i18n?: I18nConfig | null;\n validateOutput?: boolean;\n resolve?: ResolveStrategy[];\n channels?: ChannelResult[];\n}\n\nexport interface PageRequestHeaders {\n url?: string;\n cookie?: string;\n acceptLanguage?: string;\n}\n\nexport interface Router<T extends DefinitionMap> {\n manifest(): ProcedureManifest;\n handle(procedureName: string, body: unknown): Promise<HandleResult>;\n handleBatch(calls: BatchCall[]): Promise<{ results: BatchResultItem[] }>;\n handleSubscription(name: string, input: unknown): AsyncIterable<unknown>;\n handlePage(path: string, headers?: PageRequestHeaders): Promise<HandlePageResult | null>;\n readonly hasPages: boolean;\n /** Exposed for adapter access to the definitions */\n readonly procedures: T;\n}\n\n/** Build the resolve strategy list from options */\nfunction buildStrategies(opts?: RouterOptions): {\n strategies: ResolveStrategy[];\n hasUrlPrefix: boolean;\n} {\n const strategies = opts?.resolve ?? defaultStrategies();\n return {\n strategies,\n hasUrlPrefix: strategies.some((s) => s.kind === \"url_prefix\"),\n };\n}\n\n/** Register built-in __seam_i18n_query procedure (route-hash-based lookup) */\nfunction registerI18nQuery(procedureMap: Map<string, InternalProcedure>, config: I18nConfig): void {\n procedureMap.set(\"__seam_i18n_query\", {\n inputSchema: {},\n outputSchema: {},\n handler: ({ input }) => {\n const { route, locale } = input as { route: string; locale: string };\n const messages = lookupI18nMessages(config, route, locale);\n const hash = config.contentHashes[route]?.[locale] ?? \"\";\n return { hash, messages };\n },\n });\n}\n\n/** Look up messages by route hash + locale for RPC query */\nfunction lookupI18nMessages(\n config: I18nConfig,\n routeHash: string,\n locale: string,\n): Record<string, string> {\n if (config.mode === \"paged\" && config.distDir) {\n const filePath = join(config.distDir, \"i18n\", routeHash, `${locale}.json`);\n if (existsSync(filePath)) {\n return JSON.parse(readFileSync(filePath, \"utf-8\")) as Record<string, string>;\n }\n return {};\n }\n return config.messages[locale]?.[routeHash] ?? {};\n}\n\nexport function createRouter<T extends DefinitionMap>(\n procedures: T,\n opts?: RouterOptions,\n): Router<T> {\n const procedureMap = new Map<string, InternalProcedure>();\n const subscriptionMap = new Map<string, InternalSubscription>();\n\n for (const [name, def] of Object.entries(procedures)) {\n if (isSubscriptionDef(def)) {\n subscriptionMap.set(name, {\n inputSchema: def.input._schema,\n outputSchema: def.output._schema,\n handler: def.handler as InternalSubscription[\"handler\"],\n });\n } else {\n // Both ProcedureDef (query) and CommandDef share the same handler path\n procedureMap.set(name, {\n inputSchema: def.input._schema,\n outputSchema: def.output._schema,\n handler: def.handler as InternalProcedure[\"handler\"],\n });\n }\n }\n\n const shouldValidateOutput =\n opts?.validateOutput ??\n (typeof process !== \"undefined\" && process.env.NODE_ENV !== \"production\");\n\n const pageMatcher = new RouteMatcher<PageDef>();\n const pages = opts?.pages;\n if (pages) {\n for (const [pattern, page] of Object.entries(pages)) {\n pageMatcher.add(pattern, page);\n }\n }\n\n const i18nConfig = opts?.i18n ?? null;\n const { strategies, hasUrlPrefix } = buildStrategies(opts);\n if (i18nConfig) registerI18nQuery(procedureMap, i18nConfig);\n\n // Collect channel metadata for manifest\n const channelsMeta: Record<string, ChannelMeta> | undefined =\n opts?.channels && opts.channels.length > 0\n ? Object.fromEntries(\n opts.channels.map((ch) => {\n // Derive name from the first procedure key prefix\n const firstKey = Object.keys(ch.procedures)[0] ?? \"\";\n const name = firstKey.includes(\".\")\n ? firstKey.slice(0, firstKey.indexOf(\".\"))\n : firstKey;\n return [name, ch.channelMeta];\n }),\n )\n : undefined;\n\n return {\n procedures,\n hasPages: !!pages && Object.keys(pages).length > 0,\n manifest() {\n return buildManifest(procedures, channelsMeta);\n },\n handle(procedureName, body) {\n return handleRequest(procedureMap, procedureName, body, shouldValidateOutput);\n },\n handleBatch(calls) {\n return handleBatchRequest(procedureMap, calls, shouldValidateOutput);\n },\n handleSubscription(name, input) {\n return handleSubscription(subscriptionMap, name, input, shouldValidateOutput);\n },\n async handlePage(path, headers) {\n let pathLocale: string | null = null;\n let routePath = path;\n\n if (hasUrlPrefix && i18nConfig) {\n const segments = path.split(\"/\").filter(Boolean);\n const localeSet = new Set(i18nConfig.locales);\n if (segments.length > 0 && localeSet.has(segments[0])) {\n pathLocale = segments[0];\n routePath = \"/\" + segments.slice(1).join(\"/\") || \"/\";\n }\n }\n\n let locale: string | undefined;\n if (i18nConfig) {\n locale = resolveChain(strategies, {\n url: headers?.url ?? \"\",\n pathLocale,\n cookie: headers?.cookie,\n acceptLanguage: headers?.acceptLanguage,\n locales: i18nConfig.locales,\n defaultLocale: i18nConfig.default,\n });\n }\n\n const match = pageMatcher.match(routePath);\n if (!match) return null;\n\n const i18nOpts =\n locale && i18nConfig\n ? { locale, config: i18nConfig, routePattern: match.pattern }\n : undefined;\n return handlePageRequest(match.value, match.params, procedureMap, i18nOpts);\n },\n };\n}\n","/* src/server/core/typescript/src/channel.ts */\n\nimport type { Schema } from \"jtd\";\nimport type { SchemaNode, Infer, JTDSchema } from \"./types/schema.js\";\nimport type { CommandDef, SubscriptionDef, DefinitionMap } from \"./router/index.js\";\n\n// -- Public types --\n\nexport interface IncomingDef<TIn = unknown, TOut = unknown> {\n input: SchemaNode<TIn>;\n output: SchemaNode<TOut>;\n error?: SchemaNode;\n handler: (params: { input: TIn }) => TOut | Promise<TOut>;\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport interface ChannelDef<\n TChannelIn = unknown,\n TIncoming extends Record<string, IncomingDef<any, any>> = Record<string, IncomingDef<any, any>>,\n TOutgoing extends Record<string, SchemaNode<Record<string, unknown>>> = Record<\n string,\n SchemaNode<Record<string, unknown>>\n >,\n> {\n input: SchemaNode<TChannelIn>;\n incoming: TIncoming;\n outgoing: TOutgoing;\n subscribe: (params: { input: TChannelIn }) => AsyncIterable<ChannelEvent<TOutgoing>>;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\ntype ChannelEvent<TOutgoing extends Record<string, SchemaNode<Record<string, unknown>>>> = {\n [K in keyof TOutgoing & string]: { type: K; payload: Infer<TOutgoing[K]> };\n}[keyof TOutgoing & string];\n\n/** IR hint stored in the manifest `channels` field */\nexport interface ChannelMeta {\n input: Schema;\n incoming: Record<string, { input: Schema; output: Schema; error?: Schema }>;\n outgoing: Record<string, Schema>;\n}\n\nexport interface ChannelResult {\n /** Expanded Level 0 procedure definitions — spread into createRouter */\n procedures: DefinitionMap;\n /** IR hint for codegen */\n channelMeta: ChannelMeta;\n}\n\n// -- Helpers --\n\n/** Merge channel-level and message-level JTD properties schemas */\nfunction mergeObjectSchemas(channel: JTDSchema, message: JTDSchema): JTDSchema {\n const channelProps = (channel as Record<string, unknown>).properties as\n | Record<string, JTDSchema>\n | undefined;\n const channelOptional = (channel as Record<string, unknown>).optionalProperties as\n | Record<string, JTDSchema>\n | undefined;\n const msgProps = (message as Record<string, unknown>).properties as\n | Record<string, JTDSchema>\n | undefined;\n const msgOptional = (message as Record<string, unknown>).optionalProperties as\n | Record<string, JTDSchema>\n | undefined;\n\n const merged: Record<string, unknown> = {};\n\n const props = { ...channelProps, ...msgProps };\n if (Object.keys(props).length > 0) {\n merged.properties = props;\n }\n\n const optProps = { ...channelOptional, ...msgOptional };\n if (Object.keys(optProps).length > 0) {\n merged.optionalProperties = optProps;\n }\n\n // Empty object schema needs at least empty properties\n if (!merged.properties && !merged.optionalProperties) {\n merged.properties = {};\n }\n\n return merged as JTDSchema;\n}\n\n/** Build a tagged union schema from outgoing event definitions */\nfunction buildOutgoingUnionSchema(\n outgoing: Record<string, SchemaNode<Record<string, unknown>>>,\n): JTDSchema {\n const mapping: Record<string, JTDSchema> = {};\n for (const [eventName, node] of Object.entries(outgoing)) {\n // Wrap each outgoing payload as a \"payload\" property\n mapping[eventName] = {\n properties: { payload: node._schema },\n } as JTDSchema;\n }\n return { discriminator: \"type\", mapping } as JTDSchema;\n}\n\n// -- Main API --\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport function createChannel<\n TChannelIn,\n TIncoming extends Record<string, IncomingDef<any, any>>,\n TOutgoing extends Record<string, SchemaNode<Record<string, unknown>>>,\n>(name: string, def: ChannelDef<TChannelIn, TIncoming, TOutgoing>): ChannelResult {\n const procedures: DefinitionMap = {};\n const channelInputSchema = def.input._schema;\n\n // Expand incoming messages to command procedures\n for (const [msgName, msgDef] of Object.entries(def.incoming)) {\n const mergedInputSchema = mergeObjectSchemas(channelInputSchema, msgDef.input._schema);\n\n const command: CommandDef<any, any> = {\n type: \"command\",\n input: { _schema: mergedInputSchema } as SchemaNode<any>,\n output: msgDef.output,\n handler: msgDef.handler as CommandDef<any, any>[\"handler\"],\n };\n if (msgDef.error) {\n command.error = msgDef.error;\n }\n procedures[`${name}.${msgName}`] = command;\n }\n\n // Expand subscribe to a subscription with tagged union output\n const unionSchema = buildOutgoingUnionSchema(def.outgoing);\n const subscription: SubscriptionDef<any, any> = {\n type: \"subscription\",\n input: def.input as SchemaNode<any>,\n output: { _schema: unionSchema } as SchemaNode<any>,\n handler: def.subscribe as SubscriptionDef<any, any>[\"handler\"],\n };\n procedures[`${name}.events`] = subscription;\n\n // Build channel metadata for manifest IR hint\n const incomingMeta: ChannelMeta[\"incoming\"] = {};\n for (const [msgName, msgDef] of Object.entries(def.incoming)) {\n const entry: { input: Schema; output: Schema; error?: Schema } = {\n input: msgDef.input._schema,\n output: msgDef.output._schema,\n };\n if (msgDef.error) {\n entry.error = msgDef.error._schema;\n }\n incomingMeta[msgName] = entry;\n }\n\n const outgoingMeta: ChannelMeta[\"outgoing\"] = {};\n for (const [eventName, node] of Object.entries(def.outgoing)) {\n outgoingMeta[eventName] = node._schema;\n }\n\n const channelMeta: ChannelMeta = {\n input: channelInputSchema,\n incoming: incomingMeta,\n outgoing: outgoingMeta,\n };\n\n return { procedures, channelMeta };\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","/* src/server/core/typescript/src/page/index.ts */\n\nexport interface LoaderResult {\n procedure: string;\n input: unknown;\n}\n\nexport type LoaderFn = (params: Record<string, string>) => LoaderResult;\n\nexport interface LayoutDef {\n id: string;\n template: string;\n localeTemplates?: Record<string, string>;\n loaders: Record<string, LoaderFn>;\n i18nKeys?: string[];\n}\n\nexport interface PageDef {\n template: string;\n localeTemplates?: Record<string, string>;\n loaders: Record<string, LoaderFn>;\n layoutChain?: LayoutDef[];\n headMeta?: string;\n dataId?: string;\n i18nKeys?: string[];\n}\n\nexport interface I18nConfig {\n locales: string[];\n default: string;\n mode: \"memory\" | \"paged\";\n cache: boolean;\n routeHashes: Record<string, string>;\n contentHashes: Record<string, Record<string, string>>;\n /** Memory mode: locale → routeHash → messages */\n messages: Record<string, Record<string, Record<string, string>>>;\n /** Paged mode: base directory for on-demand reads */\n distDir?: string;\n}\n\nexport function definePage(config: PageDef): PageDef {\n return { ...config, layoutChain: config.layoutChain ?? [] };\n}\n","/* src/server/core/typescript/src/mime.ts */\n\nexport const MIME_TYPES: Record<string, string> = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".html\": \"text/html\",\n \".json\": \"application/json\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".ico\": \"image/x-icon\",\n \".map\": \"application/json\",\n \".ts\": \"application/javascript\",\n \".tsx\": \"application/javascript\",\n};\n","/* src/server/core/typescript/src/http.ts */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\nimport type { Router, DefinitionMap } from \"./router/index.js\";\nimport { SeamError } from \"./errors.js\";\nimport { MIME_TYPES } from \"./mime.js\";\n\nexport interface HttpRequest {\n method: string;\n url: string;\n body: () => Promise<unknown>;\n header?: (name: string) => string | null;\n}\n\nexport interface HttpBodyResponse {\n status: number;\n headers: Record<string, string>;\n body: unknown;\n}\n\nexport interface HttpStreamResponse {\n status: number;\n headers: Record<string, string>;\n stream: AsyncIterable<string>;\n}\n\nexport type HttpResponse = HttpBodyResponse | HttpStreamResponse;\n\nexport type HttpHandler = (req: HttpRequest) => Promise<HttpResponse>;\n\nexport interface RpcHashMap {\n procedures: Record<string, string>;\n batch: string;\n}\n\nexport interface HttpHandlerOptions {\n staticDir?: string;\n fallback?: HttpHandler;\n rpcHashMap?: RpcHashMap;\n}\n\nconst PROCEDURE_PREFIX = \"/_seam/procedure/\";\nconst PAGE_PREFIX = \"/_seam/page/\";\nconst STATIC_PREFIX = \"/_seam/static/\";\nconst MANIFEST_PATH = \"/_seam/manifest.json\";\n\nconst JSON_HEADER = { \"Content-Type\": \"application/json\" };\nconst HTML_HEADER = { \"Content-Type\": \"text/html; charset=utf-8\" };\nconst SSE_HEADER = {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n};\nconst IMMUTABLE_CACHE = \"public, max-age=31536000, immutable\";\n\nfunction jsonResponse(status: number, body: unknown): HttpBodyResponse {\n return { status, headers: JSON_HEADER, body };\n}\n\nfunction errorResponse(status: number, code: string, message: string): HttpBodyResponse {\n return jsonResponse(status, new SeamError(code, message).toJSON());\n}\n\nasync function handleStaticAsset(assetPath: string, staticDir: string): Promise<HttpBodyResponse> {\n if (assetPath.includes(\"..\")) {\n return errorResponse(403, \"VALIDATION_ERROR\", \"Forbidden\");\n }\n\n const filePath = join(staticDir, assetPath);\n try {\n const content = await readFile(filePath, \"utf-8\");\n const ext = extname(filePath);\n const contentType = MIME_TYPES[ext] || \"application/octet-stream\";\n return {\n status: 200,\n headers: {\n \"Content-Type\": contentType,\n \"Cache-Control\": IMMUTABLE_CACHE,\n },\n body: content,\n };\n } catch {\n return errorResponse(404, \"NOT_FOUND\", \"Asset not found\");\n }\n}\n\n/** Format a single SSE data event */\nexport function sseDataEvent(data: unknown): string {\n return `event: data\\ndata: ${JSON.stringify(data)}\\n\\n`;\n}\n\n/** Format an SSE error event */\nexport function sseErrorEvent(code: string, message: string, transient = false): string {\n return `event: error\\ndata: ${JSON.stringify({ code, message, transient })}\\n\\n`;\n}\n\n/** Format an SSE complete event */\nexport function sseCompleteEvent(): string {\n return \"event: complete\\ndata: {}\\n\\n\";\n}\n\nasync function* sseStream<T extends DefinitionMap>(\n router: Router<T>,\n name: string,\n input: unknown,\n): AsyncIterable<string> {\n try {\n for await (const value of router.handleSubscription(name, input)) {\n yield sseDataEvent(value);\n }\n yield sseCompleteEvent();\n } catch (error) {\n if (error instanceof SeamError) {\n yield sseErrorEvent(error.code, error.message);\n } else {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n yield sseErrorEvent(\"INTERNAL_ERROR\", message);\n }\n }\n}\n\nasync function handleBatchHttp<T extends DefinitionMap>(\n req: HttpRequest,\n router: Router<T>,\n hashToName: Map<string, string> | null,\n): Promise<HttpBodyResponse> {\n let body: unknown;\n try {\n body = await req.body();\n } catch {\n return errorResponse(400, \"VALIDATION_ERROR\", \"Invalid JSON body\");\n }\n if (!body || typeof body !== \"object\" || !Array.isArray((body as { calls?: unknown }).calls)) {\n return errorResponse(400, \"VALIDATION_ERROR\", \"Batch request must have a 'calls' array\");\n }\n const calls = (body as { calls: Array<{ procedure?: unknown; input?: unknown }> }).calls.map(\n (c) => ({\n procedure:\n typeof c.procedure === \"string\" ? (hashToName?.get(c.procedure) ?? c.procedure) : \"\",\n input: c.input ?? {},\n }),\n );\n const result = await router.handleBatch(calls);\n return jsonResponse(200, { ok: true, data: result });\n}\n\nexport function createHttpHandler<T extends DefinitionMap>(\n router: Router<T>,\n opts?: HttpHandlerOptions,\n): HttpHandler {\n // Build reverse lookup (hash -> original name) when obfuscation is active\n const hashToName: Map<string, string> | null = opts?.rpcHashMap\n ? new Map(Object.entries(opts.rpcHashMap.procedures).map(([n, h]) => [h, n]))\n : null;\n // Built-in procedures bypass hash obfuscation (identity mapping)\n if (hashToName) {\n hashToName.set(\"__seam_i18n_query\", \"__seam_i18n_query\");\n }\n const batchHash = opts?.rpcHashMap?.batch ?? null;\n\n return async (req) => {\n const url = new URL(req.url, \"http://localhost\");\n const { pathname } = url;\n\n if (req.method === \"GET\" && pathname === MANIFEST_PATH) {\n if (opts?.rpcHashMap) return errorResponse(403, \"FORBIDDEN\", \"Manifest disabled\");\n return jsonResponse(200, router.manifest());\n }\n\n if (pathname.startsWith(PROCEDURE_PREFIX)) {\n let name = pathname.slice(PROCEDURE_PREFIX.length);\n if (!name) {\n return errorResponse(404, \"NOT_FOUND\", \"Empty procedure name\");\n }\n\n if (req.method === \"POST\") {\n // Batch: match both original \"_batch\" and hashed batch endpoint\n if (name === \"_batch\" || (batchHash && name === batchHash)) {\n return handleBatchHttp(req, router, hashToName);\n }\n\n // Resolve hash -> original name when obfuscation is active\n if (hashToName) {\n const resolved = hashToName.get(name);\n if (!resolved) return errorResponse(404, \"NOT_FOUND\", \"Not found\");\n name = resolved;\n }\n\n let body: unknown;\n try {\n body = await req.body();\n } catch {\n return errorResponse(400, \"VALIDATION_ERROR\", \"Invalid JSON body\");\n }\n\n const result = await router.handle(name, body);\n return jsonResponse(result.status, result.body);\n }\n\n if (req.method === \"GET\") {\n // Resolve hash -> original name for subscriptions\n if (hashToName) {\n const resolved = hashToName.get(name);\n if (!resolved) return errorResponse(404, \"NOT_FOUND\", \"Not found\");\n name = resolved;\n }\n\n const rawInput = url.searchParams.get(\"input\");\n let input: unknown;\n try {\n input = rawInput ? JSON.parse(rawInput) : {};\n } catch {\n return errorResponse(400, \"VALIDATION_ERROR\", \"Invalid input query parameter\");\n }\n\n return { status: 200, headers: SSE_HEADER, stream: sseStream(router, name, input) };\n }\n }\n\n // Pages are served under /_seam/page/* prefix only.\n // Root-path serving is the application's responsibility — see the\n // github-dashboard ts-hono example for the fallback pattern.\n if (req.method === \"GET\" && pathname.startsWith(PAGE_PREFIX) && router.hasPages) {\n const pagePath = \"/\" + pathname.slice(PAGE_PREFIX.length);\n const headers = req.header\n ? {\n url: req.url,\n cookie: req.header(\"cookie\") ?? undefined,\n acceptLanguage: req.header(\"accept-language\") ?? undefined,\n }\n : undefined;\n const result = await router.handlePage(pagePath, headers);\n if (result) {\n return { status: result.status, headers: HTML_HEADER, body: result.html };\n }\n }\n\n if (req.method === \"GET\" && pathname.startsWith(STATIC_PREFIX) && opts?.staticDir) {\n const assetPath = pathname.slice(STATIC_PREFIX.length);\n return handleStaticAsset(assetPath, opts.staticDir);\n }\n\n if (opts?.fallback) return opts.fallback(req);\n return errorResponse(404, \"NOT_FOUND\", \"Not found\");\n };\n}\n\nexport function serialize(body: unknown): string {\n return typeof body === \"string\" ? body : JSON.stringify(body);\n}\n\n/** Consume an async stream chunk-by-chunk; return false from write to stop early. */\nexport async function drainStream(\n stream: AsyncIterable<string>,\n write: (chunk: string) => boolean | void,\n): Promise<void> {\n try {\n for await (const chunk of stream) {\n if (write(chunk) === false) break;\n }\n } catch {\n // Client disconnected\n }\n}\n\n/** Convert an HttpResponse to a Web API Response (for adapters using fetch-compatible runtimes) */\nexport function toWebResponse(result: HttpResponse): Response {\n if (\"stream\" in result) {\n const stream = result.stream;\n const encoder = new TextEncoder();\n const readable = new ReadableStream({\n async start(controller) {\n await drainStream(stream, (chunk) => {\n controller.enqueue(encoder.encode(chunk));\n });\n controller.close();\n },\n });\n return new Response(readable, { status: result.status, headers: result.headers });\n }\n return new Response(serialize(result.body), { status: result.status, headers: result.headers });\n}\n","/* src/server/core/typescript/src/page/build-loader.ts */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { PageDef, LayoutDef, LoaderFn, LoaderResult, I18nConfig } from \"./index.js\";\nimport type { RpcHashMap } from \"../http.js\";\n\ninterface RouteManifest {\n layouts?: Record<string, LayoutManifestEntry>;\n routes: Record<string, RouteManifestEntry>;\n data_id?: string;\n i18n?: {\n locales: string[];\n default: string;\n mode?: string;\n cache?: boolean;\n route_hashes?: Record<string, string>;\n content_hashes?: Record<string, Record<string, string>>;\n };\n}\n\ninterface LayoutManifestEntry {\n template?: string;\n templates?: Record<string, string>;\n loaders?: Record<string, LoaderConfig>;\n parent?: string;\n i18n_keys?: string[];\n}\n\ninterface RouteManifestEntry {\n template?: string;\n templates?: Record<string, string>;\n layout?: string;\n loaders: Record<string, LoaderConfig>;\n head_meta?: string;\n i18n_keys?: string[];\n}\n\ninterface LoaderConfig {\n procedure: string;\n params?: Record<string, ParamConfig>;\n}\n\ninterface ParamConfig {\n from: \"route\";\n type?: \"string\" | \"int\";\n}\n\nfunction buildLoaderFn(config: LoaderConfig): LoaderFn {\n return (params: Record<string, string>): LoaderResult => {\n const input: Record<string, unknown> = {};\n if (config.params) {\n for (const [key, mapping] of Object.entries(config.params)) {\n const raw = params[key];\n input[key] = mapping.type === \"int\" ? Number(raw) : raw;\n }\n }\n return { procedure: config.procedure, input };\n };\n}\n\nfunction buildLoaderFns(configs: Record<string, LoaderConfig>): Record<string, LoaderFn> {\n const fns: Record<string, LoaderFn> = {};\n for (const [key, config] of Object.entries(configs)) {\n fns[key] = buildLoaderFn(config);\n }\n return fns;\n}\n\nfunction resolveTemplatePath(\n entry: { template?: string; templates?: Record<string, string> },\n defaultLocale: string | undefined,\n): string {\n if (entry.template) return entry.template;\n if (entry.templates) {\n const locale = defaultLocale ?? Object.keys(entry.templates)[0];\n const path = entry.templates[locale];\n if (!path) throw new Error(`No template for locale \"${locale}\"`);\n return path;\n }\n throw new Error(\"Manifest entry has neither 'template' nor 'templates'\");\n}\n\n/** Load all locale templates for a manifest entry, keyed by locale */\nfunction loadLocaleTemplates(\n entry: { templates?: Record<string, string> },\n distDir: string,\n): Record<string, string> | undefined {\n if (!entry.templates) return undefined;\n const result: Record<string, string> = {};\n for (const [locale, relPath] of Object.entries(entry.templates)) {\n result[locale] = readFileSync(join(distDir, relPath), \"utf-8\");\n }\n return result;\n}\n\n/** Resolve parent chain for a layout, returning outer-to-inner order */\nfunction resolveLayoutChain(\n layoutId: string,\n layoutEntries: Record<string, LayoutManifestEntry>,\n templates: Record<string, string>,\n localeTemplatesMap: Record<string, Record<string, string>>,\n): LayoutDef[] {\n const chain: LayoutDef[] = [];\n let currentId: string | undefined = layoutId;\n\n while (currentId) {\n const entry: LayoutManifestEntry | undefined = layoutEntries[currentId];\n if (!entry) break;\n chain.push({\n id: currentId,\n template: templates[currentId],\n localeTemplates: localeTemplatesMap[currentId],\n loaders: buildLoaderFns(entry.loaders ?? {}),\n });\n currentId = entry.parent;\n }\n\n // Reverse: we walked inner->outer, but want outer->inner\n chain.reverse();\n return chain;\n}\n\n/** Resolve layout chain with lazy template getters (re-read from disk on each access) */\nfunction resolveLayoutChainDev(\n layoutId: string,\n layoutEntries: Record<string, LayoutManifestEntry>,\n distDir: string,\n defaultLocale: string | undefined,\n): LayoutDef[] {\n const chain: LayoutDef[] = [];\n let currentId: string | undefined = layoutId;\n\n while (currentId) {\n const entry: LayoutManifestEntry | undefined = layoutEntries[currentId];\n if (!entry) break;\n const layoutTemplatePath = join(distDir, resolveTemplatePath(entry, defaultLocale));\n const def: LayoutDef = {\n id: currentId,\n template: \"\", // placeholder, overridden by getter\n localeTemplates: entry.templates\n ? makeLocaleTemplateGetters(entry.templates, distDir)\n : undefined,\n loaders: buildLoaderFns(entry.loaders ?? {}),\n };\n Object.defineProperty(def, \"template\", {\n get: () => readFileSync(layoutTemplatePath, \"utf-8\"),\n enumerable: true,\n });\n chain.push(def);\n currentId = entry.parent;\n }\n\n chain.reverse();\n return chain;\n}\n\n/** Create a proxy object that lazily reads locale templates from disk */\nfunction makeLocaleTemplateGetters(\n templates: Record<string, string>,\n distDir: string,\n): Record<string, string> {\n const obj: Record<string, string> = {};\n for (const [locale, relPath] of Object.entries(templates)) {\n const fullPath = join(distDir, relPath);\n Object.defineProperty(obj, locale, {\n get: () => readFileSync(fullPath, \"utf-8\"),\n enumerable: true,\n });\n }\n return obj;\n}\n\n/** Merge i18n_keys from route + layout chain into a single list */\nfunction mergeI18nKeys(\n route: RouteManifestEntry,\n layoutEntries: Record<string, LayoutManifestEntry>,\n): string[] | undefined {\n const keys: string[] = [];\n if (route.layout) {\n let currentId: string | undefined = route.layout;\n while (currentId) {\n const entry: LayoutManifestEntry | undefined = layoutEntries[currentId];\n if (!entry) break;\n if (entry.i18n_keys) keys.push(...entry.i18n_keys);\n currentId = entry.parent;\n }\n }\n if (route.i18n_keys) keys.push(...route.i18n_keys);\n return keys.length > 0 ? keys : undefined;\n}\n\n/** Load the RPC hash map from build output (returns undefined when obfuscation is off) */\nexport function loadRpcHashMap(distDir: string): RpcHashMap | undefined {\n const hashMapPath = join(distDir, \"rpc-hash-map.json\");\n try {\n return JSON.parse(readFileSync(hashMapPath, \"utf-8\")) as RpcHashMap;\n } catch {\n return undefined;\n }\n}\n\n/** Load i18n config and messages from build output */\nexport function loadI18nMessages(distDir: string): I18nConfig | null {\n const manifestPath = join(distDir, \"route-manifest.json\");\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf-8\")) as RouteManifest;\n if (!manifest.i18n) return null;\n\n const mode = (manifest.i18n.mode ?? \"memory\") as \"memory\" | \"paged\";\n const cache = manifest.i18n.cache ?? false;\n const routeHashes = manifest.i18n.route_hashes ?? {};\n const contentHashes = manifest.i18n.content_hashes ?? {};\n\n // Memory mode: preload all route messages per locale\n // Paged mode: store distDir for on-demand reads\n const messages: Record<string, Record<string, Record<string, string>>> = {};\n if (mode === \"memory\") {\n const i18nDir = join(distDir, \"i18n\");\n for (const locale of manifest.i18n.locales) {\n const localePath = join(i18nDir, `${locale}.json`);\n if (existsSync(localePath)) {\n messages[locale] = JSON.parse(readFileSync(localePath, \"utf-8\")) as Record<\n string,\n Record<string, string>\n >;\n } else {\n messages[locale] = {};\n }\n }\n }\n\n return {\n locales: manifest.i18n.locales,\n default: manifest.i18n.default,\n mode,\n cache,\n routeHashes,\n contentHashes,\n messages,\n distDir: mode === \"paged\" ? distDir : undefined,\n };\n } catch {\n return null;\n }\n}\n\nexport function loadBuildOutput(distDir: string): Record<string, PageDef> {\n const manifestPath = join(distDir, \"route-manifest.json\");\n const raw = readFileSync(manifestPath, \"utf-8\");\n const manifest = JSON.parse(raw) as RouteManifest;\n const defaultLocale = manifest.i18n?.default;\n\n // Load layout templates (default + all locales)\n const layoutTemplates: Record<string, string> = {};\n const layoutLocaleTemplates: Record<string, Record<string, string>> = {};\n const layoutEntries = manifest.layouts ?? {};\n for (const [id, entry] of Object.entries(layoutEntries)) {\n layoutTemplates[id] = readFileSync(\n join(distDir, resolveTemplatePath(entry, defaultLocale)),\n \"utf-8\",\n );\n const lt = loadLocaleTemplates(entry, distDir);\n if (lt) layoutLocaleTemplates[id] = lt;\n }\n\n const pages: Record<string, PageDef> = {};\n for (const [path, entry] of Object.entries(manifest.routes)) {\n const templatePath = join(distDir, resolveTemplatePath(entry, defaultLocale));\n const template = readFileSync(templatePath, \"utf-8\");\n\n const loaders = buildLoaderFns(entry.loaders);\n const layoutChain = entry.layout\n ? resolveLayoutChain(entry.layout, layoutEntries, layoutTemplates, layoutLocaleTemplates)\n : [];\n\n // Merge i18n_keys from layout chain + route\n const i18nKeys = mergeI18nKeys(entry, layoutEntries);\n\n pages[path] = {\n template,\n localeTemplates: loadLocaleTemplates(entry, distDir),\n loaders,\n layoutChain,\n headMeta: entry.head_meta,\n dataId: manifest.data_id,\n i18nKeys,\n };\n }\n return pages;\n}\n\n/** Load build output with lazy template getters -- templates re-read from disk on each access */\nexport function loadBuildOutputDev(distDir: string): Record<string, PageDef> {\n const manifestPath = join(distDir, \"route-manifest.json\");\n const raw = readFileSync(manifestPath, \"utf-8\");\n const manifest = JSON.parse(raw) as RouteManifest;\n const defaultLocale = manifest.i18n?.default;\n\n const layoutEntries = manifest.layouts ?? {};\n\n const pages: Record<string, PageDef> = {};\n for (const [path, entry] of Object.entries(manifest.routes)) {\n const templatePath = join(distDir, resolveTemplatePath(entry, defaultLocale));\n const loaders = buildLoaderFns(entry.loaders);\n const layoutChain = entry.layout\n ? resolveLayoutChainDev(entry.layout, layoutEntries, distDir, defaultLocale)\n : [];\n\n const localeTemplates = entry.templates\n ? makeLocaleTemplateGetters(entry.templates, distDir)\n : undefined;\n\n // Merge i18n_keys from layout chain + route\n const i18nKeys = mergeI18nKeys(entry, layoutEntries);\n\n const page: PageDef = {\n template: \"\", // placeholder, overridden by getter\n localeTemplates,\n loaders,\n layoutChain,\n dataId: manifest.data_id,\n i18nKeys,\n };\n Object.defineProperty(page, \"template\", {\n get: () => readFileSync(templatePath, \"utf-8\"),\n enumerable: true,\n });\n pages[path] = page;\n }\n return pages;\n}\n","/* src/server/core/typescript/src/subscription.ts */\n\n/**\n * Bridge callback-style event sources to an AsyncGenerator.\n *\n * Usage:\n * const stream = fromCallback<string>(({ emit, end, error }) => {\n * emitter.on(\"data\", emit);\n * emitter.on(\"end\", end);\n * emitter.on(\"error\", error);\n * return () => emitter.removeAllListeners();\n * });\n */\nexport interface CallbackSink<T> {\n emit: (value: T) => void;\n end: () => void;\n error: (err: Error) => void;\n}\n\ntype QueueItem<T> = { type: \"value\"; value: T } | { type: \"end\" } | { type: \"error\"; error: Error };\n\nexport function fromCallback<T>(\n setup: (sink: CallbackSink<T>) => (() => void) | void,\n): AsyncGenerator<T, void, undefined> {\n const queue: QueueItem<T>[] = [];\n let resolve: (() => void) | null = null;\n let done = false;\n function notify() {\n if (resolve) {\n const r = resolve;\n resolve = null;\n r();\n }\n }\n\n const sink: CallbackSink<T> = {\n emit(value) {\n if (done) return;\n queue.push({ type: \"value\", value });\n notify();\n },\n end() {\n if (done) return;\n done = true;\n queue.push({ type: \"end\" });\n notify();\n },\n error(err) {\n if (done) return;\n done = true;\n queue.push({ type: \"error\", error: err });\n notify();\n },\n };\n\n const cleanup = setup(sink);\n\n async function* generate(): AsyncGenerator<T, void, undefined> {\n try {\n while (true) {\n if (queue.length === 0) {\n await new Promise<void>((r) => {\n resolve = r;\n });\n }\n\n while (queue.length > 0) {\n const item = queue.shift()!;\n if (item.type === \"value\") {\n yield item.value;\n } else if (item.type === \"error\") {\n throw item.error;\n } else {\n return;\n }\n }\n }\n } finally {\n done = true;\n if (cleanup) cleanup();\n }\n }\n\n return generate();\n}\n","/* src/server/core/typescript/src/ws.ts */\n\nimport type { Router, DefinitionMap } from \"./router/index.js\";\nimport { SeamError } from \"./errors.js\";\n\nexport interface WsSink {\n send(data: string): void;\n}\n\nexport interface ChannelWsSession {\n onMessage(data: string): void;\n close(): void;\n}\n\nexport interface ChannelWsOptions {\n heartbeatInterval?: number;\n}\n\ninterface UplinkMessage {\n id: string;\n procedure: string;\n input?: unknown;\n}\n\nconst DEFAULT_HEARTBEAT_MS = 30_000;\n\nfunction sendError(ws: WsSink, id: string | null, code: string, message: string): void {\n ws.send(JSON.stringify({ id, ok: false, error: { code, message, transient: false } }));\n}\n\n/**\n * Start a WebSocket session for a channel.\n *\n * Reuses `router.handleSubscription` for the event stream and\n * `router.handle` for uplink command dispatch — no Router changes needed.\n */\nexport function startChannelWs<T extends DefinitionMap>(\n router: Router<T>,\n channelName: string,\n channelInput: unknown,\n ws: WsSink,\n opts?: ChannelWsOptions,\n): ChannelWsSession {\n const heartbeatMs = opts?.heartbeatInterval ?? DEFAULT_HEARTBEAT_MS;\n let closed = false;\n\n // Heartbeat timer\n const heartbeatTimer = setInterval(() => {\n if (!closed) ws.send(JSON.stringify({ heartbeat: true }));\n }, heartbeatMs);\n\n // Start subscription and forward events as { event, payload }\n const subIterable = router.handleSubscription(`${channelName}.events`, channelInput);\n const iter = subIterable[Symbol.asyncIterator]();\n\n void (async () => {\n try {\n for (;;) {\n const result: IteratorResult<unknown> = await iter.next();\n if (result.done || closed) break;\n // Channel subscription yields { type: string, payload: unknown }\n const ev = result.value as { type: string; payload: unknown };\n ws.send(JSON.stringify({ event: ev.type, payload: ev.payload }));\n }\n } catch (err) {\n if (!closed) {\n const code = err instanceof SeamError ? err.code : \"INTERNAL_ERROR\";\n const message = err instanceof Error ? err.message : \"Subscription error\";\n ws.send(JSON.stringify({ event: \"__error\", payload: { code, message } }));\n }\n }\n })();\n\n return {\n onMessage(data: string) {\n if (closed) return;\n\n let msg: UplinkMessage;\n try {\n msg = JSON.parse(data) as UplinkMessage;\n } catch {\n sendError(ws, null, \"VALIDATION_ERROR\", \"Invalid JSON\");\n return;\n }\n\n if (!msg.id || typeof msg.id !== \"string\") {\n sendError(ws, null, \"VALIDATION_ERROR\", \"Missing 'id' field\");\n return;\n }\n\n if (!msg.procedure || typeof msg.procedure !== \"string\") {\n sendError(ws, msg.id, \"VALIDATION_ERROR\", \"Missing 'procedure' field\");\n return;\n }\n\n // Only allow commands belonging to this channel (not .events)\n const prefix = channelName + \".\";\n if (!msg.procedure.startsWith(prefix) || msg.procedure === `${channelName}.events`) {\n sendError(\n ws,\n msg.id,\n \"VALIDATION_ERROR\",\n `Procedure '${msg.procedure}' is not a command of channel '${channelName}'`,\n );\n return;\n }\n\n // Merge channel input + uplink input before dispatching\n const mergedInput = {\n ...(channelInput as Record<string, unknown>),\n ...((msg.input ?? {}) as Record<string, unknown>),\n };\n\n void (async () => {\n try {\n const result = await router.handle(msg.procedure, mergedInput);\n if (result.status === 200) {\n const envelope = result.body as { ok: true; data: unknown };\n ws.send(JSON.stringify({ id: msg.id, ok: true, data: envelope.data }));\n } else {\n const envelope = result.body as {\n ok: false;\n error: { code: string; message: string; transient: boolean };\n };\n ws.send(JSON.stringify({ id: msg.id, ok: false, error: envelope.error }));\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Unknown error\";\n sendError(ws, msg.id, \"INTERNAL_ERROR\", message);\n }\n })();\n },\n\n close() {\n if (closed) return;\n closed = true;\n clearInterval(heartbeatTimer);\n void iter.return?.(undefined);\n },\n };\n}\n","/* src/server/core/typescript/src/proxy.ts */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\nimport type { HttpHandler, HttpBodyResponse } from \"./http.js\";\nimport { MIME_TYPES } from \"./mime.js\";\n\nexport interface DevProxyOptions {\n /** Target URL to forward requests to (e.g. \"http://localhost:5173\") */\n target: string;\n}\n\nexport interface StaticHandlerOptions {\n /** Directory to serve static files from */\n dir: string;\n}\n\n/** Forward non-seam requests to a dev server (e.g. Vite) */\nexport function createDevProxy(opts: DevProxyOptions): HttpHandler {\n const target = opts.target.replace(/\\/$/, \"\");\n\n return async (req) => {\n const url = new URL(req.url, \"http://localhost\");\n const proxyUrl = `${target}${url.pathname}${url.search}`;\n\n try {\n const resp = await fetch(proxyUrl, {\n method: req.method,\n headers: { Accept: \"*/*\" },\n });\n\n const body = await resp.text();\n const headers: Record<string, string> = {};\n resp.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return { status: resp.status, headers, body };\n } catch {\n return {\n status: 502,\n headers: { \"Content-Type\": \"text/plain\" },\n body: `Bad Gateway: failed to connect to ${target}`,\n };\n }\n };\n}\n\n/** Serve static files from a directory, with index.html fallback for directories */\nexport function createStaticHandler(opts: StaticHandlerOptions): HttpHandler {\n const dir = opts.dir;\n\n return async (req): Promise<HttpBodyResponse> => {\n const url = new URL(req.url, \"http://localhost\");\n let filePath = url.pathname;\n\n if (filePath.includes(\"..\")) {\n return {\n status: 403,\n headers: { \"Content-Type\": \"text/plain\" },\n body: \"Forbidden\",\n };\n }\n\n // Serve index.html for directory paths\n if (filePath.endsWith(\"/\")) {\n filePath += \"index.html\";\n }\n\n const fullPath = join(dir, filePath);\n try {\n const content = await readFile(fullPath);\n const ext = extname(fullPath);\n const contentType = MIME_TYPES[ext] || \"application/octet-stream\";\n return {\n status: 200,\n headers: { \"Content-Type\": contentType },\n body: content.toString(),\n };\n } catch {\n return {\n status: 404,\n headers: { \"Content-Type\": \"text/plain\" },\n body: \"Not found\",\n };\n }\n };\n}\n","/* src/server/core/typescript/src/dev/reload-watcher.ts */\n\nimport { watch, type FSWatcher } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface ReloadWatcher {\n close(): void;\n}\n\nexport function watchReloadTrigger(distDir: string, onReload: () => void): ReloadWatcher {\n const triggerPath = join(distDir, \".reload-trigger\");\n let watcher: FSWatcher | null = null;\n try {\n watcher = watch(triggerPath, () => onReload());\n } catch {\n // Trigger file may not exist yet; watch directory until it appears\n const dirWatcher = watch(distDir, (_event, filename) => {\n if (filename === \".reload-trigger\") {\n dirWatcher.close();\n watcher = watch(triggerPath, () => onReload());\n // First creation IS the reload signal -- fire immediately\n onReload();\n }\n });\n return {\n close() {\n dirWatcher.close();\n watcher?.close();\n },\n };\n }\n return {\n close() {\n watcher?.close();\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAkBA,SAAgB,iBAAoB,QAAkC;AACpE,QAAO,EAAE,SAAS,QAAQ;;AAG5B,SAAgB,yBAA4B,QAA0C;AACpF,QAAO;EAAE,SAAS;EAAQ,WAAW;EAAM;;;;;;;;;;;;;;;;;;;AClB7C,SAAgB,SAA6B;AAC3C,QAAO,iBAAyB,EAAE,MAAM,UAAU,CAAC;;AAGrD,SAAgB,UAA+B;AAC7C,QAAO,iBAA0B,EAAE,MAAM,WAAW,CAAC;;AAGvD,SAAgB,OAA2B;AACzC,QAAO,iBAAyB,EAAE,MAAM,QAAQ,CAAC;;AAGnD,SAAgB,QAA4B;AAC1C,QAAO,iBAAyB,EAAE,MAAM,SAAS,CAAC;;AAGpD,SAAgB,QAA4B;AAC1C,QAAO,iBAAyB,EAAE,MAAM,SAAS,CAAC;;AAGpD,SAAgB,QAA4B;AAC1C,QAAO,iBAAyB,EAAE,MAAM,SAAS,CAAC;;AAGpD,SAAgB,SAA6B;AAC3C,QAAO,iBAAyB,EAAE,MAAM,UAAU,CAAC;;AAGrD,SAAgB,SAA6B;AAC3C,QAAO,iBAAyB,EAAE,MAAM,UAAU,CAAC;;AAGrD,SAAgB,UAA8B;AAC5C,QAAO,iBAAyB,EAAE,MAAM,WAAW,CAAC;;AAGtD,SAAgB,UAA8B;AAC5C,QAAO,iBAAyB,EAAE,MAAM,WAAW,CAAC;;AAGtD,SAAgB,YAAgC;AAC9C,QAAO,iBAAyB,EAAE,MAAM,aAAa,CAAC;;AAGxD,SAAgB,OAA2B;AACzC,QAAO,iBAAyB;EAAE,MAAM;EAAU,UAAU,EAAE,QAAQ,QAAQ;EAAE,CAAC;;;;;AC3BnF,SAAgB,OACd,QAC4B;CAC5B,MAAM,aAAwC,EAAE;CAChD,MAAM,qBAAgD,EAAE;AAExD,MAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,OAAO,CAC9C,KAAI,eAAe,QAAQ,KAAK,cAAc,KAC5C,oBAAmB,OAAO,KAAK;KAE/B,YAAW,OAAO,KAAK;CAI3B,MAAM,SAAkC,EAAE;AAC1C,KAAI,OAAO,KAAK,WAAW,CAAC,SAAS,KAAK,OAAO,KAAK,mBAAmB,CAAC,WAAW,EACnF,QAAO,aAAa;AAEtB,KAAI,OAAO,KAAK,mBAAmB,CAAC,SAAS,EAC3C,QAAO,qBAAqB;AAG9B,QAAO,iBAAiC,OAAoB;;AAG9D,SAAgB,SAAY,MAA4C;AACtE,QAAO,yBAA4B,KAAK,QAAQ;;AAGlD,SAAgB,MAAS,MAAsC;AAC7D,QAAO,iBAAsB,EAAE,UAAU,KAAK,SAAS,CAAC;;AAG1D,SAAgB,SAAY,MAA2C;AACrE,QAAO,iBAA2B;EAAE,GAAG,KAAK;EAAS,UAAU;EAAM,CAAc;;AAGrF,SAAgB,SAA4C,QAAkC;AAC5F,QAAO,iBAA4B,EAAE,MAAM,CAAC,GAAG,OAAO,EAAE,CAAc;;AAGxE,SAAgB,OAAU,MAAoD;AAC5E,QAAO,iBAAoC,EAAE,QAAQ,KAAK,SAAS,CAAC;;AAOtE,SAAgB,cAGd,KAAW,SAAmE;CAC9E,MAAM,aAAwC,EAAE;AAChD,MAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,QAAQ,CAC/C,YAAW,OAAO,KAAK;AAEzB,QAAO,iBAAqD;EAC1D,eAAe;EACf,SAAS;EACV,CAAc;;;;;ACtEjB,MAAa,IAAI;CACf,GAAGA;CACH;CACA;CACA;CACA;CACA,MAAM;CACN;CACA;CACD;;;;ACDD,SAAgB,cACd,aAIA,UACmB;CACnB,MAAM,SAA0C,EAAE;AAElD,MAAK,MAAM,CAAC,MAAM,QAAQ,OAAO,QAAQ,YAAY,EAAE;EAGrD,MAAM,QAAwB;GAC5B,MAFA,IAAI,SAAS,iBAAiB,iBAAiB,IAAI,SAAS,YAAY,YAAY;GAGpF,OAAO,IAAI,MAAM;GACjB,QAAQ,IAAI,OAAO;GACpB;AACD,MAAI,IAAI,MACN,OAAM,QAAQ,IAAI,MAAM;AAE1B,SAAO,QAAQ;;CAGjB,MAAM,WAA8B;EAAE,SAAS;EAAG,YAAY;EAAQ;AACtE,KAAI,YAAY,OAAO,KAAK,SAAS,CAAC,SAAS,EAC7C,UAAS,WAAW;AAEtB,QAAO;;;;;ACrCT,MAAa,iBAAyC;CACpD,kBAAkB;CAClB,cAAc;CACd,WAAW;CACX,WAAW;CACX,cAAc;CACd,gBAAgB;CACjB;AAED,IAAa,YAAb,cAA+B,MAAM;CACnC,AAAS;CACT,AAAS;CAET,YAAY,MAAc,SAAiB,QAAiB;AAC1D,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,SAAS,UAAU,eAAe,SAAS;AAChD,OAAK,OAAO;;CAGd,SAAS;AACP,SAAO;GACL,IAAI;GACJ,OAAO;IACL,MAAM,KAAK;IACX,SAAS,KAAK;IACd,WAAW;IACZ;GACF;;;;;;AC7BL,SAAgB,cAAc,QAAgB,MAAiC;CAC7E,MAAM,SAAS,SAAS,QAAQ,MAAM;EAAE,UAAU;EAAI,WAAW;EAAI,CAAC;AACtE,QAAO;EACL,OAAO,OAAO,WAAW;EACzB;EACD;;AAGH,SAAgB,uBAAuB,QAAsC;AAC3E,QAAO,OACJ,KAAK,MAAM;AAGV,SAAO,GAFM,EAAE,aAAa,SAAS,IAAI,EAAE,aAAa,KAAK,IAAI,GAAG,SAErD,YADA,EAAE,WAAW,KAAK,IAAI,CACH;GAClC,CACD,KAAK,KAAK;;;;;ACjBf,eAAsB,cACpB,YACA,eACA,SACA,gBACuB;CACvB,MAAM,YAAY,WAAW,IAAI,cAAc;AAC/C,KAAI,CAAC,UACH,QAAO;EACL,QAAQ;EACR,MAAM,IAAI,UAAU,aAAa,cAAc,cAAc,aAAa,CAAC,QAAQ;EACpF;CAGH,MAAM,aAAa,cAAc,UAAU,aAAa,QAAQ;AAChE,KAAI,CAAC,WAAW,MAEd,QAAO;EACL,QAAQ;EACR,MAAM,IAAI,UAAU,oBAAoB,4BAH1B,uBAAuB,WAAW,OAAO,GAGuB,CAAC,QAAQ;EACxF;AAGH,KAAI;EACF,MAAM,SAAS,MAAM,UAAU,QAAQ,EAAE,OAAO,SAAS,CAAC;AAE1D,MAAI,gBAAgB;GAClB,MAAM,gBAAgB,cAAc,UAAU,cAAc,OAAO;AACnE,OAAI,CAAC,cAAc,MAEjB,QAAO;IACL,QAAQ;IACR,MAAM,IAAI,UAAU,kBAAkB,6BAHxB,uBAAuB,cAAc,OAAO,GAGmB,CAAC,QAAQ;IACvF;;AAIL,SAAO;GAAE,QAAQ;GAAK,MAAM;IAAE,IAAI;IAAM,MAAM;IAAQ;GAAE;UACjD,OAAO;AACd,MAAI,iBAAiB,UACnB,QAAO;GAAE,QAAQ,MAAM;GAAQ,MAAM,MAAM,QAAQ;GAAE;AAGvD,SAAO;GACL,QAAQ;GACR,MAAM,IAAI,UAAU,kBAHN,iBAAiB,QAAQ,MAAM,UAAU,gBAGT,CAAC,QAAQ;GACxD;;;AAaL,eAAsB,mBACpB,YACA,OACA,gBACyC;AAezC,QAAO,EAAE,SAdO,MAAM,QAAQ,IAC5B,MAAM,IAAI,OAAO,SAAS;EACxB,MAAM,SAAS,MAAM,cAAc,YAAY,KAAK,WAAW,KAAK,OAAO,eAAe;AAC1F,MAAI,OAAO,WAAW,IAEpB,QAAO;GAAE,IAAI;GAAe,MADX,OAAO,KACmB;GAAM;AAMnD,SAAO;GAAE,IAAI;GAAgB,OAJZ,OAAO,KAIqB;GAAO;GACpD,CACH,EACiB;;AAGpB,gBAAuB,mBACrB,eACA,MACA,UACA,gBACwB;CACxB,MAAM,MAAM,cAAc,IAAI,KAAK;AACnC,KAAI,CAAC,IACH,OAAM,IAAI,UAAU,aAAa,iBAAiB,KAAK,aAAa;CAGtE,MAAM,aAAa,cAAc,IAAI,aAAa,SAAS;AAC3D,KAAI,CAAC,WAAW,MAEd,OAAM,IAAI,UAAU,oBAAoB,4BADxB,uBAAuB,WAAW,OAAO,GACqB;AAGhF,YAAW,MAAM,SAAS,IAAI,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE;AAC1D,MAAI,gBAAgB;GAClB,MAAM,gBAAgB,cAAc,IAAI,cAAc,MAAM;AAC5D,OAAI,CAAC,cAAc,MAEjB,OAAM,IAAI,UAAU,kBAAkB,6BADtB,uBAAuB,cAAc,OAAO,GACiB;;AAGjF,QAAM;;;;;;;ACpFV,eAAe,eACb,SACA,QACA,YACkC;CAClC,MAAM,UAAU,OAAO,QAAQ,QAAQ;CACvC,MAAM,UAAU,MAAM,QAAQ,IAC5B,QAAQ,IAAI,OAAO,CAAC,KAAK,YAAY;EACnC,MAAM,EAAE,WAAW,UAAU,OAAO,OAAO;EAC3C,MAAM,OAAO,WAAW,IAAI,UAAU;AACtC,MAAI,CAAC,KAAM,OAAM,IAAI,UAAU,kBAAkB,cAAc,UAAU,aAAa;AAGtF,SAAO,CAAC,KADO,MAAM,KAAK,QAAQ,EAAE,OAAO,CAAC,CACxB;GACpB,CACH;AACD,QAAO,OAAO,YAAY,QAAQ;;;AAIpC,SAAS,eACP,iBACA,iBACA,QACQ;AACR,KAAI,UAAU,gBACZ,QAAO,gBAAgB,WAAW;AAEpC,QAAO;;;AAIT,SAAS,eACP,QACA,cACA,QACwB;CACxB,MAAM,YAAY,OAAO,YAAY;AACrC,KAAI,CAAC,UAAW,QAAO,EAAE;AAEzB,KAAI,OAAO,SAAS,WAAW,OAAO,SAAS;EAC7C,MAAM,WAAW,KAAK,OAAO,SAAS,QAAQ,WAAW,GAAG,OAAO,OAAO;AAC1E,MAAI,WAAW,SAAS,CACtB,QAAO,KAAK,MAAM,aAAa,UAAU,QAAQ,CAAC;AAEpD,SAAO,EAAE;;AAGX,QAAO,OAAO,SAAS,UAAU,cAAc,EAAE;;AAGnD,eAAsB,kBACpB,MACA,QACA,YACA,UAC2B;AAC3B,KAAI;EACF,MAAM,KAAK,YAAY,KAAK;EAC5B,MAAM,cAAc,KAAK,eAAe,EAAE;EAC1C,MAAM,SAAS,UAAU;EAGzB,MAAM,gBAAgB,MAAM,QAAQ,IAAI,CACtC,GAAG,YAAY,KAAK,WAAW,eAAe,OAAO,SAAS,QAAQ,WAAW,CAAC,EAClF,eAAe,KAAK,SAAS,QAAQ,WAAW,CACjD,CAAC;EAEF,MAAM,KAAK,YAAY,KAAK;EAG5B,MAAM,UAAmC,EAAE;AAC3C,OAAK,MAAM,UAAU,cACnB,QAAO,OAAO,SAAS,OAAO;EAKhC,IAAI,mBADiB,eAAe,KAAK,UAAU,KAAK,iBAAiB,OAAO;AAEhF,OAAK,IAAI,IAAI,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;GAChD,MAAM,SAAS,YAAY;AAE3B,sBADuB,eAAe,OAAO,UAAU,OAAO,iBAAiB,OAAO,CACpD,QAAQ,sBAAsB,iBAAiB;;EAInF,MAAM,SAAS;GACb,cAAc,YAAY,KAAK,OAAO;IACpC,IAAI,EAAE;IACN,aAAa,OAAO,KAAK,EAAE,QAAQ;IACpC,EAAE;GACH,SAAS,KAAK,UAAU;GACxB,WAAW,KAAK;GACjB;EAGD,IAAI;AACJ,MAAI,UAAU;GACZ,MAAM,EAAE,QAAQ,YAAY,iBAAiB;GAC7C,MAAM,WAAW,eAAe,YAAY,cAAc,SAAS,OAAO;GAC1E,MAAM,YAAY,WAAW,YAAY;GACzC,MAAM,WAAoC;IACxC,QAAQ,SAAS;IACjB,gBAAgB,WAAW;IAC3B;IACD;AAED,OAAI,WAAW,SAAS,WAAW;AACjC,aAAS,OAAO,WAAW,cAAc,aAAa,SAAS;AAC/D,aAAS,SAAS,WAAW;;AAE/B,kBAAe,KAAK,UAAU,SAAS;;EAIzC,MAAM,OAAO,WACX,kBACA,KAAK,UAAU,QAAQ,EACvB,KAAK,UAAU,OAAO,EACtB,aACD;EAED,MAAM,KAAK,YAAY,KAAK;AAE5B,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;IAAE,WAAW,KAAK;IAAI,QAAQ,KAAK;IAAI;GAChD;UACM,OAAO;AAEd,SAAO;GACL,QAAQ;GACR,MAAM,mEAAmE,WAH3D,iBAAiB,QAAQ,MAAM,UAAU,gBAGqC,CAAC;GAC9F;;;;;;AC5JL,SAAS,aAAa,SAAgC;AAOpD,QAAO,EAAE,UANwB,QAC9B,MAAM,IAAI,CACV,OAAO,QAAQ,CACf,KAAK,QACJ,IAAI,WAAW,IAAI,GAAG;EAAE,MAAM;EAAS,MAAM,IAAI,MAAM,EAAE;EAAE,GAAG;EAAE,MAAM;EAAU,OAAO;EAAK,CAC7F,EACgB;;AAGrB,SAAS,WAAW,UAA0B,WAAoD;AAChG,KAAI,SAAS,WAAW,UAAU,OAAQ,QAAO;CACjD,MAAM,SAAiC,EAAE;AACzC,MAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACxC,MAAM,MAAM,SAAS;AACrB,MAAI,IAAI,SAAS,UACf;OAAI,IAAI,UAAU,UAAU,GAAI,QAAO;QAEvC,QAAO,IAAI,QAAQ,UAAU;;AAGjC,QAAO;;AAGT,IAAa,eAAb,MAA6B;CAC3B,AAAQ,SAAmE,EAAE;CAE7E,IAAI,SAAiB,OAAgB;AACnC,OAAK,OAAO,KAAK;GAAE;GAAS,UAAU,aAAa,QAAQ;GAAE;GAAO,CAAC;;CAGvE,MAAM,MAAoF;EACxF,MAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ;AAC7C,OAAK,MAAM,SAAS,KAAK,QAAQ;GAC/B,MAAM,SAAS,WAAW,MAAM,SAAS,UAAU,MAAM;AACzD,OAAI,OAAQ,QAAO;IAAE,OAAO,MAAM;IAAO;IAAQ,SAAS,MAAM;IAAS;;AAE3E,SAAO;;;;;;;AC1BX,SAAgB,gBAAiC;AAC/C,QAAO;EACL,MAAM;EACN,QAAQ,MAAM;AACZ,OAAI,KAAK,cAAc,KAAK,QAAQ,SAAS,KAAK,WAAW,CAC3D,QAAO,KAAK;AAEd,UAAO;;EAEV;;;AAIH,SAAgB,WAAW,OAAO,eAAgC;AAChE,QAAO;EACL,MAAM;EACN,QAAQ,MAAM;AACZ,OAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,QAAK,MAAM,QAAQ,KAAK,OAAO,MAAM,IAAI,EAAE;IACzC,MAAM,CAAC,GAAG,KAAK,KAAK,MAAM,CAAC,MAAM,IAAI;AACrC,QAAI,MAAM,QAAQ,KAAK,KAAK,QAAQ,SAAS,EAAE,CAAE,QAAO;;AAE1D,UAAO;;EAEV;;;AAIH,SAAgB,qBAAsC;AACpD,QAAO;EACL,MAAM;EACN,QAAQ,MAAM;AACZ,OAAI,CAAC,KAAK,eAAgB,QAAO;GACjC,MAAM,UAAyC,EAAE;AACjD,QAAK,MAAM,QAAQ,KAAK,eAAe,MAAM,IAAI,EAAE;IAEjD,MAAM,CAAC,MAAM,GAAG,QADA,KAAK,MAAM,CACK,MAAM,IAAI;IAC1C,IAAI,IAAI;AACR,SAAK,MAAM,KAAK,MAAM;KACpB,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,sBAAsB;AACnD,SAAI,MAAO,KAAI,WAAW,MAAM,GAAG;;AAErC,YAAQ,KAAK;KAAE,MAAM,KAAK,MAAM;KAAE;KAAG,CAAC;;AAExC,WAAQ,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,EAAE;GACjC,MAAM,YAAY,IAAI,IAAI,KAAK,QAAQ;AACvC,QAAK,MAAM,EAAE,UAAU,SAAS;AAC9B,QAAI,UAAU,IAAI,KAAK,CAAE,QAAO;IAEhC,MAAM,SAAS,KAAK,MAAM,IAAI,CAAC;AAC/B,QAAI,WAAW,QAAQ,UAAU,IAAI,OAAO,CAAE,QAAO;;AAEvD,UAAO;;EAEV;;;AAIH,SAAgB,aAAa,QAAQ,QAAyB;AAC5D,QAAO;EACL,MAAM;EACN,QAAQ,MAAM;AACZ,OAAI,CAAC,KAAK,IAAK,QAAO;AACtB,OAAI;IAEF,MAAM,QADM,IAAI,IAAI,KAAK,KAAK,mBAAmB,CAC/B,aAAa,IAAI,MAAM;AACzC,QAAI,SAAS,KAAK,QAAQ,SAAS,MAAM,CAAE,QAAO;WAC5C;AAGR,UAAO;;EAEV;;;AAIH,SAAgB,aAAa,YAA+B,MAA2B;AACrF,MAAK,MAAM,KAAK,YAAY;EAC1B,MAAM,SAAS,EAAE,QAAQ,KAAK;AAC9B,MAAI,WAAW,KAAM,QAAO;;AAE9B,QAAO,KAAK;;;AAId,SAAgB,oBAAuC;AACrD,QAAO;EAAC,eAAe;EAAE,YAAY;EAAE,oBAAoB;EAAC;;;;;ACxD9D,SAAS,kBACP,KACwB;AACxB,QAAO,UAAU,OAAO,IAAI,SAAS;;;AA6BvC,SAAS,gBAAgB,MAGvB;CACA,MAAM,aAAa,MAAM,WAAW,mBAAmB;AACvD,QAAO;EACL;EACA,cAAc,WAAW,MAAM,MAAM,EAAE,SAAS,aAAa;EAC9D;;;AAIH,SAAS,kBAAkB,cAA8C,QAA0B;AACjG,cAAa,IAAI,qBAAqB;EACpC,aAAa,EAAE;EACf,cAAc,EAAE;EAChB,UAAU,EAAE,YAAY;GACtB,MAAM,EAAE,OAAO,WAAW;GAC1B,MAAM,WAAW,mBAAmB,QAAQ,OAAO,OAAO;AAE1D,UAAO;IAAE,MADI,OAAO,cAAc,SAAS,WAAW;IACvC;IAAU;;EAE5B,CAAC;;;AAIJ,SAAS,mBACP,QACA,WACA,QACwB;AACxB,KAAI,OAAO,SAAS,WAAW,OAAO,SAAS;EAC7C,MAAM,WAAW,KAAK,OAAO,SAAS,QAAQ,WAAW,GAAG,OAAO,OAAO;AAC1E,MAAI,WAAW,SAAS,CACtB,QAAO,KAAK,MAAM,aAAa,UAAU,QAAQ,CAAC;AAEpD,SAAO,EAAE;;AAEX,QAAO,OAAO,SAAS,UAAU,cAAc,EAAE;;AAGnD,SAAgB,aACd,YACA,MACW;CACX,MAAM,+BAAe,IAAI,KAAgC;CACzD,MAAM,kCAAkB,IAAI,KAAmC;AAE/D,MAAK,MAAM,CAAC,MAAM,QAAQ,OAAO,QAAQ,WAAW,CAClD,KAAI,kBAAkB,IAAI,CACxB,iBAAgB,IAAI,MAAM;EACxB,aAAa,IAAI,MAAM;EACvB,cAAc,IAAI,OAAO;EACzB,SAAS,IAAI;EACd,CAAC;KAGF,cAAa,IAAI,MAAM;EACrB,aAAa,IAAI,MAAM;EACvB,cAAc,IAAI,OAAO;EACzB,SAAS,IAAI;EACd,CAAC;CAIN,MAAM,uBACJ,MAAM,mBACL,OAAO,YAAY,eAAe,QAAQ,IAAI,aAAa;CAE9D,MAAM,cAAc,IAAI,cAAuB;CAC/C,MAAM,QAAQ,MAAM;AACpB,KAAI,MACF,MAAK,MAAM,CAAC,SAAS,SAAS,OAAO,QAAQ,MAAM,CACjD,aAAY,IAAI,SAAS,KAAK;CAIlC,MAAM,aAAa,MAAM,QAAQ;CACjC,MAAM,EAAE,YAAY,iBAAiB,gBAAgB,KAAK;AAC1D,KAAI,WAAY,mBAAkB,cAAc,WAAW;CAG3D,MAAM,eACJ,MAAM,YAAY,KAAK,SAAS,SAAS,IACrC,OAAO,YACL,KAAK,SAAS,KAAK,OAAO;EAExB,MAAM,WAAW,OAAO,KAAK,GAAG,WAAW,CAAC,MAAM;AAIlD,SAAO,CAHM,SAAS,SAAS,IAAI,GAC/B,SAAS,MAAM,GAAG,SAAS,QAAQ,IAAI,CAAC,GACxC,UACU,GAAG,YAAY;GAC7B,CACH,GACD;AAEN,QAAO;EACL;EACA,UAAU,CAAC,CAAC,SAAS,OAAO,KAAK,MAAM,CAAC,SAAS;EACjD,WAAW;AACT,UAAO,cAAc,YAAY,aAAa;;EAEhD,OAAO,eAAe,MAAM;AAC1B,UAAO,cAAc,cAAc,eAAe,MAAM,qBAAqB;;EAE/E,YAAY,OAAO;AACjB,UAAO,mBAAmB,cAAc,OAAO,qBAAqB;;EAEtE,mBAAmB,MAAM,OAAO;AAC9B,UAAO,mBAAmB,iBAAiB,MAAM,OAAO,qBAAqB;;EAE/E,MAAM,WAAW,MAAM,SAAS;GAC9B,IAAI,aAA4B;GAChC,IAAI,YAAY;AAEhB,OAAI,gBAAgB,YAAY;IAC9B,MAAM,WAAW,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ;IAChD,MAAM,YAAY,IAAI,IAAI,WAAW,QAAQ;AAC7C,QAAI,SAAS,SAAS,KAAK,UAAU,IAAI,SAAS,GAAG,EAAE;AACrD,kBAAa,SAAS;AACtB,iBAAY,MAAM,SAAS,MAAM,EAAE,CAAC,KAAK,IAAI,IAAI;;;GAIrD,IAAI;AACJ,OAAI,WACF,UAAS,aAAa,YAAY;IAChC,KAAK,SAAS,OAAO;IACrB;IACA,QAAQ,SAAS;IACjB,gBAAgB,SAAS;IACzB,SAAS,WAAW;IACpB,eAAe,WAAW;IAC3B,CAAC;GAGJ,MAAM,QAAQ,YAAY,MAAM,UAAU;AAC1C,OAAI,CAAC,MAAO,QAAO;GAEnB,MAAM,WACJ,UAAU,aACN;IAAE;IAAQ,QAAQ;IAAY,cAAc,MAAM;IAAS,GAC3D;AACN,UAAO,kBAAkB,MAAM,OAAO,MAAM,QAAQ,cAAc,SAAS;;EAE9E;;;;;;AC9KH,SAAS,mBAAmB,SAAoB,SAA+B;CAC7E,MAAM,eAAgB,QAAoC;CAG1D,MAAM,kBAAmB,QAAoC;CAG7D,MAAM,WAAY,QAAoC;CAGtD,MAAM,cAAe,QAAoC;CAIzD,MAAM,SAAkC,EAAE;CAE1C,MAAM,QAAQ;EAAE,GAAG;EAAc,GAAG;EAAU;AAC9C,KAAI,OAAO,KAAK,MAAM,CAAC,SAAS,EAC9B,QAAO,aAAa;CAGtB,MAAM,WAAW;EAAE,GAAG;EAAiB,GAAG;EAAa;AACvD,KAAI,OAAO,KAAK,SAAS,CAAC,SAAS,EACjC,QAAO,qBAAqB;AAI9B,KAAI,CAAC,OAAO,cAAc,CAAC,OAAO,mBAChC,QAAO,aAAa,EAAE;AAGxB,QAAO;;;AAIT,SAAS,yBACP,UACW;CACX,MAAM,UAAqC,EAAE;AAC7C,MAAK,MAAM,CAAC,WAAW,SAAS,OAAO,QAAQ,SAAS,CAEtD,SAAQ,aAAa,EACnB,YAAY,EAAE,SAAS,KAAK,SAAS,EACtC;AAEH,QAAO;EAAE,eAAe;EAAQ;EAAS;;AAM3C,SAAgB,cAId,MAAc,KAAkE;CAChF,MAAM,aAA4B,EAAE;CACpC,MAAM,qBAAqB,IAAI,MAAM;AAGrC,MAAK,MAAM,CAAC,SAAS,WAAW,OAAO,QAAQ,IAAI,SAAS,EAAE;EAG5D,MAAM,UAAgC;GACpC,MAAM;GACN,OAAO,EAAE,SAJe,mBAAmB,oBAAoB,OAAO,MAAM,QAAQ,EAI/C;GACrC,QAAQ,OAAO;GACf,SAAS,OAAO;GACjB;AACD,MAAI,OAAO,MACT,SAAQ,QAAQ,OAAO;AAEzB,aAAW,GAAG,KAAK,GAAG,aAAa;;CAIrC,MAAM,cAAc,yBAAyB,IAAI,SAAS;CAC1D,MAAM,eAA0C;EAC9C,MAAM;EACN,OAAO,IAAI;EACX,QAAQ,EAAE,SAAS,aAAa;EAChC,SAAS,IAAI;EACd;AACD,YAAW,GAAG,KAAK,YAAY;CAG/B,MAAM,eAAwC,EAAE;AAChD,MAAK,MAAM,CAAC,SAAS,WAAW,OAAO,QAAQ,IAAI,SAAS,EAAE;EAC5D,MAAM,QAA2D;GAC/D,OAAO,OAAO,MAAM;GACpB,QAAQ,OAAO,OAAO;GACvB;AACD,MAAI,OAAO,MACT,OAAM,QAAQ,OAAO,MAAM;AAE7B,eAAa,WAAW;;CAG1B,MAAM,eAAwC,EAAE;AAChD,MAAK,MAAM,CAAC,WAAW,SAAS,OAAO,QAAQ,IAAI,SAAS,CAC1D,cAAa,aAAa,KAAK;AASjC,QAAO;EAAE;EAAY,aANY;GAC/B,OAAO;GACP,UAAU;GACV,UAAU;GACX;EAEiC;;;;;ACzHpC,SAAgB,WAAW,QAA0B;AACnD,QAAO;EAAE,GAAG;EAAQ,aAAa,OAAO,eAAe,EAAE;EAAE;;;;;ACvC7D,MAAa,aAAqC;CAChD,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,SAAS;CACT,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,QAAQ;CACT;;;;ACsBD,MAAM,mBAAmB;AACzB,MAAM,cAAc;AACpB,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AAEtB,MAAM,cAAc,EAAE,gBAAgB,oBAAoB;AAC1D,MAAM,cAAc,EAAE,gBAAgB,4BAA4B;AAClE,MAAM,aAAa;CACjB,gBAAgB;CAChB,iBAAiB;CACjB,YAAY;CACb;AACD,MAAM,kBAAkB;AAExB,SAAS,aAAa,QAAgB,MAAiC;AACrE,QAAO;EAAE;EAAQ,SAAS;EAAa;EAAM;;AAG/C,SAAS,cAAc,QAAgB,MAAc,SAAmC;AACtF,QAAO,aAAa,QAAQ,IAAI,UAAU,MAAM,QAAQ,CAAC,QAAQ,CAAC;;AAGpE,eAAe,kBAAkB,WAAmB,WAA8C;AAChG,KAAI,UAAU,SAAS,KAAK,CAC1B,QAAO,cAAc,KAAK,oBAAoB,YAAY;CAG5D,MAAM,WAAW,KAAK,WAAW,UAAU;AAC3C,KAAI;EACF,MAAM,UAAU,MAAM,SAAS,UAAU,QAAQ;EAEjD,MAAM,cAAc,WADR,QAAQ,SAAS,KACU;AACvC,SAAO;GACL,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,iBAAiB;IAClB;GACD,MAAM;GACP;SACK;AACN,SAAO,cAAc,KAAK,aAAa,kBAAkB;;;;AAK7D,SAAgB,aAAa,MAAuB;AAClD,QAAO,sBAAsB,KAAK,UAAU,KAAK,CAAC;;;AAIpD,SAAgB,cAAc,MAAc,SAAiB,YAAY,OAAe;AACtF,QAAO,uBAAuB,KAAK,UAAU;EAAE;EAAM;EAAS;EAAW,CAAC,CAAC;;;AAI7E,SAAgB,mBAA2B;AACzC,QAAO;;AAGT,gBAAgB,UACd,QACA,MACA,OACuB;AACvB,KAAI;AACF,aAAW,MAAM,SAAS,OAAO,mBAAmB,MAAM,MAAM,CAC9D,OAAM,aAAa,MAAM;AAE3B,QAAM,kBAAkB;UACjB,OAAO;AACd,MAAI,iBAAiB,UACnB,OAAM,cAAc,MAAM,MAAM,MAAM,QAAQ;MAG9C,OAAM,cAAc,kBADJ,iBAAiB,QAAQ,MAAM,UAAU,gBACX;;;AAKpD,eAAe,gBACb,KACA,QACA,YAC2B;CAC3B,IAAI;AACJ,KAAI;AACF,SAAO,MAAM,IAAI,MAAM;SACjB;AACN,SAAO,cAAc,KAAK,oBAAoB,oBAAoB;;AAEpE,KAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAS,KAA6B,MAAM,CAC1F,QAAO,cAAc,KAAK,oBAAoB,0CAA0C;CAE1F,MAAM,QAAS,KAAoE,MAAM,KACtF,OAAO;EACN,WACE,OAAO,EAAE,cAAc,WAAY,YAAY,IAAI,EAAE,UAAU,IAAI,EAAE,YAAa;EACpF,OAAO,EAAE,SAAS,EAAE;EACrB,EACF;AAED,QAAO,aAAa,KAAK;EAAE,IAAI;EAAM,MADtB,MAAM,OAAO,YAAY,MAAM;EACK,CAAC;;AAGtD,SAAgB,kBACd,QACA,MACa;CAEb,MAAM,aAAyC,MAAM,aACjD,IAAI,IAAI,OAAO,QAAQ,KAAK,WAAW,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,GAC3E;AAEJ,KAAI,WACF,YAAW,IAAI,qBAAqB,oBAAoB;CAE1D,MAAM,YAAY,MAAM,YAAY,SAAS;AAE7C,QAAO,OAAO,QAAQ;EACpB,MAAM,MAAM,IAAI,IAAI,IAAI,KAAK,mBAAmB;EAChD,MAAM,EAAE,aAAa;AAErB,MAAI,IAAI,WAAW,SAAS,aAAa,eAAe;AACtD,OAAI,MAAM,WAAY,QAAO,cAAc,KAAK,aAAa,oBAAoB;AACjF,UAAO,aAAa,KAAK,OAAO,UAAU,CAAC;;AAG7C,MAAI,SAAS,WAAW,iBAAiB,EAAE;GACzC,IAAI,OAAO,SAAS,MAAM,GAAwB;AAClD,OAAI,CAAC,KACH,QAAO,cAAc,KAAK,aAAa,uBAAuB;AAGhE,OAAI,IAAI,WAAW,QAAQ;AAEzB,QAAI,SAAS,YAAa,aAAa,SAAS,UAC9C,QAAO,gBAAgB,KAAK,QAAQ,WAAW;AAIjD,QAAI,YAAY;KACd,MAAM,WAAW,WAAW,IAAI,KAAK;AACrC,SAAI,CAAC,SAAU,QAAO,cAAc,KAAK,aAAa,YAAY;AAClE,YAAO;;IAGT,IAAI;AACJ,QAAI;AACF,YAAO,MAAM,IAAI,MAAM;YACjB;AACN,YAAO,cAAc,KAAK,oBAAoB,oBAAoB;;IAGpE,MAAM,SAAS,MAAM,OAAO,OAAO,MAAM,KAAK;AAC9C,WAAO,aAAa,OAAO,QAAQ,OAAO,KAAK;;AAGjD,OAAI,IAAI,WAAW,OAAO;AAExB,QAAI,YAAY;KACd,MAAM,WAAW,WAAW,IAAI,KAAK;AACrC,SAAI,CAAC,SAAU,QAAO,cAAc,KAAK,aAAa,YAAY;AAClE,YAAO;;IAGT,MAAM,WAAW,IAAI,aAAa,IAAI,QAAQ;IAC9C,IAAI;AACJ,QAAI;AACF,aAAQ,WAAW,KAAK,MAAM,SAAS,GAAG,EAAE;YACtC;AACN,YAAO,cAAc,KAAK,oBAAoB,gCAAgC;;AAGhF,WAAO;KAAE,QAAQ;KAAK,SAAS;KAAY,QAAQ,UAAU,QAAQ,MAAM,MAAM;KAAE;;;AAOvF,MAAI,IAAI,WAAW,SAAS,SAAS,WAAW,YAAY,IAAI,OAAO,UAAU;GAC/E,MAAM,WAAW,MAAM,SAAS,MAAM,GAAmB;GACzD,MAAM,UAAU,IAAI,SAChB;IACE,KAAK,IAAI;IACT,QAAQ,IAAI,OAAO,SAAS,IAAI;IAChC,gBAAgB,IAAI,OAAO,kBAAkB,IAAI;IAClD,GACD;GACJ,MAAM,SAAS,MAAM,OAAO,WAAW,UAAU,QAAQ;AACzD,OAAI,OACF,QAAO;IAAE,QAAQ,OAAO;IAAQ,SAAS;IAAa,MAAM,OAAO;IAAM;;AAI7E,MAAI,IAAI,WAAW,SAAS,SAAS,WAAW,cAAc,IAAI,MAAM,UAEtE,QAAO,kBADW,SAAS,MAAM,GAAqB,EAClB,KAAK,UAAU;AAGrD,MAAI,MAAM,SAAU,QAAO,KAAK,SAAS,IAAI;AAC7C,SAAO,cAAc,KAAK,aAAa,YAAY;;;AAIvD,SAAgB,UAAU,MAAuB;AAC/C,QAAO,OAAO,SAAS,WAAW,OAAO,KAAK,UAAU,KAAK;;;AAI/D,eAAsB,YACpB,QACA,OACe;AACf,KAAI;AACF,aAAW,MAAM,SAAS,OACxB,KAAI,MAAM,MAAM,KAAK,MAAO;SAExB;;;AAMV,SAAgB,cAAc,QAAgC;AAC5D,KAAI,YAAY,QAAQ;EACtB,MAAM,SAAS,OAAO;EACtB,MAAM,UAAU,IAAI,aAAa;EACjC,MAAM,WAAW,IAAI,eAAe,EAClC,MAAM,MAAM,YAAY;AACtB,SAAM,YAAY,SAAS,UAAU;AACnC,eAAW,QAAQ,QAAQ,OAAO,MAAM,CAAC;KACzC;AACF,cAAW,OAAO;KAErB,CAAC;AACF,SAAO,IAAI,SAAS,UAAU;GAAE,QAAQ,OAAO;GAAQ,SAAS,OAAO;GAAS,CAAC;;AAEnF,QAAO,IAAI,SAAS,UAAU,OAAO,KAAK,EAAE;EAAE,QAAQ,OAAO;EAAQ,SAAS,OAAO;EAAS,CAAC;;;;;ACzOjG,SAAS,cAAc,QAAgC;AACrD,SAAQ,WAAiD;EACvD,MAAM,QAAiC,EAAE;AACzC,MAAI,OAAO,OACT,MAAK,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,OAAO,OAAO,EAAE;GAC1D,MAAM,MAAM,OAAO;AACnB,SAAM,OAAO,QAAQ,SAAS,QAAQ,OAAO,IAAI,GAAG;;AAGxD,SAAO;GAAE,WAAW,OAAO;GAAW;GAAO;;;AAIjD,SAAS,eAAe,SAAiE;CACvF,MAAM,MAAgC,EAAE;AACxC,MAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,QAAQ,CACjD,KAAI,OAAO,cAAc,OAAO;AAElC,QAAO;;AAGT,SAAS,oBACP,OACA,eACQ;AACR,KAAI,MAAM,SAAU,QAAO,MAAM;AACjC,KAAI,MAAM,WAAW;EACnB,MAAM,SAAS,iBAAiB,OAAO,KAAK,MAAM,UAAU,CAAC;EAC7D,MAAM,OAAO,MAAM,UAAU;AAC7B,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,2BAA2B,OAAO,GAAG;AAChE,SAAO;;AAET,OAAM,IAAI,MAAM,wDAAwD;;;AAI1E,SAAS,oBACP,OACA,SACoC;AACpC,KAAI,CAAC,MAAM,UAAW,QAAO;CAC7B,MAAM,SAAiC,EAAE;AACzC,MAAK,MAAM,CAAC,QAAQ,YAAY,OAAO,QAAQ,MAAM,UAAU,CAC7D,QAAO,UAAU,aAAa,KAAK,SAAS,QAAQ,EAAE,QAAQ;AAEhE,QAAO;;;AAIT,SAAS,mBACP,UACA,eACA,WACA,oBACa;CACb,MAAM,QAAqB,EAAE;CAC7B,IAAI,YAAgC;AAEpC,QAAO,WAAW;EAChB,MAAM,QAAyC,cAAc;AAC7D,MAAI,CAAC,MAAO;AACZ,QAAM,KAAK;GACT,IAAI;GACJ,UAAU,UAAU;GACpB,iBAAiB,mBAAmB;GACpC,SAAS,eAAe,MAAM,WAAW,EAAE,CAAC;GAC7C,CAAC;AACF,cAAY,MAAM;;AAIpB,OAAM,SAAS;AACf,QAAO;;;AAIT,SAAS,sBACP,UACA,eACA,SACA,eACa;CACb,MAAM,QAAqB,EAAE;CAC7B,IAAI,YAAgC;AAEpC,QAAO,WAAW;EAChB,MAAM,QAAyC,cAAc;AAC7D,MAAI,CAAC,MAAO;EACZ,MAAM,qBAAqB,KAAK,SAAS,oBAAoB,OAAO,cAAc,CAAC;EACnF,MAAM,MAAiB;GACrB,IAAI;GACJ,UAAU;GACV,iBAAiB,MAAM,YACnB,0BAA0B,MAAM,WAAW,QAAQ,GACnD;GACJ,SAAS,eAAe,MAAM,WAAW,EAAE,CAAC;GAC7C;AACD,SAAO,eAAe,KAAK,YAAY;GACrC,WAAW,aAAa,oBAAoB,QAAQ;GACpD,YAAY;GACb,CAAC;AACF,QAAM,KAAK,IAAI;AACf,cAAY,MAAM;;AAGpB,OAAM,SAAS;AACf,QAAO;;;AAIT,SAAS,0BACP,WACA,SACwB;CACxB,MAAM,MAA8B,EAAE;AACtC,MAAK,MAAM,CAAC,QAAQ,YAAY,OAAO,QAAQ,UAAU,EAAE;EACzD,MAAM,WAAW,KAAK,SAAS,QAAQ;AACvC,SAAO,eAAe,KAAK,QAAQ;GACjC,WAAW,aAAa,UAAU,QAAQ;GAC1C,YAAY;GACb,CAAC;;AAEJ,QAAO;;;AAIT,SAAS,cACP,OACA,eACsB;CACtB,MAAM,OAAiB,EAAE;AACzB,KAAI,MAAM,QAAQ;EAChB,IAAI,YAAgC,MAAM;AAC1C,SAAO,WAAW;GAChB,MAAM,QAAyC,cAAc;AAC7D,OAAI,CAAC,MAAO;AACZ,OAAI,MAAM,UAAW,MAAK,KAAK,GAAG,MAAM,UAAU;AAClD,eAAY,MAAM;;;AAGtB,KAAI,MAAM,UAAW,MAAK,KAAK,GAAG,MAAM,UAAU;AAClD,QAAO,KAAK,SAAS,IAAI,OAAO;;;AAIlC,SAAgB,eAAe,SAAyC;CACtE,MAAM,cAAc,KAAK,SAAS,oBAAoB;AACtD,KAAI;AACF,SAAO,KAAK,MAAM,aAAa,aAAa,QAAQ,CAAC;SAC/C;AACN;;;;AAKJ,SAAgB,iBAAiB,SAAoC;CACnE,MAAM,eAAe,KAAK,SAAS,sBAAsB;AACzD,KAAI;EACF,MAAM,WAAW,KAAK,MAAM,aAAa,cAAc,QAAQ,CAAC;AAChE,MAAI,CAAC,SAAS,KAAM,QAAO;EAE3B,MAAM,OAAQ,SAAS,KAAK,QAAQ;EACpC,MAAM,QAAQ,SAAS,KAAK,SAAS;EACrC,MAAM,cAAc,SAAS,KAAK,gBAAgB,EAAE;EACpD,MAAM,gBAAgB,SAAS,KAAK,kBAAkB,EAAE;EAIxD,MAAM,WAAmE,EAAE;AAC3E,MAAI,SAAS,UAAU;GACrB,MAAM,UAAU,KAAK,SAAS,OAAO;AACrC,QAAK,MAAM,UAAU,SAAS,KAAK,SAAS;IAC1C,MAAM,aAAa,KAAK,SAAS,GAAG,OAAO,OAAO;AAClD,QAAI,WAAW,WAAW,CACxB,UAAS,UAAU,KAAK,MAAM,aAAa,YAAY,QAAQ,CAAC;QAKhE,UAAS,UAAU,EAAE;;;AAK3B,SAAO;GACL,SAAS,SAAS,KAAK;GACvB,SAAS,SAAS,KAAK;GACvB;GACA;GACA;GACA;GACA;GACA,SAAS,SAAS,UAAU,UAAU;GACvC;SACK;AACN,SAAO;;;AAIX,SAAgB,gBAAgB,SAA0C;CAExE,MAAM,MAAM,aADS,KAAK,SAAS,sBAAsB,EAClB,QAAQ;CAC/C,MAAM,WAAW,KAAK,MAAM,IAAI;CAChC,MAAM,gBAAgB,SAAS,MAAM;CAGrC,MAAM,kBAA0C,EAAE;CAClD,MAAM,wBAAgE,EAAE;CACxE,MAAM,gBAAgB,SAAS,WAAW,EAAE;AAC5C,MAAK,MAAM,CAAC,IAAI,UAAU,OAAO,QAAQ,cAAc,EAAE;AACvD,kBAAgB,MAAM,aACpB,KAAK,SAAS,oBAAoB,OAAO,cAAc,CAAC,EACxD,QACD;EACD,MAAM,KAAK,oBAAoB,OAAO,QAAQ;AAC9C,MAAI,GAAI,uBAAsB,MAAM;;CAGtC,MAAM,QAAiC,EAAE;AACzC,MAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,SAAS,OAAO,EAAE;EAE3D,MAAM,WAAW,aADI,KAAK,SAAS,oBAAoB,OAAO,cAAc,CAAC,EACjC,QAAQ;EAEpD,MAAM,UAAU,eAAe,MAAM,QAAQ;EAC7C,MAAM,cAAc,MAAM,SACtB,mBAAmB,MAAM,QAAQ,eAAe,iBAAiB,sBAAsB,GACvF,EAAE;EAGN,MAAM,WAAW,cAAc,OAAO,cAAc;AAEpD,QAAM,QAAQ;GACZ;GACA,iBAAiB,oBAAoB,OAAO,QAAQ;GACpD;GACA;GACA,UAAU,MAAM;GAChB,QAAQ,SAAS;GACjB;GACD;;AAEH,QAAO;;;AAIT,SAAgB,mBAAmB,SAA0C;CAE3E,MAAM,MAAM,aADS,KAAK,SAAS,sBAAsB,EAClB,QAAQ;CAC/C,MAAM,WAAW,KAAK,MAAM,IAAI;CAChC,MAAM,gBAAgB,SAAS,MAAM;CAErC,MAAM,gBAAgB,SAAS,WAAW,EAAE;CAE5C,MAAM,QAAiC,EAAE;AACzC,MAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,SAAS,OAAO,EAAE;EAC3D,MAAM,eAAe,KAAK,SAAS,oBAAoB,OAAO,cAAc,CAAC;EAC7E,MAAM,UAAU,eAAe,MAAM,QAAQ;EAC7C,MAAM,cAAc,MAAM,SACtB,sBAAsB,MAAM,QAAQ,eAAe,SAAS,cAAc,GAC1E,EAAE;EAEN,MAAM,kBAAkB,MAAM,YAC1B,0BAA0B,MAAM,WAAW,QAAQ,GACnD;EAGJ,MAAM,WAAW,cAAc,OAAO,cAAc;EAEpD,MAAM,OAAgB;GACpB,UAAU;GACV;GACA;GACA;GACA,QAAQ,SAAS;GACjB;GACD;AACD,SAAO,eAAe,MAAM,YAAY;GACtC,WAAW,aAAa,cAAc,QAAQ;GAC9C,YAAY;GACb,CAAC;AACF,QAAM,QAAQ;;AAEhB,QAAO;;;;;ACrTT,SAAgB,aACd,OACoC;CACpC,MAAM,QAAwB,EAAE;CAChC,IAAI,UAA+B;CACnC,IAAI,OAAO;CACX,SAAS,SAAS;AAChB,MAAI,SAAS;GACX,MAAM,IAAI;AACV,aAAU;AACV,MAAG;;;CAwBP,MAAM,UAAU,MApBc;EAC5B,KAAK,OAAO;AACV,OAAI,KAAM;AACV,SAAM,KAAK;IAAE,MAAM;IAAS;IAAO,CAAC;AACpC,WAAQ;;EAEV,MAAM;AACJ,OAAI,KAAM;AACV,UAAO;AACP,SAAM,KAAK,EAAE,MAAM,OAAO,CAAC;AAC3B,WAAQ;;EAEV,MAAM,KAAK;AACT,OAAI,KAAM;AACV,UAAO;AACP,SAAM,KAAK;IAAE,MAAM;IAAS,OAAO;IAAK,CAAC;AACzC,WAAQ;;EAEX,CAE0B;CAE3B,gBAAgB,WAA+C;AAC7D,MAAI;AACF,UAAO,MAAM;AACX,QAAI,MAAM,WAAW,EACnB,OAAM,IAAI,SAAe,MAAM;AAC7B,eAAU;MACV;AAGJ,WAAO,MAAM,SAAS,GAAG;KACvB,MAAM,OAAO,MAAM,OAAO;AAC1B,SAAI,KAAK,SAAS,QAChB,OAAM,KAAK;cACF,KAAK,SAAS,QACvB,OAAM,KAAK;SAEX;;;YAIE;AACR,UAAO;AACP,OAAI,QAAS,UAAS;;;AAI1B,QAAO,UAAU;;;;;AC3DnB,MAAM,uBAAuB;AAE7B,SAAS,UAAU,IAAY,IAAmB,MAAc,SAAuB;AACrF,IAAG,KAAK,KAAK,UAAU;EAAE;EAAI,IAAI;EAAO,OAAO;GAAE;GAAM;GAAS,WAAW;GAAO;EAAE,CAAC,CAAC;;;;;;;;AASxF,SAAgB,eACd,QACA,aACA,cACA,IACA,MACkB;CAClB,MAAM,cAAc,MAAM,qBAAqB;CAC/C,IAAI,SAAS;CAGb,MAAM,iBAAiB,kBAAkB;AACvC,MAAI,CAAC,OAAQ,IAAG,KAAK,KAAK,UAAU,EAAE,WAAW,MAAM,CAAC,CAAC;IACxD,YAAY;CAIf,MAAM,OADc,OAAO,mBAAmB,GAAG,YAAY,UAAU,aAAa,CAC3D,OAAO,gBAAgB;AAEhD,EAAM,YAAY;AAChB,MAAI;AACF,YAAS;IACP,MAAM,SAAkC,MAAM,KAAK,MAAM;AACzD,QAAI,OAAO,QAAQ,OAAQ;IAE3B,MAAM,KAAK,OAAO;AAClB,OAAG,KAAK,KAAK,UAAU;KAAE,OAAO,GAAG;KAAM,SAAS,GAAG;KAAS,CAAC,CAAC;;WAE3D,KAAK;AACZ,OAAI,CAAC,QAAQ;IACX,MAAM,OAAO,eAAe,YAAY,IAAI,OAAO;IACnD,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,OAAG,KAAK,KAAK,UAAU;KAAE,OAAO;KAAW,SAAS;MAAE;MAAM;MAAS;KAAE,CAAC,CAAC;;;KAG3E;AAEJ,QAAO;EACL,UAAU,MAAc;AACtB,OAAI,OAAQ;GAEZ,IAAI;AACJ,OAAI;AACF,UAAM,KAAK,MAAM,KAAK;WAChB;AACN,cAAU,IAAI,MAAM,oBAAoB,eAAe;AACvD;;AAGF,OAAI,CAAC,IAAI,MAAM,OAAO,IAAI,OAAO,UAAU;AACzC,cAAU,IAAI,MAAM,oBAAoB,qBAAqB;AAC7D;;AAGF,OAAI,CAAC,IAAI,aAAa,OAAO,IAAI,cAAc,UAAU;AACvD,cAAU,IAAI,IAAI,IAAI,oBAAoB,4BAA4B;AACtE;;GAIF,MAAM,SAAS,cAAc;AAC7B,OAAI,CAAC,IAAI,UAAU,WAAW,OAAO,IAAI,IAAI,cAAc,GAAG,YAAY,UAAU;AAClF,cACE,IACA,IAAI,IACJ,oBACA,cAAc,IAAI,UAAU,iCAAiC,YAAY,GAC1E;AACD;;GAIF,MAAM,cAAc;IAClB,GAAI;IACJ,GAAK,IAAI,SAAS,EAAE;IACrB;AAED,IAAM,YAAY;AAChB,QAAI;KACF,MAAM,SAAS,MAAM,OAAO,OAAO,IAAI,WAAW,YAAY;AAC9D,SAAI,OAAO,WAAW,KAAK;MACzB,MAAM,WAAW,OAAO;AACxB,SAAG,KAAK,KAAK,UAAU;OAAE,IAAI,IAAI;OAAI,IAAI;OAAM,MAAM,SAAS;OAAM,CAAC,CAAC;YACjE;MACL,MAAM,WAAW,OAAO;AAIxB,SAAG,KAAK,KAAK,UAAU;OAAE,IAAI,IAAI;OAAI,IAAI;OAAO,OAAO,SAAS;OAAO,CAAC,CAAC;;aAEpE,KAAK;KACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,eAAU,IAAI,IAAI,IAAI,kBAAkB,QAAQ;;OAEhD;;EAGN,QAAQ;AACN,OAAI,OAAQ;AACZ,YAAS;AACT,iBAAc,eAAe;AAC7B,GAAK,KAAK,SAAS,OAAU;;EAEhC;;;;;;ACzHH,SAAgB,eAAe,MAAoC;CACjE,MAAM,SAAS,KAAK,OAAO,QAAQ,OAAO,GAAG;AAE7C,QAAO,OAAO,QAAQ;EACpB,MAAM,MAAM,IAAI,IAAI,IAAI,KAAK,mBAAmB;EAChD,MAAM,WAAW,GAAG,SAAS,IAAI,WAAW,IAAI;AAEhD,MAAI;GACF,MAAM,OAAO,MAAM,MAAM,UAAU;IACjC,QAAQ,IAAI;IACZ,SAAS,EAAE,QAAQ,OAAO;IAC3B,CAAC;GAEF,MAAM,OAAO,MAAM,KAAK,MAAM;GAC9B,MAAM,UAAkC,EAAE;AAC1C,QAAK,QAAQ,SAAS,OAAO,QAAQ;AACnC,YAAQ,OAAO;KACf;AAEF,UAAO;IAAE,QAAQ,KAAK;IAAQ;IAAS;IAAM;UACvC;AACN,UAAO;IACL,QAAQ;IACR,SAAS,EAAE,gBAAgB,cAAc;IACzC,MAAM,qCAAqC;IAC5C;;;;;AAMP,SAAgB,oBAAoB,MAAyC;CAC3E,MAAM,MAAM,KAAK;AAEjB,QAAO,OAAO,QAAmC;EAE/C,IAAI,WADQ,IAAI,IAAI,IAAI,KAAK,mBAAmB,CAC7B;AAEnB,MAAI,SAAS,SAAS,KAAK,CACzB,QAAO;GACL,QAAQ;GACR,SAAS,EAAE,gBAAgB,cAAc;GACzC,MAAM;GACP;AAIH,MAAI,SAAS,SAAS,IAAI,CACxB,aAAY;EAGd,MAAM,WAAW,KAAK,KAAK,SAAS;AACpC,MAAI;GACF,MAAM,UAAU,MAAM,SAAS,SAAS;GAExC,MAAM,cAAc,WADR,QAAQ,SAAS,KACU;AACvC,UAAO;IACL,QAAQ;IACR,SAAS,EAAE,gBAAgB,aAAa;IACxC,MAAM,QAAQ,UAAU;IACzB;UACK;AACN,UAAO;IACL,QAAQ;IACR,SAAS,EAAE,gBAAgB,cAAc;IACzC,MAAM;IACP;;;;;;;AC3EP,SAAgB,mBAAmB,SAAiB,UAAqC;CACvF,MAAM,cAAc,KAAK,SAAS,kBAAkB;CACpD,IAAI,UAA4B;AAChC,KAAI;AACF,YAAU,MAAM,mBAAmB,UAAU,CAAC;SACxC;EAEN,MAAM,aAAa,MAAM,UAAU,QAAQ,aAAa;AACtD,OAAI,aAAa,mBAAmB;AAClC,eAAW,OAAO;AAClB,cAAU,MAAM,mBAAmB,UAAU,CAAC;AAE9C,cAAU;;IAEZ;AACF,SAAO,EACL,QAAQ;AACN,cAAW,OAAO;AAClB,YAAS,OAAO;KAEnB;;AAEH,QAAO,EACL,QAAQ;AACN,WAAS,OAAO;IAEnB"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["primitives"],"sources":["../src/types/schema.ts","../src/types/primitives.ts","../src/types/composites.ts","../src/types/index.ts","../src/manifest/index.ts","../src/errors.ts","../src/validation/index.ts","../src/router/handler.ts","../src/page/handler.ts","../src/page/route-matcher.ts","../src/resolve.ts","../src/router/index.ts","../src/channel.ts","../src/page/index.ts","../src/mime.ts","../src/http.ts","../src/page/build-loader.ts","../src/subscription.ts","../src/ws.ts","../src/proxy.ts","../src/dev/reload-watcher.ts"],"sourcesContent":["/* src/server/core/typescript/src/types/schema.ts */\n\nimport type { Schema } from \"jtd\";\n\nexport type JTDSchema = Schema;\n\nexport interface SchemaNode<TOutput = unknown> {\n readonly _schema: JTDSchema;\n /** Phantom type marker — never exists at runtime */\n readonly _output: TOutput;\n}\n\nexport interface OptionalSchemaNode<TOutput = unknown> extends SchemaNode<TOutput> {\n readonly _optional: true;\n}\n\nexport type Infer<T extends SchemaNode> = T[\"_output\"];\n\nexport function createSchemaNode<T>(schema: JTDSchema): SchemaNode<T> {\n return { _schema: schema } as SchemaNode<T>;\n}\n\nexport function createOptionalSchemaNode<T>(schema: JTDSchema): OptionalSchemaNode<T> {\n return { _schema: schema, _optional: true } as OptionalSchemaNode<T>;\n}\n","/* src/server/core/typescript/src/types/primitives.ts */\n\nimport type { SchemaNode } from \"./schema.js\";\nimport { createSchemaNode } from \"./schema.js\";\n\nexport function string(): SchemaNode<string> {\n return createSchemaNode<string>({ type: \"string\" });\n}\n\nexport function boolean(): SchemaNode<boolean> {\n return createSchemaNode<boolean>({ type: \"boolean\" });\n}\n\nexport function int8(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"int8\" });\n}\n\nexport function int16(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"int16\" });\n}\n\nexport function int32(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"int32\" });\n}\n\nexport function uint8(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"uint8\" });\n}\n\nexport function uint16(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"uint16\" });\n}\n\nexport function uint32(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"uint32\" });\n}\n\nexport function float32(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"float32\" });\n}\n\nexport function float64(): SchemaNode<number> {\n return createSchemaNode<number>({ type: \"float64\" });\n}\n\nexport function timestamp(): SchemaNode<string> {\n return createSchemaNode<string>({ type: \"timestamp\" });\n}\n\nexport function html(): SchemaNode<string> {\n return createSchemaNode<string>({ type: \"string\", metadata: { format: \"html\" } });\n}\n","/* src/server/core/typescript/src/types/composites.ts */\n\nimport type { SchemaNode, OptionalSchemaNode, Infer, JTDSchema } from \"./schema.js\";\nimport { createSchemaNode, createOptionalSchemaNode } from \"./schema.js\";\n\n// -- Type-level utilities --\n\ntype Simplify<T> = { [K in keyof T]: T[K] } & {};\n\ntype RequiredKeys<T extends Record<string, SchemaNode>> = {\n [K in keyof T]: T[K] extends OptionalSchemaNode ? never : K;\n}[keyof T];\n\ntype OptionalKeys<T extends Record<string, SchemaNode>> = {\n [K in keyof T]: T[K] extends OptionalSchemaNode ? K : never;\n}[keyof T];\n\ntype InferObject<T extends Record<string, SchemaNode>> = Simplify<\n { [K in RequiredKeys<T>]: Infer<T[K]> } & { [K in OptionalKeys<T>]?: Infer<T[K]> }\n>;\n\n// -- Builders --\n\nexport function object<T extends Record<string, SchemaNode>>(\n fields: T,\n): SchemaNode<InferObject<T>> {\n const properties: Record<string, JTDSchema> = {};\n const optionalProperties: Record<string, JTDSchema> = {};\n\n for (const [key, node] of Object.entries(fields)) {\n if (\"_optional\" in node && node._optional === true) {\n optionalProperties[key] = node._schema;\n } else {\n properties[key] = node._schema;\n }\n }\n\n const schema: Record<string, unknown> = {};\n if (Object.keys(properties).length > 0 || Object.keys(optionalProperties).length === 0) {\n schema.properties = properties;\n }\n if (Object.keys(optionalProperties).length > 0) {\n schema.optionalProperties = optionalProperties;\n }\n\n return createSchemaNode<InferObject<T>>(schema as JTDSchema);\n}\n\nexport function optional<T>(node: SchemaNode<T>): OptionalSchemaNode<T> {\n return createOptionalSchemaNode<T>(node._schema);\n}\n\nexport function array<T>(node: SchemaNode<T>): SchemaNode<T[]> {\n return createSchemaNode<T[]>({ elements: node._schema });\n}\n\nexport function nullable<T>(node: SchemaNode<T>): SchemaNode<T | null> {\n return createSchemaNode<T | null>({ ...node._schema, nullable: true } as JTDSchema);\n}\n\nexport function enumType<const T extends readonly string[]>(values: T): SchemaNode<T[number]> {\n return createSchemaNode<T[number]>({ enum: [...values] } as JTDSchema);\n}\n\nexport function values<T>(node: SchemaNode<T>): SchemaNode<Record<string, T>> {\n return createSchemaNode<Record<string, T>>({ values: node._schema });\n}\n\ntype DiscriminatorUnion<TTag extends string, TMapping extends Record<string, SchemaNode>> = {\n [K in keyof TMapping & string]: Simplify<{ [P in TTag]: K } & Infer<TMapping[K]>>;\n}[keyof TMapping & string];\n\nexport function discriminator<\n TTag extends string,\n TMapping extends Record<string, SchemaNode<Record<string, unknown>>>,\n>(tag: TTag, mapping: TMapping): SchemaNode<DiscriminatorUnion<TTag, TMapping>> {\n const jtdMapping: Record<string, JTDSchema> = {};\n for (const [key, node] of Object.entries(mapping)) {\n jtdMapping[key] = node._schema;\n }\n return createSchemaNode<DiscriminatorUnion<TTag, TMapping>>({\n discriminator: tag,\n mapping: jtdMapping,\n } as JTDSchema);\n}\n","/* src/server/core/typescript/src/types/index.ts */\n\nimport * as primitives from \"./primitives.js\";\nimport {\n object,\n optional,\n array,\n nullable,\n enumType,\n values,\n discriminator,\n} from \"./composites.js\";\n\nexport const t = {\n ...primitives,\n object,\n optional,\n array,\n nullable,\n enum: enumType,\n values,\n discriminator,\n} as const;\n","/* src/server/core/typescript/src/manifest/index.ts */\n\nimport type { Schema } from \"jtd\";\nimport type { SchemaNode } from \"../types/schema.js\";\nimport type { ChannelMeta } from \"../channel.js\";\n\nexport type ProcedureType = \"query\" | \"command\" | \"subscription\";\n\nexport interface ProcedureEntry {\n type: ProcedureType;\n input: Schema;\n output: Schema;\n error?: Schema;\n}\n\nexport interface ProcedureManifest {\n version: number;\n procedures: Record<string, ProcedureEntry>;\n channels?: Record<string, ChannelMeta>;\n}\n\nexport function buildManifest(\n definitions: Record<\n string,\n { input: SchemaNode; output: SchemaNode; type?: string; error?: SchemaNode }\n >,\n channels?: Record<string, ChannelMeta>,\n): ProcedureManifest {\n const mapped: ProcedureManifest[\"procedures\"] = {};\n\n for (const [name, def] of Object.entries(definitions)) {\n const type: ProcedureType =\n def.type === \"subscription\" ? \"subscription\" : def.type === \"command\" ? \"command\" : \"query\";\n const entry: ProcedureEntry = {\n type,\n input: def.input._schema,\n output: def.output._schema,\n };\n if (def.error) {\n entry.error = def.error._schema;\n }\n mapped[name] = entry;\n }\n\n const manifest: ProcedureManifest = { version: 1, procedures: mapped };\n if (channels && Object.keys(channels).length > 0) {\n manifest.channels = channels;\n }\n return manifest;\n}\n","/* src/server/core/typescript/src/errors.ts */\n\nexport type ErrorCode =\n | \"VALIDATION_ERROR\"\n | \"NOT_FOUND\"\n | \"UNAUTHORIZED\"\n | \"FORBIDDEN\"\n | \"RATE_LIMITED\"\n | \"INTERNAL_ERROR\"\n | (string & {});\n\nexport const DEFAULT_STATUS: Record<string, number> = {\n VALIDATION_ERROR: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n RATE_LIMITED: 429,\n INTERNAL_ERROR: 500,\n};\n\nexport class SeamError extends Error {\n readonly code: string;\n readonly status: number;\n\n constructor(code: string, message: string, status?: number) {\n super(message);\n this.code = code;\n this.status = status ?? DEFAULT_STATUS[code] ?? 500;\n this.name = \"SeamError\";\n }\n\n toJSON() {\n return {\n ok: false,\n error: {\n code: this.code,\n message: this.message,\n transient: false,\n },\n };\n }\n}\n","/* src/server/core/typescript/src/validation/index.ts */\n\nimport { validate } from \"jtd\";\nimport type { Schema, ValidationError as JTDValidationError } from \"jtd\";\n\nexport interface ValidationResult {\n valid: boolean;\n errors: JTDValidationError[];\n}\n\nexport function validateInput(schema: Schema, data: unknown): ValidationResult {\n const errors = validate(schema, data, { maxDepth: 32, maxErrors: 10 });\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function formatValidationErrors(errors: JTDValidationError[]): string {\n return errors\n .map((e) => {\n const path = e.instancePath.length > 0 ? e.instancePath.join(\"/\") : \"(root)\";\n const schema = e.schemaPath.join(\"/\");\n return `${path} (schema: ${schema})`;\n })\n .join(\"; \");\n}\n","/* src/server/core/typescript/src/router/handler.ts */\n\nimport { SeamError } from \"../errors.js\";\nimport type { HandleResult, InternalProcedure, InternalSubscription } from \"../procedure.js\";\nimport { validateInput, formatValidationErrors } from \"../validation/index.js\";\n\nexport type { HandleResult, InternalProcedure } from \"../procedure.js\";\n\nexport async function handleRequest(\n procedures: Map<string, InternalProcedure>,\n procedureName: string,\n rawBody: unknown,\n validateOutput?: boolean,\n): Promise<HandleResult> {\n const procedure = procedures.get(procedureName);\n if (!procedure) {\n return {\n status: 404,\n body: new SeamError(\"NOT_FOUND\", `Procedure '${procedureName}' not found`).toJSON(),\n };\n }\n\n const validation = validateInput(procedure.inputSchema, rawBody);\n if (!validation.valid) {\n const details = formatValidationErrors(validation.errors);\n return {\n status: 400,\n body: new SeamError(\"VALIDATION_ERROR\", `Input validation failed: ${details}`).toJSON(),\n };\n }\n\n try {\n const result = await procedure.handler({ input: rawBody });\n\n if (validateOutput) {\n const outValidation = validateInput(procedure.outputSchema, result);\n if (!outValidation.valid) {\n const details = formatValidationErrors(outValidation.errors);\n return {\n status: 500,\n body: new SeamError(\"INTERNAL_ERROR\", `Output validation failed: ${details}`).toJSON(),\n };\n }\n }\n\n return { status: 200, body: { ok: true, data: result } };\n } catch (error) {\n if (error instanceof SeamError) {\n return { status: error.status, body: error.toJSON() };\n }\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n status: 500,\n body: new SeamError(\"INTERNAL_ERROR\", message).toJSON(),\n };\n }\n}\n\nexport interface BatchCall {\n procedure: string;\n input: unknown;\n}\n\nexport type BatchResultItem =\n | { ok: true; data: unknown }\n | { ok: false; error: { code: string; message: string; transient: boolean } };\n\nexport async function handleBatchRequest(\n procedures: Map<string, InternalProcedure>,\n calls: BatchCall[],\n validateOutput?: boolean,\n): Promise<{ results: BatchResultItem[] }> {\n const results = await Promise.all(\n calls.map(async (call) => {\n const result = await handleRequest(procedures, call.procedure, call.input, validateOutput);\n if (result.status === 200) {\n const envelope = result.body as { ok: true; data: unknown };\n return { ok: true as const, data: envelope.data };\n }\n const envelope = result.body as {\n ok: false;\n error: { code: string; message: string; transient: boolean };\n };\n return { ok: false as const, error: envelope.error };\n }),\n );\n return { results };\n}\n\nexport async function* handleSubscription(\n subscriptions: Map<string, InternalSubscription>,\n name: string,\n rawInput: unknown,\n validateOutput?: boolean,\n): AsyncIterable<unknown> {\n const sub = subscriptions.get(name);\n if (!sub) {\n throw new SeamError(\"NOT_FOUND\", `Subscription '${name}' not found`);\n }\n\n const validation = validateInput(sub.inputSchema, rawInput);\n if (!validation.valid) {\n const details = formatValidationErrors(validation.errors);\n throw new SeamError(\"VALIDATION_ERROR\", `Input validation failed: ${details}`);\n }\n\n for await (const value of sub.handler({ input: rawInput })) {\n if (validateOutput) {\n const outValidation = validateInput(sub.outputSchema, value);\n if (!outValidation.valid) {\n const details = formatValidationErrors(outValidation.errors);\n throw new SeamError(\"INTERNAL_ERROR\", `Output validation failed: ${details}`);\n }\n }\n yield value;\n }\n}\n","/* src/server/core/typescript/src/page/handler.ts */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { renderPage, escapeHtml } from \"@canmi/seam-engine\";\nimport { SeamError } from \"../errors.js\";\nimport type { InternalProcedure } from \"../procedure.js\";\nimport type { PageDef, LoaderFn, I18nConfig } from \"./index.js\";\n\nexport interface PageTiming {\n /** Procedure execution time in milliseconds */\n dataFetch: number;\n /** Template injection time in milliseconds */\n inject: number;\n}\n\nexport interface HandlePageResult {\n status: number;\n html: string;\n timing?: PageTiming;\n}\n\nexport interface I18nOpts {\n locale: string;\n config: I18nConfig;\n /** Route pattern for hash-based message lookup */\n routePattern: string;\n}\n\n/** Execute loaders, returning keyed results */\nasync function executeLoaders(\n loaders: Record<string, LoaderFn>,\n params: Record<string, string>,\n procedures: Map<string, InternalProcedure>,\n): Promise<Record<string, unknown>> {\n const entries = Object.entries(loaders);\n const results = await Promise.all(\n entries.map(async ([key, loader]) => {\n const { procedure, input } = loader(params);\n const proc = procedures.get(procedure);\n if (!proc) throw new SeamError(\"INTERNAL_ERROR\", `Procedure '${procedure}' not found`);\n // Skip JTD validation -- loader input is trusted server-side code\n const result = await proc.handler({ input });\n return [key, result] as const;\n }),\n );\n return Object.fromEntries(results);\n}\n\n/** Select the template for a given locale, falling back to the default template */\nfunction selectTemplate(\n defaultTemplate: string,\n localeTemplates: Record<string, string> | undefined,\n locale: string | undefined,\n): string {\n if (locale && localeTemplates) {\n return localeTemplates[locale] ?? defaultTemplate;\n }\n return defaultTemplate;\n}\n\n/** Look up pre-resolved messages for a route + locale. Zero merge, zero filter. */\nfunction lookupMessages(\n config: I18nConfig,\n routePattern: string,\n locale: string,\n): Record<string, string> {\n const routeHash = config.routeHashes[routePattern];\n if (!routeHash) return {};\n\n if (config.mode === \"paged\" && config.distDir) {\n const filePath = join(config.distDir, \"i18n\", routeHash, `${locale}.json`);\n if (existsSync(filePath)) {\n return JSON.parse(readFileSync(filePath, \"utf-8\")) as Record<string, string>;\n }\n return {};\n }\n\n return config.messages[locale]?.[routeHash] ?? {};\n}\n\nexport async function handlePageRequest(\n page: PageDef,\n params: Record<string, string>,\n procedures: Map<string, InternalProcedure>,\n i18nOpts?: I18nOpts,\n): Promise<HandlePageResult> {\n try {\n const t0 = performance.now();\n const layoutChain = page.layoutChain ?? [];\n const locale = i18nOpts?.locale;\n\n // Execute all loaders (layout chain + page) in parallel\n const loaderResults = await Promise.all([\n ...layoutChain.map((layout) => executeLoaders(layout.loaders, params, procedures)),\n executeLoaders(page.loaders, params, procedures),\n ]);\n\n const t1 = performance.now();\n\n // Merge all loader data into a single object\n const allData: Record<string, unknown> = {};\n for (const result of loaderResults) {\n Object.assign(allData, result);\n }\n\n // Compose template: nest page inside layouts via outlet substitution\n const pageTemplate = selectTemplate(page.template, page.localeTemplates, locale);\n let composedTemplate = pageTemplate;\n for (let i = layoutChain.length - 1; i >= 0; i--) {\n const layout = layoutChain[i];\n const layoutTemplate = selectTemplate(layout.template, layout.localeTemplates, locale);\n composedTemplate = layoutTemplate.replace(\"<!--seam:outlet-->\", composedTemplate);\n }\n\n // Build PageConfig for engine\n const config: Record<string, unknown> = {\n layout_chain: layoutChain.map((l) => ({\n id: l.id,\n loader_keys: Object.keys(l.loaders),\n })),\n data_id: page.dataId ?? \"__data\",\n head_meta: page.headMeta,\n };\n if (page.pageAssets) {\n config.page_assets = page.pageAssets;\n }\n\n // Build I18nOpts for engine (hash-based lookup — zero merge, zero filter)\n let i18nOptsJson: string | undefined;\n if (i18nOpts) {\n const { config: i18nConfig, routePattern } = i18nOpts;\n const messages = lookupMessages(i18nConfig, routePattern, i18nOpts.locale);\n const routeHash = i18nConfig.routeHashes[routePattern];\n const i18nData: Record<string, unknown> = {\n locale: i18nOpts.locale,\n default_locale: i18nConfig.default,\n messages,\n };\n // Inject content hash and router table when cache is enabled\n if (i18nConfig.cache && routeHash) {\n i18nData.hash = i18nConfig.contentHashes[routeHash]?.[i18nOpts.locale];\n i18nData.router = i18nConfig.contentHashes;\n }\n i18nOptsJson = JSON.stringify(i18nData);\n }\n\n // Single WASM call: inject slots, compose data script, apply locale/meta\n const html = renderPage(\n composedTemplate,\n JSON.stringify(allData),\n JSON.stringify(config),\n i18nOptsJson,\n );\n\n const t2 = performance.now();\n\n return {\n status: 200,\n html,\n timing: { dataFetch: t1 - t0, inject: t2 - t1 },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n status: 500,\n html: `<!DOCTYPE html><html><body><h1>500 Internal Server Error</h1><p>${escapeHtml(message)}</p></body></html>`,\n };\n }\n}\n","/* src/server/core/typescript/src/page/route-matcher.ts */\n\ninterface CompiledRoute {\n segments: RouteSegment[];\n}\n\ntype RouteSegment = { kind: \"static\"; value: string } | { kind: \"param\"; name: string };\n\nfunction compileRoute(pattern: string): CompiledRoute {\n const segments: RouteSegment[] = pattern\n .split(\"/\")\n .filter(Boolean)\n .map((seg) =>\n seg.startsWith(\":\") ? { kind: \"param\", name: seg.slice(1) } : { kind: \"static\", value: seg },\n );\n return { segments };\n}\n\nfunction matchRoute(segments: RouteSegment[], pathParts: string[]): Record<string, string> | null {\n if (segments.length !== pathParts.length) return null;\n const params: Record<string, string> = {};\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n if (seg.kind === \"static\") {\n if (seg.value !== pathParts[i]) return null;\n } else {\n params[seg.name] = pathParts[i];\n }\n }\n return params;\n}\n\nexport class RouteMatcher<T> {\n private routes: { pattern: string; compiled: CompiledRoute; value: T }[] = [];\n\n add(pattern: string, value: T): void {\n this.routes.push({ pattern, compiled: compileRoute(pattern), value });\n }\n\n match(path: string): { value: T; params: Record<string, string>; pattern: string } | null {\n const parts = path.split(\"/\").filter(Boolean);\n for (const route of this.routes) {\n const params = matchRoute(route.compiled.segments, parts);\n if (params) return { value: route.value, params, pattern: route.pattern };\n }\n return null;\n }\n}\n","/* src/server/core/typescript/src/resolve.ts */\n\n// -- New strategy-based API --\n\nexport interface ResolveStrategy {\n readonly kind: string;\n resolve(data: ResolveData): string | null;\n}\n\nexport interface ResolveData {\n readonly url: string;\n readonly pathLocale: string | null;\n readonly cookie: string | undefined;\n readonly acceptLanguage: string | undefined;\n readonly locales: string[];\n readonly defaultLocale: string;\n}\n\n/** URL prefix strategy: trusts pathLocale if it is a known locale */\nexport function fromUrlPrefix(): ResolveStrategy {\n return {\n kind: \"url_prefix\",\n resolve(data) {\n if (data.pathLocale && data.locales.includes(data.pathLocale)) {\n return data.pathLocale;\n }\n return null;\n },\n };\n}\n\n/** Cookie strategy: reads a named cookie and validates against known locales */\nexport function fromCookie(name = \"seam-locale\"): ResolveStrategy {\n return {\n kind: \"cookie\",\n resolve(data) {\n if (!data.cookie) return null;\n for (const pair of data.cookie.split(\";\")) {\n const [k, v] = pair.trim().split(\"=\");\n if (k === name && v && data.locales.includes(v)) return v;\n }\n return null;\n },\n };\n}\n\n/** Accept-Language strategy: parses header with q-value sorting + prefix match */\nexport function fromAcceptLanguage(): ResolveStrategy {\n return {\n kind: \"accept_language\",\n resolve(data) {\n if (!data.acceptLanguage) return null;\n const entries: { lang: string; q: number }[] = [];\n for (const part of data.acceptLanguage.split(\",\")) {\n const trimmed = part.trim();\n const [lang, ...rest] = trimmed.split(\";\");\n let q = 1;\n for (const r of rest) {\n const match = r.trim().match(/^q=(\\d+(?:\\.\\d+)?)$/);\n if (match) q = parseFloat(match[1]);\n }\n entries.push({ lang: lang.trim(), q });\n }\n entries.sort((a, b) => b.q - a.q);\n const localeSet = new Set(data.locales);\n for (const { lang } of entries) {\n if (localeSet.has(lang)) return lang;\n // Prefix match: zh-CN -> zh\n const prefix = lang.split(\"-\")[0];\n if (prefix !== lang && localeSet.has(prefix)) return prefix;\n }\n return null;\n },\n };\n}\n\n/** URL query strategy: reads a query parameter and validates against known locales */\nexport function fromUrlQuery(param = \"lang\"): ResolveStrategy {\n return {\n kind: \"url_query\",\n resolve(data) {\n if (!data.url) return null;\n try {\n const url = new URL(data.url, \"http://localhost\");\n const value = url.searchParams.get(param);\n if (value && data.locales.includes(value)) return value;\n } catch {\n // Invalid URL — skip\n }\n return null;\n },\n };\n}\n\n/** Run strategies in order; first non-null wins, otherwise defaultLocale */\nexport function resolveChain(strategies: ResolveStrategy[], data: ResolveData): string {\n for (const s of strategies) {\n const result = s.resolve(data);\n if (result !== null) return result;\n }\n return data.defaultLocale;\n}\n\n/** Default strategy chain: url_prefix -> cookie -> accept_language */\nexport function defaultStrategies(): ResolveStrategy[] {\n return [fromUrlPrefix(), fromCookie(), fromAcceptLanguage()];\n}\n","/* src/server/core/typescript/src/router/index.ts */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SchemaNode } from \"../types/schema.js\";\nimport type { ProcedureManifest } from \"../manifest/index.js\";\nimport type { HandleResult, InternalProcedure } from \"./handler.js\";\nimport type { InternalSubscription } from \"../procedure.js\";\nimport type { HandlePageResult } from \"../page/handler.js\";\nimport type { PageDef, I18nConfig } from \"../page/index.js\";\nimport type { ChannelResult, ChannelMeta } from \"../channel.js\";\nimport { buildManifest } from \"../manifest/index.js\";\nimport { handleRequest, handleSubscription, handleBatchRequest } from \"./handler.js\";\nimport type { BatchCall, BatchResultItem } from \"./handler.js\";\nimport { handlePageRequest } from \"../page/handler.js\";\nimport { RouteMatcher } from \"../page/route-matcher.js\";\nimport { defaultStrategies, resolveChain } from \"../resolve.js\";\nimport type { ResolveStrategy } from \"../resolve.js\";\n\nexport interface ProcedureDef<TIn = unknown, TOut = unknown> {\n input: SchemaNode<TIn>;\n output: SchemaNode<TOut>;\n error?: SchemaNode;\n handler: (params: { input: TIn }) => TOut | Promise<TOut>;\n}\n\nexport interface CommandDef<TIn = unknown, TOut = unknown> {\n type: \"command\";\n input: SchemaNode<TIn>;\n output: SchemaNode<TOut>;\n error?: SchemaNode;\n handler: (params: { input: TIn }) => TOut | Promise<TOut>;\n}\n\nexport interface SubscriptionDef<TIn = unknown, TOut = unknown> {\n type: \"subscription\";\n input: SchemaNode<TIn>;\n output: SchemaNode<TOut>;\n error?: SchemaNode;\n handler: (params: { input: TIn }) => AsyncIterable<TOut>;\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport type DefinitionMap = Record<\n string,\n ProcedureDef<any, any> | CommandDef<any, any> | SubscriptionDef<any, any>\n>;\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\nfunction isSubscriptionDef(\n def: ProcedureDef | CommandDef | SubscriptionDef,\n): def is SubscriptionDef {\n return \"type\" in def && def.type === \"subscription\";\n}\n\nexport interface RouterOptions {\n pages?: Record<string, PageDef>;\n i18n?: I18nConfig | null;\n validateOutput?: boolean;\n resolve?: ResolveStrategy[];\n channels?: ChannelResult[];\n}\n\nexport interface PageRequestHeaders {\n url?: string;\n cookie?: string;\n acceptLanguage?: string;\n}\n\nexport interface Router<T extends DefinitionMap> {\n manifest(): ProcedureManifest;\n handle(procedureName: string, body: unknown): Promise<HandleResult>;\n handleBatch(calls: BatchCall[]): Promise<{ results: BatchResultItem[] }>;\n handleSubscription(name: string, input: unknown): AsyncIterable<unknown>;\n handlePage(path: string, headers?: PageRequestHeaders): Promise<HandlePageResult | null>;\n readonly hasPages: boolean;\n /** Exposed for adapter access to the definitions */\n readonly procedures: T;\n}\n\n/** Build the resolve strategy list from options */\nfunction buildStrategies(opts?: RouterOptions): {\n strategies: ResolveStrategy[];\n hasUrlPrefix: boolean;\n} {\n const strategies = opts?.resolve ?? defaultStrategies();\n return {\n strategies,\n hasUrlPrefix: strategies.some((s) => s.kind === \"url_prefix\"),\n };\n}\n\n/** Register built-in __seam_i18n_query procedure (route-hash-based lookup) */\nfunction registerI18nQuery(procedureMap: Map<string, InternalProcedure>, config: I18nConfig): void {\n procedureMap.set(\"__seam_i18n_query\", {\n inputSchema: {},\n outputSchema: {},\n handler: ({ input }) => {\n const { route, locale } = input as { route: string; locale: string };\n const messages = lookupI18nMessages(config, route, locale);\n const hash = config.contentHashes[route]?.[locale] ?? \"\";\n return { hash, messages };\n },\n });\n}\n\n/** Look up messages by route hash + locale for RPC query */\nfunction lookupI18nMessages(\n config: I18nConfig,\n routeHash: string,\n locale: string,\n): Record<string, string> {\n if (config.mode === \"paged\" && config.distDir) {\n const filePath = join(config.distDir, \"i18n\", routeHash, `${locale}.json`);\n if (existsSync(filePath)) {\n return JSON.parse(readFileSync(filePath, \"utf-8\")) as Record<string, string>;\n }\n return {};\n }\n return config.messages[locale]?.[routeHash] ?? {};\n}\n\nexport function createRouter<T extends DefinitionMap>(\n procedures: T,\n opts?: RouterOptions,\n): Router<T> {\n const procedureMap = new Map<string, InternalProcedure>();\n const subscriptionMap = new Map<string, InternalSubscription>();\n\n for (const [name, def] of Object.entries(procedures)) {\n if (isSubscriptionDef(def)) {\n subscriptionMap.set(name, {\n inputSchema: def.input._schema,\n outputSchema: def.output._schema,\n handler: def.handler as InternalSubscription[\"handler\"],\n });\n } else {\n // Both ProcedureDef (query) and CommandDef share the same handler path\n procedureMap.set(name, {\n inputSchema: def.input._schema,\n outputSchema: def.output._schema,\n handler: def.handler as InternalProcedure[\"handler\"],\n });\n }\n }\n\n const shouldValidateOutput =\n opts?.validateOutput ??\n (typeof process !== \"undefined\" && process.env.NODE_ENV !== \"production\");\n\n const pageMatcher = new RouteMatcher<PageDef>();\n const pages = opts?.pages;\n if (pages) {\n for (const [pattern, page] of Object.entries(pages)) {\n pageMatcher.add(pattern, page);\n }\n }\n\n const i18nConfig = opts?.i18n ?? null;\n const { strategies, hasUrlPrefix } = buildStrategies(opts);\n if (i18nConfig) registerI18nQuery(procedureMap, i18nConfig);\n\n // Collect channel metadata for manifest\n const channelsMeta: Record<string, ChannelMeta> | undefined =\n opts?.channels && opts.channels.length > 0\n ? Object.fromEntries(\n opts.channels.map((ch) => {\n // Derive name from the first procedure key prefix\n const firstKey = Object.keys(ch.procedures)[0] ?? \"\";\n const name = firstKey.includes(\".\")\n ? firstKey.slice(0, firstKey.indexOf(\".\"))\n : firstKey;\n return [name, ch.channelMeta];\n }),\n )\n : undefined;\n\n return {\n procedures,\n hasPages: !!pages && Object.keys(pages).length > 0,\n manifest() {\n return buildManifest(procedures, channelsMeta);\n },\n handle(procedureName, body) {\n return handleRequest(procedureMap, procedureName, body, shouldValidateOutput);\n },\n handleBatch(calls) {\n return handleBatchRequest(procedureMap, calls, shouldValidateOutput);\n },\n handleSubscription(name, input) {\n return handleSubscription(subscriptionMap, name, input, shouldValidateOutput);\n },\n async handlePage(path, headers) {\n let pathLocale: string | null = null;\n let routePath = path;\n\n if (hasUrlPrefix && i18nConfig) {\n const segments = path.split(\"/\").filter(Boolean);\n const localeSet = new Set(i18nConfig.locales);\n if (segments.length > 0 && localeSet.has(segments[0])) {\n pathLocale = segments[0];\n routePath = \"/\" + segments.slice(1).join(\"/\") || \"/\";\n }\n }\n\n let locale: string | undefined;\n if (i18nConfig) {\n locale = resolveChain(strategies, {\n url: headers?.url ?? \"\",\n pathLocale,\n cookie: headers?.cookie,\n acceptLanguage: headers?.acceptLanguage,\n locales: i18nConfig.locales,\n defaultLocale: i18nConfig.default,\n });\n }\n\n const match = pageMatcher.match(routePath);\n if (!match) return null;\n\n const i18nOpts =\n locale && i18nConfig\n ? { locale, config: i18nConfig, routePattern: match.pattern }\n : undefined;\n return handlePageRequest(match.value, match.params, procedureMap, i18nOpts);\n },\n };\n}\n","/* src/server/core/typescript/src/channel.ts */\n\nimport type { Schema } from \"jtd\";\nimport type { SchemaNode, Infer, JTDSchema } from \"./types/schema.js\";\nimport type { CommandDef, SubscriptionDef, DefinitionMap } from \"./router/index.js\";\n\n// -- Public types --\n\nexport interface IncomingDef<TIn = unknown, TOut = unknown> {\n input: SchemaNode<TIn>;\n output: SchemaNode<TOut>;\n error?: SchemaNode;\n handler: (params: { input: TIn }) => TOut | Promise<TOut>;\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport interface ChannelDef<\n TChannelIn = unknown,\n TIncoming extends Record<string, IncomingDef<any, any>> = Record<string, IncomingDef<any, any>>,\n TOutgoing extends Record<string, SchemaNode<Record<string, unknown>>> = Record<\n string,\n SchemaNode<Record<string, unknown>>\n >,\n> {\n input: SchemaNode<TChannelIn>;\n incoming: TIncoming;\n outgoing: TOutgoing;\n subscribe: (params: { input: TChannelIn }) => AsyncIterable<ChannelEvent<TOutgoing>>;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\ntype ChannelEvent<TOutgoing extends Record<string, SchemaNode<Record<string, unknown>>>> = {\n [K in keyof TOutgoing & string]: { type: K; payload: Infer<TOutgoing[K]> };\n}[keyof TOutgoing & string];\n\n/** IR hint stored in the manifest `channels` field */\nexport interface ChannelMeta {\n input: Schema;\n incoming: Record<string, { input: Schema; output: Schema; error?: Schema }>;\n outgoing: Record<string, Schema>;\n}\n\nexport interface ChannelResult {\n /** Expanded Level 0 procedure definitions — spread into createRouter */\n procedures: DefinitionMap;\n /** IR hint for codegen */\n channelMeta: ChannelMeta;\n}\n\n// -- Helpers --\n\n/** Merge channel-level and message-level JTD properties schemas */\nfunction mergeObjectSchemas(channel: JTDSchema, message: JTDSchema): JTDSchema {\n const channelProps = (channel as Record<string, unknown>).properties as\n | Record<string, JTDSchema>\n | undefined;\n const channelOptional = (channel as Record<string, unknown>).optionalProperties as\n | Record<string, JTDSchema>\n | undefined;\n const msgProps = (message as Record<string, unknown>).properties as\n | Record<string, JTDSchema>\n | undefined;\n const msgOptional = (message as Record<string, unknown>).optionalProperties as\n | Record<string, JTDSchema>\n | undefined;\n\n const merged: Record<string, unknown> = {};\n\n const props = { ...channelProps, ...msgProps };\n if (Object.keys(props).length > 0) {\n merged.properties = props;\n }\n\n const optProps = { ...channelOptional, ...msgOptional };\n if (Object.keys(optProps).length > 0) {\n merged.optionalProperties = optProps;\n }\n\n // Empty object schema needs at least empty properties\n if (!merged.properties && !merged.optionalProperties) {\n merged.properties = {};\n }\n\n return merged as JTDSchema;\n}\n\n/** Build a tagged union schema from outgoing event definitions */\nfunction buildOutgoingUnionSchema(\n outgoing: Record<string, SchemaNode<Record<string, unknown>>>,\n): JTDSchema {\n const mapping: Record<string, JTDSchema> = {};\n for (const [eventName, node] of Object.entries(outgoing)) {\n // Wrap each outgoing payload as a \"payload\" property\n mapping[eventName] = {\n properties: { payload: node._schema },\n } as JTDSchema;\n }\n return { discriminator: \"type\", mapping } as JTDSchema;\n}\n\n// -- Main API --\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport function createChannel<\n TChannelIn,\n TIncoming extends Record<string, IncomingDef<any, any>>,\n TOutgoing extends Record<string, SchemaNode<Record<string, unknown>>>,\n>(name: string, def: ChannelDef<TChannelIn, TIncoming, TOutgoing>): ChannelResult {\n const procedures: DefinitionMap = {};\n const channelInputSchema = def.input._schema;\n\n // Expand incoming messages to command procedures\n for (const [msgName, msgDef] of Object.entries(def.incoming)) {\n const mergedInputSchema = mergeObjectSchemas(channelInputSchema, msgDef.input._schema);\n\n const command: CommandDef<any, any> = {\n type: \"command\",\n input: { _schema: mergedInputSchema } as SchemaNode<any>,\n output: msgDef.output,\n handler: msgDef.handler as CommandDef<any, any>[\"handler\"],\n };\n if (msgDef.error) {\n command.error = msgDef.error;\n }\n procedures[`${name}.${msgName}`] = command;\n }\n\n // Expand subscribe to a subscription with tagged union output\n const unionSchema = buildOutgoingUnionSchema(def.outgoing);\n const subscription: SubscriptionDef<any, any> = {\n type: \"subscription\",\n input: def.input as SchemaNode<any>,\n output: { _schema: unionSchema } as SchemaNode<any>,\n handler: def.subscribe as SubscriptionDef<any, any>[\"handler\"],\n };\n procedures[`${name}.events`] = subscription;\n\n // Build channel metadata for manifest IR hint\n const incomingMeta: ChannelMeta[\"incoming\"] = {};\n for (const [msgName, msgDef] of Object.entries(def.incoming)) {\n const entry: { input: Schema; output: Schema; error?: Schema } = {\n input: msgDef.input._schema,\n output: msgDef.output._schema,\n };\n if (msgDef.error) {\n entry.error = msgDef.error._schema;\n }\n incomingMeta[msgName] = entry;\n }\n\n const outgoingMeta: ChannelMeta[\"outgoing\"] = {};\n for (const [eventName, node] of Object.entries(def.outgoing)) {\n outgoingMeta[eventName] = node._schema;\n }\n\n const channelMeta: ChannelMeta = {\n input: channelInputSchema,\n incoming: incomingMeta,\n outgoing: outgoingMeta,\n };\n\n return { procedures, channelMeta };\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","/* src/server/core/typescript/src/page/index.ts */\n\nexport interface LoaderResult {\n procedure: string;\n input: unknown;\n}\n\nexport type LoaderFn = (params: Record<string, string>) => LoaderResult;\n\nexport interface LayoutDef {\n id: string;\n template: string;\n localeTemplates?: Record<string, string>;\n loaders: Record<string, LoaderFn>;\n i18nKeys?: string[];\n}\n\nexport interface PageAssets {\n styles: string[];\n scripts: string[];\n preload: string[];\n prefetch: string[];\n}\n\nexport interface PageDef {\n template: string;\n localeTemplates?: Record<string, string>;\n loaders: Record<string, LoaderFn>;\n layoutChain?: LayoutDef[];\n headMeta?: string;\n dataId?: string;\n i18nKeys?: string[];\n pageAssets?: PageAssets;\n}\n\nexport interface I18nConfig {\n locales: string[];\n default: string;\n mode: \"memory\" | \"paged\";\n cache: boolean;\n routeHashes: Record<string, string>;\n contentHashes: Record<string, Record<string, string>>;\n /** Memory mode: locale → routeHash → messages */\n messages: Record<string, Record<string, Record<string, string>>>;\n /** Paged mode: base directory for on-demand reads */\n distDir?: string;\n}\n\nexport function definePage(config: PageDef): PageDef {\n return { ...config, layoutChain: config.layoutChain ?? [] };\n}\n","/* src/server/core/typescript/src/mime.ts */\n\nexport const MIME_TYPES: Record<string, string> = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".html\": \"text/html\",\n \".json\": \"application/json\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".ico\": \"image/x-icon\",\n \".map\": \"application/json\",\n \".ts\": \"application/javascript\",\n \".tsx\": \"application/javascript\",\n};\n","/* src/server/core/typescript/src/http.ts */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\nimport type { Router, DefinitionMap } from \"./router/index.js\";\nimport { SeamError } from \"./errors.js\";\nimport { MIME_TYPES } from \"./mime.js\";\n\nexport interface HttpRequest {\n method: string;\n url: string;\n body: () => Promise<unknown>;\n header?: (name: string) => string | null;\n}\n\nexport interface HttpBodyResponse {\n status: number;\n headers: Record<string, string>;\n body: unknown;\n}\n\nexport interface HttpStreamResponse {\n status: number;\n headers: Record<string, string>;\n stream: AsyncIterable<string>;\n}\n\nexport type HttpResponse = HttpBodyResponse | HttpStreamResponse;\n\nexport type HttpHandler = (req: HttpRequest) => Promise<HttpResponse>;\n\nexport interface RpcHashMap {\n procedures: Record<string, string>;\n batch: string;\n}\n\nexport interface HttpHandlerOptions {\n staticDir?: string;\n fallback?: HttpHandler;\n rpcHashMap?: RpcHashMap;\n}\n\nconst PROCEDURE_PREFIX = \"/_seam/procedure/\";\nconst PAGE_PREFIX = \"/_seam/page/\";\nconst STATIC_PREFIX = \"/_seam/static/\";\nconst MANIFEST_PATH = \"/_seam/manifest.json\";\n\nconst JSON_HEADER = { \"Content-Type\": \"application/json\" };\nconst HTML_HEADER = { \"Content-Type\": \"text/html; charset=utf-8\" };\nconst SSE_HEADER = {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n};\nconst IMMUTABLE_CACHE = \"public, max-age=31536000, immutable\";\n\nfunction jsonResponse(status: number, body: unknown): HttpBodyResponse {\n return { status, headers: JSON_HEADER, body };\n}\n\nfunction errorResponse(status: number, code: string, message: string): HttpBodyResponse {\n return jsonResponse(status, new SeamError(code, message).toJSON());\n}\n\nasync function handleStaticAsset(assetPath: string, staticDir: string): Promise<HttpBodyResponse> {\n if (assetPath.includes(\"..\")) {\n return errorResponse(403, \"VALIDATION_ERROR\", \"Forbidden\");\n }\n\n const filePath = join(staticDir, assetPath);\n try {\n const content = await readFile(filePath, \"utf-8\");\n const ext = extname(filePath);\n const contentType = MIME_TYPES[ext] || \"application/octet-stream\";\n return {\n status: 200,\n headers: {\n \"Content-Type\": contentType,\n \"Cache-Control\": IMMUTABLE_CACHE,\n },\n body: content,\n };\n } catch {\n return errorResponse(404, \"NOT_FOUND\", \"Asset not found\");\n }\n}\n\n/** Format a single SSE data event */\nexport function sseDataEvent(data: unknown): string {\n return `event: data\\ndata: ${JSON.stringify(data)}\\n\\n`;\n}\n\n/** Format an SSE error event */\nexport function sseErrorEvent(code: string, message: string, transient = false): string {\n return `event: error\\ndata: ${JSON.stringify({ code, message, transient })}\\n\\n`;\n}\n\n/** Format an SSE complete event */\nexport function sseCompleteEvent(): string {\n return \"event: complete\\ndata: {}\\n\\n\";\n}\n\nasync function* sseStream<T extends DefinitionMap>(\n router: Router<T>,\n name: string,\n input: unknown,\n): AsyncIterable<string> {\n try {\n for await (const value of router.handleSubscription(name, input)) {\n yield sseDataEvent(value);\n }\n yield sseCompleteEvent();\n } catch (error) {\n if (error instanceof SeamError) {\n yield sseErrorEvent(error.code, error.message);\n } else {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n yield sseErrorEvent(\"INTERNAL_ERROR\", message);\n }\n }\n}\n\nasync function handleBatchHttp<T extends DefinitionMap>(\n req: HttpRequest,\n router: Router<T>,\n hashToName: Map<string, string> | null,\n): Promise<HttpBodyResponse> {\n let body: unknown;\n try {\n body = await req.body();\n } catch {\n return errorResponse(400, \"VALIDATION_ERROR\", \"Invalid JSON body\");\n }\n if (!body || typeof body !== \"object\" || !Array.isArray((body as { calls?: unknown }).calls)) {\n return errorResponse(400, \"VALIDATION_ERROR\", \"Batch request must have a 'calls' array\");\n }\n const calls = (body as { calls: Array<{ procedure?: unknown; input?: unknown }> }).calls.map(\n (c) => ({\n procedure:\n typeof c.procedure === \"string\" ? (hashToName?.get(c.procedure) ?? c.procedure) : \"\",\n input: c.input ?? {},\n }),\n );\n const result = await router.handleBatch(calls);\n return jsonResponse(200, { ok: true, data: result });\n}\n\nexport function createHttpHandler<T extends DefinitionMap>(\n router: Router<T>,\n opts?: HttpHandlerOptions,\n): HttpHandler {\n // Build reverse lookup (hash -> original name) when obfuscation is active\n const hashToName: Map<string, string> | null = opts?.rpcHashMap\n ? new Map(Object.entries(opts.rpcHashMap.procedures).map(([n, h]) => [h, n]))\n : null;\n // Built-in procedures bypass hash obfuscation (identity mapping)\n if (hashToName) {\n hashToName.set(\"__seam_i18n_query\", \"__seam_i18n_query\");\n }\n const batchHash = opts?.rpcHashMap?.batch ?? null;\n\n return async (req) => {\n const url = new URL(req.url, \"http://localhost\");\n const { pathname } = url;\n\n if (req.method === \"GET\" && pathname === MANIFEST_PATH) {\n if (opts?.rpcHashMap) return errorResponse(403, \"FORBIDDEN\", \"Manifest disabled\");\n return jsonResponse(200, router.manifest());\n }\n\n if (pathname.startsWith(PROCEDURE_PREFIX)) {\n let name = pathname.slice(PROCEDURE_PREFIX.length);\n if (!name) {\n return errorResponse(404, \"NOT_FOUND\", \"Empty procedure name\");\n }\n\n if (req.method === \"POST\") {\n // Batch: match both original \"_batch\" and hashed batch endpoint\n if (name === \"_batch\" || (batchHash && name === batchHash)) {\n return handleBatchHttp(req, router, hashToName);\n }\n\n // Resolve hash -> original name when obfuscation is active\n if (hashToName) {\n const resolved = hashToName.get(name);\n if (!resolved) return errorResponse(404, \"NOT_FOUND\", \"Not found\");\n name = resolved;\n }\n\n let body: unknown;\n try {\n body = await req.body();\n } catch {\n return errorResponse(400, \"VALIDATION_ERROR\", \"Invalid JSON body\");\n }\n\n const result = await router.handle(name, body);\n return jsonResponse(result.status, result.body);\n }\n\n if (req.method === \"GET\") {\n // Resolve hash -> original name for subscriptions\n if (hashToName) {\n const resolved = hashToName.get(name);\n if (!resolved) return errorResponse(404, \"NOT_FOUND\", \"Not found\");\n name = resolved;\n }\n\n const rawInput = url.searchParams.get(\"input\");\n let input: unknown;\n try {\n input = rawInput ? JSON.parse(rawInput) : {};\n } catch {\n return errorResponse(400, \"VALIDATION_ERROR\", \"Invalid input query parameter\");\n }\n\n return { status: 200, headers: SSE_HEADER, stream: sseStream(router, name, input) };\n }\n }\n\n // Pages are served under /_seam/page/* prefix only.\n // Root-path serving is the application's responsibility — see the\n // github-dashboard ts-hono example for the fallback pattern.\n if (req.method === \"GET\" && pathname.startsWith(PAGE_PREFIX) && router.hasPages) {\n const pagePath = \"/\" + pathname.slice(PAGE_PREFIX.length);\n const headers = req.header\n ? {\n url: req.url,\n cookie: req.header(\"cookie\") ?? undefined,\n acceptLanguage: req.header(\"accept-language\") ?? undefined,\n }\n : undefined;\n const result = await router.handlePage(pagePath, headers);\n if (result) {\n return { status: result.status, headers: HTML_HEADER, body: result.html };\n }\n }\n\n if (req.method === \"GET\" && pathname.startsWith(STATIC_PREFIX) && opts?.staticDir) {\n const assetPath = pathname.slice(STATIC_PREFIX.length);\n return handleStaticAsset(assetPath, opts.staticDir);\n }\n\n if (opts?.fallback) return opts.fallback(req);\n return errorResponse(404, \"NOT_FOUND\", \"Not found\");\n };\n}\n\nexport function serialize(body: unknown): string {\n return typeof body === \"string\" ? body : JSON.stringify(body);\n}\n\n/** Consume an async stream chunk-by-chunk; return false from write to stop early. */\nexport async function drainStream(\n stream: AsyncIterable<string>,\n write: (chunk: string) => boolean | void,\n): Promise<void> {\n try {\n for await (const chunk of stream) {\n if (write(chunk) === false) break;\n }\n } catch {\n // Client disconnected\n }\n}\n\n/** Convert an HttpResponse to a Web API Response (for adapters using fetch-compatible runtimes) */\nexport function toWebResponse(result: HttpResponse): Response {\n if (\"stream\" in result) {\n const stream = result.stream;\n const encoder = new TextEncoder();\n const readable = new ReadableStream({\n async start(controller) {\n await drainStream(stream, (chunk) => {\n controller.enqueue(encoder.encode(chunk));\n });\n controller.close();\n },\n });\n return new Response(readable, { status: result.status, headers: result.headers });\n }\n return new Response(serialize(result.body), { status: result.status, headers: result.headers });\n}\n","/* src/server/core/typescript/src/page/build-loader.ts */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type {\n PageDef,\n PageAssets,\n LayoutDef,\n LoaderFn,\n LoaderResult,\n I18nConfig,\n} from \"./index.js\";\nimport type { RpcHashMap } from \"../http.js\";\n\ninterface RouteManifest {\n layouts?: Record<string, LayoutManifestEntry>;\n routes: Record<string, RouteManifestEntry>;\n data_id?: string;\n i18n?: {\n locales: string[];\n default: string;\n mode?: string;\n cache?: boolean;\n route_hashes?: Record<string, string>;\n content_hashes?: Record<string, Record<string, string>>;\n };\n}\n\ninterface LayoutManifestEntry {\n template?: string;\n templates?: Record<string, string>;\n loaders?: Record<string, LoaderConfig>;\n parent?: string;\n i18n_keys?: string[];\n}\n\ninterface RouteManifestEntry {\n template?: string;\n templates?: Record<string, string>;\n layout?: string;\n loaders: Record<string, LoaderConfig>;\n head_meta?: string;\n i18n_keys?: string[];\n assets?: PageAssets;\n}\n\ninterface LoaderConfig {\n procedure: string;\n params?: Record<string, ParamConfig>;\n}\n\ninterface ParamConfig {\n from: \"route\";\n type?: \"string\" | \"int\";\n}\n\nfunction buildLoaderFn(config: LoaderConfig): LoaderFn {\n return (params: Record<string, string>): LoaderResult => {\n const input: Record<string, unknown> = {};\n if (config.params) {\n for (const [key, mapping] of Object.entries(config.params)) {\n const raw = params[key];\n input[key] = mapping.type === \"int\" ? Number(raw) : raw;\n }\n }\n return { procedure: config.procedure, input };\n };\n}\n\nfunction buildLoaderFns(configs: Record<string, LoaderConfig>): Record<string, LoaderFn> {\n const fns: Record<string, LoaderFn> = {};\n for (const [key, config] of Object.entries(configs)) {\n fns[key] = buildLoaderFn(config);\n }\n return fns;\n}\n\nfunction resolveTemplatePath(\n entry: { template?: string; templates?: Record<string, string> },\n defaultLocale: string | undefined,\n): string {\n if (entry.template) return entry.template;\n if (entry.templates) {\n const locale = defaultLocale ?? Object.keys(entry.templates)[0];\n const path = entry.templates[locale];\n if (!path) throw new Error(`No template for locale \"${locale}\"`);\n return path;\n }\n throw new Error(\"Manifest entry has neither 'template' nor 'templates'\");\n}\n\n/** Load all locale templates for a manifest entry, keyed by locale */\nfunction loadLocaleTemplates(\n entry: { templates?: Record<string, string> },\n distDir: string,\n): Record<string, string> | undefined {\n if (!entry.templates) return undefined;\n const result: Record<string, string> = {};\n for (const [locale, relPath] of Object.entries(entry.templates)) {\n result[locale] = readFileSync(join(distDir, relPath), \"utf-8\");\n }\n return result;\n}\n\n/** Resolve parent chain for a layout, returning outer-to-inner order */\nfunction resolveLayoutChain(\n layoutId: string,\n layoutEntries: Record<string, LayoutManifestEntry>,\n templates: Record<string, string>,\n localeTemplatesMap: Record<string, Record<string, string>>,\n): LayoutDef[] {\n const chain: LayoutDef[] = [];\n let currentId: string | undefined = layoutId;\n\n while (currentId) {\n const entry: LayoutManifestEntry | undefined = layoutEntries[currentId];\n if (!entry) break;\n chain.push({\n id: currentId,\n template: templates[currentId],\n localeTemplates: localeTemplatesMap[currentId],\n loaders: buildLoaderFns(entry.loaders ?? {}),\n });\n currentId = entry.parent;\n }\n\n // Reverse: we walked inner->outer, but want outer->inner\n chain.reverse();\n return chain;\n}\n\n/** Resolve layout chain with lazy template getters (re-read from disk on each access) */\nfunction resolveLayoutChainDev(\n layoutId: string,\n layoutEntries: Record<string, LayoutManifestEntry>,\n distDir: string,\n defaultLocale: string | undefined,\n): LayoutDef[] {\n const chain: LayoutDef[] = [];\n let currentId: string | undefined = layoutId;\n\n while (currentId) {\n const entry: LayoutManifestEntry | undefined = layoutEntries[currentId];\n if (!entry) break;\n const layoutTemplatePath = join(distDir, resolveTemplatePath(entry, defaultLocale));\n const def: LayoutDef = {\n id: currentId,\n template: \"\", // placeholder, overridden by getter\n localeTemplates: entry.templates\n ? makeLocaleTemplateGetters(entry.templates, distDir)\n : undefined,\n loaders: buildLoaderFns(entry.loaders ?? {}),\n };\n Object.defineProperty(def, \"template\", {\n get: () => readFileSync(layoutTemplatePath, \"utf-8\"),\n enumerable: true,\n });\n chain.push(def);\n currentId = entry.parent;\n }\n\n chain.reverse();\n return chain;\n}\n\n/** Create a proxy object that lazily reads locale templates from disk */\nfunction makeLocaleTemplateGetters(\n templates: Record<string, string>,\n distDir: string,\n): Record<string, string> {\n const obj: Record<string, string> = {};\n for (const [locale, relPath] of Object.entries(templates)) {\n const fullPath = join(distDir, relPath);\n Object.defineProperty(obj, locale, {\n get: () => readFileSync(fullPath, \"utf-8\"),\n enumerable: true,\n });\n }\n return obj;\n}\n\n/** Merge i18n_keys from route + layout chain into a single list */\nfunction mergeI18nKeys(\n route: RouteManifestEntry,\n layoutEntries: Record<string, LayoutManifestEntry>,\n): string[] | undefined {\n const keys: string[] = [];\n if (route.layout) {\n let currentId: string | undefined = route.layout;\n while (currentId) {\n const entry: LayoutManifestEntry | undefined = layoutEntries[currentId];\n if (!entry) break;\n if (entry.i18n_keys) keys.push(...entry.i18n_keys);\n currentId = entry.parent;\n }\n }\n if (route.i18n_keys) keys.push(...route.i18n_keys);\n return keys.length > 0 ? keys : undefined;\n}\n\n/** Load the RPC hash map from build output (returns undefined when obfuscation is off) */\nexport function loadRpcHashMap(distDir: string): RpcHashMap | undefined {\n const hashMapPath = join(distDir, \"rpc-hash-map.json\");\n try {\n return JSON.parse(readFileSync(hashMapPath, \"utf-8\")) as RpcHashMap;\n } catch {\n return undefined;\n }\n}\n\n/** Load i18n config and messages from build output */\nexport function loadI18nMessages(distDir: string): I18nConfig | null {\n const manifestPath = join(distDir, \"route-manifest.json\");\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf-8\")) as RouteManifest;\n if (!manifest.i18n) return null;\n\n const mode = (manifest.i18n.mode ?? \"memory\") as \"memory\" | \"paged\";\n const cache = manifest.i18n.cache ?? false;\n const routeHashes = manifest.i18n.route_hashes ?? {};\n const contentHashes = manifest.i18n.content_hashes ?? {};\n\n // Memory mode: preload all route messages per locale\n // Paged mode: store distDir for on-demand reads\n const messages: Record<string, Record<string, Record<string, string>>> = {};\n if (mode === \"memory\") {\n const i18nDir = join(distDir, \"i18n\");\n for (const locale of manifest.i18n.locales) {\n const localePath = join(i18nDir, `${locale}.json`);\n if (existsSync(localePath)) {\n messages[locale] = JSON.parse(readFileSync(localePath, \"utf-8\")) as Record<\n string,\n Record<string, string>\n >;\n } else {\n messages[locale] = {};\n }\n }\n }\n\n return {\n locales: manifest.i18n.locales,\n default: manifest.i18n.default,\n mode,\n cache,\n routeHashes,\n contentHashes,\n messages,\n distDir: mode === \"paged\" ? distDir : undefined,\n };\n } catch {\n return null;\n }\n}\n\nexport function loadBuildOutput(distDir: string): Record<string, PageDef> {\n const manifestPath = join(distDir, \"route-manifest.json\");\n const raw = readFileSync(manifestPath, \"utf-8\");\n const manifest = JSON.parse(raw) as RouteManifest;\n const defaultLocale = manifest.i18n?.default;\n\n // Load layout templates (default + all locales)\n const layoutTemplates: Record<string, string> = {};\n const layoutLocaleTemplates: Record<string, Record<string, string>> = {};\n const layoutEntries = manifest.layouts ?? {};\n for (const [id, entry] of Object.entries(layoutEntries)) {\n layoutTemplates[id] = readFileSync(\n join(distDir, resolveTemplatePath(entry, defaultLocale)),\n \"utf-8\",\n );\n const lt = loadLocaleTemplates(entry, distDir);\n if (lt) layoutLocaleTemplates[id] = lt;\n }\n\n const pages: Record<string, PageDef> = {};\n for (const [path, entry] of Object.entries(manifest.routes)) {\n const templatePath = join(distDir, resolveTemplatePath(entry, defaultLocale));\n const template = readFileSync(templatePath, \"utf-8\");\n\n const loaders = buildLoaderFns(entry.loaders);\n const layoutChain = entry.layout\n ? resolveLayoutChain(entry.layout, layoutEntries, layoutTemplates, layoutLocaleTemplates)\n : [];\n\n // Merge i18n_keys from layout chain + route\n const i18nKeys = mergeI18nKeys(entry, layoutEntries);\n\n pages[path] = {\n template,\n localeTemplates: loadLocaleTemplates(entry, distDir),\n loaders,\n layoutChain,\n headMeta: entry.head_meta,\n dataId: manifest.data_id,\n i18nKeys,\n pageAssets: entry.assets,\n };\n }\n return pages;\n}\n\n/** Load build output with lazy template getters -- templates re-read from disk on each access */\nexport function loadBuildOutputDev(distDir: string): Record<string, PageDef> {\n const manifestPath = join(distDir, \"route-manifest.json\");\n const raw = readFileSync(manifestPath, \"utf-8\");\n const manifest = JSON.parse(raw) as RouteManifest;\n const defaultLocale = manifest.i18n?.default;\n\n const layoutEntries = manifest.layouts ?? {};\n\n const pages: Record<string, PageDef> = {};\n for (const [path, entry] of Object.entries(manifest.routes)) {\n const templatePath = join(distDir, resolveTemplatePath(entry, defaultLocale));\n const loaders = buildLoaderFns(entry.loaders);\n const layoutChain = entry.layout\n ? resolveLayoutChainDev(entry.layout, layoutEntries, distDir, defaultLocale)\n : [];\n\n const localeTemplates = entry.templates\n ? makeLocaleTemplateGetters(entry.templates, distDir)\n : undefined;\n\n // Merge i18n_keys from layout chain + route\n const i18nKeys = mergeI18nKeys(entry, layoutEntries);\n\n const page: PageDef = {\n template: \"\", // placeholder, overridden by getter\n localeTemplates,\n loaders,\n layoutChain,\n dataId: manifest.data_id,\n i18nKeys,\n pageAssets: entry.assets,\n };\n Object.defineProperty(page, \"template\", {\n get: () => readFileSync(templatePath, \"utf-8\"),\n enumerable: true,\n });\n pages[path] = page;\n }\n return pages;\n}\n","/* src/server/core/typescript/src/subscription.ts */\n\n/**\n * Bridge callback-style event sources to an AsyncGenerator.\n *\n * Usage:\n * const stream = fromCallback<string>(({ emit, end, error }) => {\n * emitter.on(\"data\", emit);\n * emitter.on(\"end\", end);\n * emitter.on(\"error\", error);\n * return () => emitter.removeAllListeners();\n * });\n */\nexport interface CallbackSink<T> {\n emit: (value: T) => void;\n end: () => void;\n error: (err: Error) => void;\n}\n\ntype QueueItem<T> = { type: \"value\"; value: T } | { type: \"end\" } | { type: \"error\"; error: Error };\n\nexport function fromCallback<T>(\n setup: (sink: CallbackSink<T>) => (() => void) | void,\n): AsyncGenerator<T, void, undefined> {\n const queue: QueueItem<T>[] = [];\n let resolve: (() => void) | null = null;\n let done = false;\n function notify() {\n if (resolve) {\n const r = resolve;\n resolve = null;\n r();\n }\n }\n\n const sink: CallbackSink<T> = {\n emit(value) {\n if (done) return;\n queue.push({ type: \"value\", value });\n notify();\n },\n end() {\n if (done) return;\n done = true;\n queue.push({ type: \"end\" });\n notify();\n },\n error(err) {\n if (done) return;\n done = true;\n queue.push({ type: \"error\", error: err });\n notify();\n },\n };\n\n const cleanup = setup(sink);\n\n async function* generate(): AsyncGenerator<T, void, undefined> {\n try {\n while (true) {\n if (queue.length === 0) {\n await new Promise<void>((r) => {\n resolve = r;\n });\n }\n\n while (queue.length > 0) {\n const item = queue.shift()!;\n if (item.type === \"value\") {\n yield item.value;\n } else if (item.type === \"error\") {\n throw item.error;\n } else {\n return;\n }\n }\n }\n } finally {\n done = true;\n if (cleanup) cleanup();\n }\n }\n\n return generate();\n}\n","/* src/server/core/typescript/src/ws.ts */\n\nimport type { Router, DefinitionMap } from \"./router/index.js\";\nimport { SeamError } from \"./errors.js\";\n\nexport interface WsSink {\n send(data: string): void;\n}\n\nexport interface ChannelWsSession {\n onMessage(data: string): void;\n close(): void;\n}\n\nexport interface ChannelWsOptions {\n heartbeatInterval?: number;\n}\n\ninterface UplinkMessage {\n id: string;\n procedure: string;\n input?: unknown;\n}\n\nconst DEFAULT_HEARTBEAT_MS = 30_000;\n\nfunction sendError(ws: WsSink, id: string | null, code: string, message: string): void {\n ws.send(JSON.stringify({ id, ok: false, error: { code, message, transient: false } }));\n}\n\n/**\n * Start a WebSocket session for a channel.\n *\n * Reuses `router.handleSubscription` for the event stream and\n * `router.handle` for uplink command dispatch — no Router changes needed.\n */\nexport function startChannelWs<T extends DefinitionMap>(\n router: Router<T>,\n channelName: string,\n channelInput: unknown,\n ws: WsSink,\n opts?: ChannelWsOptions,\n): ChannelWsSession {\n const heartbeatMs = opts?.heartbeatInterval ?? DEFAULT_HEARTBEAT_MS;\n let closed = false;\n\n // Heartbeat timer\n const heartbeatTimer = setInterval(() => {\n if (!closed) ws.send(JSON.stringify({ heartbeat: true }));\n }, heartbeatMs);\n\n // Start subscription and forward events as { event, payload }\n const subIterable = router.handleSubscription(`${channelName}.events`, channelInput);\n const iter = subIterable[Symbol.asyncIterator]();\n\n void (async () => {\n try {\n for (;;) {\n const result: IteratorResult<unknown> = await iter.next();\n if (result.done || closed) break;\n // Channel subscription yields { type: string, payload: unknown }\n const ev = result.value as { type: string; payload: unknown };\n ws.send(JSON.stringify({ event: ev.type, payload: ev.payload }));\n }\n } catch (err) {\n if (!closed) {\n const code = err instanceof SeamError ? err.code : \"INTERNAL_ERROR\";\n const message = err instanceof Error ? err.message : \"Subscription error\";\n ws.send(JSON.stringify({ event: \"__error\", payload: { code, message } }));\n }\n }\n })();\n\n return {\n onMessage(data: string) {\n if (closed) return;\n\n let msg: UplinkMessage;\n try {\n msg = JSON.parse(data) as UplinkMessage;\n } catch {\n sendError(ws, null, \"VALIDATION_ERROR\", \"Invalid JSON\");\n return;\n }\n\n if (!msg.id || typeof msg.id !== \"string\") {\n sendError(ws, null, \"VALIDATION_ERROR\", \"Missing 'id' field\");\n return;\n }\n\n if (!msg.procedure || typeof msg.procedure !== \"string\") {\n sendError(ws, msg.id, \"VALIDATION_ERROR\", \"Missing 'procedure' field\");\n return;\n }\n\n // Only allow commands belonging to this channel (not .events)\n const prefix = channelName + \".\";\n if (!msg.procedure.startsWith(prefix) || msg.procedure === `${channelName}.events`) {\n sendError(\n ws,\n msg.id,\n \"VALIDATION_ERROR\",\n `Procedure '${msg.procedure}' is not a command of channel '${channelName}'`,\n );\n return;\n }\n\n // Merge channel input + uplink input before dispatching\n const mergedInput = {\n ...(channelInput as Record<string, unknown>),\n ...((msg.input ?? {}) as Record<string, unknown>),\n };\n\n void (async () => {\n try {\n const result = await router.handle(msg.procedure, mergedInput);\n if (result.status === 200) {\n const envelope = result.body as { ok: true; data: unknown };\n ws.send(JSON.stringify({ id: msg.id, ok: true, data: envelope.data }));\n } else {\n const envelope = result.body as {\n ok: false;\n error: { code: string; message: string; transient: boolean };\n };\n ws.send(JSON.stringify({ id: msg.id, ok: false, error: envelope.error }));\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Unknown error\";\n sendError(ws, msg.id, \"INTERNAL_ERROR\", message);\n }\n })();\n },\n\n close() {\n if (closed) return;\n closed = true;\n clearInterval(heartbeatTimer);\n void iter.return?.(undefined);\n },\n };\n}\n","/* src/server/core/typescript/src/proxy.ts */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\nimport type { HttpHandler, HttpBodyResponse } from \"./http.js\";\nimport { MIME_TYPES } from \"./mime.js\";\n\nexport interface DevProxyOptions {\n /** Target URL to forward requests to (e.g. \"http://localhost:5173\") */\n target: string;\n}\n\nexport interface StaticHandlerOptions {\n /** Directory to serve static files from */\n dir: string;\n}\n\n/** Forward non-seam requests to a dev server (e.g. Vite) */\nexport function createDevProxy(opts: DevProxyOptions): HttpHandler {\n const target = opts.target.replace(/\\/$/, \"\");\n\n return async (req) => {\n const url = new URL(req.url, \"http://localhost\");\n const proxyUrl = `${target}${url.pathname}${url.search}`;\n\n try {\n const resp = await fetch(proxyUrl, {\n method: req.method,\n headers: { Accept: \"*/*\" },\n });\n\n const body = await resp.text();\n const headers: Record<string, string> = {};\n resp.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return { status: resp.status, headers, body };\n } catch {\n return {\n status: 502,\n headers: { \"Content-Type\": \"text/plain\" },\n body: `Bad Gateway: failed to connect to ${target}`,\n };\n }\n };\n}\n\n/** Serve static files from a directory, with index.html fallback for directories */\nexport function createStaticHandler(opts: StaticHandlerOptions): HttpHandler {\n const dir = opts.dir;\n\n return async (req): Promise<HttpBodyResponse> => {\n const url = new URL(req.url, \"http://localhost\");\n let filePath = url.pathname;\n\n if (filePath.includes(\"..\")) {\n return {\n status: 403,\n headers: { \"Content-Type\": \"text/plain\" },\n body: \"Forbidden\",\n };\n }\n\n // Serve index.html for directory paths\n if (filePath.endsWith(\"/\")) {\n filePath += \"index.html\";\n }\n\n const fullPath = join(dir, filePath);\n try {\n const content = await readFile(fullPath);\n const ext = extname(fullPath);\n const contentType = MIME_TYPES[ext] || \"application/octet-stream\";\n return {\n status: 200,\n headers: { \"Content-Type\": contentType },\n body: content.toString(),\n };\n } catch {\n return {\n status: 404,\n headers: { \"Content-Type\": \"text/plain\" },\n body: \"Not found\",\n };\n }\n };\n}\n","/* src/server/core/typescript/src/dev/reload-watcher.ts */\n\nimport { watch, type FSWatcher } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface ReloadWatcher {\n close(): void;\n}\n\nexport function watchReloadTrigger(distDir: string, onReload: () => void): ReloadWatcher {\n const triggerPath = join(distDir, \".reload-trigger\");\n let watcher: FSWatcher | null = null;\n try {\n watcher = watch(triggerPath, () => onReload());\n } catch {\n // Trigger file may not exist yet; watch directory until it appears\n const dirWatcher = watch(distDir, (_event, filename) => {\n if (filename === \".reload-trigger\") {\n dirWatcher.close();\n watcher = watch(triggerPath, () => onReload());\n // First creation IS the reload signal -- fire immediately\n onReload();\n }\n });\n return {\n close() {\n dirWatcher.close();\n watcher?.close();\n },\n };\n }\n return {\n close() {\n watcher?.close();\n },\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@canmi/seam-server",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.16",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"test": "vitest run"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@canmi/seam-engine": "0.4.
|
|
20
|
+
"@canmi/seam-engine": "0.4.15",
|
|
21
21
|
"jtd": "^0.1.1"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|