@backbay/glia 0.2.0-alpha.7 → 0.2.0-alpha.8

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 (226) hide show
  1. package/dist/audio/index.js +1145 -5
  2. package/dist/audio/index.js.map +1 -1
  3. package/dist/components/index.js +3187 -10
  4. package/dist/components/index.js.map +1 -1
  5. package/dist/core.js +19714 -12
  6. package/dist/core.js.map +1 -1
  7. package/dist/emotion/index.js +1 -1
  8. package/dist/emotion/index.js.map +1 -1
  9. package/dist/hooks/index.js +941 -6
  10. package/dist/hooks/index.js.map +1 -1
  11. package/dist/index.js +31841 -183
  12. package/dist/index.js.map +1 -1
  13. package/dist/primitives/index.js +21111 -57
  14. package/dist/primitives/index.js.map +1 -1
  15. package/dist/protocol/index.js +360 -2
  16. package/dist/protocol/index.js.map +1 -1
  17. package/dist/speakeasy/index.js +2786 -38
  18. package/dist/speakeasy/index.js.map +1 -1
  19. package/dist/styles.css +1 -1
  20. package/dist/theme/index.js +1150 -3
  21. package/dist/theme/index.js.map +1 -1
  22. package/dist/vision/index.js +370 -2
  23. package/dist/vision/index.js.map +1 -1
  24. package/dist/workspace/index.js +16824 -2
  25. package/dist/workspace/index.js.map +1 -1
  26. package/package.json +15 -9
  27. package/dist/AuroraBackground-AP6ZHVFA.js +0 -6
  28. package/dist/AuroraBackground-AP6ZHVFA.js.map +0 -1
  29. package/dist/BentoGrid-CDARICNM.js +0 -6
  30. package/dist/BentoGrid-CDARICNM.js.map +0 -1
  31. package/dist/CommandPalette-JCWJKRBY.js +0 -6
  32. package/dist/CommandPalette-JCWJKRBY.js.map +0 -1
  33. package/dist/Glass-H4X4ZI4P.js +0 -7
  34. package/dist/Glass-H4X4ZI4P.js.map +0 -1
  35. package/dist/GlitchText-KLQ57PPY.js +0 -6
  36. package/dist/GlitchText-KLQ57PPY.js.map +0 -1
  37. package/dist/GlowButton-VGBPMZO7.js +0 -6
  38. package/dist/GlowButton-VGBPMZO7.js.map +0 -1
  39. package/dist/Graph3D-GO7N2EZQ.js +0 -540
  40. package/dist/Graph3D-GO7N2EZQ.js.map +0 -1
  41. package/dist/HUDProgressRing-N6C5NAEV.js +0 -6
  42. package/dist/HUDProgressRing-N6C5NAEV.js.map +0 -1
  43. package/dist/KPIStat-PBQK27ZB.js +0 -6
  44. package/dist/KPIStat-PBQK27ZB.js.map +0 -1
  45. package/dist/NeonToast-W5F7MU3U.js +0 -6
  46. package/dist/NeonToast-W5F7MU3U.js.map +0 -1
  47. package/dist/ParticleField-WK6CNHWU.js +0 -51
  48. package/dist/ParticleField-WK6CNHWU.js.map +0 -1
  49. package/dist/TextGenerateEffect-EUCEIIUJ.js +0 -6
  50. package/dist/TextGenerateEffect-EUCEIIUJ.js.map +0 -1
  51. package/dist/ThreeDCard-VH5I3SSY.js +0 -6
  52. package/dist/ThreeDCard-VH5I3SSY.js.map +0 -1
  53. package/dist/TypingAnimation-GIWOHPIX.js +0 -6
  54. package/dist/TypingAnimation-GIWOHPIX.js.map +0 -1
  55. package/dist/alert-dialog-QOSYBIIE.js +0 -19
  56. package/dist/alert-dialog-QOSYBIIE.js.map +0 -1
  57. package/dist/avatar-N5R37PCU.js +0 -10
  58. package/dist/avatar-N5R37PCU.js.map +0 -1
  59. package/dist/badge-GTVIIGPY.js +0 -8
  60. package/dist/badge-GTVIIGPY.js.map +0 -1
  61. package/dist/button-D7IMSV2D.js +0 -8
  62. package/dist/button-D7IMSV2D.js.map +0 -1
  63. package/dist/chunk-3CMPQOMY.js +0 -69
  64. package/dist/chunk-3CMPQOMY.js.map +0 -1
  65. package/dist/chunk-3OQT6IYR.js +0 -41
  66. package/dist/chunk-3OQT6IYR.js.map +0 -1
  67. package/dist/chunk-43B2WVLS.js +0 -85
  68. package/dist/chunk-43B2WVLS.js.map +0 -1
  69. package/dist/chunk-4SRFO5W3.js +0 -121
  70. package/dist/chunk-4SRFO5W3.js.map +0 -1
  71. package/dist/chunk-5IZELOOU.js +0 -362
  72. package/dist/chunk-5IZELOOU.js.map +0 -1
  73. package/dist/chunk-6DM4ACSS.js +0 -154
  74. package/dist/chunk-6DM4ACSS.js.map +0 -1
  75. package/dist/chunk-6IGT34PC.js +0 -50
  76. package/dist/chunk-6IGT34PC.js.map +0 -1
  77. package/dist/chunk-6RKBCJHN.js +0 -194
  78. package/dist/chunk-6RKBCJHN.js.map +0 -1
  79. package/dist/chunk-6RX2WGCO.js +0 -108
  80. package/dist/chunk-6RX2WGCO.js.map +0 -1
  81. package/dist/chunk-7K4WZM3U.js +0 -189
  82. package/dist/chunk-7K4WZM3U.js.map +0 -1
  83. package/dist/chunk-7MDBHJPT.js +0 -407
  84. package/dist/chunk-7MDBHJPT.js.map +0 -1
  85. package/dist/chunk-7UQD6ROV.js +0 -9
  86. package/dist/chunk-7UQD6ROV.js.map +0 -1
  87. package/dist/chunk-AFNIVLZP.js +0 -1069
  88. package/dist/chunk-AFNIVLZP.js.map +0 -1
  89. package/dist/chunk-ANWYRO6A.js +0 -407
  90. package/dist/chunk-ANWYRO6A.js.map +0 -1
  91. package/dist/chunk-DIXPOHDO.js +0 -71
  92. package/dist/chunk-DIXPOHDO.js.map +0 -1
  93. package/dist/chunk-DWYMKYPI.js +0 -3
  94. package/dist/chunk-DWYMKYPI.js.map +0 -1
  95. package/dist/chunk-E3NVDCZG.js +0 -280
  96. package/dist/chunk-E3NVDCZG.js.map +0 -1
  97. package/dist/chunk-EBM7YBKL.js +0 -399
  98. package/dist/chunk-EBM7YBKL.js.map +0 -1
  99. package/dist/chunk-EPAM7IWW.js +0 -294
  100. package/dist/chunk-EPAM7IWW.js.map +0 -1
  101. package/dist/chunk-EXQ7GYRS.js +0 -134
  102. package/dist/chunk-EXQ7GYRS.js.map +0 -1
  103. package/dist/chunk-F4QTUZ3C.js +0 -136
  104. package/dist/chunk-F4QTUZ3C.js.map +0 -1
  105. package/dist/chunk-FEW533R2.js +0 -105
  106. package/dist/chunk-FEW533R2.js.map +0 -1
  107. package/dist/chunk-FFZLJKC7.js +0 -270
  108. package/dist/chunk-FFZLJKC7.js.map +0 -1
  109. package/dist/chunk-GEAMOBF7.js +0 -8486
  110. package/dist/chunk-GEAMOBF7.js.map +0 -1
  111. package/dist/chunk-GRTRSCTD.js +0 -74
  112. package/dist/chunk-GRTRSCTD.js.map +0 -1
  113. package/dist/chunk-IKGYOGLK.js +0 -16
  114. package/dist/chunk-IKGYOGLK.js.map +0 -1
  115. package/dist/chunk-IQ7WYWVJ.js +0 -73
  116. package/dist/chunk-IQ7WYWVJ.js.map +0 -1
  117. package/dist/chunk-IXIVWQLF.js +0 -543
  118. package/dist/chunk-IXIVWQLF.js.map +0 -1
  119. package/dist/chunk-JCJU57RC.js +0 -115
  120. package/dist/chunk-JCJU57RC.js.map +0 -1
  121. package/dist/chunk-KORSTBU4.js +0 -117
  122. package/dist/chunk-KORSTBU4.js.map +0 -1
  123. package/dist/chunk-KSEZ6UM2.js +0 -235
  124. package/dist/chunk-KSEZ6UM2.js.map +0 -1
  125. package/dist/chunk-MHPF7R3O.js +0 -1376
  126. package/dist/chunk-MHPF7R3O.js.map +0 -1
  127. package/dist/chunk-MPC5IH7E.js +0 -81
  128. package/dist/chunk-MPC5IH7E.js.map +0 -1
  129. package/dist/chunk-MQIU2NYA.js +0 -114
  130. package/dist/chunk-MQIU2NYA.js.map +0 -1
  131. package/dist/chunk-NYMBJOGR.js +0 -2192
  132. package/dist/chunk-NYMBJOGR.js.map +0 -1
  133. package/dist/chunk-OBZD2M3C.js +0 -169
  134. package/dist/chunk-OBZD2M3C.js.map +0 -1
  135. package/dist/chunk-ODM2AG6G.js +0 -176
  136. package/dist/chunk-ODM2AG6G.js.map +0 -1
  137. package/dist/chunk-ONDKF5LP.js +0 -53
  138. package/dist/chunk-ONDKF5LP.js.map +0 -1
  139. package/dist/chunk-P25YCWQB.js +0 -41
  140. package/dist/chunk-P25YCWQB.js.map +0 -1
  141. package/dist/chunk-PFYVNM6H.js +0 -14
  142. package/dist/chunk-PFYVNM6H.js.map +0 -1
  143. package/dist/chunk-PWNNSGFL.js +0 -20
  144. package/dist/chunk-PWNNSGFL.js.map +0 -1
  145. package/dist/chunk-Q2PGZVOT.js +0 -36
  146. package/dist/chunk-Q2PGZVOT.js.map +0 -1
  147. package/dist/chunk-Q2XDMV7U.js +0 -76
  148. package/dist/chunk-Q2XDMV7U.js.map +0 -1
  149. package/dist/chunk-QG7FH2FI.js +0 -45
  150. package/dist/chunk-QG7FH2FI.js.map +0 -1
  151. package/dist/chunk-R7HUOK2D.js +0 -1914
  152. package/dist/chunk-R7HUOK2D.js.map +0 -1
  153. package/dist/chunk-REUYY7G5.js +0 -773
  154. package/dist/chunk-REUYY7G5.js.map +0 -1
  155. package/dist/chunk-RHC2Z2HT.js +0 -199
  156. package/dist/chunk-RHC2Z2HT.js.map +0 -1
  157. package/dist/chunk-RMCVLIFE.js +0 -23
  158. package/dist/chunk-RMCVLIFE.js.map +0 -1
  159. package/dist/chunk-ROZLTXGR.js +0 -234
  160. package/dist/chunk-ROZLTXGR.js.map +0 -1
  161. package/dist/chunk-RSS2C2O3.js +0 -17
  162. package/dist/chunk-RSS2C2O3.js.map +0 -1
  163. package/dist/chunk-SAGCG5SH.js +0 -355
  164. package/dist/chunk-SAGCG5SH.js.map +0 -1
  165. package/dist/chunk-TM6AOUSD.js +0 -40
  166. package/dist/chunk-TM6AOUSD.js.map +0 -1
  167. package/dist/chunk-TPK4BYCO.js +0 -970
  168. package/dist/chunk-TPK4BYCO.js.map +0 -1
  169. package/dist/chunk-UNQIL4K2.js +0 -34
  170. package/dist/chunk-UNQIL4K2.js.map +0 -1
  171. package/dist/chunk-UUG6L75Y.js +0 -47
  172. package/dist/chunk-UUG6L75Y.js.map +0 -1
  173. package/dist/chunk-V2SYMV4W.js +0 -114
  174. package/dist/chunk-V2SYMV4W.js.map +0 -1
  175. package/dist/chunk-V7EN5CTH.js +0 -130
  176. package/dist/chunk-V7EN5CTH.js.map +0 -1
  177. package/dist/chunk-VITKG2HL.js +0 -1125
  178. package/dist/chunk-VITKG2HL.js.map +0 -1
  179. package/dist/chunk-VYEWU5LO.js +0 -2631
  180. package/dist/chunk-VYEWU5LO.js.map +0 -1
  181. package/dist/chunk-W67QAGSH.js +0 -178
  182. package/dist/chunk-W67QAGSH.js.map +0 -1
  183. package/dist/chunk-WWBIN6KV.js +0 -1353
  184. package/dist/chunk-WWBIN6KV.js.map +0 -1
  185. package/dist/chunk-X77Z4PFB.js +0 -224
  186. package/dist/chunk-X77Z4PFB.js.map +0 -1
  187. package/dist/chunk-X7VG7OTT.js +0 -8
  188. package/dist/chunk-X7VG7OTT.js.map +0 -1
  189. package/dist/chunk-XE4K2SGI.js +0 -74
  190. package/dist/chunk-XE4K2SGI.js.map +0 -1
  191. package/dist/chunk-YIUG7IJK.js +0 -628
  192. package/dist/chunk-YIUG7IJK.js.map +0 -1
  193. package/dist/chunk-YNVN3V4Y.js +0 -13
  194. package/dist/chunk-YNVN3V4Y.js.map +0 -1
  195. package/dist/chunk-Z2S54IZX.js +0 -198
  196. package/dist/chunk-Z2S54IZX.js.map +0 -1
  197. package/dist/chunk-ZR6AH25Z.js +0 -17
  198. package/dist/chunk-ZR6AH25Z.js.map +0 -1
  199. package/dist/dialog-SPM3DTTI.js +0 -17
  200. package/dist/dialog-SPM3DTTI.js.map +0 -1
  201. package/dist/dropdown-menu-HMTWKWGK.js +0 -21
  202. package/dist/dropdown-menu-HMTWKWGK.js.map +0 -1
  203. package/dist/input-BH4P4S26.js +0 -6
  204. package/dist/input-BH4P4S26.js.map +0 -1
  205. package/dist/label-5Z4Q6VER.js +0 -8
  206. package/dist/label-5Z4Q6VER.js.map +0 -1
  207. package/dist/popover-IFOUXYLI.js +0 -18
  208. package/dist/popover-IFOUXYLI.js.map +0 -1
  209. package/dist/scroll-area-DJXNW6QX.js +0 -14
  210. package/dist/scroll-area-DJXNW6QX.js.map +0 -1
  211. package/dist/select-FZ277C3G.js +0 -22
  212. package/dist/select-FZ277C3G.js.map +0 -1
  213. package/dist/separator-BTMLN4NB.js +0 -8
  214. package/dist/separator-BTMLN4NB.js.map +0 -1
  215. package/dist/skeleton-DXIWBH4W.js +0 -6
  216. package/dist/skeleton-DXIWBH4W.js.map +0 -1
  217. package/dist/switch-4MCXIZBY.js +0 -13
  218. package/dist/switch-4MCXIZBY.js.map +0 -1
  219. package/dist/tabs-O7AW3APK.js +0 -17
  220. package/dist/tabs-O7AW3APK.js.map +0 -1
  221. package/dist/textarea-IB5WAFDO.js +0 -6
  222. package/dist/textarea-IB5WAFDO.js.map +0 -1
  223. package/dist/toggle-XVPPG6P4.js +0 -10
  224. package/dist/toggle-XVPPG6P4.js.map +0 -1
  225. package/dist/tooltip-JICZTD4F.js +0 -18
  226. package/dist/tooltip-JICZTD4F.js.map +0 -1
@@ -1,4 +1,362 @@
1
- export { AuthConfigSchema, AuthTypeSchema, BBManifestSchema, BBStateSchema, CapabilitySchema, CapabilityTypeSchema, ConfirmationTypeSchema, ConstraintConfigSchema, CostEstimateSchema, EntitySchemaSchema, InputFieldSchema, InputTypeSchema, LatencyEstimateSchema, OutputFieldSchema, RiskLevelSchema, assertValidId, extractAllEntities, extractEntity, extractFieldValue, fetchManifest, findAction, findAllActionElements, findAllActions, findAllEntities, findEntity, findField, findInput, findManifestUrl, findOutput, generateDocumentId, generateRunId, generateSessionId, generateWorkspaceId, getActionId, getAvailableActions, getCost, getDescription, getEntityId, getEntityType, getFieldName, getInputs, getState, isActionAvailable, isAuthenticated, isValidId, observeState, parseManifest, requiresConfirmation, setState, toAgentId, toCapabilityId, toComponentId, toDocumentId, toEntityTypeId, toRunId, toSessionId, toWorkspaceId, validateCapability, validateEntitySchema, validateManifest, waitForState } from '../chunk-5IZELOOU.js';
2
- import '../chunk-TM6AOUSD.js';
1
+ import { z } from 'zod';
2
+
3
+ // src/protocol/schema.ts
4
+ var CapabilityTypeSchema = z.enum(["query", "mutation", "workflow"]);
5
+ var RiskLevelSchema = z.enum(["low", "medium", "high"]);
6
+ var InputTypeSchema = z.enum(["string", "number", "boolean", "date", "file", "select"]);
7
+ var AuthTypeSchema = z.enum(["none", "session", "oauth", "api-key"]);
8
+ var ConfirmationTypeSchema = z.enum(["none", "optional", "required"]);
9
+ var BBStateSchema = z.enum([
10
+ "idle",
11
+ "loading",
12
+ "success",
13
+ "error",
14
+ "disabled",
15
+ "hidden",
16
+ "requires-auth"
17
+ ]);
18
+ var InputFieldSchema = z.object({
19
+ name: z.string().min(1),
20
+ type: InputTypeSchema,
21
+ required: z.boolean().optional(),
22
+ default: z.unknown().optional(),
23
+ options: z.array(z.string()).optional(),
24
+ from: z.string().optional(),
25
+ selector: z.string().optional()
26
+ });
27
+ var OutputFieldSchema = z.object({
28
+ name: z.string().min(1),
29
+ type: z.string().min(1),
30
+ selector: z.string().optional()
31
+ });
32
+ var CostEstimateSchema = z.object({
33
+ usd: z.union([z.number(), z.literal("variable")]).optional(),
34
+ tokens: z.number().optional(),
35
+ risk: RiskLevelSchema
36
+ });
37
+ var LatencyEstimateSchema = z.object({
38
+ typical: z.number().positive(),
39
+ max: z.number().positive().optional()
40
+ });
41
+ var CapabilitySchema = z.object({
42
+ id: z.string().min(1).regex(/^[a-z][a-z0-9-]*$/, "ID must be kebab-case"),
43
+ type: CapabilityTypeSchema,
44
+ description: z.string().min(1),
45
+ entry: z.string().optional(),
46
+ selector: z.string().min(1),
47
+ inputs: z.array(InputFieldSchema).optional(),
48
+ outputs: z.array(OutputFieldSchema).optional(),
49
+ cost: CostEstimateSchema.optional(),
50
+ latency: LatencyEstimateSchema.optional(),
51
+ requires: z.array(z.string()).optional(),
52
+ confirmation: ConfirmationTypeSchema.optional(),
53
+ steps: z.array(z.string()).optional()
54
+ }).refine(
55
+ (data) => {
56
+ if (data.type === "workflow" && (!data.steps || data.steps.length === 0)) {
57
+ return false;
58
+ }
59
+ return true;
60
+ },
61
+ { message: "Workflow capabilities must have steps defined" }
62
+ );
63
+ var EntitySchemaSchema = z.object({
64
+ selector: z.string().min(1),
65
+ fields: z.record(z.string(), z.string()),
66
+ actions: z.array(z.string()).optional()
67
+ });
68
+ var AuthConfigSchema = z.object({
69
+ type: AuthTypeSchema,
70
+ loginUrl: z.string().optional(),
71
+ logoutUrl: z.string().optional(),
72
+ indicator: z.string().optional(),
73
+ scopes: z.array(z.string()).optional(),
74
+ header: z.string().optional(),
75
+ documentationUrl: z.string().optional()
76
+ });
77
+ var RateLimitSchema = z.object({
78
+ requests: z.number().positive(),
79
+ window: z.string().regex(/^\d+[smhd]$/, 'Window must be like "60s", "5m", "1h", "1d"')
80
+ });
81
+ var ConstraintConfigSchema = z.object({
82
+ rateLimit: RateLimitSchema.optional(),
83
+ requiresHuman: z.array(z.string()).optional(),
84
+ blockedAgents: z.array(z.string()).optional(),
85
+ allowedAgents: z.array(z.string()).optional()
86
+ });
87
+ var BBManifestSchema = z.object({
88
+ version: z.literal("1.0"),
89
+ name: z.string().min(1),
90
+ description: z.string().min(1),
91
+ icon: z.string().url().optional(),
92
+ contact: z.string().optional(),
93
+ documentation: z.string().url().optional(),
94
+ capabilities: z.array(CapabilitySchema).min(1),
95
+ entities: z.record(z.string(), EntitySchemaSchema).optional(),
96
+ auth: AuthConfigSchema.optional(),
97
+ constraints: ConstraintConfigSchema.optional(),
98
+ extensions: z.record(z.string(), z.unknown()).optional()
99
+ });
100
+ function validateManifest(manifest) {
101
+ const result = BBManifestSchema.safeParse(manifest);
102
+ if (result.success) {
103
+ return { success: true, data: result.data };
104
+ }
105
+ return { success: false, errors: result.error };
106
+ }
107
+ function parseManifest(json) {
108
+ try {
109
+ const parsed = JSON.parse(json);
110
+ return validateManifest(parsed);
111
+ } catch (error) {
112
+ return {
113
+ success: false,
114
+ errors: new z.ZodError([
115
+ {
116
+ code: "custom",
117
+ path: [],
118
+ message: `Invalid JSON: ${error instanceof Error ? error.message : "Unknown error"}`
119
+ }
120
+ ])
121
+ };
122
+ }
123
+ }
124
+ function validateCapability(capability) {
125
+ return CapabilitySchema.safeParse(capability);
126
+ }
127
+ function validateEntitySchema(entity) {
128
+ return EntitySchemaSchema.safeParse(entity);
129
+ }
130
+
131
+ // src/protocol/branded.ts
132
+ function toAgentId(id) {
133
+ return id;
134
+ }
135
+ function toRunId(id) {
136
+ return id;
137
+ }
138
+ function toWorkspaceId(id) {
139
+ return id;
140
+ }
141
+ function toSessionId(id) {
142
+ return id;
143
+ }
144
+ function toDocumentId(id) {
145
+ return id;
146
+ }
147
+ function toCapabilityId(id) {
148
+ return id;
149
+ }
150
+ function toEntityTypeId(id) {
151
+ return id;
152
+ }
153
+ function toComponentId(id) {
154
+ return id;
155
+ }
156
+ function generateRunId() {
157
+ const timestamp = Date.now();
158
+ const random = Math.random().toString(36).slice(2, 9);
159
+ return `run-${timestamp}-${random}`;
160
+ }
161
+ function generateSessionId(adapter) {
162
+ const timestamp = Date.now();
163
+ const random = Math.random().toString(36).slice(2, 9);
164
+ return `session-${adapter}-${timestamp}-${random}`;
165
+ }
166
+ function generateDocumentId(name) {
167
+ const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
168
+ const random = Math.random().toString(36).slice(2, 6);
169
+ return `doc-${slug}-${random}`;
170
+ }
171
+ function generateWorkspaceId(name) {
172
+ const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
173
+ return `workspace-${slug}`;
174
+ }
175
+ function isValidId(value) {
176
+ return typeof value === "string" && value.length > 0;
177
+ }
178
+ function assertValidId(value, name = "id") {
179
+ if (!isValidId(value)) {
180
+ throw new Error(`Invalid ${name}: expected non-empty string, got ${typeof value}`);
181
+ }
182
+ }
183
+
184
+ // src/protocol/dom.ts
185
+ function findAction(actionId, root = document) {
186
+ return root.querySelector(`[data-bb-action="${actionId}"]`);
187
+ }
188
+ function findAllActions(actionId, root = document) {
189
+ return Array.from(root.querySelectorAll(`[data-bb-action="${actionId}"]`));
190
+ }
191
+ function findAllActionElements(root = document) {
192
+ return Array.from(root.querySelectorAll("[data-bb-action]"));
193
+ }
194
+ function findEntity(entityType, entityId, root = document) {
195
+ return root.querySelector(`[data-bb-entity="${entityType}"][data-bb-entity-id="${entityId}"]`);
196
+ }
197
+ function findAllEntities(entityType, root = document) {
198
+ return Array.from(root.querySelectorAll(`[data-bb-entity="${entityType}"]`));
199
+ }
200
+ function findField(fieldName, root = document) {
201
+ return root.querySelector(`[data-bb-field="${fieldName}"]`);
202
+ }
203
+ function findInput(inputName, root = document) {
204
+ return root.querySelector(`[data-bb-input="${inputName}"]`);
205
+ }
206
+ function findOutput(outputName, root = document) {
207
+ return root.querySelector(`[data-bb-output="${outputName}"]`);
208
+ }
209
+ function isAuthenticated(indicator, root = document) {
210
+ return root.querySelector(indicator) !== null;
211
+ }
212
+ function getActionId(element) {
213
+ return element.getAttribute("data-bb-action");
214
+ }
215
+ function getEntityType(element) {
216
+ return element.getAttribute("data-bb-entity");
217
+ }
218
+ function getEntityId(element) {
219
+ return element.getAttribute("data-bb-entity-id");
220
+ }
221
+ function getFieldName(element) {
222
+ return element.getAttribute("data-bb-field");
223
+ }
224
+ function getState(element) {
225
+ return element.getAttribute("data-bb-state");
226
+ }
227
+ function requiresConfirmation(element) {
228
+ return element.getAttribute("data-bb-confirm") === "true";
229
+ }
230
+ function getDescription(element) {
231
+ const desc = element.getAttribute("data-bb-description");
232
+ if (desc) return desc;
233
+ const descElement = element.querySelector("[data-bb-description]");
234
+ return descElement?.textContent?.trim() ?? null;
235
+ }
236
+ function getInputs(element) {
237
+ const inputs = element.getAttribute("data-bb-inputs");
238
+ if (!inputs) return null;
239
+ try {
240
+ return JSON.parse(inputs);
241
+ } catch {
242
+ return null;
243
+ }
244
+ }
245
+ function getCost(element) {
246
+ const cost = element.getAttribute("data-bb-cost");
247
+ if (!cost) return null;
248
+ try {
249
+ return JSON.parse(cost);
250
+ } catch {
251
+ return null;
252
+ }
253
+ }
254
+ function extractEntity(element, schema) {
255
+ const result = {};
256
+ for (const [fieldName, selectorOrAttr] of Object.entries(schema.fields)) {
257
+ result[fieldName] = extractFieldValue(element, selectorOrAttr);
258
+ }
259
+ return result;
260
+ }
261
+ function extractFieldValue(root, selectorOrAttr) {
262
+ if (selectorOrAttr.startsWith("data-")) {
263
+ return root.getAttribute(selectorOrAttr);
264
+ }
265
+ const attrMatch = selectorOrAttr.match(/^(.+?)\s+@(.+)$/);
266
+ if (attrMatch) {
267
+ const [, selector, attr] = attrMatch;
268
+ const child2 = root.querySelector(selector);
269
+ return child2?.getAttribute(attr) ?? null;
270
+ }
271
+ const child = root.querySelector(selectorOrAttr);
272
+ return child?.textContent?.trim() ?? null;
273
+ }
274
+ function extractAllEntities(entityType, schema, root = document) {
275
+ const elements = findAllEntities(entityType, root);
276
+ return elements.map((el) => extractEntity(el, schema));
277
+ }
278
+ function setState(element, state) {
279
+ element.setAttribute("data-bb-state", state);
280
+ }
281
+ function waitForState(element, targetState, options = {}) {
282
+ const { timeout = 3e4, pollInterval = 100 } = options;
283
+ return new Promise((resolve, reject) => {
284
+ const startTime = Date.now();
285
+ const check = () => {
286
+ const currentState = getState(element);
287
+ if (currentState === targetState) {
288
+ resolve();
289
+ return;
290
+ }
291
+ if (Date.now() - startTime > timeout) {
292
+ reject(new Error(`Timeout waiting for state "${targetState}". Current: "${currentState}"`));
293
+ return;
294
+ }
295
+ setTimeout(check, pollInterval);
296
+ };
297
+ check();
298
+ });
299
+ }
300
+ function observeState(element, callback) {
301
+ let previousState = getState(element);
302
+ const observer = new MutationObserver((mutations) => {
303
+ for (const mutation of mutations) {
304
+ if (mutation.type === "attributes" && mutation.attributeName === "data-bb-state") {
305
+ const newState = getState(element);
306
+ if (newState !== previousState) {
307
+ callback(newState, previousState);
308
+ previousState = newState;
309
+ }
310
+ }
311
+ }
312
+ });
313
+ observer.observe(element, { attributes: true, attributeFilter: ["data-bb-state"] });
314
+ return () => observer.disconnect();
315
+ }
316
+ function getAvailableActions(root = document) {
317
+ const elements = findAllActionElements(root);
318
+ return elements.map((element) => ({
319
+ id: getActionId(element),
320
+ element,
321
+ state: getState(element),
322
+ requiresConfirmation: requiresConfirmation(element),
323
+ description: getDescription(element),
324
+ inputs: getInputs(element),
325
+ cost: getCost(element)
326
+ }));
327
+ }
328
+ function isActionAvailable(element) {
329
+ const state = getState(element);
330
+ if (!state || state === "idle" || state === "success") return true;
331
+ return false;
332
+ }
333
+ function findManifestUrl(doc = document) {
334
+ const link = doc.querySelector('link[rel="bb-manifest"]');
335
+ if (link) {
336
+ return link.getAttribute("href");
337
+ }
338
+ return "/bb-manifest.json";
339
+ }
340
+ async function fetchManifest(url) {
341
+ const manifestUrl = url ?? findManifestUrl();
342
+ if (!manifestUrl) {
343
+ return { success: false, error: "No manifest URL found" };
344
+ }
345
+ try {
346
+ const response = await fetch(manifestUrl);
347
+ if (!response.ok) {
348
+ return { success: false, error: `HTTP ${response.status}: ${response.statusText}` };
349
+ }
350
+ const data = await response.json();
351
+ return { success: true, data };
352
+ } catch (error) {
353
+ return {
354
+ success: false,
355
+ error: error instanceof Error ? error.message : "Unknown error"
356
+ };
357
+ }
358
+ }
359
+
360
+ export { AuthConfigSchema, AuthTypeSchema, BBManifestSchema, BBStateSchema, CapabilitySchema, CapabilityTypeSchema, ConfirmationTypeSchema, ConstraintConfigSchema, CostEstimateSchema, EntitySchemaSchema, InputFieldSchema, InputTypeSchema, LatencyEstimateSchema, OutputFieldSchema, RiskLevelSchema, assertValidId, extractAllEntities, extractEntity, extractFieldValue, fetchManifest, findAction, findAllActionElements, findAllActions, findAllEntities, findEntity, findField, findInput, findManifestUrl, findOutput, generateDocumentId, generateRunId, generateSessionId, generateWorkspaceId, getActionId, getAvailableActions, getCost, getDescription, getEntityId, getEntityType, getFieldName, getInputs, getState, isActionAvailable, isAuthenticated, isValidId, observeState, parseManifest, requiresConfirmation, setState, toAgentId, toCapabilityId, toComponentId, toDocumentId, toEntityTypeId, toRunId, toSessionId, toWorkspaceId, validateCapability, validateEntitySchema, validateManifest, waitForState };
3
361
  //# sourceMappingURL=index.js.map
4
362
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
1
+ {"version":3,"sources":["../../src/protocol/schema.ts","../../src/protocol/branded.ts","../../src/protocol/dom.ts"],"names":["child"],"mappings":";;;AAUO,IAAM,uBAAuB,CAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,UAAA,EAAY,UAAU,CAAC;AACrE,IAAM,kBAAkB,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,QAAA,EAAU,MAAM,CAAC;AACxD,IAAM,eAAA,GAAkB,CAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,UAAU,SAAA,EAAW,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAC;AACxF,IAAM,cAAA,GAAiB,EAAE,IAAA,CAAK,CAAC,QAAQ,SAAA,EAAW,OAAA,EAAS,SAAS,CAAC;AACrE,IAAM,yBAAyB,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,UAAA,EAAY,UAAU,CAAC;AACtE,IAAM,aAAA,GAAgB,EAAE,IAAA,CAAK;AAAA,EAClC,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,gBAAA,GAAmB,EAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,IAAA,EAAM,eAAA;AAAA,EACN,QAAA,EAAU,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC/B,OAAA,EAAS,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC9B,SAAS,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACtC,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACvB,CAAC;AAEM,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EACxC,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACvB,CAAC;AAEM,IAAM,kBAAA,GAAqB,EAAE,MAAA,CAAO;AAAA,EACzC,GAAA,EAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAO,EAAG,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAC,CAAC,EAAE,QAAA,EAAS;AAAA,EAC3D,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,IAAA,EAAM;AACR,CAAC;AAEM,IAAM,qBAAA,GAAwB,EAAE,MAAA,CAAO;AAAA,EAC5C,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,KAAK,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AAC7B,CAAC;AAEM,IAAM,gBAAA,GAAmB,EAC7B,MAAA,CAAO;AAAA,EACN,EAAA,EAAI,EACD,MAAA,EAAO,CACP,IAAI,CAAC,CAAA,CACL,KAAA,CAAM,mBAAA,EAAqB,uBAAuB,CAAA;AAAA,EACrD,IAAA,EAAM,oBAAA;AAAA,EACN,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC7B,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC1B,MAAA,EAAQ,CAAA,CAAE,KAAA,CAAM,gBAAgB,EAAE,QAAA,EAAS;AAAA,EAC3C,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,iBAAiB,EAAE,QAAA,EAAS;AAAA,EAC7C,IAAA,EAAM,mBAAmB,QAAA,EAAS;AAAA,EAClC,OAAA,EAAS,sBAAsB,QAAA,EAAS;AAAA,EACxC,UAAU,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACvC,YAAA,EAAc,uBAAuB,QAAA,EAAS;AAAA,EAC9C,OAAO,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAC7B,CAAC,CAAA,CACA,MAAA;AAAA,EACC,CAAC,IAAA,KAAS;AAER,IAAA,IAAI,IAAA,CAAK,SAAS,UAAA,KAAe,CAAC,KAAK,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,CAAA,EAAI;AACxE,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EACA,EAAE,SAAS,+CAAA;AACb;AAEK,IAAM,kBAAA,GAAqB,EAAE,MAAA,CAAO;AAAA,EACzC,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC1B,MAAA,EAAQ,EAAE,MAAA,CAAO,CAAA,CAAE,QAAO,EAAG,CAAA,CAAE,QAAQ,CAAA;AAAA,EACvC,SAAS,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAC/B,CAAC;AAEM,IAAM,gBAAA,GAAmB,EAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAM,cAAA;AAAA,EACN,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,QAAQ,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACrC,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,gBAAA,EAAkB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC/B,CAAC;AAEM,IAAM,eAAA,GAAkB,EAAE,MAAA,CAAO;AAAA,EACtC,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,QAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,eAAe,6CAA6C;AACvF,CAAC,CAAA;AAEM,IAAM,sBAAA,GAAyB,EAAE,MAAA,CAAO;AAAA,EAC7C,SAAA,EAAW,gBAAgB,QAAA,EAAS;AAAA,EACpC,eAAe,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC5C,eAAe,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC5C,eAAe,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AACrC,CAAC;AAMM,IAAM,gBAAA,GAAmB,EAAE,MAAA,CAAO;AAAA,EACvC,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EACxB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC7B,MAAM,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,EAChC,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,eAAe,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,EACzC,cAAc,CAAA,CAAE,KAAA,CAAM,gBAAgB,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC7C,QAAA,EAAU,EAAE,MAAA,CAAO,CAAA,CAAE,QAAO,EAAG,kBAAkB,EAAE,QAAA,EAAS;AAAA,EAC5D,IAAA,EAAM,iBAAiB,QAAA,EAAS;AAAA,EAChC,WAAA,EAAa,uBAAuB,QAAA,EAAS;AAAA,EAC7C,UAAA,EAAY,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AAChD,CAAC;AAaM,SAAS,iBAAiB,QAAA,EAA6C;AAC5E,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,SAAA,CAAU,QAAQ,CAAA;AAClD,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,EAC5C;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA,EAAM;AAChD;AAKO,SAAS,cAAc,IAAA,EAAwC;AACpE,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,IAAA,OAAO,iBAAiB,MAAM,CAAA;AAAA,EAChC,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,IAAI,CAAA,CAAE,QAAA,CAAS;AAAA,QACrB;AAAA,UACE,IAAA,EAAM,QAAA;AAAA,UACN,MAAM,EAAC;AAAA,UACP,SAAS,CAAA,cAAA,EAAiB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA;AACpF,OACD;AAAA,KACH;AAAA,EACF;AACF;AAKO,SAAS,mBAAmB,UAAA,EAAqB;AACtD,EAAA,OAAO,gBAAA,CAAiB,UAAU,UAAU,CAAA;AAC9C;AAKO,SAAS,qBAAqB,MAAA,EAAiB;AACpD,EAAA,OAAO,kBAAA,CAAmB,UAAU,MAAM,CAAA;AAC5C;;;AC7FO,SAAS,UAAU,EAAA,EAAqB;AAC7C,EAAA,OAAO,EAAA;AACT;AAMO,SAAS,QAAQ,EAAA,EAAmB;AACzC,EAAA,OAAO,EAAA;AACT;AAMO,SAAS,cAAc,EAAA,EAAyB;AACrD,EAAA,OAAO,EAAA;AACT;AAMO,SAAS,YAAY,EAAA,EAAuB;AACjD,EAAA,OAAO,EAAA;AACT;AAMO,SAAS,aAAa,EAAA,EAAwB;AACnD,EAAA,OAAO,EAAA;AACT;AAMO,SAAS,eAAe,EAAA,EAA0B;AACvD,EAAA,OAAO,EAAA;AACT;AAMO,SAAS,eAAe,EAAA,EAA0B;AACvD,EAAA,OAAO,EAAA;AACT;AAMO,SAAS,cAAc,EAAA,EAAyB;AACrD,EAAA,OAAO,EAAA;AACT;AASO,SAAS,aAAA,GAAuB;AACrC,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACpD,EAAA,OAAO,CAAA,IAAA,EAAO,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACnC;AAKO,SAAS,kBAAkB,OAAA,EAA4B;AAC5D,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACpD,EAAA,OAAO,CAAA,QAAA,EAAW,OAAO,CAAA,CAAA,EAAI,SAAS,IAAI,MAAM,CAAA,CAAA;AAClD;AAKO,SAAS,mBAAmB,IAAA,EAA0B;AAC3D,EAAA,MAAM,IAAA,GAAO,IAAA,CACV,WAAA,EAAY,CACZ,OAAA,CAAQ,eAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACvB,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACpD,EAAA,OAAO,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC9B;AAKO,SAAS,oBAAoB,IAAA,EAA2B;AAC7D,EAAA,MAAM,IAAA,GAAO,IAAA,CACV,WAAA,EAAY,CACZ,OAAA,CAAQ,eAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACvB,EAAA,OAAO,aAAa,IAAI,CAAA,CAAA;AAC1B;AASO,SAAS,UAAU,KAAA,EAAiC;AACzD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,MAAA,GAAS,CAAA;AACrD;AAKO,SAAS,aAAA,CAAc,KAAA,EAAgB,IAAA,GAAO,IAAA,EAA+B;AAClF,EAAA,IAAI,CAAC,SAAA,CAAU,KAAK,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,IAAI,CAAA,iCAAA,EAAoC,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,EACnF;AACF;;;ACtMO,SAAS,UAAA,CAAW,QAAA,EAAkB,IAAA,GAAmB,QAAA,EAA0B;AACxF,EAAA,OAAO,IAAA,CAAK,aAAA,CAAc,CAAA,iBAAA,EAAoB,QAAQ,CAAA,EAAA,CAAI,CAAA;AAC5D;AAKO,SAAS,cAAA,CAAe,QAAA,EAAkB,IAAA,GAAmB,QAAA,EAAqB;AACvF,EAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAiB,CAAA,iBAAA,EAAoB,QAAQ,IAAI,CAAC,CAAA;AAC3E;AAKO,SAAS,qBAAA,CAAsB,OAAmB,QAAA,EAAqB;AAC5E,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,kBAAkB,CAAC,CAAA;AAC7D;AAKO,SAAS,UAAA,CACd,UAAA,EACA,QAAA,EACA,IAAA,GAAmB,QAAA,EACH;AAChB,EAAA,OAAO,KAAK,aAAA,CAAc,CAAA,iBAAA,EAAoB,UAAU,CAAA,sBAAA,EAAyB,QAAQ,CAAA,EAAA,CAAI,CAAA;AAC/F;AAKO,SAAS,eAAA,CAAgB,UAAA,EAAoB,IAAA,GAAmB,QAAA,EAAqB;AAC1F,EAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAiB,CAAA,iBAAA,EAAoB,UAAU,IAAI,CAAC,CAAA;AAC7E;AAKO,SAAS,SAAA,CAAU,SAAA,EAAmB,IAAA,GAAmB,QAAA,EAA0B;AACxF,EAAA,OAAO,IAAA,CAAK,aAAA,CAAc,CAAA,gBAAA,EAAmB,SAAS,CAAA,EAAA,CAAI,CAAA;AAC5D;AAKO,SAAS,SAAA,CAAU,SAAA,EAAmB,IAAA,GAAmB,QAAA,EAA0B;AACxF,EAAA,OAAO,IAAA,CAAK,aAAA,CAAc,CAAA,gBAAA,EAAmB,SAAS,CAAA,EAAA,CAAI,CAAA;AAC5D;AAKO,SAAS,UAAA,CAAW,UAAA,EAAoB,IAAA,GAAmB,QAAA,EAA0B;AAC1F,EAAA,OAAO,IAAA,CAAK,aAAA,CAAc,CAAA,iBAAA,EAAoB,UAAU,CAAA,EAAA,CAAI,CAAA;AAC9D;AAKO,SAAS,eAAA,CAAgB,SAAA,EAAmB,IAAA,GAAmB,QAAA,EAAmB;AACvF,EAAA,OAAO,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA,KAAM,IAAA;AAC3C;AASO,SAAS,YAAY,OAAA,EAAiC;AAC3D,EAAA,OAAO,OAAA,CAAQ,aAAa,gBAAgB,CAAA;AAC9C;AAKO,SAAS,cAAc,OAAA,EAAiC;AAC7D,EAAA,OAAO,OAAA,CAAQ,aAAa,gBAAgB,CAAA;AAC9C;AAKO,SAAS,YAAY,OAAA,EAAiC;AAC3D,EAAA,OAAO,OAAA,CAAQ,aAAa,mBAAmB,CAAA;AACjD;AAKO,SAAS,aAAa,OAAA,EAAiC;AAC5D,EAAA,OAAO,OAAA,CAAQ,aAAa,eAAe,CAAA;AAC7C;AAKO,SAAS,SAAS,OAAA,EAAkC;AACzD,EAAA,OAAO,OAAA,CAAQ,aAAa,eAAe,CAAA;AAC7C;AAKO,SAAS,qBAAqB,OAAA,EAA2B;AAC9D,EAAA,OAAO,OAAA,CAAQ,YAAA,CAAa,iBAAiB,CAAA,KAAM,MAAA;AACrD;AAKO,SAAS,eAAe,OAAA,EAAiC;AAE9D,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,qBAAqB,CAAA;AACvD,EAAA,IAAI,MAAM,OAAO,IAAA;AAGjB,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,aAAA,CAAc,uBAAuB,CAAA;AACjE,EAAA,OAAO,WAAA,EAAa,WAAA,EAAa,IAAA,EAAK,IAAK,IAAA;AAC7C;AAKO,SAAS,UAAU,OAAA,EAAkD;AAC1E,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,CAAa,gBAAgB,CAAA;AACpD,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKO,SAAS,QAAQ,OAAA,EAA0D;AAChF,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,cAAc,CAAA;AAChD,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AASO,SAAS,aAAA,CACd,SACA,MAAA,EAC+B;AAC/B,EAAA,MAAM,SAAwC,EAAC;AAE/C,EAAA,KAAA,MAAW,CAAC,WAAW,cAAc,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG;AACvE,IAAA,MAAA,CAAO,SAAS,CAAA,GAAI,iBAAA,CAAkB,OAAA,EAAS,cAAc,CAAA;AAAA,EAC/D;AAEA,EAAA,OAAO,MAAA;AACT;AAWO,SAAS,iBAAA,CAAkB,MAAe,cAAA,EAAuC;AAEtF,EAAA,IAAI,cAAA,CAAe,UAAA,CAAW,OAAO,CAAA,EAAG;AACtC,IAAA,OAAO,IAAA,CAAK,aAAa,cAAc,CAAA;AAAA,EACzC;AAGA,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,KAAA,CAAM,iBAAiB,CAAA;AACxD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,GAAG,QAAA,EAAU,IAAI,CAAA,GAAI,SAAA;AAC3B,IAAA,MAAMA,MAAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AACzC,IAAA,OAAOA,MAAAA,EAAO,YAAA,CAAa,IAAI,CAAA,IAAK,IAAA;AAAA,EACtC;AAGA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,cAAc,CAAA;AAC/C,EAAA,OAAO,KAAA,EAAO,WAAA,EAAa,IAAA,EAAK,IAAK,IAAA;AACvC;AAKO,SAAS,kBAAA,CACd,UAAA,EACA,MAAA,EACA,IAAA,GAAmB,QAAA,EACmB;AACtC,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,UAAA,EAAY,IAAI,CAAA;AACjD,EAAA,OAAO,SAAS,GAAA,CAAI,CAAC,OAAO,aAAA,CAAc,EAAA,EAAI,MAAM,CAAC,CAAA;AACvD;AASO,SAAS,QAAA,CAAS,SAAkB,KAAA,EAAsB;AAC/D,EAAA,OAAA,CAAQ,YAAA,CAAa,iBAAiB,KAAK,CAAA;AAC7C;AAKO,SAAS,YAAA,CACd,OAAA,EACA,WAAA,EACA,OAAA,GAAuD,EAAC,EACzC;AACf,EAAA,MAAM,EAAE,OAAA,GAAU,GAAA,EAAO,YAAA,GAAe,KAAI,GAAI,OAAA;AAEhD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,MAAM,QAAQ,MAAM;AAClB,MAAA,MAAM,YAAA,GAAe,SAAS,OAAO,CAAA;AACrC,MAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,QAAA,OAAA,EAAQ;AACR,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,OAAA,EAAS;AACpC,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,WAAW,CAAA,aAAA,EAAgB,YAAY,GAAG,CAAC,CAAA;AAC1F,QAAA;AAAA,MACF;AAEA,MAAA,UAAA,CAAW,OAAO,YAAY,CAAA;AAAA,IAChC,CAAA;AAEA,IAAA,KAAA,EAAM;AAAA,EACR,CAAC,CAAA;AACH;AAKO,SAAS,YAAA,CACd,SACA,QAAA,EACY;AACZ,EAAA,IAAI,aAAA,GAAgB,SAAS,OAAO,CAAA;AAEpC,EAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,CAAC,SAAA,KAAc;AACnD,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,IAAI,QAAA,CAAS,IAAA,KAAS,YAAA,IAAgB,QAAA,CAAS,kBAAkB,eAAA,EAAiB;AAChF,QAAA,MAAM,QAAA,GAAW,SAAS,OAAO,CAAA;AACjC,QAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,UAAA,QAAA,CAAS,UAAU,aAAa,CAAA;AAChC,UAAA,aAAA,GAAgB,QAAA;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,QAAA,CAAS,OAAA,CAAQ,SAAS,EAAE,UAAA,EAAY,MAAM,eAAA,EAAiB,CAAC,eAAe,CAAA,EAAG,CAAA;AAElF,EAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AACnC;AASO,SAAS,mBAAA,CAAoB,OAAmB,QAAA,EAQpD;AACD,EAAA,MAAM,QAAA,GAAW,sBAAsB,IAAI,CAAA;AAC3C,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,IAChC,EAAA,EAAI,YAAY,OAAO,CAAA;AAAA,IACvB,OAAA;AAAA,IACA,KAAA,EAAO,SAAS,OAAO,CAAA;AAAA,IACvB,oBAAA,EAAsB,qBAAqB,OAAO,CAAA;AAAA,IAClD,WAAA,EAAa,eAAe,OAAO,CAAA;AAAA,IACnC,MAAA,EAAQ,UAAU,OAAO,CAAA;AAAA,IACzB,IAAA,EAAM,QAAQ,OAAO;AAAA,GACvB,CAAE,CAAA;AACJ;AAKO,SAAS,kBAAkB,OAAA,EAA2B;AAC3D,EAAA,MAAM,KAAA,GAAQ,SAAS,OAAO,CAAA;AAC9B,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,WAAW,OAAO,IAAA;AAC9D,EAAA,OAAO,KAAA;AACT;AASO,SAAS,eAAA,CAAgB,MAAgB,QAAA,EAAyB;AACvE,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAAc,yBAAyB,CAAA;AACxD,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAO,IAAA,CAAK,aAAa,MAAM,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,mBAAA;AACT;AAKA,eAAsB,cACpB,GAAA,EAC+E;AAC/E,EAAA,MAAM,WAAA,GAAc,OAAO,eAAA,EAAgB;AAC3C,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,uBAAA,EAAwB;AAAA,EAC1D;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,WAAW,CAAA;AACxC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAA,EAAG;AAAA,IACpF;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAK;AAAA,EAC/B,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF","file":"index.js","sourcesContent":["/**\n * Zod schemas for bb-protocol validation\n */\n\nimport { z } from 'zod';\n\n// =============================================================================\n// Enums\n// =============================================================================\n\nexport const CapabilityTypeSchema = z.enum(['query', 'mutation', 'workflow']);\nexport const RiskLevelSchema = z.enum(['low', 'medium', 'high']);\nexport const InputTypeSchema = z.enum(['string', 'number', 'boolean', 'date', 'file', 'select']);\nexport const AuthTypeSchema = z.enum(['none', 'session', 'oauth', 'api-key']);\nexport const ConfirmationTypeSchema = z.enum(['none', 'optional', 'required']);\nexport const BBStateSchema = z.enum([\n 'idle',\n 'loading',\n 'success',\n 'error',\n 'disabled',\n 'hidden',\n 'requires-auth',\n]);\n\n// =============================================================================\n// Nested Schemas\n// =============================================================================\n\nexport const InputFieldSchema = z.object({\n name: z.string().min(1),\n type: InputTypeSchema,\n required: z.boolean().optional(),\n default: z.unknown().optional(),\n options: z.array(z.string()).optional(),\n from: z.string().optional(),\n selector: z.string().optional(),\n});\n\nexport const OutputFieldSchema = z.object({\n name: z.string().min(1),\n type: z.string().min(1),\n selector: z.string().optional(),\n});\n\nexport const CostEstimateSchema = z.object({\n usd: z.union([z.number(), z.literal('variable')]).optional(),\n tokens: z.number().optional(),\n risk: RiskLevelSchema,\n});\n\nexport const LatencyEstimateSchema = z.object({\n typical: z.number().positive(),\n max: z.number().positive().optional(),\n});\n\nexport const CapabilitySchema = z\n .object({\n id: z\n .string()\n .min(1)\n .regex(/^[a-z][a-z0-9-]*$/, 'ID must be kebab-case'),\n type: CapabilityTypeSchema,\n description: z.string().min(1),\n entry: z.string().optional(),\n selector: z.string().min(1),\n inputs: z.array(InputFieldSchema).optional(),\n outputs: z.array(OutputFieldSchema).optional(),\n cost: CostEstimateSchema.optional(),\n latency: LatencyEstimateSchema.optional(),\n requires: z.array(z.string()).optional(),\n confirmation: ConfirmationTypeSchema.optional(),\n steps: z.array(z.string()).optional(),\n })\n .refine(\n (data) => {\n // Workflows should have steps\n if (data.type === 'workflow' && (!data.steps || data.steps.length === 0)) {\n return false;\n }\n return true;\n },\n { message: 'Workflow capabilities must have steps defined' }\n );\n\nexport const EntitySchemaSchema = z.object({\n selector: z.string().min(1),\n fields: z.record(z.string(), z.string()),\n actions: z.array(z.string()).optional(),\n});\n\nexport const AuthConfigSchema = z.object({\n type: AuthTypeSchema,\n loginUrl: z.string().optional(),\n logoutUrl: z.string().optional(),\n indicator: z.string().optional(),\n scopes: z.array(z.string()).optional(),\n header: z.string().optional(),\n documentationUrl: z.string().optional(),\n});\n\nexport const RateLimitSchema = z.object({\n requests: z.number().positive(),\n window: z.string().regex(/^\\d+[smhd]$/, 'Window must be like \"60s\", \"5m\", \"1h\", \"1d\"'),\n});\n\nexport const ConstraintConfigSchema = z.object({\n rateLimit: RateLimitSchema.optional(),\n requiresHuman: z.array(z.string()).optional(),\n blockedAgents: z.array(z.string()).optional(),\n allowedAgents: z.array(z.string()).optional(),\n});\n\n// =============================================================================\n// Main Manifest Schema\n// =============================================================================\n\nexport const BBManifestSchema = z.object({\n version: z.literal('1.0'),\n name: z.string().min(1),\n description: z.string().min(1),\n icon: z.string().url().optional(),\n contact: z.string().optional(),\n documentation: z.string().url().optional(),\n capabilities: z.array(CapabilitySchema).min(1),\n entities: z.record(z.string(), EntitySchemaSchema).optional(),\n auth: AuthConfigSchema.optional(),\n constraints: ConstraintConfigSchema.optional(),\n extensions: z.record(z.string(), z.unknown()).optional(),\n});\n\n// =============================================================================\n// Validation Functions\n// =============================================================================\n\nexport type ManifestValidationResult =\n | { success: true; data: z.infer<typeof BBManifestSchema> }\n | { success: false; errors: z.ZodError };\n\n/**\n * Validate a manifest object against the schema\n */\nexport function validateManifest(manifest: unknown): ManifestValidationResult {\n const result = BBManifestSchema.safeParse(manifest);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, errors: result.error };\n}\n\n/**\n * Parse and validate a manifest JSON string\n */\nexport function parseManifest(json: string): ManifestValidationResult {\n try {\n const parsed = JSON.parse(json);\n return validateManifest(parsed);\n } catch (error) {\n return {\n success: false,\n errors: new z.ZodError([\n {\n code: 'custom',\n path: [],\n message: `Invalid JSON: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ]),\n };\n }\n}\n\n/**\n * Validate a single capability\n */\nexport function validateCapability(capability: unknown) {\n return CapabilitySchema.safeParse(capability);\n}\n\n/**\n * Validate an entity schema\n */\nexport function validateEntitySchema(entity: unknown) {\n return EntitySchemaSchema.safeParse(entity);\n}\n\n// =============================================================================\n// Type Exports\n// =============================================================================\n\nexport type BBManifestInput = z.input<typeof BBManifestSchema>;\nexport type BBManifestOutput = z.output<typeof BBManifestSchema>;\nexport type CapabilityInput = z.input<typeof CapabilitySchema>;\nexport type EntitySchemaInput = z.input<typeof EntitySchemaSchema>;\n","/**\n * Branded Types\n *\n * These types use TypeScript's structural typing escape hatch to create\n * nominally-typed IDs that prevent accidental mixing of different ID types.\n *\n * @example\n * ```ts\n * const agentId: AgentId = 'agent-123' as AgentId;\n * const runId: RunId = 'run-456' as RunId;\n *\n * function getAgent(id: AgentId) { ... }\n *\n * getAgent(agentId); // OK\n * getAgent(runId); // Type error!\n * ```\n */\n\n// =============================================================================\n// Brand Symbol\n// =============================================================================\n\ndeclare const __brand: unique symbol;\n\n/**\n * Creates a branded type that is structurally incompatible with other branded types.\n * This prevents accidentally passing the wrong type of ID to a function.\n */\ntype Brand<T, B> = T & { readonly [__brand]: B };\n\n// =============================================================================\n// Branded ID Types\n// =============================================================================\n\n/**\n * Unique identifier for an AI agent.\n * @example 'claude-3-opus', 'gpt-4', 'agent-custom-1'\n */\nexport type AgentId = Brand<string, 'AgentId'>;\n\n/**\n * Unique identifier for an agent run/execution.\n * @example 'run-1705123456789-abc123'\n */\nexport type RunId = Brand<string, 'RunId'>;\n\n/**\n * Unique identifier for a workspace specification.\n * @example 'workspace-dashboard-v1'\n */\nexport type WorkspaceId = Brand<string, 'WorkspaceId'>;\n\n/**\n * Unique identifier for a play session.\n * @example 'session-openrct2-xyz789'\n */\nexport type SessionId = Brand<string, 'SessionId'>;\n\n/**\n * Unique identifier for a synced document.\n * @example 'doc-project-readme-md'\n */\nexport type DocumentId = Brand<string, 'DocumentId'>;\n\n/**\n * Unique identifier for a capability in a manifest.\n * @example 'search-products', 'create-order'\n */\nexport type CapabilityId = Brand<string, 'CapabilityId'>;\n\n/**\n * Unique identifier for an entity type.\n * @example 'product', 'user', 'order'\n */\nexport type EntityTypeId = Brand<string, 'EntityTypeId'>;\n\n/**\n * Unique identifier for a component in the registry.\n * @example 'glow-button', 'glass-panel', 'graph-3d'\n */\nexport type ComponentId = Brand<string, 'ComponentId'>;\n\n// =============================================================================\n// Type Guards and Utilities\n// =============================================================================\n\n/**\n * Create a branded AgentId from a string.\n * Use this when receiving agent IDs from external sources.\n */\nexport function toAgentId(id: string): AgentId {\n return id as AgentId;\n}\n\n/**\n * Create a branded RunId from a string.\n * Use this when receiving run IDs from external sources.\n */\nexport function toRunId(id: string): RunId {\n return id as RunId;\n}\n\n/**\n * Create a branded WorkspaceId from a string.\n * Use this when receiving workspace IDs from external sources.\n */\nexport function toWorkspaceId(id: string): WorkspaceId {\n return id as WorkspaceId;\n}\n\n/**\n * Create a branded SessionId from a string.\n * Use this when receiving session IDs from external sources.\n */\nexport function toSessionId(id: string): SessionId {\n return id as SessionId;\n}\n\n/**\n * Create a branded DocumentId from a string.\n * Use this when receiving document IDs from external sources.\n */\nexport function toDocumentId(id: string): DocumentId {\n return id as DocumentId;\n}\n\n/**\n * Create a branded CapabilityId from a string.\n * Use this when receiving capability IDs from external sources.\n */\nexport function toCapabilityId(id: string): CapabilityId {\n return id as CapabilityId;\n}\n\n/**\n * Create a branded EntityTypeId from a string.\n * Use this when receiving entity type IDs from external sources.\n */\nexport function toEntityTypeId(id: string): EntityTypeId {\n return id as EntityTypeId;\n}\n\n/**\n * Create a branded ComponentId from a string.\n * Use this when receiving component IDs from external sources.\n */\nexport function toComponentId(id: string): ComponentId {\n return id as ComponentId;\n}\n\n// =============================================================================\n// ID Generation Utilities\n// =============================================================================\n\n/**\n * Generate a unique run ID with timestamp and random suffix.\n */\nexport function generateRunId(): RunId {\n const timestamp = Date.now();\n const random = Math.random().toString(36).slice(2, 9);\n return `run-${timestamp}-${random}` as RunId;\n}\n\n/**\n * Generate a unique session ID with adapter prefix and random suffix.\n */\nexport function generateSessionId(adapter: string): SessionId {\n const timestamp = Date.now();\n const random = Math.random().toString(36).slice(2, 9);\n return `session-${adapter}-${timestamp}-${random}` as SessionId;\n}\n\n/**\n * Generate a unique document ID from a descriptive name.\n */\nexport function generateDocumentId(name: string): DocumentId {\n const slug = name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n const random = Math.random().toString(36).slice(2, 6);\n return `doc-${slug}-${random}` as DocumentId;\n}\n\n/**\n * Generate a unique workspace ID from a name.\n */\nexport function generateWorkspaceId(name: string): WorkspaceId {\n const slug = name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n return `workspace-${slug}` as WorkspaceId;\n}\n\n// =============================================================================\n// Type Assertions\n// =============================================================================\n\n/**\n * Check if a value is a valid ID string (non-empty).\n */\nexport function isValidId(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0;\n}\n\n/**\n * Assert that a value is a valid ID, throwing if not.\n */\nexport function assertValidId(value: unknown, name = 'id'): asserts value is string {\n if (!isValidId(value)) {\n throw new Error(`Invalid ${name}: expected non-empty string, got ${typeof value}`);\n }\n}\n","/**\n * DOM utilities for bb-protocol annotations\n *\n * Query and interact with elements annotated with data-bb-* attributes.\n */\n\nimport type { BBState, EntitySchema, BBAttributes } from './types.js';\n\n// =============================================================================\n// Element Queries\n// =============================================================================\n\n/**\n * Find an element by its bb-action attribute\n */\nexport function findAction(actionId: string, root: ParentNode = document): Element | null {\n return root.querySelector(`[data-bb-action=\"${actionId}\"]`);\n}\n\n/**\n * Find all elements with a specific bb-action\n */\nexport function findAllActions(actionId: string, root: ParentNode = document): Element[] {\n return Array.from(root.querySelectorAll(`[data-bb-action=\"${actionId}\"]`));\n}\n\n/**\n * Find all action elements on the page\n */\nexport function findAllActionElements(root: ParentNode = document): Element[] {\n return Array.from(root.querySelectorAll('[data-bb-action]'));\n}\n\n/**\n * Find an entity by type and ID\n */\nexport function findEntity(\n entityType: string,\n entityId: string,\n root: ParentNode = document\n): Element | null {\n return root.querySelector(`[data-bb-entity=\"${entityType}\"][data-bb-entity-id=\"${entityId}\"]`);\n}\n\n/**\n * Find all entities of a specific type\n */\nexport function findAllEntities(entityType: string, root: ParentNode = document): Element[] {\n return Array.from(root.querySelectorAll(`[data-bb-entity=\"${entityType}\"]`));\n}\n\n/**\n * Find a field within an entity or root\n */\nexport function findField(fieldName: string, root: ParentNode = document): Element | null {\n return root.querySelector(`[data-bb-field=\"${fieldName}\"]`);\n}\n\n/**\n * Find an input by name\n */\nexport function findInput(inputName: string, root: ParentNode = document): Element | null {\n return root.querySelector(`[data-bb-input=\"${inputName}\"]`);\n}\n\n/**\n * Find output area by name\n */\nexport function findOutput(outputName: string, root: ParentNode = document): Element | null {\n return root.querySelector(`[data-bb-output=\"${outputName}\"]`);\n}\n\n/**\n * Check if user is authenticated based on auth indicator\n */\nexport function isAuthenticated(indicator: string, root: ParentNode = document): boolean {\n return root.querySelector(indicator) !== null;\n}\n\n// =============================================================================\n// Attribute Reading\n// =============================================================================\n\n/**\n * Get the bb-action ID from an element\n */\nexport function getActionId(element: Element): string | null {\n return element.getAttribute('data-bb-action');\n}\n\n/**\n * Get the entity type from an element\n */\nexport function getEntityType(element: Element): string | null {\n return element.getAttribute('data-bb-entity');\n}\n\n/**\n * Get the entity ID from an element\n */\nexport function getEntityId(element: Element): string | null {\n return element.getAttribute('data-bb-entity-id');\n}\n\n/**\n * Get the field name from an element\n */\nexport function getFieldName(element: Element): string | null {\n return element.getAttribute('data-bb-field');\n}\n\n/**\n * Get the current state of an element\n */\nexport function getState(element: Element): BBState | null {\n return element.getAttribute('data-bb-state') as BBState | null;\n}\n\n/**\n * Check if an element requires confirmation\n */\nexport function requiresConfirmation(element: Element): boolean {\n return element.getAttribute('data-bb-confirm') === 'true';\n}\n\n/**\n * Get the hidden description for an element\n */\nexport function getDescription(element: Element): string | null {\n // First check for data-bb-description attribute\n const desc = element.getAttribute('data-bb-description');\n if (desc) return desc;\n\n // Then check for child with data-bb-description\n const descElement = element.querySelector('[data-bb-description]');\n return descElement?.textContent?.trim() ?? null;\n}\n\n/**\n * Get JSON-encoded inputs from an element\n */\nexport function getInputs(element: Element): Record<string, unknown> | null {\n const inputs = element.getAttribute('data-bb-inputs');\n if (!inputs) return null;\n try {\n return JSON.parse(inputs);\n } catch {\n return null;\n }\n}\n\n/**\n * Get JSON-encoded cost from an element\n */\nexport function getCost(element: Element): { usd?: number; risk?: string } | null {\n const cost = element.getAttribute('data-bb-cost');\n if (!cost) return null;\n try {\n return JSON.parse(cost);\n } catch {\n return null;\n }\n}\n\n// =============================================================================\n// Entity Extraction\n// =============================================================================\n\n/**\n * Extract entity data based on schema field mappings\n */\nexport function extractEntity(\n element: Element,\n schema: EntitySchema\n): Record<string, string | null> {\n const result: Record<string, string | null> = {};\n\n for (const [fieldName, selectorOrAttr] of Object.entries(schema.fields)) {\n result[fieldName] = extractFieldValue(element, selectorOrAttr);\n }\n\n return result;\n}\n\n/**\n * Extract a single field value using selector syntax\n *\n * Supports:\n * - \"data-bb-entity-id\" - read data attribute from root\n * - \"[data-bb-field='name']\" - text content of child element\n * - \"[data-bb-field='image'] @src\" - attribute of child element\n * - \"[data-bb-field='status'] @data-bb-state\" - data attribute of child\n */\nexport function extractFieldValue(root: Element, selectorOrAttr: string): string | null {\n // Check if it's a direct data attribute reference (no brackets)\n if (selectorOrAttr.startsWith('data-')) {\n return root.getAttribute(selectorOrAttr);\n }\n\n // Check for attribute extraction syntax: \"selector @attr\"\n const attrMatch = selectorOrAttr.match(/^(.+?)\\s+@(.+)$/);\n if (attrMatch) {\n const [, selector, attr] = attrMatch;\n const child = root.querySelector(selector);\n return child?.getAttribute(attr) ?? null;\n }\n\n // Standard selector - get text content\n const child = root.querySelector(selectorOrAttr);\n return child?.textContent?.trim() ?? null;\n}\n\n/**\n * Extract all entities of a type from a page\n */\nexport function extractAllEntities(\n entityType: string,\n schema: EntitySchema,\n root: ParentNode = document\n): Array<Record<string, string | null>> {\n const elements = findAllEntities(entityType, root);\n return elements.map((el) => extractEntity(el, schema));\n}\n\n// =============================================================================\n// State Management\n// =============================================================================\n\n/**\n * Set the state of an element\n */\nexport function setState(element: Element, state: BBState): void {\n element.setAttribute('data-bb-state', state);\n}\n\n/**\n * Wait for an element to reach a specific state\n */\nexport function waitForState(\n element: Element,\n targetState: BBState,\n options: { timeout?: number; pollInterval?: number } = {}\n): Promise<void> {\n const { timeout = 30000, pollInterval = 100 } = options;\n\n return new Promise((resolve, reject) => {\n const startTime = Date.now();\n\n const check = () => {\n const currentState = getState(element);\n if (currentState === targetState) {\n resolve();\n return;\n }\n\n if (Date.now() - startTime > timeout) {\n reject(new Error(`Timeout waiting for state \"${targetState}\". Current: \"${currentState}\"`));\n return;\n }\n\n setTimeout(check, pollInterval);\n };\n\n check();\n });\n}\n\n/**\n * Observe state changes on an element\n */\nexport function observeState(\n element: Element,\n callback: (state: BBState | null, previousState: BBState | null) => void\n): () => void {\n let previousState = getState(element);\n\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'attributes' && mutation.attributeName === 'data-bb-state') {\n const newState = getState(element);\n if (newState !== previousState) {\n callback(newState, previousState);\n previousState = newState;\n }\n }\n }\n });\n\n observer.observe(element, { attributes: true, attributeFilter: ['data-bb-state'] });\n\n return () => observer.disconnect();\n}\n\n// =============================================================================\n// Action Helpers\n// =============================================================================\n\n/**\n * Get all available actions with their metadata\n */\nexport function getAvailableActions(root: ParentNode = document): Array<{\n id: string;\n element: Element;\n state: BBState | null;\n requiresConfirmation: boolean;\n description: string | null;\n inputs: Record<string, unknown> | null;\n cost: { usd?: number; risk?: string } | null;\n}> {\n const elements = findAllActionElements(root);\n return elements.map((element) => ({\n id: getActionId(element)!,\n element,\n state: getState(element),\n requiresConfirmation: requiresConfirmation(element),\n description: getDescription(element),\n inputs: getInputs(element),\n cost: getCost(element),\n }));\n}\n\n/**\n * Check if an action is currently available (not disabled/loading/hidden)\n */\nexport function isActionAvailable(element: Element): boolean {\n const state = getState(element);\n if (!state || state === 'idle' || state === 'success') return true;\n return false;\n}\n\n// =============================================================================\n// Manifest Discovery\n// =============================================================================\n\n/**\n * Find the bb-manifest link in the document\n */\nexport function findManifestUrl(doc: Document = document): string | null {\n const link = doc.querySelector('link[rel=\"bb-manifest\"]');\n if (link) {\n return link.getAttribute('href');\n }\n // Default location\n return '/bb-manifest.json';\n}\n\n/**\n * Fetch and parse the bb-manifest for the current page\n */\nexport async function fetchManifest(\n url?: string\n): Promise<{ success: true; data: unknown } | { success: false; error: string }> {\n const manifestUrl = url ?? findManifestUrl();\n if (!manifestUrl) {\n return { success: false, error: 'No manifest URL found' };\n }\n\n try {\n const response = await fetch(manifestUrl);\n if (!response.ok) {\n return { success: false, error: `HTTP ${response.status}: ${response.statusText}` };\n }\n const data = await response.json();\n return { success: true, data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n"]}