pi-feishu-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (407) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/dist/src/bot.d.ts +29 -0
  4. package/dist/src/bot.js +75 -0
  5. package/dist/src/cards.d.ts +6 -0
  6. package/dist/src/cards.js +87 -0
  7. package/dist/src/config.d.ts +3 -0
  8. package/dist/src/config.js +28 -0
  9. package/dist/src/daemon.d.ts +2 -0
  10. package/dist/src/daemon.js +151 -0
  11. package/dist/src/extension.d.ts +2 -0
  12. package/dist/src/extension.js +124 -0
  13. package/dist/src/poller.d.ts +33 -0
  14. package/dist/src/poller.js +94 -0
  15. package/dist/src/renderer.d.ts +8 -0
  16. package/dist/src/renderer.js +31 -0
  17. package/dist/src/session-registry.d.ts +15 -0
  18. package/dist/src/session-registry.js +82 -0
  19. package/dist/src/types.d.ts +25 -0
  20. package/dist/src/types.js +1 -0
  21. package/dist/tests/bot.test.d.ts +1 -0
  22. package/dist/tests/bot.test.js +89 -0
  23. package/dist/tests/cards.test.d.ts +1 -0
  24. package/dist/tests/cards.test.js +39 -0
  25. package/dist/tests/config.test.d.ts +1 -0
  26. package/dist/tests/config.test.js +59 -0
  27. package/dist/tests/renderer.test.d.ts +1 -0
  28. package/dist/tests/renderer.test.js +61 -0
  29. package/dist/tests/session-registry.test.d.ts +1 -0
  30. package/dist/tests/session-registry.test.js +92 -0
  31. package/dist/tests/types.test.d.ts +1 -0
  32. package/dist/tests/types.test.js +30 -0
  33. package/package.json +35 -0
  34. package/skills/lark-approval/SKILL.md +56 -0
  35. package/skills/lark-apps/SKILL.md +92 -0
  36. package/skills/lark-apps/references/lark-apps-access-scope-get.md +104 -0
  37. package/skills/lark-apps/references/lark-apps-access-scope-set.md +126 -0
  38. package/skills/lark-apps/references/lark-apps-create.md +112 -0
  39. package/skills/lark-apps/references/lark-apps-html-publish.md +151 -0
  40. package/skills/lark-apps/references/lark-apps-list.md +95 -0
  41. package/skills/lark-apps/references/lark-apps-update.md +86 -0
  42. package/skills/lark-attendance/SKILL.md +57 -0
  43. package/skills/lark-base/SKILL.md +359 -0
  44. package/skills/lark-base/references/dashboard-block-data-config.md +350 -0
  45. package/skills/lark-base/references/examples.md +140 -0
  46. package/skills/lark-base/references/formula-field-guide.md +737 -0
  47. package/skills/lark-base/references/lark-base-advperm-disable.md +83 -0
  48. package/skills/lark-base/references/lark-base-advperm-enable.md +80 -0
  49. package/skills/lark-base/references/lark-base-base-copy.md +74 -0
  50. package/skills/lark-base/references/lark-base-base-create.md +68 -0
  51. package/skills/lark-base/references/lark-base-base-get.md +39 -0
  52. package/skills/lark-base/references/lark-base-cell-value.md +151 -0
  53. package/skills/lark-base/references/lark-base-dashboard-arrange.md +83 -0
  54. package/skills/lark-base/references/lark-base-dashboard-block-create.md +108 -0
  55. package/skills/lark-base/references/lark-base-dashboard-block-delete.md +46 -0
  56. package/skills/lark-base/references/lark-base-dashboard-block-get.md +57 -0
  57. package/skills/lark-base/references/lark-base-dashboard-block-list.md +53 -0
  58. package/skills/lark-base/references/lark-base-dashboard-block-update.md +84 -0
  59. package/skills/lark-base/references/lark-base-dashboard-create.md +73 -0
  60. package/skills/lark-base/references/lark-base-dashboard-delete.md +44 -0
  61. package/skills/lark-base/references/lark-base-dashboard-get.md +59 -0
  62. package/skills/lark-base/references/lark-base-dashboard-list.md +52 -0
  63. package/skills/lark-base/references/lark-base-dashboard-update.md +69 -0
  64. package/skills/lark-base/references/lark-base-dashboard.md +240 -0
  65. package/skills/lark-base/references/lark-base-data-analysis-sop.md +88 -0
  66. package/skills/lark-base/references/lark-base-data-query.md +375 -0
  67. package/skills/lark-base/references/lark-base-field-create.md +104 -0
  68. package/skills/lark-base/references/lark-base-field-delete.md +51 -0
  69. package/skills/lark-base/references/lark-base-field-get.md +42 -0
  70. package/skills/lark-base/references/lark-base-field-list.md +44 -0
  71. package/skills/lark-base/references/lark-base-field-search-options.md +48 -0
  72. package/skills/lark-base/references/lark-base-field-update.md +97 -0
  73. package/skills/lark-base/references/lark-base-field.md +22 -0
  74. package/skills/lark-base/references/lark-base-form-create.md +87 -0
  75. package/skills/lark-base/references/lark-base-form-delete.md +64 -0
  76. package/skills/lark-base/references/lark-base-form-detail.md +198 -0
  77. package/skills/lark-base/references/lark-base-form-get.md +68 -0
  78. package/skills/lark-base/references/lark-base-form-list.md +73 -0
  79. package/skills/lark-base/references/lark-base-form-questions-create.md +118 -0
  80. package/skills/lark-base/references/lark-base-form-questions-delete.md +68 -0
  81. package/skills/lark-base/references/lark-base-form-questions-list.md +84 -0
  82. package/skills/lark-base/references/lark-base-form-questions-update.md +92 -0
  83. package/skills/lark-base/references/lark-base-form-questions.md +23 -0
  84. package/skills/lark-base/references/lark-base-form-submit.md +171 -0
  85. package/skills/lark-base/references/lark-base-form-update.md +82 -0
  86. package/skills/lark-base/references/lark-base-form.md +25 -0
  87. package/skills/lark-base/references/lark-base-history.md +16 -0
  88. package/skills/lark-base/references/lark-base-record-batch-create.md +58 -0
  89. package/skills/lark-base/references/lark-base-record-batch-update.md +53 -0
  90. package/skills/lark-base/references/lark-base-record-delete.md +62 -0
  91. package/skills/lark-base/references/lark-base-record-history-list.md +86 -0
  92. package/skills/lark-base/references/lark-base-record-share-link-create.md +72 -0
  93. package/skills/lark-base/references/lark-base-record-upsert.md +64 -0
  94. package/skills/lark-base/references/lark-base-record.md +31 -0
  95. package/skills/lark-base/references/lark-base-role-create.md +89 -0
  96. package/skills/lark-base/references/lark-base-role-delete.md +83 -0
  97. package/skills/lark-base/references/lark-base-role-get.md +87 -0
  98. package/skills/lark-base/references/lark-base-role-list.md +81 -0
  99. package/skills/lark-base/references/lark-base-role-update.md +94 -0
  100. package/skills/lark-base/references/lark-base-shortcut-field-properties.md +481 -0
  101. package/skills/lark-base/references/lark-base-table-create.md +62 -0
  102. package/skills/lark-base/references/lark-base-table-delete.md +51 -0
  103. package/skills/lark-base/references/lark-base-table-get.md +46 -0
  104. package/skills/lark-base/references/lark-base-table-list.md +43 -0
  105. package/skills/lark-base/references/lark-base-table-update.md +49 -0
  106. package/skills/lark-base/references/lark-base-table.md +20 -0
  107. package/skills/lark-base/references/lark-base-view-create.md +50 -0
  108. package/skills/lark-base/references/lark-base-view-delete.md +48 -0
  109. package/skills/lark-base/references/lark-base-view-get-card.md +38 -0
  110. package/skills/lark-base/references/lark-base-view-get-filter.md +38 -0
  111. package/skills/lark-base/references/lark-base-view-get-group.md +38 -0
  112. package/skills/lark-base/references/lark-base-view-get-sort.md +38 -0
  113. package/skills/lark-base/references/lark-base-view-get-timebar.md +38 -0
  114. package/skills/lark-base/references/lark-base-view-get-visible-fields.md +28 -0
  115. package/skills/lark-base/references/lark-base-view-get.md +38 -0
  116. package/skills/lark-base/references/lark-base-view-list.md +44 -0
  117. package/skills/lark-base/references/lark-base-view-rename.md +44 -0
  118. package/skills/lark-base/references/lark-base-view-set-card.md +55 -0
  119. package/skills/lark-base/references/lark-base-view-set-filter.md +181 -0
  120. package/skills/lark-base/references/lark-base-view-set-group.md +65 -0
  121. package/skills/lark-base/references/lark-base-view-set-sort.md +63 -0
  122. package/skills/lark-base/references/lark-base-view-set-timebar.md +51 -0
  123. package/skills/lark-base/references/lark-base-view-set-visible-fields.md +46 -0
  124. package/skills/lark-base/references/lark-base-view.md +44 -0
  125. package/skills/lark-base/references/lark-base-workflow-create.md +180 -0
  126. package/skills/lark-base/references/lark-base-workflow-disable.md +94 -0
  127. package/skills/lark-base/references/lark-base-workflow-enable.md +94 -0
  128. package/skills/lark-base/references/lark-base-workflow-get.md +147 -0
  129. package/skills/lark-base/references/lark-base-workflow-guide.md +718 -0
  130. package/skills/lark-base/references/lark-base-workflow-list.md +124 -0
  131. package/skills/lark-base/references/lark-base-workflow-schema.md +935 -0
  132. package/skills/lark-base/references/lark-base-workflow-update.md +167 -0
  133. package/skills/lark-base/references/lark-base-workflow.md +23 -0
  134. package/skills/lark-base/references/lark-base-workspace.md +18 -0
  135. package/skills/lark-base/references/lookup-field-guide.md +512 -0
  136. package/skills/lark-base/references/role-config.md +539 -0
  137. package/skills/lark-calendar/SKILL.md +154 -0
  138. package/skills/lark-calendar/references/lark-calendar-agenda.md +78 -0
  139. package/skills/lark-calendar/references/lark-calendar-create.md +109 -0
  140. package/skills/lark-calendar/references/lark-calendar-freebusy.md +124 -0
  141. package/skills/lark-calendar/references/lark-calendar-room-find.md +113 -0
  142. package/skills/lark-calendar/references/lark-calendar-rsvp.md +42 -0
  143. package/skills/lark-calendar/references/lark-calendar-schedule-meeting.md +265 -0
  144. package/skills/lark-calendar/references/lark-calendar-suggestion.md +125 -0
  145. package/skills/lark-calendar/references/lark-calendar-update.md +105 -0
  146. package/skills/lark-contact/SKILL.md +45 -0
  147. package/skills/lark-contact/references/lark-contact-get-user.md +19 -0
  148. package/skills/lark-contact/references/lark-contact-search-user.md +124 -0
  149. package/skills/lark-doc/SKILL.md +65 -0
  150. package/skills/lark-doc/references/lark-doc-create.md +89 -0
  151. package/skills/lark-doc/references/lark-doc-fetch.md +141 -0
  152. package/skills/lark-doc/references/lark-doc-md.md +71 -0
  153. package/skills/lark-doc/references/lark-doc-media-download.md +50 -0
  154. package/skills/lark-doc/references/lark-doc-media-insert.md +114 -0
  155. package/skills/lark-doc/references/lark-doc-media-preview.md +41 -0
  156. package/skills/lark-doc/references/lark-doc-update.md +252 -0
  157. package/skills/lark-doc/references/lark-doc-whiteboard.md +100 -0
  158. package/skills/lark-doc/references/lark-doc-xml.md +169 -0
  159. package/skills/lark-doc/references/style/lark-doc-create-workflow.md +56 -0
  160. package/skills/lark-doc/references/style/lark-doc-style.md +106 -0
  161. package/skills/lark-doc/references/style/lark-doc-update-workflow.md +54 -0
  162. package/skills/lark-drive/SKILL.md +369 -0
  163. package/skills/lark-drive/references/lark-drive-add-comment.md +182 -0
  164. package/skills/lark-drive/references/lark-drive-apply-permission.md +77 -0
  165. package/skills/lark-drive/references/lark-drive-create-folder.md +73 -0
  166. package/skills/lark-drive/references/lark-drive-create-shortcut.md +103 -0
  167. package/skills/lark-drive/references/lark-drive-delete.md +79 -0
  168. package/skills/lark-drive/references/lark-drive-download.md +31 -0
  169. package/skills/lark-drive/references/lark-drive-export-download.md +50 -0
  170. package/skills/lark-drive/references/lark-drive-export.md +119 -0
  171. package/skills/lark-drive/references/lark-drive-import.md +159 -0
  172. package/skills/lark-drive/references/lark-drive-inspect.md +50 -0
  173. package/skills/lark-drive/references/lark-drive-move.md +120 -0
  174. package/skills/lark-drive/references/lark-drive-pull.md +137 -0
  175. package/skills/lark-drive/references/lark-drive-push.md +162 -0
  176. package/skills/lark-drive/references/lark-drive-reactions.md +113 -0
  177. package/skills/lark-drive/references/lark-drive-search.md +266 -0
  178. package/skills/lark-drive/references/lark-drive-status.md +198 -0
  179. package/skills/lark-drive/references/lark-drive-task-result.md +302 -0
  180. package/skills/lark-drive/references/lark-drive-upload.md +67 -0
  181. package/skills/lark-drive/references/lark-drive-version-delete.md +38 -0
  182. package/skills/lark-drive/references/lark-drive-version-get.md +71 -0
  183. package/skills/lark-drive/references/lark-drive-version-history.md +73 -0
  184. package/skills/lark-drive/references/lark-drive-version-revert.md +198 -0
  185. package/skills/lark-event/SKILL.md +145 -0
  186. package/skills/lark-event/references/lark-event-im.md +86 -0
  187. package/skills/lark-im/SKILL.md +162 -0
  188. package/skills/lark-im/references/lark-im-chat-create.md +162 -0
  189. package/skills/lark-im/references/lark-im-chat-identity.md +55 -0
  190. package/skills/lark-im/references/lark-im-chat-list.md +198 -0
  191. package/skills/lark-im/references/lark-im-chat-messages-list.md +148 -0
  192. package/skills/lark-im/references/lark-im-chat-search.md +136 -0
  193. package/skills/lark-im/references/lark-im-chat-update.md +84 -0
  194. package/skills/lark-im/references/lark-im-flag-cancel.md +198 -0
  195. package/skills/lark-im/references/lark-im-flag-create.md +67 -0
  196. package/skills/lark-im/references/lark-im-flag-list.md +100 -0
  197. package/skills/lark-im/references/lark-im-messages-mget.md +95 -0
  198. package/skills/lark-im/references/lark-im-messages-reply.md +228 -0
  199. package/skills/lark-im/references/lark-im-messages-resources-download.md +94 -0
  200. package/skills/lark-im/references/lark-im-messages-search.md +232 -0
  201. package/skills/lark-im/references/lark-im-messages-send.md +229 -0
  202. package/skills/lark-im/references/lark-im-reactions.md +297 -0
  203. package/skills/lark-im/references/lark-im-threads-messages-list.md +111 -0
  204. package/skills/lark-mail/SKILL.md +648 -0
  205. package/skills/lark-mail/references/lark-mail-decline-receipt.md +115 -0
  206. package/skills/lark-mail/references/lark-mail-draft-create.md +123 -0
  207. package/skills/lark-mail/references/lark-mail-draft-edit.md +400 -0
  208. package/skills/lark-mail/references/lark-mail-forward.md +173 -0
  209. package/skills/lark-mail/references/lark-mail-message.md +230 -0
  210. package/skills/lark-mail/references/lark-mail-messages.md +108 -0
  211. package/skills/lark-mail/references/lark-mail-reply-all.md +206 -0
  212. package/skills/lark-mail/references/lark-mail-reply.md +242 -0
  213. package/skills/lark-mail/references/lark-mail-send-receipt.md +198 -0
  214. package/skills/lark-mail/references/lark-mail-send.md +216 -0
  215. package/skills/lark-mail/references/lark-mail-share-to-chat.md +198 -0
  216. package/skills/lark-mail/references/lark-mail-signature.md +98 -0
  217. package/skills/lark-mail/references/lark-mail-template-create.md +129 -0
  218. package/skills/lark-mail/references/lark-mail-template-update.md +198 -0
  219. package/skills/lark-mail/references/lark-mail-thread.md +111 -0
  220. package/skills/lark-mail/references/lark-mail-triage.md +122 -0
  221. package/skills/lark-mail/references/lark-mail-watch.md +94 -0
  222. package/skills/lark-minutes/SKILL.md +139 -0
  223. package/skills/lark-minutes/references/lark-minutes-download.md +137 -0
  224. package/skills/lark-minutes/references/lark-minutes-search.md +206 -0
  225. package/skills/lark-minutes/references/lark-minutes-upload.md +104 -0
  226. package/skills/lark-okr/SKILL.md +133 -0
  227. package/skills/lark-okr/references/lark-okr-contentblock.md +359 -0
  228. package/skills/lark-okr/references/lark-okr-cycle-detail.md +84 -0
  229. package/skills/lark-okr/references/lark-okr-cycle-list.md +90 -0
  230. package/skills/lark-okr/references/lark-okr-entities.md +329 -0
  231. package/skills/lark-okr/references/lark-okr-image-upload.md +116 -0
  232. package/skills/lark-okr/references/lark-okr-progress-create.md +81 -0
  233. package/skills/lark-okr/references/lark-okr-progress-delete.md +47 -0
  234. package/skills/lark-okr/references/lark-okr-progress-get.md +62 -0
  235. package/skills/lark-okr/references/lark-okr-progress-list.md +80 -0
  236. package/skills/lark-okr/references/lark-okr-progress-update.md +81 -0
  237. package/skills/lark-openapi-explorer/SKILL.md +153 -0
  238. package/skills/lark-shared/SKILL.md +144 -0
  239. package/skills/lark-sheets/SKILL.md +343 -0
  240. package/skills/lark-sheets/references/lark-sheets-cell-data.md +197 -0
  241. package/skills/lark-sheets/references/lark-sheets-cell-images.md +59 -0
  242. package/skills/lark-sheets/references/lark-sheets-cell-style-and-merge.md +141 -0
  243. package/skills/lark-sheets/references/lark-sheets-dropdown.md +133 -0
  244. package/skills/lark-sheets/references/lark-sheets-filter-views.md +193 -0
  245. package/skills/lark-sheets/references/lark-sheets-float-images.md +125 -0
  246. package/skills/lark-sheets/references/lark-sheets-formula.md +88 -0
  247. package/skills/lark-sheets/references/lark-sheets-row-column-management.md +151 -0
  248. package/skills/lark-sheets/references/lark-sheets-sheet-management.md +164 -0
  249. package/skills/lark-sheets/references/lark-sheets-spreadsheet-management.md +140 -0
  250. package/skills/lark-skill-maker/SKILL.md +85 -0
  251. package/skills/lark-slides/SKILL.md +296 -0
  252. package/skills/lark-slides/assets/templates/administration--all_hands_meeting.xml +1999 -0
  253. package/skills/lark-slides/assets/templates/administration--annual_gala.xml +1160 -0
  254. package/skills/lark-slides/assets/templates/administration--company_intro.xml +1376 -0
  255. package/skills/lark-slides/assets/templates/administration--corporate_culture.xml +1765 -0
  256. package/skills/lark-slides/assets/templates/hr--employee_training.xml +912 -0
  257. package/skills/lark-slides/assets/templates/hr--employee_training_workshop.xml +1504 -0
  258. package/skills/lark-slides/assets/templates/hr--onboarding.xml +933 -0
  259. package/skills/lark-slides/assets/templates/marketing--brand_communication.xml +1367 -0
  260. package/skills/lark-slides/assets/templates/marketing--brand_logo_design.xml +1347 -0
  261. package/skills/lark-slides/assets/templates/marketing--brand_operations_plan.xml +1309 -0
  262. package/skills/lark-slides/assets/templates/marketing--business_plan.xml +1646 -0
  263. package/skills/lark-slides/assets/templates/marketing--marketing_plan.xml +198 -0
  264. package/skills/lark-slides/assets/templates/marketing--marketing_strategy.xml +1484 -0
  265. package/skills/lark-slides/assets/templates/marketing--product_whitepaper.xml +198 -0
  266. package/skills/lark-slides/assets/templates/marketing--roadshow_business_plan.xml +1506 -0
  267. package/skills/lark-slides/assets/templates/misc--book_sharing.xml +198 -0
  268. package/skills/lark-slides/assets/templates/misc--club_event_plan.xml +4885 -0
  269. package/skills/lark-slides/assets/templates/misc--student_career_plan.xml +1854 -0
  270. package/skills/lark-slides/assets/templates/office--dark_general.xml +3763 -0
  271. package/skills/lark-slides/assets/templates/office--dept_annual_report.xml +1192 -0
  272. package/skills/lark-slides/assets/templates/office--light_general.xml +3378 -0
  273. package/skills/lark-slides/assets/templates/office--project_kickoff.xml +3152 -0
  274. package/skills/lark-slides/assets/templates/office--quarterly_review.xml +1253 -0
  275. package/skills/lark-slides/assets/templates/office--work_report.xml +1099 -0
  276. package/skills/lark-slides/assets/templates/office--work_summary.xml +4420 -0
  277. package/skills/lark-slides/assets/templates/office--work_summary_report.xml +1523 -0
  278. package/skills/lark-slides/assets/templates/operations--brand_logo_design.xml +1347 -0
  279. package/skills/lark-slides/assets/templates/operations--brand_operations_plan.xml +1309 -0
  280. package/skills/lark-slides/assets/templates/operations--marketing_plan.xml +1469 -0
  281. package/skills/lark-slides/assets/templates/operations--product_promotion.xml +687 -0
  282. package/skills/lark-slides/assets/templates/personal--experience_sharing.xml +2242 -0
  283. package/skills/lark-slides/assets/templates/personal--personal_resume.xml +2047 -0
  284. package/skills/lark-slides/assets/templates/personal--promotion_defense.xml +1099 -0
  285. package/skills/lark-slides/assets/templates/personal--promotion_report.xml +1039 -0
  286. package/skills/lark-slides/assets/templates/personal--self_intro.xml +696 -0
  287. package/skills/lark-slides/assets/templates/personal--teaching_sharing.xml +3013 -0
  288. package/skills/lark-slides/assets/templates/product--business_case_analysis.xml +1341 -0
  289. package/skills/lark-slides/assets/templates/product--market_analysis.xml +898 -0
  290. package/skills/lark-slides/assets/templates/product--product_analysis.xml +1537 -0
  291. package/skills/lark-slides/assets/templates/product--product_intro.xml +2838 -0
  292. package/skills/lark-slides/assets/templates/product--product_promotion.xml +687 -0
  293. package/skills/lark-slides/assets/templates/product--product_promotion_2.xml +198 -0
  294. package/skills/lark-slides/references/asset-planning.md +124 -0
  295. package/skills/lark-slides/references/examples.md +261 -0
  296. package/skills/lark-slides/references/lark-slides-create.md +137 -0
  297. package/skills/lark-slides/references/lark-slides-edit-workflows.md +142 -0
  298. package/skills/lark-slides/references/lark-slides-media-upload.md +128 -0
  299. package/skills/lark-slides/references/lark-slides-replace-slide.md +239 -0
  300. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-create.md +220 -0
  301. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-delete.md +123 -0
  302. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +110 -0
  303. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +186 -0
  304. package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +98 -0
  305. package/skills/lark-slides/references/planning-layer.md +219 -0
  306. package/skills/lark-slides/references/slide-templates.md +201 -0
  307. package/skills/lark-slides/references/slides_demo.xml +226 -0
  308. package/skills/lark-slides/references/slides_xml_schema_definition.xml +3004 -0
  309. package/skills/lark-slides/references/template-catalog.md +463 -0
  310. package/skills/lark-slides/references/template-index.json +198 -0
  311. package/skills/lark-slides/references/troubleshooting.md +198 -0
  312. package/skills/lark-slides/references/validation-checklist.md +102 -0
  313. package/skills/lark-slides/references/visual-planning.md +250 -0
  314. package/skills/lark-slides/references/xml-format-guide.md +369 -0
  315. package/skills/lark-slides/references/xml-schema-quick-ref.md +215 -0
  316. package/skills/lark-slides/scripts/template_tool.py +970 -0
  317. package/skills/lark-slides/scripts/template_tool_test.py +177 -0
  318. package/skills/lark-slides/scripts/xml_text_overlap_lint.py +367 -0
  319. package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +263 -0
  320. package/skills/lark-task/SKILL.md +165 -0
  321. package/skills/lark-task/references/lark-task-assign.md +38 -0
  322. package/skills/lark-task/references/lark-task-comment.md +28 -0
  323. package/skills/lark-task/references/lark-task-complete.md +27 -0
  324. package/skills/lark-task/references/lark-task-create.md +57 -0
  325. package/skills/lark-task/references/lark-task-followers.md +35 -0
  326. package/skills/lark-task/references/lark-task-get-my-tasks.md +55 -0
  327. package/skills/lark-task/references/lark-task-get-related-tasks.md +53 -0
  328. package/skills/lark-task/references/lark-task-reminder.md +36 -0
  329. package/skills/lark-task/references/lark-task-reopen.md +27 -0
  330. package/skills/lark-task/references/lark-task-search.md +41 -0
  331. package/skills/lark-task/references/lark-task-set-ancestor.md +32 -0
  332. package/skills/lark-task/references/lark-task-subscribe-event.md +86 -0
  333. package/skills/lark-task/references/lark-task-tasklist-create.md +35 -0
  334. package/skills/lark-task/references/lark-task-tasklist-members.md +36 -0
  335. package/skills/lark-task/references/lark-task-tasklist-search.md +38 -0
  336. package/skills/lark-task/references/lark-task-tasklist-task-add.md +38 -0
  337. package/skills/lark-task/references/lark-task-update.md +37 -0
  338. package/skills/lark-task/references/lark-task-upload-attachment.md +59 -0
  339. package/skills/lark-vc/SKILL.md +168 -0
  340. package/skills/lark-vc/references/lark-vc-notes.md +126 -0
  341. package/skills/lark-vc/references/lark-vc-recording.md +153 -0
  342. package/skills/lark-vc/references/lark-vc-search.md +193 -0
  343. package/skills/lark-vc-agent/SKILL.md +121 -0
  344. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-events.md +247 -0
  345. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-join.md +133 -0
  346. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-leave.md +111 -0
  347. package/skills/lark-whiteboard/SKILL.md +144 -0
  348. package/skills/lark-whiteboard/references/connectors.md +102 -0
  349. package/skills/lark-whiteboard/references/content.md +40 -0
  350. package/skills/lark-whiteboard/references/image.md +80 -0
  351. package/skills/lark-whiteboard/references/lark-whiteboard-query.md +49 -0
  352. package/skills/lark-whiteboard/references/lark-whiteboard-update.md +100 -0
  353. package/skills/lark-whiteboard/references/layout.md +374 -0
  354. package/skills/lark-whiteboard/references/schema.md +357 -0
  355. package/skills/lark-whiteboard/references/style.md +318 -0
  356. package/skills/lark-whiteboard/references/typography.md +73 -0
  357. package/skills/lark-whiteboard/routes/dsl.md +107 -0
  358. package/skills/lark-whiteboard/routes/mermaid.md +27 -0
  359. package/skills/lark-whiteboard/routes/svg.md +54 -0
  360. package/skills/lark-whiteboard/scenes/architecture.md +433 -0
  361. package/skills/lark-whiteboard/scenes/bar-chart.md +187 -0
  362. package/skills/lark-whiteboard/scenes/comparison.md +135 -0
  363. package/skills/lark-whiteboard/scenes/fishbone.md +238 -0
  364. package/skills/lark-whiteboard/scenes/flowchart.md +198 -0
  365. package/skills/lark-whiteboard/scenes/flywheel.md +195 -0
  366. package/skills/lark-whiteboard/scenes/funnel.md +198 -0
  367. package/skills/lark-whiteboard/scenes/line-chart.md +214 -0
  368. package/skills/lark-whiteboard/scenes/mermaid.md +130 -0
  369. package/skills/lark-whiteboard/scenes/milestone.md +139 -0
  370. package/skills/lark-whiteboard/scenes/organization.md +173 -0
  371. package/skills/lark-whiteboard/scenes/photo-showcase.md +198 -0
  372. package/skills/lark-whiteboard/scenes/pyramid.md +99 -0
  373. package/skills/lark-whiteboard/scenes/swimlane.md +371 -0
  374. package/skills/lark-whiteboard/scenes/treemap.md +198 -0
  375. package/skills/lark-wiki/SKILL.md +119 -0
  376. package/skills/lark-wiki/references/lark-wiki-delete-space.md +205 -0
  377. package/skills/lark-wiki/references/lark-wiki-member-add.md +66 -0
  378. package/skills/lark-wiki/references/lark-wiki-member-list.md +76 -0
  379. package/skills/lark-wiki/references/lark-wiki-member-remove.md +61 -0
  380. package/skills/lark-wiki/references/lark-wiki-move.md +183 -0
  381. package/skills/lark-wiki/references/lark-wiki-node-copy.md +72 -0
  382. package/skills/lark-wiki/references/lark-wiki-node-create.md +127 -0
  383. package/skills/lark-wiki/references/lark-wiki-node-delete.md +62 -0
  384. package/skills/lark-wiki/references/lark-wiki-node-get.md +56 -0
  385. package/skills/lark-wiki/references/lark-wiki-node-list.md +198 -0
  386. package/skills/lark-wiki/references/lark-wiki-space-create.md +46 -0
  387. package/skills/lark-wiki/references/lark-wiki-space-list.md +198 -0
  388. package/skills/lark-workflow-meeting-summary/SKILL.md +104 -0
  389. package/skills/lark-workflow-standup-report/SKILL.md +120 -0
  390. package/skills/mmx-cli/SKILL.md +440 -0
  391. package/src/bot.ts +109 -0
  392. package/src/cards.ts +105 -0
  393. package/src/config.ts +33 -0
  394. package/src/daemon.ts +217 -0
  395. package/src/extension.ts +132 -0
  396. package/src/poller.ts +135 -0
  397. package/src/renderer.ts +47 -0
  398. package/src/session-registry.ts +90 -0
  399. package/src/types.ts +29 -0
  400. package/tests/bot.test.ts +104 -0
  401. package/tests/cards.test.ts +48 -0
  402. package/tests/config.test.ts +59 -0
  403. package/tests/renderer.test.ts +74 -0
  404. package/tests/session-registry.test.ts +94 -0
  405. package/tests/types.test.ts +35 -0
  406. package/tsconfig.json +16 -0
  407. package/vitest.config.ts +7 -0
@@ -0,0 +1,512 @@
1
+ # Base Lookup Field Configuration Guide
2
+
3
+ ## Mandatory Read Acknowledgement
4
+
5
+ When creating or updating a lookup field with `lark-cli base +field-create/+field-update --json ...` and `type` is `lookup`, you should read this guide first and only then add `--i-have-read-guide` to the command.
6
+
7
+ Do **not** proactively add `--i-have-read-guide` before reading this guide. Without it, the CLI will fail fast and direct you back to this guide.
8
+
9
+ When using `+field-update`, also pass `--yes`: field update is a high-risk `PUT` operation because changing a field definition can affect the whole column.
10
+
11
+ ## Default strategy
12
+
13
+ **Use Formula fields by default for cross-table references and aggregations.** Only use Lookup fields when the user explicitly requests a Lookup field. Formula is a strict superset of Lookup — anything Lookup can do, Formula can do with a single expression.
14
+
15
+ ## Usage
16
+
17
+ When creating a lookup field, the Agent should:
18
+
19
+ 1. Get all table names: `lark-cli base +table-list --base-token <base>` — returns `items[].table_name`
20
+ 2. Get table structure: `lark-cli base +table-get --base-token <base> --table-id <table>` — returns `fields[]`
21
+ 3. If the lookup references other tables, also get those tables' structures
22
+ 4. Determine the four elements: from (source table), select (source field), where (filter), aggregate (aggregation)
23
+ 5. Construct the Lookup field JSON and submit it to create or update the field
24
+
25
+ **Key constraints**:
26
+
27
+ - Table names and field names must **exactly match** those returned by `+table-list` / `+table-get`
28
+ - The `from` table must be in the same Base
29
+
30
+ ---
31
+
32
+ ## Section 1: Core Concepts — Four-Element Model
33
+
34
+ A Lookup field is defined by five fields:
35
+
36
+ | Field | Meaning | JSON key | Required |
37
+ |-------|---------|----------|----------|
38
+ | **type** | Must be `"lookup"` | `type` | Yes |
39
+ | **from** | Source table to pull data from | `from` | Yes |
40
+ | **select** | Field in the source table to retrieve | `select` | Yes |
41
+ | **where** | Filter conditions on the source table | `where` | Yes (at least one condition) |
42
+ | **aggregate** | How to aggregate multiple matching records | `aggregate` | No (default: `raw_value`) |
43
+
44
+ **SQL analogy**:
45
+
46
+ ```
47
+ SELECT [select field]
48
+ FROM [from table]
49
+ WHERE [filter conditions]
50
+ GROUP BY [aggregate function]
51
+ ```
52
+
53
+ **Row-level matching (most important concept)**:
54
+
55
+ A Lookup field is computed row-by-row — for each row in the current table, it filters the source table to find "related" records. **The filter defines what "related" means.**
56
+
57
+ ```
58
+ Current table row 1 → filter source table → matching records → select field → aggregate → result
59
+ Current table row 2 → filter source table → matching records → select field → aggregate → result
60
+ ...
61
+ ```
62
+
63
+ **Rule: Whenever the current table and the source table have a row-level correspondence (matching by some field value), you must specify a filter.**
64
+
65
+ ---
66
+
67
+ ## Section 2: Lookup vs Link vs Formula
68
+
69
+ Lookup and Link serve **different purposes**. Creating a Lookup does NOT require a Link field to exist first.
70
+
71
+ | Dimension | Link | Lookup | Formula |
72
+ |-----------|------|--------|---------|
73
+ | Purpose | Establish record relationships (read-write) | Pull and aggregate data from another table (read-only) | Compute values from expressions (read-only) |
74
+ | When to use | "link" / "associate" / "bind" two tables | "look up" / "reference" / "aggregate" / "count" from another table | Calculations, text manipulation, conditional logic |
75
+
76
+ **Common mistake**: Creating a Link field just to create a Lookup. If two tables share a matching text/number field, Lookup can match directly — no Link required.
77
+
78
+ **Selection decision tree**:
79
+
80
+ ```
81
+ What does the user need?
82
+ ├─ "Link"/"associate"/"bind" records between tables → Link
83
+ ├─ "Look up"/"reference"/"aggregate"/"count" from another table → Lookup
84
+ │ ├─ Needs aggregation (sum/count/average)? → Lookup + aggregate
85
+ │ └─ Just reference a value? → Lookup (aggregate = null)
86
+ ├─ Calculations/text manipulation within current table → Formula
87
+ └─ Access linked record's field → Prefer Lookup (more intuitive), or Formula chain access
88
+ ```
89
+
90
+ ---
91
+
92
+ ## Section 3: Filter Condition Rules
93
+
94
+ **You must provide a `where` with at least one condition.** Improper conditions cause every row to pull all records from the source table.
95
+
96
+ ### The Iron Rule: field belongs to source table
97
+
98
+ ```
99
+ filter condition:
100
+ field → must be a field in the FROM table (source table)
101
+ value → constant or reference to a field in the CURRENT table
102
+ ```
103
+
104
+ ### How to find the matching field pair
105
+
106
+ **With a Link field (most common)**: The match is between the **Link field** and the **target table's primary field**.
107
+
108
+ ```
109
+ Link is in the source table → source.linkField matches current.primaryField
110
+ Link is in the current table → source.primaryField matches current.linkField
111
+ ```
112
+
113
+ **Without a Link field**: Two tables share a field with the same meaning — match directly.
114
+
115
+ ### Where condition structure
116
+
117
+ Each condition is a **tuple** (array) of 2 or 3 elements: `[field, operator, value?]`
118
+
119
+ ```json
120
+ {
121
+ "logic": "and",
122
+ "conditions": [
123
+ ["<source table field>", "<operator>", { "type": "constant", "value": "<val>" }]
124
+ ]
125
+ }
126
+ ```
127
+
128
+ For `empty` / `non_empty`, the value can be omitted (2-element tuple):
129
+
130
+ ```json
131
+ ["<source table field>", "empty"]
132
+ ```
133
+
134
+ ### Two value formats
135
+
136
+ **Constant value** — for fixed conditions (e.g., "status is completed"):
137
+
138
+ ```json
139
+ ["状态", "==", { "type": "constant", "value": "已完成" }]
140
+ ```
141
+
142
+ **Field reference** — for dynamic per-row matching (e.g., "match current row's project"):
143
+
144
+ ```json
145
+ ["项目名", "==", { "type": "field_ref", "field": "项目名" }]
146
+ ```
147
+
148
+ **Decision guide**: Fixed condition (e.g., "status is completed") → `constant`. Dynamic condition (e.g., "match current record's project ID") → `field_ref`.
149
+
150
+ ### Constant value format by field type
151
+
152
+ The `value` inside `{ "type": "constant", "value": ... }` varies by field type:
153
+
154
+ | Field type | Constant value format | Example |
155
+ |-----------|----------------------|---------|
156
+ | `text` | String | `"已完成"` |
157
+ | `number` | Number | `100`, `0.8` |
158
+ | `datetime` / `created_at` / `updated_at` | String | `"ExactDate(2025-01-01)"`, `"ExactDate(2025-01-01 09:30)"`, `"Today"`, `"Yesterday"`, `"Tomorrow"` |
159
+ | `select` (`multiple=false/true`) | Option name array | `["Todo"]`, `["Todo", "Done"]` |
160
+ | `link` | Record reference array | `[{ "id": "rec_xxx" }]`, `[{ "id": "rec_xxx" }, { "id": "rec_yyy" }]` |
161
+ | `user` / `created_by` / `updated_by` | User reference array | `[{ "id": "ou_xxx" }]`, `[{ "id": "ou_xxx" }, { "id": "ou_yyy" }]` |
162
+ | `checkbox` | Boolean | `true`, `false` |
163
+ | `attachment` / `location` | Only `empty` / `non_empty` | value must be `null` or omitted |
164
+ | `auto_number` | Not supported for constant comparison | Use dynamic field\_ref instead |
165
+ | `formula` / `lookup` (exact type) | Follow the underlying type rules | — |
166
+ | `formula` / `lookup` (fuzzy type) | String | `"some text"` |
167
+
168
+ **`datetime` notes**:
169
+ - Supported datetime constant values are `ExactDate(...)`, `Today`, `Yesterday`, `Tomorrow`
170
+ - Date-only fields use `ExactDate(YYYY-MM-DD)`
171
+ - Fields that include time use `ExactDate(YYYY-MM-DD HH:mm)`
172
+ - For complex or relative date filtering, consider using a Formula field instead
173
+
174
+ ### Dynamic field reference — set comparison semantics
175
+
176
+ When using `{ "type": "field_ref", "field": "..." }`, values from both sides are first **converted to sets** at runtime, then compared using set operations:
177
+
178
+ - **`==`**: Sets are exactly equal (strict matching)
179
+ - **`intersects`**: Sets have a non-empty intersection (most commonly used)
180
+
181
+ **Conversion rules by field type**:
182
+
183
+ | Field type | Converted to |
184
+ |-----------|-------------|
185
+ | `text` | Single-element string set |
186
+ | `number` / `auto_number` / `datetime` | Single-element number set |
187
+ | `select` (`multiple=false/true`) | Set of option name strings |
188
+ | `user` / `created_by` / `updated_by` | Set of user name strings |
189
+ | `link` | Set of linked records' primary field string representations |
190
+ | `formula` / `lookup` | The computed value set |
191
+
192
+ **Examples**:
193
+ - User field `["name1", "name2"]` **intersects** text `"name1"` → true; **==** text `"name1"` → false (sets not equal)
194
+ - User field `["name1"]` **==** text `"name1"` → true (single-element sets are equal)
195
+ - Link field referencing records → converted to primary field strings, then compared
196
+
197
+ ### Supported operators
198
+
199
+ | Operator | Meaning | Applicable field types |
200
+ |----------|---------|-----------------|
201
+ | `==` | Equal (exact match) | All types |
202
+ | `!=` | Not equal | All types |
203
+ | `>` | Greater than | `number`, `datetime` |
204
+ | `>=` | Greater than or equal | `number`, `datetime` |
205
+ | `<` | Less than | `number`, `datetime` |
206
+ | `<=` | Less than or equal | `number`, `datetime` |
207
+ | `intersects` | Has intersection (non-empty overlap) | All types (most commonly used for dynamic field\_ref) |
208
+ | `disjoint` | No intersection | All types |
209
+ | `empty` | Field is empty | All types (value must be null or omitted) |
210
+ | `non_empty` | Field is not empty | All types (value must be null or omitted) |
211
+
212
+ ### Constraints
213
+
214
+ - **Only one level of and/or** — nesting (e.g., `{ and: [{ or: [...] }] }`) is not supported
215
+ - **At least one condition** — empty conditions array will error
216
+
217
+ ---
218
+
219
+ ## Section 4: Aggregate Rules
220
+
221
+ | Aggregate | Common user phrasing | Select field should be | Result type |
222
+ |-----------|---------------------|----------------------|-------------|
223
+ | `sum` | "total" / "sum" / "cumulative amount" | `number` field (e.g., amount) | Number |
224
+ | `average` | "average" / "mean" | `number` field | Number |
225
+ | `max` | "maximum" / "latest" / "most recent" | `number` / `datetime` field | Same as source |
226
+ | `min` | "minimum" / "earliest" | `number` / `datetime` field | Same as source |
227
+ | `counta` | "count" / "how many" / "total number" | Any field | Number |
228
+ | `unique_counta` | "count distinct" / "how many different" | Field to deduplicate | Number |
229
+ | `unique` | "list distinct" / "which ones" / "show different" | Field to display | List |
230
+ | `raw_value` | "list all" / "show all values" (default) | Field to display | List |
231
+
232
+ **Common confusion**: `unique` returns a **deduplicated list**, `unique_counta` returns a **count**. "Which categories are involved" → `unique`; "How many categories" → `unique_counta`.
233
+
234
+ **Important**:
235
+ - Enum values are **snake_case lowercase**: `sum` not `Sum`, `average` not `Average`
236
+ - **Count is `counta`, NOT `count`** — this is the most common enum mistake
237
+
238
+ ---
239
+
240
+ ## Section 5: Hard Constraints
241
+
242
+ 1. **Always write a filter**: The `where` field is required with at least one condition. Whenever the current table and source table have row-level correspondence, the condition should express that relationship.
243
+ 2. **Lookup fields are read-only**: Cell values cannot be manually set.
244
+ 3. **Create Lookup after all dependent fields exist**: The source table and referenced fields must exist before creating the Lookup field.
245
+ 4. **Source table must be in the same Base**: Cross-Base lookups are not supported.
246
+ 5. **Changing `from` requires changing `select`**: Updating the source table without updating the select field will error.
247
+
248
+ ---
249
+
250
+ ## Section 6: Decision Trees
251
+
252
+ ### How to build the filter
253
+
254
+ ```
255
+ Step 1: Analyze the filtering semantics in the user's request
256
+ "Count artworks per exhibition" → filter: belongs to exhibition = current exhibition
257
+ "Sum completed order amounts" → filter: status = completed AND project = current project
258
+
259
+ Step 2: Find the matching field pair
260
+ ├─ Tables have a Link relationship?
261
+ │ ├─ Link is in source table → source.linkField matches current.primaryField
262
+ │ └─ Link is in current table → source.primaryField matches current.linkField
263
+ ├─ Tables share same-meaning text/number field? → source.field matches current.field
264
+ └─ Also need constant filtering? → AND combination
265
+ ```
266
+
267
+ ### Which aggregate?
268
+
269
+ ```
270
+ How to handle multiple matching records?
271
+ ├─ Show all values as-is → raw_value (default)
272
+ ├─ Show deduplicated list → unique
273
+ ├─ Sum → sum
274
+ ├─ Average → average
275
+ ├─ Maximum / minimum → max / min
276
+ ├─ Count records → counta
277
+ └─ Count distinct → unique_counta
278
+ ```
279
+
280
+ ---
281
+
282
+ ## Section 7: Common Configuration Patterns
283
+
284
+ > Patterns are categorized by **filter matching method**. Aggregate choice is independent — see Section 4.
285
+
286
+ ### Pattern 1: Aggregate from a linked table (Link is in the source table)
287
+
288
+ **Scenario**: "Count artworks per exhibition", "Sum order amounts per project"
289
+
290
+ When the source table has a Link pointing to the current table:
291
+
292
+ ```
293
+ Exhibition table: ExhibitionName (primaryField) ← current table
294
+ Artwork table: ArtworkName (primaryField), ← source table (Link is here)
295
+ Exhibition (Link → Exhibition table)
296
+ ```
297
+
298
+ ```json
299
+ {
300
+ "type": "lookup",
301
+ "name": "Artwork Count",
302
+ "from": "Artwork table",
303
+ "select": "ArtworkName",
304
+ "aggregate": "counta",
305
+ "where": {
306
+ "logic": "and",
307
+ "conditions": [
308
+ ["Exhibition", "intersects", { "type": "field_ref", "field": "ExhibitionName" }]
309
+ ]
310
+ }
311
+ }
312
+ ```
313
+
314
+ ### Pattern 2: Reference a linked record's field (Link is in the current table)
315
+
316
+ **Scenario**: "Show supplier's contact person", "Display warehouse manager"
317
+
318
+ When the current table has a Link pointing to the source table:
319
+
320
+ ```
321
+ Supplier table: SupplierName (primaryField), Contact (Text) ← source table
322
+ Inventory table: ProductName (primaryField), ← current table (Link is here)
323
+ Supplier (Link → Supplier table)
324
+ ```
325
+
326
+ ```json
327
+ {
328
+ "type": "lookup",
329
+ "name": "Supplier Contact",
330
+ "from": "Supplier table",
331
+ "select": "Contact",
332
+ "where": {
333
+ "logic": "and",
334
+ "conditions": [
335
+ ["SupplierName", "intersects", { "type": "field_ref", "field": "Supplier" }]
336
+ ]
337
+ }
338
+ }
339
+ ```
340
+
341
+ ### Pattern 3: Match by same-meaning field (no Link)
342
+
343
+ **Scenario**: "Sum order amounts per project" (tables share a "ProjectName" field but no Link)
344
+
345
+ ```
346
+ Project table: ProjectName (primaryField) ← current table
347
+ Order table: OrderID (primaryField), ProjectName (Text), ← source table
348
+ Amount (Number)
349
+ ```
350
+
351
+ ```json
352
+ {
353
+ "type": "lookup",
354
+ "name": "Order Total",
355
+ "from": "Order table",
356
+ "select": "Amount",
357
+ "aggregate": "sum",
358
+ "where": {
359
+ "logic": "and",
360
+ "conditions": [
361
+ ["ProjectName", "==", { "type": "field_ref", "field": "ProjectName" }]
362
+ ]
363
+ }
364
+ }
365
+ ```
366
+
367
+ ### Pattern 4: Dynamic matching + constant filtering
368
+
369
+ **Scenario**: "Only count completed orders", "Only sum approved budgets"
370
+
371
+ Combine row-level matching with fixed-value filtering using `logic: "and"`:
372
+
373
+ ```json
374
+ {
375
+ "type": "lookup",
376
+ "name": "Completed Order Amount",
377
+ "from": "Order table",
378
+ "select": "Amount",
379
+ "aggregate": "sum",
380
+ "where": {
381
+ "logic": "and",
382
+ "conditions": [
383
+ ["Manager", "==", { "type": "field_ref", "field": "EmployeeName" }],
384
+ ["Status", "==", { "type": "constant", "value": "Completed" }]
385
+ ]
386
+ }
387
+ }
388
+ ```
389
+
390
+ ### Pattern 5: Date filtering with constant value
391
+
392
+ **Scenario**: "Look up orders created after 2025-01-01", "Sum today's sales"
393
+
394
+ ```json
395
+ {
396
+ "type": "lookup",
397
+ "name": "Recent Orders",
398
+ "from": "Order table",
399
+ "select": "Amount",
400
+ "aggregate": "sum",
401
+ "where": {
402
+ "logic": "and",
403
+ "conditions": [
404
+ ["ProjectName", "==", { "type": "field_ref", "field": "ProjectName" }],
405
+ ["CreatedDate", ">=", { "type": "constant", "value": "ExactDate(2025-01-01)" }]
406
+ ]
407
+ }
408
+ }
409
+ ```
410
+
411
+ ---
412
+
413
+ ## Section 8: Anti-Pattern Collection
414
+
415
+ ### Mistake 1: Omitting where (most common)
416
+
417
+ ```json
418
+ // Wrong: no where, every row pulls all records
419
+ { "type": "lookup", "name": "Artwork Count", "from": "Artwork table", "select": "ArtworkName", "aggregate": "counta" }
420
+
421
+ // Correct: where with Link relationship
422
+ { "type": "lookup", "name": "Artwork Count", "from": "Artwork table", "select": "ArtworkName", "aggregate": "counta",
423
+ "where": { "logic": "and", "conditions": [
424
+ ["Exhibition", "intersects", { "type": "field_ref", "field": "ExhibitionName" }]
425
+ ]}}
426
+ ```
427
+
428
+ ### Mistake 2: Wrong value type — confusing constant vs field_ref
429
+
430
+ ```json
431
+ // Wrong: using constant for a dynamic join
432
+ ["ProjectName", "==", { "type": "constant", "value": "ProjectName" }]
433
+
434
+ // Correct: use field_ref for dynamic per-row matching
435
+ ["ProjectName", "==", { "type": "field_ref", "field": "ProjectName" }]
436
+ ```
437
+
438
+ ### Mistake 3: Using `count` instead of `counta`
439
+
440
+ ```json
441
+ // Wrong
442
+ { "aggregate": "count" }
443
+
444
+ // Correct
445
+ { "aggregate": "counta" }
446
+ ```
447
+
448
+ ### Mistake 4: Wrong case for aggregate values
449
+
450
+ ```json
451
+ // Wrong
452
+ { "aggregate": "SUM" }
453
+ { "aggregate": "Sum" }
454
+
455
+ // Correct — snake_case lowercase
456
+ { "aggregate": "sum" }
457
+ { "aggregate": "average" }
458
+ ```
459
+
460
+ ### Mistake 5: Nested where conditions
461
+
462
+ ```json
463
+ // Wrong: nesting not supported
464
+ { "logic": "and", "conditions": [
465
+ { "logic": "or", "conditions": [...] }
466
+ ]}
467
+
468
+ // Correct: only one level
469
+ { "logic": "and", "conditions": [cond1, cond2, cond3] }
470
+ ```
471
+
472
+ ### Mistake 6: Confusing Lookup with Link
473
+
474
+ The user says "aggregate order amounts" — use Lookup, not Link. Link establishes relationships; Lookup retrieves and aggregates data.
475
+
476
+ ### Mistake 7: Using object format instead of tuple for conditions
477
+
478
+ ```json
479
+ // Wrong: object format
480
+ { "fieldRef": "Status", "operator": "is", "value": { "type": "constant", "value": "Done" } }
481
+
482
+ // Correct: tuple format [field, operator, value?]
483
+ ["Status", "==", { "type": "constant", "value": "Done" }]
484
+ ```
485
+
486
+ ### Mistake 8: Missing `type` field
487
+
488
+ ```json
489
+ // Wrong: no type field
490
+ { "name": "Total", "from": "Orders", "select": "Amount", "aggregate": "sum", "where": { ... } }
491
+
492
+ // Correct: must include type
493
+ { "type": "lookup", "name": "Total", "from": "Orders", "select": "Amount", "aggregate": "sum", "where": { ... } }
494
+ ```
495
+
496
+ ---
497
+
498
+ ## Section 9: Constraint Summary
499
+
500
+ - `type` must be `"lookup"` — this field is required in the request body
501
+ - `where` is required with at least one condition — always specify a filter
502
+ - Conditions use **tuple format**: `[field, operator, value?]` — NOT object format
503
+ - Lookup fields are read-only — values cannot be manually set
504
+ - Source table and referenced fields must exist before creating the Lookup
505
+ - Condition field (first element of tuple) must reference a field in the source table, not the current table
506
+ - Where supports only one level of and/or — no nesting
507
+ - Aggregate values are snake_case lowercase: `sum`, `counta`, `unique_counta` (NOT `count`)
508
+ - Operators: `==`, `!=`, `>`, `>=`, `<`, `<=`, `intersects`, `disjoint`, `empty`, `non_empty`
509
+ - Table and field names must exactly match `+table-get` output
510
+ - `datetime` constant values use string format: `ExactDate(YYYY-MM-DD)` / `ExactDate(YYYY-MM-DD HH:mm)` / `Today` / `Yesterday` / `Tomorrow`
511
+ - `select` constant values use option names;
512
+ - `link` / `user` constant values use `{id}` object arrays