export interface SkillsServerConfig { host: string; port: number; databaseUrl?: string; bootstrapApiKey?: string; artifactBucket?: string; artifactPrefix: string; /** Optional expiring run-output namespace; immutable bundles retain artifactPrefix. */ runArtifactPrefix?: string; /** @deprecated Unversioned execution is retired; this flag cannot enable it. */ inlineWorker: boolean; /** * HMAC key for signing served skill bundles. When set, the bundle endpoint adds * X-Skill-Bundle-Signature so clients holding the same key can verify that the bytes * they pulled are the bytes this server decided to serve. Never logged or printed. * * Canonical env name: HASNA_SKILLS_API_SIGNING_KEY — the name the production deploy * mounts (infra-live hasna-app module, infra/apps/skills/prod/main.tf). The legacy * HASNA_SKILLS_SIGNING_KEY is retained as a backwards-compatible alias; the canonical * name wins when both are set. Decision record: todos ee1904ca, plan 8022d27f. */ bundleSigningKey?: string; requestBodyLimitBytes: number; /** * Cap for a skill bundle upload, separate from requestBodyLimitBytes on purpose. * * requestBodyLimitBytes is 1 MB and guards JSON request bodies, where a megabyte of * JSON is already pathological. A real skill with a references/ folder goes past that * routinely, so publishing needed either a raised general cap - which would also have * raised the ceiling on every JSON endpoint, quietly - or its own. This is the "its * own": POST /api/v1/skills is the only route that reads it, it is checked before the * body is buffered, and the JSON cap is untouched. */ skillBundleLimitBytes: number; /** * How long a deleted skill answers 410 with a tombstone marker before it is purged * (todos d061fcda). Within the window a client's pull can reconcile (remove its local * copy); after it, the row and its bundle are gone and the slug is an ordinary 404. */ tombstoneWindowMs: number; publicBaseUrl: string; nodeEnv: string; /** * Allow starting on a store that declares itself non-durable. * * Off by default, because "started fine, lost everything on restart" is the failure * this whole change exists to remove. Tests and throwaway demos that genuinely want * an in-process store set HASNA_SKILLS_ALLOW_EPHEMERAL_STORE=1 and own the * consequence; nobody gets there by forgetting to configure a database. */ allowEphemeralStore: boolean; } export declare function resolveServerConfig(env?: Record): SkillsServerConfig;