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.
- package/apps/web/.next/standalone/apps/web/.next/BUILD_ID +1 -1
- package/apps/web/.next/standalone/apps/web/.next/app-build-manifest.json +233 -198
- package/apps/web/.next/standalone/apps/web/.next/app-path-routes-manifest.json +32 -27
- package/apps/web/.next/standalone/apps/web/.next/build-manifest.json +5 -5
- package/apps/web/.next/standalone/apps/web/.next/cache/config.json +3 -3
- package/apps/web/.next/standalone/apps/web/.next/prerender-manifest.json +3 -3
- package/apps/web/.next/standalone/apps/web/.next/react-loadable-manifest.json +1 -4
- package/apps/web/.next/standalone/apps/web/.next/required-server-files.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/routes-manifest.json +34 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/cron/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/proxy/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/serve/[...path]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/store/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/webhooks/[...path]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/active/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/runs/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stop/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stop/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stream/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/subagents/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/[jobId]/runs/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/[sessionId]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/search-transcript/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/channels/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/chat/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/chat/stream/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/sessions/[id]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/sessions/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/memories/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/switch/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/[sessionId]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/terminal/port/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/messages/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/assets/[...path]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse-file/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/context/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/copy/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/introspect/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/query/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/delete/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/delete/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/execute/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/file/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/init/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/init/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/link-preview/route.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/link-preview/route.js.nft.json +1 -0
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/link-preview/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/list/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/mkdir/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/move/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/route.js +54 -0
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/route.js.nft.json +1 -0
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/runs/route.js +4 -0
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/runs/route.js.nft.json +1 -0
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/runs/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/display-field/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/content/route.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/content/route.js.nft.json +1 -0
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/content/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/bulk-delete/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/options/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/route_client-reference-manifest.js +1 -1
- 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
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/route.js +9 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/reorder/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/route.js +10 -0
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/route.js.nft.json +1 -0
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/views/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/open-file/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/path-info/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/query/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/raw-file/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/rename/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/reports/execute/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/reports/execute/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/search-index/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/suggest-files/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/switch/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/switch/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/thumbnail/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/tree/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/upload/route.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/upload/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/virtual-file/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/watch/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/write-binary/route_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/page.js +104 -55
- package/apps/web/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app/workspace/page_client-reference-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/app-paths-manifest.json +32 -27
- package/apps/web/.next/standalone/apps/web/.next/server/chunks/6787.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/chunks/687.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/chunks/8137.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/functions-config-manifest.json +15 -10
- package/apps/web/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/server-reference-manifest.json +1 -1
- package/apps/web/.next/standalone/apps/web/.next/server/webpack-runtime.js +1 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/2716-475d96c202834586.js +135 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/cron/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/proxy/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/serve/[...path]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/store/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/webhooks/[...path]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/active/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/runs/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/stop/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/stream/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/subagents/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/jobs/[jobId]/runs/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/jobs/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/runs/[sessionId]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/runs/search-transcript/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/feedback/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/channels/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/chat/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/chat/stream/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/sessions/[id]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/sessions/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/memories/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/profiles/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/profiles/switch/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/sessions/[sessionId]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/sessions/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/skills/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/terminal/port/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/[id]/messages/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/[id]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/assets/[...path]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/browse/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/browse-file/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/context/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/copy/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/db/introspect/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/db/query/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/delete/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/execute/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/file/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/init/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/link-preview/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/list/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/mkdir/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/move/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/actions/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/actions/runs/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/display-field/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/content/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/bulk-delete/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/options/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/reorder/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/views/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/open-file/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/path-info/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/query/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/raw-file/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/rename/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/reports/execute/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/search-index/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/suggest-files/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/switch/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/thumbnail/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/tree/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/upload/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/virtual-file/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/watch/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/write-binary/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/{layout-2ada610571ddd42f.js → layout-f08988a91b85294a.js} +1 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/page-64cad81306c18be9.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/webpack-a769c08a3fea86bb.js +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/css/fb279c912601f360.css +1 -0
- package/apps/web/.next/standalone/apps/web/.next/static/xzgogMMcs02a6BQa5tMBA/_buildManifest.js +1 -0
- package/apps/web/.next/standalone/apps/web/lib/action-sdk-runtime.js +121 -0
- package/apps/web/.next/standalone/apps/web/package.json +1 -0
- package/apps/web/.next/standalone/apps/web/server.js +1 -1
- package/apps/web/.next/standalone/package.json +1 -1
- package/apps/web/.next/static/chunks/2716-475d96c202834586.js +135 -0
- package/apps/web/.next/static/chunks/app/api/apps/cron/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/apps/proxy/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/apps/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/apps/serve/[...path]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/apps/store/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/apps/webhooks/[...path]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/chat/active/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/chat/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/chat/runs/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/chat/stop/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/chat/stream/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/chat/subagents/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/cron/jobs/[jobId]/runs/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/cron/jobs/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/cron/runs/[sessionId]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/cron/runs/search-transcript/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/feedback/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/gateway/channels/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/gateway/chat/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/gateway/chat/stream/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/gateway/sessions/[id]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/gateway/sessions/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/memories/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/profiles/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/profiles/switch/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/sessions/[sessionId]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/sessions/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/skills/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/terminal/port/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/web-sessions/[id]/messages/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/web-sessions/[id]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/web-sessions/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/assets/[...path]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/browse/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/browse-file/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/context/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/copy/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/db/introspect/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/db/query/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/delete/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/execute/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/file/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/init/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/link-preview/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/list/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/mkdir/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/move/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/actions/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/actions/runs/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/display-field/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/content/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/bulk-delete/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/options/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/reorder/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/views/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/open-file/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/path-info/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/query/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/raw-file/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/rename/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/reports/execute/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/search-index/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/suggest-files/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/switch/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/thumbnail/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/tree/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/upload/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/virtual-file/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/watch/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/api/workspace/write-binary/route-d14ffafd970f186e.js +1 -0
- package/apps/web/.next/static/chunks/app/{layout-2ada610571ddd42f.js → layout-f08988a91b85294a.js} +1 -1
- package/apps/web/.next/static/chunks/app/page-64cad81306c18be9.js +1 -0
- package/apps/web/.next/static/chunks/webpack-a769c08a3fea86bb.js +1 -0
- package/apps/web/.next/static/css/fb279c912601f360.css +1 -0
- package/apps/web/.next/static/xzgogMMcs02a6BQa5tMBA/_buildManifest.js +1 -0
- package/assets/seed/schema.sql +15 -0
- package/dist/entry.js +1 -1
- package/dist/{program-IDoEjVLE.js → program-DcrLV9Z2.js} +8 -1
- package/dist/{run-main-D2k8GHwe.js → run-main-D7Ux65aN.js} +1 -1
- package/extensions/dench-identity/index.ts +1 -9
- package/extensions/posthog-analytics/lib/build-env.js +1 -1
- package/package.json +1 -1
- package/skills/crm/SKILL.md +49 -926
- package/skills/crm/actions/SKILL.md +600 -0
- package/skills/crm/documents/SKILL.md +64 -0
- package/skills/crm/duckdb-operations/SKILL.md +546 -0
- package/skills/crm/object-builder/SKILL.md +361 -0
- package/skills/crm/reports/SKILL.md +199 -0
- package/skills/crm/views-filters/SKILL.md +303 -0
- package/skills/gstack/SKILL.md +101 -0
- package/skills/gstack/benchmark/SKILL.md +86 -0
- package/skills/gstack/canary/SKILL.md +65 -0
- package/skills/gstack/careful/SKILL.md +66 -0
- package/skills/gstack/design-consultation/SKILL.md +90 -0
- package/skills/gstack/design-review/SKILL.md +72 -0
- package/skills/gstack/document-release/SKILL.md +112 -0
- package/skills/gstack/freeze/SKILL.md +57 -0
- package/skills/gstack/guard/SKILL.md +37 -0
- package/skills/gstack/investigate/SKILL.md +111 -0
- package/skills/gstack/land-and-deploy/SKILL.md +77 -0
- package/skills/gstack/office-hours/SKILL.md +105 -0
- package/skills/gstack/plan-ceo-review/SKILL.md +108 -0
- package/skills/gstack/plan-design-review/SKILL.md +99 -0
- package/skills/gstack/plan-eng-review/SKILL.md +129 -0
- package/skills/gstack/qa/SKILL.md +121 -0
- package/skills/gstack/qa-only/SKILL.md +51 -0
- package/skills/gstack/retro/SKILL.md +88 -0
- package/skills/gstack/review/SKILL.md +144 -0
- package/skills/gstack/ship/SKILL.md +126 -0
- package/skills/gstack/unfreeze/SKILL.md +23 -0
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/2597.f31531534ad0b96f.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/4652.ca2ab4e205060d84.js +0 -60
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/6861-58d368bcf4e23b55.js +0 -76
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/cron/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/proxy/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/serve/[...path]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/store/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/apps/webhooks/[...path]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/active/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/runs/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/stop/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/stream/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/subagents/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/jobs/[jobId]/runs/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/jobs/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/runs/[sessionId]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/runs/search-transcript/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/feedback/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/channels/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/chat/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/chat/stream/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/sessions/[id]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/gateway/sessions/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/memories/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/profiles/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/profiles/switch/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/sessions/[sessionId]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/sessions/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/skills/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/terminal/port/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/[id]/messages/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/[id]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/assets/[...path]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/browse/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/browse-file/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/context/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/copy/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/db/introspect/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/db/query/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/delete/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/execute/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/file/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/init/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/list/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/mkdir/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/move/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/display-field/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/bulk-delete/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/options/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/reorder/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/views/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/open-file/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/path-info/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/query/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/raw-file/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/rename/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/reports/execute/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/search-index/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/suggest-files/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/switch/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/thumbnail/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/tree/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/upload/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/virtual-file/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/watch/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/write-binary/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/page-a1a7eac29d935a3e.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/chunks/webpack-43066e1a249665ba.js +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/css/4c7acc74b29f04e2.css +0 -1
- package/apps/web/.next/standalone/apps/web/.next/static/kXwi5ZTYAYlvvWmNAsdo_/_buildManifest.js +0 -1
- package/apps/web/.next/static/chunks/2597.f31531534ad0b96f.js +0 -1
- package/apps/web/.next/static/chunks/4652.ca2ab4e205060d84.js +0 -60
- package/apps/web/.next/static/chunks/6861-58d368bcf4e23b55.js +0 -76
- package/apps/web/.next/static/chunks/app/api/apps/cron/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/apps/proxy/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/apps/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/apps/serve/[...path]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/apps/store/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/apps/webhooks/[...path]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/chat/active/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/chat/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/chat/runs/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/chat/stop/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/chat/stream/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/chat/subagents/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/cron/jobs/[jobId]/runs/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/cron/jobs/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/cron/runs/[sessionId]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/cron/runs/search-transcript/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/feedback/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/gateway/channels/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/gateway/chat/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/gateway/chat/stream/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/gateway/sessions/[id]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/gateway/sessions/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/memories/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/profiles/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/profiles/switch/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/sessions/[sessionId]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/sessions/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/skills/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/terminal/port/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/web-sessions/[id]/messages/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/web-sessions/[id]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/web-sessions/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/assets/[...path]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/browse/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/browse-file/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/context/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/copy/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/db/introspect/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/db/query/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/delete/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/execute/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/file/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/init/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/list/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/mkdir/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/move/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/display-field/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/bulk-delete/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/options/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/reorder/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/views/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/open-file/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/path-info/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/query/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/raw-file/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/rename/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/reports/execute/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/search-index/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/suggest-files/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/switch/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/thumbnail/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/tree/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/upload/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/virtual-file/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/watch/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/api/workspace/write-binary/route-580e9ace8a991c49.js +0 -1
- package/apps/web/.next/static/chunks/app/page-a1a7eac29d935a3e.js +0 -1
- package/apps/web/.next/static/chunks/webpack-43066e1a249665ba.js +0 -1
- package/apps/web/.next/static/css/4c7acc74b29f04e2.css +0 -1
- package/apps/web/.next/static/kXwi5ZTYAYlvvWmNAsdo_/_buildManifest.js +0 -1
- /package/apps/web/.next/standalone/apps/web/.next/static/{kXwi5ZTYAYlvvWmNAsdo_ → xzgogMMcs02a6BQa5tMBA}/_ssgManifest.js +0 -0
- /package/apps/web/.next/static/{kXwi5ZTYAYlvvWmNAsdo_ → xzgogMMcs02a6BQa5tMBA}/_ssgManifest.js +0 -0
package/skills/crm/SKILL.md
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
-
- **
|
|
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.
|
|
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`.
|