@agent-native/core 0.127.3 → 0.128.1
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/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +101 -0
- package/corpus/core/README.md +5 -26
- package/corpus/core/docs/content/actions.mdx +47 -4
- package/corpus/core/docs/content/native-chat-ui.mdx +7 -0
- package/corpus/core/docs/content/organizations-teams-permissions.mdx +109 -3
- package/corpus/core/docs/content/template-design-collaboration-and-full-apps.mdx +15 -0
- package/corpus/core/docs/content/toolkit-org-team.mdx +72 -12
- package/corpus/core/package.json +2 -1
- package/corpus/core/src/a2a/artifact-response.ts +36 -29
- package/corpus/core/src/action.ts +83 -2
- package/corpus/core/src/chat-threads/store.ts +48 -43
- package/corpus/core/src/cli/skills-content/design-visual-edit-skill.ts +46 -3
- package/corpus/core/src/client/AgentPanel.tsx +26 -6
- package/corpus/core/src/client/AssistantChat.tsx +63 -7
- package/corpus/core/src/client/DefaultSpinner.tsx +29 -0
- package/corpus/core/src/client/org/TeamPage.tsx +161 -6
- package/corpus/core/src/client/org/hooks.ts +67 -0
- package/corpus/core/src/client/org/index.ts +9 -0
- package/corpus/core/src/client/transcription/use-live-transcription.ts +62 -10
- package/corpus/core/src/db/client.ts +42 -3
- package/corpus/core/src/db/ensure-additive-columns.ts +60 -33
- package/corpus/core/src/deploy/build.ts +31 -2
- package/corpus/core/src/mcp-client/routes.ts +10 -1
- package/corpus/core/src/org/app-roles-handlers.ts +152 -0
- package/corpus/core/src/org/app-roles.ts +355 -0
- package/corpus/core/src/org/index.ts +27 -1
- package/corpus/core/src/org/migrations.ts +22 -0
- package/corpus/core/src/org/plugin.ts +27 -0
- package/corpus/core/src/org/schema.ts +15 -0
- package/corpus/core/src/scripts/docs/search.ts +17 -0
- package/corpus/core/src/scripts/docs/source-search.ts +10 -0
- package/corpus/core/src/server/agent-chat/script-entries.ts +3 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +53 -52
- package/corpus/core/src/server/builder-design-systems.ts +299 -82
- package/corpus/core/src/server/core-routes-plugin.ts +6 -1
- package/corpus/core/src/server/framework-request-handler.ts +44 -6
- package/corpus/core/src/server/index.ts +8 -0
- package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +7 -0
- package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +31 -0
- package/corpus/core/src/templates/headless/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +7 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +40 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +31 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/templates/analytics/.agents/skills/security/SKILL.md +31 -0
- package/corpus/templates/analytics/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/templates/analytics/_gitignore +2 -0
- package/corpus/templates/analytics/actions/data-source-status.ts +21 -12
- package/corpus/templates/analytics/app/global.css +7 -7
- package/corpus/templates/analytics/app/i18n-data.ts +30 -0
- package/corpus/templates/analytics/app/lib/data-source-status.ts +2 -1
- package/corpus/templates/analytics/app/pages/DataSources.tsx +54 -10
- package/corpus/templates/analytics/changelog/2026-07-28-analytics-pages-load-reliably-with-large-dashboard-workspaces.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-28-dashboard-loading-shimmer-now-flows-smoothly-in-one-directi.md +6 -0
- package/corpus/templates/analytics/server/lib/first-party-dashboard-repair.ts +5 -4
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +54 -42
- package/corpus/templates/analytics/server/plugins/db.ts +1 -18
- package/corpus/templates/assets/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/templates/assets/.agents/skills/security/SKILL.md +31 -0
- package/corpus/templates/assets/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/templates/assets/_gitignore +2 -0
- package/corpus/templates/brain/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +7 -0
- package/corpus/templates/brain/.agents/skills/security/SKILL.md +31 -0
- package/corpus/templates/brain/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/templates/calendar/.agents/skills/security/SKILL.md +31 -0
- package/corpus/templates/calendar/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/templates/calendar/_gitignore +2 -0
- package/corpus/templates/chat/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +7 -0
- package/corpus/templates/chat/.agents/skills/security/SKILL.md +31 -0
- package/corpus/templates/chat/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/templates/clips/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/templates/clips/.agents/skills/security/SKILL.md +31 -0
- package/corpus/templates/clips/_gitignore +2 -0
- package/corpus/templates/clips/actions/request-transcript.ts +77 -11
- package/corpus/templates/clips/actions/save-browser-transcript.ts +28 -7
- package/corpus/templates/clips/app/routes/record.tsx +11 -3
- package/corpus/templates/clips/changelog/2026-07-28-browser-recordings-no-longer-save-a-truncated-transcript-as-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-28-browser-recordings-no-longer-stop-transcribing-partway-throu.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-28-desktop-full-screen-clips-now-get-an-instant-local-transcrip.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-28-long-transcriptions-no-longer-show-a-false-transcription-sto.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-28-restarting-for-an-update-now-installs-the-newest-release-ins.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-28-the-meeting-recording-pill-now-anchors-to-the-right-edge-of-.md +6 -0
- package/corpus/templates/clips/desktop/src/lib/audio-meter.ts +31 -2
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +114 -13
- package/corpus/templates/clips/desktop/src/lib/updater.ts +12 -4
- package/corpus/templates/clips/desktop/src/overlays/live-audio-bars.tsx +40 -15
- package/corpus/templates/clips/desktop/src/styles.css +10 -7
- package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +21 -14
- package/corpus/templates/clips/shared/transcript-status.ts +10 -0
- package/corpus/templates/content/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/templates/content/.agents/skills/security/SKILL.md +31 -0
- package/corpus/templates/content/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/templates/content/_gitignore +2 -0
- package/corpus/templates/crm/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/templates/design/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/templates/design/.agents/skills/security/SKILL.md +31 -0
- package/corpus/templates/design/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +46 -3
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +7 -5
- package/corpus/templates/design/_gitignore +2 -0
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +2 -2
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +7 -4
- package/corpus/templates/design/app/components/design/keyboard-shortcuts.ts +1 -1
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +10 -4
- package/corpus/templates/design/app/i18n-data.ts +10 -0
- package/corpus/templates/design/app/lib/builder-design-system-upload.ts +280 -0
- package/corpus/templates/design/app/lib/design-ui-events.ts +5 -0
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +90 -54
- package/corpus/templates/design/app/root.tsx +18 -1
- package/corpus/templates/design/changelog/2026-07-28-figma-fig-uploads-now-show-indexing-progress-and-an-open-in-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-28-show-or-hide-design-editing-chrome-with-cmd-on-apple-devices.md +6 -0
- package/corpus/templates/design/server/handlers/design-system-decode-job-status.ts +49 -0
- package/corpus/templates/design/server/handlers/design-system-upload-start.ts +87 -0
- package/corpus/templates/design/server/handlers/index-design-system-sources.ts +82 -0
- package/corpus/templates/design/server/routes/api/design-system-decode-job-status.get.ts +1 -0
- package/corpus/templates/design/server/routes/api/design-system-upload-start.post.ts +1 -0
- package/corpus/templates/design/server/routes/api/index-design-system-sources.post.ts +1 -0
- package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +31 -0
- package/corpus/templates/dispatch/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/templates/dispatch/_gitignore +2 -0
- package/corpus/templates/forms/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/templates/forms/.agents/skills/security/SKILL.md +31 -0
- package/corpus/templates/forms/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/templates/forms/_gitignore +2 -0
- package/corpus/templates/macros/.agents/skills/security/SKILL.md +31 -0
- package/corpus/templates/macros/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/templates/macros/_gitignore +2 -0
- package/corpus/templates/mail/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/templates/mail/.agents/skills/security/SKILL.md +31 -0
- package/corpus/templates/mail/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/templates/mail/_gitignore +2 -0
- package/corpus/templates/plan/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +7 -0
- package/corpus/templates/plan/.agents/skills/security/SKILL.md +31 -0
- package/corpus/templates/plan/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/templates/plan/_gitignore +2 -0
- package/corpus/templates/slides/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/templates/slides/.agents/skills/security/SKILL.md +31 -0
- package/corpus/templates/slides/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/templates/slides/_gitignore +2 -0
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +126 -53
- package/corpus/templates/slides/app/components/design-system/builder-design-system-upload.ts +271 -0
- package/corpus/templates/slides/app/components/design-system/builder-index-response.ts +1 -1
- package/corpus/templates/slides/app/i18n/en-US.ts +1 -0
- package/corpus/templates/slides/server/handlers/design-system-decode-job-status.ts +49 -0
- package/corpus/templates/slides/server/handlers/design-system-upload-start.ts +87 -0
- package/corpus/templates/slides/server/handlers/index-design-system-sources.ts +79 -0
- package/corpus/templates/slides/server/routes/api/design-system-decode-job-status.get.ts +1 -0
- package/corpus/templates/slides/server/routes/api/design-system-upload-start.post.ts +1 -0
- package/corpus/templates/slides/server/routes/api/index-design-system-sources.post.ts +1 -0
- package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +32 -0
- package/corpus/templates/tasks/.agents/skills/adding-a-feature/SKILL.md +7 -0
- package/corpus/templates/tasks/.agents/skills/security/SKILL.md +31 -0
- package/corpus/templates/tasks/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/templates/tasks/_gitignore +2 -0
- package/dist/a2a/artifact-response.d.ts.map +1 -1
- package/dist/a2a/artifact-response.js +30 -29
- package/dist/a2a/artifact-response.js.map +1 -1
- package/dist/action.d.ts +36 -0
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js +37 -2
- package/dist/action.js.map +1 -1
- package/dist/chat-threads/store.d.ts +12 -0
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +48 -42
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/cli/skills-content/design-visual-edit-skill.d.ts +1 -1
- package/dist/cli/skills-content/design-visual-edit-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/design-visual-edit-skill.js +46 -3
- package/dist/cli/skills-content/design-visual-edit-skill.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +3 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +11 -9
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +57 -6
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/DefaultSpinner.d.ts +7 -0
- package/dist/client/DefaultSpinner.d.ts.map +1 -1
- package/dist/client/DefaultSpinner.js +25 -1
- package/dist/client/DefaultSpinner.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts +13 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +41 -11
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/org/hooks.d.ts +37 -0
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/org/hooks.js +37 -0
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/org/index.d.ts +3 -2
- package/dist/client/org/index.d.ts.map +1 -1
- package/dist/client/org/index.js +1 -1
- package/dist/client/org/index.js.map +1 -1
- package/dist/client/transcription/use-live-transcription.d.ts +8 -0
- package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
- package/dist/client/transcription/use-live-transcription.js +38 -11
- package/dist/client/transcription/use-live-transcription.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/db/client.d.ts +12 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +40 -3
- package/dist/db/client.js.map +1 -1
- package/dist/db/ensure-additive-columns.d.ts.map +1 -1
- package/dist/db/ensure-additive-columns.js +54 -32
- package/dist/db/ensure-additive-columns.js.map +1 -1
- package/dist/deploy/build.d.ts +1 -0
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +23 -2
- package/dist/deploy/build.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/mcp-client/routes.d.ts +3 -1
- package/dist/mcp-client/routes.d.ts.map +1 -1
- package/dist/mcp-client/routes.js +8 -2
- package/dist/mcp-client/routes.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/org/app-roles-handlers.d.ts +27 -0
- package/dist/org/app-roles-handlers.d.ts.map +1 -0
- package/dist/org/app-roles-handlers.js +125 -0
- package/dist/org/app-roles-handlers.js.map +1 -0
- package/dist/org/app-roles.d.ts +136 -0
- package/dist/org/app-roles.d.ts.map +1 -0
- package/dist/org/app-roles.js +216 -0
- package/dist/org/app-roles.js.map +1 -0
- package/dist/org/index.d.ts +4 -1
- package/dist/org/index.d.ts.map +1 -1
- package/dist/org/index.js +3 -1
- package/dist/org/index.js.map +1 -1
- package/dist/org/migrations.d.ts.map +1 -1
- package/dist/org/migrations.js +22 -0
- package/dist/org/migrations.js.map +1 -1
- package/dist/org/plugin.d.ts +2 -0
- package/dist/org/plugin.d.ts.map +1 -1
- package/dist/org/plugin.js +20 -0
- package/dist/org/plugin.js.map +1 -1
- package/dist/org/schema.d.ts +143 -0
- package/dist/org/schema.d.ts.map +1 -1
- package/dist/org/schema.js +14 -0
- package/dist/org/schema.js.map +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
- package/dist/provider-api/actions/provider-api.d.ts +4 -4
- package/dist/scripts/docs/search.d.ts.map +1 -1
- package/dist/scripts/docs/search.js +15 -0
- package/dist/scripts/docs/search.js.map +1 -1
- package/dist/scripts/docs/source-search.d.ts +7 -0
- package/dist/scripts/docs/source-search.d.ts.map +1 -1
- package/dist/scripts/docs/source-search.js +9 -0
- package/dist/scripts/docs/source-search.js.map +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/agent-chat/script-entries.d.ts.map +1 -1
- package/dist/server/agent-chat/script-entries.js +3 -0
- package/dist/server/agent-chat/script-entries.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +46 -48
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/builder-design-systems.d.ts +49 -0
- package/dist/server/builder-design-systems.d.ts.map +1 -1
- package/dist/server/builder-design-systems.js +221 -69
- package/dist/server/builder-design-systems.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +6 -1
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +42 -6
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/templates/chat/.agents/skills/actions/SKILL.md +32 -0
- package/dist/templates/chat/.agents/skills/adding-a-feature/SKILL.md +7 -0
- package/dist/templates/chat/.agents/skills/security/SKILL.md +31 -0
- package/dist/templates/chat/.agents/skills/sharing/SKILL.md +4 -0
- package/dist/templates/default/.agents/skills/actions/SKILL.md +32 -0
- package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +7 -0
- package/dist/templates/default/.agents/skills/security/SKILL.md +31 -0
- package/dist/templates/headless/.agents/skills/actions/SKILL.md +32 -0
- package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +32 -0
- package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +7 -0
- package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +40 -0
- package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +31 -0
- package/dist/templates/workspace-core/.agents/skills/sharing/SKILL.md +4 -0
- package/docs/content/actions.mdx +47 -4
- package/docs/content/native-chat-ui.mdx +7 -0
- package/docs/content/organizations-teams-permissions.mdx +109 -3
- package/docs/content/template-design-collaboration-and-full-apps.mdx +15 -0
- package/docs/content/toolkit-org-team.mdx +72 -12
- package/package.json +2 -1
- package/src/a2a/artifact-response.ts +36 -29
- package/src/action.ts +83 -2
- package/src/chat-threads/store.ts +48 -43
- package/src/cli/skills-content/design-visual-edit-skill.ts +46 -3
- package/src/client/AgentPanel.tsx +26 -6
- package/src/client/AssistantChat.tsx +63 -7
- package/src/client/DefaultSpinner.tsx +29 -0
- package/src/client/org/TeamPage.tsx +161 -6
- package/src/client/org/hooks.ts +67 -0
- package/src/client/org/index.ts +9 -0
- package/src/client/transcription/use-live-transcription.ts +62 -10
- package/src/db/client.ts +42 -3
- package/src/db/ensure-additive-columns.ts +60 -33
- package/src/deploy/build.ts +31 -2
- package/src/mcp-client/routes.ts +10 -1
- package/src/org/app-roles-handlers.ts +152 -0
- package/src/org/app-roles.ts +355 -0
- package/src/org/index.ts +27 -1
- package/src/org/migrations.ts +22 -0
- package/src/org/plugin.ts +27 -0
- package/src/org/schema.ts +15 -0
- package/src/scripts/docs/search.ts +17 -0
- package/src/scripts/docs/source-search.ts +10 -0
- package/src/server/agent-chat/script-entries.ts +3 -0
- package/src/server/agent-chat-plugin.ts +53 -52
- package/src/server/builder-design-systems.ts +299 -82
- package/src/server/core-routes-plugin.ts +6 -1
- package/src/server/framework-request-handler.ts +44 -6
- package/src/server/index.ts +8 -0
- package/src/templates/chat/.agents/skills/actions/SKILL.md +32 -0
- package/src/templates/chat/.agents/skills/adding-a-feature/SKILL.md +7 -0
- package/src/templates/chat/.agents/skills/security/SKILL.md +31 -0
- package/src/templates/chat/.agents/skills/sharing/SKILL.md +4 -0
- package/src/templates/default/.agents/skills/actions/SKILL.md +32 -0
- package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +7 -0
- package/src/templates/default/.agents/skills/security/SKILL.md +31 -0
- package/src/templates/headless/.agents/skills/actions/SKILL.md +32 -0
- package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +32 -0
- package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +7 -0
- package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +40 -0
- package/src/templates/workspace-core/.agents/skills/security/SKILL.md +31 -0
- package/src/templates/workspace-core/.agents/skills/sharing/SKILL.md +4 -0
- package/corpus/core/src/templates/chat/.agents/skills/actions/SKILL.md +0 -530
- package/corpus/core/src/templates/chat/.agents/skills/adding-a-feature/SKILL.md +0 -191
- package/corpus/core/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +0 -115
- package/corpus/core/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +0 -177
- package/corpus/core/src/templates/chat/.agents/skills/capture-learnings/SKILL.md +0 -89
- package/corpus/core/src/templates/chat/.agents/skills/create-skill/SKILL.md +0 -221
- package/corpus/core/src/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +0 -220
- package/corpus/core/src/templates/chat/.agents/skills/delegate-to-agent/SKILL.md +0 -263
- package/corpus/core/src/templates/chat/.agents/skills/feature-flags/SKILL.md +0 -169
- package/corpus/core/src/templates/chat/.agents/skills/frontend-design/SKILL.md +0 -174
- package/corpus/core/src/templates/chat/.agents/skills/real-time-sync/SKILL.md +0 -232
- package/corpus/core/src/templates/chat/.agents/skills/security/SKILL.md +0 -282
- package/corpus/core/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +0 -119
- package/corpus/core/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +0 -123
- package/corpus/core/src/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +0 -122
- package/corpus/core/src/templates/chat/.env.example +0 -5
- package/corpus/core/src/templates/chat/.ignore +0 -0
- package/corpus/core/src/templates/chat/.oxfmtrc.json +0 -8
- package/corpus/core/src/templates/chat/AGENTS.md +0 -77
- package/corpus/core/src/templates/chat/CHANGELOG.md +0 -10
- package/corpus/core/src/templates/chat/DEVELOPING.md +0 -185
- package/corpus/core/src/templates/chat/README.md +0 -32
- package/corpus/core/src/templates/chat/_gitignore +0 -46
- package/corpus/core/src/templates/chat/actions/hello.ts +0 -13
- package/corpus/core/src/templates/chat/actions/navigate.ts +0 -41
- package/corpus/core/src/templates/chat/actions/run.ts +0 -2
- package/corpus/core/src/templates/chat/actions/view-screen.ts +0 -31
- package/corpus/core/src/templates/chat/app/components/layout/Header.tsx +0 -60
- package/corpus/core/src/templates/chat/app/components/layout/Layout.tsx +0 -188
- package/corpus/core/src/templates/chat/app/components/layout/Sidebar.tsx +0 -505
- package/corpus/core/src/templates/chat/app/components/ui/button.tsx +0 -1
- package/corpus/core/src/templates/chat/app/components/ui/card.tsx +0 -1
- package/corpus/core/src/templates/chat/app/components/ui/dropdown-menu.tsx +0 -1
- package/corpus/core/src/templates/chat/app/components/ui/input.tsx +0 -1
- package/corpus/core/src/templates/chat/app/components/ui/label.tsx +0 -1
- package/corpus/core/src/templates/chat/app/components/ui/sheet.tsx +0 -1
- package/corpus/core/src/templates/chat/app/components/ui/toolkit-provider.tsx +0 -17
- package/corpus/core/src/templates/chat/app/components/ui/tooltip.tsx +0 -1
- package/corpus/core/src/templates/chat/app/design-system.ts +0 -3
- package/corpus/core/src/templates/chat/app/entry.client.tsx +0 -22
- package/corpus/core/src/templates/chat/app/entry.server.tsx +0 -10
- package/corpus/core/src/templates/chat/app/global.css +0 -93
- package/corpus/core/src/templates/chat/app/hooks/use-navigation-state.ts +0 -93
- package/corpus/core/src/templates/chat/app/i18n/ar-SA.ts +0 -68
- package/corpus/core/src/templates/chat/app/i18n/de-DE.ts +0 -71
- package/corpus/core/src/templates/chat/app/i18n/en-US.ts +0 -70
- package/corpus/core/src/templates/chat/app/i18n/es-ES.ts +0 -71
- package/corpus/core/src/templates/chat/app/i18n/fr-FR.ts +0 -71
- package/corpus/core/src/templates/chat/app/i18n/hi-IN.ts +0 -69
- package/corpus/core/src/templates/chat/app/i18n/index.ts +0 -34
- package/corpus/core/src/templates/chat/app/i18n/ja-JP.ts +0 -70
- package/corpus/core/src/templates/chat/app/i18n/ko-KR.ts +0 -70
- package/corpus/core/src/templates/chat/app/i18n/pt-BR.ts +0 -71
- package/corpus/core/src/templates/chat/app/i18n/zh-CN.ts +0 -66
- package/corpus/core/src/templates/chat/app/i18n/zh-TW.ts +0 -66
- package/corpus/core/src/templates/chat/app/i18n-data.ts +0 -556
- package/corpus/core/src/templates/chat/app/lib/agent-page.tsx +0 -49
- package/corpus/core/src/templates/chat/app/lib/app-config.ts +0 -11
- package/corpus/core/src/templates/chat/app/lib/tab-id.ts +0 -1
- package/corpus/core/src/templates/chat/app/lib/utils.ts +0 -1
- package/corpus/core/src/templates/chat/app/root.tsx +0 -173
- package/corpus/core/src/templates/chat/app/routes/_index.tsx +0 -94
- package/corpus/core/src/templates/chat/app/routes/agent.tsx +0 -24
- package/corpus/core/src/templates/chat/app/routes/chat.$threadId.tsx +0 -1
- package/corpus/core/src/templates/chat/app/routes/database.tsx +0 -17
- package/corpus/core/src/templates/chat/app/routes/extensions.$id.$slug.tsx +0 -2
- package/corpus/core/src/templates/chat/app/routes/extensions.$id.tsx +0 -11
- package/corpus/core/src/templates/chat/app/routes/extensions._index.tsx +0 -11
- package/corpus/core/src/templates/chat/app/routes/extensions.tsx +0 -5
- package/corpus/core/src/templates/chat/app/routes/observability.tsx +0 -19
- package/corpus/core/src/templates/chat/app/routes/settings.tsx +0 -89
- package/corpus/core/src/templates/chat/app/routes/team.tsx +0 -11
- package/corpus/core/src/templates/chat/app/routes.ts +0 -4
- package/corpus/core/src/templates/chat/app/vite-env.d.ts +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-06-29-chat-layouts-adapt-when-the-agent-sidebar-is-open.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +0 -5
- package/corpus/core/src/templates/chat/changelog/2026-07-10-chat-now-makes-ai-connection-setup-clear-without-shifting-th.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-07-13-a-full-agent-page-now-brings-context-files-connections-jobs-.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-07-14-chat-opens-reliably-on-hosted-deployments-instead-of-failing.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-07-14-fixed-chat-template-startup-with-older-core-versions.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-07-15-chat-navigation-focuses-on-chat-and-agent.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-07-22-compact-sidebar-footer.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-07-22-recent-chats-are-easier-to-scan-and-expand.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-07-23-full-page-chat-is-better-centered-with-quieter-chat-history-.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +0 -6
- package/corpus/core/src/templates/chat/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +0 -6
- package/corpus/core/src/templates/chat/components.json +0 -20
- package/corpus/core/src/templates/chat/learnings.defaults.md +0 -5
- package/corpus/core/src/templates/chat/netlify.toml +0 -11
- package/corpus/core/src/templates/chat/package.json +0 -92
- package/corpus/core/src/templates/chat/public/agent-native-icon-dark.svg +0 -10
- package/corpus/core/src/templates/chat/public/agent-native-icon-light.svg +0 -10
- package/corpus/core/src/templates/chat/public/agent-native-logo-dark.svg +0 -21
- package/corpus/core/src/templates/chat/public/agent-native-logo-light.svg +0 -21
- package/corpus/core/src/templates/chat/public/favicon.svg +0 -1
- package/corpus/core/src/templates/chat/public/icon-180.svg +0 -1
- package/corpus/core/src/templates/chat/public/icon-192.svg +0 -1
- package/corpus/core/src/templates/chat/public/icon-512.svg +0 -1
- package/corpus/core/src/templates/chat/public/manifest.json +0 -21
- package/corpus/core/src/templates/chat/react-router.config.ts +0 -7
- package/corpus/core/src/templates/chat/server/middleware/auth.ts +0 -15
- package/corpus/core/src/templates/chat/server/plugins/agent-chat.ts +0 -21
- package/corpus/core/src/templates/chat/server/plugins/auth.ts +0 -17
- package/corpus/core/src/templates/chat/server/routes/[...page].get.ts +0 -5
- package/corpus/core/src/templates/chat/ssr-entry.ts +0 -15
- package/corpus/core/src/templates/chat/tsconfig.json +0 -21
- package/corpus/core/src/templates/chat/vite.config.ts +0 -19
- package/corpus/templates/design/server/handlers/index-design-system-with-builder.ts +0 -151
- package/corpus/templates/design/server/routes/api/index-design-system-with-builder.post.ts +0 -1
- package/corpus/templates/slides/server/handlers/index-design-system-with-builder.ts +0 -119
- package/corpus/templates/slides/server/routes/api/index-design-system-with-builder.post.ts +0 -1
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { appApiPath } from "@agent-native/core/client/api-path";
|
|
2
1
|
import { useActionQuery } from "@agent-native/core/client/hooks";
|
|
3
2
|
import { useT } from "@agent-native/core/client/i18n";
|
|
4
3
|
import { openAgentSidebar } from "@agent-native/core/client/navigation";
|
|
@@ -30,6 +29,11 @@ import { Input } from "@/components/ui/input";
|
|
|
30
29
|
import { Spinner } from "@/components/ui/spinner";
|
|
31
30
|
import { Textarea } from "@/components/ui/textarea";
|
|
32
31
|
import { sendToDesignAgentChat } from "@/lib/agent-chat";
|
|
32
|
+
import {
|
|
33
|
+
uploadAndIndexFigmaFiles,
|
|
34
|
+
pollDecodeJobStatus,
|
|
35
|
+
type DecodeJobStatus,
|
|
36
|
+
} from "@/lib/builder-design-system-upload";
|
|
33
37
|
|
|
34
38
|
interface GitHubLink {
|
|
35
39
|
id: string;
|
|
@@ -58,20 +62,6 @@ interface BuilderIndexResult {
|
|
|
58
62
|
instructions?: string;
|
|
59
63
|
}
|
|
60
64
|
|
|
61
|
-
async function readJsonResponse(res: Response): Promise<any> {
|
|
62
|
-
const text = await res.text();
|
|
63
|
-
if (!text.trim()) return {};
|
|
64
|
-
try {
|
|
65
|
-
return JSON.parse(text);
|
|
66
|
-
} catch {
|
|
67
|
-
return {
|
|
68
|
-
error: res.ok
|
|
69
|
-
? "The server returned an invalid response."
|
|
70
|
-
: text.slice(0, 240),
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
65
|
export default function DesignSystemSetup() {
|
|
76
66
|
const t = useT();
|
|
77
67
|
const navigate = useNavigate();
|
|
@@ -117,6 +107,62 @@ export default function DesignSystemSetup() {
|
|
|
117
107
|
const [builderIndexError, setBuilderIndexError] = useState<string | null>(
|
|
118
108
|
null,
|
|
119
109
|
);
|
|
110
|
+
const [decodeStatus, setDecodeStatus] = useState<DecodeJobStatus | null>(
|
|
111
|
+
null,
|
|
112
|
+
);
|
|
113
|
+
const decodePollRef = useRef<AbortController | null>(null);
|
|
114
|
+
|
|
115
|
+
const stopDecodePolling = useCallback(() => {
|
|
116
|
+
decodePollRef.current?.abort();
|
|
117
|
+
decodePollRef.current = null;
|
|
118
|
+
}, []);
|
|
119
|
+
|
|
120
|
+
useEffect(() => stopDecodePolling, [stopDecodePolling]);
|
|
121
|
+
|
|
122
|
+
const startDecodePolling = useCallback(
|
|
123
|
+
(jobId: string, indexResult: BuilderIndexResult) => {
|
|
124
|
+
decodePollRef.current?.abort();
|
|
125
|
+
const controller = new AbortController();
|
|
126
|
+
decodePollRef.current = controller;
|
|
127
|
+
setDecodeStatus({
|
|
128
|
+
status: "pending",
|
|
129
|
+
branchUrl: null,
|
|
130
|
+
error: null,
|
|
131
|
+
framesProcessed: 0,
|
|
132
|
+
totalFrames: 0,
|
|
133
|
+
});
|
|
134
|
+
pollDecodeJobStatus(jobId, {
|
|
135
|
+
signal: controller.signal,
|
|
136
|
+
onUpdate: (status) => {
|
|
137
|
+
if (!controller.signal.aborted) setDecodeStatus(status);
|
|
138
|
+
},
|
|
139
|
+
})
|
|
140
|
+
.then((status) => {
|
|
141
|
+
if (controller.signal.aborted) return;
|
|
142
|
+
setDecodeStatus(status);
|
|
143
|
+
setBuilderIndexResult(
|
|
144
|
+
status.branchUrl
|
|
145
|
+
? { ...indexResult, builderUrl: status.branchUrl }
|
|
146
|
+
: indexResult,
|
|
147
|
+
);
|
|
148
|
+
setBuilderIndexing(false);
|
|
149
|
+
})
|
|
150
|
+
.catch((err: unknown) => {
|
|
151
|
+
if (controller.signal.aborted) return;
|
|
152
|
+
if (err instanceof DOMException && err.name === "AbortError") return;
|
|
153
|
+
setDecodeStatus((prev) => ({
|
|
154
|
+
status: "error",
|
|
155
|
+
branchUrl: prev?.branchUrl ?? null,
|
|
156
|
+
error: err instanceof Error ? err.message : String(err),
|
|
157
|
+
framesProcessed: prev?.framesProcessed ?? 0,
|
|
158
|
+
totalFrames: prev?.totalFrames ?? 0,
|
|
159
|
+
}));
|
|
160
|
+
setBuilderIndexResult(indexResult);
|
|
161
|
+
setBuilderIndexing(false);
|
|
162
|
+
});
|
|
163
|
+
},
|
|
164
|
+
[],
|
|
165
|
+
);
|
|
120
166
|
|
|
121
167
|
const handleBuilderIndexUpload = useCallback(
|
|
122
168
|
async (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
@@ -129,33 +175,35 @@ export default function DesignSystemSetup() {
|
|
|
129
175
|
}
|
|
130
176
|
setBuilderIndexError(null);
|
|
131
177
|
setBuilderIndexResult(null);
|
|
178
|
+
stopDecodePolling();
|
|
179
|
+
setDecodeStatus(null);
|
|
132
180
|
setBuilderIndexing(true);
|
|
133
181
|
try {
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
182
|
+
const suggestedTitle =
|
|
183
|
+
file.name
|
|
184
|
+
.replace(/\.fig$/i, "")
|
|
185
|
+
.replace(/[-_]+/g, " ")
|
|
186
|
+
.trim() || "Imported brand";
|
|
187
|
+
const json = await uploadAndIndexFigmaFiles([file], {
|
|
188
|
+
projectName: suggestedTitle,
|
|
189
|
+
});
|
|
190
|
+
const parsed = json as unknown as BuilderIndexResult;
|
|
191
|
+
if (parsed.jobId) {
|
|
192
|
+
startDecodePolling(parsed.jobId, parsed);
|
|
193
|
+
} else {
|
|
194
|
+
setBuilderIndexResult(parsed);
|
|
195
|
+
setBuilderIndexing(false);
|
|
146
196
|
}
|
|
147
|
-
setBuilderIndexResult(json as BuilderIndexResult);
|
|
148
197
|
} catch (err) {
|
|
149
198
|
setBuilderIndexError(
|
|
150
199
|
err instanceof Error
|
|
151
200
|
? err.message
|
|
152
201
|
: t("designSystemSetup.errors.parseFig"),
|
|
153
202
|
);
|
|
154
|
-
} finally {
|
|
155
203
|
setBuilderIndexing(false);
|
|
156
204
|
}
|
|
157
205
|
},
|
|
158
|
-
[t],
|
|
206
|
+
[t, startDecodePolling, stopDecodePolling],
|
|
159
207
|
);
|
|
160
208
|
|
|
161
209
|
useEffect(() => {
|
|
@@ -606,7 +654,10 @@ export default function DesignSystemSetup() {
|
|
|
606
654
|
) : (
|
|
607
655
|
<BuilderIndexPreview
|
|
608
656
|
result={builderIndexResult}
|
|
657
|
+
decodeStatus={decodeStatus}
|
|
609
658
|
onReset={() => {
|
|
659
|
+
stopDecodePolling();
|
|
660
|
+
setDecodeStatus(null);
|
|
610
661
|
setBuilderIndexResult(null);
|
|
611
662
|
setBuilderIndexError(null);
|
|
612
663
|
}}
|
|
@@ -1076,12 +1127,16 @@ function FileList({
|
|
|
1076
1127
|
|
|
1077
1128
|
function BuilderIndexPreview({
|
|
1078
1129
|
result,
|
|
1130
|
+
decodeStatus,
|
|
1079
1131
|
onReset,
|
|
1080
1132
|
}: {
|
|
1081
1133
|
result: BuilderIndexResult;
|
|
1134
|
+
decodeStatus: DecodeJobStatus | null;
|
|
1082
1135
|
onReset: () => void;
|
|
1083
1136
|
}) {
|
|
1084
1137
|
const t = useT();
|
|
1138
|
+
const decodeError =
|
|
1139
|
+
decodeStatus?.status === "error" ? decodeStatus.error : null;
|
|
1085
1140
|
|
|
1086
1141
|
return (
|
|
1087
1142
|
<div className="space-y-4 rounded-xl border border-border bg-card p-4">
|
|
@@ -1101,30 +1156,11 @@ function BuilderIndexPreview({
|
|
|
1101
1156
|
</div>
|
|
1102
1157
|
</div>
|
|
1103
1158
|
|
|
1104
|
-
|
|
1105
|
-
<
|
|
1106
|
-
{"
|
|
1107
|
-
</
|
|
1108
|
-
|
|
1109
|
-
<dt className="text-muted-foreground">
|
|
1110
|
-
{"Project" /* i18n-ignore Builder indexing field */}
|
|
1111
|
-
</dt>
|
|
1112
|
-
<dd className="truncate font-mono !text-[11px] text-foreground/80">
|
|
1113
|
-
{result.projectId}
|
|
1114
|
-
</dd>
|
|
1115
|
-
<dt className="text-muted-foreground">
|
|
1116
|
-
{"Job" /* i18n-ignore Builder indexing field */}
|
|
1117
|
-
</dt>
|
|
1118
|
-
<dd className="truncate font-mono !text-[11px] text-foreground/80">
|
|
1119
|
-
{result.jobId}
|
|
1120
|
-
</dd>
|
|
1121
|
-
<dt className="text-muted-foreground">
|
|
1122
|
-
{"Design system" /* i18n-ignore Builder indexing field */}
|
|
1123
|
-
</dt>
|
|
1124
|
-
<dd className="truncate font-mono !text-[11px] text-foreground/80">
|
|
1125
|
-
{result.designSystemId}
|
|
1126
|
-
</dd>
|
|
1127
|
-
</dl>
|
|
1159
|
+
{decodeError ? (
|
|
1160
|
+
<p role="alert" className="text-xs text-destructive">
|
|
1161
|
+
{t("designSystemSetup.figmaDecodeFailed", { error: decodeError })}
|
|
1162
|
+
</p>
|
|
1163
|
+
) : null}
|
|
1128
1164
|
|
|
1129
1165
|
<div className="flex items-center gap-2 border-t border-border pt-4">
|
|
1130
1166
|
{result.builderUrl ? (
|
|
@@ -13,7 +13,12 @@ import {
|
|
|
13
13
|
useCommandMenuShortcut,
|
|
14
14
|
} from "@agent-native/core/client/navigation";
|
|
15
15
|
import { getThemeInitScript } from "@agent-native/core/client/ui";
|
|
16
|
-
import {
|
|
16
|
+
import {
|
|
17
|
+
IconArrowsMaximize,
|
|
18
|
+
IconHierarchy2,
|
|
19
|
+
IconSun,
|
|
20
|
+
IconMoon,
|
|
21
|
+
} from "@tabler/icons-react";
|
|
17
22
|
import { useQueryClient } from "@tanstack/react-query";
|
|
18
23
|
import { useTheme } from "next-themes";
|
|
19
24
|
import { useCallback, useState } from "react";
|
|
@@ -31,6 +36,7 @@ import type { LinksFunction } from "react-router";
|
|
|
31
36
|
import { Layout as AppLayout } from "@/components/layout/Layout";
|
|
32
37
|
import { Toaster } from "@/components/ui/sonner";
|
|
33
38
|
import { AppToolkitProvider } from "@/components/ui/toolkit-provider";
|
|
39
|
+
import { requestDesignUiToggle } from "@/lib/design-ui-events";
|
|
34
40
|
|
|
35
41
|
import changelog from "../CHANGELOG.md?raw";
|
|
36
42
|
import { i18nCatalog } from "./i18n";
|
|
@@ -128,7 +134,9 @@ function DesignCommandMenu({
|
|
|
128
134
|
onOpenChange: (open: boolean) => void;
|
|
129
135
|
}) {
|
|
130
136
|
const t = useT();
|
|
137
|
+
const location = useLocation();
|
|
131
138
|
const navigate = useNavigate();
|
|
139
|
+
const isDesignEditor = location.pathname.startsWith("/design/");
|
|
132
140
|
return (
|
|
133
141
|
<CommandMenu
|
|
134
142
|
open={open}
|
|
@@ -146,6 +154,15 @@ function DesignCommandMenu({
|
|
|
146
154
|
</CommandMenu.Item>
|
|
147
155
|
</CommandMenu.Group>
|
|
148
156
|
<CommandMenu.Group heading={t("root.commandAppearance")}>
|
|
157
|
+
{isDesignEditor ? (
|
|
158
|
+
<CommandMenu.Item
|
|
159
|
+
onSelect={requestDesignUiToggle}
|
|
160
|
+
keywords={["canvas", "focus", "panels", "hide ui", "show ui"]}
|
|
161
|
+
>
|
|
162
|
+
<IconArrowsMaximize size={16} />
|
|
163
|
+
{t("designEditor.keyboardShortcuts.commands.toggleUi")}
|
|
164
|
+
</CommandMenu.Item>
|
|
165
|
+
) : null}
|
|
149
166
|
<ThemeToggleItem />
|
|
150
167
|
</CommandMenu.Group>
|
|
151
168
|
</CommandMenu>
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FeatureNotConfiguredError,
|
|
3
|
+
fetchBuilderDesignSystemDecodeJobStatus,
|
|
4
|
+
getSession,
|
|
5
|
+
runWithRequestContext,
|
|
6
|
+
} from "@agent-native/core/server";
|
|
7
|
+
import { defineEventHandler, getQuery, setResponseStatus } from "h3";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Reads a Builder design-system decode job's status. The UI polls this after
|
|
11
|
+
* `/api/index-design-system-sources` returns a jobId, until the `.fig` decode
|
|
12
|
+
* job leaves `pending` and exposes a `branchUrl` (or reports an `error`).
|
|
13
|
+
*/
|
|
14
|
+
export const designSystemDecodeJobStatus = defineEventHandler(async (event) => {
|
|
15
|
+
const session = await getSession(event).catch(() => null);
|
|
16
|
+
if (!session?.email) {
|
|
17
|
+
setResponseStatus(event, 401);
|
|
18
|
+
return { error: "Unauthorized" };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const jobId = getQuery(event).jobId;
|
|
22
|
+
if (typeof jobId !== "string" || !jobId.trim()) {
|
|
23
|
+
setResponseStatus(event, 400);
|
|
24
|
+
return { error: "jobId is required." };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
return await runWithRequestContext(
|
|
29
|
+
{ userEmail: session.email, orgId: session.orgId },
|
|
30
|
+
() => fetchBuilderDesignSystemDecodeJobStatus(jobId.trim()),
|
|
31
|
+
);
|
|
32
|
+
} catch (err) {
|
|
33
|
+
if (err instanceof FeatureNotConfiguredError) {
|
|
34
|
+
setResponseStatus(event, 412);
|
|
35
|
+
return {
|
|
36
|
+
error: err.message,
|
|
37
|
+
builderConnectUrl:
|
|
38
|
+
err.builderConnectUrl ?? "/_agent-native/builder/connect",
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
setResponseStatus(event, 502);
|
|
42
|
+
return {
|
|
43
|
+
error:
|
|
44
|
+
err instanceof Error
|
|
45
|
+
? err.message
|
|
46
|
+
: "Failed to read decode job status.",
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
});
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FeatureNotConfiguredError,
|
|
3
|
+
getSession,
|
|
4
|
+
runWithRequestContext,
|
|
5
|
+
startBuilderDesignSystemUpload,
|
|
6
|
+
} from "@agent-native/core/server";
|
|
7
|
+
import { defineEventHandler, readBody, setResponseStatus } from "h3";
|
|
8
|
+
|
|
9
|
+
const MAX_FIG_BYTES = 512 * 1024 * 1024;
|
|
10
|
+
|
|
11
|
+
interface AttachmentInput {
|
|
12
|
+
name?: unknown;
|
|
13
|
+
mimetype?: unknown;
|
|
14
|
+
declaredSize?: unknown;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Opens signed resumable-upload slots so the browser can stream large `.fig`
|
|
19
|
+
* bytes straight to storage. Only small JSON metadata rides through the app
|
|
20
|
+
* server; the file bytes never do.
|
|
21
|
+
*/
|
|
22
|
+
export const designSystemUploadStart = defineEventHandler(async (event) => {
|
|
23
|
+
const session = await getSession(event).catch(() => null);
|
|
24
|
+
if (!session?.email) {
|
|
25
|
+
setResponseStatus(event, 401);
|
|
26
|
+
return { error: "Unauthorized" };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const body = (await readBody(event).catch(() => null)) as {
|
|
30
|
+
attachments?: AttachmentInput[];
|
|
31
|
+
} | null;
|
|
32
|
+
const rawList = Array.isArray(body?.attachments) ? body.attachments : [];
|
|
33
|
+
if (rawList.length === 0) {
|
|
34
|
+
setResponseStatus(event, 400);
|
|
35
|
+
return { error: "No attachments provided." };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const attachments: {
|
|
39
|
+
name: string;
|
|
40
|
+
mimetype: string;
|
|
41
|
+
declaredSize: number;
|
|
42
|
+
}[] = [];
|
|
43
|
+
for (const raw of rawList) {
|
|
44
|
+
const name = typeof raw?.name === "string" ? raw.name.trim() : "";
|
|
45
|
+
const mimetype =
|
|
46
|
+
typeof raw?.mimetype === "string" && raw.mimetype.trim()
|
|
47
|
+
? raw.mimetype.trim()
|
|
48
|
+
: "application/octet-stream";
|
|
49
|
+
const declaredSize = Number(raw?.declaredSize);
|
|
50
|
+
if (!name) {
|
|
51
|
+
setResponseStatus(event, 400);
|
|
52
|
+
return { error: "Attachment name is required." };
|
|
53
|
+
}
|
|
54
|
+
if (!Number.isSafeInteger(declaredSize) || declaredSize <= 0) {
|
|
55
|
+
setResponseStatus(event, 400);
|
|
56
|
+
return { error: "Attachment declaredSize must be a positive integer." };
|
|
57
|
+
}
|
|
58
|
+
if (declaredSize > MAX_FIG_BYTES) {
|
|
59
|
+
setResponseStatus(event, 413);
|
|
60
|
+
return {
|
|
61
|
+
error: `File too large (max ${Math.round(MAX_FIG_BYTES / 1024 / 1024)} MB).`,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
attachments.push({ name, mimetype, declaredSize });
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
try {
|
|
68
|
+
const uploads = await runWithRequestContext(
|
|
69
|
+
{ userEmail: session.email, orgId: session.orgId },
|
|
70
|
+
() => startBuilderDesignSystemUpload(attachments),
|
|
71
|
+
);
|
|
72
|
+
return { uploads };
|
|
73
|
+
} catch (err) {
|
|
74
|
+
if (err instanceof FeatureNotConfiguredError) {
|
|
75
|
+
setResponseStatus(event, 412);
|
|
76
|
+
return {
|
|
77
|
+
error: err.message,
|
|
78
|
+
builderConnectUrl:
|
|
79
|
+
err.builderConnectUrl ?? "/_agent-native/builder/connect",
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
setResponseStatus(event, 502);
|
|
83
|
+
return {
|
|
84
|
+
error: err instanceof Error ? err.message : "Failed to start upload.",
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
});
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FeatureNotConfiguredError,
|
|
3
|
+
getSession,
|
|
4
|
+
indexBuilderDesignSystem,
|
|
5
|
+
runWithRequestContext,
|
|
6
|
+
} from "@agent-native/core/server";
|
|
7
|
+
import { defineEventHandler, readBody, setResponseStatus } from "h3";
|
|
8
|
+
|
|
9
|
+
import { upsertBuilderProxyDesignSystem } from "../lib/builder-design-system-proxy.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Finalizes Builder DSI indexing from upload tokens produced by the
|
|
13
|
+
* browser-streamed resumable upload. The file bytes were streamed straight to
|
|
14
|
+
* storage; this endpoint only forwards the opaque tokens.
|
|
15
|
+
*/
|
|
16
|
+
export const indexDesignSystemSources = defineEventHandler(async (event) => {
|
|
17
|
+
const session = await getSession(event).catch(() => null);
|
|
18
|
+
if (!session?.email) {
|
|
19
|
+
setResponseStatus(event, 401);
|
|
20
|
+
return { error: "Unauthorized" };
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const body = (await readBody(event).catch(() => null)) as {
|
|
24
|
+
projectName?: unknown;
|
|
25
|
+
uploadTokens?: unknown;
|
|
26
|
+
} | null;
|
|
27
|
+
const uploadTokens = Array.isArray(body?.uploadTokens)
|
|
28
|
+
? body.uploadTokens.filter(
|
|
29
|
+
(token): token is string =>
|
|
30
|
+
typeof token === "string" && token.length > 0,
|
|
31
|
+
)
|
|
32
|
+
: [];
|
|
33
|
+
if (uploadTokens.length === 0) {
|
|
34
|
+
setResponseStatus(event, 400);
|
|
35
|
+
return { error: "No uploaded files to index." };
|
|
36
|
+
}
|
|
37
|
+
const projectName =
|
|
38
|
+
typeof body?.projectName === "string"
|
|
39
|
+
? body.projectName.trim() || undefined
|
|
40
|
+
: undefined;
|
|
41
|
+
|
|
42
|
+
const sources = uploadTokens.map((uploadToken) => ({
|
|
43
|
+
kind: "file" as const,
|
|
44
|
+
uploadToken,
|
|
45
|
+
}));
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
return await runWithRequestContext(
|
|
49
|
+
{ userEmail: session.email, orgId: session.orgId },
|
|
50
|
+
async () => {
|
|
51
|
+
const result = await indexBuilderDesignSystem({ sources, projectName });
|
|
52
|
+
const proxy = await upsertBuilderProxyDesignSystem({
|
|
53
|
+
result,
|
|
54
|
+
ownerEmail: session.email,
|
|
55
|
+
orgId: session.orgId ?? null,
|
|
56
|
+
projectName,
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
...result,
|
|
60
|
+
...proxy,
|
|
61
|
+
uploadedFileCount: uploadTokens.length,
|
|
62
|
+
};
|
|
63
|
+
},
|
|
64
|
+
);
|
|
65
|
+
} catch (err) {
|
|
66
|
+
if (err instanceof FeatureNotConfiguredError) {
|
|
67
|
+
setResponseStatus(event, 412);
|
|
68
|
+
return {
|
|
69
|
+
error: err.message,
|
|
70
|
+
builderConnectUrl:
|
|
71
|
+
err.builderConnectUrl ?? "/_agent-native/builder/connect",
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
setResponseStatus(event, 502);
|
|
75
|
+
return {
|
|
76
|
+
error:
|
|
77
|
+
err instanceof Error
|
|
78
|
+
? err.message
|
|
79
|
+
: "Builder design-system indexing failed.",
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { designSystemDecodeJobStatus as default } from "../../handlers/design-system-decode-job-status";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { designSystemUploadStart as default } from "../../handlers/design-system-upload-start";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { indexDesignSystemSources as default } from "../../handlers/index-design-system-sources";
|
|
@@ -305,6 +305,38 @@ export default defineAction({
|
|
|
305
305
|
|
|
306
306
|
On success the validated value is returned, so coercion/defaults on `outputSchema` apply. Omit `outputSchema` and behavior is byte-for-byte unchanged (no wrapping).
|
|
307
307
|
|
|
308
|
+
### Authorization (`authorize`)
|
|
309
|
+
|
|
310
|
+
`authorize` decides whether the caller may run the action at all. It wraps
|
|
311
|
+
`run`, so it holds at **all six dispatch sites** — agent tool, HTTP, frontend
|
|
312
|
+
hook, MCP, A2A, CLI — unlike `needsApproval`, which is honoured only in the
|
|
313
|
+
agent loop. Use `authorize` for "not everyone may do this"; use `needsApproval`
|
|
314
|
+
to ask a human to bless one call a permitted caller is already allowed to make.
|
|
315
|
+
|
|
316
|
+
```ts
|
|
317
|
+
import { coachAccess } from "../lib/access.js"; // defineAppRoles(...)
|
|
318
|
+
|
|
319
|
+
export default defineAction({
|
|
320
|
+
description: "Archive a client roster.",
|
|
321
|
+
schema: z.object({ id: z.string() }),
|
|
322
|
+
authorize: coachAccess.requireAny("coach-admin"),
|
|
323
|
+
run: async (args) => {
|
|
324
|
+
/* ... */
|
|
325
|
+
},
|
|
326
|
+
});
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
The wrappers compose as `validate input -> authorize -> run -> validate output
|
|
330
|
+
-> audit`: the gate sits inside input validation, so a guard reading `args` gets
|
|
331
|
+
the parsed, coerced value, and auditing is outermost, so denials are recorded.
|
|
332
|
+
|
|
333
|
+
A guard that throws denies with its own message; returning `false` denies
|
|
334
|
+
generically; anything else (including `undefined`) allows. A guarded action
|
|
335
|
+
needs a user identity, so an unattended CLI/cron caller with no user email is
|
|
336
|
+
denied. `authorize` gates the operation; `accessFilter` / `assertAccess` still
|
|
337
|
+
scope which rows a permitted caller may touch. See the `authentication` skill
|
|
338
|
+
for `defineAppRoles` and the `sharing` skill for row scoping.
|
|
339
|
+
|
|
308
340
|
### Human-in-the-Loop Approval (`needsApproval`)
|
|
309
341
|
|
|
310
342
|
For high-consequence, outward-facing, hard-to-undo actions (sending an email, charging a card, deleting an account), set `needsApproval` so the agent **cannot** run the action without a human approving the specific call:
|
|
@@ -159,6 +159,35 @@ whole site. Data scoping lives in actions and API routes; the client gates
|
|
|
159
159
|
private UI after the shell loads. See the `authentication` skill and
|
|
160
160
|
`guard:ssr-cache-shell` / `ssr-handler.spec.ts`.
|
|
161
161
|
|
|
162
|
+
**Authorization beyond "is there a session" — `authorize`.** The auth guard only
|
|
163
|
+
proves *someone* is signed in. To restrict an operation to some teammates, set
|
|
164
|
+
`authorize` on the `defineAction`. It wraps `run`, so it applies at every
|
|
165
|
+
dispatch site (agent tool, HTTP, frontend, MCP, A2A, CLI) — unlike
|
|
166
|
+
`needsApproval`, which is honoured only in the agent loop.
|
|
167
|
+
|
|
168
|
+
```ts
|
|
169
|
+
import { coachAccess } from "../lib/access.js"; // defineAppRoles(...)
|
|
170
|
+
|
|
171
|
+
export default defineAction({
|
|
172
|
+
description: "Archive a client roster.",
|
|
173
|
+
schema: z.object({ id: z.string() }),
|
|
174
|
+
authorize: coachAccess.requireAny("coach-admin"),
|
|
175
|
+
run: async (args) => {
|
|
176
|
+
/* ... */
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
A guard that throws denies with its own message; returning `false` denies
|
|
182
|
+
generically; anything else (including `undefined`) allows. Guarded actions need
|
|
183
|
+
a user identity — an unattended CLI/cron caller with no user email is denied.
|
|
184
|
+
|
|
185
|
+
`authorize` is **not** a substitute for `accessFilter` / `assertAccess`. It
|
|
186
|
+
decides whether this caller may perform the operation at all; `accessFilter` /
|
|
187
|
+
`assertAccess` scope which rows a permitted caller may see or touch. A
|
|
188
|
+
restricted write action needs both. See the `authentication` skill for
|
|
189
|
+
`defineAppRoles` and the `actions` skill for the full surface.
|
|
190
|
+
|
|
162
191
|
## Human-in-the-Loop Approval for High-Consequence Actions
|
|
163
192
|
|
|
164
193
|
For a small set of outward-facing, hard-to-undo operations — sending an email, charging a card, deleting an account, posting publicly — auth and access control are necessary but not sufficient: you also do not want the **agent** to perform them autonomously. Set `needsApproval` on the `defineAction` so the agent cannot run the action without a human approving the specific call.
|
|
@@ -274,6 +303,8 @@ Run `pnpm action db-check-scoping` to verify. Use `--require-org` for multi-org
|
|
|
274
303
|
- [ ] New env vars in `.env` only, not committed
|
|
275
304
|
- [ ] New user-data tables have `owner_email` column
|
|
276
305
|
- [ ] Custom routes call `getSession` and reject unauthenticated requests
|
|
306
|
+
- [ ] Actions only some teammates may run set `authorize` (in addition to any
|
|
307
|
+
`accessFilter` / `assertAccess` row scoping)
|
|
277
308
|
|
|
278
309
|
## Related Skills
|
|
279
310
|
|
|
@@ -34,6 +34,8 @@ Visibility is coarse. Explicit share grants are fine-grained (per user or per or
|
|
|
34
34
|
- **`editor`** — read + write.
|
|
35
35
|
- **`admin`** — read + write + manage shares. Does NOT replace the single `owner_email` on the resource.
|
|
36
36
|
|
|
37
|
+
There are three role systems and they never imply one another. A share role answers "what may this person do to **one row**". An org role (`org_members.role`) answers "what may this person do to the **team**". An app role (`defineAppRoles`, see the `authentication` skill) answers "what may this person do inside **one app**". A share `admin` is not an app admin and neither is an org admin.
|
|
38
|
+
|
|
37
39
|
### Anonymous public URLs stay separate
|
|
38
40
|
|
|
39
41
|
Form "publish" slugs, booking-link slugs, any feature that exposes a URL to unauthenticated users — these are a different axis and are NOT controlled by the sharing system. Keep them alongside it.
|
|
@@ -137,6 +139,8 @@ export default defineAction({
|
|
|
137
139
|
|
|
138
140
|
For delete actions use `"admin"` (or fold in `"owner"` to require the real owner).
|
|
139
141
|
|
|
142
|
+
`authorize` is a different axis, not an alternative: it gates whether the caller may run the operation at all, while `assertAccess` scopes which row they may touch. A write action restricted to some teammates needs both — `authorize: appAccess.requireAny(...)` on the action, `assertAccess` inside `run`.
|
|
143
|
+
|
|
140
144
|
## Create actions must set owner
|
|
141
145
|
|
|
142
146
|
When inserting a new row, fill `ownerEmail` and `orgId` from the request context:
|
|
@@ -305,6 +305,38 @@ export default defineAction({
|
|
|
305
305
|
|
|
306
306
|
On success the validated value is returned, so coercion/defaults on `outputSchema` apply. Omit `outputSchema` and behavior is byte-for-byte unchanged (no wrapping).
|
|
307
307
|
|
|
308
|
+
### Authorization (`authorize`)
|
|
309
|
+
|
|
310
|
+
`authorize` decides whether the caller may run the action at all. It wraps
|
|
311
|
+
`run`, so it holds at **all six dispatch sites** — agent tool, HTTP, frontend
|
|
312
|
+
hook, MCP, A2A, CLI — unlike `needsApproval`, which is honoured only in the
|
|
313
|
+
agent loop. Use `authorize` for "not everyone may do this"; use `needsApproval`
|
|
314
|
+
to ask a human to bless one call a permitted caller is already allowed to make.
|
|
315
|
+
|
|
316
|
+
```ts
|
|
317
|
+
import { coachAccess } from "../lib/access.js"; // defineAppRoles(...)
|
|
318
|
+
|
|
319
|
+
export default defineAction({
|
|
320
|
+
description: "Archive a client roster.",
|
|
321
|
+
schema: z.object({ id: z.string() }),
|
|
322
|
+
authorize: coachAccess.requireAny("coach-admin"),
|
|
323
|
+
run: async (args) => {
|
|
324
|
+
/* ... */
|
|
325
|
+
},
|
|
326
|
+
});
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
The wrappers compose as `validate input -> authorize -> run -> validate output
|
|
330
|
+
-> audit`: the gate sits inside input validation, so a guard reading `args` gets
|
|
331
|
+
the parsed, coerced value, and auditing is outermost, so denials are recorded.
|
|
332
|
+
|
|
333
|
+
A guard that throws denies with its own message; returning `false` denies
|
|
334
|
+
generically; anything else (including `undefined`) allows. A guarded action
|
|
335
|
+
needs a user identity, so an unattended CLI/cron caller with no user email is
|
|
336
|
+
denied. `authorize` gates the operation; `accessFilter` / `assertAccess` still
|
|
337
|
+
scope which rows a permitted caller may touch. See the `authentication` skill
|
|
338
|
+
for `defineAppRoles` and the `sharing` skill for row scoping.
|
|
339
|
+
|
|
308
340
|
### Human-in-the-Loop Approval (`needsApproval`)
|
|
309
341
|
|
|
310
342
|
For high-consequence, outward-facing, hard-to-undo actions (sending an email, charging a card, deleting an account), set `needsApproval` so the agent **cannot** run the action without a human approving the specific call:
|