@contractspec/lib.surface-runtime 0.2.0

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 (232) hide show
  1. package/README.md +164 -0
  2. package/dist/adapters/ai-sdk-stub.d.ts +5 -0
  3. package/dist/adapters/ai-sdk-stub.js +13 -0
  4. package/dist/adapters/blocknote-stub.d.ts +6 -0
  5. package/dist/adapters/blocknote-stub.js +31 -0
  6. package/dist/adapters/dnd-kit-adapter.d.ts +13 -0
  7. package/dist/adapters/dnd-kit-adapter.js +44 -0
  8. package/dist/adapters/dnd-kit-stub.d.ts +6 -0
  9. package/dist/adapters/dnd-kit-stub.js +8 -0
  10. package/dist/adapters/floating-ui-stub.d.ts +6 -0
  11. package/dist/adapters/floating-ui-stub.js +19 -0
  12. package/dist/adapters/index.d.ts +11 -0
  13. package/dist/adapters/index.js +176 -0
  14. package/dist/adapters/interfaces.d.ts +75 -0
  15. package/dist/adapters/interfaces.js +1 -0
  16. package/dist/adapters/motion-stub.d.ts +7 -0
  17. package/dist/adapters/motion-stub.js +27 -0
  18. package/dist/adapters/motion-stub.test.d.ts +1 -0
  19. package/dist/adapters/resizable-panels-stub.d.ts +6 -0
  20. package/dist/adapters/resizable-panels-stub.js +46 -0
  21. package/dist/adapters/resizable-panels-stub.test.d.ts +1 -0
  22. package/dist/browser/adapters/ai-sdk-stub.js +12 -0
  23. package/dist/browser/adapters/blocknote-stub.js +30 -0
  24. package/dist/browser/adapters/dnd-kit-adapter.js +43 -0
  25. package/dist/browser/adapters/dnd-kit-stub.js +7 -0
  26. package/dist/browser/adapters/floating-ui-stub.js +18 -0
  27. package/dist/browser/adapters/index.js +175 -0
  28. package/dist/browser/adapters/interfaces.js +0 -0
  29. package/dist/browser/adapters/motion-stub.js +26 -0
  30. package/dist/browser/adapters/resizable-panels-stub.js +45 -0
  31. package/dist/browser/evals/golden-context.js +0 -0
  32. package/dist/browser/evals/golden-harness.js +848 -0
  33. package/dist/browser/examples/pm-workbench.bundle.js +476 -0
  34. package/dist/browser/i18n/catalogs/en.js +71 -0
  35. package/dist/browser/i18n/catalogs/es.js +32 -0
  36. package/dist/browser/i18n/catalogs/fr.js +32 -0
  37. package/dist/browser/i18n/catalogs/index.js +133 -0
  38. package/dist/browser/i18n/index.js +173 -0
  39. package/dist/browser/i18n/keys.js +19 -0
  40. package/dist/browser/i18n/messages.js +143 -0
  41. package/dist/browser/index.js +2466 -0
  42. package/dist/browser/react/BundleProvider.js +47 -0
  43. package/dist/browser/react/BundleRenderer.js +726 -0
  44. package/dist/browser/react/OverlayConflictResolver.js +255 -0
  45. package/dist/browser/react/PatchProposalCard.js +255 -0
  46. package/dist/browser/react/RegionRenderer.js +128 -0
  47. package/dist/browser/react/SlotRenderer.js +118 -0
  48. package/dist/browser/react/WidgetPalette.js +59 -0
  49. package/dist/browser/react/index.js +792 -0
  50. package/dist/browser/runtime/apply-surface-patch.js +322 -0
  51. package/dist/browser/runtime/audit-events.js +137 -0
  52. package/dist/browser/runtime/build-context.js +55 -0
  53. package/dist/browser/runtime/extension-registry.js +58 -0
  54. package/dist/browser/runtime/field-renderer-registry.js +145 -0
  55. package/dist/browser/runtime/index.js +1496 -0
  56. package/dist/browser/runtime/overlay-alignment.js +83 -0
  57. package/dist/browser/runtime/overlay-signer.js +15 -0
  58. package/dist/browser/runtime/override-store.js +52 -0
  59. package/dist/browser/runtime/planner-prompt.js +67 -0
  60. package/dist/browser/runtime/planner-tools.js +77 -0
  61. package/dist/browser/runtime/policy-eval.js +155 -0
  62. package/dist/browser/runtime/preference-adapter.js +67 -0
  63. package/dist/browser/runtime/resolve-bundle.js +767 -0
  64. package/dist/browser/runtime/resolve-preferences.js +59 -0
  65. package/dist/browser/runtime/rollback.js +347 -0
  66. package/dist/browser/runtime/widget-registry.js +36 -0
  67. package/dist/browser/spec/define-module-bundle.js +113 -0
  68. package/dist/browser/spec/index.js +319 -0
  69. package/dist/browser/spec/types.js +0 -0
  70. package/dist/browser/spec/validate-bundle.js +65 -0
  71. package/dist/browser/spec/validate-surface-patch.js +206 -0
  72. package/dist/browser/spec/verification-snapshot-types.js +0 -0
  73. package/dist/browser/telemetry/index.js +20 -0
  74. package/dist/browser/telemetry/surface-metrics.js +20 -0
  75. package/dist/evals/golden-context.d.ts +24 -0
  76. package/dist/evals/golden-context.js +1 -0
  77. package/dist/evals/golden-harness.d.ts +29 -0
  78. package/dist/evals/golden-harness.js +849 -0
  79. package/dist/evals/golden-harness.test.d.ts +1 -0
  80. package/dist/examples/pm-workbench.bundle.d.ts +177 -0
  81. package/dist/examples/pm-workbench.bundle.js +477 -0
  82. package/dist/i18n/catalogs/en.d.ts +1 -0
  83. package/dist/i18n/catalogs/en.js +72 -0
  84. package/dist/i18n/catalogs/es.d.ts +1 -0
  85. package/dist/i18n/catalogs/es.js +33 -0
  86. package/dist/i18n/catalogs/fr.d.ts +1 -0
  87. package/dist/i18n/catalogs/fr.js +33 -0
  88. package/dist/i18n/catalogs/index.d.ts +3 -0
  89. package/dist/i18n/catalogs/index.js +134 -0
  90. package/dist/i18n/index.d.ts +5 -0
  91. package/dist/i18n/index.js +174 -0
  92. package/dist/i18n/keys.d.ts +20 -0
  93. package/dist/i18n/keys.js +20 -0
  94. package/dist/i18n/messages.d.ts +5 -0
  95. package/dist/i18n/messages.js +144 -0
  96. package/dist/index.d.ts +4 -0
  97. package/dist/index.js +2467 -0
  98. package/dist/node/adapters/ai-sdk-stub.js +12 -0
  99. package/dist/node/adapters/blocknote-stub.js +30 -0
  100. package/dist/node/adapters/dnd-kit-adapter.js +43 -0
  101. package/dist/node/adapters/dnd-kit-stub.js +7 -0
  102. package/dist/node/adapters/floating-ui-stub.js +18 -0
  103. package/dist/node/adapters/index.js +175 -0
  104. package/dist/node/adapters/interfaces.js +0 -0
  105. package/dist/node/adapters/motion-stub.js +26 -0
  106. package/dist/node/adapters/resizable-panels-stub.js +45 -0
  107. package/dist/node/evals/golden-context.js +0 -0
  108. package/dist/node/evals/golden-harness.js +848 -0
  109. package/dist/node/examples/pm-workbench.bundle.js +476 -0
  110. package/dist/node/i18n/catalogs/en.js +71 -0
  111. package/dist/node/i18n/catalogs/es.js +32 -0
  112. package/dist/node/i18n/catalogs/fr.js +32 -0
  113. package/dist/node/i18n/catalogs/index.js +133 -0
  114. package/dist/node/i18n/index.js +173 -0
  115. package/dist/node/i18n/keys.js +19 -0
  116. package/dist/node/i18n/messages.js +143 -0
  117. package/dist/node/index.js +2466 -0
  118. package/dist/node/react/BundleProvider.js +47 -0
  119. package/dist/node/react/BundleRenderer.js +726 -0
  120. package/dist/node/react/OverlayConflictResolver.js +255 -0
  121. package/dist/node/react/PatchProposalCard.js +255 -0
  122. package/dist/node/react/RegionRenderer.js +128 -0
  123. package/dist/node/react/SlotRenderer.js +118 -0
  124. package/dist/node/react/WidgetPalette.js +59 -0
  125. package/dist/node/react/index.js +792 -0
  126. package/dist/node/runtime/apply-surface-patch.js +322 -0
  127. package/dist/node/runtime/audit-events.js +137 -0
  128. package/dist/node/runtime/build-context.js +55 -0
  129. package/dist/node/runtime/extension-registry.js +58 -0
  130. package/dist/node/runtime/field-renderer-registry.js +145 -0
  131. package/dist/node/runtime/index.js +1496 -0
  132. package/dist/node/runtime/overlay-alignment.js +83 -0
  133. package/dist/node/runtime/overlay-signer.js +15 -0
  134. package/dist/node/runtime/override-store.js +52 -0
  135. package/dist/node/runtime/planner-prompt.js +67 -0
  136. package/dist/node/runtime/planner-tools.js +77 -0
  137. package/dist/node/runtime/policy-eval.js +155 -0
  138. package/dist/node/runtime/preference-adapter.js +67 -0
  139. package/dist/node/runtime/resolve-bundle.js +767 -0
  140. package/dist/node/runtime/resolve-preferences.js +59 -0
  141. package/dist/node/runtime/rollback.js +347 -0
  142. package/dist/node/runtime/widget-registry.js +36 -0
  143. package/dist/node/spec/define-module-bundle.js +113 -0
  144. package/dist/node/spec/index.js +319 -0
  145. package/dist/node/spec/types.js +0 -0
  146. package/dist/node/spec/validate-bundle.js +65 -0
  147. package/dist/node/spec/validate-surface-patch.js +206 -0
  148. package/dist/node/spec/verification-snapshot-types.js +0 -0
  149. package/dist/node/telemetry/index.js +20 -0
  150. package/dist/node/telemetry/surface-metrics.js +20 -0
  151. package/dist/react/BundleProvider.d.ts +13 -0
  152. package/dist/react/BundleProvider.js +48 -0
  153. package/dist/react/BundleRenderer.d.ts +22 -0
  154. package/dist/react/BundleRenderer.js +727 -0
  155. package/dist/react/OverlayConflictResolver.d.ts +15 -0
  156. package/dist/react/OverlayConflictResolver.js +256 -0
  157. package/dist/react/PatchProposalCard.d.ts +13 -0
  158. package/dist/react/PatchProposalCard.js +256 -0
  159. package/dist/react/RegionRenderer.d.ts +13 -0
  160. package/dist/react/RegionRenderer.js +129 -0
  161. package/dist/react/SlotRenderer.d.ts +13 -0
  162. package/dist/react/SlotRenderer.js +119 -0
  163. package/dist/react/WidgetPalette.d.ts +12 -0
  164. package/dist/react/WidgetPalette.js +60 -0
  165. package/dist/react/index.d.ts +7 -0
  166. package/dist/react/index.js +793 -0
  167. package/dist/runtime/apply-surface-patch.d.ts +15 -0
  168. package/dist/runtime/apply-surface-patch.js +323 -0
  169. package/dist/runtime/apply-surface-patch.test.d.ts +1 -0
  170. package/dist/runtime/audit-events.d.ts +70 -0
  171. package/dist/runtime/audit-events.js +138 -0
  172. package/dist/runtime/audit-events.test.d.ts +1 -0
  173. package/dist/runtime/build-context.d.ts +9 -0
  174. package/dist/runtime/build-context.js +56 -0
  175. package/dist/runtime/extension-registry.d.ts +39 -0
  176. package/dist/runtime/extension-registry.js +59 -0
  177. package/dist/runtime/field-renderer-registry.d.ts +23 -0
  178. package/dist/runtime/field-renderer-registry.js +146 -0
  179. package/dist/runtime/field-renderer-registry.test.d.ts +1 -0
  180. package/dist/runtime/index.d.ts +16 -0
  181. package/dist/runtime/index.js +1497 -0
  182. package/dist/runtime/overlay-alignment.d.ts +49 -0
  183. package/dist/runtime/overlay-alignment.js +84 -0
  184. package/dist/runtime/overlay-alignment.test.d.ts +1 -0
  185. package/dist/runtime/overlay-signer.d.ts +15 -0
  186. package/dist/runtime/overlay-signer.js +16 -0
  187. package/dist/runtime/override-store.d.ts +44 -0
  188. package/dist/runtime/override-store.js +53 -0
  189. package/dist/runtime/override-store.test.d.ts +1 -0
  190. package/dist/runtime/planner-prompt.d.ts +39 -0
  191. package/dist/runtime/planner-prompt.js +68 -0
  192. package/dist/runtime/planner-prompt.test.d.ts +1 -0
  193. package/dist/runtime/planner-tools.d.ts +106 -0
  194. package/dist/runtime/planner-tools.js +78 -0
  195. package/dist/runtime/planner-tools.test.d.ts +1 -0
  196. package/dist/runtime/policy-eval.d.ts +23 -0
  197. package/dist/runtime/policy-eval.js +156 -0
  198. package/dist/runtime/preference-adapter.d.ts +6 -0
  199. package/dist/runtime/preference-adapter.js +68 -0
  200. package/dist/runtime/resolve-bundle.d.ts +68 -0
  201. package/dist/runtime/resolve-bundle.js +768 -0
  202. package/dist/runtime/resolve-bundle.test.d.ts +1 -0
  203. package/dist/runtime/resolve-preferences.d.ts +9 -0
  204. package/dist/runtime/resolve-preferences.js +60 -0
  205. package/dist/runtime/resolve-preferences.test.d.ts +1 -0
  206. package/dist/runtime/rollback.d.ts +21 -0
  207. package/dist/runtime/rollback.js +348 -0
  208. package/dist/runtime/rollback.test.d.ts +1 -0
  209. package/dist/runtime/widget-registry.d.ts +26 -0
  210. package/dist/runtime/widget-registry.js +37 -0
  211. package/dist/runtime/widget-registry.test.d.ts +1 -0
  212. package/dist/spec/define-module-bundle.d.ts +17 -0
  213. package/dist/spec/define-module-bundle.js +114 -0
  214. package/dist/spec/define-module-bundle.test.d.ts +1 -0
  215. package/dist/spec/index.d.ts +5 -0
  216. package/dist/spec/index.js +320 -0
  217. package/dist/spec/types.d.ts +494 -0
  218. package/dist/spec/types.js +1 -0
  219. package/dist/spec/validate-bundle.d.ts +23 -0
  220. package/dist/spec/validate-bundle.js +66 -0
  221. package/dist/spec/validate-bundle.test.d.ts +1 -0
  222. package/dist/spec/validate-surface-patch.d.ts +39 -0
  223. package/dist/spec/validate-surface-patch.js +207 -0
  224. package/dist/spec/validate-surface-patch.test.d.ts +1 -0
  225. package/dist/spec/verification-snapshot-types.d.ts +23 -0
  226. package/dist/spec/verification-snapshot-types.js +1 -0
  227. package/dist/spec/verification-snapshot.test.d.ts +5 -0
  228. package/dist/telemetry/index.d.ts +5 -0
  229. package/dist/telemetry/index.js +21 -0
  230. package/dist/telemetry/surface-metrics.d.ts +17 -0
  231. package/dist/telemetry/surface-metrics.js +21 -0
  232. package/package.json +920 -0
@@ -0,0 +1,156 @@
1
+ // @bun
2
+ // src/runtime/audit-events.ts
3
+ function generateEventId() {
4
+ return `evt_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
5
+ }
6
+ function emitPatchProposed(audit, args) {
7
+ audit.emit({
8
+ eventId: generateEventId(),
9
+ at: new Date().toISOString(),
10
+ actorId: args.actorId,
11
+ source: args.proposal.source === "assistant" ? "assistant" : "user",
12
+ bundleKey: args.bundleKey,
13
+ surfaceId: args.surfaceId,
14
+ eventType: "patch.proposed",
15
+ payload: {
16
+ proposalId: args.proposal.proposalId,
17
+ source: args.proposal.source,
18
+ opsCount: args.proposal.ops.length
19
+ }
20
+ });
21
+ }
22
+ function emitPatchApproved(audit, args) {
23
+ audit.emit({
24
+ eventId: generateEventId(),
25
+ at: new Date().toISOString(),
26
+ actorId: args.actorId,
27
+ source: "user",
28
+ bundleKey: args.bundleKey,
29
+ surfaceId: args.surfaceId,
30
+ eventType: "patch.approved",
31
+ payload: {
32
+ proposalId: args.proposalId,
33
+ source: args.source,
34
+ opsCount: args.opsCount,
35
+ reason: args.reason
36
+ }
37
+ });
38
+ }
39
+ function emitPatchRejected(audit, args) {
40
+ audit.emit({
41
+ eventId: generateEventId(),
42
+ at: new Date().toISOString(),
43
+ actorId: args.actorId,
44
+ source: "user",
45
+ bundleKey: args.bundleKey,
46
+ surfaceId: args.surfaceId,
47
+ eventType: "patch.rejected",
48
+ payload: {
49
+ proposalId: args.proposalId,
50
+ source: args.source,
51
+ opsCount: args.opsCount,
52
+ reason: args.reason
53
+ }
54
+ });
55
+ }
56
+ function emitOverlaySaved(audit, args) {
57
+ audit.emit({
58
+ eventId: generateEventId(),
59
+ at: new Date().toISOString(),
60
+ actorId: args.actorId,
61
+ source: "user",
62
+ bundleKey: args.bundleKey,
63
+ eventType: "overlay.saved",
64
+ payload: {
65
+ overlayId: args.overlayId,
66
+ scope: args.scope,
67
+ opsCount: args.opsCount
68
+ }
69
+ });
70
+ }
71
+ function emitOverlayApplied(audit, args) {
72
+ audit.emit({
73
+ eventId: generateEventId(),
74
+ at: new Date().toISOString(),
75
+ source: "system",
76
+ bundleKey: args.bundleKey,
77
+ surfaceId: args.surfaceId,
78
+ eventType: "overlay.applied",
79
+ payload: {
80
+ overlayId: args.overlayId,
81
+ opsCount: args.opsCount
82
+ }
83
+ });
84
+ }
85
+ function emitOverlayFailed(audit, args) {
86
+ audit.emit({
87
+ eventId: generateEventId(),
88
+ at: new Date().toISOString(),
89
+ source: "system",
90
+ bundleKey: args.bundleKey,
91
+ surfaceId: args.surfaceId,
92
+ eventType: "overlay.failed",
93
+ payload: {
94
+ overlayId: args.overlayId,
95
+ error: args.error
96
+ }
97
+ });
98
+ }
99
+ function emitPolicyDenied(audit, args) {
100
+ audit.emit({
101
+ eventId: generateEventId(),
102
+ at: new Date().toISOString(),
103
+ actorId: args.actorId,
104
+ source: "policy",
105
+ bundleKey: args.bundleKey,
106
+ surfaceId: args.surfaceId,
107
+ eventType: "policy.denied",
108
+ payload: {
109
+ targetId: args.targetId,
110
+ reason: args.reason
111
+ }
112
+ });
113
+ }
114
+ function emitPolicyRedacted(audit, args) {
115
+ audit.emit({
116
+ eventId: generateEventId(),
117
+ at: new Date().toISOString(),
118
+ actorId: args.actorId,
119
+ source: "policy",
120
+ bundleKey: args.bundleKey,
121
+ surfaceId: args.surfaceId,
122
+ eventType: "policy.redacted",
123
+ payload: {
124
+ targetId: args.targetId,
125
+ redactions: args.redactions
126
+ }
127
+ });
128
+ }
129
+
130
+ // src/runtime/policy-eval.ts
131
+ function evaluatePatchProposalPolicy(ops, ctx, policy) {
132
+ const evaluate = policy?.evaluatePatchProposal;
133
+ if (!evaluate)
134
+ return "allow";
135
+ return evaluate(ops, ctx);
136
+ }
137
+ function evaluateAndEmitPatchPolicy(ops, ctx, args) {
138
+ const effect = evaluatePatchProposalPolicy(ops, ctx, args.policy);
139
+ if (effect === "deny") {
140
+ if (args.audit) {
141
+ emitPolicyDenied(args.audit, {
142
+ bundleKey: args.bundleKey,
143
+ surfaceId: args.surfaceId,
144
+ targetId: args.targetId ?? "patch-proposal",
145
+ reason: "Policy denied patch proposal",
146
+ actorId: ctx.actorId
147
+ });
148
+ }
149
+ return false;
150
+ }
151
+ return true;
152
+ }
153
+ export {
154
+ evaluatePatchProposalPolicy,
155
+ evaluateAndEmitPatchPolicy
156
+ };
@@ -0,0 +1,6 @@
1
+ import type { BundlePreferenceAdapter } from '../spec/types';
2
+ /**
3
+ * Default preference adapter. Uses in-memory resolution; savePreferencePatch is a no-op stub.
4
+ * Integrate with lib.personalization or lib.overlay-engine for persistence.
5
+ */
6
+ export declare const defaultPreferenceAdapter: BundlePreferenceAdapter;
@@ -0,0 +1,68 @@
1
+ // @bun
2
+ // src/runtime/resolve-preferences.ts
3
+ var DIMENSION_KEYS = [
4
+ "guidance",
5
+ "density",
6
+ "dataDepth",
7
+ "control",
8
+ "media",
9
+ "pace",
10
+ "narrative"
11
+ ];
12
+ var SCOPE_ORDER = [
13
+ "user",
14
+ "workspace-user",
15
+ "bundle",
16
+ "surface",
17
+ "entity",
18
+ "session"
19
+ ];
20
+ function mergeByScope(layers, ctx) {
21
+ const merged = { ...ctx.preferences };
22
+ const sourceByDimension = {};
23
+ for (const scope of SCOPE_ORDER) {
24
+ const layer = layers[scope];
25
+ if (!layer)
26
+ continue;
27
+ for (const dim of DIMENSION_KEYS) {
28
+ const val = layer[dim];
29
+ if (val !== undefined) {
30
+ merged[dim] = val;
31
+ sourceByDimension[dim] = scope;
32
+ }
33
+ }
34
+ }
35
+ for (const dim of DIMENSION_KEYS) {
36
+ if (sourceByDimension[dim] === undefined) {
37
+ sourceByDimension[dim] = "session";
38
+ }
39
+ }
40
+ return { canonical: merged, sourceByDimension };
41
+ }
42
+ function resolveConstraints(_canonical, _ctx) {
43
+ return { constrained: {}, notes: [] };
44
+ }
45
+ function resolvePreferenceProfile(ctx) {
46
+ const layers = {
47
+ session: ctx.preferences
48
+ };
49
+ const { canonical, sourceByDimension } = mergeByScope(layers, ctx);
50
+ const { constrained, notes } = resolveConstraints(canonical, ctx);
51
+ return {
52
+ canonical,
53
+ sourceByDimension,
54
+ constrained,
55
+ notes
56
+ };
57
+ }
58
+
59
+ // src/runtime/preference-adapter.ts
60
+ var defaultPreferenceAdapter = {
61
+ async resolve(ctx) {
62
+ return resolvePreferenceProfile(ctx);
63
+ },
64
+ async savePreferencePatch(_args) {}
65
+ };
66
+ export {
67
+ defaultPreferenceAdapter
68
+ };
@@ -0,0 +1,68 @@
1
+ import type { ActionSpec, AppliedOverlayMeta, BundleContext, BundleScope, CommandSpec, ModuleBundleSpec, RegionNode, ResolvedAdaptation, SurfaceNode, SurfacePatchProposal, UiPolicyDecision, BundleAuditEmitter } from '../spec/types';
2
+ import type { BundleOverrideStore } from './override-store';
3
+ export interface OverlayConflict {
4
+ targetKey: string;
5
+ scopeA: BundleScope;
6
+ scopeB: BundleScope;
7
+ overlayIdA: string;
8
+ overlayIdB: string;
9
+ }
10
+ export interface ResolvedSurfacePlan {
11
+ bundleKey: string;
12
+ surfaceId: string;
13
+ layoutId: string;
14
+ /** Resolved layout root for rendering. */
15
+ layoutRoot: RegionNode;
16
+ nodes: SurfaceNode[];
17
+ actions: ActionSpec[];
18
+ commands: CommandSpec[];
19
+ bindings: Record<string, unknown>;
20
+ adaptation: ResolvedAdaptation;
21
+ overlays: AppliedOverlayMeta[];
22
+ overlayConflicts?: OverlayConflict[];
23
+ ai: {
24
+ plannerId?: string;
25
+ proposals?: SurfacePatchProposal[];
26
+ };
27
+ audit: {
28
+ resolutionId: string;
29
+ createdAt: string;
30
+ reasons: string[];
31
+ };
32
+ /** Locale for i18n (from BundleContext). Used by UI components. */
33
+ locale?: string;
34
+ }
35
+ /** Policy effect for patch proposal evaluation. */
36
+ export type PatchPolicyEffect = 'allow' | 'deny' | 'require-approval';
37
+ /** Policy hooks for PDP integration. Stub PDP returns allow by default. */
38
+ export interface PolicyHooks<C extends BundleContext> {
39
+ /** Evaluate node visibility. Return allow/deny/redact. Stub: allow all. */
40
+ evaluateNode?: (node: SurfaceNode, ctx: C) => UiPolicyDecision;
41
+ /** Redact binding value. Stub: pass-through. */
42
+ redactBinding?: (key: string, ctx: C) => unknown;
43
+ /** Evaluate patch proposal before approval. Stub: allow. */
44
+ evaluatePatchProposal?: (ops: import('../spec/types').SurfacePatchOp[], ctx: C) => PatchPolicyEffect;
45
+ }
46
+ export interface OverlayMergeOptions {
47
+ overrideStore: BundleOverrideStore;
48
+ /** Scopes to fetch (default: system, workspace, user, session). */
49
+ scopes?: BundleScope[];
50
+ }
51
+ export interface ResolveBundleOptions<C extends BundleContext> {
52
+ /** Optional policy hooks for allow/deny/redact. Stub PDP returns allow. */
53
+ policy?: PolicyHooks<C>;
54
+ /** Optional audit emitter. Emits surface.resolved on resolution. */
55
+ audit?: BundleAuditEmitter;
56
+ /** Optional overlay merge. Applies stored overlays in precedence order. */
57
+ overlayMerge?: OverlayMergeOptions;
58
+ }
59
+ /**
60
+ * Resolves a bundle spec and context into a concrete surface plan.
61
+ * Fallback chain: surface → simpler layout → overview → error surface.
62
+ *
63
+ * @param spec - The module bundle spec
64
+ * @param ctx - The bundle context (route, preferences, etc.)
65
+ * @param options - Optional policy hooks
66
+ * @returns Resolved surface plan with layout, nodes, bindings, and audit
67
+ */
68
+ export declare function resolveBundle<C extends BundleContext>(spec: ModuleBundleSpec<C>, ctx: C, options?: ResolveBundleOptions<C>): Promise<ResolvedSurfacePlan>;