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
@@ -0,0 +1,600 @@
1
+ # Actions — Executable Buttons on CRM Objects
2
+
3
+ Actions are a field type (`type: "action"`) that renders clickable buttons on object entries. Each button executes a server-side script in **any language** — JavaScript, Python, bash, Ruby, Go, or any executable installed on the machine.
4
+
5
+ ---
6
+
7
+ ## Table of Contents
8
+
9
+ 1. [Creating Action Fields](#creating-action-fields)
10
+ 2. [Post-Creation Checklist (MANDATORY)](#post-creation-checklist-mandatory)
11
+ 3. [Action Configuration](#action-configuration)
12
+ 4. [Script Modes](#script-modes)
13
+ 5. [Script Protocol](#script-protocol)
14
+ 6. [Environment Variables](#environment-variables)
15
+ 7. [Inline JS SDK (inline scripts only)](#inline-js-sdk-inline-scripts-only)
16
+ 8. [Action Runs](#action-runs)
17
+ 9. [Bulk Execution](#bulk-execution)
18
+ 10. [UI Rendering](#ui-rendering)
19
+ 11. [Complete End-to-End Example](#complete-end-to-end-example)
20
+ 12. [More Examples](#more-examples)
21
+ 13. [Common Mistakes](#common-mistakes)
22
+
23
+ ---
24
+
25
+ ## Creating Action Fields
26
+
27
+ Create via SQL like any field, with `type = 'action'` and the action config in `default_value`:
28
+
29
+ ```sql
30
+ INSERT INTO fields (id, object_id, name, type, default_value, sort_order)
31
+ VALUES (
32
+ (SELECT gen_random_uuid()::VARCHAR),
33
+ (SELECT id FROM objects WHERE name = 'lead'),
34
+ 'Actions',
35
+ 'action',
36
+ '{"actions":[{"id":"act_send_email","label":"Send Email","icon":"mail","variant":"primary","scriptPath":".actions/send-email.js","confirmMessage":"Send email to this contact?","loadingLabel":"Sending...","successLabel":"Sent!","autoResetMs":3000}]}',
37
+ 10
38
+ );
39
+ ```
40
+
41
+ You can also create action fields via the API:
42
+
43
+ ```
44
+ POST /api/workspace/objects/{objectName}/fields
45
+ {
46
+ "name": "Actions",
47
+ "type": "action",
48
+ "action_config": {
49
+ "actions": [...]
50
+ }
51
+ }
52
+ ```
53
+
54
+ ---
55
+
56
+ ## Post-Creation Checklist (MANDATORY)
57
+
58
+ **You MUST complete ALL steps below after creating an action field. The button will NOT work if any step is missing. Do NOT consider the operation complete until every step is done.**
59
+
60
+ ### After creating an action field with file-based scripts (`scriptPath`):
61
+
62
+ - [ ] **CREATE the `.actions/` directory**: `mkdir -p {{WORKSPACE_PATH}}/{object_name}/.actions/`
63
+ - [ ] **WRITE every script file** referenced by `scriptPath` in the action config. If you defined `"scriptPath": ".actions/send-email.js"`, then `{{WORKSPACE_PATH}}/{object_name}/.actions/send-email.js` MUST exist with working code.
64
+ - [ ] **Regenerate the PIVOT view** — action fields are excluded from PIVOT (they store no entry_fields values), but the view must be refreshed to reflect the new field list.
65
+ - [ ] **Update `.object.yaml`** — include the action field with its `action_config` in the fields list.
66
+ - [ ] **Verify** — confirm the script file exists: `ls {{WORKSPACE_PATH}}/{object_name}/.actions/`
67
+
68
+ ### After creating an action field with inline scripts (`script` + `runtime: "inline"`):
69
+
70
+ - [ ] **Regenerate the PIVOT view** — same as above.
71
+ - [ ] **Update `.object.yaml`** — include the action field.
72
+ - [ ] No filesystem scripts needed — inline code is stored in the field's `default_value`.
73
+
74
+ ### CRITICAL: If you skip creating the script file, clicking the button will show "Script not found" error.
75
+
76
+ ---
77
+
78
+ ## Action Configuration
79
+
80
+ Each action field's `default_value` is a JSON object with an `actions` array:
81
+
82
+ ```json
83
+ {
84
+ "actions": [
85
+ {
86
+ "id": "act_unique_id",
87
+ "label": "Button Label",
88
+ "icon": "mail",
89
+ "variant": "primary",
90
+ "scriptPath": ".actions/my-script.js",
91
+ "runtime": "auto",
92
+ "confirmMessage": "Are you sure?",
93
+ "loadingLabel": "Running...",
94
+ "successLabel": "Done!",
95
+ "errorLabel": "Failed",
96
+ "autoResetMs": 3000,
97
+ "timeout": 60000
98
+ }
99
+ ]
100
+ }
101
+ ```
102
+
103
+ | Field | Type | Required | Description |
104
+ |-------|------|----------|-------------|
105
+ | `id` | string | yes | Unique identifier for this action |
106
+ | `label` | string | yes | Button text displayed in idle state |
107
+ | `icon` | string | no | Icon name (decorative, not rendered from icon set yet) |
108
+ | `variant` | string | no | `"default"` \| `"primary"` \| `"destructive"` \| `"success"` \| `"warning"` |
109
+ | `scriptPath` | string | conditional | Path to script file relative to object directory |
110
+ | `script` | string | conditional | Inline JavaScript code (for simple actions) |
111
+ | `runtime` | string | no | `"auto"` \| `"inline"` \| `"node"` \| `"python"` \| `"bash"` \| `"ruby"` |
112
+ | `confirmMessage` | string | no | If set, shows confirmation dialog before running |
113
+ | `loadingLabel` | string | no | Text shown while script is running |
114
+ | `successLabel` | string | no | Text shown on success |
115
+ | `errorLabel` | string | no | Text shown on failure |
116
+ | `autoResetMs` | number | no | Milliseconds before button resets to idle (default: 3000) |
117
+ | `timeout` | number | no | Milliseconds before killing the script (default: 60000) |
118
+
119
+ Either `scriptPath` or `script` must be provided. If both are present, `scriptPath` takes precedence unless `runtime` is `"inline"`.
120
+
121
+ ---
122
+
123
+ ## Script Modes
124
+
125
+ ### File-based scripts (`scriptPath`)
126
+
127
+ Scripts live as files in the workspace alongside the object:
128
+
129
+ ```
130
+ workspace/
131
+ leads/
132
+ .object.yaml
133
+ .actions/
134
+ send-email.js
135
+ generate-report.py
136
+ deploy-webhook.sh
137
+ ```
138
+
139
+ Runtime auto-detection by file extension:
140
+ - `.js`, `.mjs`, `.cjs` → `node`
141
+ - `.ts` → `npx tsx`
142
+ - `.py` → `python3`
143
+ - `.sh` → `bash`
144
+ - `.rb` → `ruby`
145
+ - No extension → direct execution (must be chmod +x)
146
+
147
+ ### Inline scripts (`script`)
148
+
149
+ Short JavaScript snippets stored directly in the action config. Executed server-side via `node` with the Dench SDK pre-loaded:
150
+
151
+ ```json
152
+ {
153
+ "id": "act_mark_contacted",
154
+ "label": "Mark Contacted",
155
+ "variant": "success",
156
+ "script": "await dench.objects.update(context.objectName, context.entryId, { Status: 'Contacted' });\nreturn { message: 'Updated' };",
157
+ "runtime": "inline"
158
+ }
159
+ ```
160
+
161
+ ---
162
+
163
+ ## Script Protocol
164
+
165
+ Scripts communicate results via **NDJSON on stdout**. Each line is a JSON object:
166
+
167
+ ```jsonl
168
+ {"type":"progress","percent":50,"message":"Processing..."}
169
+ {"type":"log","level":"info","message":"Fetched 42 records"}
170
+ {"type":"result","status":"success","data":{"emailsSent":5}}
171
+ ```
172
+
173
+ ### Message types
174
+
175
+ | Type | Fields | Description |
176
+ |------|--------|-------------|
177
+ | `progress` | `percent`, `message?` | Updates progress bar in UI |
178
+ | `log` | `level`, `message` | Streamed to action output (`info`, `warn`, `error`) |
179
+ | `result` | `status`, `data?` | Final result. `status` is `"success"` or `"error"`. Terminates. |
180
+
181
+ Non-JSON stdout lines are treated as `log` messages with `level: "info"`.
182
+
183
+ Exit code: 0 = success, non-zero = error (standard Unix convention). If no `result` message is emitted, the exit code determines success/failure.
184
+
185
+ ---
186
+
187
+ ## Environment Variables
188
+
189
+ Every script receives these environment variables:
190
+
191
+ | Variable | Description |
192
+ |----------|-------------|
193
+ | `DENCH_ENTRY_ID` | The entry ID this action is running on |
194
+ | `DENCH_ENTRY_DATA` | Full entry data as JSON string |
195
+ | `DENCH_OBJECT_NAME` | Object name (e.g. `"leads"`) |
196
+ | `DENCH_OBJECT_ID` | Object ID |
197
+ | `DENCH_ACTION_ID` | Action ID from config |
198
+ | `DENCH_FIELD_ID` | Field ID the action belongs to |
199
+ | `DENCH_WORKSPACE_PATH` | Absolute path to workspace root |
200
+ | `DENCH_DB_PATH` | Absolute path to `workspace.duckdb` |
201
+ | `DENCH_API_URL` | Base URL for workspace REST APIs |
202
+
203
+ This means **any language** can participate — just read env vars and print JSON to stdout.
204
+
205
+ ### File-Based Script Patterns
206
+
207
+ File-based scripts do NOT have the `dench` SDK. Use env vars + CLI/HTTP instead:
208
+
209
+ **Read entry data (any language):**
210
+ ```bash
211
+ # Entry data is already in env as JSON
212
+ echo "$DENCH_ENTRY_DATA" | jq '.["Full Name"]'
213
+ ```
214
+
215
+ **Query DuckDB from a file-based script:**
216
+ ```bash
217
+ duckdb "$DENCH_DB_PATH" -json "SELECT * FROM v_lead WHERE entry_id = '$DENCH_ENTRY_ID'"
218
+ ```
219
+
220
+ **Update DuckDB from a file-based script:**
221
+ ```bash
222
+ FIELD_ID=$(duckdb "$DENCH_DB_PATH" -noheader -list \
223
+ "SELECT id FROM fields WHERE object_id = '$DENCH_OBJECT_ID' AND name = 'Status'")
224
+ duckdb "$DENCH_DB_PATH" \
225
+ "INSERT INTO entry_fields (entry_id, field_id, value)
226
+ VALUES ('$DENCH_ENTRY_ID', '$FIELD_ID', 'Contacted')
227
+ ON CONFLICT (entry_id, field_id) DO UPDATE SET value = excluded.value, updated_at = now()"
228
+ ```
229
+
230
+ **Call the workspace REST API from a file-based script:**
231
+ ```bash
232
+ curl -s -X PATCH "$DENCH_API_URL/workspace/objects/$DENCH_OBJECT_NAME/entries/$DENCH_ENTRY_ID" \
233
+ -H "Content-Type: application/json" \
234
+ -d '{"fields":{"Status":"Contacted"}}'
235
+ ```
236
+
237
+ ### Python example
238
+
239
+ ```python
240
+ import os, json, requests
241
+
242
+ entry = json.loads(os.environ['DENCH_ENTRY_DATA'])
243
+ api = os.environ['DENCH_API_URL']
244
+ email = entry.get('Email Address', '')
245
+
246
+ print(json.dumps({"type": "progress", "percent": 50, "message": "Sending..."}))
247
+
248
+ requests.post(f"{api}/workspace/objects/people/entries/{os.environ['DENCH_ENTRY_ID']}",
249
+ json={"fields": {"Status": "Contacted"}},
250
+ headers={"Content-Type": "application/json"})
251
+
252
+ print(json.dumps({"type": "result", "status": "success", "data": {"email": email}}))
253
+ ```
254
+
255
+ ### Bash example
256
+
257
+ ```bash
258
+ #!/bin/bash
259
+ ENTRY=$(echo "$DENCH_ENTRY_DATA" | jq -r '.["Email Address"]')
260
+ echo "{\"type\":\"log\",\"level\":\"info\",\"message\":\"Processing $ENTRY\"}"
261
+ curl -s -X PATCH "$DENCH_API_URL/workspace/objects/$DENCH_OBJECT_NAME/entries/$DENCH_ENTRY_ID" \
262
+ -H "Content-Type: application/json" \
263
+ -d '{"fields":{"Status":"Contacted"}}'
264
+ echo '{"type":"result","status":"success","data":{"sent":true}}'
265
+ ```
266
+
267
+ ---
268
+
269
+ ## Inline JS SDK (inline scripts only)
270
+
271
+ **The `dench` global and `context` object are ONLY available for inline scripts (`runtime: "inline"`).** File-based scripts do NOT have access to the SDK — they must use environment variables and raw HTTP/CLI calls (see [Environment Variables](#environment-variables) and [File-Based Script Patterns](#file-based-script-patterns) below).
272
+
273
+ For inline JS actions, the `dench` global provides:
274
+
275
+ | Method | Description |
276
+ |--------|-------------|
277
+ | `dench.objects.get(name, id)` | Get entry by object name and ID |
278
+ | `dench.objects.list(name)` | List entries for an object |
279
+ | `dench.objects.create(name, fields)` | Create a new entry |
280
+ | `dench.objects.update(name, id, fields)` | Update entry fields |
281
+ | `dench.objects.delete(name, id)` | Delete an entry |
282
+ | `dench.objects.bulkDelete(name, ids)` | Bulk delete entries |
283
+ | `dench.db.query(sql)` | Run read-only SQL on workspace DB |
284
+ | `dench.db.execute(sql)` | Execute SQL (write operations) |
285
+ | `dench.files.read(path)` | Read a workspace file |
286
+ | `dench.files.write(path, content)` | Write a workspace file |
287
+ | `dench.http.fetch(url, opts)` | Standard fetch (no proxy) |
288
+ | `dench.exec(cmd)` | Run a shell command synchronously |
289
+ | `dench.progress(percent, message)` | Report progress to UI |
290
+ | `dench.log(message, level)` | Log a message |
291
+ | `dench.complete(data)` | Signal successful completion |
292
+ | `dench.fail(message)` | Signal failure and exit |
293
+ | `dench.env.*` | Access all DENCH_* env vars as properties |
294
+
295
+ The `context` object is also available:
296
+ - `context.entryId`, `context.entryData`, `context.objectName`, `context.objectId`
297
+ - `context.actionId`, `context.fieldId`, `context.workspacePath`, `context.dbPath`, `context.apiUrl`
298
+
299
+ ---
300
+
301
+ ## Action Runs
302
+
303
+ Every execution is persisted in the `action_runs` table:
304
+
305
+ ```sql
306
+ CREATE TABLE IF NOT EXISTS action_runs (
307
+ id VARCHAR PRIMARY KEY DEFAULT (gen_random_uuid()::VARCHAR),
308
+ action_id VARCHAR NOT NULL,
309
+ field_id VARCHAR NOT NULL,
310
+ entry_id VARCHAR NOT NULL,
311
+ object_id VARCHAR NOT NULL,
312
+ status VARCHAR NOT NULL DEFAULT 'pending',
313
+ started_at TIMESTAMPTZ DEFAULT now(),
314
+ completed_at TIMESTAMPTZ,
315
+ result VARCHAR,
316
+ error VARCHAR,
317
+ stdout VARCHAR,
318
+ exit_code INTEGER
319
+ );
320
+ ```
321
+
322
+ Query recent runs:
323
+ ```
324
+ GET /api/workspace/objects/{name}/actions/runs?fieldId=...&entryId=...&limit=20
325
+ ```
326
+
327
+ ---
328
+
329
+ ## Bulk Execution
330
+
331
+ When the user selects multiple rows in the table and clicks an action button in the bulk action bar:
332
+
333
+ 1. The UI sends a single POST with all selected `entryIds`.
334
+ 2. The server spawns up to 8 concurrent child processes (one per entry).
335
+ 3. Each process gets its own `DENCH_ENTRY_ID` and `DENCH_ENTRY_DATA`.
336
+ 4. Results stream back as SSE events per entry.
337
+ 5. The UI updates each entry's button state independently.
338
+
339
+ ---
340
+
341
+ ## UI Rendering
342
+
343
+ Action buttons appear in:
344
+
345
+ 1. **Table view**: As a column. Multiple actions show as compact buttons per row. Checkbox column (first, sticky) enables multi-row selection for bulk actions.
346
+ 2. **Entry detail panel**: Full-width buttons in a dedicated "Actions" section below properties.
347
+ 3. **Kanban cards**: Compact (icon-only) buttons at the bottom of each card.
348
+ 4. **Bulk action bar**: Fixed bottom toolbar when rows are selected. Shows all available action buttons + a default "Delete" button.
349
+
350
+ Button states: idle → loading (with optional progress bar) → success/error → auto-reset to idle.
351
+
352
+ ---
353
+
354
+ ## Complete End-to-End Example
355
+
356
+ This example creates an action button on a "lead" object that marks a lead as "Contacted". **Follow every step — skipping any will leave a broken button.**
357
+
358
+ **Step 1 — SQL: Create the action field** (single exec call):
359
+
360
+ ```sql
361
+ INSERT INTO fields (id, object_id, name, type, default_value, sort_order)
362
+ VALUES (
363
+ (SELECT gen_random_uuid()::VARCHAR),
364
+ (SELECT id FROM objects WHERE name = 'lead'),
365
+ 'Actions',
366
+ 'action',
367
+ '{"actions":[{"id":"act_mark_contacted","label":"Mark Contacted","icon":"phone","variant":"primary","scriptPath":".actions/mark-contacted.sh","loadingLabel":"Updating...","successLabel":"Contacted!","autoResetMs":3000},{"id":"act_export","label":"Export","icon":"download","variant":"default","scriptPath":".actions/export-csv.py","loadingLabel":"Exporting...","successLabel":"Exported!"}]}',
368
+ 99
369
+ );
370
+ ```
371
+
372
+ **Step 2 — Regenerate the PIVOT view** (action fields are excluded):
373
+
374
+ ```sql
375
+ CREATE OR REPLACE VIEW v_lead AS
376
+ PIVOT (
377
+ SELECT e.id as entry_id, e.created_at, e.updated_at,
378
+ f.name as field_name, ef.value
379
+ FROM entries e
380
+ JOIN entry_fields ef ON ef.entry_id = e.id
381
+ JOIN fields f ON f.id = ef.field_id
382
+ WHERE e.object_id = (SELECT id FROM objects WHERE name = 'lead')
383
+ AND f.type != 'action'
384
+ ) ON field_name IN ('Full Name', 'Email Address', 'Phone Number', 'Status', 'Score', 'Source', 'Notes') USING first(value);
385
+ ```
386
+
387
+ **Step 3 — Create the `.actions/` directory and write EVERY script file**:
388
+
389
+ ```bash
390
+ mkdir -p {{WORKSPACE_PATH}}/lead/.actions
391
+ ```
392
+
393
+ Write `.actions/mark-contacted.sh`:
394
+
395
+ ```bash
396
+ #!/bin/bash
397
+ # .actions/mark-contacted.sh — Updates lead status to "Contacted"
398
+ echo '{"type":"progress","percent":30,"message":"Looking up lead..."}'
399
+
400
+ FIELD_ID=$(duckdb "$DENCH_DB_PATH" -noheader -list \
401
+ "SELECT id FROM fields WHERE object_id = '$DENCH_OBJECT_ID' AND name = 'Status'")
402
+
403
+ if [ -z "$FIELD_ID" ]; then
404
+ echo '{"type":"result","status":"error","data":{"message":"Status field not found"}}'
405
+ exit 1
406
+ fi
407
+
408
+ echo '{"type":"progress","percent":70,"message":"Updating status..."}'
409
+
410
+ duckdb "$DENCH_DB_PATH" \
411
+ "INSERT INTO entry_fields (entry_id, field_id, value)
412
+ VALUES ('$DENCH_ENTRY_ID', '$FIELD_ID', 'Contacted')
413
+ ON CONFLICT (entry_id, field_id) DO UPDATE SET value = excluded.value, updated_at = now()"
414
+
415
+ echo '{"type":"result","status":"success","data":{"newStatus":"Contacted"}}'
416
+ ```
417
+
418
+ Write `.actions/export-csv.py`:
419
+
420
+ ```python
421
+ # .actions/export-csv.py — Exports entry data to CSV
422
+ import os, json, csv, subprocess
423
+
424
+ entry = json.loads(os.environ['DENCH_ENTRY_DATA'])
425
+ workspace = os.environ['DENCH_WORKSPACE_PATH']
426
+ entry_id = os.environ['DENCH_ENTRY_ID']
427
+
428
+ print(json.dumps({"type": "progress", "percent": 50, "message": "Generating CSV..."}))
429
+
430
+ output_path = os.path.join(workspace, 'exports', f"{entry_id}.csv")
431
+ os.makedirs(os.path.dirname(output_path), exist_ok=True)
432
+
433
+ with open(output_path, 'w', newline='') as f:
434
+ writer = csv.writer(f)
435
+ writer.writerow(entry.keys())
436
+ writer.writerow(entry.values())
437
+
438
+ print(json.dumps({"type": "result", "status": "success", "data": {"path": output_path}}))
439
+ ```
440
+
441
+ **Step 4 — Update `.object.yaml`** (include action_config in the fields list):
442
+
443
+ ```yaml
444
+ # Add to the fields section of lead/.object.yaml:
445
+ fields:
446
+ - name: "Full Name"
447
+ type: text
448
+ required: true
449
+ - name: "Email Address"
450
+ type: email
451
+ required: true
452
+ # ... other fields ...
453
+ - name: "Actions"
454
+ type: action
455
+ action_config:
456
+ actions:
457
+ - id: act_mark_contacted
458
+ label: "Mark Contacted"
459
+ icon: phone
460
+ variant: primary
461
+ scriptPath: ".actions/mark-contacted.sh"
462
+ loadingLabel: "Updating..."
463
+ successLabel: "Contacted!"
464
+ autoResetMs: 3000
465
+ - id: act_export
466
+ label: "Export"
467
+ icon: download
468
+ variant: default
469
+ scriptPath: ".actions/export-csv.py"
470
+ loadingLabel: "Exporting..."
471
+ successLabel: "Exported!"
472
+ ```
473
+
474
+ **Step 5 — Verify everything**:
475
+
476
+ ```bash
477
+ # Verify scripts exist
478
+ ls -la {{WORKSPACE_PATH}}/lead/.actions/
479
+ # Verify .object.yaml includes the action field
480
+ cat {{WORKSPACE_PATH}}/lead/.object.yaml
481
+ # Verify the view works
482
+ duckdb {{WORKSPACE_PATH}}/workspace.duckdb "SELECT COUNT(*) FROM v_lead"
483
+ ```
484
+
485
+ ---
486
+
487
+ ## More Examples
488
+
489
+ ### Simple status update (inline — no script files needed)
490
+
491
+ ```json
492
+ {
493
+ "id": "act_mark_done",
494
+ "label": "Mark Done",
495
+ "variant": "success",
496
+ "script": "await dench.objects.update(context.objectName, context.entryId, { Status: 'Done' });\nreturn { message: 'Marked as done' };",
497
+ "runtime": "inline",
498
+ "successLabel": "Done!",
499
+ "autoResetMs": 2000
500
+ }
501
+ ```
502
+
503
+ ### Send Slack notification (Node.js file)
504
+
505
+ ```javascript
506
+ // .actions/send-notification.js
507
+ // File-based scripts use env vars — the `dench` SDK is NOT available here.
508
+ const entry = JSON.parse(process.env.DENCH_ENTRY_DATA);
509
+ const name = entry['Full Name'] || 'Unknown';
510
+
511
+ console.log(JSON.stringify({type: "progress", percent: 30, message: "Preparing notification..."}));
512
+
513
+ const result = await fetch('https://hooks.slack.com/services/YOUR/WEBHOOK/URL', {
514
+ method: 'POST',
515
+ headers: { 'Content-Type': 'application/json' },
516
+ body: JSON.stringify({ text: `New lead: ${name}` }),
517
+ });
518
+
519
+ if (result.ok) {
520
+ console.log(JSON.stringify({type: "result", status: "success", data: {notified: true}}));
521
+ } else {
522
+ console.log(JSON.stringify({type: "result", status: "error", data: {message: "Slack notification failed"}}));
523
+ process.exit(1);
524
+ }
525
+ ```
526
+
527
+ ### DuckDB query from Node.js file
528
+
529
+ ```javascript
530
+ // .actions/enrich-lead.js
531
+ // Use child_process to query DuckDB directly from file-based scripts
532
+ const { execSync } = require('child_process');
533
+ const entry = JSON.parse(process.env.DENCH_ENTRY_DATA);
534
+ const dbPath = process.env.DENCH_DB_PATH;
535
+ const entryId = process.env.DENCH_ENTRY_ID;
536
+ const objectId = process.env.DENCH_OBJECT_ID;
537
+
538
+ console.log(JSON.stringify({type: "progress", percent: 20, message: "Enriching..."}));
539
+
540
+ const fieldId = execSync(
541
+ `duckdb '${dbPath}' -noheader -list "SELECT id FROM fields WHERE object_id = '${objectId}' AND name = 'Score'"`,
542
+ { encoding: 'utf-8' }
543
+ ).trim();
544
+
545
+ if (fieldId) {
546
+ execSync(
547
+ `duckdb '${dbPath}' "INSERT INTO entry_fields (entry_id, field_id, value) VALUES ('${entryId}', '${fieldId}', '85') ON CONFLICT (entry_id, field_id) DO UPDATE SET value = excluded.value, updated_at = now()"`,
548
+ { encoding: 'utf-8' }
549
+ );
550
+ }
551
+
552
+ console.log(JSON.stringify({type: "result", status: "success", data: {score: 85}}));
553
+ ```
554
+
555
+ ### Destructive action with confirmation
556
+
557
+ ```json
558
+ {
559
+ "id": "act_archive",
560
+ "label": "Archive",
561
+ "variant": "destructive",
562
+ "confirmMessage": "This will move the entry to the archive. Continue?",
563
+ "scriptPath": ".actions/archive.sh",
564
+ "loadingLabel": "Archiving...",
565
+ "successLabel": "Archived",
566
+ "errorLabel": "Archive failed"
567
+ }
568
+ ```
569
+
570
+ The script file `.actions/archive.sh` must also be created:
571
+
572
+ ```bash
573
+ #!/bin/bash
574
+ # .actions/archive.sh
575
+ echo '{"type":"progress","percent":50,"message":"Archiving entry..."}'
576
+ duckdb "$DENCH_DB_PATH" "DELETE FROM entries WHERE id = '$DENCH_ENTRY_ID'"
577
+ echo '{"type":"result","status":"success","data":{"archived":true}}'
578
+ ```
579
+
580
+ ---
581
+
582
+ ## Common Mistakes
583
+
584
+ **1. Creating action field SQL but forgetting to write the script files.**
585
+ The button renders in the UI but clicking it shows "Script not found: .actions/my-script.js". You MUST `mkdir -p` the `.actions/` directory and write every script file referenced by `scriptPath`.
586
+
587
+ **2. Using the `dench` SDK in file-based scripts.**
588
+ The `dench` global and `context` object are ONLY available for inline scripts (`runtime: "inline"`). File-based scripts must use `process.env.DENCH_*` variables and shell/HTTP calls. See [File-Based Script Patterns](#file-based-script-patterns).
589
+
590
+ **3. Forgetting to update `.object.yaml` with the action field.**
591
+ The `.object.yaml` must include the action field with `action_config` in its fields list. Without it, the sidebar and UI may not render the action buttons correctly.
592
+
593
+ **4. Not regenerating the PIVOT view after adding an action field.**
594
+ Action fields are excluded from PIVOT views (`type != 'action'`), but the view must be regenerated to reflect the updated field list. Use the `IN (...)` clause listing only non-action field names.
595
+
596
+ **5. Using `uuid()` instead of `gen_random_uuid()` for field IDs.**
597
+ The correct function is `gen_random_uuid()::VARCHAR`. The `uuid()` function may not exist in all DuckDB versions.
598
+
599
+ **6. Script exits with non-zero code but no error message.**
600
+ Always emit a `{"type":"result","status":"error","data":{"message":"..."}}` line before exiting with a non-zero code, so the UI shows a meaningful error instead of a generic failure.
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: documents
3
+ description: Document management with markdown files, cross-nesting between documents and objects, and optional per-entry detail pages.
4
+ metadata: { "openclaw": { "inject": true, "always": true, "emoji": "📄" } }
5
+ ---
6
+
7
+ # CRM Documents
8
+
9
+ This skill covers document management, cross-nesting, and entry detail pages. For workspace fundamentals, see the parent **crm** skill (`crm/SKILL.md`). For creating objects, see **object-builder** (`crm/object-builder/SKILL.md`).
10
+
11
+ ---
12
+
13
+ ## Document Management
14
+
15
+ Documents are markdown files in `{{WORKSPACE_PATH}}/**`. The DuckDB `documents` table tracks metadata only; the `.md` file IS the content.
16
+
17
+ ### Create Document
18
+
19
+ 1. Write the `.md` file: `write {{WORKSPACE_PATH}}/projects/roadmap.md`
20
+ 2. Insert metadata into DuckDB:
21
+
22
+ ```sql
23
+ INSERT INTO documents (title, icon, file_path, parent_id, sort_order)
24
+ VALUES ('Roadmap', 'map', 'projects/roadmap.md', '<parent_doc_id>', 0);
25
+ ```
26
+
27
+ ### Cross-Nesting
28
+
29
+ - **Document under Object**: Set `parent_object_id` on the document. Place `.md` file inside the object's directory.
30
+ - **Object under Document**: Set `parent_document_id` on the object. Place object directory inside the document's directory.
31
+
32
+ ---
33
+
34
+ ## Entry Detail Pages (Optional Markdown Files)
35
+
36
+ Each entry in an object can have an optional markdown file that acts as a detail page (like a Notion row page). The file is stored inside the object's directory at `{{WORKSPACE_PATH}}/{object_name}/{entry_id}.md`.
37
+
38
+ **Key rules:**
39
+
40
+ - Entry `.md` files are **optional** — they are only created when the user writes content via the entry detail panel in the UI.
41
+ - You do NOT need to create `.md` files for every entry during seeding. Only create them when you want to add detailed notes, descriptions, or documentation for a specific entry.
42
+ - The UI automatically shows an empty markdown editor for entries without a `.md` file, and creates the file on first write.
43
+ - Entry `.md` files are plain markdown (no frontmatter required). The filename must be exactly `{entry_id}.md`.
44
+
45
+ **When to create entry `.md` files during seeding:**
46
+
47
+ - For entries that have rich descriptions or meeting notes
48
+ - For entries that need SOPs, playbooks, or documentation attached
49
+ - For key entries like important leads, major projects, or critical tasks
50
+
51
+ **Example:**
52
+
53
+ ```bash
54
+ # Only if you want to add detailed notes for this specific entry
55
+ cat > {{WORKSPACE_PATH}}/lead/abc123.md << 'MD'
56
+ # Meeting Notes - Acme Corp
57
+
58
+ Met with John on 2026-03-15. Key takeaways:
59
+
60
+ - Interested in enterprise plan
61
+ - Budget approved for Q2
62
+ - Follow up next week with pricing proposal
63
+ MD
64
+ ```