/** * Expected shape hashes per capability — the fixture behind * `capability-shape-drift.test.ts`. * * `CAPABILITY_CONTRACT_VERSIONS` is bumped BY HAND, so the whole scheme rests on * a human remembering. `capability-contract.ts` used to claim that risk was * "mitigated by a CI check that compares interface AST hashes against an * expected fixture". No such check existed. It was designed in the retired * `apps/celilo/designs/CELILO_UPDATE.md` and never built, and three design * documents reasoned from it anyway (celilo#1042). This is that check. * * Changing a capability's interface OR its table declaration changes its hash. * The test then fails until BOTH the contract version and the entry below move, * in the same commit — which is the whole point, because the version is what * `compareProviderToRuntime` and `celilo system audit` compare against. * * Comments and formatting do NOT change a hash. The interface is re-printed from * its AST with comments removed before hashing, so a doc-only edit stays a patch * (the bump rule `capability-contract.ts` already states). * * WHY THIS LIVES IN apps/celilo AND NOT NEXT TO THE CONTRACT. It needs the * TypeScript compiler API to parse, and `db/schema.ts` to check a declaration * against the real table. `@celilo/capabilities` is bundled into every module * (celilo#173), so adding a `typescript` dependency there to serve a test would * be paid for by every module on the fleet. apps/celilo already depends on both. */ export interface CapabilityShape { /** The contract version this hash was recorded at. */ readonly version: string; /** sha256 of the printed interface, the table declaration, and the request types. */ readonly hash: string; /** * Canonical request/result type member text, so the regenerate script can * classify a request-contract change as breaking (removed member, optional * → required, type change → MAJOR) or additive (optional addition → minor) * before it writes. Without this, a regenerate could absorb a request break * into a patch, which is exactly how celilo#1361 shipped. */ readonly requests: string; } export const CAPABILITY_SHAPE_BASELINE: Readonly> = { public_web: { version: '4.0.0', hash: 'fa79b68744eea9506db431b9eb51bb0472736864ddeea7524af9945f4bf4f1b0', requests: '[{kind:"alias",members:[{name:"_self",optional:false,type:"Record"}],name:"ClientConfig"},{kind:"interface",members:[{name:"defaultHostname",optional:false,type:"string"},{name:"getServerIp",optional:false,type:"Promise"},{name:"publishStaticSite",optional:false,type:"Promise"},{name:"register_route",optional:false,type:"Promise"},{name:"registerReverseProxy",optional:false,type:"Promise"},{name:"upload_static_assets",optional:false,type:"Promise"}],name:"PublicWebCapability"},{kind:"interface",members:[{name:"clientConfig",optional:true,type:"ClientConfig"},{name:"hostname",optional:true,type:"string"},{name:"path",optional:false,type:"string"},{name:"spaFallback",optional:true,type:"boolean"}],name:"PublishStaticSiteRequest"},{kind:"interface",members:[{name:"contentHash",optional:false,type:"string"},{name:"filesUploaded",optional:false,type:"number"},{name:"path",optional:false,type:"string"},{name:"success",optional:false,type:"boolean"}],name:"PublishStaticSiteResult"},{kind:"interface",members:[{name:"hostname",optional:true,type:"string"},{name:"path",optional:false,type:"string"},{name:"targetHost",optional:false,type:"string"},{name:"targetPort",optional:false,type:"number"},{name:"websocket",optional:true,type:"boolean"}],name:"RegisterReverseProxyRequest"},{kind:"interface",members:[{name:"path",optional:false,type:"string"},{name:"success",optional:false,type:"boolean"}],name:"RegisterReverseProxyResult"},{kind:"interface",members:[{name:"hostname",optional:true,type:"string"},{name:"path",optional:false,type:"string"},{name:"targetHost",optional:true,type:"string"},{name:"targetPort",optional:true,type:"number"},{name:"type",optional:false,type:"\'static\' | \'reverse_proxy\'"},{name:"websocket",optional:true,type:"boolean"}],name:"RegisterRouteRequest"},{kind:"interface",members:[{name:"caddyPath",optional:true,type:"string"},{name:"success",optional:false,type:"boolean"}],name:"RegisterRouteResult"},{kind:"interface",members:[{name:"path",optional:false,type:"string"}],name:"UploadStaticAssetsRequest"},{kind:"interface",members:[{name:"contentHash",optional:false,type:"string"},{name:"filesUploaded",optional:false,type:"number"},{name:"success",optional:false,type:"boolean"}],name:"UploadStaticAssetsResult"}]', }, idp: { version: '1.2.0', hash: 'dcb5758d18f18abb8f705c37b894dcdc49c93c34b939d74c4cb32b2818b009c9', requests: '[{kind:"interface",members:[{name:"client_name",optional:false,type:"string"},{name:"client_type",optional:true,type:"\'public\' | \'confidential\'"},{name:"groups",optional:true,type:"string[]"},{name:"redirect_uris",optional:false,type:"string[]"},{name:"scopes",optional:true,type:"string[]"}],name:"CreateOidcClientRequest"},{kind:"interface",members:[{name:"application_slug",optional:false,type:"string"},{name:"client_id",optional:false,type:"string"},{name:"client_secret",optional:false,type:"string"},{name:"provider_id",optional:false,type:"number"}],name:"CreateOidcClientResult"},{kind:"interface",members:[{name:"description",optional:true,type:"string"},{name:"identifier",optional:false,type:"string"},{name:"username",optional:false,type:"string"}],name:"CreateTokenRequest"},{kind:"interface",members:[{name:"created",optional:false,type:"boolean"},{name:"token",optional:false,type:"string"}],name:"CreateTokenResult"},{kind:"interface",members:[{name:"email",optional:false,type:"string"},{name:"groups",optional:true,type:"string[]"},{name:"password",optional:false,type:"string"},{name:"username",optional:false,type:"string"}],name:"CreateUserRequest"},{kind:"interface",members:[{name:"created",optional:false,type:"boolean"},{name:"user_id",optional:false,type:"number"}],name:"CreateUserResult"},{kind:"interface",members:[{name:"create_oidc_client",optional:false,type:"Promise"},{name:"create_token",optional:false,type:"Promise"},{name:"create_user",optional:false,type:"Promise"},{name:"list_tokens",optional:false,type:"Promise"},{name:"revoke_oidc_client",optional:false,type:"Promise"},{name:"revoke_token",optional:false,type:"Promise"}],name:"IdpCapability"},{kind:"interface",members:[{name:"username",optional:false,type:"string"}],name:"ListTokensRequest"},{kind:"interface",members:[{name:"client_id",optional:false,type:"string"}],name:"RevokeOidcClientRequest"},{kind:"interface",members:[{name:"identifier",optional:false,type:"string"}],name:"RevokeTokenRequest"},{kind:"interface",members:[{name:"revoked",optional:false,type:"boolean"}],name:"RevokeTokenResult"},{kind:"interface",members:[{name:"description",optional:false,type:"string"},{name:"expires",optional:false,type:"string | null"},{name:"expiring",optional:false,type:"boolean"},{name:"identifier",optional:false,type:"string"}],name:"TokenInfo"}]', }, dns_registrar: { version: '4.0.0', hash: '5108a4dc2df0b4c78862c922df596156a58f04c64d81a65947724720e732b50c', requests: '[{kind:"interface",members:[{name:"registerHost",optional:false,type:"Promise"}],name:"DnsRegistrarCapability"},{kind:"interface",members:[{name:"artifactPaths",optional:true,type:"string[]"},{name:"duration",optional:false,type:"number"},{name:"error",optional:true,type:"string"},{name:"outputs",optional:false,type:"Record"},{name:"success",optional:false,type:"boolean"}],name:"HookResult"},{kind:"interface",members:[{name:"fqdn",optional:false,type:"string"}],name:"RegisterHostRequest"}]', }, firewall: { version: '1.1.0', hash: 'f8c1c43b7d53193ae5b1e7cb7420a91efdb5e02f5bcd9add094aad66c0ec4104', requests: '[{kind:"interface",members:[{name:"description",optional:false,type:"string"},{name:"externalPort",optional:false,type:"number"},{name:"internalIp",optional:false,type:"string"},{name:"internalPort",optional:false,type:"number"},{name:"protocol",optional:false,type:"string"}],name:"ExposedService"},{kind:"interface",members:[{name:"description",optional:false,type:"string"},{name:"ingressIp",optional:true,type:"string"},{name:"internalIp",optional:false,type:"string"},{name:"ports",optional:false,type:"PortOrRange[]"},{name:"protocol",optional:true,type:"Protocol"}],name:"ExposeServiceRequest"},{kind:"interface",members:[{name:"externalIp",optional:false,type:"string"},{name:"natIp",optional:false,type:"string"}],name:"ExposeServiceResult"},{kind:"interface",members:[{name:"exposeService",optional:false,type:"Promise"},{name:"listExposedServices",optional:false,type:"Promise"},{name:"listTrustedSources",optional:true,type:"Promise"},{name:"providerModuleId",optional:true,type:"string"},{name:"registerTrustedSource",optional:true,type:"Promise"}],name:"FirewallCapability"},{kind:"alias",members:[{name:"_self",optional:false,type:"number | {\\n start: number;\\n end: number;\\n}"}],name:"PortOrRange"},{kind:"alias",members:[{name:"_self",optional:false,type:"\'TCP\' | \'UDP\'"}],name:"Protocol"},{kind:"interface",members:[{name:"description",optional:false,type:"string"},{name:"subnets",optional:false,type:"string[]"}],name:"RegisterTrustedSourceRequest"},{kind:"interface",members:[{name:"description",optional:false,type:"string"},{name:"registeredBy",optional:false,type:"string"},{name:"subnet",optional:false,type:"string"}],name:"TrustedSource"}]', }, source_forge: { version: '1.0.0', hash: 'cb005fe21e69f0984b03b862b2739ef07f868d363fd3a925feadf8e865620916', requests: '[{kind:"interface",members:[{name:"owner",optional:true,type:"string"},{name:"repo",optional:true,type:"string"},{name:"runnerName",optional:false,type:"string"},{name:"scope",optional:true,type:"SourceForgeScope"}],name:"IssueRunnerTokenRequest"},{kind:"interface",members:[{name:"token",optional:false,type:"string"}],name:"IssueRunnerTokenResult"},{kind:"interface",members:[{name:"defaultBranch",optional:true,type:"string"},{name:"publishToken",optional:false,type:"string"},{name:"repo",optional:false,type:"string"},{name:"requiredChecks",optional:true,type:"string[]"}],name:"RegisterRepoRequest"},{kind:"interface",members:[{name:"protectedBranch",optional:false,type:"string"},{name:"repo",optional:false,type:"string"}],name:"RegisterRepoResult"},{kind:"interface",members:[{name:"issue_runner_token",optional:false,type:"Promise"},{name:"registerRepo",optional:false,type:"Promise"}],name:"SourceForgeCapability"},{kind:"alias",members:[{name:"_self",optional:false,type:"\'instance\' | \'org\' | \'user\' | \'repo\'"}],name:"SourceForgeScope"}]', }, registry_publish: { version: '1.0.0', hash: 'fd8a9fd097ab03fc6e4989099a8bf8ad011d2f0e641ecb9d7c8152504de3ce7a', requests: '[{kind:"interface",members:[{name:"repo",optional:false,type:"string"},{name:"scope",optional:false,type:"string"}],name:"MintScopedTokenRequest"},{kind:"interface",members:[{name:"token",optional:false,type:"string"}],name:"MintScopedTokenResult"},{kind:"interface",members:[{name:"mintScopedToken",optional:false,type:"Promise"},{name:"revokeRepo",optional:false,type:"Promise"}],name:"RegistryPublishCapability"},{kind:"interface",members:[{name:"repo",optional:false,type:"string"}],name:"RevokeRepoRequest"}]', }, dhcp_server: { version: '1.0.0', hash: 'fc5751082942224c9343cb0a1455669b7a32d5442a8ae912efe88bd82b7648ae', requests: '[{kind:"interface",members:[{name:"getDnsServers",optional:false,type:"Promise"},{name:"getDomainName",optional:false,type:"Promise"},{name:"setDnsServers",optional:false,type:"Promise"},{name:"setDomainName",optional:false,type:"Promise"}],name:"DhcpServerCapability"}]', }, dns_internal: { version: '1.1.0', hash: 'd15a5ead445269d29ca46460268c1746892ef7d613688ac809b8a3d3395c675c', requests: '[{kind:"interface",members:[{name:"deleteRecord",optional:false,type:"Promise"},{name:"reconcileViews",optional:true,type:"Promise"},{name:"registerRecord",optional:false,type:"Promise"},{name:"registerTransferPeer",optional:true,type:"Promise"}],name:"DnsInternalCapability"},{kind:"interface",members:[{name:"host",optional:false,type:"string"},{name:"type",optional:false,type:"string"},{name:"value",optional:false,type:"string"},{name:"zone",optional:true,type:"string"},{name:"zoneRoutableValue",optional:true,type:"string"}],name:"DnsRecordRequest"},{kind:"interface",members:[{name:"moduleId",optional:false,type:"string"},{name:"serverIp",optional:false,type:"string"}],name:"TransferPeer"},{kind:"interface",members:[{name:"host",optional:false,type:"string"},{name:"ip",optional:false,type:"string"}],name:"ViewOverride"}]', }, external_web: { version: '2.0.0', hash: 'a906dc2a6645eb5da2dfa05d832a42e20f5defa8c1af300a67d6c8ef853b8ea4', requests: '[{kind:"interface",members:[{name:"publishStaticSite",optional:false,type:"Promise"}],name:"ExternalWebCapability"},{kind:"interface",members:[{name:"hostname",optional:true,type:"string"},{name:"path",optional:false,type:"string"},{name:"spaFallback",optional:true,type:"boolean"}],name:"PublishExternalSiteRequest"},{kind:"interface",members:[{name:"filesUploaded",optional:false,type:"number"},{name:"path",optional:false,type:"string"},{name:"success",optional:false,type:"boolean"}],name:"PublishExternalSiteResult"}]', }, notification: { version: '1.0.0', hash: '9d98b38d007b6d190fff6d243b38e871aeb707da2e48e3c111c3cfcc70ab75da', requests: '[{kind:"interface",members:[{name:"body",optional:false,type:"string"},{name:"messageId",optional:false,type:"string"},{name:"receivedAt",optional:false,type:"number"},{name:"senderAddress",optional:false,type:"string"}],name:"InboundMessage"},{kind:"interface",members:[{name:"receive",optional:true,type:"Promise"},{name:"send",optional:false,type:"Promise"}],name:"NotificationCapability"},{kind:"interface",members:[{name:"cursor",optional:false,type:"string | null"},{name:"messages",optional:false,type:"InboundMessage[]"}],name:"ReceiveResult"},{kind:"interface",members:[{name:"address",optional:false,type:"string"},{name:"body",optional:false,type:"string"},{name:"token",optional:true,type:"string"}],name:"SendNotificationRequest"},{kind:"interface",members:[{name:"messageId",optional:false,type:"string"}],name:"SendNotificationResult"}]', }, control_plane_vpn: { version: '1.0.0', hash: '742a739054bb351cda8586c5079ccb5877c22227afc57643c59152a746234e7b', requests: '[{kind:"interface",members:[{name:"getEndpoint",optional:false,type:"Promise"},{name:"listClients",optional:false,type:"Promise"},{name:"registerClient",optional:false,type:"Promise"},{name:"revokeClient",optional:false,type:"Promise"}],name:"ControlPlaneVpnCapability"},{kind:"interface",members:[{name:"clientPool",optional:false,type:"string"},{name:"endpoint",optional:false,type:"string"},{name:"serverPublicKey",optional:false,type:"string"}],name:"ControlPlaneVpnEndpoint"},{kind:"interface",members:[{name:"address",optional:false,type:"string"},{name:"label",optional:false,type:"string"},{name:"publicKey",optional:false,type:"string"}],name:"RegisterClientRequest"},{kind:"interface",members:[{name:"created",optional:false,type:"boolean"}],name:"RegisterClientResult"},{kind:"interface",members:[{name:"address",optional:false,type:"string"},{name:"label",optional:false,type:"string"},{name:"publicKey",optional:false,type:"string"},{name:"registeredAt",optional:false,type:"string"}],name:"RegisteredClient"},{kind:"interface",members:[{name:"publicKey",optional:false,type:"string"}],name:"RevokeClientRequest"},{kind:"interface",members:[{name:"revoked",optional:false,type:"boolean"}],name:"RevokeClientResult"}]', }, control_plane_api: { version: '1.0.0', hash: '189860acaa746326bdb6e9cd3a5c6af6bbb2f94ce37d84cc7faab01c69f7fb30', requests: '[{kind:"interface",members:[{name:"enrol_principal",optional:false,type:"Promise"},{name:"revoke_principal",optional:false,type:"Promise"}],name:"ControlPlaneApiCapability"},{kind:"interface",members:[{name:"name",optional:false,type:"string"},{name:"publicKey",optional:false,type:"string"}],name:"EnrolPrincipalRequest"},{kind:"interface",members:[{name:"created",optional:false,type:"boolean"},{name:"grants",optional:false,type:"string[]"},{name:"name",optional:false,type:"string"}],name:"EnrolPrincipalResult"},{kind:"interface",members:[{name:"name",optional:false,type:"string"}],name:"RevokePrincipalRequest"},{kind:"interface",members:[{name:"revoked",optional:false,type:"boolean"}],name:"RevokePrincipalResult"}]', }, private_web: { version: '2.0.0', hash: 'fb301f5e55ca14fdb0ede0d428d2ac72eabed77e277de8c795eaa0b955695483', requests: '[{kind:"alias",members:[{name:"_self",optional:false,type:"Record"}],name:"ClientConfig"},{kind:"interface",members:[{name:"defaultHostname",optional:false,type:"string"},{name:"getCaCertificate",optional:false,type:"Promise"},{name:"publishStaticSite",optional:false,type:"Promise"},{name:"registerReverseProxy",optional:false,type:"Promise"}],name:"PrivateWebCapability"},{kind:"interface",members:[{name:"clientConfig",optional:true,type:"ClientConfig"},{name:"hostname",optional:true,type:"string"},{name:"path",optional:false,type:"string"},{name:"spaFallback",optional:true,type:"boolean"}],name:"PublishStaticSiteRequest"},{kind:"interface",members:[{name:"contentHash",optional:false,type:"string"},{name:"filesUploaded",optional:false,type:"number"},{name:"path",optional:false,type:"string"},{name:"success",optional:false,type:"boolean"}],name:"PublishStaticSiteResult"},{kind:"interface",members:[{name:"hostname",optional:true,type:"string"},{name:"path",optional:false,type:"string"},{name:"targetHost",optional:false,type:"string"},{name:"targetPort",optional:false,type:"number"},{name:"websocket",optional:true,type:"boolean"}],name:"RegisterReverseProxyRequest"},{kind:"interface",members:[{name:"path",optional:false,type:"string"},{name:"success",optional:false,type:"boolean"}],name:"RegisterReverseProxyResult"}]', }, cross_module_read: { version: '1.0.0', hash: 'a8af728f3f3ec7bff57934fe6b4313eb58a32afa606f6a8d2b9923a9e492dd58', requests: '[{kind:"interface",members:[{name:"granted",optional:false,type:"true"}],name:"CrossModuleReadCapability"}]', }, celilo_module_deploy_worker: { version: '1.0.0', hash: '51fe35fc321520b37532478490a956c34b97ed3592ee59b3a0f8aed4b8b96672', requests: '[{kind:"alias",members:[{name:"_self",optional:false,type:"{\\n accepted: true;\\n moduleId: string | null;\\n} | {\\n accepted: false;\\n reason: string;\\n}"}],name:"DestroyInstanceOutcome"},{kind:"interface",members:[{name:"instanceKey",optional:false,type:"string"},{name:"submodule",optional:false,type:"string"}],name:"DestroyInstanceRequest"},{kind:"alias",members:[{name:"_self",optional:false,type:"{\\n accepted: true;\\n moduleId: string;\\n} | {\\n accepted: false;\\n reason: string;\\n}"}],name:"InstanceRequestOutcome"},{kind:"alias",members:[{name:"_self",optional:false,type:"(typeof INSTANCE_STATES)[number]"}],name:"InstanceState"},{kind:"interface",members:[{name:"answers",optional:true,type:"Record"},{name:"config",optional:true,type:"Record"},{name:"instanceKey",optional:false,type:"string"},{name:"label",optional:true,type:"string"},{name:"submodule",optional:false,type:"string"}],name:"InstantiateRequest"},{kind:"interface",members:[{name:"states",optional:true,type:"readonly InstanceState[]"},{name:"submodule",optional:true,type:"string"}],name:"ListInstancesRequest"},{kind:"interface",members:[{name:"destroy",optional:false,type:"Promise"},{name:"instantiate",optional:false,type:"Promise"},{name:"list",optional:false,type:"Promise"}],name:"ModuleDeployWorkerCapability"},{kind:"interface",members:[{name:"failureReason",optional:false,type:"string | null"},{name:"instanceKey",optional:false,type:"string"},{name:"label",optional:false,type:"string | null"},{name:"moduleId",optional:false,type:"string"},{name:"retryable",optional:false,type:"boolean | null"},{name:"state",optional:false,type:"InstanceState"},{name:"submodule",optional:false,type:"string"}],name:"ModuleInstance"}]', }, web_routes: { version: '1.0.0', hash: '5ae5e43d2948a37dfc23a5aef490f4ef459c8b4ef09719c42961eea73b8da5ff', requests: '[{kind:"interface",members:[{name:"getAllRoutes",optional:false,type:"Promise"},{name:"getRoutes",optional:false,type:"Promise"}],name:"RouteReadView"},{kind:"interface",members:[{name:"contentHash",optional:false,type:"string | null"},{name:"createdAt",optional:false,type:"Date"},{name:"hostname",optional:false,type:"string"},{name:"id",optional:false,type:"number"},{name:"moduleId",optional:false,type:"string"},{name:"path",optional:false,type:"string"},{name:"slug",optional:false,type:"string"},{name:"targetHost",optional:false,type:"string | null"},{name:"targetPort",optional:false,type:"number | null"},{name:"type",optional:false,type:"\'static\' | \'reverse_proxy\'"},{name:"updatedAt",optional:false,type:"Date"},{name:"websocket",optional:false,type:"boolean"}],name:"WebRoute"}]', }, firewall_registry: { version: '2.0.0', hash: 'd7a587e961500f1bc464c4a3427dd2ec85c7f80c1ed11a9c64beeb0decea524c', requests: '[{kind:"interface",members:[{name:"converge",optional:false,type:"Promise"},{name:"withdrawConsumer",optional:false,type:"Promise"}],name:"FirewallProviderView"}]', }, provider_converge: { version: '1.0.0', hash: '1d828d70433ce4a15a73072883abad0c2acfef92c059bf40432b792722eb7d97', requests: '[{kind:"alias",members:[{name:"_self",optional:false,type:"{\\n sourceDir: string;\\n overlayDir?: string;\\n} | {\\n unavailable: string;\\n}"}],name:"ConsumerSiteResolution"},{kind:"interface",members:[{name:"content",optional:false,type:"string"},{name:"path",optional:false,type:"string"}],name:"ProviderConfigFile"},{kind:"interface",members:[{name:"converge",optional:false,type:"Promise<{\\n success: boolean;\\n error?: string;\\n unresolved: string[];\\n}>"},{name:"resolveConsumerSite",optional:false,type:"Promise"}],name:"ProviderConvergeView"},{kind:"interface",members:[{name:"contentHash",optional:false,type:"string"},{name:"hostnames",optional:false,type:"string[]"},{name:"moduleId",optional:false,type:"string"},{name:"overlayDir",optional:true,type:"string"},{name:"slug",optional:false,type:"string"},{name:"sourceDir",optional:false,type:"string"}],name:"ProviderSiteRequest"}]', }, };