@forumone/throughline 1.9.1 → 2.0.0-next-a30f5dd

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 (49) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/authoring/descriptors.d.ts +44 -0
  3. package/dist/authoring/descriptors.d.ts.map +1 -0
  4. package/dist/authoring/descriptors.js +80 -0
  5. package/dist/authoring/descriptors.js.map +1 -0
  6. package/dist/authoring/prompts.d.ts +19 -0
  7. package/dist/authoring/prompts.d.ts.map +1 -0
  8. package/dist/authoring/prompts.js +63 -0
  9. package/dist/authoring/prompts.js.map +1 -0
  10. package/dist/authoring/surface.d.ts +17 -0
  11. package/dist/authoring/surface.d.ts.map +1 -0
  12. package/dist/authoring/surface.js +58 -0
  13. package/dist/authoring/surface.js.map +1 -0
  14. package/dist/authoring/tools.d.ts +27 -0
  15. package/dist/authoring/tools.d.ts.map +1 -0
  16. package/dist/authoring/tools.js +351 -0
  17. package/dist/authoring/tools.js.map +1 -0
  18. package/dist/content/blocks.d.ts +156 -0
  19. package/dist/content/blocks.d.ts.map +1 -1
  20. package/dist/content/blocks.js +203 -86
  21. package/dist/content/blocks.js.map +1 -1
  22. package/dist/content/guards.js +1 -1
  23. package/dist/content/guards.js.map +1 -1
  24. package/dist/content/tools.js +1 -1
  25. package/dist/content/tools.js.map +1 -1
  26. package/dist/content/write.js +4 -4
  27. package/dist/content/write.js.map +1 -1
  28. package/dist/index.d.ts +5 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +3 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/mcp/audit-server.d.ts.map +1 -1
  33. package/dist/mcp/audit-server.js +2 -0
  34. package/dist/mcp/audit-server.js.map +1 -1
  35. package/dist/mcp/collector.d.ts +11 -0
  36. package/dist/mcp/collector.d.ts.map +1 -1
  37. package/dist/mcp/collector.js +7 -0
  38. package/dist/mcp/collector.js.map +1 -1
  39. package/dist/migrate/exports.json +7 -0
  40. package/dist/publishing/pipeline/steps/approval.js +1 -1
  41. package/dist/publishing/pipeline/steps/approval.js.map +1 -1
  42. package/dist/publishing/tools/rollback.d.ts.map +1 -1
  43. package/dist/publishing/tools/rollback.js +16 -0
  44. package/dist/publishing/tools/rollback.js.map +1 -1
  45. package/dist/throughline.d.ts +13 -0
  46. package/dist/throughline.d.ts.map +1 -1
  47. package/dist/throughline.js +19 -1
  48. package/dist/throughline.js.map +1 -1
  49. package/package.json +3 -3
@@ -0,0 +1,351 @@
1
+ import { z } from 'zod';
2
+ import { deniedEnvelope } from '../mcp/envelope.js';
3
+ import { withMeta } from '../mcp/meta.js';
4
+ import { formatZodIssues } from '../utils/zod-issues.js';
5
+ import { editBlocksInput } from '../content/blocks.js';
6
+ import { AUTHORING_TOOLS } from './descriptors.js';
7
+ const PUBLISHER_ROLES = ['admin', 'editor'];
8
+ export function defaultCanPublish(ctx) {
9
+ return Boolean(ctx.user?.roles.some((role) => PUBLISHER_ROLES.includes(role)));
10
+ }
11
+ /** Calls a module tool's handler, parsing the input against its own schema. */
12
+ export async function delegate(inner, name, input, ctx) {
13
+ const tool = inner.definition(name);
14
+ if (!tool)
15
+ return { error: `This site does not offer that (${name} is off).` };
16
+ const parsed = tool.inputSchema.safeParse(withoutUndefined(input));
17
+ if (!parsed.success)
18
+ return { error: `Invalid input: ${formatZodIssues(parsed.error)}` };
19
+ return (await tool.handler(parsed.data, ctx));
20
+ }
21
+ function withoutUndefined(input) {
22
+ return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined));
23
+ }
24
+ const id = z
25
+ .union([z.string(), z.number()])
26
+ .describe('The document id, as `find` or `get` gives it.');
27
+ /* ------------------------------------------------------------------------ */
28
+ function findTool(deps) {
29
+ const inputSchema = z.object({
30
+ query: z
31
+ .string()
32
+ .optional()
33
+ .describe('Words to match against titles (and slugs). Optional with `collection`, `kind` or `mine`.'),
34
+ collection: z
35
+ .string()
36
+ .optional()
37
+ .describe(`One content type to search, by slug: ${deps.contentTypes.join(', ')}. Without it, every content type is searched.`),
38
+ kind: z
39
+ .string()
40
+ .optional()
41
+ .describe(deps.kinds.length > 0
42
+ ? `Something to link or attach rather than a page: ${deps.kinds.join(', ')}.`
43
+ : 'Not available on this site.'),
44
+ where: z
45
+ .record(z.string(), z.union([z.string(), z.number(), z.boolean()]))
46
+ .optional()
47
+ .describe('With `kind`: exact values to filter on, by field, where the kind allows it.'),
48
+ mine: z.boolean().optional().describe('Your own unpublished drafts and scheduled publishes.'),
49
+ limit: z
50
+ .number()
51
+ .int()
52
+ .min(1)
53
+ .max(50)
54
+ .optional()
55
+ .describe('At most this many results. Default 10.'),
56
+ });
57
+ return {
58
+ ...AUTHORING_TOOLS.find,
59
+ inputSchema,
60
+ handler: async (input, ctx) => {
61
+ if (input.kind) {
62
+ return delegate(deps.inner, 'find_related', { kind: input.kind, query: input.query, where: input.where, limit: input.limit }, ctx);
63
+ }
64
+ if (input.mine)
65
+ return delegate(deps.inner, 'list_my_work', {}, ctx);
66
+ if (input.collection) {
67
+ return delegate(deps.inner, 'find_documents', { collection: input.collection, query: input.query, limit: input.limit }, ctx);
68
+ }
69
+ if (!input.query) {
70
+ return { error: 'Give a `query`, or one of `collection`, `kind` or `mine`.' };
71
+ }
72
+ if (deps.inner.definition('search_content')) {
73
+ return delegate(deps.inner, 'search_content', { query: input.query, perCollection: input.limit }, ctx);
74
+ }
75
+ // No palette on this site: the content types one at a time.
76
+ const results = [];
77
+ for (const collection of deps.contentTypes) {
78
+ const found = await delegate(deps.inner, 'find_documents', { collection, query: input.query, limit: input.limit ?? 5 }, ctx);
79
+ if ('error' in found)
80
+ return found;
81
+ for (const row of found['results'] ?? [])
82
+ results.push({ collection, ...row });
83
+ }
84
+ return { query: input.query, results };
85
+ },
86
+ };
87
+ }
88
+ function getTool(deps) {
89
+ const inputSchema = z.object({
90
+ collection: z
91
+ .string()
92
+ .optional()
93
+ .describe(`The content type, by slug: ${deps.contentTypes.join(', ')}.`),
94
+ id: id.optional(),
95
+ draft: z
96
+ .boolean()
97
+ .optional()
98
+ .describe('With `id`: the latest draft (default) or, false, what is published.'),
99
+ versions: z
100
+ .boolean()
101
+ .optional()
102
+ .describe('With `id`: also list its ten most recent versions, for `publish` with action "rollback".'),
103
+ });
104
+ return {
105
+ ...AUTHORING_TOOLS.get,
106
+ inputSchema,
107
+ handler: async (input, ctx) => {
108
+ if (!input.collection) {
109
+ return {
110
+ contentTypes: deps.contentTypes,
111
+ kinds: deps.kinds,
112
+ next: 'Call get with a collection to see what you can write to it.',
113
+ };
114
+ }
115
+ if (input.id === undefined) {
116
+ return delegate(deps.inner, 'describe_content_type', { collection: input.collection }, ctx);
117
+ }
118
+ const doc = await delegate(deps.inner, 'get_document', { collection: input.collection, id: input.id, draft: input.draft }, ctx);
119
+ if ('error' in doc || !input.versions)
120
+ return doc;
121
+ return {
122
+ ...doc,
123
+ versions: await recentVersions(deps.payload, input.collection, input.id, ctx),
124
+ };
125
+ },
126
+ };
127
+ }
128
+ /** The document's recent versions, as the caller may read them. */
129
+ async function recentVersions(payload, collection, parent, ctx) {
130
+ const found = await payload.findVersions({
131
+ collection: collection,
132
+ where: { parent: { equals: parent } },
133
+ sort: '-updatedAt',
134
+ limit: 10,
135
+ depth: 0,
136
+ overrideAccess: false,
137
+ ...(ctx.user ? { user: ctx.user } : {}),
138
+ });
139
+ return found.docs.map((version) => {
140
+ const v = version;
141
+ return {
142
+ versionId: String(v['id']),
143
+ updatedAt: v['updatedAt'],
144
+ status: v.version?.['_status'] ?? null,
145
+ ...(v['autosave'] ? { autosave: true } : {}),
146
+ };
147
+ });
148
+ }
149
+ function saveDraftTool(deps) {
150
+ const inputSchema = withMeta({
151
+ collection: z.string().describe(`The content type, by slug: ${deps.contentTypes.join(', ')}.`),
152
+ id: id.optional().describe('The document to change. Omit to create a new one.'),
153
+ data: z
154
+ .record(z.string(), z.unknown())
155
+ .describe('The fields to set, by name, as `get` with only `collection` lists them. When changing, only the fields to change.'),
156
+ });
157
+ return {
158
+ ...AUTHORING_TOOLS.saveDraft,
159
+ inputSchema,
160
+ handler: async (input, ctx) => input.id === undefined
161
+ ? delegate(deps.inner, 'create_draft', { collection: input.collection, data: input.data, _meta: input._meta }, ctx)
162
+ : delegate(deps.inner, 'update_draft', { collection: input.collection, id: input.id, patch: input.data, _meta: input._meta }, ctx),
163
+ };
164
+ }
165
+ function editBlocksTool(deps) {
166
+ // The content module's own schema, so the two cannot disagree about what validates.
167
+ return {
168
+ ...AUTHORING_TOOLS.editBlocks,
169
+ inputSchema: editBlocksInput,
170
+ handler: (input, ctx) => delegate(deps.inner, 'edit_blocks', input, ctx),
171
+ };
172
+ }
173
+ function checkTool(deps) {
174
+ const inputSchema = z.object({
175
+ collection: z.string().describe('The content type, by slug.'),
176
+ id,
177
+ });
178
+ return {
179
+ ...AUTHORING_TOOLS.check,
180
+ inputSchema,
181
+ handler: (input, ctx) => delegate(deps.inner, 'get_publish_status', { collection: input.collection, id: String(input.id) }, ctx),
182
+ };
183
+ }
184
+ const LIVE_ACTIONS = new Set(['now', 'schedule', 'unpublish', 'rollback']);
185
+ function publishTool(deps) {
186
+ const canPublish = deps.canPublish ?? defaultCanPublish;
187
+ const groups = deps.approverGroups.map((group) => group.slug);
188
+ const approval = z
189
+ .object({
190
+ changesSummary: z
191
+ .string()
192
+ .min(20)
193
+ .describe('What changed and why, for the approvers. At least 20 characters.'),
194
+ approverGroups: z
195
+ .array(z.string())
196
+ .min(1)
197
+ .describe(groups.length > 0
198
+ ? `Who should approve: one or more of ${groups.join(', ')}.`
199
+ : 'Approvals are off on this site.'),
200
+ reason: z.string().optional().describe('Why it needs approving now, if there is a deadline.'),
201
+ })
202
+ .describe('For "request_approval", or for "now" on a document that needs approval: who to ask, and what to tell them.');
203
+ const inputSchema = withMeta({
204
+ collection: z.string().describe('The content type, by slug.'),
205
+ id,
206
+ action: z
207
+ .enum(['now', 'schedule', 'unpublish', 'rollback', 'request_approval'])
208
+ .describe('What to do. See the tool description.'),
209
+ at: z
210
+ .string()
211
+ .datetime({ offset: true })
212
+ .optional()
213
+ .describe('For "schedule": when, as an ISO 8601 date and time with an offset, e.g. 2026-11-02T09:00:00-05:00.'),
214
+ versionId: z
215
+ .union([z.string(), z.number()])
216
+ .optional()
217
+ .describe('For "rollback": the version to restore, from `get` with `versions`.'),
218
+ approval: approval.optional(),
219
+ });
220
+ return {
221
+ ...AUTHORING_TOOLS.publish,
222
+ inputSchema,
223
+ handler: async (input, ctx) => {
224
+ if (!ctx.user)
225
+ return deniedEnvelope('Publishing needs a signed-in person behind the key.');
226
+ if (LIVE_ACTIONS.has(input.action) && !canPublish(ctx)) {
227
+ return deniedEnvelope(`Taking something live needs an editor or an admin, and ${ctx.user.name ?? ctx.user.email} is ${ctx.user.roles.join(', ') || 'neither'}. ` +
228
+ 'Use action "request_approval" to ask someone who can.');
229
+ }
230
+ const target = { collection: input.collection, id: String(input.id), _meta: input._meta };
231
+ const requestApproval = (a) => delegate(deps.inner, 'request_approval', {
232
+ ...target,
233
+ changesSummary: a.changesSummary,
234
+ approverGroups: a.approverGroups,
235
+ requestReason: a.reason,
236
+ }, ctx);
237
+ switch (input.action) {
238
+ case 'now': {
239
+ const outcome = await delegate(deps.inner, 'publish', target, ctx);
240
+ if (outcome['code'] !== 'approval-required')
241
+ return outcome;
242
+ if (input.approval) {
243
+ return {
244
+ published: false,
245
+ approvalRequired: true,
246
+ approvalRequest: await requestApproval(input.approval),
247
+ };
248
+ }
249
+ return {
250
+ ...outcome,
251
+ approvalRequired: true,
252
+ next: 'This needs approval before it can go live. Ask the person who should approve it, then call publish with action "request_approval" and ' +
253
+ `approval: { changesSummary, approverGroups${groups.length > 0 ? ` (one or more of ${groups.join(', ')})` : ''} }.`,
254
+ };
255
+ }
256
+ case 'schedule':
257
+ if (!input.at)
258
+ return { error: 'Scheduling needs `at`: when to publish.' };
259
+ return delegate(deps.inner, 'schedule_publish', { ...target, publishAt: input.at }, ctx);
260
+ case 'unpublish':
261
+ return delegate(deps.inner, 'unpublish', target, ctx);
262
+ case 'rollback':
263
+ if (!input.versionId)
264
+ return { error: 'A rollback needs `versionId`. `get` with `versions` lists them.' };
265
+ return delegate(deps.inner, 'rollback', { ...target, versionId: String(input.versionId) }, ctx);
266
+ case 'request_approval':
267
+ if (!input.approval)
268
+ return { error: 'A request needs `approval`: { changesSummary, approverGroups }.' };
269
+ return requestApproval(input.approval);
270
+ }
271
+ },
272
+ };
273
+ }
274
+ function designGuideTool(deps) {
275
+ const inputSchema = z.object({
276
+ intent: z
277
+ .string()
278
+ .min(5)
279
+ .optional()
280
+ .describe('What the person wants a section or page to do, in their words. Returns the components that suit it, ranked.'),
281
+ existingBlocks: z
282
+ .array(z.string())
283
+ .optional()
284
+ .describe('With `intent`: the block types already on the page, so suggestions that would clash are flagged.'),
285
+ component: z.string().optional().describe('A component by name, for its full contract.'),
286
+ recipes: z
287
+ .boolean()
288
+ .optional()
289
+ .describe('The primitives and inline components a composed section may be built from.'),
290
+ category: z
291
+ .string()
292
+ .optional()
293
+ .describe('With none of the others: list only this category, e.g. "hero", "cta".'),
294
+ });
295
+ return {
296
+ ...AUTHORING_TOOLS.designGuide,
297
+ inputSchema,
298
+ handler: (input, ctx) => {
299
+ if (input.component)
300
+ return delegate(deps.inner, 'get_contract', { name: input.component }, ctx);
301
+ if (input.intent) {
302
+ return delegate(deps.inner, 'suggest_for_intent', {
303
+ intent: input.intent,
304
+ ...(input.existingBlocks ? { context: { existingBlocks: input.existingBlocks } } : {}),
305
+ }, ctx);
306
+ }
307
+ if (input.recipes)
308
+ return delegate(deps.inner, 'get_recipe_vocabulary', {}, ctx);
309
+ return delegate(deps.inner, 'list_components', { category: input.category }, ctx);
310
+ },
311
+ };
312
+ }
313
+ function composeSectionTool(deps) {
314
+ const inputSchema = withMeta({
315
+ contract: z
316
+ .record(z.string(), z.unknown())
317
+ .describe("The section's contract: its name, intent and content fields."),
318
+ tree: z
319
+ .record(z.string(), z.unknown())
320
+ .describe("What it renders: primitives and inline components, binding their content to the contract's fields."),
321
+ save: z
322
+ .boolean()
323
+ .optional()
324
+ .describe('Save it as a draft recipe once it passes. Default: only check it.'),
325
+ id: z
326
+ .union([z.string(), z.number()])
327
+ .optional()
328
+ .describe('With `save`: the draft recipe to replace.'),
329
+ });
330
+ return {
331
+ ...AUTHORING_TOOLS.composeSection,
332
+ inputSchema,
333
+ handler: (input, ctx) => input.save
334
+ ? delegate(deps.inner, 'save_recipe', { contract: input.contract, tree: input.tree, id: input.id, _meta: input._meta }, ctx)
335
+ : delegate(deps.inner, 'validate_recipe', { contract: input.contract, tree: input.tree, _meta: input._meta }, ctx),
336
+ };
337
+ }
338
+ /** The eight, in the order a client lists them. */
339
+ export function createAuthoringTools(deps) {
340
+ return [
341
+ findTool(deps),
342
+ getTool(deps),
343
+ saveDraftTool(deps),
344
+ editBlocksTool(deps),
345
+ checkTool(deps),
346
+ publishTool(deps),
347
+ designGuideTool(deps),
348
+ composeSectionTool(deps),
349
+ ];
350
+ }
351
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/authoring/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAwBlD,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AAE3C,MAAM,UAAU,iBAAiB,CAAC,GAAmB;IACnD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AAChF,CAAC;AAID,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,KAA6B,EAC7B,IAAY,EACZ,KAA8B,EAC9B,GAAmB;IAEnB,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IACnC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,kCAAkC,IAAI,WAAW,EAAE,CAAA;IAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAA;IAClE,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAA;IACxF,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAW,CAAA;AACzD,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA8B;IACtD,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAA;AAC7F,CAAC;AAED,MAAM,EAAE,GAAG,CAAC;KACT,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;KAC/B,QAAQ,CAAC,+CAA+C,CAAC,CAAA;AAE5D,8EAA8E;AAE9E,SAAS,QAAQ,CAAC,IAAmB;IACnC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;QAC3B,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,0FAA0F,CAC3F;QACH,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,wCAAwC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,+CAA+C,CACpH;QACH,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YACnB,CAAC,CAAC,mDAAmD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YAC7E,CAAC,CAAC,6BAA6B,CAClC;QACH,KAAK,EAAE,CAAC;aACL,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;aAClE,QAAQ,EAAE;aACV,QAAQ,CAAC,6EAA6E,CAAC;QAC1F,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;QAC7F,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;aACP,QAAQ,EAAE;aACV,QAAQ,CAAC,wCAAwC,CAAC;KACtD,CAAC,CAAA;IACF,OAAO;QACL,GAAG,eAAe,CAAC,IAAI;QACvB,WAAW;QACX,OAAO,EAAE,KAAK,EAAE,KAAkC,EAAE,GAAmB,EAAE,EAAE;YACzE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,QAAQ,CACb,IAAI,CAAC,KAAK,EACV,cAAc,EACd,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAChF,GAAG,CACJ,CAAA;YACH,CAAC;YACD,IAAI,KAAK,CAAC,IAAI;gBAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;YACpE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACrB,OAAO,QAAQ,CACb,IAAI,CAAC,KAAK,EACV,gBAAgB,EAChB,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EACxE,GAAG,CACJ,CAAA;YACH,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,EAAE,KAAK,EAAE,2DAA2D,EAAE,CAAA;YAC/E,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC5C,OAAO,QAAQ,CACb,IAAI,CAAC,KAAK,EACV,gBAAgB,EAChB,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,CAAC,KAAK,EAAE,EAClD,GAAG,CACJ,CAAA;YACH,CAAC;YACD,4DAA4D;YAC5D,MAAM,OAAO,GAAa,EAAE,CAAA;YAC5B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC3C,MAAM,KAAK,GAAG,MAAM,QAAQ,CAC1B,IAAI,CAAC,KAAK,EACV,gBAAgB,EAChB,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,EAC3D,GAAG,CACJ,CAAA;gBACD,IAAI,OAAO,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAA;gBAClC,KAAK,MAAM,GAAG,IAAK,KAAK,CAAC,SAAS,CAA0B,IAAI,EAAE;oBAChE,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,GAAG,GAAG,EAAE,CAAC,CAAA;YACxC,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,CAAA;QACxC,CAAC;KAC8C,CAAA;AACnD,CAAC;AAED,SAAS,OAAO,CAAC,IAAmB;IAClC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;QAC3B,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,8BAA8B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1E,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE;QACjB,KAAK,EAAE,CAAC;aACL,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,qEAAqE,CAAC;QAClF,QAAQ,EAAE,CAAC;aACR,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CACP,0FAA0F,CAC3F;KACJ,CAAC,CAAA;IACF,OAAO;QACL,GAAG,eAAe,CAAC,GAAG;QACtB,WAAW;QACX,OAAO,EAAE,KAAK,EAAE,KAAkC,EAAE,GAAmB,EAAE,EAAE;YACzE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBACtB,OAAO;oBACL,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,IAAI,EAAE,6DAA6D;iBACpE,CAAA;YACH,CAAC;YACD,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,uBAAuB,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,GAAG,CAAC,CAAA;YAC7F,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CACxB,IAAI,CAAC,KAAK,EACV,cAAc,EACd,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAClE,GAAG,CACJ,CAAA;YACD,IAAI,OAAO,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ;gBAAE,OAAO,GAAG,CAAA;YACjD,OAAO;gBACL,GAAG,GAAG;gBACN,QAAQ,EAAE,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC;aAC9E,CAAA;QACH,CAAC;KAC8C,CAAA;AACnD,CAAC;AAED,mEAAmE;AACnE,KAAK,UAAU,cAAc,CAC3B,OAAgB,EAChB,UAAkB,EAClB,MAAuB,EACvB,GAAmB;IAEnB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;QACvC,UAAU,EAAE,UAA4B;QACxC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,CAAC;QACR,cAAc,EAAE,KAAK;QACrB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjD,CAAC,CAAA;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAChC,MAAM,CAAC,GAAG,OAAmD,CAAA;QAC7D,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1B,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC;YACzB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,IAAI,IAAI;YACtC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7C,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,IAAmB;IACxC,MAAM,WAAW,GAAG,QAAQ,CAAC;QAC3B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAC9F,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QAC/E,IAAI,EAAE,CAAC;aACJ,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/B,QAAQ,CACP,mHAAmH,CACpH;KACJ,CAAC,CAAA;IACF,OAAO;QACL,GAAG,eAAe,CAAC,SAAS;QAC5B,WAAW;QACX,OAAO,EAAE,KAAK,EAAE,KAAkC,EAAE,GAAmB,EAAE,EAAE,CACzE,KAAK,CAAC,EAAE,KAAK,SAAS;YACpB,CAAC,CAAC,QAAQ,CACN,IAAI,CAAC,KAAK,EACV,cAAc,EACd,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EACtE,GAAG,CACJ;YACH,CAAC,CAAC,QAAQ,CACN,IAAI,CAAC,KAAK,EACV,cAAc,EACd,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EACrF,GAAG,CACJ;KACwC,CAAA;AACnD,CAAC;AAED,SAAS,cAAc,CAAC,IAAmB;IACzC,oFAAoF;IACpF,OAAO;QACL,GAAG,eAAe,CAAC,UAAU;QAC7B,WAAW,EAAE,eAAe;QAC5B,OAAO,EAAE,CAAC,KAAsC,EAAE,GAAmB,EAAE,EAAE,CACvE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,KAAe,EAAE,GAAG,CAAC;KACR,CAAA;AACvD,CAAC;AAED,SAAS,SAAS,CAAC,IAAmB;IACpC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;QAC3B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QAC7D,EAAE;KACH,CAAC,CAAA;IACF,OAAO;QACL,GAAG,eAAe,CAAC,KAAK;QACxB,WAAW;QACX,OAAO,EAAE,CAAC,KAAkC,EAAE,GAAmB,EAAE,EAAE,CACnE,QAAQ,CACN,IAAI,CAAC,KAAK,EACV,oBAAoB,EACpB,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EACtD,GAAG,CACJ;KAC4C,CAAA;AACnD,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAA;AAE1E,SAAS,WAAW,CAAC,IAAmB;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,iBAAiB,CAAA;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC7D,MAAM,QAAQ,GAAG,CAAC;SACf,MAAM,CAAC;QACN,cAAc,EAAE,CAAC;aACd,MAAM,EAAE;aACR,GAAG,CAAC,EAAE,CAAC;aACP,QAAQ,CAAC,kEAAkE,CAAC;QAC/E,cAAc,EAAE,CAAC;aACd,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CACP,MAAM,CAAC,MAAM,GAAG,CAAC;YACf,CAAC,CAAC,sCAAsC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YAC5D,CAAC,CAAC,iCAAiC,CACtC;QACH,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;KAC9F,CAAC;SACD,QAAQ,CACP,4GAA4G,CAC7G,CAAA;IACH,MAAM,WAAW,GAAG,QAAQ,CAAC;QAC3B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QAC7D,EAAE;QACF,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAC;aACtE,QAAQ,CAAC,uCAAuC,CAAC;QACpD,EAAE,EAAE,CAAC;aACF,MAAM,EAAE;aACR,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;aAC1B,QAAQ,EAAE;aACV,QAAQ,CACP,oGAAoG,CACrG;QACH,SAAS,EAAE,CAAC;aACT,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;aAC/B,QAAQ,EAAE;aACV,QAAQ,CAAC,qEAAqE,CAAC;QAClF,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE;KAC9B,CAAC,CAAA;IAEF,OAAO;QACL,GAAG,eAAe,CAAC,OAAO;QAC1B,WAAW;QACX,OAAO,EAAE,KAAK,EAAE,KAAkC,EAAE,GAAmB,EAAmB,EAAE;YAC1F,IAAI,CAAC,GAAG,CAAC,IAAI;gBAAE,OAAO,cAAc,CAAC,qDAAqD,CAAC,CAAA;YAC3F,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvD,OAAO,cAAc,CACnB,0DAA0D,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,IAAI;oBACxI,uDAAuD,CAC1D,CAAA;YACH,CAAC;YACD,MAAM,MAAM,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAA;YACzF,MAAM,eAAe,GAAG,CAAC,CAA2B,EAAE,EAAE,CACtD,QAAQ,CACN,IAAI,CAAC,KAAK,EACV,kBAAkB,EAClB;gBACE,GAAG,MAAM;gBACT,cAAc,EAAE,CAAC,CAAC,cAAc;gBAChC,cAAc,EAAE,CAAC,CAAC,cAAc;gBAChC,aAAa,EAAE,CAAC,CAAC,MAAM;aACxB,EACD,GAAG,CACJ,CAAA;YAEH,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;gBACrB,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;oBAClE,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,mBAAmB;wBAAE,OAAO,OAAO,CAAA;oBAC3D,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;wBACnB,OAAO;4BACL,SAAS,EAAE,KAAK;4BAChB,gBAAgB,EAAE,IAAI;4BACtB,eAAe,EAAE,MAAM,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC;yBACvD,CAAA;oBACH,CAAC;oBACD,OAAO;wBACL,GAAG,OAAO;wBACV,gBAAgB,EAAE,IAAI;wBACtB,IAAI,EACF,wIAAwI;4BACxI,6CAA6C,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK;qBACtH,CAAA;gBACH,CAAC;gBACD,KAAK,UAAU;oBACb,IAAI,CAAC,KAAK,CAAC,EAAE;wBAAE,OAAO,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAA;oBAC1E,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;gBAC1F,KAAK,WAAW;oBACd,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;gBACvD,KAAK,UAAU;oBACb,IAAI,CAAC,KAAK,CAAC,SAAS;wBAClB,OAAO,EAAE,KAAK,EAAE,iEAAiE,EAAE,CAAA;oBACrF,OAAO,QAAQ,CACb,IAAI,CAAC,KAAK,EACV,UAAU,EACV,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,EACjD,GAAG,CACJ,CAAA;gBACH,KAAK,kBAAkB;oBACrB,IAAI,CAAC,KAAK,CAAC,QAAQ;wBACjB,OAAO,EAAE,KAAK,EAAE,iEAAiE,EAAE,CAAA;oBACrF,OAAO,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;KAC8C,CAAA;AACnD,CAAC;AAED,SAAS,eAAe,CAAC,IAAmB;IAC1C,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;QAC3B,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,EAAE;aACV,QAAQ,CACP,6GAA6G,CAC9G;QACH,cAAc,EAAE,CAAC;aACd,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,QAAQ,EAAE;aACV,QAAQ,CACP,kGAAkG,CACnG;QACH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QACxF,OAAO,EAAE,CAAC;aACP,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,4EAA4E,CAAC;QACzF,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,uEAAuE,CAAC;KACrF,CAAC,CAAA;IACF,OAAO;QACL,GAAG,eAAe,CAAC,WAAW;QAC9B,WAAW;QACX,OAAO,EAAE,CAAC,KAAkC,EAAE,GAAmB,EAAE,EAAE;YACnE,IAAI,KAAK,CAAC,SAAS;gBACjB,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAA;YAC7E,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,QAAQ,CACb,IAAI,CAAC,KAAK,EACV,oBAAoB,EACpB;oBACE,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACvF,EACD,GAAG,CACJ,CAAA;YACH,CAAC;YACD,IAAI,KAAK,CAAC,OAAO;gBAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,uBAAuB,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;YAChF,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAA;QACnF,CAAC;KAC8C,CAAA;AACnD,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAmB;IAC7C,MAAM,WAAW,GAAG,QAAQ,CAAC;QAC3B,QAAQ,EAAE,CAAC;aACR,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/B,QAAQ,CAAC,8DAA8D,CAAC;QAC3E,IAAI,EAAE,CAAC;aACJ,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/B,QAAQ,CACP,oGAAoG,CACrG;QACH,IAAI,EAAE,CAAC;aACJ,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,mEAAmE,CAAC;QAChF,EAAE,EAAE,CAAC;aACF,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;aAC/B,QAAQ,EAAE;aACV,QAAQ,CAAC,2CAA2C,CAAC;KACzD,CAAC,CAAA;IACF,OAAO;QACL,GAAG,eAAe,CAAC,cAAc;QACjC,WAAW;QACX,OAAO,EAAE,CAAC,KAAkC,EAAE,GAAmB,EAAE,EAAE,CACnE,KAAK,CAAC,IAAI;YACR,CAAC,CAAC,QAAQ,CACN,IAAI,CAAC,KAAK,EACV,aAAa,EACb,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAChF,GAAG,CACJ;YACH,CAAC,CAAC,QAAQ,CACN,IAAI,CAAC,KAAK,EACV,iBAAiB,EACjB,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAClE,GAAG,CACJ;KACwC,CAAA;AACnD,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,oBAAoB,CAAC,IAAmB;IACtD,OAAO;QACL,QAAQ,CAAC,IAAI,CAAC;QACd,OAAO,CAAC,IAAI,CAAC;QACb,aAAa,CAAC,IAAI,CAAC;QACnB,cAAc,CAAC,IAAI,CAAC;QACpB,SAAS,CAAC,IAAI,CAAC;QACf,WAAW,CAAC,IAAI,CAAC;QACjB,eAAe,CAAC,IAAI,CAAC;QACrB,kBAAkB,CAAC,IAAI,CAAC;KACS,CAAA;AACrC,CAAC"}
@@ -20,6 +20,10 @@ export declare const CONTENT_BLOCK_TOOLS: {
20
20
  readonly name: "remove_block";
21
21
  readonly description: "Removes one block from a draft's blocks field, by its id. Checked against the composition rules, since a block may be another's required sibling.";
22
22
  };
23
+ readonly editBlocks: {
24
+ readonly name: "edit_blocks";
25
+ readonly description: "Changes the blocks in one blocks field of a draft (`layout`, or e.g. `approach.blocks`): insert, update, move and remove, as a list applied in order and saved together. Each new or changed block is checked against what the field accepts and its own validation, and the result against the composition rules, before anything is saved. Block ids come from get. To replace the whole field, use save_draft.";
26
+ };
23
27
  };
24
28
  export declare const CONTENT_BLOCK_TOOL_DESCRIPTORS: readonly McpToolDescriptor[];
25
29
  type BlocksField = Extract<Field, {
@@ -225,6 +229,158 @@ export declare function createInsertBlockTool(deps: ContentWriteDeps): McpToolDe
225
229
  export declare function createUpdateBlockTool(deps: ContentWriteDeps): McpToolDefinition<typeof updateInput>;
226
230
  export declare function createMoveBlockTool(deps: ContentWriteDeps): McpToolDefinition<typeof moveInput>;
227
231
  export declare function createRemoveBlockTool(deps: ContentWriteDeps): McpToolDefinition<typeof removeInput>;
232
+ export declare const editBlocksInput: z.ZodObject<{
233
+ operations: z.ZodArray<z.ZodDiscriminatedUnion<"op", [z.ZodObject<{
234
+ after: z.ZodOptional<z.ZodString>;
235
+ position: z.ZodOptional<z.ZodEnum<["start", "end"]>>;
236
+ op: z.ZodLiteral<"insert">;
237
+ block: z.ZodObject<{
238
+ blockType: z.ZodString;
239
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
240
+ blockType: z.ZodString;
241
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
242
+ blockType: z.ZodString;
243
+ }, z.ZodTypeAny, "passthrough">>;
244
+ }, "strip", z.ZodTypeAny, {
245
+ block: {
246
+ blockType: string;
247
+ } & {
248
+ [k: string]: unknown;
249
+ };
250
+ op: "insert";
251
+ position?: "start" | "end" | undefined;
252
+ after?: string | undefined;
253
+ }, {
254
+ block: {
255
+ blockType: string;
256
+ } & {
257
+ [k: string]: unknown;
258
+ };
259
+ op: "insert";
260
+ position?: "start" | "end" | undefined;
261
+ after?: string | undefined;
262
+ }>, z.ZodObject<{
263
+ op: z.ZodLiteral<"update">;
264
+ blockId: z.ZodString;
265
+ patch: z.ZodRecord<z.ZodString, z.ZodUnknown>;
266
+ }, "strip", z.ZodTypeAny, {
267
+ patch: Record<string, unknown>;
268
+ blockId: string;
269
+ op: "update";
270
+ }, {
271
+ patch: Record<string, unknown>;
272
+ blockId: string;
273
+ op: "update";
274
+ }>, z.ZodObject<{
275
+ after: z.ZodOptional<z.ZodString>;
276
+ position: z.ZodOptional<z.ZodEnum<["start", "end"]>>;
277
+ op: z.ZodLiteral<"move">;
278
+ blockId: z.ZodString;
279
+ }, "strip", z.ZodTypeAny, {
280
+ blockId: string;
281
+ op: "move";
282
+ position?: "start" | "end" | undefined;
283
+ after?: string | undefined;
284
+ }, {
285
+ blockId: string;
286
+ op: "move";
287
+ position?: "start" | "end" | undefined;
288
+ after?: string | undefined;
289
+ }>, z.ZodObject<{
290
+ op: z.ZodLiteral<"remove">;
291
+ blockId: z.ZodString;
292
+ }, "strip", z.ZodTypeAny, {
293
+ blockId: string;
294
+ op: "remove";
295
+ }, {
296
+ blockId: string;
297
+ op: "remove";
298
+ }>]>, "many">;
299
+ collection: z.ZodString;
300
+ id: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
301
+ field: z.ZodString;
302
+ } & {
303
+ _meta: z.ZodOptional<z.ZodObject<{
304
+ userPrompt: z.ZodOptional<z.ZodString>;
305
+ reasoning: z.ZodOptional<z.ZodString>;
306
+ changesSummary: z.ZodOptional<z.ZodString>;
307
+ }, "strip", z.ZodTypeAny, {
308
+ reasoning?: string | undefined;
309
+ changesSummary?: string | undefined;
310
+ userPrompt?: string | undefined;
311
+ }, {
312
+ reasoning?: string | undefined;
313
+ changesSummary?: string | undefined;
314
+ userPrompt?: string | undefined;
315
+ }>>;
316
+ }, "strip", z.ZodTypeAny, {
317
+ collection: string;
318
+ id: string | number;
319
+ field: string;
320
+ operations: ({
321
+ block: {
322
+ blockType: string;
323
+ } & {
324
+ [k: string]: unknown;
325
+ };
326
+ op: "insert";
327
+ position?: "start" | "end" | undefined;
328
+ after?: string | undefined;
329
+ } | {
330
+ patch: Record<string, unknown>;
331
+ blockId: string;
332
+ op: "update";
333
+ } | {
334
+ blockId: string;
335
+ op: "move";
336
+ position?: "start" | "end" | undefined;
337
+ after?: string | undefined;
338
+ } | {
339
+ blockId: string;
340
+ op: "remove";
341
+ })[];
342
+ _meta?: {
343
+ reasoning?: string | undefined;
344
+ changesSummary?: string | undefined;
345
+ userPrompt?: string | undefined;
346
+ } | undefined;
347
+ }, {
348
+ collection: string;
349
+ id: string | number;
350
+ field: string;
351
+ operations: ({
352
+ block: {
353
+ blockType: string;
354
+ } & {
355
+ [k: string]: unknown;
356
+ };
357
+ op: "insert";
358
+ position?: "start" | "end" | undefined;
359
+ after?: string | undefined;
360
+ } | {
361
+ patch: Record<string, unknown>;
362
+ blockId: string;
363
+ op: "update";
364
+ } | {
365
+ blockId: string;
366
+ op: "move";
367
+ position?: "start" | "end" | undefined;
368
+ after?: string | undefined;
369
+ } | {
370
+ blockId: string;
371
+ op: "remove";
372
+ })[];
373
+ _meta?: {
374
+ reasoning?: string | undefined;
375
+ changesSummary?: string | undefined;
376
+ userPrompt?: string | undefined;
377
+ } | undefined;
378
+ }>;
379
+ /**
380
+ * Several block operations on one field, checked and saved as one: the four
381
+ * single-block tools, as a list. forumone-2026#830.
382
+ */
383
+ export declare function createEditBlocksTool(deps: ContentWriteDeps): McpToolDefinition<typeof editBlocksInput>;
228
384
  export declare function createContentBlockTools(deps: ContentWriteDeps): McpToolDefinition[];
229
385
  export {};
230
386
  //# sourceMappingURL=blocks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/content/blocks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAyB,KAAK,EAAE,MAAM,SAAS,CAAA;AAC3D,OAAO,KAAK,EAAkB,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AACpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAY5D,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAe3E,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;CAqBsB,CAAA;AAEtD,eAAO,MAAM,8BAA8B,EAAE,SAAS,iBAAiB,EACnC,CAAA;AAEpC,KAAK,WAAW,GAAG,OAAO,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAA;AAErD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAWlF;AAqBD,yEAAyE;AACzE,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAyBD,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOf,CAAA;AACF,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIf,CAAA;AACF,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIb,CAAA;AACF,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGf,CAAA;AAmHF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,WAAW,CAAC,CAmBnG;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,WAAW,CAAC,CA2BnG;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,SAAS,CAAC,CAqB/F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,WAAW,CAAC,CAgBnG;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,GAAG,iBAAiB,EAAE,CAOnF"}
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/content/blocks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAyB,KAAK,EAAE,MAAM,SAAS,CAAA;AAC3D,OAAO,KAAK,EAAkB,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AACpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAM5D,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAe3E,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;CA0BsB,CAAA;AAEtD,eAAO,MAAM,8BAA8B,EAAE,SAAS,iBAAiB,EACnC,CAAA;AAEpC,KAAK,WAAW,GAAG,OAAO,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAA;AAErD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAWlF;AAqBD,yEAAyE;AACzE,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AA4BD,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOf,CAAA;AACF,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIf,CAAA;AACF,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIb,CAAA;AACF,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGf,CAAA;AA4NF,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,gBAAgB,GACrB,iBAAiB,CAAC,OAAO,WAAW,CAAC,CAUvC;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,gBAAgB,GACrB,iBAAiB,CAAC,OAAO,WAAW,CAAC,CAUvC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,SAAS,CAAC,CAU/F;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,gBAAgB,GACrB,iBAAiB,CAAC,OAAO,WAAW,CAAC,CAUvC;AA6BD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAS1B,CAAA;AAEF;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,gBAAgB,GACrB,iBAAiB,CAAC,OAAO,eAAe,CAAC,CAyB3C;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,GAAG,iBAAiB,EAAE,CAQnF"}