feishu-user-plugin 1.3.8 → 1.3.9

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 (40) hide show
  1. package/.claude-plugin/plugin.json +12 -2
  2. package/CHANGELOG.md +50 -12
  3. package/README.md +4 -4
  4. package/package.json +9 -5
  5. package/proto/lark.proto +10 -0
  6. package/scripts/explore-card-protobuf.js +144 -0
  7. package/scripts/explore-image-minimize.js +163 -0
  8. package/scripts/generate-release-artifacts.js +318 -0
  9. package/scripts/probe-feishu-docx.js +203 -0
  10. package/scripts/sync-team-skills.sh +109 -7
  11. package/skills/feishu-user-plugin/SKILL.md +76 -4
  12. package/skills/feishu-user-plugin/references/CLAUDE.md +74 -54
  13. package/src/auth/credentials.js +36 -0
  14. package/src/cli.js +86 -45
  15. package/src/clients/user.js +15 -13
  16. package/src/events/cursor.js +103 -0
  17. package/src/events/event-buffer.js +8 -5
  18. package/src/events/event-log.js +151 -0
  19. package/src/events/index.js +8 -1
  20. package/src/events/lockfile.js +126 -0
  21. package/src/events/owner.js +73 -0
  22. package/src/events/ws-server.js +95 -25
  23. package/src/oauth.js +48 -7
  24. package/src/resolver.js +10 -0
  25. package/src/server.js +248 -29
  26. package/src/setup.js +99 -25
  27. package/src/test-all.js +12 -9
  28. package/src/test-events-cursor.js +56 -0
  29. package/src/test-events-lockfile.js +36 -0
  30. package/src/test-events-log.js +67 -0
  31. package/src/test-events-owner.js +64 -0
  32. package/src/test-fixtures/doc-blocks/sample-1.json +1256 -0
  33. package/src/test-read-doc-markdown.js +61 -0
  34. package/src/test-switch-profile.js +171 -0
  35. package/src/tools/diagnostics.js +10 -3
  36. package/src/tools/docs.js +93 -3
  37. package/src/tools/events.js +143 -33
  38. package/src/tools/messaging-bot.js +2 -3
  39. package/src/tools/messaging-user.js +23 -14
  40. package/src/tools/profile.js +12 -7
@@ -0,0 +1,1256 @@
1
+ [
2
+ {
3
+ "block_id": "SWuAdfxPHoDRD3x9i0JcqmConEc",
4
+ "block_type": 1,
5
+ "children": [
6
+ "doxcnREQLoy9z6HBCRjhPa0Szbb",
7
+ "doxcnh5EGDKHIWcULQdsfvpFlVg",
8
+ "doxcnom41bdUAC0Sz1odWtvZO5c",
9
+ "doxcnQlBXifoATY3QEtRzpV8dXb",
10
+ "doxcnaSYW9Y9xR8EhiCk0WsLDId",
11
+ "doxcnQ2TiwavDUlyqdxjea4kKrc",
12
+ "doxcnTLodHYrD4AQFEx8zS1NWUf",
13
+ "doxcnwhOGMQBChIqZBosyFOwhbd",
14
+ "doxcnyt2SsTxW8G4YdPZt4blyKb",
15
+ "doxcnF7RPKjAb3tZJ0SbEjyE2yg",
16
+ "doxcnjXtviJu16gohoZqq2IQ05g",
17
+ "doxcnTom1Y3gYxu6w9jVUrEUFcy",
18
+ "doxcnwR1bQImdxtvZ2zG8i3nCFb",
19
+ "doxcnbHzWcBVth0lTL4nS4DpNfe",
20
+ "doxcnCfJWckeUkk4dNuleu0EvSc",
21
+ "doxcn53WZpx9wceQnq5XbEua17b",
22
+ "doxcnQLg6qCzN8d4WsKC39qTTq6",
23
+ "doxcnRxCVqI6nqFEpoUe3L5fcrg",
24
+ "doxcnH9pmL6bhQnlT2OOQ4rqkzh",
25
+ "doxcnOrBhb03ehZqNb4jmczOSEe",
26
+ "doxcn0djKxUZTEyLyl8kETjwzRp",
27
+ "doxcnRT4knIgwKdXCDhJwrJYp3e",
28
+ "doxcnh0MhFIUW40vv8jzckKFIKb",
29
+ "doxcnhpJXQafiDSRg7POXzK1vmb",
30
+ "doxcnSivIK3yxKSMuRYRVZrBXFh",
31
+ "doxcnfVlfFz6lPz3umpLsKUTFbh",
32
+ "doxcnXbRujWsWq6y2oebjMLGMgW"
33
+ ],
34
+ "page": {
35
+ "elements": [
36
+ {
37
+ "text_run": {
38
+ "content": "v1.3.9 D-probe — feishu-docx coverage test",
39
+ "text_element_style": {
40
+ "bold": false,
41
+ "inline_code": false,
42
+ "italic": false,
43
+ "strikethrough": false,
44
+ "underline": false
45
+ }
46
+ }
47
+ }
48
+ ],
49
+ "style": {
50
+ "align": 1
51
+ }
52
+ },
53
+ "parent_id": ""
54
+ },
55
+ {
56
+ "block_id": "doxcnREQLoy9z6HBCRjhPa0Szbb",
57
+ "block_type": 3,
58
+ "heading1": {
59
+ "elements": [
60
+ {
61
+ "text_run": {
62
+ "content": "v1.3.9 D-Probe Test Document",
63
+ "text_element_style": {
64
+ "bold": false,
65
+ "inline_code": false,
66
+ "italic": false,
67
+ "strikethrough": false,
68
+ "underline": false
69
+ }
70
+ }
71
+ }
72
+ ],
73
+ "style": {
74
+ "align": 1,
75
+ "folded": false
76
+ }
77
+ },
78
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc"
79
+ },
80
+ {
81
+ "block_id": "doxcnh5EGDKHIWcULQdsfvpFlVg",
82
+ "block_type": 2,
83
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc",
84
+ "text": {
85
+ "elements": [
86
+ {
87
+ "text_run": {
88
+ "content": "This document is used by scripts/probe-feishu-docx.js to discover which Feishu doc block types feishu-docx@^0.7.0 covers vs silently drops. It contains a representative sample of common block types.",
89
+ "text_element_style": {
90
+ "bold": false,
91
+ "inline_code": false,
92
+ "italic": false,
93
+ "strikethrough": false,
94
+ "underline": false
95
+ }
96
+ }
97
+ }
98
+ ],
99
+ "style": {
100
+ "align": 1,
101
+ "folded": false
102
+ }
103
+ }
104
+ },
105
+ {
106
+ "block_id": "doxcnom41bdUAC0Sz1odWtvZO5c",
107
+ "block_type": 4,
108
+ "heading2": {
109
+ "elements": [
110
+ {
111
+ "text_run": {
112
+ "content": "Section 1 — Inline formatting",
113
+ "text_element_style": {
114
+ "bold": false,
115
+ "inline_code": false,
116
+ "italic": false,
117
+ "strikethrough": false,
118
+ "underline": false
119
+ }
120
+ }
121
+ }
122
+ ],
123
+ "style": {
124
+ "align": 1,
125
+ "folded": false
126
+ }
127
+ },
128
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc"
129
+ },
130
+ {
131
+ "block_id": "doxcnQlBXifoATY3QEtRzpV8dXb",
132
+ "block_type": 2,
133
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc",
134
+ "text": {
135
+ "elements": [
136
+ {
137
+ "text_run": {
138
+ "content": "Plain text. ",
139
+ "text_element_style": {
140
+ "bold": false,
141
+ "inline_code": false,
142
+ "italic": false,
143
+ "strikethrough": false,
144
+ "underline": false
145
+ }
146
+ }
147
+ },
148
+ {
149
+ "text_run": {
150
+ "content": "Bold text. ",
151
+ "text_element_style": {
152
+ "bold": true,
153
+ "inline_code": false,
154
+ "italic": false,
155
+ "strikethrough": false,
156
+ "underline": false
157
+ }
158
+ }
159
+ },
160
+ {
161
+ "text_run": {
162
+ "content": "Italic text. ",
163
+ "text_element_style": {
164
+ "bold": false,
165
+ "inline_code": false,
166
+ "italic": true,
167
+ "strikethrough": false,
168
+ "underline": false
169
+ }
170
+ }
171
+ },
172
+ {
173
+ "text_run": {
174
+ "content": "Underline text. ",
175
+ "text_element_style": {
176
+ "bold": false,
177
+ "inline_code": false,
178
+ "italic": false,
179
+ "strikethrough": false,
180
+ "underline": true
181
+ }
182
+ }
183
+ },
184
+ {
185
+ "text_run": {
186
+ "content": "Strikethrough.",
187
+ "text_element_style": {
188
+ "bold": false,
189
+ "inline_code": false,
190
+ "italic": false,
191
+ "strikethrough": true,
192
+ "underline": false
193
+ }
194
+ }
195
+ }
196
+ ],
197
+ "style": {
198
+ "align": 1,
199
+ "folded": false
200
+ }
201
+ }
202
+ },
203
+ {
204
+ "block_id": "doxcnaSYW9Y9xR8EhiCk0WsLDId",
205
+ "block_type": 2,
206
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc",
207
+ "text": {
208
+ "elements": [
209
+ {
210
+ "text_run": {
211
+ "content": "An inline link: ",
212
+ "text_element_style": {
213
+ "bold": false,
214
+ "inline_code": false,
215
+ "italic": false,
216
+ "strikethrough": false,
217
+ "underline": false
218
+ }
219
+ }
220
+ },
221
+ {
222
+ "text_run": {
223
+ "content": "Anthropic",
224
+ "text_element_style": {
225
+ "bold": false,
226
+ "inline_code": false,
227
+ "italic": false,
228
+ "link": {
229
+ "url": "https%3A%2F%2Fanthropic.com"
230
+ },
231
+ "strikethrough": false,
232
+ "underline": false
233
+ }
234
+ }
235
+ },
236
+ {
237
+ "text_run": {
238
+ "content": ".",
239
+ "text_element_style": {
240
+ "bold": false,
241
+ "inline_code": false,
242
+ "italic": false,
243
+ "strikethrough": false,
244
+ "underline": false
245
+ }
246
+ }
247
+ }
248
+ ],
249
+ "style": {
250
+ "align": 1,
251
+ "folded": false
252
+ }
253
+ }
254
+ },
255
+ {
256
+ "block_id": "doxcnQ2TiwavDUlyqdxjea4kKrc",
257
+ "block_type": 2,
258
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc",
259
+ "text": {
260
+ "elements": [
261
+ {
262
+ "text_run": {
263
+ "content": "Inline code: ",
264
+ "text_element_style": {
265
+ "bold": false,
266
+ "inline_code": false,
267
+ "italic": false,
268
+ "strikethrough": false,
269
+ "underline": false
270
+ }
271
+ }
272
+ },
273
+ {
274
+ "text_run": {
275
+ "content": "console.log('hi')",
276
+ "text_element_style": {
277
+ "bold": false,
278
+ "inline_code": true,
279
+ "italic": false,
280
+ "strikethrough": false,
281
+ "underline": false
282
+ }
283
+ }
284
+ },
285
+ {
286
+ "text_run": {
287
+ "content": ".",
288
+ "text_element_style": {
289
+ "bold": false,
290
+ "inline_code": false,
291
+ "italic": false,
292
+ "strikethrough": false,
293
+ "underline": false
294
+ }
295
+ }
296
+ }
297
+ ],
298
+ "style": {
299
+ "align": 1,
300
+ "folded": false
301
+ }
302
+ }
303
+ },
304
+ {
305
+ "block_id": "doxcnTLodHYrD4AQFEx8zS1NWUf",
306
+ "block_type": 5,
307
+ "heading3": {
308
+ "elements": [
309
+ {
310
+ "text_run": {
311
+ "content": "Heading 3 example",
312
+ "text_element_style": {
313
+ "bold": false,
314
+ "inline_code": false,
315
+ "italic": false,
316
+ "strikethrough": false,
317
+ "underline": false
318
+ }
319
+ }
320
+ }
321
+ ],
322
+ "style": {
323
+ "align": 1,
324
+ "folded": false
325
+ }
326
+ },
327
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc"
328
+ },
329
+ {
330
+ "block_id": "doxcnwhOGMQBChIqZBosyFOwhbd",
331
+ "block_type": 6,
332
+ "heading4": {
333
+ "elements": [
334
+ {
335
+ "text_run": {
336
+ "content": "Heading 4 example",
337
+ "text_element_style": {
338
+ "bold": false,
339
+ "inline_code": false,
340
+ "italic": false,
341
+ "strikethrough": false,
342
+ "underline": false
343
+ }
344
+ }
345
+ }
346
+ ],
347
+ "style": {
348
+ "align": 1,
349
+ "folded": false
350
+ }
351
+ },
352
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc"
353
+ },
354
+ {
355
+ "block_id": "doxcnyt2SsTxW8G4YdPZt4blyKb",
356
+ "block_type": 4,
357
+ "heading2": {
358
+ "elements": [
359
+ {
360
+ "text_run": {
361
+ "content": "Section 2 — Lists",
362
+ "text_element_style": {
363
+ "bold": false,
364
+ "inline_code": false,
365
+ "italic": false,
366
+ "strikethrough": false,
367
+ "underline": false
368
+ }
369
+ }
370
+ }
371
+ ],
372
+ "style": {
373
+ "align": 1,
374
+ "folded": false
375
+ }
376
+ },
377
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc"
378
+ },
379
+ {
380
+ "block_id": "doxcnF7RPKjAb3tZJ0SbEjyE2yg",
381
+ "block_type": 12,
382
+ "bullet": {
383
+ "elements": [
384
+ {
385
+ "text_run": {
386
+ "content": "Bullet item one",
387
+ "text_element_style": {
388
+ "bold": false,
389
+ "inline_code": false,
390
+ "italic": false,
391
+ "strikethrough": false,
392
+ "underline": false
393
+ }
394
+ }
395
+ }
396
+ ],
397
+ "style": {
398
+ "align": 1,
399
+ "folded": false
400
+ }
401
+ },
402
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc"
403
+ },
404
+ {
405
+ "block_id": "doxcnjXtviJu16gohoZqq2IQ05g",
406
+ "block_type": 12,
407
+ "bullet": {
408
+ "elements": [
409
+ {
410
+ "text_run": {
411
+ "content": "Bullet item two",
412
+ "text_element_style": {
413
+ "bold": false,
414
+ "inline_code": false,
415
+ "italic": false,
416
+ "strikethrough": false,
417
+ "underline": false
418
+ }
419
+ }
420
+ }
421
+ ],
422
+ "style": {
423
+ "align": 1,
424
+ "folded": false
425
+ }
426
+ },
427
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc"
428
+ },
429
+ {
430
+ "block_id": "doxcnTom1Y3gYxu6w9jVUrEUFcy",
431
+ "block_type": 12,
432
+ "bullet": {
433
+ "elements": [
434
+ {
435
+ "text_run": {
436
+ "content": "Bullet with bold",
437
+ "text_element_style": {
438
+ "bold": true,
439
+ "inline_code": false,
440
+ "italic": false,
441
+ "strikethrough": false,
442
+ "underline": false
443
+ }
444
+ }
445
+ }
446
+ ],
447
+ "style": {
448
+ "align": 1,
449
+ "folded": false
450
+ }
451
+ },
452
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc"
453
+ },
454
+ {
455
+ "block_id": "doxcnwR1bQImdxtvZ2zG8i3nCFb",
456
+ "block_type": 13,
457
+ "ordered": {
458
+ "elements": [
459
+ {
460
+ "text_run": {
461
+ "content": "Ordered item one",
462
+ "text_element_style": {
463
+ "bold": false,
464
+ "inline_code": false,
465
+ "italic": false,
466
+ "strikethrough": false,
467
+ "underline": false
468
+ }
469
+ }
470
+ }
471
+ ],
472
+ "style": {
473
+ "align": 1,
474
+ "folded": false
475
+ }
476
+ },
477
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc"
478
+ },
479
+ {
480
+ "block_id": "doxcnbHzWcBVth0lTL4nS4DpNfe",
481
+ "block_type": 13,
482
+ "ordered": {
483
+ "elements": [
484
+ {
485
+ "text_run": {
486
+ "content": "Ordered item two",
487
+ "text_element_style": {
488
+ "bold": false,
489
+ "inline_code": false,
490
+ "italic": false,
491
+ "strikethrough": false,
492
+ "underline": false
493
+ }
494
+ }
495
+ }
496
+ ],
497
+ "style": {
498
+ "align": 1,
499
+ "folded": false
500
+ }
501
+ },
502
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc"
503
+ },
504
+ {
505
+ "block_id": "doxcnCfJWckeUkk4dNuleu0EvSc",
506
+ "block_type": 17,
507
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc",
508
+ "todo": {
509
+ "elements": [
510
+ {
511
+ "text_run": {
512
+ "content": "Todo item open",
513
+ "text_element_style": {
514
+ "bold": false,
515
+ "inline_code": false,
516
+ "italic": false,
517
+ "strikethrough": false,
518
+ "underline": false
519
+ }
520
+ }
521
+ }
522
+ ],
523
+ "style": {
524
+ "align": 1,
525
+ "done": false,
526
+ "folded": false
527
+ }
528
+ }
529
+ },
530
+ {
531
+ "block_id": "doxcn53WZpx9wceQnq5XbEua17b",
532
+ "block_type": 17,
533
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc",
534
+ "todo": {
535
+ "elements": [
536
+ {
537
+ "text_run": {
538
+ "content": "Todo item done",
539
+ "text_element_style": {
540
+ "bold": false,
541
+ "inline_code": false,
542
+ "italic": false,
543
+ "strikethrough": false,
544
+ "underline": false
545
+ }
546
+ }
547
+ }
548
+ ],
549
+ "style": {
550
+ "align": 1,
551
+ "done": true,
552
+ "folded": false
553
+ }
554
+ }
555
+ },
556
+ {
557
+ "block_id": "doxcnQLg6qCzN8d4WsKC39qTTq6",
558
+ "block_type": 4,
559
+ "heading2": {
560
+ "elements": [
561
+ {
562
+ "text_run": {
563
+ "content": "Section 3 — Blocks: code, quote, callout",
564
+ "text_element_style": {
565
+ "bold": false,
566
+ "inline_code": false,
567
+ "italic": false,
568
+ "strikethrough": false,
569
+ "underline": false
570
+ }
571
+ }
572
+ }
573
+ ],
574
+ "style": {
575
+ "align": 1,
576
+ "folded": false
577
+ }
578
+ },
579
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc"
580
+ },
581
+ {
582
+ "block_id": "doxcnRxCVqI6nqFEpoUe3L5fcrg",
583
+ "block_type": 14,
584
+ "code": {
585
+ "elements": [
586
+ {
587
+ "text_run": {
588
+ "content": "function read_doc_markdown(args, ctx) {\n const blocks = ctx.getOfficialClient().getDocBlocks(args.document_id);\n return require('feishu-docx').transform(blocks);\n",
589
+ "text_element_style": {
590
+ "bold": false,
591
+ "inline_code": false,
592
+ "italic": false,
593
+ "strikethrough": false,
594
+ "underline": false
595
+ }
596
+ }
597
+ },
598
+ {
599
+ "text_run": {
600
+ "content": "}",
601
+ "text_element_style": {
602
+ "bold": false,
603
+ "inline_code": false,
604
+ "italic": false,
605
+ "strikethrough": false,
606
+ "underline": false
607
+ }
608
+ }
609
+ }
610
+ ],
611
+ "style": {
612
+ "language": 28,
613
+ "wrap": false
614
+ }
615
+ },
616
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc"
617
+ },
618
+ {
619
+ "block_id": "doxcnH9pmL6bhQnlT2OOQ4rqkzh",
620
+ "block_type": 15,
621
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc",
622
+ "quote": {
623
+ "elements": [
624
+ {
625
+ "text_run": {
626
+ "content": "This is a single-line quote block (block_type 15).",
627
+ "text_element_style": {
628
+ "bold": false,
629
+ "inline_code": false,
630
+ "italic": false,
631
+ "strikethrough": false,
632
+ "underline": false
633
+ }
634
+ }
635
+ }
636
+ ],
637
+ "style": {
638
+ "align": 1,
639
+ "folded": false
640
+ }
641
+ }
642
+ },
643
+ {
644
+ "block_id": "doxcnOrBhb03ehZqNb4jmczOSEe",
645
+ "block_type": 22,
646
+ "divider": {},
647
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc"
648
+ },
649
+ {
650
+ "block_id": "doxcn0djKxUZTEyLyl8kETjwzRp",
651
+ "block_type": 2,
652
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc",
653
+ "text": {
654
+ "elements": [
655
+ {
656
+ "text_run": {
657
+ "content": "Below the divider, more text continues.",
658
+ "text_element_style": {
659
+ "bold": false,
660
+ "inline_code": false,
661
+ "italic": false,
662
+ "strikethrough": false,
663
+ "underline": false
664
+ }
665
+ }
666
+ }
667
+ ],
668
+ "style": {
669
+ "align": 1,
670
+ "folded": false
671
+ }
672
+ }
673
+ },
674
+ {
675
+ "block_id": "doxcnRT4knIgwKdXCDhJwrJYp3e",
676
+ "block_type": 4,
677
+ "heading2": {
678
+ "elements": [
679
+ {
680
+ "text_run": {
681
+ "content": "Section 4 — Long paragraph for ratio sanity",
682
+ "text_element_style": {
683
+ "bold": false,
684
+ "inline_code": false,
685
+ "italic": false,
686
+ "strikethrough": false,
687
+ "underline": false
688
+ }
689
+ }
690
+ }
691
+ ],
692
+ "style": {
693
+ "align": 1,
694
+ "folded": false
695
+ }
696
+ },
697
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc"
698
+ },
699
+ {
700
+ "block_id": "doxcnh0MhFIUW40vv8jzckKFIKb",
701
+ "block_type": 2,
702
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc",
703
+ "text": {
704
+ "elements": [
705
+ {
706
+ "text_run": {
707
+ "content": "RAG / digest workflows commonly need to summarise a Feishu doc. The structured JSON returned by get_doc_blocks is rich (block ids, parent links, style metadata) but consumes ~2x more tokens than a Markdown rendering for the same semantic content. The new read_doc_markdown tool wraps feishu-docx::transform() and post-processes the output so embedded images and files are surfaced as feishu://image_token/<TOKEN> placeholders that the agent can dereference with download_doc_image when it actually needs the binary. For agents that only need text understanding (which is the common case), this is pure savings — typical ratio measured at 30-50%, target ≥58% reduction.",
708
+ "text_element_style": {
709
+ "bold": false,
710
+ "inline_code": false,
711
+ "italic": false,
712
+ "strikethrough": false,
713
+ "underline": false
714
+ }
715
+ }
716
+ }
717
+ ],
718
+ "style": {
719
+ "align": 1,
720
+ "folded": false
721
+ }
722
+ }
723
+ },
724
+ {
725
+ "block_id": "doxcnhpJXQafiDSRg7POXzK1vmb",
726
+ "block_type": 2,
727
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc",
728
+ "text": {
729
+ "elements": [
730
+ {
731
+ "text_run": {
732
+ "content": "A second paragraph reinforcing volume so the markdown/json ratio measurement isn't dominated by metadata overhead from a single small block. Lorem ipsum filler is fine here, but real content gives a more honest read on whitespace and inline-style overhead. The probe script measures len(JSON.stringify(blocks)) vs len(transform(blocks)) and prints the ratio.",
733
+ "text_element_style": {
734
+ "bold": false,
735
+ "inline_code": false,
736
+ "italic": false,
737
+ "strikethrough": false,
738
+ "underline": false
739
+ }
740
+ }
741
+ }
742
+ ],
743
+ "style": {
744
+ "align": 1,
745
+ "folded": false
746
+ }
747
+ }
748
+ },
749
+ {
750
+ "block_id": "doxcnSivIK3yxKSMuRYRVZrBXFh",
751
+ "block_type": 19,
752
+ "callout": {
753
+ "background_color": 1,
754
+ "border_color": 1,
755
+ "emoji_id": "bulb"
756
+ },
757
+ "children": [
758
+ "doxcn5WIs64HaVP1DikQEz5PTMd",
759
+ "doxcniJaWRZHZQxvfsctjC2rs3g"
760
+ ],
761
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc"
762
+ },
763
+ {
764
+ "block_id": "doxcn5WIs64HaVP1DikQEz5PTMd",
765
+ "block_type": 2,
766
+ "parent_id": "doxcnSivIK3yxKSMuRYRVZrBXFh",
767
+ "text": {
768
+ "elements": [
769
+ {
770
+ "text_run": {
771
+ "content": "",
772
+ "text_element_style": {
773
+ "bold": false,
774
+ "inline_code": false,
775
+ "italic": false,
776
+ "strikethrough": false,
777
+ "underline": false
778
+ }
779
+ }
780
+ }
781
+ ],
782
+ "style": {
783
+ "align": 1,
784
+ "folded": false
785
+ }
786
+ }
787
+ },
788
+ {
789
+ "block_id": "doxcniJaWRZHZQxvfsctjC2rs3g",
790
+ "block_type": 2,
791
+ "parent_id": "doxcnSivIK3yxKSMuRYRVZrBXFh",
792
+ "text": {
793
+ "elements": [
794
+ {
795
+ "text_run": {
796
+ "content": "This text lives inside a callout block (block_type 19) — feishu-docx may render it with a quote prefix or skip it entirely.",
797
+ "text_element_style": {
798
+ "bold": false,
799
+ "inline_code": false,
800
+ "italic": false,
801
+ "strikethrough": false,
802
+ "underline": false
803
+ }
804
+ }
805
+ }
806
+ ],
807
+ "style": {
808
+ "align": 1,
809
+ "folded": false
810
+ }
811
+ }
812
+ },
813
+ {
814
+ "block_id": "doxcnfVlfFz6lPz3umpLsKUTFbh",
815
+ "block_type": 4,
816
+ "heading2": {
817
+ "elements": [
818
+ {
819
+ "text_run": {
820
+ "content": "Section 5 — Table",
821
+ "text_element_style": {
822
+ "bold": false,
823
+ "inline_code": false,
824
+ "italic": false,
825
+ "strikethrough": false,
826
+ "underline": false
827
+ }
828
+ }
829
+ }
830
+ ],
831
+ "style": {
832
+ "align": 1,
833
+ "folded": false
834
+ }
835
+ },
836
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc"
837
+ },
838
+ {
839
+ "block_id": "doxcnXbRujWsWq6y2oebjMLGMgW",
840
+ "block_type": 31,
841
+ "children": [
842
+ "doxcnjpb9Uym7euXY5odSGefEsf",
843
+ "doxcn0ZN84wrSWDgK3wH0pIK7eg",
844
+ "doxcnemtzHz8x6RHu8cGdRBfD5b",
845
+ "doxcnB2QinGVbalTlmArHxsvA3d",
846
+ "doxcn6wgtXVNNqtAVfh4cCc4IXb",
847
+ "doxcnNvzaMY3xeVk5LA48FRIqzd"
848
+ ],
849
+ "parent_id": "SWuAdfxPHoDRD3x9i0JcqmConEc",
850
+ "table": {
851
+ "cells": [
852
+ "doxcnjpb9Uym7euXY5odSGefEsf",
853
+ "doxcn0ZN84wrSWDgK3wH0pIK7eg",
854
+ "doxcnemtzHz8x6RHu8cGdRBfD5b",
855
+ "doxcnB2QinGVbalTlmArHxsvA3d",
856
+ "doxcn6wgtXVNNqtAVfh4cCc4IXb",
857
+ "doxcnNvzaMY3xeVk5LA48FRIqzd"
858
+ ],
859
+ "property": {
860
+ "column_size": 3,
861
+ "column_width": [
862
+ 100,
863
+ 100,
864
+ 100
865
+ ],
866
+ "merge_info": [
867
+ {
868
+ "col_span": 1,
869
+ "row_span": 1
870
+ },
871
+ {
872
+ "col_span": 1,
873
+ "row_span": 1
874
+ },
875
+ {
876
+ "col_span": 1,
877
+ "row_span": 1
878
+ },
879
+ {
880
+ "col_span": 1,
881
+ "row_span": 1
882
+ },
883
+ {
884
+ "col_span": 1,
885
+ "row_span": 1
886
+ },
887
+ {
888
+ "col_span": 1,
889
+ "row_span": 1
890
+ }
891
+ ],
892
+ "row_size": 2
893
+ }
894
+ }
895
+ },
896
+ {
897
+ "block_id": "doxcnjpb9Uym7euXY5odSGefEsf",
898
+ "block_type": 32,
899
+ "children": [
900
+ "doxcnFLjRRi86lDKo8QnLWLn9hs",
901
+ "doxcnoaVglDWaMbrY9LuTKx4ope"
902
+ ],
903
+ "parent_id": "doxcnXbRujWsWq6y2oebjMLGMgW",
904
+ "table_cell": {}
905
+ },
906
+ {
907
+ "block_id": "doxcnFLjRRi86lDKo8QnLWLn9hs",
908
+ "block_type": 2,
909
+ "parent_id": "doxcnjpb9Uym7euXY5odSGefEsf",
910
+ "text": {
911
+ "elements": [
912
+ {
913
+ "text_run": {
914
+ "content": "",
915
+ "text_element_style": {
916
+ "bold": false,
917
+ "inline_code": false,
918
+ "italic": false,
919
+ "strikethrough": false,
920
+ "underline": false
921
+ }
922
+ }
923
+ }
924
+ ],
925
+ "style": {
926
+ "align": 1,
927
+ "folded": false
928
+ }
929
+ }
930
+ },
931
+ {
932
+ "block_id": "doxcnoaVglDWaMbrY9LuTKx4ope",
933
+ "block_type": 2,
934
+ "parent_id": "doxcnjpb9Uym7euXY5odSGefEsf",
935
+ "text": {
936
+ "elements": [
937
+ {
938
+ "text_run": {
939
+ "content": "Header 1",
940
+ "text_element_style": {
941
+ "bold": false,
942
+ "inline_code": false,
943
+ "italic": false,
944
+ "strikethrough": false,
945
+ "underline": false
946
+ }
947
+ }
948
+ }
949
+ ],
950
+ "style": {
951
+ "align": 1,
952
+ "folded": false
953
+ }
954
+ }
955
+ },
956
+ {
957
+ "block_id": "doxcn0ZN84wrSWDgK3wH0pIK7eg",
958
+ "block_type": 32,
959
+ "children": [
960
+ "doxcnVxW8r7Klhe3mC0WfCqyXeh",
961
+ "doxcnXbISdjzUYl79NsFm8H4GCh"
962
+ ],
963
+ "parent_id": "doxcnXbRujWsWq6y2oebjMLGMgW",
964
+ "table_cell": {}
965
+ },
966
+ {
967
+ "block_id": "doxcnVxW8r7Klhe3mC0WfCqyXeh",
968
+ "block_type": 2,
969
+ "parent_id": "doxcn0ZN84wrSWDgK3wH0pIK7eg",
970
+ "text": {
971
+ "elements": [
972
+ {
973
+ "text_run": {
974
+ "content": "",
975
+ "text_element_style": {
976
+ "bold": false,
977
+ "inline_code": false,
978
+ "italic": false,
979
+ "strikethrough": false,
980
+ "underline": false
981
+ }
982
+ }
983
+ }
984
+ ],
985
+ "style": {
986
+ "align": 1,
987
+ "folded": false
988
+ }
989
+ }
990
+ },
991
+ {
992
+ "block_id": "doxcnXbISdjzUYl79NsFm8H4GCh",
993
+ "block_type": 2,
994
+ "parent_id": "doxcn0ZN84wrSWDgK3wH0pIK7eg",
995
+ "text": {
996
+ "elements": [
997
+ {
998
+ "text_run": {
999
+ "content": "Header 2",
1000
+ "text_element_style": {
1001
+ "bold": false,
1002
+ "inline_code": false,
1003
+ "italic": false,
1004
+ "strikethrough": false,
1005
+ "underline": false
1006
+ }
1007
+ }
1008
+ }
1009
+ ],
1010
+ "style": {
1011
+ "align": 1,
1012
+ "folded": false
1013
+ }
1014
+ }
1015
+ },
1016
+ {
1017
+ "block_id": "doxcnemtzHz8x6RHu8cGdRBfD5b",
1018
+ "block_type": 32,
1019
+ "children": [
1020
+ "doxcnhgub5Kek78WYjreQMtPGRe",
1021
+ "doxcnPMguUx2VdvuHEKb3StWNwd"
1022
+ ],
1023
+ "parent_id": "doxcnXbRujWsWq6y2oebjMLGMgW",
1024
+ "table_cell": {}
1025
+ },
1026
+ {
1027
+ "block_id": "doxcnhgub5Kek78WYjreQMtPGRe",
1028
+ "block_type": 2,
1029
+ "parent_id": "doxcnemtzHz8x6RHu8cGdRBfD5b",
1030
+ "text": {
1031
+ "elements": [
1032
+ {
1033
+ "text_run": {
1034
+ "content": "",
1035
+ "text_element_style": {
1036
+ "bold": false,
1037
+ "inline_code": false,
1038
+ "italic": false,
1039
+ "strikethrough": false,
1040
+ "underline": false
1041
+ }
1042
+ }
1043
+ }
1044
+ ],
1045
+ "style": {
1046
+ "align": 1,
1047
+ "folded": false
1048
+ }
1049
+ }
1050
+ },
1051
+ {
1052
+ "block_id": "doxcnPMguUx2VdvuHEKb3StWNwd",
1053
+ "block_type": 2,
1054
+ "parent_id": "doxcnemtzHz8x6RHu8cGdRBfD5b",
1055
+ "text": {
1056
+ "elements": [
1057
+ {
1058
+ "text_run": {
1059
+ "content": "Header 3",
1060
+ "text_element_style": {
1061
+ "bold": false,
1062
+ "inline_code": false,
1063
+ "italic": false,
1064
+ "strikethrough": false,
1065
+ "underline": false
1066
+ }
1067
+ }
1068
+ }
1069
+ ],
1070
+ "style": {
1071
+ "align": 1,
1072
+ "folded": false
1073
+ }
1074
+ }
1075
+ },
1076
+ {
1077
+ "block_id": "doxcnB2QinGVbalTlmArHxsvA3d",
1078
+ "block_type": 32,
1079
+ "children": [
1080
+ "doxcndLvhzm0W6eaYYunV8kFfOh",
1081
+ "doxcn6sLA9Ah7W2eWWs7fzIRXVe"
1082
+ ],
1083
+ "parent_id": "doxcnXbRujWsWq6y2oebjMLGMgW",
1084
+ "table_cell": {}
1085
+ },
1086
+ {
1087
+ "block_id": "doxcndLvhzm0W6eaYYunV8kFfOh",
1088
+ "block_type": 2,
1089
+ "parent_id": "doxcnB2QinGVbalTlmArHxsvA3d",
1090
+ "text": {
1091
+ "elements": [
1092
+ {
1093
+ "text_run": {
1094
+ "content": "",
1095
+ "text_element_style": {
1096
+ "bold": false,
1097
+ "inline_code": false,
1098
+ "italic": false,
1099
+ "strikethrough": false,
1100
+ "underline": false
1101
+ }
1102
+ }
1103
+ }
1104
+ ],
1105
+ "style": {
1106
+ "align": 1,
1107
+ "folded": false
1108
+ }
1109
+ }
1110
+ },
1111
+ {
1112
+ "block_id": "doxcn6sLA9Ah7W2eWWs7fzIRXVe",
1113
+ "block_type": 2,
1114
+ "parent_id": "doxcnB2QinGVbalTlmArHxsvA3d",
1115
+ "text": {
1116
+ "elements": [
1117
+ {
1118
+ "text_run": {
1119
+ "content": "Cell A",
1120
+ "text_element_style": {
1121
+ "bold": false,
1122
+ "inline_code": false,
1123
+ "italic": false,
1124
+ "strikethrough": false,
1125
+ "underline": false
1126
+ }
1127
+ }
1128
+ }
1129
+ ],
1130
+ "style": {
1131
+ "align": 1,
1132
+ "folded": false
1133
+ }
1134
+ }
1135
+ },
1136
+ {
1137
+ "block_id": "doxcn6wgtXVNNqtAVfh4cCc4IXb",
1138
+ "block_type": 32,
1139
+ "children": [
1140
+ "doxcnAUxjEwTl001aZ8b9Xiduze",
1141
+ "doxcnu1Gen2IEI2VRL6cBEXCEef"
1142
+ ],
1143
+ "parent_id": "doxcnXbRujWsWq6y2oebjMLGMgW",
1144
+ "table_cell": {}
1145
+ },
1146
+ {
1147
+ "block_id": "doxcnAUxjEwTl001aZ8b9Xiduze",
1148
+ "block_type": 2,
1149
+ "parent_id": "doxcn6wgtXVNNqtAVfh4cCc4IXb",
1150
+ "text": {
1151
+ "elements": [
1152
+ {
1153
+ "text_run": {
1154
+ "content": "",
1155
+ "text_element_style": {
1156
+ "bold": false,
1157
+ "inline_code": false,
1158
+ "italic": false,
1159
+ "strikethrough": false,
1160
+ "underline": false
1161
+ }
1162
+ }
1163
+ }
1164
+ ],
1165
+ "style": {
1166
+ "align": 1,
1167
+ "folded": false
1168
+ }
1169
+ }
1170
+ },
1171
+ {
1172
+ "block_id": "doxcnu1Gen2IEI2VRL6cBEXCEef",
1173
+ "block_type": 2,
1174
+ "parent_id": "doxcn6wgtXVNNqtAVfh4cCc4IXb",
1175
+ "text": {
1176
+ "elements": [
1177
+ {
1178
+ "text_run": {
1179
+ "content": "Cell B",
1180
+ "text_element_style": {
1181
+ "bold": false,
1182
+ "inline_code": false,
1183
+ "italic": false,
1184
+ "strikethrough": false,
1185
+ "underline": false
1186
+ }
1187
+ }
1188
+ }
1189
+ ],
1190
+ "style": {
1191
+ "align": 1,
1192
+ "folded": false
1193
+ }
1194
+ }
1195
+ },
1196
+ {
1197
+ "block_id": "doxcnNvzaMY3xeVk5LA48FRIqzd",
1198
+ "block_type": 32,
1199
+ "children": [
1200
+ "doxcnlKnvul3qQI4mWz0D5xwvZb",
1201
+ "doxcnKur9G90GVv6BgOK26xiu1g"
1202
+ ],
1203
+ "parent_id": "doxcnXbRujWsWq6y2oebjMLGMgW",
1204
+ "table_cell": {}
1205
+ },
1206
+ {
1207
+ "block_id": "doxcnlKnvul3qQI4mWz0D5xwvZb",
1208
+ "block_type": 2,
1209
+ "parent_id": "doxcnNvzaMY3xeVk5LA48FRIqzd",
1210
+ "text": {
1211
+ "elements": [
1212
+ {
1213
+ "text_run": {
1214
+ "content": "",
1215
+ "text_element_style": {
1216
+ "bold": false,
1217
+ "inline_code": false,
1218
+ "italic": false,
1219
+ "strikethrough": false,
1220
+ "underline": false
1221
+ }
1222
+ }
1223
+ }
1224
+ ],
1225
+ "style": {
1226
+ "align": 1,
1227
+ "folded": false
1228
+ }
1229
+ }
1230
+ },
1231
+ {
1232
+ "block_id": "doxcnKur9G90GVv6BgOK26xiu1g",
1233
+ "block_type": 2,
1234
+ "parent_id": "doxcnNvzaMY3xeVk5LA48FRIqzd",
1235
+ "text": {
1236
+ "elements": [
1237
+ {
1238
+ "text_run": {
1239
+ "content": "Cell C",
1240
+ "text_element_style": {
1241
+ "bold": false,
1242
+ "inline_code": false,
1243
+ "italic": false,
1244
+ "strikethrough": false,
1245
+ "underline": false
1246
+ }
1247
+ }
1248
+ }
1249
+ ],
1250
+ "style": {
1251
+ "align": 1,
1252
+ "folded": false
1253
+ }
1254
+ }
1255
+ }
1256
+ ]