@fabricorg/gen-capability 0.5.2 → 0.5.4

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/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.4
4
+
5
+ ### Patch Changes
6
+
7
+ - 8c7d2a1: Republish packages that depend on `@fabricorg/platform` or `@fabricorg/platform-host` directly or through other republished packages via workspace ranges, so their packed dependency minimums include the invocation-aware policy resolution release. Runtime source is unchanged.
8
+ - Updated dependencies [8c7d2a1]
9
+ - @fabricorg/compiler@2.2.5
10
+
11
+ ## 0.5.3
12
+
13
+ ### Patch Changes
14
+
15
+ - 0b437ed: Report action and view discovery-surface changes in manifest compatibility analysis. Document that
16
+ first-party generator artifacts retain internal contracts for trusted assembly, not external catalogs.
17
+ - Updated dependencies [0b437ed]
18
+ - @fabricorg/compiler@2.2.4
19
+
3
20
  ## 0.5.2
4
21
 
5
22
  ### Patch Changes
package/README.md CHANGED
@@ -3,3 +3,9 @@
3
3
  Deterministic capability usage contracts derived from actions, schemas, views, events, roles, and
4
4
  permissions in Fabric compiler IR.
5
5
 
6
+
7
+ ### Discovery boundary
8
+
9
+ This generator retains internal action/view contracts for trusted assembly and worker integration.
10
+ Its output is not an external audience catalog. Before disclosing definitions externally, omit
11
+ `surface: "internal"` entries from the source manifest and apply live audience disclosure rules.
package/dist/index.cjs CHANGED
@@ -202,7 +202,7 @@ function buildUsageContract(module2) {
202
202
  }
203
203
  var capabilityGenerator = {
204
204
  name: "@fabricorg/gen-capability",
205
- version: "0.5.2",
205
+ version: "0.5.4",
206
206
  generate(ir) {
207
207
  return ir.modules.flatMap((module2) => {
208
208
  const capability = buildUsageContract(module2);
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts"],"sourcesContent":["import { stableStringify, type GeneratorTarget } from \"@fabricorg/compiler\";\nimport type {\n\tActionExecutionContract,\n\tCapabilityMetadata,\n\tJsonValue,\n\tModuleManifest,\n\tPortableJsonSchema,\n} from \"@fabricorg/platform\";\nimport { assertPortableJsonSchema } from \"@fabricorg/platform\";\n\n/**\n * Version of the usage contract document. Adopters negotiate on this, not on the\n * generator's package version, and bump it only when the serialized shape changes\n * in a way a consumer must detect.\n */\nexport const USAGE_CONTRACT_FORMAT_VERSION = 1 as const;\n\nexport interface UsageContractAction {\n\tactionId: string;\n\tversion: number;\n\tparameterSchema?: unknown;\n\tresultSchema?: unknown;\n\trequiredRoles?: string[];\n\trequiredPermissions?: string[];\n\texecution?: ActionExecutionContract;\n}\n\nexport interface UsageContractView {\n\tname: string;\n\tversion: string;\n\tshape: PortableJsonSchema;\n\tparameterSchema?: PortableJsonSchema;\n\tscope: \"tenant-space\";\n\tsnapshotVersion: number;\n\tusage?: ModuleManifest[\"views\"][number][\"usage\"];\n}\n\nexport interface UsageContractEvent {\n\teventType: string;\n\tschemaVersion: number;\n\tdescription?: string;\n\tschema?: PortableJsonSchema;\n}\n\n/**\n * What a capability promises its adopters: the governed operations it dispatches,\n * the view payloads it serves, the events it emits, and the namespaced extensions\n * an experience system interprets. Experience semantics stay inside `extensions`,\n * where ADR 0006 put them — this document never interprets them.\n */\nexport interface UsageContract {\n\tformatVersion: typeof USAGE_CONTRACT_FORMAT_VERSION;\n\tnamespace: string;\n\tversion?: string;\n\tdisplayName: string;\n\tdescription: string;\n\tstability: CapabilityMetadata[\"stability\"];\n\tdeprecated?: CapabilityMetadata[\"deprecated\"];\n\trequirements?: CapabilityMetadata[\"requirements\"];\n\tcertification?: CapabilityMetadata[\"certification\"];\n\textensions?: Record<string, JsonValue>;\n\tactions: UsageContractAction[];\n\tviews: UsageContractView[];\n\tevents: UsageContractEvent[];\n}\n\nexport interface UsageContractDocument {\n\tgenerator: { name: string; version: string };\n\tmanifestDigest: string;\n\tcapability: UsageContract;\n}\n\nconst STABILITIES = [\"experimental\", \"beta\", \"stable\", \"deprecated\"];\n\nfunction fail(path: string, message: string): never {\n\tthrow new Error(`Usage contract ${path} ${message}.`);\n}\n\nfunction requireString(value: unknown, path: string): string {\n\tif (typeof value !== \"string\" || !value.trim()) fail(path, \"must be a non-empty string\");\n\treturn value;\n}\n\nfunction requireArray(value: unknown, path: string): unknown[] {\n\tif (!Array.isArray(value)) fail(path, \"must be an array\");\n\treturn value;\n}\n\n/**\n * Structural validation an adopter can run before binding against a contract.\n * It checks the document's own shape; it does not re-validate the manifest it\n * was generated from.\n */\nexport function assertUsageContract(value: unknown, path = \"capability\"): asserts value is UsageContract {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) fail(path, \"must be an object\");\n\tconst contract = value as Record<string, unknown>;\n\tif (contract.formatVersion !== USAGE_CONTRACT_FORMAT_VERSION) {\n\t\tfail(`${path}.formatVersion`, `must be ${USAGE_CONTRACT_FORMAT_VERSION}, received ${JSON.stringify(contract.formatVersion)}`);\n\t}\n\tif (!/^[a-z][a-z0-9-]*$/.test(requireString(contract.namespace, `${path}.namespace`))) {\n\t\tfail(`${path}.namespace`, \"must be lowercase letters, numbers and hyphens\");\n\t}\n\trequireString(contract.displayName, `${path}.displayName`);\n\trequireString(contract.description, `${path}.description`);\n\tif (!STABILITIES.includes(contract.stability as string)) {\n\t\tfail(`${path}.stability`, `must be one of ${STABILITIES.join(\", \")}`);\n\t}\n\tconst actionIds = new Set<string>();\n\trequireArray(contract.actions, `${path}.actions`).forEach((entry, index) => {\n\t\tconst action = entry as Record<string, unknown>;\n\t\tconst actionId = requireString(action?.actionId, `${path}.actions[${index}].actionId`);\n\t\tif (actionIds.has(actionId)) fail(`${path}.actions[${index}]`, `repeats actionId \"${actionId}\"`);\n\t\tactionIds.add(actionId);\n\t\tif (!Number.isInteger(action.version)) fail(`${path}.actions[${index}].version`, \"must be an integer\");\n\t\tif (action.requiredRoles !== undefined && !Array.isArray(action.requiredRoles)) fail(`${path}.actions[${index}].requiredRoles`, \"must be an array\");\n\t\tif (action.requiredPermissions !== undefined && !Array.isArray(action.requiredPermissions)) fail(`${path}.actions[${index}].requiredPermissions`, \"must be an array\");\n\t});\n\tconst viewKeys = new Set<string>();\n\trequireArray(contract.views, `${path}.views`).forEach((entry, index) => {\n\t\tconst view = entry as Record<string, unknown>;\n\t\tconst name = requireString(view?.name, `${path}.views[${index}].name`);\n\t\tconst version = requireString(view?.version, `${path}.views[${index}].version`);\n\t\tconst key = `${name}@${version}`;\n\t\tif (viewKeys.has(key)) fail(`${path}.views[${index}]`, `repeats view \"${key}\"`);\n\t\tviewKeys.add(key);\n\t\tif (!view.shape || typeof view.shape !== \"object\" || Array.isArray(view.shape)) fail(`${path}.views[${index}].shape`, \"must be a JSON Schema object\");\n\t\tif (view.parameterSchema !== undefined) {\n\t\t\ttry { assertPortableJsonSchema(view.parameterSchema, `${path}.views[${index}].parameterSchema`); }\n\t\t\tcatch (error) { fail(`${path}.views[${index}].parameterSchema`, error instanceof Error ? error.message : String(error)); }\n\t\t}\n\t\tif (view.scope !== \"tenant-space\") fail(`${path}.views[${index}].scope`, 'must be \"tenant-space\"');\n\t\tif (!Number.isInteger(view.snapshotVersion) || (view.snapshotVersion as number) < 1) fail(`${path}.views[${index}].snapshotVersion`, \"must be a positive integer\");\n\t});\n\trequireArray(contract.events, `${path}.events`).forEach((entry, index) => {\n\t\tconst event = entry as Record<string, unknown>;\n\t\trequireString(event?.eventType, `${path}.events[${index}].eventType`);\n\t\tif (!Number.isInteger(event.schemaVersion)) fail(`${path}.events[${index}].schemaVersion`, \"must be an integer\");\n\t});\n\tif (contract.extensions !== undefined) {\n\t\tif (!contract.extensions || typeof contract.extensions !== \"object\" || Array.isArray(contract.extensions)) fail(`${path}.extensions`, \"must be an object\");\n\t\tfor (const namespace of Object.keys(contract.extensions as Record<string, unknown>)) {\n\t\t\tif (!/^[a-z][a-z0-9.-]*\\.[a-z0-9.-]+\\/v[1-9][0-9]*$/.test(namespace)) {\n\t\t\t\tfail(`${path}.extensions`, `has invalid extension namespace \"${namespace}\"`);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function assertUsageContractDocument(value: unknown): asserts value is UsageContractDocument {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) fail(\"document\", \"must be an object\");\n\tconst document = value as Record<string, unknown>;\n\tif (!/^[0-9a-f]{64}$/.test(String(document.manifestDigest))) fail(\"document.manifestDigest\", \"must be a lowercase SHA-256 digest\");\n\tconst generator = document.generator as { name?: unknown; version?: unknown } | undefined;\n\tif (!generator || typeof generator !== \"object\" || Array.isArray(generator)) fail(\"document.generator\", \"must be an object\");\n\trequireString(generator.name, \"document.generator.name\");\n\trequireString(generator.version, \"document.generator.version\");\n\tassertUsageContract(document.capability);\n}\n\n/** Machine-readable shape of the usage contract, for adopters that validate with their own tooling. */\nexport const USAGE_CONTRACT_JSON_SCHEMA: PortableJsonSchema = {\n\t$schema: \"https://json-schema.org/draft/2020-12/schema\",\n\ttitle: \"Fabric capability usage contract\",\n\ttype: \"object\",\n\trequired: [\"formatVersion\", \"namespace\", \"displayName\", \"description\", \"stability\", \"actions\", \"views\", \"events\"],\n\tproperties: {\n\t\tformatVersion: { type: \"integer\", enum: [USAGE_CONTRACT_FORMAT_VERSION] },\n\t\tnamespace: { type: \"string\", pattern: \"^[a-z][a-z0-9-]*$\" },\n\t\tversion: { type: \"string\" },\n\t\tdisplayName: { type: \"string\", minLength: 1 },\n\t\tdescription: { type: \"string\", minLength: 1 },\n\t\tstability: { type: \"string\", enum: [...STABILITIES] },\n\t\tdeprecated: { type: \"object\" },\n\t\trequirements: { type: \"object\" },\n\t\tcertification: { type: \"object\" },\n\t\textensions: { type: \"object\" },\n\t\tactions: {\n\t\t\ttype: \"array\",\n\t\t\titems: {\n\t\t\t\ttype: \"object\",\n\t\t\t\trequired: [\"actionId\", \"version\"],\n\t\t\t\tproperties: {\n\t\t\t\t\tactionId: { type: \"string\" },\n\t\t\t\t\tversion: { type: \"integer\" },\n\t\t\t\t\tparameterSchema: { type: \"object\" },\n\t\t\t\t\tresultSchema: { type: \"object\" },\n\t\t\t\t\trequiredRoles: { type: \"array\", items: { type: \"string\" } },\n\t\t\t\t\trequiredPermissions: { type: \"array\", items: { type: \"string\" } },\n\t\t\t\t\texecution: { type: \"object\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tviews: {\n\t\t\ttype: \"array\",\n\t\t\titems: {\n\t\t\t\ttype: \"object\",\n\t\t\t\trequired: [\"name\", \"version\", \"shape\", \"scope\", \"snapshotVersion\"],\n\t\t\t\tproperties: {\n\t\t\t\t\tname: { type: \"string\" },\n\t\t\t\t\tversion: { type: \"string\" },\n\t\t\t\t\tshape: { type: \"object\" },\n\t\t\t\t\tparameterSchema: { type: \"object\" },\n\t\t\t\t\tscope: { type: \"string\", enum: [\"tenant-space\"] },\n\t\t\t\t\tsnapshotVersion: { type: \"integer\" },\n\t\t\t\t\tusage: { type: \"object\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tevents: {\n\t\t\ttype: \"array\",\n\t\t\titems: {\n\t\t\t\ttype: \"object\",\n\t\t\t\trequired: [\"eventType\", \"schemaVersion\"],\n\t\t\t\tproperties: {\n\t\t\t\t\teventType: { type: \"string\" },\n\t\t\t\t\tschemaVersion: { type: \"integer\" },\n\t\t\t\t\tdescription: { type: \"string\" },\n\t\t\t\t\tschema: { type: \"object\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n};\n\nexport function buildUsageContract(module: ModuleManifest): UsageContract | undefined {\n\tconst capability = module.capability;\n\tif (!capability) return undefined;\n\treturn {\n\t\tformatVersion: USAGE_CONTRACT_FORMAT_VERSION,\n\t\tnamespace: module.namespace,\n\t\t...(module.version === undefined ? {} : { version: module.version }),\n\t\tdisplayName: capability.displayName,\n\t\tdescription: capability.description,\n\t\tstability: capability.stability,\n\t\t...(capability.deprecated === undefined ? {} : { deprecated: capability.deprecated }),\n\t\t...(capability.requirements === undefined ? {} : { requirements: capability.requirements }),\n\t\t...(capability.certification === undefined ? {} : { certification: capability.certification }),\n\t\t...(capability.extensions === undefined ? {} : { extensions: capability.extensions }),\n\t\tactions: module.actions.map(({ actionId, version, parameterSchema, resultSchema, requiredRoles, requiredPermissions, execution }) => ({\n\t\t\tactionId,\n\t\t\tversion,\n\t\t\tparameterSchema,\n\t\t\tresultSchema,\n\t\t\trequiredRoles,\n\t\t\trequiredPermissions,\n\t\t\texecution,\n\t\t})),\n\t\tviews: module.views.map(({ name, version, shape, parameterSchema, scope, snapshotVersion, usage }) => ({ name, version, shape, parameterSchema, scope, snapshotVersion, usage })),\n\t\tevents: module.eventTypes.map(({ eventType, schemaVersion, description, schema }) => ({ eventType, schemaVersion, description, schema })),\n\t};\n}\n\nexport const capabilityGenerator: GeneratorTarget = {\n\tname: \"@fabricorg/gen-capability\",\n\tversion: \"0.5.2\",\n\tgenerate(ir) {\n\t\treturn ir.modules.flatMap((module) => {\n\t\t\tconst capability = buildUsageContract(module);\n\t\t\tif (!capability) return [];\n\t\t\tassertUsageContract(capability);\n\t\t\tconst document: UsageContractDocument = {\n\t\t\t\tgenerator: { name: capabilityGenerator.name, version: capabilityGenerator.version },\n\t\t\t\tmanifestDigest: ir.manifestDigest,\n\t\t\t\tcapability,\n\t\t\t};\n\t\t\treturn [{ path: `${module.namespace}/capability.json`, content: stableStringify(document) }];\n\t\t});\n\t},\n};\n"],"mappings":"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","names":["module"]}
1
+ {"version":3,"sources":["../index.ts"],"sourcesContent":["/**\n * Trusted assembly/code-generation artifact, not an external audience catalog.\n * Internal surface declarations do not remove contracts here: assemblers and workers need\n * their schemas. External catalogs must filter internal definitions and apply audience rules.\n */\nimport { stableStringify, type GeneratorTarget } from \"@fabricorg/compiler\";\nimport type {\n\tActionExecutionContract,\n\tCapabilityMetadata,\n\tJsonValue,\n\tModuleManifest,\n\tPortableJsonSchema,\n} from \"@fabricorg/platform\";\nimport { assertPortableJsonSchema } from \"@fabricorg/platform\";\n\n/**\n * Version of the usage contract document. Adopters negotiate on this, not on the\n * generator's package version, and bump it only when the serialized shape changes\n * in a way a consumer must detect.\n */\nexport const USAGE_CONTRACT_FORMAT_VERSION = 1 as const;\n\nexport interface UsageContractAction {\n\tactionId: string;\n\tversion: number;\n\tparameterSchema?: unknown;\n\tresultSchema?: unknown;\n\trequiredRoles?: string[];\n\trequiredPermissions?: string[];\n\texecution?: ActionExecutionContract;\n}\n\nexport interface UsageContractView {\n\tname: string;\n\tversion: string;\n\tshape: PortableJsonSchema;\n\tparameterSchema?: PortableJsonSchema;\n\tscope: \"tenant-space\";\n\tsnapshotVersion: number;\n\tusage?: ModuleManifest[\"views\"][number][\"usage\"];\n}\n\nexport interface UsageContractEvent {\n\teventType: string;\n\tschemaVersion: number;\n\tdescription?: string;\n\tschema?: PortableJsonSchema;\n}\n\n/**\n * What a capability promises its adopters: the governed operations it dispatches,\n * the view payloads it serves, the events it emits, and the namespaced extensions\n * an experience system interprets. Experience semantics stay inside `extensions`,\n * where ADR 0006 put them — this document never interprets them.\n */\nexport interface UsageContract {\n\tformatVersion: typeof USAGE_CONTRACT_FORMAT_VERSION;\n\tnamespace: string;\n\tversion?: string;\n\tdisplayName: string;\n\tdescription: string;\n\tstability: CapabilityMetadata[\"stability\"];\n\tdeprecated?: CapabilityMetadata[\"deprecated\"];\n\trequirements?: CapabilityMetadata[\"requirements\"];\n\tcertification?: CapabilityMetadata[\"certification\"];\n\textensions?: Record<string, JsonValue>;\n\tactions: UsageContractAction[];\n\tviews: UsageContractView[];\n\tevents: UsageContractEvent[];\n}\n\nexport interface UsageContractDocument {\n\tgenerator: { name: string; version: string };\n\tmanifestDigest: string;\n\tcapability: UsageContract;\n}\n\nconst STABILITIES = [\"experimental\", \"beta\", \"stable\", \"deprecated\"];\n\nfunction fail(path: string, message: string): never {\n\tthrow new Error(`Usage contract ${path} ${message}.`);\n}\n\nfunction requireString(value: unknown, path: string): string {\n\tif (typeof value !== \"string\" || !value.trim()) fail(path, \"must be a non-empty string\");\n\treturn value;\n}\n\nfunction requireArray(value: unknown, path: string): unknown[] {\n\tif (!Array.isArray(value)) fail(path, \"must be an array\");\n\treturn value;\n}\n\n/**\n * Structural validation an adopter can run before binding against a contract.\n * It checks the document's own shape; it does not re-validate the manifest it\n * was generated from.\n */\nexport function assertUsageContract(value: unknown, path = \"capability\"): asserts value is UsageContract {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) fail(path, \"must be an object\");\n\tconst contract = value as Record<string, unknown>;\n\tif (contract.formatVersion !== USAGE_CONTRACT_FORMAT_VERSION) {\n\t\tfail(`${path}.formatVersion`, `must be ${USAGE_CONTRACT_FORMAT_VERSION}, received ${JSON.stringify(contract.formatVersion)}`);\n\t}\n\tif (!/^[a-z][a-z0-9-]*$/.test(requireString(contract.namespace, `${path}.namespace`))) {\n\t\tfail(`${path}.namespace`, \"must be lowercase letters, numbers and hyphens\");\n\t}\n\trequireString(contract.displayName, `${path}.displayName`);\n\trequireString(contract.description, `${path}.description`);\n\tif (!STABILITIES.includes(contract.stability as string)) {\n\t\tfail(`${path}.stability`, `must be one of ${STABILITIES.join(\", \")}`);\n\t}\n\tconst actionIds = new Set<string>();\n\trequireArray(contract.actions, `${path}.actions`).forEach((entry, index) => {\n\t\tconst action = entry as Record<string, unknown>;\n\t\tconst actionId = requireString(action?.actionId, `${path}.actions[${index}].actionId`);\n\t\tif (actionIds.has(actionId)) fail(`${path}.actions[${index}]`, `repeats actionId \"${actionId}\"`);\n\t\tactionIds.add(actionId);\n\t\tif (!Number.isInteger(action.version)) fail(`${path}.actions[${index}].version`, \"must be an integer\");\n\t\tif (action.requiredRoles !== undefined && !Array.isArray(action.requiredRoles)) fail(`${path}.actions[${index}].requiredRoles`, \"must be an array\");\n\t\tif (action.requiredPermissions !== undefined && !Array.isArray(action.requiredPermissions)) fail(`${path}.actions[${index}].requiredPermissions`, \"must be an array\");\n\t});\n\tconst viewKeys = new Set<string>();\n\trequireArray(contract.views, `${path}.views`).forEach((entry, index) => {\n\t\tconst view = entry as Record<string, unknown>;\n\t\tconst name = requireString(view?.name, `${path}.views[${index}].name`);\n\t\tconst version = requireString(view?.version, `${path}.views[${index}].version`);\n\t\tconst key = `${name}@${version}`;\n\t\tif (viewKeys.has(key)) fail(`${path}.views[${index}]`, `repeats view \"${key}\"`);\n\t\tviewKeys.add(key);\n\t\tif (!view.shape || typeof view.shape !== \"object\" || Array.isArray(view.shape)) fail(`${path}.views[${index}].shape`, \"must be a JSON Schema object\");\n\t\tif (view.parameterSchema !== undefined) {\n\t\t\ttry { assertPortableJsonSchema(view.parameterSchema, `${path}.views[${index}].parameterSchema`); }\n\t\t\tcatch (error) { fail(`${path}.views[${index}].parameterSchema`, error instanceof Error ? error.message : String(error)); }\n\t\t}\n\t\tif (view.scope !== \"tenant-space\") fail(`${path}.views[${index}].scope`, 'must be \"tenant-space\"');\n\t\tif (!Number.isInteger(view.snapshotVersion) || (view.snapshotVersion as number) < 1) fail(`${path}.views[${index}].snapshotVersion`, \"must be a positive integer\");\n\t});\n\trequireArray(contract.events, `${path}.events`).forEach((entry, index) => {\n\t\tconst event = entry as Record<string, unknown>;\n\t\trequireString(event?.eventType, `${path}.events[${index}].eventType`);\n\t\tif (!Number.isInteger(event.schemaVersion)) fail(`${path}.events[${index}].schemaVersion`, \"must be an integer\");\n\t});\n\tif (contract.extensions !== undefined) {\n\t\tif (!contract.extensions || typeof contract.extensions !== \"object\" || Array.isArray(contract.extensions)) fail(`${path}.extensions`, \"must be an object\");\n\t\tfor (const namespace of Object.keys(contract.extensions as Record<string, unknown>)) {\n\t\t\tif (!/^[a-z][a-z0-9.-]*\\.[a-z0-9.-]+\\/v[1-9][0-9]*$/.test(namespace)) {\n\t\t\t\tfail(`${path}.extensions`, `has invalid extension namespace \"${namespace}\"`);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function assertUsageContractDocument(value: unknown): asserts value is UsageContractDocument {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) fail(\"document\", \"must be an object\");\n\tconst document = value as Record<string, unknown>;\n\tif (!/^[0-9a-f]{64}$/.test(String(document.manifestDigest))) fail(\"document.manifestDigest\", \"must be a lowercase SHA-256 digest\");\n\tconst generator = document.generator as { name?: unknown; version?: unknown } | undefined;\n\tif (!generator || typeof generator !== \"object\" || Array.isArray(generator)) fail(\"document.generator\", \"must be an object\");\n\trequireString(generator.name, \"document.generator.name\");\n\trequireString(generator.version, \"document.generator.version\");\n\tassertUsageContract(document.capability);\n}\n\n/** Machine-readable shape of the usage contract, for adopters that validate with their own tooling. */\nexport const USAGE_CONTRACT_JSON_SCHEMA: PortableJsonSchema = {\n\t$schema: \"https://json-schema.org/draft/2020-12/schema\",\n\ttitle: \"Fabric capability usage contract\",\n\ttype: \"object\",\n\trequired: [\"formatVersion\", \"namespace\", \"displayName\", \"description\", \"stability\", \"actions\", \"views\", \"events\"],\n\tproperties: {\n\t\tformatVersion: { type: \"integer\", enum: [USAGE_CONTRACT_FORMAT_VERSION] },\n\t\tnamespace: { type: \"string\", pattern: \"^[a-z][a-z0-9-]*$\" },\n\t\tversion: { type: \"string\" },\n\t\tdisplayName: { type: \"string\", minLength: 1 },\n\t\tdescription: { type: \"string\", minLength: 1 },\n\t\tstability: { type: \"string\", enum: [...STABILITIES] },\n\t\tdeprecated: { type: \"object\" },\n\t\trequirements: { type: \"object\" },\n\t\tcertification: { type: \"object\" },\n\t\textensions: { type: \"object\" },\n\t\tactions: {\n\t\t\ttype: \"array\",\n\t\t\titems: {\n\t\t\t\ttype: \"object\",\n\t\t\t\trequired: [\"actionId\", \"version\"],\n\t\t\t\tproperties: {\n\t\t\t\t\tactionId: { type: \"string\" },\n\t\t\t\t\tversion: { type: \"integer\" },\n\t\t\t\t\tparameterSchema: { type: \"object\" },\n\t\t\t\t\tresultSchema: { type: \"object\" },\n\t\t\t\t\trequiredRoles: { type: \"array\", items: { type: \"string\" } },\n\t\t\t\t\trequiredPermissions: { type: \"array\", items: { type: \"string\" } },\n\t\t\t\t\texecution: { type: \"object\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tviews: {\n\t\t\ttype: \"array\",\n\t\t\titems: {\n\t\t\t\ttype: \"object\",\n\t\t\t\trequired: [\"name\", \"version\", \"shape\", \"scope\", \"snapshotVersion\"],\n\t\t\t\tproperties: {\n\t\t\t\t\tname: { type: \"string\" },\n\t\t\t\t\tversion: { type: \"string\" },\n\t\t\t\t\tshape: { type: \"object\" },\n\t\t\t\t\tparameterSchema: { type: \"object\" },\n\t\t\t\t\tscope: { type: \"string\", enum: [\"tenant-space\"] },\n\t\t\t\t\tsnapshotVersion: { type: \"integer\" },\n\t\t\t\t\tusage: { type: \"object\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tevents: {\n\t\t\ttype: \"array\",\n\t\t\titems: {\n\t\t\t\ttype: \"object\",\n\t\t\t\trequired: [\"eventType\", \"schemaVersion\"],\n\t\t\t\tproperties: {\n\t\t\t\t\teventType: { type: \"string\" },\n\t\t\t\t\tschemaVersion: { type: \"integer\" },\n\t\t\t\t\tdescription: { type: \"string\" },\n\t\t\t\t\tschema: { type: \"object\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n};\n\nexport function buildUsageContract(module: ModuleManifest): UsageContract | undefined {\n\tconst capability = module.capability;\n\tif (!capability) return undefined;\n\treturn {\n\t\tformatVersion: USAGE_CONTRACT_FORMAT_VERSION,\n\t\tnamespace: module.namespace,\n\t\t...(module.version === undefined ? {} : { version: module.version }),\n\t\tdisplayName: capability.displayName,\n\t\tdescription: capability.description,\n\t\tstability: capability.stability,\n\t\t...(capability.deprecated === undefined ? {} : { deprecated: capability.deprecated }),\n\t\t...(capability.requirements === undefined ? {} : { requirements: capability.requirements }),\n\t\t...(capability.certification === undefined ? {} : { certification: capability.certification }),\n\t\t...(capability.extensions === undefined ? {} : { extensions: capability.extensions }),\n\t\tactions: module.actions.map(({ actionId, version, parameterSchema, resultSchema, requiredRoles, requiredPermissions, execution }) => ({\n\t\t\tactionId,\n\t\t\tversion,\n\t\t\tparameterSchema,\n\t\t\tresultSchema,\n\t\t\trequiredRoles,\n\t\t\trequiredPermissions,\n\t\t\texecution,\n\t\t})),\n\t\tviews: module.views.map(({ name, version, shape, parameterSchema, scope, snapshotVersion, usage }) => ({ name, version, shape, parameterSchema, scope, snapshotVersion, usage })),\n\t\tevents: module.eventTypes.map(({ eventType, schemaVersion, description, schema }) => ({ eventType, schemaVersion, description, schema })),\n\t};\n}\n\nexport const capabilityGenerator: GeneratorTarget = {\n\tname: \"@fabricorg/gen-capability\",\n\tversion: \"0.5.4\",\n\tgenerate(ir) {\n\t\treturn ir.modules.flatMap((module) => {\n\t\t\tconst capability = buildUsageContract(module);\n\t\t\tif (!capability) return [];\n\t\t\tassertUsageContract(capability);\n\t\t\tconst document: UsageContractDocument = {\n\t\t\t\tgenerator: { name: capabilityGenerator.name, version: capabilityGenerator.version },\n\t\t\t\tmanifestDigest: ir.manifestDigest,\n\t\t\t\tcapability,\n\t\t\t};\n\t\t\treturn [{ path: `${module.namespace}/capability.json`, content: stableStringify(document) }];\n\t\t});\n\t},\n};\n"],"mappings":"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","names":["module"]}
package/dist/index.d.cts CHANGED
@@ -1,6 +1,12 @@
1
1
  import { GeneratorTarget } from '@fabricorg/compiler';
2
2
  import { PortableJsonSchema, CapabilityMetadata, JsonValue, ActionExecutionContract, ModuleManifest } from '@fabricorg/platform';
3
3
 
4
+ /**
5
+ * Trusted assembly/code-generation artifact, not an external audience catalog.
6
+ * Internal surface declarations do not remove contracts here: assemblers and workers need
7
+ * their schemas. External catalogs must filter internal definitions and apply audience rules.
8
+ */
9
+
4
10
  /**
5
11
  * Version of the usage contract document. Adopters negotiate on this, not on the
6
12
  * generator's package version, and bump it only when the serialized shape changes
package/dist/index.d.ts CHANGED
@@ -1,6 +1,12 @@
1
1
  import { GeneratorTarget } from '@fabricorg/compiler';
2
2
  import { PortableJsonSchema, CapabilityMetadata, JsonValue, ActionExecutionContract, ModuleManifest } from '@fabricorg/platform';
3
3
 
4
+ /**
5
+ * Trusted assembly/code-generation artifact, not an external audience catalog.
6
+ * Internal surface declarations do not remove contracts here: assemblers and workers need
7
+ * their schemas. External catalogs must filter internal definitions and apply audience rules.
8
+ */
9
+
4
10
  /**
5
11
  * Version of the usage contract document. Adopters negotiate on this, not on the
6
12
  * generator's package version, and bump it only when the serialized shape changes
package/dist/index.js CHANGED
@@ -173,7 +173,7 @@ function buildUsageContract(module) {
173
173
  }
174
174
  var capabilityGenerator = {
175
175
  name: "@fabricorg/gen-capability",
176
- version: "0.5.2",
176
+ version: "0.5.4",
177
177
  generate(ir) {
178
178
  return ir.modules.flatMap((module) => {
179
179
  const capability = buildUsageContract(module);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts"],"sourcesContent":["import { stableStringify, type GeneratorTarget } from \"@fabricorg/compiler\";\nimport type {\n\tActionExecutionContract,\n\tCapabilityMetadata,\n\tJsonValue,\n\tModuleManifest,\n\tPortableJsonSchema,\n} from \"@fabricorg/platform\";\nimport { assertPortableJsonSchema } from \"@fabricorg/platform\";\n\n/**\n * Version of the usage contract document. Adopters negotiate on this, not on the\n * generator's package version, and bump it only when the serialized shape changes\n * in a way a consumer must detect.\n */\nexport const USAGE_CONTRACT_FORMAT_VERSION = 1 as const;\n\nexport interface UsageContractAction {\n\tactionId: string;\n\tversion: number;\n\tparameterSchema?: unknown;\n\tresultSchema?: unknown;\n\trequiredRoles?: string[];\n\trequiredPermissions?: string[];\n\texecution?: ActionExecutionContract;\n}\n\nexport interface UsageContractView {\n\tname: string;\n\tversion: string;\n\tshape: PortableJsonSchema;\n\tparameterSchema?: PortableJsonSchema;\n\tscope: \"tenant-space\";\n\tsnapshotVersion: number;\n\tusage?: ModuleManifest[\"views\"][number][\"usage\"];\n}\n\nexport interface UsageContractEvent {\n\teventType: string;\n\tschemaVersion: number;\n\tdescription?: string;\n\tschema?: PortableJsonSchema;\n}\n\n/**\n * What a capability promises its adopters: the governed operations it dispatches,\n * the view payloads it serves, the events it emits, and the namespaced extensions\n * an experience system interprets. Experience semantics stay inside `extensions`,\n * where ADR 0006 put them — this document never interprets them.\n */\nexport interface UsageContract {\n\tformatVersion: typeof USAGE_CONTRACT_FORMAT_VERSION;\n\tnamespace: string;\n\tversion?: string;\n\tdisplayName: string;\n\tdescription: string;\n\tstability: CapabilityMetadata[\"stability\"];\n\tdeprecated?: CapabilityMetadata[\"deprecated\"];\n\trequirements?: CapabilityMetadata[\"requirements\"];\n\tcertification?: CapabilityMetadata[\"certification\"];\n\textensions?: Record<string, JsonValue>;\n\tactions: UsageContractAction[];\n\tviews: UsageContractView[];\n\tevents: UsageContractEvent[];\n}\n\nexport interface UsageContractDocument {\n\tgenerator: { name: string; version: string };\n\tmanifestDigest: string;\n\tcapability: UsageContract;\n}\n\nconst STABILITIES = [\"experimental\", \"beta\", \"stable\", \"deprecated\"];\n\nfunction fail(path: string, message: string): never {\n\tthrow new Error(`Usage contract ${path} ${message}.`);\n}\n\nfunction requireString(value: unknown, path: string): string {\n\tif (typeof value !== \"string\" || !value.trim()) fail(path, \"must be a non-empty string\");\n\treturn value;\n}\n\nfunction requireArray(value: unknown, path: string): unknown[] {\n\tif (!Array.isArray(value)) fail(path, \"must be an array\");\n\treturn value;\n}\n\n/**\n * Structural validation an adopter can run before binding against a contract.\n * It checks the document's own shape; it does not re-validate the manifest it\n * was generated from.\n */\nexport function assertUsageContract(value: unknown, path = \"capability\"): asserts value is UsageContract {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) fail(path, \"must be an object\");\n\tconst contract = value as Record<string, unknown>;\n\tif (contract.formatVersion !== USAGE_CONTRACT_FORMAT_VERSION) {\n\t\tfail(`${path}.formatVersion`, `must be ${USAGE_CONTRACT_FORMAT_VERSION}, received ${JSON.stringify(contract.formatVersion)}`);\n\t}\n\tif (!/^[a-z][a-z0-9-]*$/.test(requireString(contract.namespace, `${path}.namespace`))) {\n\t\tfail(`${path}.namespace`, \"must be lowercase letters, numbers and hyphens\");\n\t}\n\trequireString(contract.displayName, `${path}.displayName`);\n\trequireString(contract.description, `${path}.description`);\n\tif (!STABILITIES.includes(contract.stability as string)) {\n\t\tfail(`${path}.stability`, `must be one of ${STABILITIES.join(\", \")}`);\n\t}\n\tconst actionIds = new Set<string>();\n\trequireArray(contract.actions, `${path}.actions`).forEach((entry, index) => {\n\t\tconst action = entry as Record<string, unknown>;\n\t\tconst actionId = requireString(action?.actionId, `${path}.actions[${index}].actionId`);\n\t\tif (actionIds.has(actionId)) fail(`${path}.actions[${index}]`, `repeats actionId \"${actionId}\"`);\n\t\tactionIds.add(actionId);\n\t\tif (!Number.isInteger(action.version)) fail(`${path}.actions[${index}].version`, \"must be an integer\");\n\t\tif (action.requiredRoles !== undefined && !Array.isArray(action.requiredRoles)) fail(`${path}.actions[${index}].requiredRoles`, \"must be an array\");\n\t\tif (action.requiredPermissions !== undefined && !Array.isArray(action.requiredPermissions)) fail(`${path}.actions[${index}].requiredPermissions`, \"must be an array\");\n\t});\n\tconst viewKeys = new Set<string>();\n\trequireArray(contract.views, `${path}.views`).forEach((entry, index) => {\n\t\tconst view = entry as Record<string, unknown>;\n\t\tconst name = requireString(view?.name, `${path}.views[${index}].name`);\n\t\tconst version = requireString(view?.version, `${path}.views[${index}].version`);\n\t\tconst key = `${name}@${version}`;\n\t\tif (viewKeys.has(key)) fail(`${path}.views[${index}]`, `repeats view \"${key}\"`);\n\t\tviewKeys.add(key);\n\t\tif (!view.shape || typeof view.shape !== \"object\" || Array.isArray(view.shape)) fail(`${path}.views[${index}].shape`, \"must be a JSON Schema object\");\n\t\tif (view.parameterSchema !== undefined) {\n\t\t\ttry { assertPortableJsonSchema(view.parameterSchema, `${path}.views[${index}].parameterSchema`); }\n\t\t\tcatch (error) { fail(`${path}.views[${index}].parameterSchema`, error instanceof Error ? error.message : String(error)); }\n\t\t}\n\t\tif (view.scope !== \"tenant-space\") fail(`${path}.views[${index}].scope`, 'must be \"tenant-space\"');\n\t\tif (!Number.isInteger(view.snapshotVersion) || (view.snapshotVersion as number) < 1) fail(`${path}.views[${index}].snapshotVersion`, \"must be a positive integer\");\n\t});\n\trequireArray(contract.events, `${path}.events`).forEach((entry, index) => {\n\t\tconst event = entry as Record<string, unknown>;\n\t\trequireString(event?.eventType, `${path}.events[${index}].eventType`);\n\t\tif (!Number.isInteger(event.schemaVersion)) fail(`${path}.events[${index}].schemaVersion`, \"must be an integer\");\n\t});\n\tif (contract.extensions !== undefined) {\n\t\tif (!contract.extensions || typeof contract.extensions !== \"object\" || Array.isArray(contract.extensions)) fail(`${path}.extensions`, \"must be an object\");\n\t\tfor (const namespace of Object.keys(contract.extensions as Record<string, unknown>)) {\n\t\t\tif (!/^[a-z][a-z0-9.-]*\\.[a-z0-9.-]+\\/v[1-9][0-9]*$/.test(namespace)) {\n\t\t\t\tfail(`${path}.extensions`, `has invalid extension namespace \"${namespace}\"`);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function assertUsageContractDocument(value: unknown): asserts value is UsageContractDocument {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) fail(\"document\", \"must be an object\");\n\tconst document = value as Record<string, unknown>;\n\tif (!/^[0-9a-f]{64}$/.test(String(document.manifestDigest))) fail(\"document.manifestDigest\", \"must be a lowercase SHA-256 digest\");\n\tconst generator = document.generator as { name?: unknown; version?: unknown } | undefined;\n\tif (!generator || typeof generator !== \"object\" || Array.isArray(generator)) fail(\"document.generator\", \"must be an object\");\n\trequireString(generator.name, \"document.generator.name\");\n\trequireString(generator.version, \"document.generator.version\");\n\tassertUsageContract(document.capability);\n}\n\n/** Machine-readable shape of the usage contract, for adopters that validate with their own tooling. */\nexport const USAGE_CONTRACT_JSON_SCHEMA: PortableJsonSchema = {\n\t$schema: \"https://json-schema.org/draft/2020-12/schema\",\n\ttitle: \"Fabric capability usage contract\",\n\ttype: \"object\",\n\trequired: [\"formatVersion\", \"namespace\", \"displayName\", \"description\", \"stability\", \"actions\", \"views\", \"events\"],\n\tproperties: {\n\t\tformatVersion: { type: \"integer\", enum: [USAGE_CONTRACT_FORMAT_VERSION] },\n\t\tnamespace: { type: \"string\", pattern: \"^[a-z][a-z0-9-]*$\" },\n\t\tversion: { type: \"string\" },\n\t\tdisplayName: { type: \"string\", minLength: 1 },\n\t\tdescription: { type: \"string\", minLength: 1 },\n\t\tstability: { type: \"string\", enum: [...STABILITIES] },\n\t\tdeprecated: { type: \"object\" },\n\t\trequirements: { type: \"object\" },\n\t\tcertification: { type: \"object\" },\n\t\textensions: { type: \"object\" },\n\t\tactions: {\n\t\t\ttype: \"array\",\n\t\t\titems: {\n\t\t\t\ttype: \"object\",\n\t\t\t\trequired: [\"actionId\", \"version\"],\n\t\t\t\tproperties: {\n\t\t\t\t\tactionId: { type: \"string\" },\n\t\t\t\t\tversion: { type: \"integer\" },\n\t\t\t\t\tparameterSchema: { type: \"object\" },\n\t\t\t\t\tresultSchema: { type: \"object\" },\n\t\t\t\t\trequiredRoles: { type: \"array\", items: { type: \"string\" } },\n\t\t\t\t\trequiredPermissions: { type: \"array\", items: { type: \"string\" } },\n\t\t\t\t\texecution: { type: \"object\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tviews: {\n\t\t\ttype: \"array\",\n\t\t\titems: {\n\t\t\t\ttype: \"object\",\n\t\t\t\trequired: [\"name\", \"version\", \"shape\", \"scope\", \"snapshotVersion\"],\n\t\t\t\tproperties: {\n\t\t\t\t\tname: { type: \"string\" },\n\t\t\t\t\tversion: { type: \"string\" },\n\t\t\t\t\tshape: { type: \"object\" },\n\t\t\t\t\tparameterSchema: { type: \"object\" },\n\t\t\t\t\tscope: { type: \"string\", enum: [\"tenant-space\"] },\n\t\t\t\t\tsnapshotVersion: { type: \"integer\" },\n\t\t\t\t\tusage: { type: \"object\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tevents: {\n\t\t\ttype: \"array\",\n\t\t\titems: {\n\t\t\t\ttype: \"object\",\n\t\t\t\trequired: [\"eventType\", \"schemaVersion\"],\n\t\t\t\tproperties: {\n\t\t\t\t\teventType: { type: \"string\" },\n\t\t\t\t\tschemaVersion: { type: \"integer\" },\n\t\t\t\t\tdescription: { type: \"string\" },\n\t\t\t\t\tschema: { type: \"object\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n};\n\nexport function buildUsageContract(module: ModuleManifest): UsageContract | undefined {\n\tconst capability = module.capability;\n\tif (!capability) return undefined;\n\treturn {\n\t\tformatVersion: USAGE_CONTRACT_FORMAT_VERSION,\n\t\tnamespace: module.namespace,\n\t\t...(module.version === undefined ? {} : { version: module.version }),\n\t\tdisplayName: capability.displayName,\n\t\tdescription: capability.description,\n\t\tstability: capability.stability,\n\t\t...(capability.deprecated === undefined ? {} : { deprecated: capability.deprecated }),\n\t\t...(capability.requirements === undefined ? {} : { requirements: capability.requirements }),\n\t\t...(capability.certification === undefined ? {} : { certification: capability.certification }),\n\t\t...(capability.extensions === undefined ? {} : { extensions: capability.extensions }),\n\t\tactions: module.actions.map(({ actionId, version, parameterSchema, resultSchema, requiredRoles, requiredPermissions, execution }) => ({\n\t\t\tactionId,\n\t\t\tversion,\n\t\t\tparameterSchema,\n\t\t\tresultSchema,\n\t\t\trequiredRoles,\n\t\t\trequiredPermissions,\n\t\t\texecution,\n\t\t})),\n\t\tviews: module.views.map(({ name, version, shape, parameterSchema, scope, snapshotVersion, usage }) => ({ name, version, shape, parameterSchema, scope, snapshotVersion, usage })),\n\t\tevents: module.eventTypes.map(({ eventType, schemaVersion, description, schema }) => ({ eventType, schemaVersion, description, schema })),\n\t};\n}\n\nexport const capabilityGenerator: GeneratorTarget = {\n\tname: \"@fabricorg/gen-capability\",\n\tversion: \"0.5.2\",\n\tgenerate(ir) {\n\t\treturn ir.modules.flatMap((module) => {\n\t\t\tconst capability = buildUsageContract(module);\n\t\t\tif (!capability) return [];\n\t\t\tassertUsageContract(capability);\n\t\t\tconst document: UsageContractDocument = {\n\t\t\t\tgenerator: { name: capabilityGenerator.name, version: capabilityGenerator.version },\n\t\t\t\tmanifestDigest: ir.manifestDigest,\n\t\t\t\tcapability,\n\t\t\t};\n\t\t\treturn [{ path: `${module.namespace}/capability.json`, content: stableStringify(document) }];\n\t\t});\n\t},\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../index.ts"],"sourcesContent":["/**\n * Trusted assembly/code-generation artifact, not an external audience catalog.\n * Internal surface declarations do not remove contracts here: assemblers and workers need\n * their schemas. External catalogs must filter internal definitions and apply audience rules.\n */\nimport { stableStringify, type GeneratorTarget } from \"@fabricorg/compiler\";\nimport type {\n\tActionExecutionContract,\n\tCapabilityMetadata,\n\tJsonValue,\n\tModuleManifest,\n\tPortableJsonSchema,\n} from \"@fabricorg/platform\";\nimport { assertPortableJsonSchema } from \"@fabricorg/platform\";\n\n/**\n * Version of the usage contract document. Adopters negotiate on this, not on the\n * generator's package version, and bump it only when the serialized shape changes\n * in a way a consumer must detect.\n */\nexport const USAGE_CONTRACT_FORMAT_VERSION = 1 as const;\n\nexport interface UsageContractAction {\n\tactionId: string;\n\tversion: number;\n\tparameterSchema?: unknown;\n\tresultSchema?: unknown;\n\trequiredRoles?: string[];\n\trequiredPermissions?: string[];\n\texecution?: ActionExecutionContract;\n}\n\nexport interface UsageContractView {\n\tname: string;\n\tversion: string;\n\tshape: PortableJsonSchema;\n\tparameterSchema?: PortableJsonSchema;\n\tscope: \"tenant-space\";\n\tsnapshotVersion: number;\n\tusage?: ModuleManifest[\"views\"][number][\"usage\"];\n}\n\nexport interface UsageContractEvent {\n\teventType: string;\n\tschemaVersion: number;\n\tdescription?: string;\n\tschema?: PortableJsonSchema;\n}\n\n/**\n * What a capability promises its adopters: the governed operations it dispatches,\n * the view payloads it serves, the events it emits, and the namespaced extensions\n * an experience system interprets. Experience semantics stay inside `extensions`,\n * where ADR 0006 put them — this document never interprets them.\n */\nexport interface UsageContract {\n\tformatVersion: typeof USAGE_CONTRACT_FORMAT_VERSION;\n\tnamespace: string;\n\tversion?: string;\n\tdisplayName: string;\n\tdescription: string;\n\tstability: CapabilityMetadata[\"stability\"];\n\tdeprecated?: CapabilityMetadata[\"deprecated\"];\n\trequirements?: CapabilityMetadata[\"requirements\"];\n\tcertification?: CapabilityMetadata[\"certification\"];\n\textensions?: Record<string, JsonValue>;\n\tactions: UsageContractAction[];\n\tviews: UsageContractView[];\n\tevents: UsageContractEvent[];\n}\n\nexport interface UsageContractDocument {\n\tgenerator: { name: string; version: string };\n\tmanifestDigest: string;\n\tcapability: UsageContract;\n}\n\nconst STABILITIES = [\"experimental\", \"beta\", \"stable\", \"deprecated\"];\n\nfunction fail(path: string, message: string): never {\n\tthrow new Error(`Usage contract ${path} ${message}.`);\n}\n\nfunction requireString(value: unknown, path: string): string {\n\tif (typeof value !== \"string\" || !value.trim()) fail(path, \"must be a non-empty string\");\n\treturn value;\n}\n\nfunction requireArray(value: unknown, path: string): unknown[] {\n\tif (!Array.isArray(value)) fail(path, \"must be an array\");\n\treturn value;\n}\n\n/**\n * Structural validation an adopter can run before binding against a contract.\n * It checks the document's own shape; it does not re-validate the manifest it\n * was generated from.\n */\nexport function assertUsageContract(value: unknown, path = \"capability\"): asserts value is UsageContract {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) fail(path, \"must be an object\");\n\tconst contract = value as Record<string, unknown>;\n\tif (contract.formatVersion !== USAGE_CONTRACT_FORMAT_VERSION) {\n\t\tfail(`${path}.formatVersion`, `must be ${USAGE_CONTRACT_FORMAT_VERSION}, received ${JSON.stringify(contract.formatVersion)}`);\n\t}\n\tif (!/^[a-z][a-z0-9-]*$/.test(requireString(contract.namespace, `${path}.namespace`))) {\n\t\tfail(`${path}.namespace`, \"must be lowercase letters, numbers and hyphens\");\n\t}\n\trequireString(contract.displayName, `${path}.displayName`);\n\trequireString(contract.description, `${path}.description`);\n\tif (!STABILITIES.includes(contract.stability as string)) {\n\t\tfail(`${path}.stability`, `must be one of ${STABILITIES.join(\", \")}`);\n\t}\n\tconst actionIds = new Set<string>();\n\trequireArray(contract.actions, `${path}.actions`).forEach((entry, index) => {\n\t\tconst action = entry as Record<string, unknown>;\n\t\tconst actionId = requireString(action?.actionId, `${path}.actions[${index}].actionId`);\n\t\tif (actionIds.has(actionId)) fail(`${path}.actions[${index}]`, `repeats actionId \"${actionId}\"`);\n\t\tactionIds.add(actionId);\n\t\tif (!Number.isInteger(action.version)) fail(`${path}.actions[${index}].version`, \"must be an integer\");\n\t\tif (action.requiredRoles !== undefined && !Array.isArray(action.requiredRoles)) fail(`${path}.actions[${index}].requiredRoles`, \"must be an array\");\n\t\tif (action.requiredPermissions !== undefined && !Array.isArray(action.requiredPermissions)) fail(`${path}.actions[${index}].requiredPermissions`, \"must be an array\");\n\t});\n\tconst viewKeys = new Set<string>();\n\trequireArray(contract.views, `${path}.views`).forEach((entry, index) => {\n\t\tconst view = entry as Record<string, unknown>;\n\t\tconst name = requireString(view?.name, `${path}.views[${index}].name`);\n\t\tconst version = requireString(view?.version, `${path}.views[${index}].version`);\n\t\tconst key = `${name}@${version}`;\n\t\tif (viewKeys.has(key)) fail(`${path}.views[${index}]`, `repeats view \"${key}\"`);\n\t\tviewKeys.add(key);\n\t\tif (!view.shape || typeof view.shape !== \"object\" || Array.isArray(view.shape)) fail(`${path}.views[${index}].shape`, \"must be a JSON Schema object\");\n\t\tif (view.parameterSchema !== undefined) {\n\t\t\ttry { assertPortableJsonSchema(view.parameterSchema, `${path}.views[${index}].parameterSchema`); }\n\t\t\tcatch (error) { fail(`${path}.views[${index}].parameterSchema`, error instanceof Error ? error.message : String(error)); }\n\t\t}\n\t\tif (view.scope !== \"tenant-space\") fail(`${path}.views[${index}].scope`, 'must be \"tenant-space\"');\n\t\tif (!Number.isInteger(view.snapshotVersion) || (view.snapshotVersion as number) < 1) fail(`${path}.views[${index}].snapshotVersion`, \"must be a positive integer\");\n\t});\n\trequireArray(contract.events, `${path}.events`).forEach((entry, index) => {\n\t\tconst event = entry as Record<string, unknown>;\n\t\trequireString(event?.eventType, `${path}.events[${index}].eventType`);\n\t\tif (!Number.isInteger(event.schemaVersion)) fail(`${path}.events[${index}].schemaVersion`, \"must be an integer\");\n\t});\n\tif (contract.extensions !== undefined) {\n\t\tif (!contract.extensions || typeof contract.extensions !== \"object\" || Array.isArray(contract.extensions)) fail(`${path}.extensions`, \"must be an object\");\n\t\tfor (const namespace of Object.keys(contract.extensions as Record<string, unknown>)) {\n\t\t\tif (!/^[a-z][a-z0-9.-]*\\.[a-z0-9.-]+\\/v[1-9][0-9]*$/.test(namespace)) {\n\t\t\t\tfail(`${path}.extensions`, `has invalid extension namespace \"${namespace}\"`);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function assertUsageContractDocument(value: unknown): asserts value is UsageContractDocument {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) fail(\"document\", \"must be an object\");\n\tconst document = value as Record<string, unknown>;\n\tif (!/^[0-9a-f]{64}$/.test(String(document.manifestDigest))) fail(\"document.manifestDigest\", \"must be a lowercase SHA-256 digest\");\n\tconst generator = document.generator as { name?: unknown; version?: unknown } | undefined;\n\tif (!generator || typeof generator !== \"object\" || Array.isArray(generator)) fail(\"document.generator\", \"must be an object\");\n\trequireString(generator.name, \"document.generator.name\");\n\trequireString(generator.version, \"document.generator.version\");\n\tassertUsageContract(document.capability);\n}\n\n/** Machine-readable shape of the usage contract, for adopters that validate with their own tooling. */\nexport const USAGE_CONTRACT_JSON_SCHEMA: PortableJsonSchema = {\n\t$schema: \"https://json-schema.org/draft/2020-12/schema\",\n\ttitle: \"Fabric capability usage contract\",\n\ttype: \"object\",\n\trequired: [\"formatVersion\", \"namespace\", \"displayName\", \"description\", \"stability\", \"actions\", \"views\", \"events\"],\n\tproperties: {\n\t\tformatVersion: { type: \"integer\", enum: [USAGE_CONTRACT_FORMAT_VERSION] },\n\t\tnamespace: { type: \"string\", pattern: \"^[a-z][a-z0-9-]*$\" },\n\t\tversion: { type: \"string\" },\n\t\tdisplayName: { type: \"string\", minLength: 1 },\n\t\tdescription: { type: \"string\", minLength: 1 },\n\t\tstability: { type: \"string\", enum: [...STABILITIES] },\n\t\tdeprecated: { type: \"object\" },\n\t\trequirements: { type: \"object\" },\n\t\tcertification: { type: \"object\" },\n\t\textensions: { type: \"object\" },\n\t\tactions: {\n\t\t\ttype: \"array\",\n\t\t\titems: {\n\t\t\t\ttype: \"object\",\n\t\t\t\trequired: [\"actionId\", \"version\"],\n\t\t\t\tproperties: {\n\t\t\t\t\tactionId: { type: \"string\" },\n\t\t\t\t\tversion: { type: \"integer\" },\n\t\t\t\t\tparameterSchema: { type: \"object\" },\n\t\t\t\t\tresultSchema: { type: \"object\" },\n\t\t\t\t\trequiredRoles: { type: \"array\", items: { type: \"string\" } },\n\t\t\t\t\trequiredPermissions: { type: \"array\", items: { type: \"string\" } },\n\t\t\t\t\texecution: { type: \"object\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tviews: {\n\t\t\ttype: \"array\",\n\t\t\titems: {\n\t\t\t\ttype: \"object\",\n\t\t\t\trequired: [\"name\", \"version\", \"shape\", \"scope\", \"snapshotVersion\"],\n\t\t\t\tproperties: {\n\t\t\t\t\tname: { type: \"string\" },\n\t\t\t\t\tversion: { type: \"string\" },\n\t\t\t\t\tshape: { type: \"object\" },\n\t\t\t\t\tparameterSchema: { type: \"object\" },\n\t\t\t\t\tscope: { type: \"string\", enum: [\"tenant-space\"] },\n\t\t\t\t\tsnapshotVersion: { type: \"integer\" },\n\t\t\t\t\tusage: { type: \"object\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tevents: {\n\t\t\ttype: \"array\",\n\t\t\titems: {\n\t\t\t\ttype: \"object\",\n\t\t\t\trequired: [\"eventType\", \"schemaVersion\"],\n\t\t\t\tproperties: {\n\t\t\t\t\teventType: { type: \"string\" },\n\t\t\t\t\tschemaVersion: { type: \"integer\" },\n\t\t\t\t\tdescription: { type: \"string\" },\n\t\t\t\t\tschema: { type: \"object\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n};\n\nexport function buildUsageContract(module: ModuleManifest): UsageContract | undefined {\n\tconst capability = module.capability;\n\tif (!capability) return undefined;\n\treturn {\n\t\tformatVersion: USAGE_CONTRACT_FORMAT_VERSION,\n\t\tnamespace: module.namespace,\n\t\t...(module.version === undefined ? {} : { version: module.version }),\n\t\tdisplayName: capability.displayName,\n\t\tdescription: capability.description,\n\t\tstability: capability.stability,\n\t\t...(capability.deprecated === undefined ? {} : { deprecated: capability.deprecated }),\n\t\t...(capability.requirements === undefined ? {} : { requirements: capability.requirements }),\n\t\t...(capability.certification === undefined ? {} : { certification: capability.certification }),\n\t\t...(capability.extensions === undefined ? {} : { extensions: capability.extensions }),\n\t\tactions: module.actions.map(({ actionId, version, parameterSchema, resultSchema, requiredRoles, requiredPermissions, execution }) => ({\n\t\t\tactionId,\n\t\t\tversion,\n\t\t\tparameterSchema,\n\t\t\tresultSchema,\n\t\t\trequiredRoles,\n\t\t\trequiredPermissions,\n\t\t\texecution,\n\t\t})),\n\t\tviews: module.views.map(({ name, version, shape, parameterSchema, scope, snapshotVersion, usage }) => ({ name, version, shape, parameterSchema, scope, snapshotVersion, usage })),\n\t\tevents: module.eventTypes.map(({ eventType, schemaVersion, description, schema }) => ({ eventType, schemaVersion, description, schema })),\n\t};\n}\n\nexport const capabilityGenerator: GeneratorTarget = {\n\tname: \"@fabricorg/gen-capability\",\n\tversion: \"0.5.4\",\n\tgenerate(ir) {\n\t\treturn ir.modules.flatMap((module) => {\n\t\t\tconst capability = buildUsageContract(module);\n\t\t\tif (!capability) return [];\n\t\t\tassertUsageContract(capability);\n\t\t\tconst document: UsageContractDocument = {\n\t\t\t\tgenerator: { name: capabilityGenerator.name, version: capabilityGenerator.version },\n\t\t\t\tmanifestDigest: ir.manifestDigest,\n\t\t\t\tcapability,\n\t\t\t};\n\t\t\treturn [{ path: `${module.namespace}/capability.json`, content: stableStringify(document) }];\n\t\t});\n\t},\n};\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fabricorg/gen-capability",
3
- "version": "0.5.2",
3
+ "version": "0.5.4",
4
4
  "description": "Capability usage contract generator for Fabric compiler IR.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -32,14 +32,14 @@
32
32
  "CHANGELOG.md"
33
33
  ],
34
34
  "dependencies": {
35
- "@fabricorg/compiler": "^2.2.2"
35
+ "@fabricorg/compiler": "^2.2.5"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/node": "^22.10.0",
39
39
  "tsup": "^8.5.0",
40
40
  "typescript": "^5.7.3",
41
41
  "vitest": "^4.1.5",
42
- "@fabricorg/platform": "^1.5.1"
42
+ "@fabricorg/platform": "^1.7.0"
43
43
  },
44
44
  "engines": {
45
45
  "node": ">=20"
@@ -48,7 +48,7 @@
48
48
  "access": "public"
49
49
  },
50
50
  "peerDependencies": {
51
- "@fabricorg/platform": "^1.5.1"
51
+ "@fabricorg/platform": "^1.7.0"
52
52
  },
53
53
  "scripts": {
54
54
  "clean": "rm -rf dist tsconfig.tsbuildinfo",