@agent-native/core 0.92.11 → 0.93.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/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +45 -0
- package/corpus/core/docs/content/automation-connectors.mdx +80 -0
- package/corpus/core/docs/content/extensions.mdx +8 -0
- package/corpus/core/docs/content/locales/ar-SA/extensions.mdx +8 -0
- package/corpus/core/docs/content/locales/ar-SA/messaging.mdx +84 -15
- package/corpus/core/docs/content/locales/ar-SA/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/de-DE/extensions.mdx +10 -0
- package/corpus/core/docs/content/locales/de-DE/messaging.mdx +92 -15
- package/corpus/core/docs/content/locales/de-DE/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/de-DE/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/es-ES/extensions.mdx +10 -0
- package/corpus/core/docs/content/locales/es-ES/messaging.mdx +91 -15
- package/corpus/core/docs/content/locales/es-ES/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/es-ES/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/fr-FR/extensions.mdx +10 -0
- package/corpus/core/docs/content/locales/fr-FR/messaging.mdx +91 -15
- package/corpus/core/docs/content/locales/fr-FR/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/hi-IN/extensions.mdx +8 -0
- package/corpus/core/docs/content/locales/hi-IN/messaging.mdx +81 -15
- package/corpus/core/docs/content/locales/hi-IN/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/ja-JP/extensions.mdx +9 -0
- package/corpus/core/docs/content/locales/ja-JP/messaging.mdx +81 -15
- package/corpus/core/docs/content/locales/ja-JP/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/ko-KR/extensions.mdx +8 -0
- package/corpus/core/docs/content/locales/ko-KR/messaging.mdx +80 -15
- package/corpus/core/docs/content/locales/ko-KR/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/pt-BR/extensions.mdx +9 -0
- package/corpus/core/docs/content/locales/pt-BR/messaging.mdx +88 -15
- package/corpus/core/docs/content/locales/pt-BR/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/zh-CN/extensions.mdx +6 -0
- package/corpus/core/docs/content/locales/zh-CN/messaging.mdx +78 -15
- package/corpus/core/docs/content/locales/zh-CN/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/zh-TW/extensions.mdx +6 -0
- package/corpus/core/docs/content/locales/zh-TW/messaging.mdx +78 -15
- package/corpus/core/docs/content/locales/zh-TW/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +1 -0
- package/corpus/core/docs/content/messaging.mdx +227 -45
- package/corpus/core/docs/content/template-clips.mdx +3 -0
- package/corpus/core/docs/content/template-design.mdx +4 -0
- package/corpus/core/package.json +5 -1
- package/corpus/core/src/a2a/artifact-response.ts +131 -2
- package/corpus/core/src/a2a/client.ts +10 -0
- package/corpus/core/src/a2a/handlers.ts +40 -76
- package/corpus/core/src/a2a/types.ts +2 -0
- package/corpus/core/src/agent/durable-background.ts +24 -0
- package/corpus/core/src/agent/production-agent.ts +48 -5
- package/corpus/core/src/agent/run-manager.ts +171 -20
- package/corpus/core/src/agent/run-store.ts +297 -42
- package/corpus/core/src/agent/types.ts +23 -0
- package/corpus/core/src/audit/record.ts +31 -0
- package/corpus/core/src/audit/store.ts +69 -3
- package/corpus/core/src/audit/types.ts +13 -0
- package/corpus/core/src/automation/index.ts +802 -0
- package/corpus/core/src/cli/create.ts +12 -5
- package/corpus/core/src/cli/design-connect.ts +596 -36
- package/corpus/core/src/client/AgentPanel.tsx +51 -6
- package/corpus/core/src/client/AssistantChat.tsx +274 -147
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +3 -0
- package/corpus/core/src/client/RunStuckBanner.tsx +69 -20
- package/corpus/core/src/client/agent-chat-adapter.ts +110 -17
- package/corpus/core/src/client/automation.ts +22 -0
- package/corpus/core/src/client/chat/run-recovery.tsx +67 -50
- package/corpus/core/src/client/composer/TiptapComposer.tsx +8 -0
- package/corpus/core/src/client/index.ts +30 -0
- package/corpus/core/src/client/integrations/api.ts +295 -0
- package/corpus/core/src/client/integrations/index.ts +26 -0
- package/corpus/core/src/client/transcription/use-live-transcription.ts +68 -5
- package/corpus/core/src/client/use-run-stuck-detection.ts +41 -3
- package/corpus/core/src/deploy/build.ts +59 -3
- package/corpus/core/src/deploy/workspace-deploy.ts +37 -2
- package/corpus/core/src/file-upload/types.ts +2 -0
- package/corpus/core/src/index.ts +37 -0
- package/corpus/core/src/integrations/a2a-continuations-store.ts +6 -4
- package/corpus/core/src/integrations/adapters/discord.ts +362 -0
- package/corpus/core/src/integrations/adapters/index.ts +29 -0
- package/corpus/core/src/integrations/adapters/microsoft-teams.ts +411 -0
- package/corpus/core/src/integrations/adapters/slack.ts +861 -27
- package/corpus/core/src/integrations/adapters/telegram.ts +54 -15
- package/corpus/core/src/integrations/adapters/whatsapp.ts +41 -17
- package/corpus/core/src/integrations/catalog.ts +571 -0
- package/corpus/core/src/integrations/controls-store.ts +187 -0
- package/corpus/core/src/integrations/index.ts +100 -0
- package/corpus/core/src/integrations/installations-store.ts +677 -0
- package/corpus/core/src/integrations/integration-memory.ts +187 -0
- package/corpus/core/src/integrations/pending-tasks-retry-job.ts +6 -6
- package/corpus/core/src/integrations/pending-tasks-store.ts +83 -5
- package/corpus/core/src/integrations/plugin.ts +685 -47
- package/corpus/core/src/integrations/scope-store.ts +498 -0
- package/corpus/core/src/integrations/slack-manifest.ts +78 -0
- package/corpus/core/src/integrations/slack-oauth.ts +343 -0
- package/corpus/core/src/integrations/types.ts +179 -0
- package/corpus/core/src/integrations/usage-budget-store.ts +906 -0
- package/corpus/core/src/integrations/webhook-handler.ts +562 -51
- package/corpus/core/src/jobs/scheduler.ts +100 -2
- package/corpus/core/src/jobs/tools.ts +45 -9
- package/corpus/core/src/provider-api/index.ts +72 -1
- package/corpus/core/src/resources/handlers.ts +88 -14
- package/corpus/core/src/resources/script-helpers.ts +36 -7
- package/corpus/core/src/resources/store.ts +59 -52
- package/corpus/core/src/scripts/call-agent.ts +107 -1
- package/corpus/core/src/server/agent-chat-plugin.ts +294 -119
- package/corpus/core/src/server/auth.ts +10 -14
- package/corpus/core/src/server/builder-design-systems.ts +16 -1
- package/corpus/core/src/server/edge.ts +18 -0
- package/corpus/core/src/server/index.ts +26 -0
- package/corpus/core/src/server/request-context.ts +18 -0
- package/corpus/core/src/server/social-og-image.ts +3 -2
- package/corpus/core/src/styles/agent-native.css +62 -44
- package/corpus/core/src/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/core/src/templates/default/AGENTS.md +7 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/core/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
- package/corpus/core/src/templates/workspace-core/AGENTS.md +3 -2
- package/corpus/core/src/usage/store.ts +37 -2
- package/corpus/templates/analytics/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/analytics/.agents/skills/provider-api/SKILL.md +23 -0
- package/corpus/templates/analytics/.builder/skills/provider-api/SKILL.md +15 -0
- package/corpus/templates/analytics/actions/save-monitor.ts +25 -2
- package/corpus/templates/analytics/app/lib/data-sources.ts +28 -0
- package/corpus/templates/analytics/changelog/2026-07-10-agent-created-uptime-monitors-now-return-a-direct-link-to-th.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-10-dashboard-email-reports-still-arrive-when-screenshot-capture-temporarily-fails.md +6 -0
- package/corpus/templates/analytics/server/jobs/dashboard-report.ts +3 -7
- package/corpus/templates/analytics/server/lib/credential-keys.ts +12 -0
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +5 -1
- package/corpus/templates/analytics/server/lib/provider-credentials.ts +2 -0
- package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +16 -0
- package/corpus/templates/assets/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/brain/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/calendar/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/calendar/app/components/calendar/CommandPalette.tsx +98 -108
- package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +97 -90
- package/corpus/templates/calendar/changelog/2026-07-10-event-guest-details-and-option-menus-now-use-valid-accessibl.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-10-natural-language-event-phrases-stay-available-as-quick-creat.md +6 -0
- package/corpus/templates/chat/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/chat/changelog/2026-07-10-chat-now-makes-ai-connection-setup-clear-without-shifting-th.md +6 -0
- package/corpus/templates/clips/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/clips/.agents/skills/recording/SKILL.md +17 -1
- package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +8 -0
- package/corpus/templates/clips/AGENTS.md +8 -3
- package/corpus/templates/clips/actions/finalize-recording.ts +63 -23
- package/corpus/templates/clips/actions/get-recording-player-data.ts +6 -2
- package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +72 -9
- package/corpus/templates/clips/actions/list-recordings.ts +19 -3
- package/corpus/templates/clips/actions/navigate.ts +2 -0
- package/corpus/templates/clips/actions/reprocess-recording.ts +20 -6
- package/corpus/templates/clips/actions/request-transcript.ts +16 -31
- package/corpus/templates/clips/actions/view-screen.ts +57 -5
- package/corpus/templates/clips/app/components/layout/Header.tsx +1 -0
- package/corpus/templates/clips/app/components/library/empty-state.tsx +2 -0
- package/corpus/templates/clips/app/components/library/library-grid.tsx +69 -42
- package/corpus/templates/clips/app/components/library/library-layout.tsx +15 -1
- package/corpus/templates/clips/app/components/library/recording-card.tsx +81 -68
- package/corpus/templates/clips/app/components/library/search-bar.tsx +4 -3
- package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +9 -3
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +1 -1
- package/corpus/templates/clips/app/components/player/transcript-panel.tsx +27 -5
- package/corpus/templates/clips/app/hooks/use-library.ts +1 -1
- package/corpus/templates/clips/app/hooks/use-navigation-state.ts +10 -2
- package/corpus/templates/clips/app/hooks/use-player-shortcuts.ts +1 -0
- package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
- package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
- package/corpus/templates/clips/app/i18n/en-US.ts +7 -1
- package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
- package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
- package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
- package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
- package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
- package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
- package/corpus/templates/clips/app/i18n/zh-CN.ts +8 -1
- package/corpus/templates/clips/app/i18n/zh-TW.ts +8 -1
- package/corpus/templates/clips/app/lib/recording-visibility.ts +70 -0
- package/corpus/templates/clips/app/routes/_app.shared.tsx +20 -0
- package/corpus/templates/clips/app/routes/download.tsx +24 -8
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +115 -2
- package/corpus/templates/clips/app/routes/record.tsx +62 -0
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +25 -16
- package/corpus/templates/clips/changelog/2026-07-10-clips-desktop-is-now-available-for-linux-with-appimage-debia.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-clips-downloads-updates-sooner-in-the-background-and-offers-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-clips-shared-with-you-now-appear-in-a-searchable-shared-with.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-clips-with-missing-mobile-video-frames-can-be-repaired-witho.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-fixed-copying-agent-responses-and-transcript-text-from-recor.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-mobile-camera-recordings-pause-while-backgrounded.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-mp4-downloads-now-show-progress-immediately-after-the-option.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-recording-pages-now-open-as-soon-as-you-stop-with-a-share-li.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-recordings-now-seek-smoothly-downloads-use-the-correct-file-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-s3-compatible-storage-now-saves-hosted-recordings-without-re.md +6 -0
- package/corpus/templates/clips/desktop/README.md +22 -6
- package/corpus/templates/clips/desktop/package.json +1 -1
- package/corpus/templates/clips/desktop/src/app.tsx +32 -19
- package/corpus/templates/clips/desktop/src/components/ReadinessPanel.tsx +15 -9
- package/corpus/templates/clips/desktop/src/lib/finalization-guard.ts +22 -0
- package/corpus/templates/clips/desktop/src/lib/permissions.ts +3 -1
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +97 -120
- package/corpus/templates/clips/desktop/src/lib/updater.ts +26 -4
- package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +4 -8
- package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +1 -1
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +2 -2
- package/corpus/templates/clips/desktop/src-tauri/src/permission_status.rs +11 -7
- package/corpus/templates/clips/desktop/src-tauri/tauri.linux.conf.json +11 -0
- package/corpus/templates/clips/netlify.toml +3 -0
- package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +106 -0
- package/corpus/templates/clips/server/lib/public-agent-context.ts +9 -1
- package/corpus/templates/clips/server/lib/resumable-upload-provider.ts +52 -0
- package/corpus/templates/clips/server/lib/s3-upload-provider.ts +433 -85
- package/corpus/templates/clips/server/lib/video-remux.ts +114 -0
- package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +109 -0
- package/corpus/templates/clips/server/routes/api/clips-updater.json.get.ts +22 -11
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +4 -2
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +47 -5
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +10 -2
- package/corpus/templates/clips/shared/share-loader-response.ts +12 -0
- package/corpus/templates/clips/shared/transcript-status.ts +40 -0
- package/corpus/templates/content/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/content/.agents/skills/content/SKILL.md +57 -5
- package/corpus/templates/content/AGENTS.md +65 -55
- package/corpus/templates/content/actions/_builder-cms-read-client.ts +92 -23
- package/corpus/templates/content/actions/_database-source-utils.ts +207 -41
- package/corpus/templates/content/actions/_property-utils.ts +30 -2
- package/corpus/templates/content/actions/add-content-database-source-field-property.ts +316 -121
- package/corpus/templates/content/actions/attach-content-database-source.ts +41 -17
- package/corpus/templates/content/actions/change-content-database-source-role.ts +46 -8
- package/corpus/templates/content/actions/submit-content-database-form.ts +497 -0
- package/corpus/templates/content/actions/suggest-source-join-key.ts +8 -1
- package/corpus/templates/content/actions/update-content-database-view.ts +8 -1
- package/corpus/templates/content/actions/view-screen.ts +4 -1
- package/corpus/templates/content/agent-native.app-skill.json +1 -1
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +250 -64
- package/corpus/templates/content/app/components/editor/database/FormView.tsx +460 -0
- package/corpus/templates/content/app/components/editor/database/navigation-state.ts +3 -0
- package/corpus/templates/content/app/components/editor/database/settings.tsx +30 -37
- package/corpus/templates/content/app/components/editor/database/shared.tsx +2 -0
- package/corpus/templates/content/app/components/editor/database/view-config.ts +29 -1
- package/corpus/templates/content/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +22 -0
- package/corpus/templates/content/app/i18n/zh-TW.ts +21 -0
- package/corpus/templates/content/app/i18n-data.ts +225 -0
- package/corpus/templates/content/changelog/2026-07-09-builder-source-refreshes-now-keep-mapped-fields-such-as-topi.md +6 -0
- package/corpus/templates/content/changelog/2026-07-10-builder-backed-properties-now-load-current-source-values-as-.md +6 -0
- package/corpus/templates/content/changelog/2026-07-10-builder-database-refreshes-now-stay-explicit-and-accurate.md +6 -0
- package/corpus/templates/content/changelog/2026-07-10-database-form-views-now-collect-ordered-required-answers-and.md +6 -0
- package/corpus/templates/content/changelog/2026-07-10-database-tables-now-use-a-quieter-more-compact-layout-with-c.md +6 -0
- package/corpus/templates/content/changelog/2026-07-10-slack-intake-routes-to-content-database-forms.md +6 -0
- package/corpus/templates/content/parity/matrix.md +1 -0
- package/corpus/templates/content/parity/matrix.ts +18 -0
- package/corpus/templates/content/shared/api.ts +28 -1
- package/corpus/templates/content/shared/database-form.ts +53 -0
- package/corpus/templates/design/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +26 -0
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +85 -12
- package/corpus/templates/design/AGENTS.md +72 -18
- package/corpus/templates/design/DESIGN.md +1 -1
- package/corpus/templates/design/DEVELOPING.md +1 -1
- package/corpus/templates/design/FIGMA_INTEROPERABILITY.md +116 -0
- package/corpus/templates/design/actions/create-design-from-template.ts +220 -0
- package/corpus/templates/design/actions/create-design-system.ts +92 -16
- package/corpus/templates/design/actions/delete-design-template.ts +28 -0
- package/corpus/templates/design/actions/delete-file.ts +7 -0
- package/corpus/templates/design/actions/edit-design.ts +3 -0
- package/corpus/templates/design/actions/export-design-as-figma-svg.ts +137 -5
- package/corpus/templates/design/actions/export-pdf.ts +1 -1
- package/corpus/templates/design/actions/generate-design.ts +3 -0
- package/corpus/templates/design/actions/get-design-snapshot.ts +9 -0
- package/corpus/templates/design/actions/get-figma-connection-status.ts +26 -0
- package/corpus/templates/design/actions/get-figma-design-context.ts +138 -0
- package/corpus/templates/design/actions/get-figma-styles.ts +2 -2
- package/corpus/templates/design/actions/import-figma-clipboard.ts +112 -16
- package/corpus/templates/design/actions/import-figma-frame.ts +15 -4
- package/corpus/templates/design/actions/index-design-system-with-builder.ts +4 -0
- package/corpus/templates/design/actions/list-design-templates.ts +118 -0
- package/corpus/templates/design/actions/navigate.ts +16 -2
- package/corpus/templates/design/actions/provider-api-request.ts +11 -1
- package/corpus/templates/design/actions/save-design-as-template.ts +156 -0
- package/corpus/templates/design/actions/set-active-breakpoint.ts +13 -4
- package/corpus/templates/design/actions/take-design-screenshot.ts +73 -3
- package/corpus/templates/design/actions/update-file.ts +39 -22
- package/corpus/templates/design/actions/view-screen.ts +36 -1
- package/corpus/templates/design/actions/write-local-file.ts +50 -38
- package/corpus/templates/design/app/components/design/AutoLayoutSuggestionDialog.tsx +151 -0
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +20 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +251 -22
- package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +3 -3
- package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +384 -9
- package/corpus/templates/design/app/components/design/EditPanel.tsx +105 -32
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +58 -28
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +6 -0
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +539 -53
- package/corpus/templates/design/app/components/design/bridge/embedded-wheel.bridge.ts +40 -0
- package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +1 -0
- package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +1 -0
- package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +5 -1
- package/corpus/templates/design/app/components/design/code-workbench/workspace/create-providers.ts +2 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/localhost-provider.ts +3 -1
- package/corpus/templates/design/app/components/design/code-workbench/workspace/types.ts +2 -0
- package/corpus/templates/design/app/components/design/edit-panel/element-identity.ts +19 -0
- package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +1 -0
- package/corpus/templates/design/app/components/design/edit-panel/interaction-state-helpers.ts +27 -0
- package/corpus/templates/design/app/components/design/inspector/InteractionStatePanel.tsx +137 -81
- package/corpus/templates/design/app/components/design/inspector/frame-size-presets.ts +25 -5
- package/corpus/templates/design/app/components/design/multi-screen/chrome-transitions.ts +1 -1
- package/corpus/templates/design/app/components/design/multi-screen/frame-geometry.ts +220 -3
- package/corpus/templates/design/app/components/design/multi-screen/overview-layout.ts +13 -0
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +22 -1
- package/corpus/templates/design/app/components/design/types.ts +4 -0
- package/corpus/templates/design/app/components/design-system/ProductionDesignSystemShowcase.tsx +208 -0
- package/corpus/templates/design/app/components/editor/FigmaLinkComposerBubble.tsx +321 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +24 -4
- package/corpus/templates/design/app/components/layout/Layout.tsx +16 -2
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -0
- package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +72 -0
- package/corpus/templates/design/app/global.css +2 -35
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +10 -0
- package/corpus/templates/design/app/i18n/zh-TW.ts +127 -5
- package/corpus/templates/design/app/i18n-breakpoints.ts +209 -0
- package/corpus/templates/design/app/i18n-data.ts +1317 -59
- package/corpus/templates/design/app/i18n-template-feature.ts +458 -0
- package/corpus/templates/design/app/lib/design-clipboard.ts +202 -0
- package/corpus/templates/design/app/lib/design-file-upload.ts +87 -0
- package/corpus/templates/design/app/lib/design-import.ts +168 -11
- package/corpus/templates/design/app/lib/desktop-design-preview.ts +423 -0
- package/corpus/templates/design/app/lib/figma-clipboard.ts +74 -8
- package/corpus/templates/design/app/lib/figma-connection.ts +161 -0
- package/corpus/templates/design/app/lib/figma-svg-copy.ts +814 -22
- package/corpus/templates/design/app/lib/figma-url.ts +77 -0
- package/corpus/templates/design/app/lib/pending-generation.ts +35 -0
- package/corpus/templates/design/app/pages/DesignSystems.tsx +236 -177
- package/corpus/templates/design/app/pages/Index.tsx +38 -0
- package/corpus/templates/design/app/pages/Templates.tsx +498 -0
- package/corpus/templates/design/app/pages/design-editor/auto-layout-suggestion.ts +328 -0
- package/corpus/templates/design/app/pages/design-editor/clone-idrefs.ts +113 -0
- package/corpus/templates/design/app/pages/design-editor/created-screen-navigation.ts +55 -0
- package/corpus/templates/design/app/pages/design-editor/editor-session.ts +32 -0
- package/corpus/templates/design/app/pages/design-editor/editor-state.ts +49 -2
- package/corpus/templates/design/app/pages/design-editor/export-capture.ts +296 -0
- package/corpus/templates/design/app/pages/design-editor/history.ts +101 -2
- package/corpus/templates/design/app/pages/design-editor/layout-operations.ts +28 -1
- package/corpus/templates/design/app/pages/design-editor/overview-camera.ts +34 -0
- package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +202 -6
- package/corpus/templates/design/app/pages/design-editor/pending-structure-verification.ts +92 -0
- package/corpus/templates/design/app/pages/design-editor/save-failure.ts +58 -0
- package/corpus/templates/design/app/routes/templates.tsx +4 -6
- package/corpus/templates/design/changelog/2026-07-10-app-workspaces-now-use-clean-borderless-main-surfaces-throug.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-ask-chat-what-s-in-a-figma-file-or-frame-structure-screensho.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-canvas-edits-now-reject-malformed-html-before-it-can-corrupt.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-complex-designs-now-export-as-valid-secure-svgs-and-crisp-ra.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-complex-figma-masks-arcs-rich-text-transformed-images-and-ad.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-copied-layers-paste-across-designs-and-browser-tabs.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-copy-and-download-editable-figma-svg.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-copying-design-text-now-pastes-readable-text-into-other-apps.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-deleted-screens-can-be-restored-with-undo-and-removed-again-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-design-changes-now-save-before-switching-apps-and-retry-when.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-design-stays-usable-on-phones-by-keeping-editor-panels-and-f.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-download-all-screens-as-one-multi-page-pdf-from-the-overview.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-duplicated-layers-now-keep-labels-aria-relationships-fragmen.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fig-import-results-stay-compact.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-figma-imports-now-load-real-fonts-fix-rotated-gradient-dashe.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-figma-links-in-chat-and-the-import-tab-now-offer-secure-one-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-cmd-z-not-restoring-content-after-an-agent-driven-desi.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-download-pdf-being-unreachable-from-the-export-panel-e.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-dragging-a-layer-out-of-an-auto-layout-row-column-no-l.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-figma-svg-export-text-wrapping-sizing-and-inner-layer.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-hiding-or-locking-one-layer-no-longer-hides-or-blocks-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-png-screenshots-of-tall-screens-being-cropped-to-one-v.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-png-svg-exports-capturing-broken-layout-when-webfonts-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-frame-tool-now-offers-standard-ad-unit-size-presets-medium-r.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-full-view-controls-stay-within-their-frame-instead-of-coveri.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-hover-focus-focus-visible-pressed-and-disabled-states-now-pr.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-layer-drops-now-land-in-the-intended-grid-row-stay-visually-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-local-code-workspaces-now-keep-unsaved-edits-across-panel-sw.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-local-visual-editing-now-keeps-authenticated-sessions-shared.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-long-running-agent-work-no-longer-shows-a-premature-stuck-wa.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-managed-figma-connections-are-recognized-automatically.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-new-designs-can-open-directly-in-the-editor-without-a-pr.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-new-screens-are-selected-and-revealed-immediately.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-new-text-layers-undo-as-one-safe-creation.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-preview-and-apply-inferred-auto-layout-without-changing-yo.md +5 -0
- package/corpus/templates/design/changelog/2026-07-10-print-pdf-exports-and-paper-size-presets-letter-a4-now-match.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-responsive-frame-editing.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-reusable-design-templates.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-screen-overview-frames-now-use-a-clearer-interact-action-wit.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-start-designs-from-source-linked-material-3-carbon-or-primer.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-tweaks-guidance.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-uploaded-fig-files-can-now-become-editable-design-screens-wi.md +6 -0
- package/corpus/templates/design/e2e/helpers.ts +3 -3
- package/corpus/templates/design/package.json +2 -0
- package/corpus/templates/design/scripts/qa-figma-stress-import.ts +96 -0
- package/corpus/templates/design/server/db/index.ts +10 -0
- package/corpus/templates/design/server/db/schema.ts +44 -0
- package/corpus/templates/design/server/handlers/import-design-file.ts +114 -80
- package/corpus/templates/design/server/handlers/index-design-system-with-builder.ts +19 -6
- package/corpus/templates/design/server/lib/design-export.ts +240 -3
- package/corpus/templates/design/server/lib/design-template-data.ts +89 -0
- package/corpus/templates/design/server/lib/design-to-figma-svg.ts +250 -26
- package/corpus/templates/design/server/lib/fig-file-decoder.ts +839 -0
- package/corpus/templates/design/server/lib/fig-file-import.ts +287 -0
- package/corpus/templates/design/server/lib/fig-file-limits.ts +3 -0
- package/corpus/templates/design/server/lib/fig-file-to-html.ts +2568 -0
- package/corpus/templates/design/server/lib/figma-design-context.ts +359 -0
- package/corpus/templates/design/server/lib/figma-node-import.ts +478 -22
- package/corpus/templates/design/server/lib/figma-node-to-html.ts +554 -29
- package/corpus/templates/design/server/lib/local-figma-qa-upload.ts +112 -0
- package/corpus/templates/design/server/lib/verify-write-grant.ts +16 -2
- package/corpus/templates/design/server/lib/visible-clipboard-html.ts +13 -3
- package/corpus/templates/design/server/plugins/agent-chat.ts +7 -0
- package/corpus/templates/design/server/plugins/db.ts +42 -0
- package/corpus/templates/design/server/plugins/local-figma-qa-upload.ts +7 -0
- package/corpus/templates/design/server/register-secrets.ts +8 -8
- package/corpus/templates/design/server/routes/api/qa-figma-import-assets/[assetId].get.ts +46 -0
- package/corpus/templates/design/server/source-workspace.ts +104 -12
- package/corpus/templates/design/shared/code-layer.ts +105 -28
- package/corpus/templates/design/shared/design-system-templates.ts +301 -0
- package/corpus/templates/design/shared/design-template-presets.ts +195 -0
- package/corpus/templates/design/shared/figma-url.ts +8 -0
- package/corpus/templates/design/shared/html-integrity.ts +306 -0
- package/corpus/templates/design/shared/interaction-states.ts +318 -23
- package/corpus/templates/design/shared/locked-layers.ts +151 -0
- package/corpus/templates/dispatch/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/dispatch/app/i18n/zh-TW.ts +48 -0
- package/corpus/templates/dispatch/app/i18n-data.ts +536 -1
- package/corpus/templates/dispatch/changelog/2026-07-10-connect-slack-workspaces-with-oauth-and-manage-channel-ident.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-07-10-microsoft-teams-bots-and-discord-slash-commands-can-now-conn.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-07-10-slack-and-telegram-now-route-uptime-monitor-requests-to-anal.md +6 -0
- package/corpus/templates/forms/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/forms/.agents/skills/form-publishing/SKILL.md +7 -0
- package/corpus/templates/forms/AGENTS.md +4 -0
- package/corpus/templates/forms/actions/create-form.ts +44 -7
- package/corpus/templates/forms/actions/lib/assert-publishable-form.ts +38 -0
- package/corpus/templates/forms/actions/patch-form-fields.ts +4 -0
- package/corpus/templates/forms/actions/update-form.ts +2 -36
- package/corpus/templates/forms/app/i18n/ar-SA.ts +3 -0
- package/corpus/templates/forms/app/i18n/de-DE.ts +3 -0
- package/corpus/templates/forms/app/i18n/en-US.ts +3 -0
- package/corpus/templates/forms/app/i18n/es-ES.ts +3 -0
- package/corpus/templates/forms/app/i18n/fr-FR.ts +3 -0
- package/corpus/templates/forms/app/i18n/hi-IN.ts +3 -0
- package/corpus/templates/forms/app/i18n/ja-JP.ts +3 -0
- package/corpus/templates/forms/app/i18n/ko-KR.ts +3 -0
- package/corpus/templates/forms/app/i18n/pt-BR.ts +3 -0
- package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
- package/corpus/templates/forms/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +17 -0
- package/corpus/templates/forms/changelog/2026-07-10-agent-created-published-forms-now-return-the-anonymous-publi.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-10-published-forms-can-no-longer-be-edited-into-an-unusable-emp.md +6 -0
- package/corpus/templates/forms/server/handlers/submissions.ts +4 -3
- package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/forms/shared/types.ts +5 -0
- package/corpus/templates/mail/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +2 -2
- package/corpus/templates/mail/changelog/2026-07-10-mail-navigation-now-uses-a-clean-borderless-drawer.md +6 -0
- package/corpus/templates/plan/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/plan/app/lib/plan-local-bridge.ts +4 -1
- package/corpus/templates/plan/changelog/2026-07-10-local-plans-now-keep-valid-content-visible-when-one-generate.md +6 -0
- package/corpus/templates/plan/server/lib/local-plan-files.ts +4 -1
- package/corpus/templates/slides/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/dist/a2a/artifact-response.d.ts.map +1 -1
- package/dist/a2a/artifact-response.js +88 -2
- package/dist/a2a/artifact-response.js.map +1 -1
- package/dist/a2a/client.d.ts +9 -0
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +1 -0
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/handlers.d.ts.map +1 -1
- package/dist/a2a/handlers.js +24 -69
- package/dist/a2a/handlers.js.map +1 -1
- package/dist/a2a/types.d.ts +2 -0
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/a2a/types.js.map +1 -1
- package/dist/agent/durable-background.d.ts +11 -0
- package/dist/agent/durable-background.d.ts.map +1 -1
- package/dist/agent/durable-background.js +17 -0
- package/dist/agent/durable-background.js.map +1 -1
- package/dist/agent/production-agent.d.ts +5 -3
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +34 -8
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts +44 -2
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +124 -18
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +109 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +274 -37
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/types.d.ts +22 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/audit/record.d.ts.map +1 -1
- package/dist/audit/record.js +29 -0
- package/dist/audit/record.js.map +1 -1
- package/dist/audit/store.d.ts.map +1 -1
- package/dist/audit/store.js +62 -3
- package/dist/audit/store.js.map +1 -1
- package/dist/audit/types.d.ts +13 -0
- package/dist/audit/types.d.ts.map +1 -1
- package/dist/audit/types.js.map +1 -1
- package/dist/automation/index.d.ts +193 -0
- package/dist/automation/index.d.ts.map +1 -0
- package/dist/automation/index.js +464 -0
- package/dist/automation/index.js.map +1 -0
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +10 -3
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/design-connect.d.ts.map +1 -1
- package/dist/cli/design-connect.js +492 -35
- package/dist/cli/design-connect.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +7 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +32 -8
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +15 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +115 -47
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +1 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/RunStuckBanner.d.ts +14 -1
- package/dist/client/RunStuckBanner.d.ts.map +1 -1
- package/dist/client/RunStuckBanner.js +35 -7
- package/dist/client/RunStuckBanner.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts +4 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +97 -16
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/automation.d.ts +14 -0
- package/dist/client/automation.d.ts.map +1 -0
- package/dist/client/automation.js +9 -0
- package/dist/client/automation.js.map +1 -0
- package/dist/client/chat/run-recovery.d.ts +4 -0
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +12 -10
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +8 -0
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/integrations/api.d.ts +115 -0
- package/dist/client/integrations/api.d.ts.map +1 -0
- package/dist/client/integrations/api.js +123 -0
- package/dist/client/integrations/api.js.map +1 -0
- package/dist/client/integrations/index.d.ts +1 -0
- package/dist/client/integrations/index.d.ts.map +1 -1
- package/dist/client/integrations/index.js +1 -0
- package/dist/client/integrations/index.js.map +1 -1
- package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
- package/dist/client/transcription/use-live-transcription.js +59 -5
- package/dist/client/transcription/use-live-transcription.js.map +1 -1
- package/dist/client/use-run-stuck-detection.d.ts +16 -1
- package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
- package/dist/client/use-run-stuck-detection.js +23 -4
- package/dist/client/use-run-stuck-detection.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +49 -4
- package/dist/deploy/build.js.map +1 -1
- package/dist/deploy/workspace-deploy.d.ts.map +1 -1
- package/dist/deploy/workspace-deploy.js +31 -2
- package/dist/deploy/workspace-deploy.js.map +1 -1
- package/dist/file-upload/types.d.ts +2 -0
- package/dist/file-upload/types.d.ts.map +1 -1
- package/dist/file-upload/types.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/a2a-continuations-store.d.ts.map +1 -1
- package/dist/integrations/a2a-continuations-store.js +6 -4
- package/dist/integrations/a2a-continuations-store.js.map +1 -1
- package/dist/integrations/adapters/discord.d.ts +3 -0
- package/dist/integrations/adapters/discord.d.ts.map +1 -0
- package/dist/integrations/adapters/discord.js +261 -0
- package/dist/integrations/adapters/discord.js.map +1 -0
- package/dist/integrations/adapters/index.d.ts +4 -0
- package/dist/integrations/adapters/index.d.ts.map +1 -0
- package/dist/integrations/adapters/index.js +26 -0
- package/dist/integrations/adapters/index.js.map +1 -0
- package/dist/integrations/adapters/microsoft-teams.d.ts +5 -0
- package/dist/integrations/adapters/microsoft-teams.d.ts.map +1 -0
- package/dist/integrations/adapters/microsoft-teams.js +295 -0
- package/dist/integrations/adapters/microsoft-teams.js.map +1 -0
- package/dist/integrations/adapters/slack.d.ts +8 -2
- package/dist/integrations/adapters/slack.d.ts.map +1 -1
- package/dist/integrations/adapters/slack.js +736 -27
- package/dist/integrations/adapters/slack.js.map +1 -1
- package/dist/integrations/adapters/telegram.d.ts +0 -2
- package/dist/integrations/adapters/telegram.d.ts.map +1 -1
- package/dist/integrations/adapters/telegram.js +49 -15
- package/dist/integrations/adapters/telegram.js.map +1 -1
- package/dist/integrations/adapters/whatsapp.d.ts +0 -2
- package/dist/integrations/adapters/whatsapp.d.ts.map +1 -1
- package/dist/integrations/adapters/whatsapp.js +40 -17
- package/dist/integrations/adapters/whatsapp.js.map +1 -1
- package/dist/integrations/catalog.d.ts +75 -0
- package/dist/integrations/catalog.d.ts.map +1 -0
- package/dist/integrations/catalog.js +451 -0
- package/dist/integrations/catalog.js.map +1 -0
- package/dist/integrations/controls-store.d.ts +44 -0
- package/dist/integrations/controls-store.d.ts.map +1 -0
- package/dist/integrations/controls-store.js +129 -0
- package/dist/integrations/controls-store.js.map +1 -0
- package/dist/integrations/index.d.ts +13 -1
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +9 -0
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/installations-store.d.ts +112 -0
- package/dist/integrations/installations-store.d.ts.map +1 -0
- package/dist/integrations/installations-store.js +493 -0
- package/dist/integrations/installations-store.js.map +1 -0
- package/dist/integrations/integration-memory.d.ts +24 -0
- package/dist/integrations/integration-memory.d.ts.map +1 -0
- package/dist/integrations/integration-memory.js +136 -0
- package/dist/integrations/integration-memory.js.map +1 -0
- package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -1
- package/dist/integrations/pending-tasks-retry-job.js +6 -5
- package/dist/integrations/pending-tasks-retry-job.js.map +1 -1
- package/dist/integrations/pending-tasks-store.d.ts +17 -0
- package/dist/integrations/pending-tasks-store.d.ts.map +1 -1
- package/dist/integrations/pending-tasks-store.js +71 -5
- package/dist/integrations/pending-tasks-store.js.map +1 -1
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +520 -35
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/scope-store.d.ts +65 -0
- package/dist/integrations/scope-store.d.ts.map +1 -0
- package/dist/integrations/scope-store.js +361 -0
- package/dist/integrations/scope-store.js.map +1 -0
- package/dist/integrations/slack-manifest.d.ts +66 -0
- package/dist/integrations/slack-manifest.d.ts.map +1 -0
- package/dist/integrations/slack-manifest.js +70 -0
- package/dist/integrations/slack-manifest.js.map +1 -0
- package/dist/integrations/slack-oauth.d.ts +99 -0
- package/dist/integrations/slack-oauth.d.ts.map +1 -0
- package/dist/integrations/slack-oauth.js +226 -0
- package/dist/integrations/slack-oauth.js.map +1 -0
- package/dist/integrations/types.d.ts +144 -0
- package/dist/integrations/types.d.ts.map +1 -1
- package/dist/integrations/types.js +16 -1
- package/dist/integrations/types.js.map +1 -1
- package/dist/integrations/usage-budget-store.d.ts +84 -0
- package/dist/integrations/usage-budget-store.d.ts.map +1 -0
- package/dist/integrations/usage-budget-store.js +650 -0
- package/dist/integrations/usage-budget-store.js.map +1 -0
- package/dist/integrations/webhook-handler.d.ts +4 -0
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +415 -47
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/jobs/scheduler.d.ts +6 -0
- package/dist/jobs/scheduler.d.ts.map +1 -1
- package/dist/jobs/scheduler.js +83 -4
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/jobs/tools.d.ts.map +1 -1
- package/dist/jobs/tools.js +43 -11
- package/dist/jobs/tools.js.map +1 -1
- package/dist/provider-api/index.d.ts +4 -4
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +72 -1
- package/dist/provider-api/index.js.map +1 -1
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +57 -15
- package/dist/resources/handlers.js.map +1 -1
- package/dist/resources/script-helpers.d.ts.map +1 -1
- package/dist/resources/script-helpers.js +34 -8
- package/dist/resources/script-helpers.js.map +1 -1
- package/dist/resources/store.d.ts +10 -0
- package/dist/resources/store.d.ts.map +1 -1
- package/dist/resources/store.js +54 -47
- package/dist/resources/store.js.map +1 -1
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +106 -1
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +15 -4
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +248 -113
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +10 -14
- package/dist/server/auth.js.map +1 -1
- package/dist/server/builder-design-systems.d.ts +3 -1
- package/dist/server/builder-design-systems.d.ts.map +1 -1
- package/dist/server/builder-design-systems.js +9 -2
- package/dist/server/builder-design-systems.js.map +1 -1
- package/dist/server/edge.d.ts +1 -1
- package/dist/server/edge.d.ts.map +1 -1
- package/dist/server/edge.js +1 -1
- package/dist/server/edge.js.map +1 -1
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/request-context.d.ts +18 -0
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-context.js.map +1 -1
- package/dist/server/social-og-image.d.ts.map +1 -1
- package/dist/server/social-og-image.js +3 -2
- package/dist/server/social-og-image.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/styles/agent-native.css +62 -44
- package/dist/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/dist/templates/default/AGENTS.md +7 -3
- package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
- package/dist/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
- package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
- package/dist/templates/workspace-core/AGENTS.md +3 -2
- package/dist/usage/store.d.ts +7 -0
- package/dist/usage/store.d.ts.map +1 -1
- package/dist/usage/store.js +24 -3
- package/dist/usage/store.js.map +1 -1
- package/docs/content/automation-connectors.mdx +80 -0
- package/docs/content/extensions.mdx +8 -0
- package/docs/content/locales/ar-SA/extensions.mdx +8 -0
- package/docs/content/locales/ar-SA/messaging.mdx +84 -15
- package/docs/content/locales/ar-SA/template-clips.mdx +1 -0
- package/docs/content/locales/ar-SA/template-design.mdx +1 -0
- package/docs/content/locales/de-DE/extensions.mdx +10 -0
- package/docs/content/locales/de-DE/messaging.mdx +92 -15
- package/docs/content/locales/de-DE/template-clips.mdx +1 -0
- package/docs/content/locales/de-DE/template-design.mdx +1 -0
- package/docs/content/locales/es-ES/extensions.mdx +10 -0
- package/docs/content/locales/es-ES/messaging.mdx +91 -15
- package/docs/content/locales/es-ES/template-clips.mdx +1 -0
- package/docs/content/locales/es-ES/template-design.mdx +1 -0
- package/docs/content/locales/fr-FR/extensions.mdx +10 -0
- package/docs/content/locales/fr-FR/messaging.mdx +91 -15
- package/docs/content/locales/fr-FR/template-clips.mdx +1 -0
- package/docs/content/locales/fr-FR/template-design.mdx +1 -0
- package/docs/content/locales/hi-IN/extensions.mdx +8 -0
- package/docs/content/locales/hi-IN/messaging.mdx +81 -15
- package/docs/content/locales/hi-IN/template-clips.mdx +1 -0
- package/docs/content/locales/hi-IN/template-design.mdx +1 -0
- package/docs/content/locales/ja-JP/extensions.mdx +9 -0
- package/docs/content/locales/ja-JP/messaging.mdx +81 -15
- package/docs/content/locales/ja-JP/template-clips.mdx +1 -0
- package/docs/content/locales/ja-JP/template-design.mdx +1 -0
- package/docs/content/locales/ko-KR/extensions.mdx +8 -0
- package/docs/content/locales/ko-KR/messaging.mdx +80 -15
- package/docs/content/locales/ko-KR/template-clips.mdx +1 -0
- package/docs/content/locales/ko-KR/template-design.mdx +1 -0
- package/docs/content/locales/pt-BR/extensions.mdx +9 -0
- package/docs/content/locales/pt-BR/messaging.mdx +88 -15
- package/docs/content/locales/pt-BR/template-clips.mdx +1 -0
- package/docs/content/locales/pt-BR/template-design.mdx +1 -0
- package/docs/content/locales/zh-CN/extensions.mdx +6 -0
- package/docs/content/locales/zh-CN/messaging.mdx +78 -15
- package/docs/content/locales/zh-CN/template-clips.mdx +1 -0
- package/docs/content/locales/zh-CN/template-design.mdx +1 -0
- package/docs/content/locales/zh-TW/extensions.mdx +6 -0
- package/docs/content/locales/zh-TW/messaging.mdx +78 -15
- package/docs/content/locales/zh-TW/template-clips.mdx +1 -0
- package/docs/content/locales/zh-TW/template-design.mdx +1 -0
- package/docs/content/messaging.mdx +227 -45
- package/docs/content/template-clips.mdx +3 -0
- package/docs/content/template-design.mdx +4 -0
- package/package.json +5 -1
- package/src/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/src/templates/default/AGENTS.md +7 -3
- package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
- package/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
- package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
- package/src/templates/workspace-core/AGENTS.md +3 -2
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* showing. Both features coexist: a screen state (e.g. "Empty") and an
|
|
10
10
|
* element interaction state (e.g. "Hover" on a button) are independent axes.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
12
|
+
* Base overrides persist into a managed
|
|
13
13
|
* `<style data-agent-native-states>` block as real, plain CSS pseudo-class
|
|
14
14
|
* rules — readable and editable in the Code panel, and portable to any HTML
|
|
15
15
|
* export with zero runtime dependency:
|
|
@@ -18,10 +18,16 @@
|
|
|
18
18
|
* background-color: #111827;
|
|
19
19
|
* }
|
|
20
20
|
*
|
|
21
|
+
* State edits made in a narrower responsive frame persist separately in
|
|
22
|
+
* `<style data-agent-native-state-breakpoints>` as ordinary max-width media
|
|
23
|
+
* rules. That keeps (for example) mobile Hover independent from base Hover
|
|
24
|
+
* while remaining portable to generated HTML and Alpine.js with no runtime.
|
|
25
|
+
*
|
|
21
26
|
* Follows the managed-block conventions of `breakpoint-media.ts` /
|
|
22
27
|
* `motion-compiler.ts`:
|
|
23
28
|
* - **Deterministic**: same model → byte-identical CSS. Node ids, states, and
|
|
24
|
-
* properties are sorted alphabetically;
|
|
29
|
+
* properties are sorted alphabetically; responsive buckets run widest to
|
|
30
|
+
* narrowest, and states within a node id follow the
|
|
25
31
|
* fixed `STATE_ORDER` (hover → focus → focus-visible → active → disabled)
|
|
26
32
|
* so cascade order is stable and predictable when two states could both
|
|
27
33
|
* apply (e.g. `:hover` and `:focus` at once).
|
|
@@ -102,6 +108,12 @@ export type InteractionStatesModel = Record<
|
|
|
102
108
|
Partial<Record<InteractionState, Record<string, string>>>
|
|
103
109
|
>;
|
|
104
110
|
|
|
111
|
+
/** Responsive state overrides: max-width bound → regular state model. */
|
|
112
|
+
export type ResponsiveInteractionStatesModel = Record<
|
|
113
|
+
string,
|
|
114
|
+
InteractionStatesModel
|
|
115
|
+
>;
|
|
116
|
+
|
|
105
117
|
/** One flattened managed rule, as returned by {@link listAllInteractionStateDeclarations}. */
|
|
106
118
|
export interface InteractionStateDeclaration {
|
|
107
119
|
nodeId: string;
|
|
@@ -133,12 +145,16 @@ export function isSafeInteractionStateCssValue(value: string): boolean {
|
|
|
133
145
|
|
|
134
146
|
/** Valid (optionally vendor-prefixed) CSS property identifier. */
|
|
135
147
|
export function isSafeInteractionStateCssProperty(property: string): boolean {
|
|
136
|
-
return
|
|
148
|
+
return /^(?:--[a-zA-Z_][a-zA-Z0-9_-]*|-?[a-zA-Z][a-zA-Z0-9-]*)$/.test(
|
|
149
|
+
property,
|
|
150
|
+
);
|
|
137
151
|
}
|
|
138
152
|
|
|
139
153
|
// ─── HTML block extraction / injection ───────────────────────────────────────
|
|
140
154
|
|
|
141
155
|
const OPEN_RE = /<style\b(?=[^>]*\bdata-agent-native-states\b)[^>]*>/i;
|
|
156
|
+
const RESPONSIVE_OPEN_RE =
|
|
157
|
+
/<style\b(?=[^>]*\bdata-agent-native-state-breakpoints\b)[^>]*>/i;
|
|
142
158
|
|
|
143
159
|
/**
|
|
144
160
|
* Extract the CSS body of the managed `<style data-agent-native-states>`
|
|
@@ -196,6 +212,26 @@ export function injectManagedInteractionStateCss(
|
|
|
196
212
|
return block + "\n" + html;
|
|
197
213
|
}
|
|
198
214
|
|
|
215
|
+
/** Extract the responsive interaction-state managed block. */
|
|
216
|
+
export function extractManagedResponsiveInteractionStateCss(
|
|
217
|
+
html: string,
|
|
218
|
+
): string | null {
|
|
219
|
+
return extractManagedStyleBody(html, RESPONSIVE_OPEN_RE);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/** Inject, replace, or remove the responsive interaction-state block. */
|
|
223
|
+
export function injectManagedResponsiveInteractionStateCss(
|
|
224
|
+
html: string,
|
|
225
|
+
css: string,
|
|
226
|
+
): string {
|
|
227
|
+
return injectManagedStyleBody(
|
|
228
|
+
html,
|
|
229
|
+
css,
|
|
230
|
+
RESPONSIVE_OPEN_RE,
|
|
231
|
+
"data-agent-native-state-breakpoints",
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
|
|
199
235
|
// ─── CSS body parse / serialize ──────────────────────────────────────────────
|
|
200
236
|
|
|
201
237
|
/**
|
|
@@ -231,7 +267,12 @@ export function parseInteractionStatesCss(css: string): InteractionStatesModel {
|
|
|
231
267
|
const colon = declaration.indexOf(":");
|
|
232
268
|
if (colon <= 0) continue;
|
|
233
269
|
const property = declaration.slice(0, colon).trim();
|
|
234
|
-
|
|
270
|
+
// Managed declarations are serialized with `!important` so they can
|
|
271
|
+
// override the inline base styles Design authors on canvas elements.
|
|
272
|
+
// Keep that cascade implementation detail out of the persisted model:
|
|
273
|
+
// inspector fields, diffs, and subsequent writes all operate on the
|
|
274
|
+
// authored value (`red`), never `red !important`.
|
|
275
|
+
const value = stripManagedImportant(declaration.slice(colon + 1));
|
|
235
276
|
if (!isSafeInteractionStateCssProperty(property)) continue;
|
|
236
277
|
if (!isSafeInteractionStateCssValue(value)) continue;
|
|
237
278
|
model[nodeId] ??= {};
|
|
@@ -265,7 +306,8 @@ export function serializeInteractionStatesModel(
|
|
|
265
306
|
);
|
|
266
307
|
if (properties.length === 0) continue;
|
|
267
308
|
const lines = properties.map(
|
|
268
|
-
(property) =>
|
|
309
|
+
(property) =>
|
|
310
|
+
` ${property}: ${stripManagedImportant(declarations[property])} !important;`,
|
|
269
311
|
);
|
|
270
312
|
rules.push(
|
|
271
313
|
`[data-agent-native-node-id="${escAttr(nodeId)}"]:${state} {\n` +
|
|
@@ -300,7 +342,8 @@ function rebuildCssWithPreviews(model: InteractionStatesModel): string {
|
|
|
300
342
|
);
|
|
301
343
|
if (properties.length === 0) continue;
|
|
302
344
|
const lines = properties.map(
|
|
303
|
-
(property) =>
|
|
345
|
+
(property) =>
|
|
346
|
+
` ${property}: ${stripManagedImportant(declarations[property])} !important;`,
|
|
304
347
|
);
|
|
305
348
|
previewRules.push(
|
|
306
349
|
`[data-agent-native-node-id="${escAttr(nodeId)}"][data-an-state-preview="${state}"] {\n` +
|
|
@@ -325,6 +368,59 @@ export function serializeInteractionStatesModelWithPreviews(
|
|
|
325
368
|
return rebuildCssWithPreviews(model);
|
|
326
369
|
}
|
|
327
370
|
|
|
371
|
+
/** Parse responsive `@media (max-width)` state rules from their own block. */
|
|
372
|
+
export function parseResponsiveInteractionStatesCss(
|
|
373
|
+
css: string,
|
|
374
|
+
): ResponsiveInteractionStatesModel {
|
|
375
|
+
const model: ResponsiveInteractionStatesModel = {};
|
|
376
|
+
const mediaRe = /@media\s*\(\s*max-width\s*:\s*(\d+(?:\.\d+)?)px\s*\)\s*\{/g;
|
|
377
|
+
let match: RegExpExecArray | null;
|
|
378
|
+
while ((match = mediaRe.exec(css)) !== null) {
|
|
379
|
+
const maxWidthPx = Math.round(Number.parseFloat(match[1]));
|
|
380
|
+
if (!Number.isFinite(maxWidthPx) || maxWidthPx <= 0) continue;
|
|
381
|
+
const bodyStart = match.index + match[0].length;
|
|
382
|
+
const body = extractCssBlock(css, bodyStart);
|
|
383
|
+
if (body === null) continue;
|
|
384
|
+
mediaRe.lastIndex = bodyStart + body.length + 1;
|
|
385
|
+
// Responsive rules deliberately double the node attribute selector so
|
|
386
|
+
// they beat a base state rule even if later editing moves/reinserts the
|
|
387
|
+
// base managed block after this block. Collapse that deterministic
|
|
388
|
+
// specificity boost before feeding the normal state parser.
|
|
389
|
+
const parsed = parseInteractionStatesCss(
|
|
390
|
+
body.replace(
|
|
391
|
+
/(\[data-agent-native-node-id="(?:\\.|[^"\\])*"\])\1/g,
|
|
392
|
+
"$1",
|
|
393
|
+
),
|
|
394
|
+
);
|
|
395
|
+
if (Object.keys(parsed).length > 0) model[String(maxWidthPx)] = parsed;
|
|
396
|
+
}
|
|
397
|
+
return model;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* Serialize responsive state rules widest-first so every narrower matching
|
|
402
|
+
* bucket appears later and wins, mirroring the normal breakpoint cascade.
|
|
403
|
+
*/
|
|
404
|
+
export function serializeResponsiveInteractionStatesModel(
|
|
405
|
+
model: ResponsiveInteractionStatesModel,
|
|
406
|
+
): string {
|
|
407
|
+
return Object.keys(model)
|
|
408
|
+
.map((key) => Number.parseInt(key, 10))
|
|
409
|
+
.filter((bound) => Number.isFinite(bound) && bound > 0)
|
|
410
|
+
.sort((a, b) => b - a)
|
|
411
|
+
.flatMap((bound) => {
|
|
412
|
+
const body = serializeResponsiveStateBucket(model[String(bound)] ?? {});
|
|
413
|
+
if (!body) return [];
|
|
414
|
+
return [
|
|
415
|
+
`@media (max-width: ${bound}px) {\n${body
|
|
416
|
+
.split("\n")
|
|
417
|
+
.map((line) => ` ${line}`)
|
|
418
|
+
.join("\n")}\n}`,
|
|
419
|
+
];
|
|
420
|
+
})
|
|
421
|
+
.join("\n\n");
|
|
422
|
+
}
|
|
423
|
+
|
|
328
424
|
/**
|
|
329
425
|
* Regenerate the forced-preview twin rules for a whole document from its
|
|
330
426
|
* current real state rules, and write the refreshed managed block back.
|
|
@@ -365,6 +461,12 @@ function readModel(html: string): InteractionStatesModel {
|
|
|
365
461
|
);
|
|
366
462
|
}
|
|
367
463
|
|
|
464
|
+
function readResponsiveModel(html: string): ResponsiveInteractionStatesModel {
|
|
465
|
+
return parseResponsiveInteractionStatesCss(
|
|
466
|
+
extractManagedResponsiveInteractionStateCss(html) ?? "",
|
|
467
|
+
);
|
|
468
|
+
}
|
|
469
|
+
|
|
368
470
|
/**
|
|
369
471
|
* List every state that has at least one declaration for `nodeId`, in fixed
|
|
370
472
|
* `INTERACTION_STATES` order. Empty array when the node has no overrides.
|
|
@@ -374,11 +476,14 @@ export function listInteractionStates(
|
|
|
374
476
|
nodeId: string,
|
|
375
477
|
): InteractionState[] {
|
|
376
478
|
const model = readModel(html);
|
|
377
|
-
const
|
|
378
|
-
if (!node) return [];
|
|
479
|
+
const responsive = readResponsiveModel(html);
|
|
379
480
|
return INTERACTION_STATES.filter((state) => {
|
|
380
|
-
const declarations =
|
|
381
|
-
|
|
481
|
+
const declarations = model[nodeId]?.[state];
|
|
482
|
+
if (declarations && Object.keys(declarations).length > 0) return true;
|
|
483
|
+
return Object.values(responsive).some((bucket) => {
|
|
484
|
+
const scoped = bucket[nodeId]?.[state];
|
|
485
|
+
return scoped && Object.keys(scoped).length > 0;
|
|
486
|
+
});
|
|
382
487
|
});
|
|
383
488
|
}
|
|
384
489
|
|
|
@@ -395,6 +500,35 @@ export function readStateStyles(
|
|
|
395
500
|
return { ...(model[nodeId]?.[state] ?? {}) };
|
|
396
501
|
}
|
|
397
502
|
|
|
503
|
+
/**
|
|
504
|
+
* Resolve a state's inspector values at a concrete viewport: base state
|
|
505
|
+
* declarations first, then every matching responsive bucket widest→narrowest.
|
|
506
|
+
*/
|
|
507
|
+
export function readResolvedStateStyles(
|
|
508
|
+
html: string,
|
|
509
|
+
nodeId: string,
|
|
510
|
+
state: InteractionState,
|
|
511
|
+
viewportWidthPx?: number | null,
|
|
512
|
+
): Record<string, string> {
|
|
513
|
+
const resolved = readStateStyles(html, nodeId, state);
|
|
514
|
+
if (
|
|
515
|
+
viewportWidthPx == null ||
|
|
516
|
+
!Number.isFinite(viewportWidthPx) ||
|
|
517
|
+
viewportWidthPx <= 0
|
|
518
|
+
) {
|
|
519
|
+
return resolved;
|
|
520
|
+
}
|
|
521
|
+
const responsive = readResponsiveModel(html);
|
|
522
|
+
const matchingBounds = Object.keys(responsive)
|
|
523
|
+
.map((key) => Number.parseInt(key, 10))
|
|
524
|
+
.filter((bound) => bound >= viewportWidthPx)
|
|
525
|
+
.sort((a, b) => b - a);
|
|
526
|
+
for (const bound of matchingBounds) {
|
|
527
|
+
Object.assign(resolved, responsive[String(bound)]?.[nodeId]?.[state] ?? {});
|
|
528
|
+
}
|
|
529
|
+
return resolved;
|
|
530
|
+
}
|
|
531
|
+
|
|
398
532
|
/**
|
|
399
533
|
* Set (or overwrite) one managed declaration for a node's state, returning
|
|
400
534
|
* the updated HTML. Throws on unsafe property/value — the caller decides how
|
|
@@ -427,19 +561,7 @@ export function upsertStateStyles(
|
|
|
427
561
|
if (!isInteractionState(state)) {
|
|
428
562
|
throw new Error(`Invalid interaction state: "${state}".`);
|
|
429
563
|
}
|
|
430
|
-
const normalized
|
|
431
|
-
for (const [rawProperty, rawValue] of Object.entries(styles)) {
|
|
432
|
-
const property = normalizeCssPropertyName(rawProperty.trim());
|
|
433
|
-
if (!isSafeInteractionStateCssProperty(property)) {
|
|
434
|
-
throw new Error(`Invalid interaction-state property: "${rawProperty}".`);
|
|
435
|
-
}
|
|
436
|
-
if (!isSafeInteractionStateCssValue(rawValue)) {
|
|
437
|
-
throw new Error(
|
|
438
|
-
`Invalid interaction-state value for "${property}": semicolons, braces, comments, angle brackets, control characters, and url(...) are not allowed.`,
|
|
439
|
-
);
|
|
440
|
-
}
|
|
441
|
-
normalized[property] = rawValue.trim();
|
|
442
|
-
}
|
|
564
|
+
const normalized = normalizeStateStyles(styles);
|
|
443
565
|
const model = readModel(html);
|
|
444
566
|
model[nodeId] ??= {};
|
|
445
567
|
const node = model[nodeId];
|
|
@@ -447,6 +569,66 @@ export function upsertStateStyles(
|
|
|
447
569
|
return writeModel(html, model);
|
|
448
570
|
}
|
|
449
571
|
|
|
572
|
+
/**
|
|
573
|
+
* Persist one state override at a responsive max-width bound. This is the
|
|
574
|
+
* state-aware counterpart of `setBreakpointMediaDeclaration`; callers must
|
|
575
|
+
* use it whenever both an interaction state and a non-base breakpoint are
|
|
576
|
+
* active so a narrow-frame edit never leaks globally.
|
|
577
|
+
*/
|
|
578
|
+
export function upsertResponsiveStateStyles(
|
|
579
|
+
html: string,
|
|
580
|
+
nodeId: string,
|
|
581
|
+
state: InteractionState,
|
|
582
|
+
maxWidthPx: number,
|
|
583
|
+
styles: Record<string, string>,
|
|
584
|
+
): string {
|
|
585
|
+
if (!nodeId)
|
|
586
|
+
throw new Error("upsertResponsiveStateStyles requires a nodeId.");
|
|
587
|
+
if (!isInteractionState(state)) {
|
|
588
|
+
throw new Error(`Invalid interaction state: "${state}".`);
|
|
589
|
+
}
|
|
590
|
+
if (!Number.isFinite(maxWidthPx) || maxWidthPx <= 0) {
|
|
591
|
+
throw new Error(`Invalid interaction-state breakpoint: ${maxWidthPx}px.`);
|
|
592
|
+
}
|
|
593
|
+
const normalized = normalizeStateStyles(styles);
|
|
594
|
+
const model = readResponsiveModel(html);
|
|
595
|
+
const bucket = String(Math.round(maxWidthPx));
|
|
596
|
+
model[bucket] ??= {};
|
|
597
|
+
model[bucket][nodeId] ??= {};
|
|
598
|
+
const node = model[bucket][nodeId];
|
|
599
|
+
node[state] = { ...(node[state] ?? {}), ...normalized };
|
|
600
|
+
return injectManagedResponsiveInteractionStateCss(
|
|
601
|
+
html,
|
|
602
|
+
serializeResponsiveInteractionStatesModel(model),
|
|
603
|
+
);
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
/** Remove one property from one responsive state scope, pruning empties. */
|
|
607
|
+
export function removeResponsiveStateProperty(
|
|
608
|
+
html: string,
|
|
609
|
+
nodeId: string,
|
|
610
|
+
state: InteractionState,
|
|
611
|
+
maxWidthPx: number,
|
|
612
|
+
property: string,
|
|
613
|
+
): string {
|
|
614
|
+
const model = readResponsiveModel(html);
|
|
615
|
+
const bucket = String(Math.round(maxWidthPx));
|
|
616
|
+
const declarations = model[bucket]?.[nodeId]?.[state];
|
|
617
|
+
if (!declarations) return html;
|
|
618
|
+
const normalizedProperty = normalizeCssPropertyName(property.trim());
|
|
619
|
+
if (!(normalizedProperty in declarations)) return html;
|
|
620
|
+
delete declarations[normalizedProperty];
|
|
621
|
+
if (Object.keys(declarations).length === 0)
|
|
622
|
+
delete model[bucket][nodeId][state];
|
|
623
|
+
if (Object.keys(model[bucket][nodeId]).length === 0)
|
|
624
|
+
delete model[bucket][nodeId];
|
|
625
|
+
if (Object.keys(model[bucket]).length === 0) delete model[bucket];
|
|
626
|
+
return injectManagedResponsiveInteractionStateCss(
|
|
627
|
+
html,
|
|
628
|
+
serializeResponsiveInteractionStatesModel(model),
|
|
629
|
+
);
|
|
630
|
+
}
|
|
631
|
+
|
|
450
632
|
/**
|
|
451
633
|
* Remove one managed declaration (reset the property back to the base
|
|
452
634
|
* value). Prunes empty state entries, node entries, and — when nothing is
|
|
@@ -536,6 +718,119 @@ function unescAttr(value: string): string {
|
|
|
536
718
|
return value.replace(/\\"/g, '"').replace(/\\\\/g, "\\");
|
|
537
719
|
}
|
|
538
720
|
|
|
721
|
+
/**
|
|
722
|
+
* `!important` is deliberately a serialization concern, not model data.
|
|
723
|
+
* Strip a caller/hand-authored suffix on read and write so repeated
|
|
724
|
+
* parse/serialize cycles stay canonical and never produce
|
|
725
|
+
* `!important !important`.
|
|
726
|
+
*/
|
|
727
|
+
function stripManagedImportant(value: string): string {
|
|
728
|
+
return value.replace(/\s*!important\s*$/i, "").trim();
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
function normalizeStateStyles(
|
|
732
|
+
styles: Record<string, string>,
|
|
733
|
+
): Record<string, string> {
|
|
734
|
+
const normalized: Record<string, string> = {};
|
|
735
|
+
for (const [rawProperty, rawValue] of Object.entries(styles)) {
|
|
736
|
+
const property = normalizeCssPropertyName(rawProperty.trim());
|
|
737
|
+
if (!isSafeInteractionStateCssProperty(property)) {
|
|
738
|
+
throw new Error(`Invalid interaction-state property: "${rawProperty}".`);
|
|
739
|
+
}
|
|
740
|
+
const value = stripManagedImportant(rawValue);
|
|
741
|
+
if (!isSafeInteractionStateCssValue(value)) {
|
|
742
|
+
throw new Error(
|
|
743
|
+
`Invalid interaction-state value for "${property}": semicolons, braces, comments, angle brackets, control characters, and url(...) are not allowed.`,
|
|
744
|
+
);
|
|
745
|
+
}
|
|
746
|
+
normalized[property] = value;
|
|
747
|
+
}
|
|
748
|
+
return normalized;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
function serializeResponsiveStateBucket(model: InteractionStatesModel): string {
|
|
752
|
+
const realRules: string[] = [];
|
|
753
|
+
const previewRules: string[] = [];
|
|
754
|
+
for (const nodeId of Object.keys(model).sort((a, b) => a.localeCompare(b))) {
|
|
755
|
+
const escaped = escAttr(nodeId);
|
|
756
|
+
const target = `[data-agent-native-node-id="${escaped}"]`;
|
|
757
|
+
const doubledTarget = `${target}${target}`;
|
|
758
|
+
for (const state of INTERACTION_STATES) {
|
|
759
|
+
const declarations = model[nodeId][state];
|
|
760
|
+
if (!declarations) continue;
|
|
761
|
+
const properties = Object.keys(declarations).sort((a, b) =>
|
|
762
|
+
a.localeCompare(b),
|
|
763
|
+
);
|
|
764
|
+
if (properties.length === 0) continue;
|
|
765
|
+
const lines = properties.map(
|
|
766
|
+
(property) =>
|
|
767
|
+
` ${property}: ${stripManagedImportant(declarations[property])} !important;`,
|
|
768
|
+
);
|
|
769
|
+
realRules.push(`${doubledTarget}:${state} {\n${lines.join("\n")}\n}`);
|
|
770
|
+
previewRules.push(
|
|
771
|
+
`${doubledTarget}[data-an-state-preview="${state}"] {\n${lines.join("\n")}\n}`,
|
|
772
|
+
);
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
return [...realRules, ...previewRules].join("\n\n");
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
function extractManagedStyleBody(html: string, openRe: RegExp): string | null {
|
|
779
|
+
const openMatch = openRe.exec(html);
|
|
780
|
+
if (!openMatch) return null;
|
|
781
|
+
const bodyStart = openMatch.index + openMatch[0].length;
|
|
782
|
+
const afterOpen = html.slice(bodyStart);
|
|
783
|
+
const closeMatch = /<\s*\/\s*style\b[^>]*>/i.exec(afterOpen);
|
|
784
|
+
if (!closeMatch) return null;
|
|
785
|
+
return afterOpen.slice(0, closeMatch.index).trim();
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
function injectManagedStyleBody(
|
|
789
|
+
html: string,
|
|
790
|
+
css: string,
|
|
791
|
+
openRe: RegExp,
|
|
792
|
+
attribute: string,
|
|
793
|
+
): string {
|
|
794
|
+
const openMatch = openRe.exec(html);
|
|
795
|
+
const trimmed = css.trim();
|
|
796
|
+
const block = trimmed ? `<style ${attribute}>\n${trimmed}\n</style>` : "";
|
|
797
|
+
if (openMatch) {
|
|
798
|
+
const bodyStart = openMatch.index + openMatch[0].length;
|
|
799
|
+
const afterOpen = html.slice(bodyStart);
|
|
800
|
+
const closeMatch = /<\s*\/\s*style\b[^>]*>/i.exec(afterOpen);
|
|
801
|
+
if (closeMatch) {
|
|
802
|
+
const closeEnd = bodyStart + closeMatch.index + closeMatch[0].length;
|
|
803
|
+
if (!block) {
|
|
804
|
+
return (
|
|
805
|
+
html.slice(0, openMatch.index) +
|
|
806
|
+
html.slice(closeEnd).replace(/^\n/, "")
|
|
807
|
+
);
|
|
808
|
+
}
|
|
809
|
+
return html.slice(0, openMatch.index) + block + html.slice(closeEnd);
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
if (!block) return html;
|
|
813
|
+
const headClose = /<\/head\s*>/gi;
|
|
814
|
+
let close: RegExpExecArray | null = null;
|
|
815
|
+
let match: RegExpExecArray | null;
|
|
816
|
+
while ((match = headClose.exec(html)) !== null) close = match;
|
|
817
|
+
const index = close?.index ?? -1;
|
|
818
|
+
return index >= 0
|
|
819
|
+
? html.slice(0, index) + block + "\n" + html.slice(index)
|
|
820
|
+
: block + "\n" + html;
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
function extractCssBlock(css: string, start: number): string | null {
|
|
824
|
+
let depth = 1;
|
|
825
|
+
let index = start;
|
|
826
|
+
while (index < css.length && depth > 0) {
|
|
827
|
+
if (css[index] === "{") depth++;
|
|
828
|
+
else if (css[index] === "}") depth--;
|
|
829
|
+
index++;
|
|
830
|
+
}
|
|
831
|
+
return depth === 0 ? css.slice(start, index - 1) : null;
|
|
832
|
+
}
|
|
833
|
+
|
|
539
834
|
/**
|
|
540
835
|
* Normalize a CSS property name to kebab-case (accepts either `fontSize` or
|
|
541
836
|
* `font-size`). Local copy of the same normalization
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildCodeLayerProjection,
|
|
3
|
+
type CodeLayerNode,
|
|
4
|
+
type CodeLayerProjection,
|
|
5
|
+
} from "./code-layer.js";
|
|
6
|
+
|
|
7
|
+
export interface LockedLayerSnapshot {
|
|
8
|
+
id: string;
|
|
9
|
+
label: string;
|
|
10
|
+
source: string;
|
|
11
|
+
ancestorIds: string[];
|
|
12
|
+
parentId: string | null;
|
|
13
|
+
siblingIndex: number;
|
|
14
|
+
previousSiblingId: string | null;
|
|
15
|
+
nextSiblingId: string | null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function durableNodeIdentity(node: CodeLayerNode): string {
|
|
19
|
+
const stableId = node.dataAttributes["data-agent-native-node-id"];
|
|
20
|
+
if (stableId) return `node:${stableId}`;
|
|
21
|
+
const htmlId = node.attributes.id;
|
|
22
|
+
if (typeof htmlId === "string" && htmlId.length > 0) return `id:${htmlId}`;
|
|
23
|
+
return node.id;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function lockedLayerPlacement(
|
|
27
|
+
projection: CodeLayerProjection,
|
|
28
|
+
node: CodeLayerNode,
|
|
29
|
+
): Omit<LockedLayerSnapshot, "id" | "label" | "source"> {
|
|
30
|
+
const nodesById = new Map(
|
|
31
|
+
projection.nodes.map((candidate) => [candidate.id, candidate]),
|
|
32
|
+
);
|
|
33
|
+
const ancestors: CodeLayerNode[] = [];
|
|
34
|
+
let parent = node.parentId ? nodesById.get(node.parentId) : undefined;
|
|
35
|
+
while (parent) {
|
|
36
|
+
ancestors.unshift(parent);
|
|
37
|
+
parent = parent.parentId ? nodesById.get(parent.parentId) : undefined;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const siblingIds = node.parentId
|
|
41
|
+
? (nodesById.get(node.parentId)?.children ?? [])
|
|
42
|
+
: projection.rootNodeIds;
|
|
43
|
+
const siblingIndex = siblingIds.indexOf(node.id);
|
|
44
|
+
const previousSibling =
|
|
45
|
+
siblingIndex > 0 ? nodesById.get(siblingIds[siblingIndex - 1]!) : undefined;
|
|
46
|
+
const nextSibling =
|
|
47
|
+
siblingIndex >= 0 && siblingIndex < siblingIds.length - 1
|
|
48
|
+
? nodesById.get(siblingIds[siblingIndex + 1]!)
|
|
49
|
+
: undefined;
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
ancestorIds: ancestors.map(durableNodeIdentity),
|
|
53
|
+
parentId:
|
|
54
|
+
ancestors.length > 0
|
|
55
|
+
? durableNodeIdentity(ancestors[ancestors.length - 1]!)
|
|
56
|
+
: null,
|
|
57
|
+
siblingIndex,
|
|
58
|
+
previousSiblingId: previousSibling
|
|
59
|
+
? durableNodeIdentity(previousSibling)
|
|
60
|
+
: null,
|
|
61
|
+
nextSiblingId: nextSibling ? durableNodeIdentity(nextSibling) : null,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Capture the exact source subtree for every durably locked Design layer.
|
|
67
|
+
* Stable node ids are stamped before files are persisted, so the same layer
|
|
68
|
+
* can be found after an agent proposes an updated document.
|
|
69
|
+
*/
|
|
70
|
+
export function lockedLayerSnapshots(html: string): LockedLayerSnapshot[] {
|
|
71
|
+
const projection = buildCodeLayerProjection(html);
|
|
72
|
+
return projection.nodes.flatMap((node) => {
|
|
73
|
+
if (
|
|
74
|
+
node.dataAttributes["data-agent-native-locked"] !== "true" ||
|
|
75
|
+
!node.source
|
|
76
|
+
) {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
return [
|
|
80
|
+
{
|
|
81
|
+
id: node.id,
|
|
82
|
+
label: node.layerName,
|
|
83
|
+
source: html.slice(node.source.start, node.source.end),
|
|
84
|
+
...lockedLayerPlacement(projection, node),
|
|
85
|
+
},
|
|
86
|
+
];
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function countLockedLayers(html: string): number {
|
|
91
|
+
return lockedLayerSnapshots(html).length;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function countLockedLayersAcrossFiles(
|
|
95
|
+
files: readonly { content?: string | null }[],
|
|
96
|
+
): number {
|
|
97
|
+
return files.reduce(
|
|
98
|
+
(count, file) =>
|
|
99
|
+
count +
|
|
100
|
+
(typeof file.content === "string" ? countLockedLayers(file.content) : 0),
|
|
101
|
+
0,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Locked layers are immutable for agent-authored whole-file or text edits.
|
|
107
|
+
* The human editor can still unlock a layer through its dedicated layer
|
|
108
|
+
* control; that direct UI path does not call this guard.
|
|
109
|
+
*/
|
|
110
|
+
export function assertLockedLayersPreserved(
|
|
111
|
+
before: string,
|
|
112
|
+
after: string,
|
|
113
|
+
): void {
|
|
114
|
+
const locked = lockedLayerSnapshots(before);
|
|
115
|
+
if (locked.length === 0) return;
|
|
116
|
+
|
|
117
|
+
const nextProjection = buildCodeLayerProjection(after);
|
|
118
|
+
const nextById = new Map(nextProjection.nodes.map((node) => [node.id, node]));
|
|
119
|
+
const changed: string[] = [];
|
|
120
|
+
|
|
121
|
+
for (const snapshot of locked) {
|
|
122
|
+
const next = nextById.get(snapshot.id);
|
|
123
|
+
if (!next?.source) {
|
|
124
|
+
changed.push(snapshot.label);
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const nextSource = after.slice(next.source.start, next.source.end);
|
|
128
|
+
const nextPlacement = lockedLayerPlacement(nextProjection, next);
|
|
129
|
+
if (
|
|
130
|
+
nextSource !== snapshot.source ||
|
|
131
|
+
nextPlacement.parentId !== snapshot.parentId ||
|
|
132
|
+
nextPlacement.siblingIndex !== snapshot.siblingIndex ||
|
|
133
|
+
nextPlacement.previousSiblingId !== snapshot.previousSiblingId ||
|
|
134
|
+
nextPlacement.nextSiblingId !== snapshot.nextSiblingId ||
|
|
135
|
+
nextPlacement.ancestorIds.length !== snapshot.ancestorIds.length ||
|
|
136
|
+
nextPlacement.ancestorIds.some(
|
|
137
|
+
(ancestorId, index) => ancestorId !== snapshot.ancestorIds[index],
|
|
138
|
+
)
|
|
139
|
+
) {
|
|
140
|
+
changed.push(snapshot.label);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (changed.length > 0) {
|
|
145
|
+
const names = Array.from(new Set(changed)).slice(0, 5).join(", ");
|
|
146
|
+
throw new Error(
|
|
147
|
+
`This edit changes locked layer${changed.length === 1 ? "" : "s"}: ${names}. ` +
|
|
148
|
+
"Preserve locked layers exactly, or ask the user to unlock them first.",
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
@@ -11,11 +11,14 @@ metadata:
|
|
|
11
11
|
|
|
12
12
|
# Capture Learnings
|
|
13
13
|
|
|
14
|
-
This is background knowledge, not a slash command. **
|
|
14
|
+
This is background knowledge, not a slash command. **Organization learnings and your personal memory index are loaded at the start of every conversation, including Slack/integration turns.** Capture durable context proactively when you learn something worth remembering.
|
|
15
15
|
|
|
16
16
|
## How to Read & Write Memories
|
|
17
17
|
|
|
18
|
-
Memories are stored as **resources** in the SQL database
|
|
18
|
+
Memories are stored as **resources** in the SQL database, not as files on disk.
|
|
19
|
+
|
|
20
|
+
- **Team/organization knowledge:** shared `LEARNINGS.md`. Read it first, merge the new fact, then write the full updated file with the `resources` tool using `scope: "shared"`. Shared scope resolves to the active organization; it must never leak to another organization in the same deployment.
|
|
21
|
+
- **Personal knowledge:** `memory/MEMORY.md` plus `memory/<name>.md`, written with `save-memory`.
|
|
19
22
|
|
|
20
23
|
- **Save a memory:** `save-memory --name <name> --type <type> --description "..." --content "..."`
|
|
21
24
|
- **Read a memory:** `resource-read --path memory/<name>.md`
|
|
@@ -33,6 +36,14 @@ Memories are stored as **resources** in the SQL database (personal scope), not a
|
|
|
33
36
|
|
|
34
37
|
## When to Capture
|
|
35
38
|
|
|
39
|
+
### Team and organization knowledge (`LEARNINGS.md`, shared scope)
|
|
40
|
+
- Canonical destinations and workflows (for example, which Content database receives a type of Slack request)
|
|
41
|
+
- Required intake fields, ownership, prioritization conventions, metric definitions, and approved terminology
|
|
42
|
+
- Durable external references that the whole team needs, including the canonical page/database URL
|
|
43
|
+
- Corrections or decisions that should affect every organization member's future Slack and app conversations
|
|
44
|
+
|
|
45
|
+
Store the fact and a concise provenance link when available. Do not paste full private conversations, customer data, credentials, or secrets into learnings. Put stable always-on policy in shared `AGENTS.md`; put learned facts and evolving conventions in shared `LEARNINGS.md`.
|
|
46
|
+
|
|
36
47
|
### User Preferences & Memory (`user`)
|
|
37
48
|
- **Tone and style** — "I prefer casual tone", "don't use emojis", "keep replies short"
|
|
38
49
|
- **Personal context** — contacts, relationships, habits ("my wife's email is...", "I'm in PST timezone")
|
|
@@ -58,19 +69,21 @@ Memories are stored as **resources** in the SQL database (personal scope), not a
|
|
|
58
69
|
- Things obvious from reading the code
|
|
59
70
|
- Standard language/framework behavior
|
|
60
71
|
- Temporary debugging notes
|
|
61
|
-
- Anything already in AGENTS.md or skills
|
|
72
|
+
- Anything already in AGENTS.md, shared LEARNINGS.md, or skills
|
|
62
73
|
- Ephemeral task details (use tasks/plans instead)
|
|
63
74
|
|
|
64
75
|
## Key Rules
|
|
65
76
|
|
|
66
|
-
1. **Save proactively — don't ask permission.** When you learn something, save it immediately.
|
|
67
|
-
2. **
|
|
68
|
-
3. **
|
|
69
|
-
4. **
|
|
70
|
-
5. **
|
|
77
|
+
1. **Save proactively — don't ask permission.** When you learn something durable, save it immediately at the correct scope.
|
|
78
|
+
2. **Choose scope by audience.** Organization workflow or reference → shared `LEARNINGS.md`; one person's preference/context → personal memory.
|
|
79
|
+
3. **One memory per topic** — e.g. `coding-style`, `project-alpha`, not one giant dump
|
|
80
|
+
4. **Read before updating** — if a memory exists, read it first and merge, don't overwrite
|
|
81
|
+
5. **Keep descriptions concise** — the index is loaded every conversation
|
|
82
|
+
6. **Memories are SQL-backed** — they persist across sessions and are not in git; still minimize sensitive content
|
|
71
83
|
|
|
72
84
|
## Graduation
|
|
73
85
|
|
|
74
86
|
When a memory is referenced repeatedly, it may belong in AGENTS.md or a skill:
|
|
75
|
-
- Saving a memory is lightweight (auto-apply, personal scope)
|
|
87
|
+
- Saving a personal memory is lightweight (auto-apply, personal scope)
|
|
88
|
+
- Shared LEARNINGS.md is the lightweight organization knowledge layer
|
|
76
89
|
- Updating AGENTS.md or a skill is heavier (affects all users/agents)
|