denchclaw 2.3.21 → 2.4.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 (481) hide show
  1. package/apps/web/.next/standalone/apps/web/.next/BUILD_ID +1 -1
  2. package/apps/web/.next/standalone/apps/web/.next/app-build-manifest.json +233 -198
  3. package/apps/web/.next/standalone/apps/web/.next/app-path-routes-manifest.json +32 -27
  4. package/apps/web/.next/standalone/apps/web/.next/build-manifest.json +5 -5
  5. package/apps/web/.next/standalone/apps/web/.next/cache/config.json +3 -3
  6. package/apps/web/.next/standalone/apps/web/.next/prerender-manifest.json +3 -3
  7. package/apps/web/.next/standalone/apps/web/.next/react-loadable-manifest.json +1 -4
  8. package/apps/web/.next/standalone/apps/web/.next/required-server-files.json +1 -1
  9. package/apps/web/.next/standalone/apps/web/.next/routes-manifest.json +34 -1
  10. package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  11. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/cron/route_client-reference-manifest.js +1 -1
  12. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/proxy/route_client-reference-manifest.js +1 -1
  13. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/route_client-reference-manifest.js +1 -1
  14. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/serve/[...path]/route_client-reference-manifest.js +1 -1
  15. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/store/route_client-reference-manifest.js +1 -1
  16. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/webhooks/[...path]/route_client-reference-manifest.js +1 -1
  17. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/active/route_client-reference-manifest.js +1 -1
  18. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/route.js +1 -1
  19. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/route_client-reference-manifest.js +1 -1
  20. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/runs/route_client-reference-manifest.js +1 -1
  21. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stop/route.js +1 -1
  22. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stop/route_client-reference-manifest.js +1 -1
  23. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stream/route_client-reference-manifest.js +1 -1
  24. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/subagents/route_client-reference-manifest.js +1 -1
  25. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/[jobId]/runs/route_client-reference-manifest.js +1 -1
  26. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/route_client-reference-manifest.js +1 -1
  27. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/[sessionId]/route_client-reference-manifest.js +1 -1
  28. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/search-transcript/route_client-reference-manifest.js +1 -1
  29. package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route.js +1 -1
  30. package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route_client-reference-manifest.js +1 -1
  31. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/channels/route_client-reference-manifest.js +1 -1
  32. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/chat/route_client-reference-manifest.js +1 -1
  33. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/chat/stream/route_client-reference-manifest.js +1 -1
  34. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/sessions/[id]/route_client-reference-manifest.js +1 -1
  35. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/sessions/route_client-reference-manifest.js +1 -1
  36. package/apps/web/.next/standalone/apps/web/.next/server/app/api/memories/route_client-reference-manifest.js +1 -1
  37. package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/route_client-reference-manifest.js +1 -1
  38. package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/switch/route_client-reference-manifest.js +1 -1
  39. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/[sessionId]/route_client-reference-manifest.js +1 -1
  40. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
  41. package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  42. package/apps/web/.next/standalone/apps/web/.next/server/app/api/terminal/port/route_client-reference-manifest.js +1 -1
  43. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/messages/route_client-reference-manifest.js +1 -1
  44. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/route_client-reference-manifest.js +1 -1
  45. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/route.js +1 -1
  46. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/route_client-reference-manifest.js +1 -1
  47. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/assets/[...path]/route_client-reference-manifest.js +1 -1
  48. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse/route_client-reference-manifest.js +1 -1
  49. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse-file/route_client-reference-manifest.js +1 -1
  50. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/context/route_client-reference-manifest.js +1 -1
  51. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/copy/route_client-reference-manifest.js +1 -1
  52. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/introspect/route_client-reference-manifest.js +1 -1
  53. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/query/route_client-reference-manifest.js +1 -1
  54. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/delete/route.js +1 -1
  55. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/delete/route_client-reference-manifest.js +1 -1
  56. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/execute/route_client-reference-manifest.js +1 -1
  57. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/file/route_client-reference-manifest.js +1 -1
  58. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/init/route.js +1 -1
  59. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/init/route_client-reference-manifest.js +1 -1
  60. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/link-preview/route.js +1 -0
  61. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/link-preview/route.js.nft.json +1 -0
  62. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/link-preview/route_client-reference-manifest.js +1 -0
  63. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/list/route_client-reference-manifest.js +1 -1
  64. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/mkdir/route_client-reference-manifest.js +1 -1
  65. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/move/route_client-reference-manifest.js +1 -1
  66. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/route.js +54 -0
  67. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/route.js.nft.json +1 -0
  68. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/route_client-reference-manifest.js +1 -0
  69. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/runs/route.js +4 -0
  70. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/runs/route.js.nft.json +1 -0
  71. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/runs/route_client-reference-manifest.js +1 -0
  72. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/display-field/route_client-reference-manifest.js +1 -1
  73. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/content/route.js +1 -0
  74. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/content/route.js.nft.json +1 -0
  75. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/content/route_client-reference-manifest.js +1 -0
  76. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/route_client-reference-manifest.js +1 -1
  77. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/bulk-delete/route_client-reference-manifest.js +1 -1
  78. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/options/route_client-reference-manifest.js +1 -1
  79. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/route.js +1 -1
  80. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/route_client-reference-manifest.js +1 -1
  81. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route_client-reference-manifest.js +1 -1
  82. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/route.js +9 -1
  83. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/route_client-reference-manifest.js +1 -1
  84. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/reorder/route_client-reference-manifest.js +1 -1
  85. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/route.js +10 -0
  86. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/route.js.nft.json +1 -0
  87. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/route_client-reference-manifest.js +1 -0
  88. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/route_client-reference-manifest.js +1 -1
  89. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/views/route_client-reference-manifest.js +1 -1
  90. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/open-file/route_client-reference-manifest.js +1 -1
  91. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/path-info/route_client-reference-manifest.js +1 -1
  92. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/query/route_client-reference-manifest.js +1 -1
  93. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/raw-file/route_client-reference-manifest.js +1 -1
  94. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/rename/route_client-reference-manifest.js +1 -1
  95. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/reports/execute/route.js +1 -1
  96. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/reports/execute/route_client-reference-manifest.js +1 -1
  97. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/search-index/route_client-reference-manifest.js +1 -1
  98. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/suggest-files/route_client-reference-manifest.js +1 -1
  99. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/switch/route.js +1 -1
  100. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/switch/route_client-reference-manifest.js +1 -1
  101. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/thumbnail/route_client-reference-manifest.js +1 -1
  102. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/tree/route_client-reference-manifest.js +1 -1
  103. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/upload/route.js +1 -1
  104. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/upload/route_client-reference-manifest.js +1 -1
  105. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/virtual-file/route_client-reference-manifest.js +1 -1
  106. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/watch/route_client-reference-manifest.js +1 -1
  107. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/write-binary/route_client-reference-manifest.js +1 -1
  108. package/apps/web/.next/standalone/apps/web/.next/server/app/page.js +104 -55
  109. package/apps/web/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  110. package/apps/web/.next/standalone/apps/web/.next/server/app/workspace/page_client-reference-manifest.js +1 -1
  111. package/apps/web/.next/standalone/apps/web/.next/server/app-paths-manifest.json +32 -27
  112. package/apps/web/.next/standalone/apps/web/.next/server/chunks/6787.js +1 -1
  113. package/apps/web/.next/standalone/apps/web/.next/server/chunks/687.js +1 -1
  114. package/apps/web/.next/standalone/apps/web/.next/server/chunks/8137.js +1 -1
  115. package/apps/web/.next/standalone/apps/web/.next/server/functions-config-manifest.json +15 -10
  116. package/apps/web/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +1 -1
  117. package/apps/web/.next/standalone/apps/web/.next/server/middleware-react-loadable-manifest.js +1 -1
  118. package/apps/web/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
  119. package/apps/web/.next/standalone/apps/web/.next/server/server-reference-manifest.json +1 -1
  120. package/apps/web/.next/standalone/apps/web/.next/server/webpack-runtime.js +1 -1
  121. package/apps/web/.next/standalone/apps/web/.next/static/chunks/2716-475d96c202834586.js +135 -0
  122. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/cron/route-d14ffafd970f186e.js +1 -0
  123. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/proxy/route-d14ffafd970f186e.js +1 -0
  124. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/route-d14ffafd970f186e.js +1 -0
  125. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/serve/[...path]/route-d14ffafd970f186e.js +1 -0
  126. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/store/route-d14ffafd970f186e.js +1 -0
  127. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/webhooks/[...path]/route-d14ffafd970f186e.js +1 -0
  128. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/active/route-d14ffafd970f186e.js +1 -0
  129. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/route-d14ffafd970f186e.js +1 -0
  130. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/runs/route-d14ffafd970f186e.js +1 -0
  131. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/stop/route-d14ffafd970f186e.js +1 -0
  132. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/stream/route-d14ffafd970f186e.js +1 -0
  133. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/subagents/route-d14ffafd970f186e.js +1 -0
  134. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/jobs/[jobId]/runs/route-d14ffafd970f186e.js +1 -0
  135. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/jobs/route-d14ffafd970f186e.js +1 -0
  136. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/runs/[sessionId]/route-d14ffafd970f186e.js +1 -0
  137. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/runs/search-transcript/route-d14ffafd970f186e.js +1 -0
  138. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/feedback/route-d14ffafd970f186e.js +1 -0
  139. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/channels/route-d14ffafd970f186e.js +1 -0
  140. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/chat/route-d14ffafd970f186e.js +1 -0
  141. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/chat/stream/route-d14ffafd970f186e.js +1 -0
  142. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/sessions/[id]/route-d14ffafd970f186e.js +1 -0
  143. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/sessions/route-d14ffafd970f186e.js +1 -0
  144. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/memories/route-d14ffafd970f186e.js +1 -0
  145. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/profiles/route-d14ffafd970f186e.js +1 -0
  146. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/profiles/switch/route-d14ffafd970f186e.js +1 -0
  147. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/sessions/[sessionId]/route-d14ffafd970f186e.js +1 -0
  148. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/sessions/route-d14ffafd970f186e.js +1 -0
  149. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/skills/route-d14ffafd970f186e.js +1 -0
  150. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/terminal/port/route-d14ffafd970f186e.js +1 -0
  151. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/[id]/messages/route-d14ffafd970f186e.js +1 -0
  152. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/[id]/route-d14ffafd970f186e.js +1 -0
  153. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/route-d14ffafd970f186e.js +1 -0
  154. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/assets/[...path]/route-d14ffafd970f186e.js +1 -0
  155. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/browse/route-d14ffafd970f186e.js +1 -0
  156. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/browse-file/route-d14ffafd970f186e.js +1 -0
  157. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/context/route-d14ffafd970f186e.js +1 -0
  158. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/copy/route-d14ffafd970f186e.js +1 -0
  159. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/db/introspect/route-d14ffafd970f186e.js +1 -0
  160. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/db/query/route-d14ffafd970f186e.js +1 -0
  161. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/delete/route-d14ffafd970f186e.js +1 -0
  162. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/execute/route-d14ffafd970f186e.js +1 -0
  163. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/file/route-d14ffafd970f186e.js +1 -0
  164. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/init/route-d14ffafd970f186e.js +1 -0
  165. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/link-preview/route-d14ffafd970f186e.js +1 -0
  166. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/list/route-d14ffafd970f186e.js +1 -0
  167. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/mkdir/route-d14ffafd970f186e.js +1 -0
  168. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/move/route-d14ffafd970f186e.js +1 -0
  169. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/actions/route-d14ffafd970f186e.js +1 -0
  170. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/actions/runs/route-d14ffafd970f186e.js +1 -0
  171. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/display-field/route-d14ffafd970f186e.js +1 -0
  172. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/content/route-d14ffafd970f186e.js +1 -0
  173. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/route-d14ffafd970f186e.js +1 -0
  174. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/bulk-delete/route-d14ffafd970f186e.js +1 -0
  175. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/options/route-d14ffafd970f186e.js +1 -0
  176. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/route-d14ffafd970f186e.js +1 -0
  177. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route-d14ffafd970f186e.js +1 -0
  178. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/route-d14ffafd970f186e.js +1 -0
  179. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/reorder/route-d14ffafd970f186e.js +1 -0
  180. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/route-d14ffafd970f186e.js +1 -0
  181. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/route-d14ffafd970f186e.js +1 -0
  182. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/views/route-d14ffafd970f186e.js +1 -0
  183. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/open-file/route-d14ffafd970f186e.js +1 -0
  184. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/path-info/route-d14ffafd970f186e.js +1 -0
  185. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/query/route-d14ffafd970f186e.js +1 -0
  186. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/raw-file/route-d14ffafd970f186e.js +1 -0
  187. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/rename/route-d14ffafd970f186e.js +1 -0
  188. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/reports/execute/route-d14ffafd970f186e.js +1 -0
  189. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/search-index/route-d14ffafd970f186e.js +1 -0
  190. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/suggest-files/route-d14ffafd970f186e.js +1 -0
  191. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/switch/route-d14ffafd970f186e.js +1 -0
  192. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/thumbnail/route-d14ffafd970f186e.js +1 -0
  193. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/tree/route-d14ffafd970f186e.js +1 -0
  194. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/upload/route-d14ffafd970f186e.js +1 -0
  195. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/virtual-file/route-d14ffafd970f186e.js +1 -0
  196. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/watch/route-d14ffafd970f186e.js +1 -0
  197. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/write-binary/route-d14ffafd970f186e.js +1 -0
  198. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/{layout-2ada610571ddd42f.js → layout-f08988a91b85294a.js} +1 -1
  199. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/page-64cad81306c18be9.js +1 -0
  200. package/apps/web/.next/standalone/apps/web/.next/static/chunks/webpack-a769c08a3fea86bb.js +1 -0
  201. package/apps/web/.next/standalone/apps/web/.next/static/css/fb279c912601f360.css +1 -0
  202. package/apps/web/.next/standalone/apps/web/.next/static/xzgogMMcs02a6BQa5tMBA/_buildManifest.js +1 -0
  203. package/apps/web/.next/standalone/apps/web/lib/action-sdk-runtime.js +121 -0
  204. package/apps/web/.next/standalone/apps/web/package.json +1 -0
  205. package/apps/web/.next/standalone/apps/web/server.js +1 -1
  206. package/apps/web/.next/standalone/package.json +1 -1
  207. package/apps/web/.next/static/chunks/2716-475d96c202834586.js +135 -0
  208. package/apps/web/.next/static/chunks/app/api/apps/cron/route-d14ffafd970f186e.js +1 -0
  209. package/apps/web/.next/static/chunks/app/api/apps/proxy/route-d14ffafd970f186e.js +1 -0
  210. package/apps/web/.next/static/chunks/app/api/apps/route-d14ffafd970f186e.js +1 -0
  211. package/apps/web/.next/static/chunks/app/api/apps/serve/[...path]/route-d14ffafd970f186e.js +1 -0
  212. package/apps/web/.next/static/chunks/app/api/apps/store/route-d14ffafd970f186e.js +1 -0
  213. package/apps/web/.next/static/chunks/app/api/apps/webhooks/[...path]/route-d14ffafd970f186e.js +1 -0
  214. package/apps/web/.next/static/chunks/app/api/chat/active/route-d14ffafd970f186e.js +1 -0
  215. package/apps/web/.next/static/chunks/app/api/chat/route-d14ffafd970f186e.js +1 -0
  216. package/apps/web/.next/static/chunks/app/api/chat/runs/route-d14ffafd970f186e.js +1 -0
  217. package/apps/web/.next/static/chunks/app/api/chat/stop/route-d14ffafd970f186e.js +1 -0
  218. package/apps/web/.next/static/chunks/app/api/chat/stream/route-d14ffafd970f186e.js +1 -0
  219. package/apps/web/.next/static/chunks/app/api/chat/subagents/route-d14ffafd970f186e.js +1 -0
  220. package/apps/web/.next/static/chunks/app/api/cron/jobs/[jobId]/runs/route-d14ffafd970f186e.js +1 -0
  221. package/apps/web/.next/static/chunks/app/api/cron/jobs/route-d14ffafd970f186e.js +1 -0
  222. package/apps/web/.next/static/chunks/app/api/cron/runs/[sessionId]/route-d14ffafd970f186e.js +1 -0
  223. package/apps/web/.next/static/chunks/app/api/cron/runs/search-transcript/route-d14ffafd970f186e.js +1 -0
  224. package/apps/web/.next/static/chunks/app/api/feedback/route-d14ffafd970f186e.js +1 -0
  225. package/apps/web/.next/static/chunks/app/api/gateway/channels/route-d14ffafd970f186e.js +1 -0
  226. package/apps/web/.next/static/chunks/app/api/gateway/chat/route-d14ffafd970f186e.js +1 -0
  227. package/apps/web/.next/static/chunks/app/api/gateway/chat/stream/route-d14ffafd970f186e.js +1 -0
  228. package/apps/web/.next/static/chunks/app/api/gateway/sessions/[id]/route-d14ffafd970f186e.js +1 -0
  229. package/apps/web/.next/static/chunks/app/api/gateway/sessions/route-d14ffafd970f186e.js +1 -0
  230. package/apps/web/.next/static/chunks/app/api/memories/route-d14ffafd970f186e.js +1 -0
  231. package/apps/web/.next/static/chunks/app/api/profiles/route-d14ffafd970f186e.js +1 -0
  232. package/apps/web/.next/static/chunks/app/api/profiles/switch/route-d14ffafd970f186e.js +1 -0
  233. package/apps/web/.next/static/chunks/app/api/sessions/[sessionId]/route-d14ffafd970f186e.js +1 -0
  234. package/apps/web/.next/static/chunks/app/api/sessions/route-d14ffafd970f186e.js +1 -0
  235. package/apps/web/.next/static/chunks/app/api/skills/route-d14ffafd970f186e.js +1 -0
  236. package/apps/web/.next/static/chunks/app/api/terminal/port/route-d14ffafd970f186e.js +1 -0
  237. package/apps/web/.next/static/chunks/app/api/web-sessions/[id]/messages/route-d14ffafd970f186e.js +1 -0
  238. package/apps/web/.next/static/chunks/app/api/web-sessions/[id]/route-d14ffafd970f186e.js +1 -0
  239. package/apps/web/.next/static/chunks/app/api/web-sessions/route-d14ffafd970f186e.js +1 -0
  240. package/apps/web/.next/static/chunks/app/api/workspace/assets/[...path]/route-d14ffafd970f186e.js +1 -0
  241. package/apps/web/.next/static/chunks/app/api/workspace/browse/route-d14ffafd970f186e.js +1 -0
  242. package/apps/web/.next/static/chunks/app/api/workspace/browse-file/route-d14ffafd970f186e.js +1 -0
  243. package/apps/web/.next/static/chunks/app/api/workspace/context/route-d14ffafd970f186e.js +1 -0
  244. package/apps/web/.next/static/chunks/app/api/workspace/copy/route-d14ffafd970f186e.js +1 -0
  245. package/apps/web/.next/static/chunks/app/api/workspace/db/introspect/route-d14ffafd970f186e.js +1 -0
  246. package/apps/web/.next/static/chunks/app/api/workspace/db/query/route-d14ffafd970f186e.js +1 -0
  247. package/apps/web/.next/static/chunks/app/api/workspace/delete/route-d14ffafd970f186e.js +1 -0
  248. package/apps/web/.next/static/chunks/app/api/workspace/execute/route-d14ffafd970f186e.js +1 -0
  249. package/apps/web/.next/static/chunks/app/api/workspace/file/route-d14ffafd970f186e.js +1 -0
  250. package/apps/web/.next/static/chunks/app/api/workspace/init/route-d14ffafd970f186e.js +1 -0
  251. package/apps/web/.next/static/chunks/app/api/workspace/link-preview/route-d14ffafd970f186e.js +1 -0
  252. package/apps/web/.next/static/chunks/app/api/workspace/list/route-d14ffafd970f186e.js +1 -0
  253. package/apps/web/.next/static/chunks/app/api/workspace/mkdir/route-d14ffafd970f186e.js +1 -0
  254. package/apps/web/.next/static/chunks/app/api/workspace/move/route-d14ffafd970f186e.js +1 -0
  255. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/actions/route-d14ffafd970f186e.js +1 -0
  256. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/actions/runs/route-d14ffafd970f186e.js +1 -0
  257. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/display-field/route-d14ffafd970f186e.js +1 -0
  258. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/content/route-d14ffafd970f186e.js +1 -0
  259. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/route-d14ffafd970f186e.js +1 -0
  260. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/bulk-delete/route-d14ffafd970f186e.js +1 -0
  261. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/options/route-d14ffafd970f186e.js +1 -0
  262. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/route-d14ffafd970f186e.js +1 -0
  263. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route-d14ffafd970f186e.js +1 -0
  264. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/route-d14ffafd970f186e.js +1 -0
  265. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/reorder/route-d14ffafd970f186e.js +1 -0
  266. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/route-d14ffafd970f186e.js +1 -0
  267. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/route-d14ffafd970f186e.js +1 -0
  268. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/views/route-d14ffafd970f186e.js +1 -0
  269. package/apps/web/.next/static/chunks/app/api/workspace/open-file/route-d14ffafd970f186e.js +1 -0
  270. package/apps/web/.next/static/chunks/app/api/workspace/path-info/route-d14ffafd970f186e.js +1 -0
  271. package/apps/web/.next/static/chunks/app/api/workspace/query/route-d14ffafd970f186e.js +1 -0
  272. package/apps/web/.next/static/chunks/app/api/workspace/raw-file/route-d14ffafd970f186e.js +1 -0
  273. package/apps/web/.next/static/chunks/app/api/workspace/rename/route-d14ffafd970f186e.js +1 -0
  274. package/apps/web/.next/static/chunks/app/api/workspace/reports/execute/route-d14ffafd970f186e.js +1 -0
  275. package/apps/web/.next/static/chunks/app/api/workspace/search-index/route-d14ffafd970f186e.js +1 -0
  276. package/apps/web/.next/static/chunks/app/api/workspace/suggest-files/route-d14ffafd970f186e.js +1 -0
  277. package/apps/web/.next/static/chunks/app/api/workspace/switch/route-d14ffafd970f186e.js +1 -0
  278. package/apps/web/.next/static/chunks/app/api/workspace/thumbnail/route-d14ffafd970f186e.js +1 -0
  279. package/apps/web/.next/static/chunks/app/api/workspace/tree/route-d14ffafd970f186e.js +1 -0
  280. package/apps/web/.next/static/chunks/app/api/workspace/upload/route-d14ffafd970f186e.js +1 -0
  281. package/apps/web/.next/static/chunks/app/api/workspace/virtual-file/route-d14ffafd970f186e.js +1 -0
  282. package/apps/web/.next/static/chunks/app/api/workspace/watch/route-d14ffafd970f186e.js +1 -0
  283. package/apps/web/.next/static/chunks/app/api/workspace/write-binary/route-d14ffafd970f186e.js +1 -0
  284. package/apps/web/.next/static/chunks/app/{layout-2ada610571ddd42f.js → layout-f08988a91b85294a.js} +1 -1
  285. package/apps/web/.next/static/chunks/app/page-64cad81306c18be9.js +1 -0
  286. package/apps/web/.next/static/chunks/webpack-a769c08a3fea86bb.js +1 -0
  287. package/apps/web/.next/static/css/fb279c912601f360.css +1 -0
  288. package/apps/web/.next/static/xzgogMMcs02a6BQa5tMBA/_buildManifest.js +1 -0
  289. package/assets/seed/schema.sql +15 -0
  290. package/dist/entry.js +1 -1
  291. package/dist/{program-IDoEjVLE.js → program-DcrLV9Z2.js} +8 -1
  292. package/dist/{run-main-D2k8GHwe.js → run-main-D7Ux65aN.js} +1 -1
  293. package/extensions/dench-identity/index.ts +1 -9
  294. package/extensions/posthog-analytics/lib/build-env.js +1 -1
  295. package/package.json +1 -1
  296. package/skills/crm/SKILL.md +49 -926
  297. package/skills/crm/actions/SKILL.md +600 -0
  298. package/skills/crm/documents/SKILL.md +64 -0
  299. package/skills/crm/duckdb-operations/SKILL.md +546 -0
  300. package/skills/crm/object-builder/SKILL.md +361 -0
  301. package/skills/crm/reports/SKILL.md +199 -0
  302. package/skills/crm/views-filters/SKILL.md +303 -0
  303. package/skills/gstack/SKILL.md +101 -0
  304. package/skills/gstack/benchmark/SKILL.md +86 -0
  305. package/skills/gstack/canary/SKILL.md +65 -0
  306. package/skills/gstack/careful/SKILL.md +66 -0
  307. package/skills/gstack/design-consultation/SKILL.md +90 -0
  308. package/skills/gstack/design-review/SKILL.md +72 -0
  309. package/skills/gstack/document-release/SKILL.md +112 -0
  310. package/skills/gstack/freeze/SKILL.md +57 -0
  311. package/skills/gstack/guard/SKILL.md +37 -0
  312. package/skills/gstack/investigate/SKILL.md +111 -0
  313. package/skills/gstack/land-and-deploy/SKILL.md +77 -0
  314. package/skills/gstack/office-hours/SKILL.md +105 -0
  315. package/skills/gstack/plan-ceo-review/SKILL.md +108 -0
  316. package/skills/gstack/plan-design-review/SKILL.md +99 -0
  317. package/skills/gstack/plan-eng-review/SKILL.md +129 -0
  318. package/skills/gstack/qa/SKILL.md +121 -0
  319. package/skills/gstack/qa-only/SKILL.md +51 -0
  320. package/skills/gstack/retro/SKILL.md +88 -0
  321. package/skills/gstack/review/SKILL.md +144 -0
  322. package/skills/gstack/ship/SKILL.md +126 -0
  323. package/skills/gstack/unfreeze/SKILL.md +23 -0
  324. package/apps/web/.next/standalone/apps/web/.next/static/chunks/2597.f31531534ad0b96f.js +0 -1
  325. package/apps/web/.next/standalone/apps/web/.next/static/chunks/4652.ca2ab4e205060d84.js +0 -60
  326. package/apps/web/.next/standalone/apps/web/.next/static/chunks/6861-58d368bcf4e23b55.js +0 -76
  327. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/cron/route-580e9ace8a991c49.js +0 -1
  328. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/proxy/route-580e9ace8a991c49.js +0 -1
  329. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/route-580e9ace8a991c49.js +0 -1
  330. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/serve/[...path]/route-580e9ace8a991c49.js +0 -1
  331. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/store/route-580e9ace8a991c49.js +0 -1
  332. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/webhooks/[...path]/route-580e9ace8a991c49.js +0 -1
  333. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/active/route-580e9ace8a991c49.js +0 -1
  334. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/route-580e9ace8a991c49.js +0 -1
  335. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/runs/route-580e9ace8a991c49.js +0 -1
  336. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/stop/route-580e9ace8a991c49.js +0 -1
  337. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/stream/route-580e9ace8a991c49.js +0 -1
  338. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/subagents/route-580e9ace8a991c49.js +0 -1
  339. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/jobs/[jobId]/runs/route-580e9ace8a991c49.js +0 -1
  340. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/jobs/route-580e9ace8a991c49.js +0 -1
  341. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/runs/[sessionId]/route-580e9ace8a991c49.js +0 -1
  342. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/runs/search-transcript/route-580e9ace8a991c49.js +0 -1
  343. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/feedback/route-580e9ace8a991c49.js +0 -1
  344. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/channels/route-580e9ace8a991c49.js +0 -1
  345. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/chat/route-580e9ace8a991c49.js +0 -1
  346. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/chat/stream/route-580e9ace8a991c49.js +0 -1
  347. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/sessions/[id]/route-580e9ace8a991c49.js +0 -1
  348. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/sessions/route-580e9ace8a991c49.js +0 -1
  349. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/memories/route-580e9ace8a991c49.js +0 -1
  350. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/profiles/route-580e9ace8a991c49.js +0 -1
  351. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/profiles/switch/route-580e9ace8a991c49.js +0 -1
  352. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/sessions/[sessionId]/route-580e9ace8a991c49.js +0 -1
  353. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/sessions/route-580e9ace8a991c49.js +0 -1
  354. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/skills/route-580e9ace8a991c49.js +0 -1
  355. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/terminal/port/route-580e9ace8a991c49.js +0 -1
  356. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/[id]/messages/route-580e9ace8a991c49.js +0 -1
  357. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/[id]/route-580e9ace8a991c49.js +0 -1
  358. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/route-580e9ace8a991c49.js +0 -1
  359. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/assets/[...path]/route-580e9ace8a991c49.js +0 -1
  360. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/browse/route-580e9ace8a991c49.js +0 -1
  361. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/browse-file/route-580e9ace8a991c49.js +0 -1
  362. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/context/route-580e9ace8a991c49.js +0 -1
  363. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/copy/route-580e9ace8a991c49.js +0 -1
  364. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/db/introspect/route-580e9ace8a991c49.js +0 -1
  365. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/db/query/route-580e9ace8a991c49.js +0 -1
  366. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/delete/route-580e9ace8a991c49.js +0 -1
  367. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/execute/route-580e9ace8a991c49.js +0 -1
  368. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/file/route-580e9ace8a991c49.js +0 -1
  369. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/init/route-580e9ace8a991c49.js +0 -1
  370. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/list/route-580e9ace8a991c49.js +0 -1
  371. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/mkdir/route-580e9ace8a991c49.js +0 -1
  372. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/move/route-580e9ace8a991c49.js +0 -1
  373. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/display-field/route-580e9ace8a991c49.js +0 -1
  374. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/route-580e9ace8a991c49.js +0 -1
  375. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/bulk-delete/route-580e9ace8a991c49.js +0 -1
  376. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/options/route-580e9ace8a991c49.js +0 -1
  377. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/route-580e9ace8a991c49.js +0 -1
  378. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route-580e9ace8a991c49.js +0 -1
  379. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/route-580e9ace8a991c49.js +0 -1
  380. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/reorder/route-580e9ace8a991c49.js +0 -1
  381. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/route-580e9ace8a991c49.js +0 -1
  382. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/views/route-580e9ace8a991c49.js +0 -1
  383. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/open-file/route-580e9ace8a991c49.js +0 -1
  384. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/path-info/route-580e9ace8a991c49.js +0 -1
  385. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/query/route-580e9ace8a991c49.js +0 -1
  386. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/raw-file/route-580e9ace8a991c49.js +0 -1
  387. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/rename/route-580e9ace8a991c49.js +0 -1
  388. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/reports/execute/route-580e9ace8a991c49.js +0 -1
  389. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/search-index/route-580e9ace8a991c49.js +0 -1
  390. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/suggest-files/route-580e9ace8a991c49.js +0 -1
  391. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/switch/route-580e9ace8a991c49.js +0 -1
  392. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/thumbnail/route-580e9ace8a991c49.js +0 -1
  393. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/tree/route-580e9ace8a991c49.js +0 -1
  394. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/upload/route-580e9ace8a991c49.js +0 -1
  395. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/virtual-file/route-580e9ace8a991c49.js +0 -1
  396. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/watch/route-580e9ace8a991c49.js +0 -1
  397. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/write-binary/route-580e9ace8a991c49.js +0 -1
  398. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/page-a1a7eac29d935a3e.js +0 -1
  399. package/apps/web/.next/standalone/apps/web/.next/static/chunks/webpack-43066e1a249665ba.js +0 -1
  400. package/apps/web/.next/standalone/apps/web/.next/static/css/4c7acc74b29f04e2.css +0 -1
  401. package/apps/web/.next/standalone/apps/web/.next/static/kXwi5ZTYAYlvvWmNAsdo_/_buildManifest.js +0 -1
  402. package/apps/web/.next/static/chunks/2597.f31531534ad0b96f.js +0 -1
  403. package/apps/web/.next/static/chunks/4652.ca2ab4e205060d84.js +0 -60
  404. package/apps/web/.next/static/chunks/6861-58d368bcf4e23b55.js +0 -76
  405. package/apps/web/.next/static/chunks/app/api/apps/cron/route-580e9ace8a991c49.js +0 -1
  406. package/apps/web/.next/static/chunks/app/api/apps/proxy/route-580e9ace8a991c49.js +0 -1
  407. package/apps/web/.next/static/chunks/app/api/apps/route-580e9ace8a991c49.js +0 -1
  408. package/apps/web/.next/static/chunks/app/api/apps/serve/[...path]/route-580e9ace8a991c49.js +0 -1
  409. package/apps/web/.next/static/chunks/app/api/apps/store/route-580e9ace8a991c49.js +0 -1
  410. package/apps/web/.next/static/chunks/app/api/apps/webhooks/[...path]/route-580e9ace8a991c49.js +0 -1
  411. package/apps/web/.next/static/chunks/app/api/chat/active/route-580e9ace8a991c49.js +0 -1
  412. package/apps/web/.next/static/chunks/app/api/chat/route-580e9ace8a991c49.js +0 -1
  413. package/apps/web/.next/static/chunks/app/api/chat/runs/route-580e9ace8a991c49.js +0 -1
  414. package/apps/web/.next/static/chunks/app/api/chat/stop/route-580e9ace8a991c49.js +0 -1
  415. package/apps/web/.next/static/chunks/app/api/chat/stream/route-580e9ace8a991c49.js +0 -1
  416. package/apps/web/.next/static/chunks/app/api/chat/subagents/route-580e9ace8a991c49.js +0 -1
  417. package/apps/web/.next/static/chunks/app/api/cron/jobs/[jobId]/runs/route-580e9ace8a991c49.js +0 -1
  418. package/apps/web/.next/static/chunks/app/api/cron/jobs/route-580e9ace8a991c49.js +0 -1
  419. package/apps/web/.next/static/chunks/app/api/cron/runs/[sessionId]/route-580e9ace8a991c49.js +0 -1
  420. package/apps/web/.next/static/chunks/app/api/cron/runs/search-transcript/route-580e9ace8a991c49.js +0 -1
  421. package/apps/web/.next/static/chunks/app/api/feedback/route-580e9ace8a991c49.js +0 -1
  422. package/apps/web/.next/static/chunks/app/api/gateway/channels/route-580e9ace8a991c49.js +0 -1
  423. package/apps/web/.next/static/chunks/app/api/gateway/chat/route-580e9ace8a991c49.js +0 -1
  424. package/apps/web/.next/static/chunks/app/api/gateway/chat/stream/route-580e9ace8a991c49.js +0 -1
  425. package/apps/web/.next/static/chunks/app/api/gateway/sessions/[id]/route-580e9ace8a991c49.js +0 -1
  426. package/apps/web/.next/static/chunks/app/api/gateway/sessions/route-580e9ace8a991c49.js +0 -1
  427. package/apps/web/.next/static/chunks/app/api/memories/route-580e9ace8a991c49.js +0 -1
  428. package/apps/web/.next/static/chunks/app/api/profiles/route-580e9ace8a991c49.js +0 -1
  429. package/apps/web/.next/static/chunks/app/api/profiles/switch/route-580e9ace8a991c49.js +0 -1
  430. package/apps/web/.next/static/chunks/app/api/sessions/[sessionId]/route-580e9ace8a991c49.js +0 -1
  431. package/apps/web/.next/static/chunks/app/api/sessions/route-580e9ace8a991c49.js +0 -1
  432. package/apps/web/.next/static/chunks/app/api/skills/route-580e9ace8a991c49.js +0 -1
  433. package/apps/web/.next/static/chunks/app/api/terminal/port/route-580e9ace8a991c49.js +0 -1
  434. package/apps/web/.next/static/chunks/app/api/web-sessions/[id]/messages/route-580e9ace8a991c49.js +0 -1
  435. package/apps/web/.next/static/chunks/app/api/web-sessions/[id]/route-580e9ace8a991c49.js +0 -1
  436. package/apps/web/.next/static/chunks/app/api/web-sessions/route-580e9ace8a991c49.js +0 -1
  437. package/apps/web/.next/static/chunks/app/api/workspace/assets/[...path]/route-580e9ace8a991c49.js +0 -1
  438. package/apps/web/.next/static/chunks/app/api/workspace/browse/route-580e9ace8a991c49.js +0 -1
  439. package/apps/web/.next/static/chunks/app/api/workspace/browse-file/route-580e9ace8a991c49.js +0 -1
  440. package/apps/web/.next/static/chunks/app/api/workspace/context/route-580e9ace8a991c49.js +0 -1
  441. package/apps/web/.next/static/chunks/app/api/workspace/copy/route-580e9ace8a991c49.js +0 -1
  442. package/apps/web/.next/static/chunks/app/api/workspace/db/introspect/route-580e9ace8a991c49.js +0 -1
  443. package/apps/web/.next/static/chunks/app/api/workspace/db/query/route-580e9ace8a991c49.js +0 -1
  444. package/apps/web/.next/static/chunks/app/api/workspace/delete/route-580e9ace8a991c49.js +0 -1
  445. package/apps/web/.next/static/chunks/app/api/workspace/execute/route-580e9ace8a991c49.js +0 -1
  446. package/apps/web/.next/static/chunks/app/api/workspace/file/route-580e9ace8a991c49.js +0 -1
  447. package/apps/web/.next/static/chunks/app/api/workspace/init/route-580e9ace8a991c49.js +0 -1
  448. package/apps/web/.next/static/chunks/app/api/workspace/list/route-580e9ace8a991c49.js +0 -1
  449. package/apps/web/.next/static/chunks/app/api/workspace/mkdir/route-580e9ace8a991c49.js +0 -1
  450. package/apps/web/.next/static/chunks/app/api/workspace/move/route-580e9ace8a991c49.js +0 -1
  451. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/display-field/route-580e9ace8a991c49.js +0 -1
  452. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/route-580e9ace8a991c49.js +0 -1
  453. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/bulk-delete/route-580e9ace8a991c49.js +0 -1
  454. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/options/route-580e9ace8a991c49.js +0 -1
  455. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/route-580e9ace8a991c49.js +0 -1
  456. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route-580e9ace8a991c49.js +0 -1
  457. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/route-580e9ace8a991c49.js +0 -1
  458. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/reorder/route-580e9ace8a991c49.js +0 -1
  459. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/route-580e9ace8a991c49.js +0 -1
  460. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/views/route-580e9ace8a991c49.js +0 -1
  461. package/apps/web/.next/static/chunks/app/api/workspace/open-file/route-580e9ace8a991c49.js +0 -1
  462. package/apps/web/.next/static/chunks/app/api/workspace/path-info/route-580e9ace8a991c49.js +0 -1
  463. package/apps/web/.next/static/chunks/app/api/workspace/query/route-580e9ace8a991c49.js +0 -1
  464. package/apps/web/.next/static/chunks/app/api/workspace/raw-file/route-580e9ace8a991c49.js +0 -1
  465. package/apps/web/.next/static/chunks/app/api/workspace/rename/route-580e9ace8a991c49.js +0 -1
  466. package/apps/web/.next/static/chunks/app/api/workspace/reports/execute/route-580e9ace8a991c49.js +0 -1
  467. package/apps/web/.next/static/chunks/app/api/workspace/search-index/route-580e9ace8a991c49.js +0 -1
  468. package/apps/web/.next/static/chunks/app/api/workspace/suggest-files/route-580e9ace8a991c49.js +0 -1
  469. package/apps/web/.next/static/chunks/app/api/workspace/switch/route-580e9ace8a991c49.js +0 -1
  470. package/apps/web/.next/static/chunks/app/api/workspace/thumbnail/route-580e9ace8a991c49.js +0 -1
  471. package/apps/web/.next/static/chunks/app/api/workspace/tree/route-580e9ace8a991c49.js +0 -1
  472. package/apps/web/.next/static/chunks/app/api/workspace/upload/route-580e9ace8a991c49.js +0 -1
  473. package/apps/web/.next/static/chunks/app/api/workspace/virtual-file/route-580e9ace8a991c49.js +0 -1
  474. package/apps/web/.next/static/chunks/app/api/workspace/watch/route-580e9ace8a991c49.js +0 -1
  475. package/apps/web/.next/static/chunks/app/api/workspace/write-binary/route-580e9ace8a991c49.js +0 -1
  476. package/apps/web/.next/static/chunks/app/page-a1a7eac29d935a3e.js +0 -1
  477. package/apps/web/.next/static/chunks/webpack-43066e1a249665ba.js +0 -1
  478. package/apps/web/.next/static/css/4c7acc74b29f04e2.css +0 -1
  479. package/apps/web/.next/static/kXwi5ZTYAYlvvWmNAsdo_/_buildManifest.js +0 -1
  480. /package/apps/web/.next/standalone/apps/web/.next/static/{kXwi5ZTYAYlvvWmNAsdo_ → xzgogMMcs02a6BQa5tMBA}/_ssgManifest.js +0 -0
  481. /package/apps/web/.next/static/{kXwi5ZTYAYlvvWmNAsdo_ → xzgogMMcs02a6BQa5tMBA}/_ssgManifest.js +0 -0
@@ -13,6 +13,20 @@ All actions should look into / edit and work on `{{WORKSPACE_PATH}}/**` by defau
13
13
 
14
14
  All your workspace chats and past conversations are stored in `{{WORKSPACE_PATH}}/.openclaw/web-chat/`.
15
15
 
16
+ ---
17
+
18
+ ## Table of Contents
19
+
20
+ 1. [Workspace Structure](#workspace-structure)
21
+ 2. [Startup](#startup)
22
+ 3. [workspace_context.yaml (READ-ONLY)](#workspace_contextyaml-read-only)
23
+ 4. [Naming Conventions](#naming-conventions)
24
+ 5. [Error Handling](#error-handling)
25
+ 6. [Critical Reminders](#critical-reminders)
26
+ 7. [Child Skills](#child-skills)
27
+
28
+ ---
29
+
16
30
  ## Workspace Structure
17
31
 
18
32
  ```
@@ -32,266 +46,13 @@ All your workspace chats and past conversations are stored in `{{WORKSPACE_PATH}
32
46
  WORKSPACE.md # Auto-generated schema summary
33
47
  ```
34
48
 
35
- ## .object.yaml Format
36
-
37
- Every object directory MUST contain a `.object.yaml` file. This is a lightweight metadata projection that the sidebar reads. Generate it from DuckDB after creating or modifying any object.
38
-
39
- Template:
40
-
41
- ```yaml
42
- id: "<object_id from DuckDB>"
43
- name: "<object_name>"
44
- description: "<object_description>"
45
- icon: "<lucide_icon_name>"
46
- default_view: "<table|kanban|calendar|timeline|gallery|list>"
47
- entry_count: <number>
48
- fields:
49
- - name: "Full Name"
50
- type: text
51
- required: true
52
- - name: "Email Address"
53
- type: email
54
- required: true
55
- - name: "Status"
56
- type: enum
57
- values: ["New", "Contacted", "Qualified", "Converted"]
58
- - name: "Assigned To"
59
- type: user
60
- ```
61
-
62
- ### View Type Settings
63
-
64
- `.object.yaml` supports a `view_settings` block for configuring how each view type renders. These settings serve as defaults; individual saved views can override them.
65
-
66
- ```yaml
67
- view_settings:
68
- kanbanField: "Status" # enum field to group kanban columns by
69
- calendarDateField: "Due Date" # date field for calendar events
70
- calendarEndDateField: "End Date" # optional: end date for multi-day events
71
- calendarMode: "month" # day | week | month | year
72
- timelineStartField: "Start Date" # date field for timeline bar start
73
- timelineEndField: "End Date" # date field for timeline bar end
74
- timelineGroupField: "Status" # optional: enum field to group timeline rows
75
- timelineZoom: "week" # day | week | month | quarter
76
- galleryTitleField: "Name" # text field for gallery card title
77
- galleryCoverField: "Image" # optional: field for gallery card cover
78
- listTitleField: "Name" # text field for list row title
79
- listSubtitleField: "Description" # optional: text field for list row subtitle
80
- ```
81
-
82
- If an object has no custom date field, you MUST fall back to system timestamps:
83
-
84
- - `created_at` (always available on entries)
85
- - `updated_at` (always available on entries)
86
-
87
- These can be used in `calendarDateField`, `timelineStartField`, `timelineEndField`, filters, sorts, and date-based user requests.
88
-
89
- **View types:**
90
-
91
- | View Type | Best for | Required settings |
92
- | ---------- | ------------------------------- | --------------------------- |
93
- | `table` | Spreadsheet-like data editing | None (default) |
94
- | `kanban` | Status-based boards | `kanbanField` (enum) |
95
- | `calendar` | Date-based entries | `calendarDateField` (date) |
96
- | `timeline` | Gantt charts / project planning | `timelineStartField` (date) |
97
- | `gallery` | Visual card grid | None (auto-detects title) |
98
- | `list` | Simple compact list | None (auto-detects title) |
99
-
100
- When creating objects with specific use cases, set `default_view` and `view_settings` appropriately:
101
-
102
- - Task boards: `default_view: "kanban"` + `view_settings.kanbanField: "Status"`
103
- - Event calendars: `default_view: "calendar"` + `view_settings.calendarDateField: "Date"`
104
- - Project timelines: `default_view: "timeline"` + `view_settings.timelineStartField: "Start Date"` + `view_settings.timelineEndField: "End Date"`
105
-
106
- ### Saved Views and Filters
107
-
108
- `.object.yaml` supports a `views` section for saved filter views. These views appear in the UI filter bar and can be created or modified by the agent to immediately change what the user sees (the UI live-reloads via the file watcher).
109
-
110
- **Filter operators by field type:**
111
-
112
- | Field Type | Operators |
113
- | ------------------- | ------------------------------------------------------------------------------------------ |
114
- | text/richtext/email | contains, not_contains, equals, not_equals, starts_with, ends_with, is_empty, is_not_empty |
115
- | number | eq, neq, gt, gte, lt, lte, between, is_empty, is_not_empty |
116
- | date | on, before, after, date_between, relative_past, relative_next, is_empty, is_not_empty |
117
- | enum | is, is_not, is_any_of, is_none_of, is_empty, is_not_empty |
118
- | boolean | is_true, is_false, is_empty, is_not_empty |
119
- | relation/user | has_any, has_none, has_all, is_empty, is_not_empty |
120
- | tags | contains, not_contains, is_empty, is_not_empty |
121
-
122
- **System timestamp columns are always available on every object entry**:
123
-
124
- - `created_at` (date/time)
125
- - `updated_at` (date/time)
126
-
127
- Treat them as date fields for filtering, sorting, calendar, and timeline operations even when `fields` has no `date` type columns.
128
-
129
- **Views template (append to .object.yaml):**
130
-
131
- ```yaml
132
- views:
133
- - name: "Active deals"
134
- view_type: "table"
135
- filters:
136
- id: root
137
- conjunction: and
138
- rules:
139
- - id: f1
140
- field: status
141
- operator: is_any_of
142
- value:
143
- - "Negotiating"
144
- - "Proposal sent"
145
- - id: f2
146
- field: amount
147
- operator: gte
148
- value: 10000
149
- sort:
150
- - field: updated_at
151
- direction: desc
152
- columns:
153
- - name
154
- - status
155
- - amount
156
- - assignee
157
-
158
- - name: "Board"
159
- view_type: "kanban"
160
- settings:
161
- kanbanField: "Status"
162
-
163
- - name: "Calendar"
164
- view_type: "calendar"
165
- settings:
166
- calendarDateField: "Due Date"
167
- calendarMode: "month"
168
-
169
- - name: "Timeline"
170
- view_type: "timeline"
171
- settings:
172
- timelineStartField: "Start Date"
173
- timelineEndField: "End Date"
174
- timelineGroupField: "Status"
175
- timelineZoom: "week"
176
-
177
- - name: "Overdue"
178
- view_type: "table"
179
- filters:
180
- id: root
181
- conjunction: and
182
- rules:
183
- - id: f1
184
- field: due_date
185
- operator: before
186
- value: today
187
- - id: f2
188
- field: status
189
- operator: is_not
190
- value: Done
191
-
192
- active_view: "Active deals"
193
- ```
194
-
195
- Each saved view can specify:
196
-
197
- - `view_type`: `table` | `kanban` | `calendar` | `timeline` | `gallery` | `list` (defaults to object's `default_view`)
198
- - `settings`: per-view-type configuration (overrides object-level `view_settings`)
199
- - `filters`: standard filter rules
200
- - `sort`: sort rules
201
- - `columns`: visible column names (for table view)
202
-
203
- When a user asks for date-based operations (e.g. move from one date to another) and no custom date fields exist, default to `created_at` unless the user explicitly asks for `updated_at`.
204
-
205
- **Date format**: All date filter values MUST use ISO 8601 `YYYY-MM-DD` strings (e.g. `"2026-03-01"`). The special value `today` is also supported for `on`, `before`, and `after` operators.
206
-
207
- **Date range filter** (`date_between`):
208
-
209
- ```yaml
210
- - id: f1
211
- field: Due Date
212
- operator: date_between
213
- value:
214
- - "2026-03-01"
215
- - "2026-03-31"
216
- ```
217
-
218
- **Relative date filters** (e.g. "in the last 7 days"):
219
-
220
- ```yaml
221
- - id: f1
222
- field: created_at
223
- operator: relative_past
224
- relativeAmount: 7
225
- relativeUnit: days
226
- ```
227
-
228
- **OR groups** (match any rule):
229
-
230
- ```yaml
231
- filters:
232
- id: root
233
- conjunction: or
234
- rules:
235
- - id: f1
236
- field: status
237
- operator: is
238
- value: "Active"
239
- - id: f2
240
- field: priority
241
- operator: is
242
- value: "High"
243
- ```
244
-
245
- **When the user asks to filter/show/hide entries by natural language**, write the `.object.yaml` with the appropriate views and set `active_view`. The web UI will pick up the change instantly via SSE file watcher. Every rule needs a unique `id` (short alphanumeric string). The root filter group also needs `id: root`.
246
-
247
- Generate by querying DuckDB then writing the file:
248
-
249
- ```bash
250
- # 1. Query object + fields from DuckDB
251
- duckdb {{WORKSPACE_PATH}}/workspace.duckdb -json "
252
- SELECT o.id, o.name, o.description, o.icon, o.default_view,
253
- (SELECT COUNT(*) FROM entries WHERE object_id = o.id) as entry_count
254
- FROM objects o WHERE o.name = 'lead'
255
- "
256
- duckdb {{WORKSPACE_PATH}}/workspace.duckdb -json "
257
- SELECT name, type, required, enum_values FROM fields
258
- WHERE object_id = (SELECT id FROM objects WHERE name = 'lead')
259
- ORDER BY sort_order
260
- "
261
-
262
- # 2. Write .object.yaml from the query results
263
- mkdir -p {{WORKSPACE_PATH}}/lead
264
- cat > {{WORKSPACE_PATH}}/lead/.object.yaml << 'YAML'
265
- id: "AbCdEfGh..."
266
- name: "lead"
267
- description: "Sales leads tracking"
268
- icon: "user-plus"
269
- default_view: "table"
270
- entry_count: 20
271
- fields:
272
- - name: "Full Name"
273
- type: text
274
- required: true
275
- - name: "Email Address"
276
- type: email
277
- required: true
278
- - name: "Status"
279
- type: enum
280
- values: ["New", "Contacted", "Qualified", "Converted"]
281
- - name: "Score"
282
- type: number
283
- - name: "Notes"
284
- type: richtext
285
- YAML
286
- ```
287
-
288
49
  ## Startup
289
50
 
290
51
  On every conversation:
291
52
 
292
53
  1. Read `{{WORKSPACE_PATH}}/workspace_context.yaml` for org context, members, integrations, protected objects. **NEVER modify this file.**
293
54
  2. Install duckdb if it doesn't exist: `curl https://install.duckdb.org | sh`
294
- 3. If `{{WORKSPACE_PATH}}/workspace.duckdb` does not exist, initialize it with the schema below.
55
+ 3. If `{{WORKSPACE_PATH}}/workspace.duckdb` does not exist, initialize it with the schema in the **duckdb-operations** child skill.
295
56
 
296
57
  ## workspace_context.yaml (READ-ONLY)
297
58
 
@@ -305,478 +66,6 @@ This file is generated by the CRM system and synced via S3. It contains:
305
66
  - `defaults`: Default view, date format, naming conventions.
306
67
  - `credits`: Current credit balance for enrichment/AI operations.
307
68
 
308
- ## DuckDB Schema
309
-
310
- Initialize via `exec` with `duckdb {{WORKSPACE_PATH}}/workspace.duckdb`:
311
-
312
- ```sql
313
- -- Nanoid 32 macro: generates IDs matching the CRM's Supabase nanoid format
314
- CREATE OR REPLACE MACRO nanoid32() AS (
315
- SELECT string_agg(
316
- substr('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-',
317
- (floor(random() * 64) + 1)::int, 1), '')
318
- FROM generate_series(1, 32)
319
- );
320
-
321
- CREATE TABLE IF NOT EXISTS objects (
322
- id VARCHAR PRIMARY KEY DEFAULT (nanoid32()),
323
- name VARCHAR NOT NULL,
324
- description VARCHAR,
325
- icon VARCHAR,
326
- default_view VARCHAR DEFAULT 'table',
327
- parent_document_id VARCHAR,
328
- sort_order INTEGER DEFAULT 0,
329
- source_app VARCHAR,
330
- immutable BOOLEAN DEFAULT false,
331
- created_at TIMESTAMPTZ DEFAULT now(),
332
- updated_at TIMESTAMPTZ DEFAULT now(),
333
- UNIQUE(name)
334
- );
335
-
336
- CREATE TABLE IF NOT EXISTS fields (
337
- id VARCHAR PRIMARY KEY DEFAULT (nanoid32()),
338
- object_id VARCHAR NOT NULL REFERENCES objects(id) ON DELETE CASCADE,
339
- name VARCHAR NOT NULL,
340
- description VARCHAR,
341
- type VARCHAR NOT NULL,
342
- required BOOLEAN DEFAULT false,
343
- default_value VARCHAR,
344
- related_object_id VARCHAR REFERENCES objects(id) ON DELETE SET NULL,
345
- relationship_type VARCHAR,
346
- enum_values JSON,
347
- enum_colors JSON,
348
- enum_multiple BOOLEAN DEFAULT false,
349
- sort_order INTEGER DEFAULT 0,
350
- created_at TIMESTAMPTZ DEFAULT now(),
351
- updated_at TIMESTAMPTZ DEFAULT now(),
352
- UNIQUE(object_id, name)
353
- );
354
-
355
- CREATE TABLE IF NOT EXISTS entries (
356
- id VARCHAR PRIMARY KEY DEFAULT (nanoid32()),
357
- object_id VARCHAR NOT NULL REFERENCES objects(id) ON DELETE CASCADE,
358
- sort_order INTEGER DEFAULT 0,
359
- created_at TIMESTAMPTZ DEFAULT now(),
360
- updated_at TIMESTAMPTZ DEFAULT now()
361
- );
362
-
363
- CREATE TABLE IF NOT EXISTS entry_fields (
364
- id VARCHAR PRIMARY KEY DEFAULT (nanoid32()),
365
- entry_id VARCHAR NOT NULL REFERENCES entries(id) ON DELETE CASCADE,
366
- field_id VARCHAR NOT NULL REFERENCES fields(id) ON DELETE CASCADE,
367
- value VARCHAR,
368
- created_at TIMESTAMPTZ DEFAULT now(),
369
- updated_at TIMESTAMPTZ DEFAULT now(),
370
- UNIQUE(entry_id, field_id)
371
- );
372
-
373
- CREATE TABLE IF NOT EXISTS statuses (
374
- id VARCHAR PRIMARY KEY DEFAULT (nanoid32()),
375
- object_id VARCHAR NOT NULL REFERENCES objects(id) ON DELETE CASCADE,
376
- name VARCHAR NOT NULL,
377
- color VARCHAR DEFAULT '#94a3b8',
378
- sort_order INTEGER DEFAULT 0,
379
- is_default BOOLEAN DEFAULT false,
380
- created_at TIMESTAMPTZ DEFAULT now(),
381
- updated_at TIMESTAMPTZ DEFAULT now(),
382
- UNIQUE(object_id, name)
383
- );
384
-
385
- CREATE TABLE IF NOT EXISTS documents (
386
- id VARCHAR PRIMARY KEY DEFAULT (nanoid32()),
387
- title VARCHAR DEFAULT 'Untitled',
388
- icon VARCHAR,
389
- cover_image VARCHAR,
390
- file_path VARCHAR NOT NULL UNIQUE,
391
- parent_id VARCHAR REFERENCES documents(id) ON DELETE CASCADE,
392
- parent_object_id VARCHAR REFERENCES objects(id) ON DELETE CASCADE,
393
- sort_order INTEGER DEFAULT 0,
394
- is_published BOOLEAN DEFAULT false,
395
- created_at TIMESTAMPTZ DEFAULT now(),
396
- updated_at TIMESTAMPTZ DEFAULT now()
397
- );
398
-
399
- INSTALL fts; LOAD fts;
400
- ```
401
-
402
- ### ALL ID fields must be a nanoid ID.
403
-
404
- ## Auto-Generated Views
405
-
406
- After every object or field mutation, regenerate the PIVOT view for each affected object. Views are stored queries (zero data duplication) that make the EAV pattern invisible:
407
-
408
- ```sql
409
- -- Example: auto-generated view for "leads" object
410
- CREATE OR REPLACE VIEW v_leads AS
411
- PIVOT (
412
- SELECT e.id as entry_id, e.created_at, e.updated_at,
413
- f.name as field_name, ef.value
414
- FROM entries e
415
- JOIN entry_fields ef ON ef.entry_id = e.id
416
- JOIN fields f ON f.id = ef.field_id
417
- WHERE e.object_id = (SELECT id FROM objects WHERE name = 'leads')
418
- ) ON field_name USING first(value);
419
- ```
420
-
421
- Naming convention: `v_{object_name}` (e.g., `v_leads`, `v_companies`, `v_people`).
422
-
423
- Now query like a normal table:
424
-
425
- ```sql
426
- SELECT * FROM v_leads WHERE "Status" = 'New' ORDER BY created_at DESC LIMIT 50;
427
- SELECT "Status", COUNT(*) FROM v_leads GROUP BY "Status";
428
- SELECT * FROM v_leads WHERE "Email Address" LIKE '%@gmail.com';
429
- ```
430
-
431
- ## SQL Operations Reference
432
-
433
- All operations use `exec` with `duckdb {{WORKSPACE_PATH}}/workspace.duckdb`. Batch related SQL in a single exec call with transactions.
434
-
435
- ### Create Object
436
-
437
- ```sql
438
- INSERT INTO objects (name, description, icon, default_view)
439
- VALUES ('lead', 'Sales leads tracking', 'user-plus', 'table')
440
- ON CONFLICT (name) DO NOTHING RETURNING *;
441
- ```
442
-
443
- ### Create Fields
444
-
445
- ```sql
446
- INSERT INTO fields (object_id, name, type, required, sort_order)
447
- VALUES
448
- ((SELECT id FROM objects WHERE name = 'lead'), 'Full Name', 'text', true, 0),
449
- ((SELECT id FROM objects WHERE name = 'lead'), 'Email Address', 'email', true, 1),
450
- ((SELECT id FROM objects WHERE name = 'lead'), 'Phone Number', 'phone', false, 2)
451
- ON CONFLICT (object_id, name) DO NOTHING;
452
- ```
453
-
454
- ### Create Enum Field
455
-
456
- ```sql
457
- INSERT INTO fields (object_id, name, type, enum_values, enum_colors, sort_order)
458
- VALUES (
459
- (SELECT id FROM objects WHERE name = 'lead'), 'Status', 'enum',
460
- '["New","Contacted","Qualified","Converted"]'::JSON,
461
- '["#94a3b8","#3b82f6","#f59e0b","#22c55e"]'::JSON, 3
462
- ) ON CONFLICT (object_id, name) DO NOTHING;
463
- ```
464
-
465
- ### Create Entry with Field Values
466
-
467
- ```sql
468
- BEGIN TRANSACTION;
469
- INSERT INTO entries (object_id) VALUES ((SELECT id FROM objects WHERE name = 'lead')) RETURNING id;
470
- -- Use the returned entry id:
471
- INSERT INTO entry_fields (entry_id, field_id, value) VALUES
472
- ('<entry_id>', (SELECT id FROM fields WHERE object_id = (SELECT id FROM objects WHERE name = 'lead') AND name = 'Full Name'), 'Jane Smith'),
473
- ('<entry_id>', (SELECT id FROM fields WHERE object_id = (SELECT id FROM objects WHERE name = 'lead') AND name = 'Email Address'), 'jane@example.com'),
474
- ('<entry_id>', (SELECT id FROM fields WHERE object_id = (SELECT id FROM objects WHERE name = 'lead') AND name = 'Status'), 'New');
475
- COMMIT;
476
- ```
477
-
478
- ### Search Entries (via view)
479
-
480
- ```sql
481
- -- Simple search
482
- SELECT * FROM v_leads WHERE "Full Name" ILIKE '%john%';
483
-
484
- -- Filter by field
485
- SELECT * FROM v_leads WHERE "Status" = 'New' ORDER BY created_at DESC;
486
-
487
- -- Aggregation
488
- SELECT "Status", COUNT(*) as count FROM v_leads GROUP BY "Status";
489
-
490
- -- Pagination
491
- SELECT * FROM v_leads ORDER BY created_at DESC LIMIT 20 OFFSET 0;
492
- ```
493
-
494
- ### Update Entry
495
-
496
- ```sql
497
- INSERT INTO entry_fields (entry_id, field_id, value)
498
- VALUES ('<entry_id>', (SELECT id FROM fields WHERE object_id = '<obj_id>' AND name = 'Status'), 'Qualified')
499
- ON CONFLICT (entry_id, field_id) DO UPDATE SET value = excluded.value, updated_at = now();
500
- ```
501
-
502
- ### Delete (with cascade)
503
-
504
- ```sql
505
- -- Delete entry (cascades to entry_fields)
506
- DELETE FROM entries WHERE id = '<entry_id>';
507
-
508
- -- Delete field (cascades to entry_fields)
509
- DELETE FROM fields WHERE id = '<field_id>';
510
-
511
- -- Delete object (cascades to fields, entries, entry_fields) — check immutable first!
512
- DELETE FROM objects WHERE id = '<obj_id>' AND immutable = false;
513
- ```
514
-
515
- ### Bulk Import from CSV
516
-
517
- ```sql
518
- COPY entries FROM '{{WORKSPACE_PATH}}/exports/import.csv' (AUTO_DETECT true);
519
- ```
520
-
521
- ### Export to CSV
522
-
523
- ```sql
524
- COPY (SELECT * FROM v_leads) TO '{{WORKSPACE_PATH}}/exports/leads.csv' (HEADER true);
525
- ```
526
-
527
- ## Full Workflow: Create CRM Structure in One Shot
528
-
529
- EVERY object creation MUST complete ALL THREE steps below. Never stop after the SQL.
530
-
531
- **Step 1 — SQL: Create object + fields + view** (single exec call):
532
-
533
- ```sql
534
- BEGIN TRANSACTION;
535
-
536
- -- 1a. Create object
537
- INSERT INTO objects (name, description, icon, default_view)
538
- VALUES ('lead', 'Sales leads tracking', 'user-plus', 'table')
539
- ON CONFLICT (name) DO NOTHING;
540
-
541
- -- 1b. Create all fields
542
- INSERT INTO fields (object_id, name, type, required, sort_order) VALUES
543
- ((SELECT id FROM objects WHERE name = 'lead'), 'Full Name', 'text', true, 0),
544
- ((SELECT id FROM objects WHERE name = 'lead'), 'Email Address', 'email', true, 1),
545
- ((SELECT id FROM objects WHERE name = 'lead'), 'Phone Number', 'phone', false, 2),
546
- ((SELECT id FROM objects WHERE name = 'lead'), 'Score', 'number', false, 4),
547
- ((SELECT id FROM objects WHERE name = 'lead'), 'Notes', 'richtext', false, 6)
548
- ON CONFLICT (object_id, name) DO NOTHING;
549
-
550
- INSERT INTO fields (object_id, name, type, enum_values, enum_colors, sort_order) VALUES
551
- ((SELECT id FROM objects WHERE name = 'lead'), 'Status', 'enum',
552
- '["New","Contacted","Qualified","Converted"]'::JSON,
553
- '["#94a3b8","#3b82f6","#f59e0b","#22c55e"]'::JSON, 3),
554
- ((SELECT id FROM objects WHERE name = 'lead'), 'Source', 'enum',
555
- '["Website","Referral","Cold Call","Social"]'::JSON, NULL, 5)
556
- ON CONFLICT (object_id, name) DO NOTHING;
557
-
558
- -- 1c. MANDATORY: auto-generate PIVOT view
559
- CREATE OR REPLACE VIEW v_lead AS
560
- PIVOT (
561
- SELECT e.id as entry_id, e.created_at, e.updated_at,
562
- f.name as field_name, ef.value
563
- FROM entries e
564
- JOIN entry_fields ef ON ef.entry_id = e.id
565
- JOIN fields f ON f.id = ef.field_id
566
- WHERE e.object_id = (SELECT id FROM objects WHERE name = 'lead')
567
- ) ON field_name USING first(value);
568
-
569
- COMMIT;
570
- ```
571
-
572
- **Step 2 — Filesystem: Create object directory + .object.yaml** (exec call):
573
-
574
- ```bash
575
- mkdir -p {{WORKSPACE_PATH}}/lead
576
-
577
- # Query the object metadata from DuckDB to build .object.yaml
578
- OBJ_ID=$(duckdb {{WORKSPACE_PATH}}/workspace.duckdb -noheader -list "SELECT id FROM objects WHERE name = 'lead'")
579
- ENTRY_COUNT=$(duckdb {{WORKSPACE_PATH}}/workspace.duckdb -noheader -list "SELECT COUNT(*) FROM entries WHERE object_id = '$OBJ_ID'")
580
-
581
- cat > {{WORKSPACE_PATH}}/lead/.object.yaml << 'YAML'
582
- id: "<use actual $OBJ_ID>"
583
- name: "lead"
584
- description: "Sales leads tracking"
585
- icon: "user-plus"
586
- default_view: "table"
587
- entry_count: <use actual $ENTRY_COUNT>
588
- fields:
589
- - name: "Full Name"
590
- type: text
591
- required: true
592
- - name: "Email Address"
593
- type: email
594
- required: true
595
- - name: "Phone Number"
596
- type: phone
597
- - name: "Status"
598
- type: enum
599
- values: ["New", "Contacted", "Qualified", "Converted"]
600
- - name: "Score"
601
- type: number
602
- - name: "Source"
603
- type: enum
604
- values: ["Website", "Referral", "Cold Call", "Social"]
605
- - name: "Notes"
606
- type: richtext
607
- YAML
608
- ```
609
-
610
- **Step 3 — Verify**: Confirm both the view and filesystem exist:
611
-
612
- ```bash
613
- # Verify view works
614
- duckdb {{WORKSPACE_PATH}}/workspace.duckdb "SELECT COUNT(*) FROM v_lead"
615
- # Verify .object.yaml exists
616
- cat {{WORKSPACE_PATH}}/lead/.object.yaml
617
- ```
618
-
619
- ## Kanban Boards
620
-
621
- When creating task/board objects, use `default_view = 'kanban'` and auto-create Status + Assigned To fields. Set `view_settings.kanbanField` to the enum field that defines columns. Remember: ALL THREE STEPS are required.
622
-
623
- **Step 1 — SQL:**
624
-
625
- ```sql
626
- BEGIN TRANSACTION;
627
- INSERT INTO objects (name, description, icon, default_view)
628
- VALUES ('task', 'Task tracking board', 'check-square', 'kanban')
629
- ON CONFLICT (name) DO NOTHING;
630
-
631
- -- Auto-create Status field with kanban-appropriate values
632
- INSERT INTO fields (object_id, name, type, enum_values, enum_colors, sort_order)
633
- VALUES ((SELECT id FROM objects WHERE name = 'task'), 'Status', 'enum',
634
- '["In Queue","In Progress","Done"]'::JSON,
635
- '["#94a3b8","#3b82f6","#22c55e"]'::JSON, 0)
636
- ON CONFLICT (object_id, name) DO NOTHING;
637
-
638
- -- Auto-create Assigned To field (user type)
639
- INSERT INTO fields (object_id, name, type, sort_order)
640
- VALUES ((SELECT id FROM objects WHERE name = 'task'), 'Assigned To', 'user', 1)
641
- ON CONFLICT (object_id, name) DO NOTHING;
642
-
643
- -- Auto-create default statuses
644
- INSERT INTO statuses (object_id, name, color, sort_order, is_default) VALUES
645
- ((SELECT id FROM objects WHERE name = 'task'), 'In Queue', '#94a3b8', 0, true),
646
- ((SELECT id FROM objects WHERE name = 'task'), 'In Progress', '#3b82f6', 1, false),
647
- ((SELECT id FROM objects WHERE name = 'task'), 'Done', '#22c55e', 2, false)
648
- ON CONFLICT (object_id, name) DO NOTHING;
649
-
650
- CREATE OR REPLACE VIEW v_task AS
651
- PIVOT (
652
- SELECT e.id as entry_id, e.created_at, e.updated_at,
653
- f.name as field_name, ef.value
654
- FROM entries e
655
- JOIN entry_fields ef ON ef.entry_id = e.id
656
- JOIN fields f ON f.id = ef.field_id
657
- WHERE e.object_id = (SELECT id FROM objects WHERE name = 'task')
658
- ) ON field_name USING first(value);
659
-
660
- COMMIT;
661
- ```
662
-
663
- **Step 2 — Filesystem (MANDATORY):**
664
-
665
- ```bash
666
- mkdir -p {{WORKSPACE_PATH}}/task
667
- cat > {{WORKSPACE_PATH}}/task/.object.yaml << 'YAML'
668
- id: "<query from DuckDB>"
669
- name: "task"
670
- description: "Task tracking board"
671
- icon: "check-square"
672
- default_view: "kanban"
673
- entry_count: 0
674
- view_settings:
675
- kanbanField: "Status"
676
- fields:
677
- - name: "Status"
678
- type: enum
679
- values: ["In Queue", "In Progress", "Done"]
680
- - name: "Assigned To"
681
- type: user
682
- YAML
683
- ```
684
-
685
- **Step 3 — Verify:** `duckdb {{WORKSPACE_PATH}}/workspace.duckdb "SELECT COUNT(*) FROM v_task"` and `cat {{WORKSPACE_PATH}}/task/.object.yaml`.
686
-
687
- ## Field Types Reference
688
-
689
- | Type | Description | Storage | Query Cast |
690
- | -------- | ------------------------------------- | ------------------------- | ----------- |
691
- | text | General text, names, descriptions | VARCHAR | none |
692
- | email | Email addresses (validated) | VARCHAR | none |
693
- | phone | Phone numbers (normalized) | VARCHAR | none |
694
- | number | Numeric values (prices, scores) | VARCHAR | `::NUMERIC` |
695
- | boolean | Yes/no flags | "true"/"false" | `= 'true'` |
696
- | date | ISO 8601 dates | VARCHAR | `::DATE` |
697
- | richtext | Rich text for Notes fields | VARCHAR | none |
698
- | user | Member ID from workspace_context.yaml | VARCHAR | none |
699
- | enum | Dropdown with predefined values | VARCHAR | none |
700
- | relation | Link to entry in another object | VARCHAR (entry ID) | none |
701
- | tags | Free-form string array (labels, tags) | VARCHAR (JSON array str) | none |
702
-
703
- ### System Timestamp Columns (Always Present)
704
-
705
- Every entry row always has:
706
-
707
- - `created_at` (TIMESTAMPTZ in `entries`)
708
- - `updated_at` (TIMESTAMPTZ in `entries`)
709
-
710
- Important:
711
-
712
- - These are system columns, so they are NOT listed in the `fields` table.
713
- - If `SELECT * FROM fields` shows no date fields, you still have `created_at` and `updated_at`.
714
- - Use these as date fallbacks for calendar/timeline views and date-based natural language requests.
715
-
716
- **user fields**: Resolve member name to ID from `workspace_context.yaml` `members` list BEFORE inserting. User fields store IDs like `usr_abc123`, NOT names.
717
-
718
- **enum fields**: Field definition stores `enum_values` as JSON array. Entry stores the selected value string. `enum_multiple = true` for multi-select (value stored as JSON array string).
719
-
720
- **relation fields**: Field stores `related_object_id` and `relationship_type`. Entry stores the related entry ID. `many_to_one` for single select, `many_to_many` for multi-select (JSON array of IDs).
721
-
722
- **tags fields**: Free-form string arrays for labels, domains, skills, keywords, etc. Value stored as JSON array string: `'["tag1","tag2","tag3"]'`. No predefined values — users can type any value. Displayed as removable chips in the UI.
723
-
724
- ## CRM Patterns
725
-
726
- ### Contact/Customer
727
-
728
- - Full Name (text, required), Email Address (email, required), Phone Number (phone), Company (relation to company object), Notes (richtext)
729
- - Universal pattern for clients, customers, patients, members
730
-
731
- ### Lead/Prospect
732
-
733
- - Full Name (text, required), Email Address (email, required), Phone Number (phone), Status (enum: New/Contacted/Qualified/Converted), Source (enum: Website/Referral/Cold Call/Social), Score (number), Assigned To (user), Notes (richtext)
734
- - Sales, legal intake, real estate prospects
735
-
736
- ### Company/Organization
737
-
738
- - Company Name (text, required), Industry (enum), Website (text), Type (enum: Client/Partner/Vendor), Relationship Status (enum), Notes (richtext)
739
- - B2B relationships, vendor management
740
-
741
- ### Deal/Opportunity
742
-
743
- - Deal Name (text, required), Amount (number), Stage (enum: Discovery/Proposal/Negotiation/Closed Won/Closed Lost), Close Date (date), Probability (number), Primary Contact (relation), Assigned To (user), Notes (richtext)
744
- - Sales pipeline, project bids
745
-
746
- ### Case/Project
747
-
748
- - Case Number (text, required), Title (text, required), Client (relation), Status (enum: Open/In Progress/Closed), Priority (enum: Low/Medium/High/Urgent), Due Date (date), Assigned To (user), Notes (richtext)
749
- - Legal cases, client projects
750
-
751
- ### Property/Asset
752
-
753
- - Address (text, required), Property Type (enum), Price (number), Status (enum: Available/Under Contract/Sold), Square Footage (number), Bedrooms (number), Notes (richtext)
754
- - Real estate listings, asset management
755
-
756
- ### Task/Activity (use kanban)
757
-
758
- - Title (text, required), Description (text), Assigned To (user), Due Date (date), Status (enum: In Queue/In Progress/Done), Priority (enum: Low/Medium/High), Notes (richtext)
759
- - Use `default_view = 'kanban'` — auto-creates Status and Assigned To fields
760
-
761
- ## Document Management
762
-
763
- Documents are markdown files in `{{WORKSPACE_PATH}}/**`. The DuckDB `documents` table tracks metadata only; the `.md` file IS the content.
764
-
765
- ### Create Document
766
-
767
- 1. Write the `.md` file: `write {{WORKSPACE_PATH}}/projects/roadmap.md`
768
- 2. Insert metadata into DuckDB:
769
-
770
- ```sql
771
- INSERT INTO documents (title, icon, file_path, parent_id, sort_order)
772
- VALUES ('Roadmap', 'map', 'projects/roadmap.md', '<parent_doc_id>', 0);
773
- ```
774
-
775
- ### Cross-Nesting
776
-
777
- - **Document under Object**: Set `parent_object_id` on the document. Place `.md` file inside the object's directory.
778
- - **Object under Document**: Set `parent_document_id` on the object. Place object directory inside the document's directory.
779
-
780
69
  ## Naming Conventions
781
70
 
782
71
  - **Object names**: singular, lowercase, one word ("lead" not "Leads")
@@ -803,227 +92,61 @@ Never rename partially. If you can't complete all steps, don't start the rename
803
92
  - Protected object deletion: check `immutable` column AND `protected_objects` in `workspace_context.yaml`. NEVER delete protected objects.
804
93
  - Field type change: warn user before changing type on field with existing data.
805
94
  - Missing required fields: validate before INSERT, report which fields are missing.
806
-
807
- ## Post-Mutation Checklist (MANDATORY)
808
-
809
- You MUST complete ALL steps below after ANY schema mutation (create/update/delete object, field, or entry). Do NOT skip any step. Do NOT consider the operation complete until all steps are done.
810
-
811
- ### After creating or modifying an OBJECT or its FIELDS:
812
-
813
- - [ ] `CREATE OR REPLACE VIEW v_{object_name}` — regenerate the PIVOT view
814
- - [ ] `mkdir -p {{WORKSPACE_PATH}}/{object_name}/` — create the object directory
815
- - [ ] Write `{{WORKSPACE_PATH}}/{object_name}/.object.yaml` — metadata projection with id, name, description, icon, default_view, entry_count, and full field list
816
- - [ ] If object has a `parent_document_id`, place directory inside the parent document's directory
817
- - [ ] Update `WORKSPACE.md` if it exists
818
-
819
- ### After adding or updating ENTRIES:
820
-
821
- - [ ] Update `entry_count` in the corresponding `.object.yaml`
822
- - [ ] Verify the view returns correct data: `SELECT * FROM v_{object} LIMIT 5`
823
-
824
- ### After deleting an OBJECT:
825
-
826
- - [ ] `DROP VIEW IF EXISTS v_{object_name}` — remove the view
827
- - [ ] `rm -rf {{WORKSPACE_PATH}}/{object_name}/` — remove the directory (unless it contains nested documents that need relocating)
828
- - [ ] Update `WORKSPACE.md`
829
-
830
- ### After creating or modifying a DOCUMENT:
831
-
832
- - [ ] Write the `.md` file to the correct path in `{{WORKSPACE_PATH}}/**`
833
- - [ ] `INSERT INTO documents` — ensure metadata row exists with correct `file_path`, `parent_id`, or `parent_object_id`
834
-
835
- These steps ensure the filesystem always mirrors DuckDB. The sidebar depends on `.object.yaml` files — if they are missing, objects will not appear.
836
-
837
- ## Report Generation (Analytics / Charts)
838
-
839
- Reports are JSON config files (`.report.json`) that the web app renders as live interactive dashboards using Recharts. The agent creates these files to give the user visual analytics over their CRM data.
840
-
841
- ### Report file format
842
-
843
- Store reports as `.report.json` files in `{{WORKSPACE_PATH}}/**` (wherever appropriate / create directories if you need for better structure). The JSON schema:
844
-
845
- ```json
846
- {
847
- "version": 1,
848
- "title": "Report Title",
849
- "description": "Brief description of what this report shows",
850
- "panels": [
851
- {
852
- "id": "unique-panel-id",
853
- "title": "Panel Title",
854
- "type": "bar",
855
- "sql": "SELECT ... FROM v_{object} ...",
856
- "mapping": { "xAxis": "column_name", "yAxis": ["value_column"] },
857
- "size": "half"
858
- }
859
- ],
860
- "filters": [
861
- {
862
- "id": "filter-id",
863
- "type": "dateRange",
864
- "label": "Date Range",
865
- "column": "created_at"
866
- }
867
- ]
868
- }
869
- ```
870
-
871
- ### Chart types
872
-
873
- | Type | Best for | Required mapping |
874
- | --------- | ---------------------------- | ------------------------------- |
875
- | `bar` | Comparing categories | `xAxis`, `yAxis` |
876
- | `line` | Trends over time | `xAxis`, `yAxis` |
877
- | `area` | Volume trends | `xAxis`, `yAxis` |
878
- | `pie` | Distribution/share | `nameKey`, `valueKey` |
879
- | `donut` | Distribution (with center) | `nameKey`, `valueKey` |
880
- | `radar` | Multi-dimensional comparison | `xAxis` (or `nameKey`), `yAxis` |
881
- | `scatter` | Correlation | `xAxis`, `yAxis` |
882
- | `funnel` | Pipeline/conversion | `nameKey`, `valueKey` |
883
-
884
- ### Panel sizes
885
-
886
- - `"full"` — spans full width (6 columns)
887
- - `"half"` — spans half width (3 columns) — **default**
888
- - `"third"` — spans one third (2 columns)
889
-
890
- ### Filter types
891
-
892
- - `dateRange` — date picker (from/to), filters on `column`
893
- - `select` — single-select dropdown, needs `sql` to fetch options
894
- - `multiSelect` — multi-select chips, needs `sql` to fetch options
895
- - `number` — min/max numeric range
896
-
897
- ### SQL query rules for reports
898
-
899
- - Always use the auto-generated `v_{object}` PIVOT views — never raw EAV queries
900
- - SQL must be SELECT-only (no INSERT/UPDATE/DELETE)
901
- - Cast numeric fields: `"Amount"::NUMERIC` or `CAST("Amount" AS NUMERIC)`
902
- - Use `DATE_TRUNC('month', created_at)` for time-series grouping
903
- - Always include `ORDER BY` for consistent chart rendering
904
- - Use aggregate functions: `COUNT(*)`, `SUM(...)`, `AVG(...)`, `MIN(...)`, `MAX(...)`
905
-
906
- ### Example reports
907
-
908
- **Pipeline Funnel:**
909
-
910
- ```json
911
- {
912
- "version": 1,
913
- "title": "Deal Pipeline",
914
- "description": "Deal count and value by stage",
915
- "panels": [
916
- {
917
- "id": "deals-by-stage",
918
- "title": "Deals by Stage",
919
- "type": "funnel",
920
- "sql": "SELECT \"Stage\", COUNT(*) as count FROM v_deal GROUP BY \"Stage\" ORDER BY count DESC",
921
- "mapping": { "nameKey": "Stage", "valueKey": "count" },
922
- "size": "half"
923
- },
924
- {
925
- "id": "revenue-by-stage",
926
- "title": "Revenue by Stage",
927
- "type": "bar",
928
- "sql": "SELECT \"Stage\", SUM(\"Amount\"::NUMERIC) as total FROM v_deal GROUP BY \"Stage\" ORDER BY total DESC",
929
- "mapping": { "xAxis": "Stage", "yAxis": ["total"] },
930
- "size": "half"
931
- }
932
- ],
933
- "filters": [
934
- { "id": "date", "type": "dateRange", "label": "Created", "column": "created_at" },
935
- {
936
- "id": "assignee",
937
- "type": "select",
938
- "label": "Assigned To",
939
- "sql": "SELECT DISTINCT \"Assigned To\" as value FROM v_deal WHERE \"Assigned To\" IS NOT NULL",
940
- "column": "Assigned To"
941
- }
942
- ]
943
- }
944
- ```
945
-
946
- **Contact Growth:**
947
-
948
- ```json
949
- {
950
- "version": 1,
951
- "title": "Contact Growth",
952
- "description": "New contacts over time",
953
- "panels": [
954
- {
955
- "id": "growth-trend",
956
- "title": "Contacts Over Time",
957
- "type": "area",
958
- "sql": "SELECT DATE_TRUNC('month', created_at) as month, COUNT(*) as count FROM v_people GROUP BY month ORDER BY month",
959
- "mapping": { "xAxis": "month", "yAxis": ["count"] },
960
- "size": "full"
961
- }
962
- ]
963
- }
964
- ```
965
-
966
- ### Inline chat reports
967
-
968
- When a user asks for analytics in chat (without explicitly asking to save a report), emit the report JSON inside a fenced code block with language `report-json`. The web UI will render interactive charts inline:
969
-
970
- ````
971
- Here's your pipeline analysis:
972
-
973
- ```report-json
974
- {"version":1,"title":"Deals by Stage","panels":[{"id":"p1","title":"Deal Count","type":"bar","sql":"SELECT \"Stage\", COUNT(*) as count FROM v_deal GROUP BY \"Stage\" ORDER BY count DESC","mapping":{"xAxis":"Stage","yAxis":["count"]},"size":"full"}]}
975
- ```
976
-
977
- Most deals are currently in the Discovery stage.
978
- ````
979
-
980
- The user can then "Pin" the inline report to save it as a `.report.json` file.
981
-
982
- ### Post-report checklist
983
-
984
- After creating a `.report.json` file:
985
-
986
- - [ ] Verify the report JSON is valid and all SQL queries work: test each panel's SQL individually
987
- - [ ] Choose which directory the report should be created in `{{WORKSPACE_PATH}}` based on the context of the conversation, if nothing vert relevant, create/use the `{{WORKSPACE_PATH}}/reports/` directory.
988
- - [ ] Write the file: `{{WORKSPACE_PATH}}/**/{slug}.report.json`
989
- - [ ] Tell the user they can view it in the workspace sidebar under whichever directory it was rightfully placed in based on the context.
990
-
991
- ### Choosing the right chart type
992
-
993
- - **Comparing categories** (status breakdown, source distribution): `bar` or `pie`
994
- - **Time series** (growth, trends, revenue over time): `line` or `area`
995
- - **Pipeline/conversion** (deal stages, lead funnel): `funnel`
996
- - **Distribution/proportion** (market share, segment split): `pie` or `donut`
997
- - **Multi-metric comparison** (performance scores): `radar`
998
- - **Correlation** (price vs. size, score vs. revenue): `scatter`
999
- - When in doubt, `bar` is the safest default
95
+ - **DuckDB SQL errors**: See the "Common DuckDB Pitfalls" section in the **duckdb-operations** child skill. The most frequent causes: unquoted field names with spaces (use `"Full Name"` not `Full Name`), wrong transaction syntax (`BEGIN TRANSACTION` not `BEGIN`), unescaped single quotes, and PIVOT views without the `IN (...)` field list.
96
+ - **"Script not found" on action buttons**: The `.actions/` directory and/or script files were not created. See the **actions** child skill post-creation checklist.
1000
97
 
1001
98
  ## Critical Reminders
1002
99
 
1003
100
  - Handle the ENTIRE CRM operation from analysis to SQL execution to filesystem projection to summary
1004
101
  - **NEVER SKIP FILESYSTEM PROJECTION**: After creating/modifying any object, you MUST create/update `{object}/.object.yaml` in workspace AND the `v_{object}` view. If you skip this, the object will be invisible in the sidebar. This is NOT optional.
1005
- - **THREE STEPS, EVERY TIME**: (1) SQL transaction, (2) filesystem projection (.object.yaml + directory), (3) verify. An operation is NOT complete until all three are done.
102
+ - **THREE STEPS, EVERY TIME**: (1) SQL transaction, (2) filesystem projection (.object.yaml + directory), (3) verify. An operation is NOT complete until all three are done. See **object-builder** child skill.
1006
103
  - Always check existing data before creating (`SELECT` before `INSERT`, or `ON CONFLICT`)
1007
104
  - Use views (`v_{object}`) for all reads — never write raw PIVOT queries for search
1008
105
  - Never assume field names — verify with `SELECT * FROM fields WHERE object_id = ?`
1009
106
  - **DATE FALLBACK**: If an object has no custom `date` field, use `created_at`/`updated_at` (from `entries`) instead of saying there are no date fields.
1010
107
  - Extract ALL data from user messages — don't leave information unused
1011
- - **REPORTS vs DOCUMENTS**: When the user asks for "reports", "analytics", "charts", "graphs", "metrics", "insights", or "breakdown" — use `.report.json` format (see Report Generation section above), NOT markdown. Only use markdown `.md` for SOPs, guides, notes, and prose documents. Reports render as interactive Recharts dashboards; markdown does not.
1012
- - **INLINE CHART ARTIFACTS**: When answering analytics questions in chat, ALWAYS emit a `report-json` fenced code block so the UI renders interactive charts inline. Do NOT describe data in plain text when you can show it as a chart.
108
+ - **REPORTS vs DOCUMENTS**: When the user asks for "reports", "analytics", "charts", "graphs", "metrics", "insights", or "breakdown" — use `.report.json` format (see **reports** child skill), NOT markdown. Only use markdown `.md` for SOPs, guides, notes, and prose documents.
109
+ - **INLINE CHART ARTIFACTS**: When answering analytics questions in chat, ALWAYS emit a `report-json` fenced code block so the UI renders interactive charts inline.
1013
110
  - **NOTES**: Always use type "richtext" for Notes fields
1014
111
  - **USER FIELDS**: Resolve member name to ID from `workspace_context.yaml` BEFORE inserting
1015
112
  - **ENUM FIELDS**: Use type "enum" with `enum_values` JSON array
1016
- - **RELATION FIELDS**: Use type "relation" with `related_object_id`
113
+ - **RELATION FIELDS (PROACTIVE)**: Use type "relation" with `related_object_id` and `relationship_type`. **ALWAYS create relation fields when objects are obviously linked** — don't wait for the user to ask. Examples: people→company, deal→contact, deal→company, task→project, case→client, invoice→company. If you're creating object B and object A exists, ask: "Would B entries reference A entries?" If yes, add a relation. Relation fields must be created via SQL (not the API). See **object-builder** child skill for the full relation pattern and common relation pairs.
1017
114
  - **TAGS FIELDS**: Use type "tags" for free-form string arrays. Value stored as `'["tag1","tag2"]'`
115
+ - **URL FIELDS**: Use type "url" for website addresses and links
116
+ - **FILE FIELDS**: Use type "file" for file attachments (stores file path or URL)
117
+ - **ACTION FIELDS (CRITICAL — READ CAREFULLY)**: Use type `"action"` with `default_value` containing `{"actions":[...]}` JSON. Action fields are excluded from PIVOT views. **When using file-based scripts (`scriptPath`), you MUST also: (1) `mkdir -p` the `.actions/` directory, (2) write every script file referenced in the config, (3) update `.object.yaml` with `action_config`.** If you skip creating the script files, the button will render but clicking it shows "Script not found". See **actions** child skill for the mandatory post-creation checklist and a complete end-to-end example.
1018
118
  - **KANBAN**: Use `default_view = 'kanban'`, set `view_settings.kanbanField: "Status"`, auto-create Status and Assigned To fields
1019
119
  - **CALENDAR**: Use `default_view = 'calendar'`, set `view_settings.calendarDateField` to the date field
1020
120
  - **TIMELINE**: Use `default_view = 'timeline'`, set `view_settings.timelineStartField` and optionally `timelineEndField`
1021
121
  - **VIEW TYPES**: Valid `default_view` values: `table`, `kanban`, `calendar`, `timeline`, `gallery`, `list`
122
+ - **FILTER REQUESTS**: When the user asks to filter, narrow, show only, hide, segment, or otherwise change which entries appear in the UI, default to creating/updating a saved view in `.object.yaml` and set `active_view` so the UI updates immediately. Do this even if they did not explicitly ask to "create a view", unless they clearly want a one-off answer only.
123
+ - **VIEW COLUMNS**: For saved table views, omit `columns` by default. If `columns` is not present, the table uses the default/all columns. `views[].columns` controls visibility only, not display order. Only write `columns` when the user explicitly asks for a specific visible subset.
124
+ - **COLUMN REORDERING**: If the user asks to reorder table columns, do not try to encode that in `views[].columns`. Update the object's field `sort_order` in DuckDB, then regenerate `.object.yaml` so its top-level `fields` list matches the new schema order.
125
+ - **COLUMN WIDTHS**: If the user asks to resize or set column widths, set `view_settings.column_widths` (object-level) or `views[].column_widths` (per-view) as a map of field name to pixel width (e.g. `column_widths: { "Full Name": 250, "Status": 150 }`). The UI also auto-persists widths when columns are drag-resized.
1022
126
  - **PROTECTED OBJECTS**: Never delete objects listed in `workspace_context.yaml` `protected_objects`
1023
- - **ONE EXEC CALL**: Batch related SQL in a single transaction this is the whole point
127
+ - **DUCKDB QUOTING**: Field names with spaces MUST be double-quoted in SQL: `"Full Name"`, `"Email Address"`, etc. Without quotes, DuckDB treats them as separate identifiers and the query fails.
128
+ - **PIVOT VIEWS**: Always use the `IN (...)` clause to list field names explicitly. Exclude action fields with `AND f.type != 'action'`. See **duckdb-operations** child skill.
129
+ - **ONE EXEC CALL**: Batch related SQL in a single transaction
1024
130
  - **workspace_context.yaml**: READ-ONLY. Never modify. Data flows from the CRM UI only.
1025
131
  - **Source of truth**: DuckDB for all structured data. Filesystem for document content and navigation tree. Never duplicate entry data to the filesystem.
1026
132
  - **ENTRY COUNT**: After adding entries, update `entry_count` in `.object.yaml`.
1027
- - **NAME CONSISTENCY**: The DuckDB `objects.name`, the filesystem directory name, and `.object.yaml` `name` MUST be identical. A mismatch between ANY of these three will break the UI. Before finishing any object creation or modification, verify: `objects.name == directory_name == yaml.name`. See "Renaming / Moving Objects" under Naming Conventions.
133
+ - **NAME CONSISTENCY**: The DuckDB `objects.name`, the filesystem directory name, and `.object.yaml` `name` MUST be identical. See Naming Conventions above.
1028
134
  - **NEVER POLLUTE THE WORKSPACE**: Always keep cleaning / organising the workspace to something more nicely structured. Always look out for bloat and too many random files scattered around everywhere for no reason, every time you do any actions in filesystem always try to come up with the most efficient and nice file system structure inside the workspace.
1029
135
  - **TEMPORARY FILES**: All temporary scripts / code / text / other files as and when needed for processing must go into `tmp/` directory (create it in the workspace if it doesn't exist, only if needed).
136
+
137
+ ---
138
+
139
+ ## Child Skills
140
+
141
+ This skill covers workspace fundamentals. For specialized operations, see these child skills (all inside the `crm/` skill folder):
142
+
143
+ | Skill | Path | Covers |
144
+ |-------|------|--------|
145
+ | **DuckDB Operations** | `crm/duckdb-operations/SKILL.md` | DuckDB schema initialization, field types reference, auto-generated PIVOT views, SQL CRUD operations (create/read/update/delete objects, fields, entries), bulk import/export |
146
+ | **Object Builder** | `crm/object-builder/SKILL.md` | Full 3-step workflow (SQL → filesystem → verify), CRM patterns (contact, lead, company, deal, case, property, task), kanban boards, post-mutation checklist, renaming objects |
147
+ | **Views & Filters** | `crm/views-filters/SKILL.md` | `.object.yaml` format and template, view type settings (kanban, calendar, timeline, gallery, list), saved views, filter operators by field type, date format rules |
148
+ | **Documents** | `crm/documents/SKILL.md` | Document management (markdown files), cross-nesting (documents under objects, objects under documents), entry detail pages (optional per-entry markdown) |
149
+ | **Reports** | `crm/reports/SKILL.md` | Report generation (`.report.json` format), chart types (bar, line, area, pie, donut, radar, scatter, funnel), panel sizes, filter types, inline chat reports, post-report checklist |
150
+ | **Actions** | `crm/actions/SKILL.md` | Action field type (`type: "action"`), executable buttons on entries, server-side script execution in any language (JS, Python, bash, etc.), inline JS SDK, NDJSON stdout protocol, environment variable context, bulk parallel execution, action_runs table, UI rendering in table/kanban/entry panel |
151
+
152
+ All child skills are seeded into the workspace alongside this parent skill and can be read at `{{WORKSPACE_PATH}}/skills/crm/<child>/SKILL.md`.