@contractspec/lib.contracts 0.0.0-canary-20260119225944 → 0.0.0-canary-20260202053150

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.
Files changed (166) hide show
  1. package/dist/app-config/{contracts.d.ts → app-config.contracts.d.ts} +52 -52
  2. package/dist/app-config/{contracts.js → app-config.contracts.js} +1 -1
  3. package/dist/app-config/lifecycle-contracts.d.ts +55 -55
  4. package/dist/app-config/runtime.d.ts +4 -4
  5. package/dist/app-config/spec.d.ts +2 -2
  6. package/dist/capabilities/capabilities.d.ts +64 -5
  7. package/dist/capabilities/capabilities.js +125 -0
  8. package/dist/capabilities/context.d.ts +88 -0
  9. package/dist/capabilities/context.js +87 -0
  10. package/dist/capabilities/docs/capabilities.docblock.js +191 -2
  11. package/dist/capabilities/guards.d.ts +110 -0
  12. package/dist/capabilities/guards.js +146 -0
  13. package/dist/capabilities/index.d.ts +4 -1
  14. package/dist/capabilities/index.js +4 -1
  15. package/dist/capabilities/validation.d.ts +76 -0
  16. package/dist/capabilities/validation.js +141 -0
  17. package/dist/client/react/feature-render.d.ts +2 -2
  18. package/dist/data-views/data-views.d.ts +2 -1
  19. package/dist/data-views/index.d.ts +2 -1
  20. package/dist/data-views/registry.d.ts +1 -1
  21. package/dist/data-views/report/contractVerificationTable.d.ts +10 -0
  22. package/dist/data-views/report/contractVerificationTable.js +95 -0
  23. package/dist/data-views/runtime.d.ts +2 -2
  24. package/dist/data-views/spec.d.ts +2 -8
  25. package/dist/data-views/types.d.ts +1 -1
  26. package/dist/docs/capabilities/documentationSystem.capability.d.ts +7 -0
  27. package/dist/docs/capabilities/documentationSystem.capability.js +71 -0
  28. package/dist/docs/capabilities/index.d.ts +2 -0
  29. package/dist/docs/capabilities/index.js +3 -0
  30. package/dist/docs/commands/docsGenerate.command.d.ts +95 -0
  31. package/dist/docs/commands/docsGenerate.command.js +142 -0
  32. package/dist/docs/commands/docsPublish.command.d.ts +64 -0
  33. package/dist/docs/commands/docsPublish.command.js +107 -0
  34. package/dist/docs/commands/index.d.ts +3 -0
  35. package/dist/docs/commands/index.js +4 -0
  36. package/dist/docs/constants.d.ts +7 -0
  37. package/dist/docs/constants.js +10 -0
  38. package/dist/docs/contracts.d.ts +442 -0
  39. package/dist/docs/contracts.js +58 -0
  40. package/dist/docs/ensure-docblocks.d.ts +1 -0
  41. package/dist/docs/ensure-docblocks.js +1 -0
  42. package/dist/docs/events/docsGenerated.event.d.ts +62 -0
  43. package/dist/docs/events/docsGenerated.event.js +53 -0
  44. package/dist/docs/events/docsPublished.event.d.ts +70 -0
  45. package/dist/docs/events/docsPublished.event.js +57 -0
  46. package/dist/docs/events/index.d.ts +3 -0
  47. package/dist/docs/events/index.js +4 -0
  48. package/dist/docs/forms/docsSearch.form.d.ts +22 -0
  49. package/dist/docs/forms/docsSearch.form.js +113 -0
  50. package/dist/docs/forms/index.d.ts +2 -0
  51. package/dist/docs/forms/index.js +3 -0
  52. package/dist/docs/index.d.ts +23 -2
  53. package/dist/docs/index.js +25 -1
  54. package/dist/docs/presentations/docsLayout.presentation.d.ts +7 -0
  55. package/dist/docs/presentations/docsLayout.presentation.js +35 -0
  56. package/dist/docs/presentations/docsReferencePage.presentation.d.ts +7 -0
  57. package/dist/docs/presentations/docsReferencePage.presentation.js +35 -0
  58. package/dist/docs/presentations/index.d.ts +3 -0
  59. package/dist/docs/presentations/index.js +4 -0
  60. package/dist/docs/queries/contractReference.query.d.ts +217 -0
  61. package/dist/docs/queries/contractReference.query.js +125 -0
  62. package/dist/docs/queries/docsIndex.query.d.ts +272 -0
  63. package/dist/docs/queries/docsIndex.query.js +133 -0
  64. package/dist/docs/queries/index.d.ts +3 -0
  65. package/dist/docs/queries/index.js +4 -0
  66. package/dist/docs/tech/cli.docblock.js +10 -0
  67. package/dist/docs/tech/docs-system.docblock.d.ts +1 -0
  68. package/dist/docs/tech/docs-system.docblock.js +128 -0
  69. package/dist/docs/tech/report-verification-table.docblock.d.ts +1 -0
  70. package/dist/docs/tech/report-verification-table.docblock.js +50 -0
  71. package/dist/docs/views/contractReference.dataView.d.ts +7 -0
  72. package/dist/docs/views/contractReference.dataView.js +80 -0
  73. package/dist/docs/views/docsIndex.dataView.d.ts +7 -0
  74. package/dist/docs/views/docsIndex.dataView.js +136 -0
  75. package/dist/docs/views/exampleCatalog.dataView.d.ts +7 -0
  76. package/dist/docs/views/exampleCatalog.dataView.js +91 -0
  77. package/dist/docs/views/index.d.ts +4 -0
  78. package/dist/docs/views/index.js +5 -0
  79. package/dist/events.d.ts +80 -14
  80. package/dist/events.js +33 -3
  81. package/dist/examples/schema.d.ts +12 -12
  82. package/dist/examples/types.d.ts +1 -1
  83. package/dist/experiments/spec.d.ts +9 -6
  84. package/dist/features/index.d.ts +2 -2
  85. package/dist/features/install.d.ts +4 -4
  86. package/dist/features/types.d.ts +28 -32
  87. package/dist/forms/forms.d.ts +1 -1
  88. package/dist/index.d.ts +60 -31
  89. package/dist/index.js +32 -4
  90. package/dist/install.d.ts +1 -1
  91. package/dist/integrations/openbanking/contracts/accounts.d.ts +67 -67
  92. package/dist/integrations/openbanking/contracts/balances.d.ts +35 -35
  93. package/dist/integrations/openbanking/contracts/transactions.d.ts +49 -49
  94. package/dist/integrations/openbanking/models.d.ts +55 -55
  95. package/dist/integrations/operations.d.ts +103 -103
  96. package/dist/integrations/spec.d.ts +2 -2
  97. package/dist/jsonschema.d.ts +1 -1
  98. package/dist/knowledge/operations.d.ts +67 -67
  99. package/dist/knowledge/spec.d.ts +1 -1
  100. package/dist/llm/exporters.d.ts +4 -4
  101. package/dist/llm/types.d.ts +1 -1
  102. package/dist/markdown.d.ts +2 -2
  103. package/dist/operations/index.d.ts +4 -1
  104. package/dist/operations/index.js +4 -1
  105. package/dist/operations/operation.d.ts +8 -2
  106. package/dist/operations/registry.d.ts +1 -1
  107. package/dist/operations/report/getContractVerificationStatus.d.ts +75 -0
  108. package/dist/operations/report/getContractVerificationStatus.js +96 -0
  109. package/dist/operations/report/index.d.ts +13 -0
  110. package/dist/operations/report/index.js +45 -0
  111. package/dist/ownership.d.ts +133 -8
  112. package/dist/ownership.js +25 -0
  113. package/dist/policy/context.d.ts +237 -0
  114. package/dist/policy/context.js +227 -0
  115. package/dist/policy/guards.d.ts +145 -0
  116. package/dist/policy/guards.js +254 -0
  117. package/dist/policy/index.d.ts +12 -1
  118. package/dist/policy/index.js +11 -1
  119. package/dist/policy/spec.d.ts +7 -4
  120. package/dist/policy/validation.d.ts +67 -0
  121. package/dist/policy/validation.js +307 -0
  122. package/dist/presentations/presentations.d.ts +6 -0
  123. package/dist/presentations/registry.d.ts +1 -1
  124. package/dist/registry.d.ts +1 -1
  125. package/dist/serialization/index.d.ts +3 -0
  126. package/dist/serialization/index.js +3 -0
  127. package/dist/serialization/serializers.d.ts +40 -0
  128. package/dist/serialization/serializers.js +148 -0
  129. package/dist/serialization/types.d.ts +103 -0
  130. package/dist/serialization/types.js +0 -0
  131. package/dist/server/rest-elysia.d.ts +1 -1
  132. package/dist/server/rest-express.d.ts +1 -1
  133. package/dist/server/rest-generic.d.ts +1 -1
  134. package/dist/server/rest-next-app.d.ts +1 -1
  135. package/dist/server/rest-next-mcp.d.ts +1 -1
  136. package/dist/server/rest-next-pages.d.ts +1 -1
  137. package/dist/telemetry/spec.d.ts +1 -1
  138. package/dist/telemetry/tracker.d.ts +3 -2
  139. package/dist/tests/runner.d.ts +1 -1
  140. package/dist/tests/spec.d.ts +17 -12
  141. package/dist/themes.d.ts +8 -5
  142. package/dist/translations/index.d.ts +6 -0
  143. package/dist/translations/index.js +5 -0
  144. package/dist/translations/registry.d.ts +144 -0
  145. package/dist/translations/registry.js +223 -0
  146. package/dist/translations/spec.d.ts +126 -0
  147. package/dist/translations/spec.js +31 -0
  148. package/dist/translations/validation.d.ts +85 -0
  149. package/dist/translations/validation.js +328 -0
  150. package/dist/types.d.ts +142 -16
  151. package/dist/versioning/index.d.ts +2 -1
  152. package/dist/versioning/index.js +2 -1
  153. package/dist/versioning/refs.d.ts +179 -0
  154. package/dist/versioning/refs.js +161 -0
  155. package/dist/workflow/context.d.ts +191 -0
  156. package/dist/workflow/context.js +227 -0
  157. package/dist/workflow/index.d.ts +6 -3
  158. package/dist/workflow/index.js +4 -2
  159. package/dist/workflow/spec.d.ts +4 -11
  160. package/dist/workflow/validation.d.ts +64 -2
  161. package/dist/workflow/validation.js +194 -1
  162. package/dist/workspace-config/contractsrc-schema.d.ts +3 -3
  163. package/dist/workspace-config/contractsrc-schema.js +1 -0
  164. package/dist/workspace-config/contractsrc-types.d.ts +7 -8
  165. package/dist/workspace-config/index.d.ts +2 -2
  166. package/package.json +52 -9
@@ -0,0 +1,110 @@
1
+ import { AnyOperationSpec } from "../operations/operation.js";
2
+ import { PresentationSpec } from "../presentations/presentations.js";
3
+ import { CapabilityContext } from "./context.js";
4
+ import { AnyEventSpec } from "../events.js";
5
+
6
+ //#region src/capabilities/guards.d.ts
7
+
8
+ /** Result of a capability guard check. */
9
+ interface CapabilityGuardResult {
10
+ /** Whether the guard passed. */
11
+ allowed: boolean;
12
+ /** Missing capability if guard failed. */
13
+ missingCapability?: {
14
+ key: string;
15
+ version: string;
16
+ };
17
+ /** Reason for denial if guard failed. */
18
+ reason?: string;
19
+ }
20
+ /**
21
+ * Check if an operation's capability is enabled in the context.
22
+ *
23
+ * @param ctx - Capability context to check against
24
+ * @param operation - Operation spec to check
25
+ * @returns Guard result indicating if operation is allowed
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * const result = checkCapabilityForOperation(ctx, myOperation);
30
+ * if (!result.allowed) {
31
+ * console.log('Denied:', result.reason);
32
+ * }
33
+ * ```
34
+ */
35
+ declare function checkCapabilityForOperation(ctx: CapabilityContext, operation: AnyOperationSpec): CapabilityGuardResult;
36
+ /**
37
+ * Assert that an operation's capability is enabled, throwing if not.
38
+ *
39
+ * @param ctx - Capability context to check against
40
+ * @param operation - Operation spec to check
41
+ * @throws {CapabilityMissingError} If capability is not enabled
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * // Throws if capability missing
46
+ * assertCapabilityForOperation(ctx, myOperation);
47
+ *
48
+ * // Safe to proceed with operation
49
+ * await handler(input);
50
+ * ```
51
+ */
52
+ declare function assertCapabilityForOperation(ctx: CapabilityContext, operation: AnyOperationSpec): void;
53
+ /**
54
+ * Check if an event's capability is enabled in the context.
55
+ *
56
+ * @param ctx - Capability context to check against
57
+ * @param event - Event spec to check
58
+ * @returns Guard result indicating if event is allowed
59
+ */
60
+ declare function checkCapabilityForEvent(ctx: CapabilityContext, event: AnyEventSpec): CapabilityGuardResult;
61
+ /**
62
+ * Assert that an event's capability is enabled, throwing if not.
63
+ *
64
+ * @param ctx - Capability context to check against
65
+ * @param event - Event spec to check
66
+ * @throws {CapabilityMissingError} If capability is not enabled
67
+ */
68
+ declare function assertCapabilityForEvent(ctx: CapabilityContext, event: AnyEventSpec): void;
69
+ /**
70
+ * Check if a presentation's capability is enabled in the context.
71
+ *
72
+ * @param ctx - Capability context to check against
73
+ * @param presentation - Presentation spec to check
74
+ * @returns Guard result indicating if presentation is allowed
75
+ */
76
+ declare function checkCapabilityForPresentation(ctx: CapabilityContext, presentation: PresentationSpec): CapabilityGuardResult;
77
+ /**
78
+ * Assert that a presentation's capability is enabled, throwing if not.
79
+ *
80
+ * @param ctx - Capability context to check against
81
+ * @param presentation - Presentation spec to check
82
+ * @throws {CapabilityMissingError} If capability is not enabled
83
+ */
84
+ declare function assertCapabilityForPresentation(ctx: CapabilityContext, presentation: PresentationSpec): void;
85
+ /**
86
+ * Filter operations to only those with enabled capabilities.
87
+ *
88
+ * @param ctx - Capability context to check against
89
+ * @param operations - Operations to filter
90
+ * @returns Operations that have their capabilities enabled (or no capability requirement)
91
+ */
92
+ declare function filterOperationsByCapability(ctx: CapabilityContext, operations: AnyOperationSpec[]): AnyOperationSpec[];
93
+ /**
94
+ * Filter events to only those with enabled capabilities.
95
+ *
96
+ * @param ctx - Capability context to check against
97
+ * @param events - Events to filter
98
+ * @returns Events that have their capabilities enabled (or no capability requirement)
99
+ */
100
+ declare function filterEventsByCapability(ctx: CapabilityContext, events: AnyEventSpec[]): AnyEventSpec[];
101
+ /**
102
+ * Filter presentations to only those with enabled capabilities.
103
+ *
104
+ * @param ctx - Capability context to check against
105
+ * @param presentations - Presentations to filter
106
+ * @returns Presentations that have their capabilities enabled (or no capability requirement)
107
+ */
108
+ declare function filterPresentationsByCapability(ctx: CapabilityContext, presentations: PresentationSpec[]): PresentationSpec[];
109
+ //#endregion
110
+ export { CapabilityGuardResult, assertCapabilityForEvent, assertCapabilityForOperation, assertCapabilityForPresentation, checkCapabilityForEvent, checkCapabilityForOperation, checkCapabilityForPresentation, filterEventsByCapability, filterOperationsByCapability, filterPresentationsByCapability };
@@ -0,0 +1,146 @@
1
+ import { CapabilityMissingError } from "./context.js";
2
+
3
+ //#region src/capabilities/guards.ts
4
+ /**
5
+ * Check if an operation's capability is enabled in the context.
6
+ *
7
+ * @param ctx - Capability context to check against
8
+ * @param operation - Operation spec to check
9
+ * @returns Guard result indicating if operation is allowed
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * const result = checkCapabilityForOperation(ctx, myOperation);
14
+ * if (!result.allowed) {
15
+ * console.log('Denied:', result.reason);
16
+ * }
17
+ * ```
18
+ */
19
+ function checkCapabilityForOperation(ctx, operation) {
20
+ if (!operation.capability) return { allowed: true };
21
+ const { key, version } = operation.capability;
22
+ if (ctx.hasCapability(key, version)) return { allowed: true };
23
+ return {
24
+ allowed: false,
25
+ missingCapability: {
26
+ key,
27
+ version
28
+ },
29
+ reason: `Operation "${operation.meta.key}" requires capability "${key}.v${version}"`
30
+ };
31
+ }
32
+ /**
33
+ * Assert that an operation's capability is enabled, throwing if not.
34
+ *
35
+ * @param ctx - Capability context to check against
36
+ * @param operation - Operation spec to check
37
+ * @throws {CapabilityMissingError} If capability is not enabled
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * // Throws if capability missing
42
+ * assertCapabilityForOperation(ctx, myOperation);
43
+ *
44
+ * // Safe to proceed with operation
45
+ * await handler(input);
46
+ * ```
47
+ */
48
+ function assertCapabilityForOperation(ctx, operation) {
49
+ const result = checkCapabilityForOperation(ctx, operation);
50
+ if (!result.allowed && result.missingCapability) throw new CapabilityMissingError(result.missingCapability.key, result.missingCapability.version);
51
+ }
52
+ /**
53
+ * Check if an event's capability is enabled in the context.
54
+ *
55
+ * @param ctx - Capability context to check against
56
+ * @param event - Event spec to check
57
+ * @returns Guard result indicating if event is allowed
58
+ */
59
+ function checkCapabilityForEvent(ctx, event) {
60
+ if (!event.capability) return { allowed: true };
61
+ const { key, version } = event.capability;
62
+ if (ctx.hasCapability(key, version)) return { allowed: true };
63
+ return {
64
+ allowed: false,
65
+ missingCapability: {
66
+ key,
67
+ version
68
+ },
69
+ reason: `Event "${event.meta.key}" requires capability "${key}.v${version}"`
70
+ };
71
+ }
72
+ /**
73
+ * Assert that an event's capability is enabled, throwing if not.
74
+ *
75
+ * @param ctx - Capability context to check against
76
+ * @param event - Event spec to check
77
+ * @throws {CapabilityMissingError} If capability is not enabled
78
+ */
79
+ function assertCapabilityForEvent(ctx, event) {
80
+ const result = checkCapabilityForEvent(ctx, event);
81
+ if (!result.allowed && result.missingCapability) throw new CapabilityMissingError(result.missingCapability.key, result.missingCapability.version);
82
+ }
83
+ /**
84
+ * Check if a presentation's capability is enabled in the context.
85
+ *
86
+ * @param ctx - Capability context to check against
87
+ * @param presentation - Presentation spec to check
88
+ * @returns Guard result indicating if presentation is allowed
89
+ */
90
+ function checkCapabilityForPresentation(ctx, presentation) {
91
+ if (!presentation.capability) return { allowed: true };
92
+ const { key, version } = presentation.capability;
93
+ if (ctx.hasCapability(key, version)) return { allowed: true };
94
+ return {
95
+ allowed: false,
96
+ missingCapability: {
97
+ key,
98
+ version
99
+ },
100
+ reason: `Presentation "${presentation.meta.key}" requires capability "${key}.v${version}"`
101
+ };
102
+ }
103
+ /**
104
+ * Assert that a presentation's capability is enabled, throwing if not.
105
+ *
106
+ * @param ctx - Capability context to check against
107
+ * @param presentation - Presentation spec to check
108
+ * @throws {CapabilityMissingError} If capability is not enabled
109
+ */
110
+ function assertCapabilityForPresentation(ctx, presentation) {
111
+ const result = checkCapabilityForPresentation(ctx, presentation);
112
+ if (!result.allowed && result.missingCapability) throw new CapabilityMissingError(result.missingCapability.key, result.missingCapability.version);
113
+ }
114
+ /**
115
+ * Filter operations to only those with enabled capabilities.
116
+ *
117
+ * @param ctx - Capability context to check against
118
+ * @param operations - Operations to filter
119
+ * @returns Operations that have their capabilities enabled (or no capability requirement)
120
+ */
121
+ function filterOperationsByCapability(ctx, operations) {
122
+ return operations.filter((op) => checkCapabilityForOperation(ctx, op).allowed);
123
+ }
124
+ /**
125
+ * Filter events to only those with enabled capabilities.
126
+ *
127
+ * @param ctx - Capability context to check against
128
+ * @param events - Events to filter
129
+ * @returns Events that have their capabilities enabled (or no capability requirement)
130
+ */
131
+ function filterEventsByCapability(ctx, events) {
132
+ return events.filter((ev) => checkCapabilityForEvent(ctx, ev).allowed);
133
+ }
134
+ /**
135
+ * Filter presentations to only those with enabled capabilities.
136
+ *
137
+ * @param ctx - Capability context to check against
138
+ * @param presentations - Presentations to filter
139
+ * @returns Presentations that have their capabilities enabled (or no capability requirement)
140
+ */
141
+ function filterPresentationsByCapability(ctx, presentations) {
142
+ return presentations.filter((pres) => checkCapabilityForPresentation(ctx, pres).allowed);
143
+ }
144
+
145
+ //#endregion
146
+ export { assertCapabilityForEvent, assertCapabilityForOperation, assertCapabilityForPresentation, checkCapabilityForEvent, checkCapabilityForOperation, checkCapabilityForPresentation, filterEventsByCapability, filterOperationsByCapability, filterPresentationsByCapability };
@@ -1,3 +1,6 @@
1
1
  import { CapabilityKind, CapabilityMeta, CapabilityRef, CapabilityRegistry, CapabilityRequirement, CapabilitySpec, CapabilitySurface, CapabilitySurfaceRef, capabilityKey, defineCapability } from "./capabilities.js";
2
+ import { CapabilityValidationDeps, CapabilityValidationError, CapabilityValidationResult, findOrphanSpecs, validateCapabilityConsistency } from "./validation.js";
3
+ import { CapabilityContext, CapabilityMissingError, createBypassCapabilityContext, createCapabilityContext, createEmptyCapabilityContext } from "./context.js";
4
+ import { CapabilityGuardResult, assertCapabilityForEvent, assertCapabilityForOperation, assertCapabilityForPresentation, checkCapabilityForEvent, checkCapabilityForOperation, checkCapabilityForPresentation, filterEventsByCapability, filterOperationsByCapability, filterPresentationsByCapability } from "./guards.js";
2
5
  import { openBankingAccountsReadCapability, openBankingBalancesReadCapability, openBankingTransactionsReadCapability, registerOpenBankingCapabilities } from "./openbanking.js";
3
- export { CapabilityKind, CapabilityMeta, CapabilityRef, CapabilityRegistry, CapabilityRequirement, CapabilitySpec, CapabilitySurface, CapabilitySurfaceRef, capabilityKey, defineCapability, openBankingAccountsReadCapability, openBankingBalancesReadCapability, openBankingTransactionsReadCapability, registerOpenBankingCapabilities };
6
+ export { CapabilityContext, CapabilityGuardResult, CapabilityKind, CapabilityMeta, CapabilityMissingError, CapabilityRef, CapabilityRegistry, CapabilityRequirement, CapabilitySpec, CapabilitySurface, CapabilitySurfaceRef, CapabilityValidationDeps, CapabilityValidationError, CapabilityValidationResult, assertCapabilityForEvent, assertCapabilityForOperation, assertCapabilityForPresentation, capabilityKey, checkCapabilityForEvent, checkCapabilityForOperation, checkCapabilityForPresentation, createBypassCapabilityContext, createCapabilityContext, createEmptyCapabilityContext, defineCapability, filterEventsByCapability, filterOperationsByCapability, filterPresentationsByCapability, findOrphanSpecs, openBankingAccountsReadCapability, openBankingBalancesReadCapability, openBankingTransactionsReadCapability, registerOpenBankingCapabilities, validateCapabilityConsistency };
@@ -1,4 +1,7 @@
1
1
  import { CapabilityRegistry, capabilityKey, defineCapability } from "./capabilities.js";
2
+ import { findOrphanSpecs, validateCapabilityConsistency } from "./validation.js";
3
+ import { CapabilityMissingError, createBypassCapabilityContext, createCapabilityContext, createEmptyCapabilityContext } from "./context.js";
4
+ import { assertCapabilityForEvent, assertCapabilityForOperation, assertCapabilityForPresentation, checkCapabilityForEvent, checkCapabilityForOperation, checkCapabilityForPresentation, filterEventsByCapability, filterOperationsByCapability, filterPresentationsByCapability } from "./guards.js";
2
5
  import { openBankingAccountsReadCapability, openBankingBalancesReadCapability, openBankingTransactionsReadCapability, registerOpenBankingCapabilities } from "./openbanking.js";
3
6
 
4
- export { CapabilityRegistry, capabilityKey, defineCapability, openBankingAccountsReadCapability, openBankingBalancesReadCapability, openBankingTransactionsReadCapability, registerOpenBankingCapabilities };
7
+ export { CapabilityMissingError, CapabilityRegistry, assertCapabilityForEvent, assertCapabilityForOperation, assertCapabilityForPresentation, capabilityKey, checkCapabilityForEvent, checkCapabilityForOperation, checkCapabilityForPresentation, createBypassCapabilityContext, createCapabilityContext, createEmptyCapabilityContext, defineCapability, filterEventsByCapability, filterOperationsByCapability, filterPresentationsByCapability, findOrphanSpecs, openBankingAccountsReadCapability, openBankingBalancesReadCapability, openBankingTransactionsReadCapability, registerOpenBankingCapabilities, validateCapabilityConsistency };
@@ -0,0 +1,76 @@
1
+ import { CapabilityRegistry, CapabilitySurface } from "./capabilities.js";
2
+ import { PresentationRegistry } from "../presentations/registry.js";
3
+ import "../presentations/index.js";
4
+ import { OperationSpecRegistry } from "../operations/registry.js";
5
+ import { EventRegistry } from "../events.js";
6
+
7
+ //#region src/capabilities/validation.d.ts
8
+
9
+ /** Single validation error describing an inconsistency. */
10
+ interface CapabilityValidationError {
11
+ /** Type of validation error. */
12
+ type: 'missing_surface_spec' | 'orphan_spec' | 'capability_not_found' | 'surface_not_in_provides';
13
+ /** Human-readable error message. */
14
+ message: string;
15
+ /** Capability key involved (if applicable). */
16
+ capabilityKey?: string;
17
+ /** Surface type involved (if applicable). */
18
+ surface?: CapabilitySurface;
19
+ /** Spec key involved (if applicable). */
20
+ specKey?: string;
21
+ }
22
+ /** Result of capability consistency validation. */
23
+ interface CapabilityValidationResult {
24
+ /** Whether validation passed with no errors. */
25
+ valid: boolean;
26
+ /** List of validation errors found. */
27
+ errors: CapabilityValidationError[];
28
+ /** List of warnings (non-blocking issues). */
29
+ warnings: CapabilityValidationError[];
30
+ }
31
+ /** Registries needed for full bidirectional validation. */
32
+ interface CapabilityValidationDeps {
33
+ capabilities: CapabilityRegistry;
34
+ operations?: OperationSpecRegistry;
35
+ events?: EventRegistry;
36
+ presentations?: PresentationRegistry;
37
+ }
38
+ /**
39
+ * Validates bidirectional consistency between capabilities and their surfaces.
40
+ *
41
+ * Checks:
42
+ * 1. Forward validation: Every surface ref in capability `provides` exists
43
+ * 2. Reverse validation: Every spec with `capability` field is in that capability's `provides`
44
+ *
45
+ * @param deps - Registries to validate against
46
+ * @returns Validation result with errors and warnings
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const result = validateCapabilityConsistency({
51
+ * capabilities: capabilityRegistry,
52
+ * operations: operationRegistry,
53
+ * events: eventRegistry,
54
+ * });
55
+ *
56
+ * if (!result.valid) {
57
+ * console.error('Capability validation failed:', result.errors);
58
+ * }
59
+ * ```
60
+ */
61
+ declare function validateCapabilityConsistency(deps: CapabilityValidationDeps): CapabilityValidationResult;
62
+ /**
63
+ * Finds specs that have no capability assignment (orphan specs).
64
+ * This is informational - orphan specs are allowed but may indicate
65
+ * incomplete capability modeling.
66
+ *
67
+ * @param deps - Registries to check
68
+ * @returns List of spec keys without capability assignment
69
+ */
70
+ declare function findOrphanSpecs(deps: CapabilityValidationDeps): {
71
+ operations: string[];
72
+ events: string[];
73
+ presentations: string[];
74
+ };
75
+ //#endregion
76
+ export { CapabilityValidationDeps, CapabilityValidationError, CapabilityValidationResult, findOrphanSpecs, validateCapabilityConsistency };
@@ -0,0 +1,141 @@
1
+ //#region src/capabilities/validation.ts
2
+ /**
3
+ * Validates bidirectional consistency between capabilities and their surfaces.
4
+ *
5
+ * Checks:
6
+ * 1. Forward validation: Every surface ref in capability `provides` exists
7
+ * 2. Reverse validation: Every spec with `capability` field is in that capability's `provides`
8
+ *
9
+ * @param deps - Registries to validate against
10
+ * @returns Validation result with errors and warnings
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const result = validateCapabilityConsistency({
15
+ * capabilities: capabilityRegistry,
16
+ * operations: operationRegistry,
17
+ * events: eventRegistry,
18
+ * });
19
+ *
20
+ * if (!result.valid) {
21
+ * console.error('Capability validation failed:', result.errors);
22
+ * }
23
+ * ```
24
+ */
25
+ function validateCapabilityConsistency(deps) {
26
+ const errors = [];
27
+ const warnings = [];
28
+ for (const capability of deps.capabilities.list()) {
29
+ const capKey = `${capability.meta.key}.v${capability.meta.version}`;
30
+ for (const surface of capability.provides ?? []) if (!checkSurfaceExists(deps, surface.surface, surface.key)) errors.push({
31
+ type: "missing_surface_spec",
32
+ message: `Capability "${capKey}" provides ${surface.surface} "${surface.key}" but spec not found`,
33
+ capabilityKey: capKey,
34
+ surface: surface.surface,
35
+ specKey: surface.key
36
+ });
37
+ }
38
+ if (deps.operations) {
39
+ for (const op of deps.operations.list()) if (op.capability) {
40
+ const capSpec = deps.capabilities.get(op.capability.key, op.capability.version);
41
+ if (!capSpec) errors.push({
42
+ type: "capability_not_found",
43
+ message: `Operation "${op.meta.key}" references capability "${op.capability.key}.v${op.capability.version}" but capability not found`,
44
+ specKey: op.meta.key,
45
+ capabilityKey: `${op.capability.key}.v${op.capability.version}`,
46
+ surface: "operation"
47
+ });
48
+ else if (!capSpec.provides?.some((p) => p.surface === "operation" && p.key === op.meta.key)) errors.push({
49
+ type: "surface_not_in_provides",
50
+ message: `Operation "${op.meta.key}" claims capability "${op.capability.key}.v${op.capability.version}" but not in capability's provides`,
51
+ specKey: op.meta.key,
52
+ capabilityKey: `${op.capability.key}.v${op.capability.version}`,
53
+ surface: "operation"
54
+ });
55
+ }
56
+ }
57
+ if (deps.events) {
58
+ for (const event of deps.events.list()) if (event.capability) {
59
+ const capSpec = deps.capabilities.get(event.capability.key, event.capability.version);
60
+ if (!capSpec) errors.push({
61
+ type: "capability_not_found",
62
+ message: `Event "${event.meta.key}" references capability "${event.capability.key}.v${event.capability.version}" but capability not found`,
63
+ specKey: event.meta.key,
64
+ capabilityKey: `${event.capability.key}.v${event.capability.version}`,
65
+ surface: "event"
66
+ });
67
+ else if (!capSpec.provides?.some((p) => p.surface === "event" && p.key === event.meta.key)) errors.push({
68
+ type: "surface_not_in_provides",
69
+ message: `Event "${event.meta.key}" claims capability "${event.capability.key}.v${event.capability.version}" but not in capability's provides`,
70
+ specKey: event.meta.key,
71
+ capabilityKey: `${event.capability.key}.v${event.capability.version}`,
72
+ surface: "event"
73
+ });
74
+ }
75
+ }
76
+ if (deps.presentations) {
77
+ for (const pres of deps.presentations.list()) if (pres.capability) {
78
+ const capSpec = deps.capabilities.get(pres.capability.key, pres.capability.version);
79
+ if (!capSpec) errors.push({
80
+ type: "capability_not_found",
81
+ message: `Presentation "${pres.meta.key}" references capability "${pres.capability.key}.v${pres.capability.version}" but capability not found`,
82
+ specKey: pres.meta.key,
83
+ capabilityKey: `${pres.capability.key}.v${pres.capability.version}`,
84
+ surface: "presentation"
85
+ });
86
+ else if (!capSpec.provides?.some((p) => p.surface === "presentation" && p.key === pres.meta.key)) errors.push({
87
+ type: "surface_not_in_provides",
88
+ message: `Presentation "${pres.meta.key}" claims capability "${pres.capability.key}.v${pres.capability.version}" but not in capability's provides`,
89
+ specKey: pres.meta.key,
90
+ capabilityKey: `${pres.capability.key}.v${pres.capability.version}`,
91
+ surface: "presentation"
92
+ });
93
+ }
94
+ }
95
+ return {
96
+ valid: errors.length === 0,
97
+ errors,
98
+ warnings
99
+ };
100
+ }
101
+ /**
102
+ * Check if a spec exists for a given surface type and key.
103
+ */
104
+ function checkSurfaceExists(deps, surface, key) {
105
+ switch (surface) {
106
+ case "operation": return deps.operations?.has(key) ?? true;
107
+ case "event": return deps.events?.has(key) ?? true;
108
+ case "presentation": return deps.presentations?.has(key) ?? true;
109
+ case "workflow":
110
+ case "resource": return true;
111
+ default: return true;
112
+ }
113
+ }
114
+ /**
115
+ * Finds specs that have no capability assignment (orphan specs).
116
+ * This is informational - orphan specs are allowed but may indicate
117
+ * incomplete capability modeling.
118
+ *
119
+ * @param deps - Registries to check
120
+ * @returns List of spec keys without capability assignment
121
+ */
122
+ function findOrphanSpecs(deps) {
123
+ const result = {
124
+ operations: [],
125
+ events: [],
126
+ presentations: []
127
+ };
128
+ if (deps.operations) {
129
+ for (const op of deps.operations.list()) if (!op.capability) result.operations.push(op.meta.key);
130
+ }
131
+ if (deps.events) {
132
+ for (const event of deps.events.list()) if (!event.capability) result.events.push(event.meta.key);
133
+ }
134
+ if (deps.presentations) {
135
+ for (const pres of deps.presentations.list()) if (!pres.capability) result.presentations.push(pres.meta.key);
136
+ }
137
+ return result;
138
+ }
139
+
140
+ //#endregion
141
+ export { findOrphanSpecs, validateCapabilityConsistency };
@@ -1,8 +1,8 @@
1
1
  import { PresentationSpec, PresentationTarget } from "../../presentations/presentations.js";
2
- import { FeatureModuleSpec } from "../../features/types.js";
3
- import { FeatureRegistry } from "../../features/registry.js";
4
2
  import { ComponentMap, TransformEngine } from "../../presentations/transform-engine.js";
5
3
  import "../../presentations/index.js";
4
+ import { FeatureModuleSpec } from "../../features/types.js";
5
+ import { FeatureRegistry } from "../../features/registry.js";
6
6
  import "../../features/index.js";
7
7
  import React from "react";
8
8
  import { BlockConfig } from "@blocknote/core";
@@ -1,5 +1,6 @@
1
1
  import { DataViewAction, DataViewBaseConfig, DataViewConfig, DataViewDetailConfig, DataViewField, DataViewFieldFormat, DataViewFilter, DataViewGridConfig, DataViewKind, DataViewListConfig, DataViewMeta, DataViewSections, DataViewSource, DataViewStates, DataViewTableColumn, DataViewTableConfig } from "./types.js";
2
- import { DataViewRef, DataViewSpec, defineDataView } from "./spec.js";
2
+ import { DataViewSpec, defineDataView } from "./spec.js";
3
3
  import { DataViewRegistry, dataViewKey } from "./registry.js";
4
4
  import "./index.js";
5
+ import { DataViewRef } from "../features/types.js";
5
6
  export { DataViewAction, DataViewBaseConfig, DataViewConfig, DataViewDetailConfig, DataViewField, DataViewFieldFormat, DataViewFilter, DataViewGridConfig, DataViewKind, DataViewListConfig, DataViewMeta, DataViewRef, DataViewRegistry, DataViewSections, DataViewSource, DataViewSpec, DataViewStates, DataViewTableColumn, DataViewTableConfig, dataViewKey, defineDataView };
@@ -1,4 +1,5 @@
1
1
  import { DataViewAction, DataViewBaseConfig, DataViewConfig, DataViewDetailConfig, DataViewField, DataViewFieldFormat, DataViewFilter, DataViewGridConfig, DataViewKind, DataViewListConfig, DataViewMeta, DataViewSections, DataViewSource, DataViewStates, DataViewTableColumn, DataViewTableConfig } from "./types.js";
2
- import { DataViewRef, DataViewSpec, defineDataView } from "./spec.js";
2
+ import { DataViewSpec, defineDataView } from "./spec.js";
3
3
  import { DataViewRegistry, dataViewKey } from "./registry.js";
4
+ import { DataViewRef } from "../features/types.js";
4
5
  export { type DataViewAction, type DataViewBaseConfig, type DataViewConfig, type DataViewDetailConfig, type DataViewField, type DataViewFieldFormat, type DataViewFilter, type DataViewGridConfig, type DataViewKind, type DataViewListConfig, type DataViewMeta, type DataViewRef, DataViewRegistry, type DataViewSections, type DataViewSource, type DataViewSpec, type DataViewStates, type DataViewTableColumn, type DataViewTableConfig, dataViewKey, defineDataView };
@@ -1,5 +1,5 @@
1
- import { DataViewSpec } from "./spec.js";
2
1
  import { SpecContractRegistry } from "../registry.js";
2
+ import { DataViewSpec } from "./spec.js";
3
3
 
4
4
  //#region src/data-views/registry.d.ts
5
5
 
@@ -0,0 +1,10 @@
1
+ import { DataViewSpec } from "../spec.js";
2
+ import "../index.js";
3
+
4
+ //#region src/data-views/report/contractVerificationTable.d.ts
5
+ /**
6
+ * Data view for the contract verification status table rendered in reports.
7
+ */
8
+ declare const ContractVerificationTableDataView: DataViewSpec;
9
+ //#endregion
10
+ export { ContractVerificationTableDataView };
@@ -0,0 +1,95 @@
1
+ import { StabilityEnum } from "../../ownership.js";
2
+ import { GetContractVerificationStatusQuery } from "../../operations/report/getContractVerificationStatus.js";
3
+ import { defineDataView } from "../spec.js";
4
+
5
+ //#region src/data-views/report/contractVerificationTable.ts
6
+ /**
7
+ * Data view for the contract verification status table rendered in reports.
8
+ */
9
+ const ContractVerificationTableDataView = defineDataView({
10
+ meta: {
11
+ key: "report.contractVerificationTable",
12
+ title: "Contract Verification Table",
13
+ version: "1.0.0",
14
+ description: "Table view of per-contract verification status for the impact report.",
15
+ domain: "report",
16
+ owners: ["platform.core"],
17
+ tags: [
18
+ "report",
19
+ "data-view",
20
+ "verification"
21
+ ],
22
+ stability: StabilityEnum.Experimental,
23
+ entity: "contract-verification"
24
+ },
25
+ source: { primary: {
26
+ key: GetContractVerificationStatusQuery.meta.key,
27
+ version: GetContractVerificationStatusQuery.meta.version
28
+ } },
29
+ view: {
30
+ kind: "table",
31
+ fields: [
32
+ {
33
+ key: "name",
34
+ label: "Contract / Endpoint / Event",
35
+ dataPath: "name"
36
+ },
37
+ {
38
+ key: "timeSinceVerified",
39
+ label: "Time since verified",
40
+ dataPath: "lastVerifiedDate"
41
+ },
42
+ {
43
+ key: "driftMismatches",
44
+ label: "Drift debt",
45
+ dataPath: "driftMismatches",
46
+ format: "number",
47
+ sortable: true
48
+ },
49
+ {
50
+ key: "surfaces",
51
+ label: "Surfaces covered",
52
+ dataPath: "surfaces",
53
+ format: "badge"
54
+ },
55
+ {
56
+ key: "lastVerifiedSha",
57
+ label: "Last verified commit",
58
+ dataPath: "lastVerifiedSha",
59
+ width: "sm"
60
+ }
61
+ ],
62
+ primaryField: "name",
63
+ secondaryFields: ["driftMismatches", "timeSinceVerified"],
64
+ columns: [
65
+ {
66
+ field: "name",
67
+ width: "lg"
68
+ },
69
+ {
70
+ field: "lastVerifiedSha",
71
+ width: "sm"
72
+ },
73
+ {
74
+ field: "timeSinceVerified",
75
+ width: "sm"
76
+ },
77
+ {
78
+ field: "surfaces",
79
+ width: "md"
80
+ },
81
+ {
82
+ field: "driftMismatches",
83
+ width: "xs",
84
+ align: "right"
85
+ }
86
+ ]
87
+ },
88
+ policy: {
89
+ flags: [],
90
+ pii: []
91
+ }
92
+ });
93
+
94
+ //#endregion
95
+ export { ContractVerificationTableDataView };
@@ -1,9 +1,9 @@
1
- import { OperationSpecRegistry } from "../operations/registry.js";
2
- import "../operations/index.js";
3
1
  import { DataViewSpec } from "./spec.js";
4
2
  import { DataViewRegistry } from "./registry.js";
5
3
  import "./index.js";
4
+ import "../operations/index.js";
6
5
  import { HandlerCtx } from "../types.js";
6
+ import { OperationSpecRegistry } from "../operations/registry.js";
7
7
 
8
8
  //#region src/data-views/runtime.d.ts
9
9
  interface DataViewRuntimeConfig {
@@ -1,5 +1,6 @@
1
1
  import { ExperimentRef } from "../experiments/spec.js";
2
2
  import { DataViewConfig, DataViewMeta, DataViewSource, DataViewStates } from "./types.js";
3
+ import { DataViewRef } from "../features/types.js";
3
4
 
4
5
  //#region src/data-views/spec.d.ts
5
6
 
@@ -17,16 +18,9 @@ interface DataViewSpec {
17
18
  };
18
19
  experiments?: ExperimentRef[];
19
20
  }
20
- /**
21
- * Reference to a data view spec.
22
- */
23
- interface DataViewRef {
24
- key: string;
25
- version: string;
26
- }
27
21
  /**
28
22
  * Helper to define a data view spec with type safety.
29
23
  */
30
24
  declare function defineDataView(spec: DataViewSpec): DataViewSpec;
31
25
  //#endregion
32
- export { DataViewRef, DataViewSpec, defineDataView };
26
+ export { type DataViewRef, DataViewSpec, defineDataView };