@agent-native/core 0.77.3 → 0.77.6
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 +1 -1
- package/corpus/core/CHANGELOG.md +27 -0
- package/corpus/core/docs/content/locales/ar-SA/a2a-protocol.md +2 -2
- package/corpus/core/docs/content/locales/ar-SA/actions.md +6 -6
- package/corpus/core/docs/content/locales/ar-SA/agent-surfaces.md +5 -5
- package/corpus/core/docs/content/locales/ar-SA/agent-teams.md +4 -4
- package/corpus/core/docs/content/locales/ar-SA/agent-web-surfaces.md +2 -2
- package/corpus/core/docs/content/locales/ar-SA/authentication.md +4 -4
- package/corpus/core/docs/content/locales/ar-SA/automations.md +3 -3
- package/corpus/core/docs/content/locales/ar-SA/blueprint-installer.md +2 -2
- package/corpus/core/docs/content/locales/ar-SA/cli-adapters.md +1 -1
- package/corpus/core/docs/content/locales/ar-SA/code-agents-ui.md +2 -2
- package/corpus/core/docs/content/locales/ar-SA/components.md +14 -14
- package/corpus/core/docs/content/locales/ar-SA/context-awareness.md +3 -3
- package/corpus/core/docs/content/locales/ar-SA/creating-templates.md +12 -12
- package/corpus/core/docs/content/locales/ar-SA/cross-app-sso.md +3 -3
- package/corpus/core/docs/content/locales/ar-SA/database.md +7 -7
- package/corpus/core/docs/content/locales/ar-SA/deployment.md +4 -4
- package/corpus/core/docs/content/locales/ar-SA/dispatch.md +3 -3
- package/corpus/core/docs/content/locales/ar-SA/drop-in-agent.md +8 -8
- package/corpus/core/docs/content/locales/ar-SA/durable-resume.md +1 -1
- package/corpus/core/docs/content/locales/ar-SA/embedding-sdk.md +2 -2
- package/corpus/core/docs/content/locales/ar-SA/evals.md +3 -3
- package/corpus/core/docs/content/locales/ar-SA/extensions.md +2 -2
- package/corpus/core/docs/content/locales/ar-SA/external-agents.md +8 -8
- package/corpus/core/docs/content/locales/ar-SA/faq.md +3 -3
- package/corpus/core/docs/content/locales/ar-SA/file-uploads.md +4 -4
- package/corpus/core/docs/content/locales/ar-SA/frames.md +1 -1
- package/corpus/core/docs/content/locales/ar-SA/getting-started.md +13 -13
- package/corpus/core/docs/content/locales/ar-SA/harness-agents.md +3 -3
- package/corpus/core/docs/content/locales/ar-SA/human-approval.md +3 -3
- package/corpus/core/docs/content/locales/ar-SA/key-concepts.md +14 -14
- package/corpus/core/docs/content/locales/ar-SA/local-file-mode.md +5 -5
- package/corpus/core/docs/content/locales/ar-SA/mcp-apps.md +9 -9
- package/corpus/core/docs/content/locales/ar-SA/mcp-clients.md +9 -9
- package/corpus/core/docs/content/locales/ar-SA/mcp-protocol.md +5 -5
- package/corpus/core/docs/content/locales/ar-SA/messaging.md +5 -5
- package/corpus/core/docs/content/locales/ar-SA/migration-workbench.md +1 -1
- package/corpus/core/docs/content/locales/ar-SA/multi-app-workspace.md +1 -1
- package/corpus/core/docs/content/locales/ar-SA/multi-tenancy.md +2 -2
- package/corpus/core/docs/content/locales/ar-SA/native-chat-ui.md +4 -4
- package/corpus/core/docs/content/locales/ar-SA/notifications.md +5 -5
- package/corpus/core/docs/content/locales/ar-SA/observability.md +1 -1
- package/corpus/core/docs/content/locales/ar-SA/observational-memory.md +2 -2
- package/corpus/core/docs/content/locales/ar-SA/onboarding.md +8 -8
- package/corpus/core/docs/content/locales/ar-SA/plan-plugin.md +3 -3
- package/corpus/core/docs/content/locales/ar-SA/pr-visual-recap.md +11 -11
- package/corpus/core/docs/content/locales/ar-SA/processors.md +2 -2
- package/corpus/core/docs/content/locales/ar-SA/progress.md +3 -3
- package/corpus/core/docs/content/locales/ar-SA/pure-agent-apps.md +1 -1
- package/corpus/core/docs/content/locales/ar-SA/real-time-collaboration.md +6 -6
- package/corpus/core/docs/content/locales/ar-SA/recurring-jobs.md +5 -5
- package/corpus/core/docs/content/locales/ar-SA/routing.md +1 -1
- package/corpus/core/docs/content/locales/ar-SA/sandbox-adapters.md +3 -3
- package/corpus/core/docs/content/locales/ar-SA/security.md +10 -10
- package/corpus/core/docs/content/locales/ar-SA/server.md +9 -9
- package/corpus/core/docs/content/locales/ar-SA/sharing.md +7 -7
- package/corpus/core/docs/content/locales/ar-SA/skills-guide.md +16 -16
- package/corpus/core/docs/content/locales/ar-SA/template-analytics.md +10 -10
- package/corpus/core/docs/content/locales/ar-SA/template-assets.md +19 -19
- package/corpus/core/docs/content/locales/ar-SA/template-brain.md +11 -11
- package/corpus/core/docs/content/locales/ar-SA/template-calendar.md +9 -9
- package/corpus/core/docs/content/locales/ar-SA/template-chat.md +3 -3
- package/corpus/core/docs/content/locales/ar-SA/template-clips.md +13 -13
- package/corpus/core/docs/content/locales/ar-SA/template-content.md +15 -15
- package/corpus/core/docs/content/locales/ar-SA/template-design.md +7 -7
- package/corpus/core/docs/content/locales/ar-SA/template-dispatch.md +8 -8
- package/corpus/core/docs/content/locales/ar-SA/template-forms.md +9 -9
- package/corpus/core/docs/content/locales/ar-SA/template-mail.md +7 -7
- package/corpus/core/docs/content/locales/ar-SA/template-plan.md +3 -3
- package/corpus/core/docs/content/locales/ar-SA/template-slides.md +8 -8
- package/corpus/core/docs/content/locales/ar-SA/template-videos.md +5 -5
- package/corpus/core/docs/content/locales/ar-SA/tracking.md +6 -6
- package/corpus/core/docs/content/locales/ar-SA/using-your-agent.md +4 -4
- package/corpus/core/docs/content/locales/ar-SA/voice-input.md +4 -4
- package/corpus/core/docs/content/locales/ar-SA/what-is-agent-native.md +4 -4
- package/corpus/core/docs/content/locales/ar-SA/workspace-connections.md +8 -8
- package/corpus/core/docs/content/locales/ar-SA/workspace-management.md +4 -4
- package/corpus/core/docs/content/locales/ar-SA/workspace.md +24 -24
- package/corpus/core/docs/content/locales/ar-SA/writing-agent-instructions.md +18 -18
- package/corpus/core/docs/content/locales/de-DE/a2a-protocol.md +7 -7
- package/corpus/core/docs/content/locales/de-DE/actions.md +5 -5
- package/corpus/core/docs/content/locales/de-DE/agent-mentions.md +4 -4
- package/corpus/core/docs/content/locales/de-DE/agent-surfaces.md +22 -22
- package/corpus/core/docs/content/locales/de-DE/agent-teams.md +4 -4
- package/corpus/core/docs/content/locales/de-DE/agent-web-surfaces.md +4 -4
- package/corpus/core/docs/content/locales/de-DE/authentication.md +6 -6
- package/corpus/core/docs/content/locales/de-DE/automations.md +8 -8
- package/corpus/core/docs/content/locales/de-DE/blueprint-installer.md +2 -2
- package/corpus/core/docs/content/locales/de-DE/client.md +6 -6
- package/corpus/core/docs/content/locales/de-DE/cloneable-saas.md +2 -2
- package/corpus/core/docs/content/locales/de-DE/code-agents-ui.md +9 -9
- package/corpus/core/docs/content/locales/de-DE/components.md +15 -15
- package/corpus/core/docs/content/locales/de-DE/context-awareness.md +8 -8
- package/corpus/core/docs/content/locales/de-DE/creating-templates.md +13 -13
- package/corpus/core/docs/content/locales/de-DE/cross-app-sso.md +3 -3
- package/corpus/core/docs/content/locales/de-DE/database.md +5 -5
- package/corpus/core/docs/content/locales/de-DE/deployment.md +6 -6
- package/corpus/core/docs/content/locales/de-DE/dispatch.md +3 -3
- package/corpus/core/docs/content/locales/de-DE/drop-in-agent.md +14 -14
- package/corpus/core/docs/content/locales/de-DE/durable-resume.md +1 -1
- package/corpus/core/docs/content/locales/de-DE/embedding-sdk.md +2 -2
- package/corpus/core/docs/content/locales/de-DE/evals.md +2 -2
- package/corpus/core/docs/content/locales/de-DE/extensions.md +2 -2
- package/corpus/core/docs/content/locales/de-DE/external-agents.md +6 -6
- package/corpus/core/docs/content/locales/de-DE/faq.md +5 -5
- package/corpus/core/docs/content/locales/de-DE/file-uploads.md +4 -4
- package/corpus/core/docs/content/locales/de-DE/frames.md +2 -2
- package/corpus/core/docs/content/locales/de-DE/getting-started.md +16 -16
- package/corpus/core/docs/content/locales/de-DE/harness-agents.md +3 -3
- package/corpus/core/docs/content/locales/de-DE/human-approval.md +4 -4
- package/corpus/core/docs/content/locales/de-DE/key-concepts.md +14 -14
- package/corpus/core/docs/content/locales/de-DE/local-file-mode.md +8 -8
- package/corpus/core/docs/content/locales/de-DE/mcp-apps.md +4 -4
- package/corpus/core/docs/content/locales/de-DE/mcp-clients.md +7 -7
- package/corpus/core/docs/content/locales/de-DE/mcp-protocol.md +3 -3
- package/corpus/core/docs/content/locales/de-DE/messaging.md +5 -5
- package/corpus/core/docs/content/locales/de-DE/migration-workbench.md +1 -1
- package/corpus/core/docs/content/locales/de-DE/multi-app-workspace.md +2 -2
- package/corpus/core/docs/content/locales/de-DE/multi-tenancy.md +1 -1
- package/corpus/core/docs/content/locales/de-DE/native-chat-ui.md +8 -8
- package/corpus/core/docs/content/locales/de-DE/notifications.md +3 -3
- package/corpus/core/docs/content/locales/de-DE/observability.md +2 -2
- package/corpus/core/docs/content/locales/de-DE/observational-memory.md +2 -2
- package/corpus/core/docs/content/locales/de-DE/onboarding.md +8 -8
- package/corpus/core/docs/content/locales/de-DE/plan-plugin.md +3 -3
- package/corpus/core/docs/content/locales/de-DE/pr-visual-recap.md +11 -11
- package/corpus/core/docs/content/locales/de-DE/processors.md +1 -1
- package/corpus/core/docs/content/locales/de-DE/progress.md +2 -2
- package/corpus/core/docs/content/locales/de-DE/pure-agent-apps.md +1 -1
- package/corpus/core/docs/content/locales/de-DE/real-time-collaboration.md +8 -8
- package/corpus/core/docs/content/locales/de-DE/recurring-jobs.md +5 -5
- package/corpus/core/docs/content/locales/de-DE/routing.md +1 -1
- package/corpus/core/docs/content/locales/de-DE/sandbox-adapters.md +2 -2
- package/corpus/core/docs/content/locales/de-DE/security.md +10 -10
- package/corpus/core/docs/content/locales/de-DE/server.md +10 -10
- package/corpus/core/docs/content/locales/de-DE/sharing.md +6 -6
- package/corpus/core/docs/content/locales/de-DE/skills-guide.md +17 -17
- package/corpus/core/docs/content/locales/de-DE/template-analytics.md +10 -10
- package/corpus/core/docs/content/locales/de-DE/template-assets.md +21 -21
- package/corpus/core/docs/content/locales/de-DE/template-brain.md +11 -11
- package/corpus/core/docs/content/locales/de-DE/template-calendar.md +10 -10
- package/corpus/core/docs/content/locales/de-DE/template-chat.md +5 -5
- package/corpus/core/docs/content/locales/de-DE/template-clips.md +14 -14
- package/corpus/core/docs/content/locales/de-DE/template-content.md +14 -14
- package/corpus/core/docs/content/locales/de-DE/template-design.md +7 -7
- package/corpus/core/docs/content/locales/de-DE/template-dispatch.md +12 -12
- package/corpus/core/docs/content/locales/de-DE/template-forms.md +9 -9
- package/corpus/core/docs/content/locales/de-DE/template-mail.md +6 -6
- package/corpus/core/docs/content/locales/de-DE/template-plan.md +3 -3
- package/corpus/core/docs/content/locales/de-DE/template-slides.md +8 -8
- package/corpus/core/docs/content/locales/de-DE/template-videos.md +6 -6
- package/corpus/core/docs/content/locales/de-DE/tracking.md +3 -3
- package/corpus/core/docs/content/locales/de-DE/using-your-agent.md +6 -6
- package/corpus/core/docs/content/locales/de-DE/voice-input.md +9 -9
- package/corpus/core/docs/content/locales/de-DE/what-is-agent-native.md +6 -6
- package/corpus/core/docs/content/locales/de-DE/workspace-connections.md +9 -9
- package/corpus/core/docs/content/locales/de-DE/workspace-management.md +5 -5
- package/corpus/core/docs/content/locales/de-DE/workspace.md +23 -23
- package/corpus/core/docs/content/locales/de-DE/writing-agent-instructions.md +30 -30
- package/corpus/core/docs/content/locales/es-ES/a2a-protocol.md +7 -7
- package/corpus/core/docs/content/locales/es-ES/actions.md +2 -2
- package/corpus/core/docs/content/locales/es-ES/agent-mentions.md +3 -3
- package/corpus/core/docs/content/locales/es-ES/agent-surfaces.md +7 -7
- package/corpus/core/docs/content/locales/es-ES/agent-teams.md +3 -3
- package/corpus/core/docs/content/locales/es-ES/agent-web-surfaces.md +5 -5
- package/corpus/core/docs/content/locales/es-ES/authentication.md +6 -6
- package/corpus/core/docs/content/locales/es-ES/automations.md +8 -8
- package/corpus/core/docs/content/locales/es-ES/blueprint-installer.md +2 -2
- package/corpus/core/docs/content/locales/es-ES/client.md +1 -1
- package/corpus/core/docs/content/locales/es-ES/cloneable-saas.md +2 -2
- package/corpus/core/docs/content/locales/es-ES/code-agents-ui.md +4 -4
- package/corpus/core/docs/content/locales/es-ES/components.md +5 -5
- package/corpus/core/docs/content/locales/es-ES/context-awareness.md +8 -8
- package/corpus/core/docs/content/locales/es-ES/creating-templates.md +12 -12
- package/corpus/core/docs/content/locales/es-ES/cross-app-sso.md +3 -3
- package/corpus/core/docs/content/locales/es-ES/database.md +5 -5
- package/corpus/core/docs/content/locales/es-ES/deployment.md +4 -4
- package/corpus/core/docs/content/locales/es-ES/dispatch.md +3 -3
- package/corpus/core/docs/content/locales/es-ES/drop-in-agent.md +8 -8
- package/corpus/core/docs/content/locales/es-ES/durable-resume.md +1 -1
- package/corpus/core/docs/content/locales/es-ES/embedding-sdk.md +2 -2
- package/corpus/core/docs/content/locales/es-ES/evals.md +2 -2
- package/corpus/core/docs/content/locales/es-ES/extensions.md +2 -2
- package/corpus/core/docs/content/locales/es-ES/external-agents.md +5 -5
- package/corpus/core/docs/content/locales/es-ES/faq.md +3 -3
- package/corpus/core/docs/content/locales/es-ES/file-uploads.md +4 -4
- package/corpus/core/docs/content/locales/es-ES/frames.md +1 -1
- package/corpus/core/docs/content/locales/es-ES/getting-started.md +13 -13
- package/corpus/core/docs/content/locales/es-ES/harness-agents.md +3 -3
- package/corpus/core/docs/content/locales/es-ES/human-approval.md +3 -3
- package/corpus/core/docs/content/locales/es-ES/key-concepts.md +14 -14
- package/corpus/core/docs/content/locales/es-ES/local-file-mode.md +6 -6
- package/corpus/core/docs/content/locales/es-ES/mcp-apps.md +4 -4
- package/corpus/core/docs/content/locales/es-ES/mcp-clients.md +8 -8
- package/corpus/core/docs/content/locales/es-ES/mcp-protocol.md +3 -3
- package/corpus/core/docs/content/locales/es-ES/messaging.md +4 -4
- package/corpus/core/docs/content/locales/es-ES/migration-workbench.md +1 -1
- package/corpus/core/docs/content/locales/es-ES/multi-app-workspace.md +1 -1
- package/corpus/core/docs/content/locales/es-ES/multi-tenancy.md +1 -1
- package/corpus/core/docs/content/locales/es-ES/native-chat-ui.md +3 -3
- package/corpus/core/docs/content/locales/es-ES/notifications.md +3 -3
- package/corpus/core/docs/content/locales/es-ES/observability.md +2 -2
- package/corpus/core/docs/content/locales/es-ES/observational-memory.md +2 -2
- package/corpus/core/docs/content/locales/es-ES/onboarding.md +8 -8
- package/corpus/core/docs/content/locales/es-ES/plan-plugin.md +3 -3
- package/corpus/core/docs/content/locales/es-ES/pr-visual-recap.md +11 -11
- package/corpus/core/docs/content/locales/es-ES/processors.md +1 -1
- package/corpus/core/docs/content/locales/es-ES/progress.md +2 -2
- package/corpus/core/docs/content/locales/es-ES/pure-agent-apps.md +1 -1
- package/corpus/core/docs/content/locales/es-ES/real-time-collaboration.md +6 -6
- package/corpus/core/docs/content/locales/es-ES/recurring-jobs.md +5 -5
- package/corpus/core/docs/content/locales/es-ES/routing.md +1 -1
- package/corpus/core/docs/content/locales/es-ES/sandbox-adapters.md +2 -2
- package/corpus/core/docs/content/locales/es-ES/security.md +8 -8
- package/corpus/core/docs/content/locales/es-ES/server.md +11 -11
- package/corpus/core/docs/content/locales/es-ES/sharing.md +6 -6
- package/corpus/core/docs/content/locales/es-ES/skills-guide.md +16 -16
- package/corpus/core/docs/content/locales/es-ES/template-analytics.md +10 -10
- package/corpus/core/docs/content/locales/es-ES/template-assets.md +19 -19
- package/corpus/core/docs/content/locales/es-ES/template-brain.md +11 -11
- package/corpus/core/docs/content/locales/es-ES/template-calendar.md +9 -9
- package/corpus/core/docs/content/locales/es-ES/template-chat.md +3 -3
- package/corpus/core/docs/content/locales/es-ES/template-clips.md +14 -14
- package/corpus/core/docs/content/locales/es-ES/template-content.md +13 -13
- package/corpus/core/docs/content/locales/es-ES/template-design.md +7 -7
- package/corpus/core/docs/content/locales/es-ES/template-dispatch.md +8 -8
- package/corpus/core/docs/content/locales/es-ES/template-forms.md +9 -9
- package/corpus/core/docs/content/locales/es-ES/template-mail.md +6 -6
- package/corpus/core/docs/content/locales/es-ES/template-plan.md +3 -3
- package/corpus/core/docs/content/locales/es-ES/template-slides.md +8 -8
- package/corpus/core/docs/content/locales/es-ES/template-videos.md +5 -5
- package/corpus/core/docs/content/locales/es-ES/tracking.md +3 -3
- package/corpus/core/docs/content/locales/es-ES/using-your-agent.md +5 -5
- package/corpus/core/docs/content/locales/es-ES/voice-input.md +4 -4
- package/corpus/core/docs/content/locales/es-ES/what-is-agent-native.md +6 -6
- package/corpus/core/docs/content/locales/es-ES/workspace-connections.md +8 -8
- package/corpus/core/docs/content/locales/es-ES/workspace-management.md +4 -4
- package/corpus/core/docs/content/locales/es-ES/workspace.md +23 -23
- package/corpus/core/docs/content/locales/es-ES/writing-agent-instructions.md +18 -18
- package/corpus/core/docs/content/locales/fr-FR/a2a-protocol.md +7 -7
- package/corpus/core/docs/content/locales/fr-FR/actions.md +2 -2
- package/corpus/core/docs/content/locales/fr-FR/agent-mentions.md +3 -3
- package/corpus/core/docs/content/locales/fr-FR/agent-surfaces.md +7 -7
- package/corpus/core/docs/content/locales/fr-FR/agent-teams.md +3 -3
- package/corpus/core/docs/content/locales/fr-FR/agent-web-surfaces.md +5 -5
- package/corpus/core/docs/content/locales/fr-FR/authentication.md +6 -6
- package/corpus/core/docs/content/locales/fr-FR/automations.md +8 -8
- package/corpus/core/docs/content/locales/fr-FR/blueprint-installer.md +2 -2
- package/corpus/core/docs/content/locales/fr-FR/client.md +1 -1
- package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.md +2 -2
- package/corpus/core/docs/content/locales/fr-FR/code-agents-ui.md +4 -4
- package/corpus/core/docs/content/locales/fr-FR/components.md +5 -5
- package/corpus/core/docs/content/locales/fr-FR/context-awareness.md +8 -8
- package/corpus/core/docs/content/locales/fr-FR/creating-templates.md +12 -12
- package/corpus/core/docs/content/locales/fr-FR/cross-app-sso.md +4 -4
- package/corpus/core/docs/content/locales/fr-FR/database.md +5 -5
- package/corpus/core/docs/content/locales/fr-FR/deployment.md +5 -5
- package/corpus/core/docs/content/locales/fr-FR/dispatch.md +3 -3
- package/corpus/core/docs/content/locales/fr-FR/drop-in-agent.md +9 -9
- package/corpus/core/docs/content/locales/fr-FR/durable-resume.md +1 -1
- package/corpus/core/docs/content/locales/fr-FR/embedding-sdk.md +7 -7
- package/corpus/core/docs/content/locales/fr-FR/evals.md +2 -2
- package/corpus/core/docs/content/locales/fr-FR/extensions.md +2 -2
- package/corpus/core/docs/content/locales/fr-FR/external-agents.md +5 -5
- package/corpus/core/docs/content/locales/fr-FR/faq.md +3 -3
- package/corpus/core/docs/content/locales/fr-FR/file-uploads.md +5 -5
- package/corpus/core/docs/content/locales/fr-FR/frames.md +1 -1
- package/corpus/core/docs/content/locales/fr-FR/getting-started.md +13 -13
- package/corpus/core/docs/content/locales/fr-FR/harness-agents.md +3 -3
- package/corpus/core/docs/content/locales/fr-FR/human-approval.md +3 -3
- package/corpus/core/docs/content/locales/fr-FR/key-concepts.md +15 -15
- package/corpus/core/docs/content/locales/fr-FR/local-file-mode.md +5 -5
- package/corpus/core/docs/content/locales/fr-FR/mcp-apps.md +4 -4
- package/corpus/core/docs/content/locales/fr-FR/mcp-clients.md +8 -8
- package/corpus/core/docs/content/locales/fr-FR/mcp-protocol.md +3 -3
- package/corpus/core/docs/content/locales/fr-FR/messaging.md +4 -4
- package/corpus/core/docs/content/locales/fr-FR/migration-workbench.md +1 -1
- package/corpus/core/docs/content/locales/fr-FR/multi-app-workspace.md +1 -1
- package/corpus/core/docs/content/locales/fr-FR/multi-tenancy.md +1 -1
- package/corpus/core/docs/content/locales/fr-FR/native-chat-ui.md +3 -3
- package/corpus/core/docs/content/locales/fr-FR/notifications.md +3 -3
- package/corpus/core/docs/content/locales/fr-FR/observability.md +2 -2
- package/corpus/core/docs/content/locales/fr-FR/observational-memory.md +2 -2
- package/corpus/core/docs/content/locales/fr-FR/onboarding.md +8 -8
- package/corpus/core/docs/content/locales/fr-FR/plan-plugin.md +3 -3
- package/corpus/core/docs/content/locales/fr-FR/pr-visual-recap.md +11 -11
- package/corpus/core/docs/content/locales/fr-FR/processors.md +1 -1
- package/corpus/core/docs/content/locales/fr-FR/progress.md +2 -2
- package/corpus/core/docs/content/locales/fr-FR/pure-agent-apps.md +1 -1
- package/corpus/core/docs/content/locales/fr-FR/real-time-collaboration.md +8 -8
- package/corpus/core/docs/content/locales/fr-FR/recurring-jobs.md +5 -5
- package/corpus/core/docs/content/locales/fr-FR/routing.md +1 -1
- package/corpus/core/docs/content/locales/fr-FR/sandbox-adapters.md +2 -2
- package/corpus/core/docs/content/locales/fr-FR/security.md +8 -8
- package/corpus/core/docs/content/locales/fr-FR/server.md +10 -10
- package/corpus/core/docs/content/locales/fr-FR/sharing.md +6 -6
- package/corpus/core/docs/content/locales/fr-FR/skills-guide.md +16 -16
- package/corpus/core/docs/content/locales/fr-FR/template-analytics.md +10 -10
- package/corpus/core/docs/content/locales/fr-FR/template-assets.md +20 -20
- package/corpus/core/docs/content/locales/fr-FR/template-brain.md +11 -11
- package/corpus/core/docs/content/locales/fr-FR/template-calendar.md +9 -9
- package/corpus/core/docs/content/locales/fr-FR/template-chat.md +3 -3
- package/corpus/core/docs/content/locales/fr-FR/template-clips.md +15 -15
- package/corpus/core/docs/content/locales/fr-FR/template-content.md +13 -13
- package/corpus/core/docs/content/locales/fr-FR/template-design.md +8 -8
- package/corpus/core/docs/content/locales/fr-FR/template-dispatch.md +8 -8
- package/corpus/core/docs/content/locales/fr-FR/template-forms.md +10 -10
- package/corpus/core/docs/content/locales/fr-FR/template-mail.md +6 -6
- package/corpus/core/docs/content/locales/fr-FR/template-plan.md +3 -3
- package/corpus/core/docs/content/locales/fr-FR/template-slides.md +9 -9
- package/corpus/core/docs/content/locales/fr-FR/template-videos.md +5 -5
- package/corpus/core/docs/content/locales/fr-FR/tracking.md +3 -3
- package/corpus/core/docs/content/locales/fr-FR/using-your-agent.md +5 -5
- package/corpus/core/docs/content/locales/fr-FR/voice-input.md +4 -4
- package/corpus/core/docs/content/locales/fr-FR/what-is-agent-native.md +6 -6
- package/corpus/core/docs/content/locales/fr-FR/workspace-connections.md +8 -8
- package/corpus/core/docs/content/locales/fr-FR/workspace-management.md +5 -5
- package/corpus/core/docs/content/locales/fr-FR/workspace.md +23 -23
- package/corpus/core/docs/content/locales/fr-FR/writing-agent-instructions.md +18 -18
- package/corpus/core/docs/content/locales/hi-IN/a2a-protocol.md +7 -7
- package/corpus/core/docs/content/locales/hi-IN/actions.md +3 -3
- package/corpus/core/docs/content/locales/hi-IN/agent-mentions.md +3 -3
- package/corpus/core/docs/content/locales/hi-IN/agent-surfaces.md +7 -7
- package/corpus/core/docs/content/locales/hi-IN/agent-teams.md +3 -3
- package/corpus/core/docs/content/locales/hi-IN/agent-web-surfaces.md +5 -5
- package/corpus/core/docs/content/locales/hi-IN/authentication.md +6 -6
- package/corpus/core/docs/content/locales/hi-IN/automations.md +8 -8
- package/corpus/core/docs/content/locales/hi-IN/blueprint-installer.md +2 -2
- package/corpus/core/docs/content/locales/hi-IN/client.md +1 -1
- package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.md +2 -2
- package/corpus/core/docs/content/locales/hi-IN/code-agents-ui.md +4 -4
- package/corpus/core/docs/content/locales/hi-IN/components.md +5 -5
- package/corpus/core/docs/content/locales/hi-IN/context-awareness.md +8 -8
- package/corpus/core/docs/content/locales/hi-IN/creating-templates.md +14 -14
- package/corpus/core/docs/content/locales/hi-IN/cross-app-sso.md +3 -3
- package/corpus/core/docs/content/locales/hi-IN/database.md +5 -5
- package/corpus/core/docs/content/locales/hi-IN/deployment.md +5 -5
- package/corpus/core/docs/content/locales/hi-IN/dispatch.md +4 -4
- package/corpus/core/docs/content/locales/hi-IN/drop-in-agent.md +8 -8
- package/corpus/core/docs/content/locales/hi-IN/durable-resume.md +1 -1
- package/corpus/core/docs/content/locales/hi-IN/embedding-sdk.md +2 -2
- package/corpus/core/docs/content/locales/hi-IN/evals.md +2 -2
- package/corpus/core/docs/content/locales/hi-IN/extensions.md +2 -2
- package/corpus/core/docs/content/locales/hi-IN/external-agents.md +5 -5
- package/corpus/core/docs/content/locales/hi-IN/faq.md +3 -3
- package/corpus/core/docs/content/locales/hi-IN/file-uploads.md +4 -4
- package/corpus/core/docs/content/locales/hi-IN/frames.md +1 -1
- package/corpus/core/docs/content/locales/hi-IN/getting-started.md +14 -14
- package/corpus/core/docs/content/locales/hi-IN/harness-agents.md +3 -3
- package/corpus/core/docs/content/locales/hi-IN/human-approval.md +3 -3
- package/corpus/core/docs/content/locales/hi-IN/key-concepts.md +14 -14
- package/corpus/core/docs/content/locales/hi-IN/local-file-mode.md +5 -5
- package/corpus/core/docs/content/locales/hi-IN/mcp-apps.md +4 -4
- package/corpus/core/docs/content/locales/hi-IN/mcp-clients.md +7 -7
- package/corpus/core/docs/content/locales/hi-IN/mcp-protocol.md +3 -3
- package/corpus/core/docs/content/locales/hi-IN/messaging.md +6 -6
- package/corpus/core/docs/content/locales/hi-IN/migration-workbench.md +1 -1
- package/corpus/core/docs/content/locales/hi-IN/multi-app-workspace.md +1 -1
- package/corpus/core/docs/content/locales/hi-IN/multi-tenancy.md +1 -1
- package/corpus/core/docs/content/locales/hi-IN/native-chat-ui.md +3 -3
- package/corpus/core/docs/content/locales/hi-IN/notifications.md +3 -3
- package/corpus/core/docs/content/locales/hi-IN/observability.md +2 -2
- package/corpus/core/docs/content/locales/hi-IN/observational-memory.md +2 -2
- package/corpus/core/docs/content/locales/hi-IN/onboarding.md +8 -8
- package/corpus/core/docs/content/locales/hi-IN/plan-plugin.md +3 -3
- package/corpus/core/docs/content/locales/hi-IN/pr-visual-recap.md +11 -11
- package/corpus/core/docs/content/locales/hi-IN/processors.md +1 -1
- package/corpus/core/docs/content/locales/hi-IN/progress.md +2 -2
- package/corpus/core/docs/content/locales/hi-IN/pure-agent-apps.md +1 -1
- package/corpus/core/docs/content/locales/hi-IN/real-time-collaboration.md +6 -6
- package/corpus/core/docs/content/locales/hi-IN/recurring-jobs.md +5 -5
- package/corpus/core/docs/content/locales/hi-IN/routing.md +1 -1
- package/corpus/core/docs/content/locales/hi-IN/sandbox-adapters.md +2 -2
- package/corpus/core/docs/content/locales/hi-IN/security.md +8 -8
- package/corpus/core/docs/content/locales/hi-IN/server.md +10 -10
- package/corpus/core/docs/content/locales/hi-IN/sharing.md +6 -6
- package/corpus/core/docs/content/locales/hi-IN/skills-guide.md +16 -16
- package/corpus/core/docs/content/locales/hi-IN/template-analytics.md +10 -10
- package/corpus/core/docs/content/locales/hi-IN/template-assets.md +19 -19
- package/corpus/core/docs/content/locales/hi-IN/template-brain.md +11 -11
- package/corpus/core/docs/content/locales/hi-IN/template-calendar.md +9 -9
- package/corpus/core/docs/content/locales/hi-IN/template-chat.md +3 -3
- package/corpus/core/docs/content/locales/hi-IN/template-clips.md +14 -14
- package/corpus/core/docs/content/locales/hi-IN/template-content.md +13 -13
- package/corpus/core/docs/content/locales/hi-IN/template-design.md +7 -7
- package/corpus/core/docs/content/locales/hi-IN/template-dispatch.md +9 -9
- package/corpus/core/docs/content/locales/hi-IN/template-forms.md +9 -9
- package/corpus/core/docs/content/locales/hi-IN/template-mail.md +6 -6
- package/corpus/core/docs/content/locales/hi-IN/template-plan.md +3 -3
- package/corpus/core/docs/content/locales/hi-IN/template-slides.md +8 -8
- package/corpus/core/docs/content/locales/hi-IN/template-videos.md +5 -5
- package/corpus/core/docs/content/locales/hi-IN/tracking.md +3 -3
- package/corpus/core/docs/content/locales/hi-IN/using-your-agent.md +1 -1
- package/corpus/core/docs/content/locales/hi-IN/voice-input.md +4 -4
- package/corpus/core/docs/content/locales/hi-IN/what-is-agent-native.md +4 -4
- package/corpus/core/docs/content/locales/hi-IN/workspace-connections.md +8 -8
- package/corpus/core/docs/content/locales/hi-IN/workspace-management.md +4 -4
- package/corpus/core/docs/content/locales/hi-IN/workspace.md +23 -23
- package/corpus/core/docs/content/locales/hi-IN/writing-agent-instructions.md +18 -18
- package/corpus/core/docs/content/locales/ja-JP/a2a-protocol.md +7 -7
- package/corpus/core/docs/content/locales/ja-JP/actions.md +3 -3
- package/corpus/core/docs/content/locales/ja-JP/agent-mentions.md +3 -3
- package/corpus/core/docs/content/locales/ja-JP/agent-surfaces.md +7 -7
- package/corpus/core/docs/content/locales/ja-JP/agent-teams.md +3 -3
- package/corpus/core/docs/content/locales/ja-JP/agent-web-surfaces.md +5 -5
- package/corpus/core/docs/content/locales/ja-JP/authentication.md +6 -6
- package/corpus/core/docs/content/locales/ja-JP/automations.md +8 -8
- package/corpus/core/docs/content/locales/ja-JP/blueprint-installer.md +2 -2
- package/corpus/core/docs/content/locales/ja-JP/client.md +1 -1
- package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.md +2 -2
- package/corpus/core/docs/content/locales/ja-JP/code-agents-ui.md +4 -4
- package/corpus/core/docs/content/locales/ja-JP/components.md +5 -5
- package/corpus/core/docs/content/locales/ja-JP/context-awareness.md +8 -8
- package/corpus/core/docs/content/locales/ja-JP/creating-templates.md +12 -12
- package/corpus/core/docs/content/locales/ja-JP/cross-app-sso.md +3 -3
- package/corpus/core/docs/content/locales/ja-JP/database.md +7 -7
- package/corpus/core/docs/content/locales/ja-JP/deployment.md +4 -4
- package/corpus/core/docs/content/locales/ja-JP/dispatch.md +4 -4
- package/corpus/core/docs/content/locales/ja-JP/drop-in-agent.md +8 -8
- package/corpus/core/docs/content/locales/ja-JP/durable-resume.md +1 -1
- package/corpus/core/docs/content/locales/ja-JP/embedding-sdk.md +2 -2
- package/corpus/core/docs/content/locales/ja-JP/evals.md +2 -2
- package/corpus/core/docs/content/locales/ja-JP/extensions.md +2 -2
- package/corpus/core/docs/content/locales/ja-JP/external-agents.md +5 -5
- package/corpus/core/docs/content/locales/ja-JP/faq.md +3 -3
- package/corpus/core/docs/content/locales/ja-JP/file-uploads.md +4 -4
- package/corpus/core/docs/content/locales/ja-JP/frames.md +1 -1
- package/corpus/core/docs/content/locales/ja-JP/getting-started.md +13 -13
- package/corpus/core/docs/content/locales/ja-JP/harness-agents.md +3 -3
- package/corpus/core/docs/content/locales/ja-JP/human-approval.md +3 -3
- package/corpus/core/docs/content/locales/ja-JP/key-concepts.md +14 -14
- package/corpus/core/docs/content/locales/ja-JP/local-file-mode.md +5 -5
- package/corpus/core/docs/content/locales/ja-JP/mcp-apps.md +4 -4
- package/corpus/core/docs/content/locales/ja-JP/mcp-clients.md +8 -8
- package/corpus/core/docs/content/locales/ja-JP/mcp-protocol.md +3 -3
- package/corpus/core/docs/content/locales/ja-JP/messaging.md +6 -6
- package/corpus/core/docs/content/locales/ja-JP/migration-workbench.md +1 -1
- package/corpus/core/docs/content/locales/ja-JP/multi-app-workspace.md +1 -1
- package/corpus/core/docs/content/locales/ja-JP/multi-tenancy.md +1 -1
- package/corpus/core/docs/content/locales/ja-JP/native-chat-ui.md +3 -3
- package/corpus/core/docs/content/locales/ja-JP/notifications.md +3 -3
- package/corpus/core/docs/content/locales/ja-JP/observability.md +2 -2
- package/corpus/core/docs/content/locales/ja-JP/observational-memory.md +2 -2
- package/corpus/core/docs/content/locales/ja-JP/onboarding.md +8 -8
- package/corpus/core/docs/content/locales/ja-JP/plan-plugin.md +3 -3
- package/corpus/core/docs/content/locales/ja-JP/pr-visual-recap.md +11 -11
- package/corpus/core/docs/content/locales/ja-JP/processors.md +1 -1
- package/corpus/core/docs/content/locales/ja-JP/progress.md +2 -2
- package/corpus/core/docs/content/locales/ja-JP/pure-agent-apps.md +1 -1
- package/corpus/core/docs/content/locales/ja-JP/real-time-collaboration.md +6 -6
- package/corpus/core/docs/content/locales/ja-JP/recurring-jobs.md +5 -5
- package/corpus/core/docs/content/locales/ja-JP/routing.md +1 -1
- package/corpus/core/docs/content/locales/ja-JP/sandbox-adapters.md +2 -2
- package/corpus/core/docs/content/locales/ja-JP/security.md +8 -8
- package/corpus/core/docs/content/locales/ja-JP/server.md +10 -10
- package/corpus/core/docs/content/locales/ja-JP/sharing.md +6 -6
- package/corpus/core/docs/content/locales/ja-JP/skills-guide.md +16 -16
- package/corpus/core/docs/content/locales/ja-JP/template-analytics.md +10 -10
- package/corpus/core/docs/content/locales/ja-JP/template-assets.md +19 -19
- package/corpus/core/docs/content/locales/ja-JP/template-brain.md +11 -11
- package/corpus/core/docs/content/locales/ja-JP/template-calendar.md +9 -9
- package/corpus/core/docs/content/locales/ja-JP/template-chat.md +3 -3
- package/corpus/core/docs/content/locales/ja-JP/template-clips.md +14 -14
- package/corpus/core/docs/content/locales/ja-JP/template-content.md +13 -13
- package/corpus/core/docs/content/locales/ja-JP/template-design.md +7 -7
- package/corpus/core/docs/content/locales/ja-JP/template-dispatch.md +12 -12
- package/corpus/core/docs/content/locales/ja-JP/template-forms.md +9 -9
- package/corpus/core/docs/content/locales/ja-JP/template-mail.md +6 -6
- package/corpus/core/docs/content/locales/ja-JP/template-plan.md +3 -3
- package/corpus/core/docs/content/locales/ja-JP/template-slides.md +8 -8
- package/corpus/core/docs/content/locales/ja-JP/template-videos.md +5 -5
- package/corpus/core/docs/content/locales/ja-JP/tracking.md +3 -3
- package/corpus/core/docs/content/locales/ja-JP/using-your-agent.md +4 -4
- package/corpus/core/docs/content/locales/ja-JP/voice-input.md +4 -4
- package/corpus/core/docs/content/locales/ja-JP/what-is-agent-native.md +4 -4
- package/corpus/core/docs/content/locales/ja-JP/workspace-connections.md +8 -8
- package/corpus/core/docs/content/locales/ja-JP/workspace-management.md +5 -5
- package/corpus/core/docs/content/locales/ja-JP/workspace.md +23 -23
- package/corpus/core/docs/content/locales/ja-JP/writing-agent-instructions.md +18 -18
- package/corpus/core/docs/content/locales/ko-KR/a2a-protocol.md +7 -7
- package/corpus/core/docs/content/locales/ko-KR/actions.md +3 -3
- package/corpus/core/docs/content/locales/ko-KR/agent-mentions.md +3 -3
- package/corpus/core/docs/content/locales/ko-KR/agent-surfaces.md +15 -15
- package/corpus/core/docs/content/locales/ko-KR/agent-teams.md +3 -3
- package/corpus/core/docs/content/locales/ko-KR/agent-web-surfaces.md +5 -5
- package/corpus/core/docs/content/locales/ko-KR/authentication.md +13 -13
- package/corpus/core/docs/content/locales/ko-KR/automations.md +8 -8
- package/corpus/core/docs/content/locales/ko-KR/blueprint-installer.md +2 -2
- package/corpus/core/docs/content/locales/ko-KR/client.md +1 -1
- package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.md +2 -2
- package/corpus/core/docs/content/locales/ko-KR/code-agents-ui.md +4 -4
- package/corpus/core/docs/content/locales/ko-KR/components.md +5 -5
- package/corpus/core/docs/content/locales/ko-KR/context-awareness.md +8 -8
- package/corpus/core/docs/content/locales/ko-KR/creating-templates.md +12 -12
- package/corpus/core/docs/content/locales/ko-KR/cross-app-sso.md +3 -3
- package/corpus/core/docs/content/locales/ko-KR/database.md +7 -7
- package/corpus/core/docs/content/locales/ko-KR/deployment.md +4 -4
- package/corpus/core/docs/content/locales/ko-KR/dispatch.md +4 -4
- package/corpus/core/docs/content/locales/ko-KR/drop-in-agent.md +8 -8
- package/corpus/core/docs/content/locales/ko-KR/durable-resume.md +1 -1
- package/corpus/core/docs/content/locales/ko-KR/embedding-sdk.md +2 -2
- package/corpus/core/docs/content/locales/ko-KR/evals.md +2 -2
- package/corpus/core/docs/content/locales/ko-KR/extensions.md +2 -2
- package/corpus/core/docs/content/locales/ko-KR/external-agents.md +5 -5
- package/corpus/core/docs/content/locales/ko-KR/faq.md +3 -3
- package/corpus/core/docs/content/locales/ko-KR/file-uploads.md +4 -4
- package/corpus/core/docs/content/locales/ko-KR/frames.md +1 -1
- package/corpus/core/docs/content/locales/ko-KR/getting-started.md +13 -13
- package/corpus/core/docs/content/locales/ko-KR/harness-agents.md +3 -3
- package/corpus/core/docs/content/locales/ko-KR/human-approval.md +3 -3
- package/corpus/core/docs/content/locales/ko-KR/key-concepts.md +14 -14
- package/corpus/core/docs/content/locales/ko-KR/local-file-mode.md +5 -5
- package/corpus/core/docs/content/locales/ko-KR/mcp-apps.md +4 -4
- package/corpus/core/docs/content/locales/ko-KR/mcp-clients.md +8 -8
- package/corpus/core/docs/content/locales/ko-KR/mcp-protocol.md +3 -3
- package/corpus/core/docs/content/locales/ko-KR/messaging.md +6 -6
- package/corpus/core/docs/content/locales/ko-KR/migration-workbench.md +1 -1
- package/corpus/core/docs/content/locales/ko-KR/multi-app-workspace.md +1 -1
- package/corpus/core/docs/content/locales/ko-KR/multi-tenancy.md +1 -1
- package/corpus/core/docs/content/locales/ko-KR/native-chat-ui.md +3 -3
- package/corpus/core/docs/content/locales/ko-KR/notifications.md +3 -3
- package/corpus/core/docs/content/locales/ko-KR/observability.md +2 -2
- package/corpus/core/docs/content/locales/ko-KR/observational-memory.md +2 -2
- package/corpus/core/docs/content/locales/ko-KR/onboarding.md +8 -8
- package/corpus/core/docs/content/locales/ko-KR/plan-plugin.md +3 -3
- package/corpus/core/docs/content/locales/ko-KR/pr-visual-recap.md +11 -11
- package/corpus/core/docs/content/locales/ko-KR/processors.md +1 -1
- package/corpus/core/docs/content/locales/ko-KR/progress.md +2 -2
- package/corpus/core/docs/content/locales/ko-KR/pure-agent-apps.md +1 -1
- package/corpus/core/docs/content/locales/ko-KR/real-time-collaboration.md +6 -6
- package/corpus/core/docs/content/locales/ko-KR/recurring-jobs.md +5 -5
- package/corpus/core/docs/content/locales/ko-KR/routing.md +1 -1
- package/corpus/core/docs/content/locales/ko-KR/sandbox-adapters.md +2 -2
- package/corpus/core/docs/content/locales/ko-KR/security.md +8 -8
- package/corpus/core/docs/content/locales/ko-KR/server.md +10 -10
- package/corpus/core/docs/content/locales/ko-KR/sharing.md +6 -6
- package/corpus/core/docs/content/locales/ko-KR/skills-guide.md +16 -16
- package/corpus/core/docs/content/locales/ko-KR/template-analytics.md +10 -10
- package/corpus/core/docs/content/locales/ko-KR/template-assets.md +19 -19
- package/corpus/core/docs/content/locales/ko-KR/template-brain.md +11 -11
- package/corpus/core/docs/content/locales/ko-KR/template-calendar.md +9 -9
- package/corpus/core/docs/content/locales/ko-KR/template-chat.md +3 -3
- package/corpus/core/docs/content/locales/ko-KR/template-clips.md +14 -14
- package/corpus/core/docs/content/locales/ko-KR/template-content.md +13 -13
- package/corpus/core/docs/content/locales/ko-KR/template-design.md +7 -7
- package/corpus/core/docs/content/locales/ko-KR/template-dispatch.md +11 -11
- package/corpus/core/docs/content/locales/ko-KR/template-forms.md +9 -9
- package/corpus/core/docs/content/locales/ko-KR/template-mail.md +6 -6
- package/corpus/core/docs/content/locales/ko-KR/template-plan.md +3 -3
- package/corpus/core/docs/content/locales/ko-KR/template-slides.md +8 -8
- package/corpus/core/docs/content/locales/ko-KR/template-videos.md +5 -5
- package/corpus/core/docs/content/locales/ko-KR/tracking.md +3 -3
- package/corpus/core/docs/content/locales/ko-KR/using-your-agent.md +5 -5
- package/corpus/core/docs/content/locales/ko-KR/voice-input.md +4 -4
- package/corpus/core/docs/content/locales/ko-KR/what-is-agent-native.md +6 -6
- package/corpus/core/docs/content/locales/ko-KR/workspace-connections.md +8 -8
- package/corpus/core/docs/content/locales/ko-KR/workspace-management.md +4 -4
- package/corpus/core/docs/content/locales/ko-KR/workspace.md +23 -23
- package/corpus/core/docs/content/locales/ko-KR/writing-agent-instructions.md +18 -18
- package/corpus/core/docs/content/locales/pt-BR/a2a-protocol.md +7 -7
- package/corpus/core/docs/content/locales/pt-BR/actions.md +2 -2
- package/corpus/core/docs/content/locales/pt-BR/agent-mentions.md +3 -3
- package/corpus/core/docs/content/locales/pt-BR/agent-surfaces.md +7 -7
- package/corpus/core/docs/content/locales/pt-BR/agent-teams.md +3 -3
- package/corpus/core/docs/content/locales/pt-BR/agent-web-surfaces.md +5 -5
- package/corpus/core/docs/content/locales/pt-BR/authentication.md +6 -6
- package/corpus/core/docs/content/locales/pt-BR/automations.md +8 -8
- package/corpus/core/docs/content/locales/pt-BR/blueprint-installer.md +2 -2
- package/corpus/core/docs/content/locales/pt-BR/client.md +2 -2
- package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.md +2 -2
- package/corpus/core/docs/content/locales/pt-BR/code-agents-ui.md +4 -4
- package/corpus/core/docs/content/locales/pt-BR/components.md +5 -5
- package/corpus/core/docs/content/locales/pt-BR/context-awareness.md +8 -8
- package/corpus/core/docs/content/locales/pt-BR/creating-templates.md +12 -12
- package/corpus/core/docs/content/locales/pt-BR/cross-app-sso.md +3 -3
- package/corpus/core/docs/content/locales/pt-BR/database.md +5 -5
- package/corpus/core/docs/content/locales/pt-BR/deployment.md +5 -5
- package/corpus/core/docs/content/locales/pt-BR/dispatch.md +3 -3
- package/corpus/core/docs/content/locales/pt-BR/drop-in-agent.md +9 -9
- package/corpus/core/docs/content/locales/pt-BR/durable-resume.md +1 -1
- package/corpus/core/docs/content/locales/pt-BR/embedding-sdk.md +2 -2
- package/corpus/core/docs/content/locales/pt-BR/evals.md +2 -2
- package/corpus/core/docs/content/locales/pt-BR/extensions.md +2 -2
- package/corpus/core/docs/content/locales/pt-BR/external-agents.md +5 -5
- package/corpus/core/docs/content/locales/pt-BR/faq.md +3 -3
- package/corpus/core/docs/content/locales/pt-BR/file-uploads.md +4 -4
- package/corpus/core/docs/content/locales/pt-BR/frames.md +2 -2
- package/corpus/core/docs/content/locales/pt-BR/getting-started.md +13 -13
- package/corpus/core/docs/content/locales/pt-BR/harness-agents.md +3 -3
- package/corpus/core/docs/content/locales/pt-BR/human-approval.md +3 -3
- package/corpus/core/docs/content/locales/pt-BR/key-concepts.md +15 -15
- package/corpus/core/docs/content/locales/pt-BR/local-file-mode.md +5 -5
- package/corpus/core/docs/content/locales/pt-BR/mcp-apps.md +4 -4
- package/corpus/core/docs/content/locales/pt-BR/mcp-clients.md +8 -8
- package/corpus/core/docs/content/locales/pt-BR/mcp-protocol.md +3 -3
- package/corpus/core/docs/content/locales/pt-BR/messaging.md +4 -4
- package/corpus/core/docs/content/locales/pt-BR/migration-workbench.md +1 -1
- package/corpus/core/docs/content/locales/pt-BR/multi-app-workspace.md +1 -1
- package/corpus/core/docs/content/locales/pt-BR/multi-tenancy.md +1 -1
- package/corpus/core/docs/content/locales/pt-BR/native-chat-ui.md +3 -3
- package/corpus/core/docs/content/locales/pt-BR/notifications.md +3 -3
- package/corpus/core/docs/content/locales/pt-BR/observability.md +2 -2
- package/corpus/core/docs/content/locales/pt-BR/observational-memory.md +2 -2
- package/corpus/core/docs/content/locales/pt-BR/onboarding.md +8 -8
- package/corpus/core/docs/content/locales/pt-BR/plan-plugin.md +3 -3
- package/corpus/core/docs/content/locales/pt-BR/pr-visual-recap.md +11 -11
- package/corpus/core/docs/content/locales/pt-BR/processors.md +1 -1
- package/corpus/core/docs/content/locales/pt-BR/progress.md +2 -2
- package/corpus/core/docs/content/locales/pt-BR/pure-agent-apps.md +1 -1
- package/corpus/core/docs/content/locales/pt-BR/real-time-collaboration.md +6 -6
- package/corpus/core/docs/content/locales/pt-BR/recurring-jobs.md +5 -5
- package/corpus/core/docs/content/locales/pt-BR/routing.md +1 -1
- package/corpus/core/docs/content/locales/pt-BR/sandbox-adapters.md +2 -2
- package/corpus/core/docs/content/locales/pt-BR/security.md +9 -9
- package/corpus/core/docs/content/locales/pt-BR/server.md +10 -10
- package/corpus/core/docs/content/locales/pt-BR/sharing.md +6 -6
- package/corpus/core/docs/content/locales/pt-BR/skills-guide.md +16 -16
- package/corpus/core/docs/content/locales/pt-BR/template-analytics.md +10 -10
- package/corpus/core/docs/content/locales/pt-BR/template-assets.md +20 -20
- package/corpus/core/docs/content/locales/pt-BR/template-brain.md +11 -11
- package/corpus/core/docs/content/locales/pt-BR/template-calendar.md +9 -9
- package/corpus/core/docs/content/locales/pt-BR/template-chat.md +3 -3
- package/corpus/core/docs/content/locales/pt-BR/template-clips.md +15 -15
- package/corpus/core/docs/content/locales/pt-BR/template-content.md +13 -13
- package/corpus/core/docs/content/locales/pt-BR/template-design.md +8 -8
- package/corpus/core/docs/content/locales/pt-BR/template-dispatch.md +8 -8
- package/corpus/core/docs/content/locales/pt-BR/template-forms.md +10 -10
- package/corpus/core/docs/content/locales/pt-BR/template-mail.md +6 -6
- package/corpus/core/docs/content/locales/pt-BR/template-plan.md +3 -3
- package/corpus/core/docs/content/locales/pt-BR/template-slides.md +9 -9
- package/corpus/core/docs/content/locales/pt-BR/template-videos.md +5 -5
- package/corpus/core/docs/content/locales/pt-BR/tracking.md +3 -3
- package/corpus/core/docs/content/locales/pt-BR/using-your-agent.md +5 -5
- package/corpus/core/docs/content/locales/pt-BR/voice-input.md +4 -4
- package/corpus/core/docs/content/locales/pt-BR/what-is-agent-native.md +5 -5
- package/corpus/core/docs/content/locales/pt-BR/workspace-connections.md +8 -8
- package/corpus/core/docs/content/locales/pt-BR/workspace-management.md +4 -4
- package/corpus/core/docs/content/locales/pt-BR/workspace.md +23 -23
- package/corpus/core/docs/content/locales/pt-BR/writing-agent-instructions.md +18 -18
- package/corpus/core/docs/content/locales/zh-CN/a2a-protocol.md +7 -7
- package/corpus/core/docs/content/locales/zh-CN/actions.md +3 -3
- package/corpus/core/docs/content/locales/zh-CN/agent-mentions.md +3 -3
- package/corpus/core/docs/content/locales/zh-CN/agent-surfaces.md +7 -7
- package/corpus/core/docs/content/locales/zh-CN/agent-teams.md +3 -3
- package/corpus/core/docs/content/locales/zh-CN/agent-web-surfaces.md +5 -5
- package/corpus/core/docs/content/locales/zh-CN/authentication.md +13 -13
- package/corpus/core/docs/content/locales/zh-CN/automations.md +8 -8
- package/corpus/core/docs/content/locales/zh-CN/blueprint-installer.md +2 -2
- package/corpus/core/docs/content/locales/zh-CN/client.md +1 -1
- package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.md +2 -2
- package/corpus/core/docs/content/locales/zh-CN/code-agents-ui.md +4 -4
- package/corpus/core/docs/content/locales/zh-CN/components.md +7 -7
- package/corpus/core/docs/content/locales/zh-CN/context-awareness.md +8 -8
- package/corpus/core/docs/content/locales/zh-CN/creating-templates.md +12 -12
- package/corpus/core/docs/content/locales/zh-CN/cross-app-sso.md +3 -3
- package/corpus/core/docs/content/locales/zh-CN/database.md +7 -7
- package/corpus/core/docs/content/locales/zh-CN/deployment.md +4 -4
- package/corpus/core/docs/content/locales/zh-CN/dispatch.md +4 -4
- package/corpus/core/docs/content/locales/zh-CN/drop-in-agent.md +8 -8
- package/corpus/core/docs/content/locales/zh-CN/durable-resume.md +1 -1
- package/corpus/core/docs/content/locales/zh-CN/embedding-sdk.md +2 -2
- package/corpus/core/docs/content/locales/zh-CN/evals.md +2 -2
- package/corpus/core/docs/content/locales/zh-CN/extensions.md +2 -2
- package/corpus/core/docs/content/locales/zh-CN/external-agents.md +5 -5
- package/corpus/core/docs/content/locales/zh-CN/faq.md +3 -3
- package/corpus/core/docs/content/locales/zh-CN/file-uploads.md +4 -4
- package/corpus/core/docs/content/locales/zh-CN/frames.md +2 -2
- package/corpus/core/docs/content/locales/zh-CN/getting-started.md +13 -13
- package/corpus/core/docs/content/locales/zh-CN/harness-agents.md +3 -3
- package/corpus/core/docs/content/locales/zh-CN/human-approval.md +3 -3
- package/corpus/core/docs/content/locales/zh-CN/key-concepts.md +14 -14
- package/corpus/core/docs/content/locales/zh-CN/local-file-mode.md +5 -5
- package/corpus/core/docs/content/locales/zh-CN/mcp-apps.md +4 -4
- package/corpus/core/docs/content/locales/zh-CN/mcp-clients.md +7 -7
- package/corpus/core/docs/content/locales/zh-CN/mcp-protocol.md +3 -3
- package/corpus/core/docs/content/locales/zh-CN/messaging.md +6 -6
- package/corpus/core/docs/content/locales/zh-CN/migration-workbench.md +1 -1
- package/corpus/core/docs/content/locales/zh-CN/multi-app-workspace.md +1 -1
- package/corpus/core/docs/content/locales/zh-CN/multi-tenancy.md +1 -1
- package/corpus/core/docs/content/locales/zh-CN/native-chat-ui.md +3 -3
- package/corpus/core/docs/content/locales/zh-CN/notifications.md +3 -3
- package/corpus/core/docs/content/locales/zh-CN/observability.md +2 -2
- package/corpus/core/docs/content/locales/zh-CN/observational-memory.md +2 -2
- package/corpus/core/docs/content/locales/zh-CN/onboarding.md +8 -8
- package/corpus/core/docs/content/locales/zh-CN/plan-plugin.md +3 -3
- package/corpus/core/docs/content/locales/zh-CN/pr-visual-recap.md +11 -11
- package/corpus/core/docs/content/locales/zh-CN/processors.md +1 -1
- package/corpus/core/docs/content/locales/zh-CN/progress.md +2 -2
- package/corpus/core/docs/content/locales/zh-CN/pure-agent-apps.md +1 -1
- package/corpus/core/docs/content/locales/zh-CN/real-time-collaboration.md +6 -6
- package/corpus/core/docs/content/locales/zh-CN/recurring-jobs.md +5 -5
- package/corpus/core/docs/content/locales/zh-CN/routing.md +1 -1
- package/corpus/core/docs/content/locales/zh-CN/sandbox-adapters.md +2 -2
- package/corpus/core/docs/content/locales/zh-CN/security.md +8 -8
- package/corpus/core/docs/content/locales/zh-CN/server.md +10 -10
- package/corpus/core/docs/content/locales/zh-CN/sharing.md +6 -6
- package/corpus/core/docs/content/locales/zh-CN/skills-guide.md +16 -16
- package/corpus/core/docs/content/locales/zh-CN/template-analytics.md +10 -10
- package/corpus/core/docs/content/locales/zh-CN/template-assets.md +20 -20
- package/corpus/core/docs/content/locales/zh-CN/template-brain.md +11 -11
- package/corpus/core/docs/content/locales/zh-CN/template-calendar.md +9 -9
- package/corpus/core/docs/content/locales/zh-CN/template-chat.md +3 -3
- package/corpus/core/docs/content/locales/zh-CN/template-clips.md +14 -14
- package/corpus/core/docs/content/locales/zh-CN/template-content.md +13 -13
- package/corpus/core/docs/content/locales/zh-CN/template-design.md +7 -7
- package/corpus/core/docs/content/locales/zh-CN/template-dispatch.md +11 -11
- package/corpus/core/docs/content/locales/zh-CN/template-forms.md +9 -9
- package/corpus/core/docs/content/locales/zh-CN/template-mail.md +6 -6
- package/corpus/core/docs/content/locales/zh-CN/template-plan.md +3 -3
- package/corpus/core/docs/content/locales/zh-CN/template-slides.md +8 -8
- package/corpus/core/docs/content/locales/zh-CN/template-videos.md +5 -5
- package/corpus/core/docs/content/locales/zh-CN/tracking.md +3 -3
- package/corpus/core/docs/content/locales/zh-CN/using-your-agent.md +5 -5
- package/corpus/core/docs/content/locales/zh-CN/voice-input.md +4 -4
- package/corpus/core/docs/content/locales/zh-CN/what-is-agent-native.md +5 -5
- package/corpus/core/docs/content/locales/zh-CN/workspace-connections.md +8 -8
- package/corpus/core/docs/content/locales/zh-CN/workspace-management.md +5 -5
- package/corpus/core/docs/content/locales/zh-CN/workspace.md +23 -23
- package/corpus/core/docs/content/locales/zh-CN/writing-agent-instructions.md +18 -18
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/production-agent.ts +35 -0
- package/corpus/core/src/agent/run-store.ts +2 -0
- package/corpus/core/src/client/changelog/Changelog.tsx +22 -10
- package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +405 -35
- package/corpus/core/src/client/i18n.tsx +13 -1
- package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +275 -274
- package/corpus/core/src/templates/default/app/i18n/de-DE.ts +270 -260
- package/corpus/core/src/templates/default/app/i18n/es-ES.ts +282 -270
- package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +275 -266
- package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +274 -276
- package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +280 -273
- package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +274 -274
- package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +273 -266
- package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +273 -285
- package/corpus/templates/analytics/app/components/Markdown.tsx +36 -10
- package/corpus/templates/analytics/app/components/ProviderCorpusJobNotifier.tsx +41 -17
- package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +3 -1
- package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +4 -2
- package/corpus/templates/analytics/app/components/dashboard/RecentActivity.tsx +13 -7
- package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +4 -1
- package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +3 -1
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +13 -50
- package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +3 -1
- package/corpus/templates/analytics/app/i18n-data.ts +5172 -1
- package/corpus/templates/analytics/app/pages/Ask.tsx +7 -4
- package/corpus/templates/analytics/app/pages/DataDictionary.tsx +66 -59
- package/corpus/templates/analytics/app/pages/DataSources.tsx +131 -96
- package/corpus/templates/analytics/app/pages/NotFound.tsx +8 -3
- package/corpus/templates/analytics/app/pages/Placeholder.tsx +4 -3
- package/corpus/templates/analytics/app/pages/adhoc/BlankDashboard.tsx +8 -5
- package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +4 -2
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventCombobox.tsx +16 -6
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventPanel.tsx +6 -2
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/ExplorerChart.tsx +14 -5
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/FilterBuilder.tsx +6 -3
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/GroupByPicker.tsx +7 -3
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/PropertyCombobox.tsx +12 -6
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/PropertyValueCombobox.tsx +9 -5
- package/corpus/templates/analytics/app/pages/adhoc/explorer/components/SqlPreview.tsx +3 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer/index.tsx +25 -15
- package/corpus/templates/analytics/app/pages/adhoc/explorer/types.ts +32 -30
- package/corpus/templates/analytics/app/pages/adhoc/explorer/use-explorer-config.ts +10 -6
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/ChartCard.tsx +20 -10
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +50 -33
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +23 -14
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +61 -55
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +88 -106
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewSqlPopover.tsx +37 -49
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +23 -16
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +46 -40
- package/corpus/templates/analytics/app/pages/analyses/AnalysesList.tsx +11 -8
- package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +25 -21
- package/corpus/templates/analytics/app/pages/analyses/LegacyFusionAnalysis.tsx +175 -99
- package/corpus/templates/analytics/app/pages/overview/OverviewPage.tsx +30 -12
- package/corpus/templates/analytics/app/routes/$.tsx +2 -1
- package/corpus/templates/analytics/app/routes/analyses.$id.tsx +2 -1
- package/corpus/templates/analytics/app/routes/analyses._index.tsx +2 -1
- package/corpus/templates/analytics/app/routes/ask.tsx +2 -1
- package/corpus/templates/analytics/app/routes/catalog.tsx +38 -16
- package/corpus/templates/analytics/app/routes/chart.tsx +12 -3
- package/corpus/templates/analytics/app/routes/dashboards.$id.tsx +2 -1
- package/corpus/templates/analytics/app/routes/data-dictionary.tsx +2 -1
- package/corpus/templates/analytics/app/routes/data-sources.tsx +2 -1
- package/corpus/templates/analytics/app/routes/extensions.$id.tsx +3 -1
- package/corpus/templates/analytics/app/routes/extensions._index.tsx +3 -1
- package/corpus/templates/analytics/app/routes/overview.tsx +2 -1
- package/corpus/templates/analytics/app/routes/settings.tsx +2 -1
- package/corpus/templates/analytics/app/routes/team.tsx +2 -1
- package/corpus/templates/assets/app/components/library/CreateLibraryDialog.tsx +25 -15
- package/corpus/templates/assets/app/components/library/EditLibraryDialog.tsx +17 -10
- package/corpus/templates/assets/app/components/library/LibraryCard.tsx +20 -8
- package/corpus/templates/assets/app/i18n-data.ts +4065 -1
- package/corpus/templates/assets/app/routes/_index.tsx +15 -4
- package/corpus/templates/assets/app/routes/audit.tsx +79 -56
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +565 -330
- package/corpus/templates/assets/app/routes/brand-kits.tsx +3 -1
- package/corpus/templates/assets/app/routes/extensions.$id.tsx +3 -1
- package/corpus/templates/assets/app/routes/extensions._index.tsx +3 -1
- package/corpus/templates/assets/app/routes/extensions.tsx +3 -1
- package/corpus/templates/assets/app/routes/library.tsx +107 -74
- package/corpus/templates/assets/app/routes/team.tsx +6 -3
- package/corpus/templates/brain/app/components/brain/CanonicalPreviewSheet.tsx +14 -10
- package/corpus/templates/brain/app/i18n-data.ts +5609 -1
- package/corpus/templates/brain/app/routes/extensions.$id.tsx +3 -1
- package/corpus/templates/brain/app/routes/extensions._index.tsx +3 -1
- package/corpus/templates/brain/app/routes/extensions.tsx +3 -1
- package/corpus/templates/brain/app/routes/knowledge.tsx +51 -38
- package/corpus/templates/brain/app/routes/review.tsx +259 -154
- package/corpus/templates/brain/app/routes/settings.tsx +114 -116
- package/corpus/templates/brain/app/routes/sources.tsx +421 -352
- package/corpus/templates/brain/app/routes/team.tsx +6 -2
- package/corpus/templates/calendar/app/components/CloudUpgrade.tsx +33 -51
- package/corpus/templates/calendar/app/components/ThemeToggle.tsx +3 -1
- package/corpus/templates/calendar/app/components/TimezoneCombobox.tsx +5 -3
- package/corpus/templates/calendar/app/components/booking/BookingConfirmation.tsx +27 -13
- package/corpus/templates/calendar/app/components/booking/BookingForm.tsx +25 -13
- package/corpus/templates/calendar/app/components/booking/TimeSlotPicker.tsx +4 -1
- package/corpus/templates/calendar/app/components/calendar/AddCalendarDialog.tsx +22 -16
- package/corpus/templates/calendar/app/components/calendar/ApolloPanel.tsx +14 -13
- package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +22 -11
- package/corpus/templates/calendar/app/components/calendar/CommandPalette.tsx +19 -16
- package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +112 -72
- package/corpus/templates/calendar/app/components/calendar/DayView.tsx +3 -1
- package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +62 -24
- package/corpus/templates/calendar/app/components/calendar/EventDescription.tsx +4 -2
- package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +17 -11
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +167 -97
- package/corpus/templates/calendar/app/components/calendar/EventOptionControls.tsx +39 -25
- package/corpus/templates/calendar/app/components/calendar/FindTimePanel.tsx +28 -16
- package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +90 -74
- package/corpus/templates/calendar/app/components/calendar/GoogleSetupWizard.tsx +42 -34
- package/corpus/templates/calendar/app/components/calendar/GoogleSyncButton.tsx +6 -6
- package/corpus/templates/calendar/app/components/calendar/GuestNotificationDialog.tsx +44 -37
- package/corpus/templates/calendar/app/components/calendar/IntegrationsSidebar.tsx +46 -52
- package/corpus/templates/calendar/app/components/calendar/KeyboardShortcutsHelp.tsx +31 -19
- package/corpus/templates/calendar/app/components/calendar/PeopleSearchDialog.tsx +13 -9
- package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +6 -4
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +13 -7
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +19 -18
- package/corpus/templates/calendar/app/i18n/ar-SA.ts +2 -56
- package/corpus/templates/calendar/app/i18n/de-DE.ts +2 -57
- package/corpus/templates/calendar/app/i18n/en-US.ts +2 -56
- package/corpus/templates/calendar/app/i18n/es-ES.ts +2 -57
- package/corpus/templates/calendar/app/i18n/fr-FR.ts +2 -57
- package/corpus/templates/calendar/app/i18n/hi-IN.ts +2 -56
- package/corpus/templates/calendar/app/i18n/ja-JP.ts +2 -57
- package/corpus/templates/calendar/app/i18n/ko-KR.ts +2 -56
- package/corpus/templates/calendar/app/i18n/pt-BR.ts +2 -56
- package/corpus/templates/calendar/app/i18n/zh-CN.ts +2 -56
- package/corpus/templates/calendar/app/i18n-data.ts +8680 -7
- package/corpus/templates/calendar/app/pages/AvailabilitySettings.tsx +66 -34
- package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +286 -186
- package/corpus/templates/calendar/app/pages/BookingPage.tsx +37 -21
- package/corpus/templates/calendar/app/pages/BookingsList.tsx +36 -25
- package/corpus/templates/calendar/app/pages/CalendarView.tsx +66 -49
- package/corpus/templates/calendar/app/pages/ManageBookingPage.tsx +41 -29
- package/corpus/templates/calendar/app/pages/NotFound.tsx +4 -2
- package/corpus/templates/calendar/app/routes/_app.$.tsx +2 -1
- package/corpus/templates/calendar/app/routes/_app.booking-links.tsx +3 -1
- package/corpus/templates/calendar/app/routes/_app.settings.tsx +6 -3
- package/corpus/templates/calendar/app/routes/_app.team.tsx +8 -3
- package/corpus/templates/calendar/app/routes/booking-og-meta.ts +7 -4
- package/corpus/templates/calendar/app/routes/booking.manage.$token.tsx +2 -1
- package/corpus/templates/calendar/app/routes/event.tsx +14 -8
- package/corpus/templates/chat/app/i18n/ar-SA.ts +29 -23
- package/corpus/templates/chat/app/i18n/de-DE.ts +30 -22
- package/corpus/templates/chat/app/i18n/en-US.ts +7 -0
- package/corpus/templates/chat/app/i18n/es-ES.ts +30 -22
- package/corpus/templates/chat/app/i18n/fr-FR.ts +33 -25
- package/corpus/templates/chat/app/i18n/hi-IN.ts +30 -23
- package/corpus/templates/chat/app/i18n/ja-JP.ts +30 -23
- package/corpus/templates/chat/app/i18n/ko-KR.ts +30 -23
- package/corpus/templates/chat/app/i18n/pt-BR.ts +30 -22
- package/corpus/templates/chat/app/i18n/zh-CN.ts +29 -23
- package/corpus/templates/chat/app/routes/observability.tsx +2 -1
- package/corpus/templates/clips/app/components/capture-install-options.tsx +16 -11
- package/corpus/templates/clips/app/components/editable-recording-title.tsx +8 -7
- package/corpus/templates/clips/app/components/editor/chapters-editor.tsx +12 -9
- package/corpus/templates/clips/app/components/editor/editor-layout.tsx +15 -9
- package/corpus/templates/clips/app/components/editor/editor-toolbar.tsx +71 -57
- package/corpus/templates/clips/app/components/editor/split-button.tsx +6 -5
- package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +21 -19
- package/corpus/templates/clips/app/components/editor/thumbnail-picker.tsx +39 -26
- package/corpus/templates/clips/app/components/editor/transcript-editor.tsx +10 -6
- package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +11 -7
- package/corpus/templates/clips/app/components/library/create-space-dialog.tsx +13 -9
- package/corpus/templates/clips/app/components/library/folder-tree.tsx +26 -24
- package/corpus/templates/clips/app/components/library/library-grid.tsx +118 -14
- package/corpus/templates/clips/app/components/library/library-layout.tsx +3 -1
- package/corpus/templates/clips/app/components/library/organization-switcher.tsx +24 -13
- package/corpus/templates/clips/app/components/library/recording-card.tsx +51 -34
- package/corpus/templates/clips/app/components/library/search-bar.tsx +14 -11
- package/corpus/templates/clips/app/components/meetings/auto-record-prompt.tsx +10 -6
- package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +8 -4
- package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +32 -16
- package/corpus/templates/clips/app/components/meetings/quick-ask-sidebar.tsx +23 -23
- package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +11 -7
- package/corpus/templates/clips/app/components/meetings/transcript-bubbles.tsx +8 -4
- package/corpus/templates/clips/app/components/player/access-password-prompt.tsx +6 -4
- package/corpus/templates/clips/app/components/player/comments-panel.tsx +22 -13
- package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +24 -79
- package/corpus/templates/clips/app/components/player/insights-panel.tsx +29 -15
- package/corpus/templates/clips/app/components/player/player-controls.tsx +3 -1
- package/corpus/templates/clips/app/components/player/settings-panel.tsx +44 -27
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +38 -32
- package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +7 -5
- package/corpus/templates/clips/app/components/player/transcript-panel.tsx +46 -35
- package/corpus/templates/clips/app/components/player/video-player.tsx +11 -5
- package/corpus/templates/clips/app/components/recorder/camera-visualizer.tsx +20 -6
- package/corpus/templates/clips/app/components/recorder/countdown-overlay.tsx +6 -4
- package/corpus/templates/clips/app/components/recorder/microphone-visualizer.tsx +3 -1
- package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +120 -156
- package/corpus/templates/clips/app/components/recorder/recording-toolbar.tsx +16 -8
- package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +8 -8
- package/corpus/templates/clips/app/components/sharing/share-ui.tsx +33 -31
- package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +15 -8
- package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +35 -20
- package/corpus/templates/clips/app/components/workspace/engagement-chart.tsx +6 -4
- package/corpus/templates/clips/app/components/workspace/insights-hub.tsx +35 -22
- package/corpus/templates/clips/app/components/workspace/invite-dialog.tsx +27 -17
- package/corpus/templates/clips/app/components/workspace/members-list.tsx +30 -19
- package/corpus/templates/clips/app/components/workspace/notifications-list.tsx +37 -25
- package/corpus/templates/clips/app/components/workspace/top-creators-table.tsx +14 -5
- package/corpus/templates/clips/app/i18n/ar-SA.ts +1117 -1
- package/corpus/templates/clips/app/i18n/de-DE.ts +1147 -1
- package/corpus/templates/clips/app/i18n/en-US.ts +1110 -0
- package/corpus/templates/clips/app/i18n/es-ES.ts +1139 -0
- package/corpus/templates/clips/app/i18n/fr-FR.ts +1145 -5
- package/corpus/templates/clips/app/i18n/hi-IN.ts +1113 -1
- package/corpus/templates/clips/app/i18n/ja-JP.ts +1138 -2
- package/corpus/templates/clips/app/i18n/ko-KR.ts +1124 -1
- package/corpus/templates/clips/app/i18n/pt-BR.ts +1137 -1
- package/corpus/templates/clips/app/i18n/zh-CN.ts +1094 -2
- package/corpus/templates/clips/app/root.tsx +2 -2
- package/corpus/templates/clips/app/routes/_app.archive.tsx +12 -2
- package/corpus/templates/clips/app/routes/_app.dictate.tsx +71 -49
- package/corpus/templates/clips/app/routes/_app.extensions.$id.tsx +4 -1
- package/corpus/templates/clips/app/routes/_app.extensions._index.tsx +4 -1
- package/corpus/templates/clips/app/routes/_app.insights._index.tsx +2 -1
- package/corpus/templates/clips/app/routes/_app.library.folder.$folderId.tsx +5 -2
- package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +54 -38
- package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +41 -30
- package/corpus/templates/clips/app/routes/_app.notifications.tsx +34 -19
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +28 -17
- package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +25 -18
- package/corpus/templates/clips/app/routes/_app.spaces.$spaceId.folder.$folderId.tsx +5 -2
- package/corpus/templates/clips/app/routes/_app.spaces.$spaceId.tsx +8 -5
- package/corpus/templates/clips/app/routes/_app.spaces._index.tsx +8 -3
- package/corpus/templates/clips/app/routes/_app.trash.tsx +2 -1
- package/corpus/templates/clips/app/routes/download.tsx +39 -30
- package/corpus/templates/clips/app/routes/embed.$shareId.tsx +4 -3
- package/corpus/templates/clips/app/routes/invite.$token.tsx +41 -32
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +111 -106
- package/corpus/templates/clips/app/routes/record.tsx +101 -87
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +78 -62
- package/corpus/templates/clips/app/routes/share.meeting.$meetingId.tsx +15 -12
- package/corpus/templates/clips/changelog/2026-06-25-localized-clips-settings-changelog-and-extension-sidebar-lab.md +6 -0
- package/corpus/templates/clips/desktop/src/overlays/countdown.tsx +4 -2
- package/corpus/templates/clips/desktop/src/styles.css +15 -1
- package/corpus/templates/content/app/components/ThemeToggle.tsx +3 -3
- package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +14 -12
- package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +19 -14
- package/corpus/templates/content/app/components/editor/DocumentBlockFields.tsx +16 -4
- package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +13670 -10
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +15 -12
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +219 -135
- package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +114 -81
- package/corpus/templates/content/app/components/editor/EmojiPicker.tsx +27 -9
- package/corpus/templates/content/app/components/editor/LinkHoverPreview.tsx +7 -5
- package/corpus/templates/content/app/components/editor/NotionConflictBanner.tsx +12 -6
- package/corpus/templates/content/app/components/editor/NotionSyncBar.tsx +54 -34
- package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +111 -122
- package/corpus/templates/content/app/components/editor/TableHoverControls.tsx +27 -22
- package/corpus/templates/content/app/components/editor/VersionHistoryPanel.tsx +23 -19
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +6 -2
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +245 -238
- package/corpus/templates/content/app/components/editor/database/calculations.ts +1 -0
- package/corpus/templates/content/app/components/editor/database/filter-sort.ts +1 -0
- package/corpus/templates/content/app/components/editor/database/grouping.ts +1 -0
- package/corpus/templates/content/app/components/editor/database/navigation-state.ts +1 -0
- package/corpus/templates/content/app/components/editor/database/shared.tsx +1 -0
- package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +92 -53
- package/corpus/templates/content/app/components/editor/extensions/AudioBlock.tsx +86 -49
- package/corpus/templates/content/app/components/editor/extensions/CodeBlockNode.tsx +22 -12
- package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +138 -74
- package/corpus/templates/content/app/components/editor/extensions/LocalMdxComponentNode.tsx +16 -7
- package/corpus/templates/content/app/components/editor/extensions/VideoBlock.tsx +86 -49
- package/corpus/templates/content/app/components/editor/image-upload.ts +3 -3
- package/corpus/templates/content/app/components/editor/localComponentSlashItems.ts +2 -1
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +205 -484
- package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +34 -110
- package/corpus/templates/content/app/components/sidebar/NotionButton.tsx +56 -43
- package/corpus/templates/content/app/i18n-data.ts +6977 -10
- package/corpus/templates/content/app/routes/_app.local-files.tsx +111 -85
- package/corpus/templates/content/app/routes/_app.page.$id.tsx +7 -7
- package/corpus/templates/content/app/routes/_app.settings.tsx +2 -1
- package/corpus/templates/content/app/routes/_app.team.tsx +2 -1
- package/corpus/templates/content/app/routes/_app.tsx +4 -6
- package/corpus/templates/content/app/routes/p.$id.tsx +9 -6
- package/corpus/templates/design/app/components/ThemeToggle.tsx +3 -1
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +6 -4
- package/corpus/templates/design/app/components/design/DesignToolbar.tsx +27 -22
- package/corpus/templates/design/app/components/design/DrawOverlay.tsx +4 -2
- package/corpus/templates/design/app/components/design/EditPanel.tsx +130 -100
- package/corpus/templates/design/app/components/design/PresentMode.tsx +3 -1
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +8 -6
- package/corpus/templates/design/app/components/design/VariantGrid.tsx +6 -4
- package/corpus/templates/design/app/components/design/VariantHandoffCard.tsx +8 -4
- package/corpus/templates/design/app/components/design/ViewportTabs.tsx +5 -3
- package/corpus/templates/design/app/components/design/ZoomControls.tsx +3 -1
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +31 -18
- package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +12 -8
- package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +14 -10
- package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +4 -2
- package/corpus/templates/design/app/i18n-data.ts +6107 -332
- package/corpus/templates/design/app/pages/DesignEditor.tsx +106 -81
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +110 -115
- package/corpus/templates/design/app/pages/DesignSystems.tsx +154 -83
- package/corpus/templates/design/app/pages/Index.tsx +69 -57
- package/corpus/templates/design/app/pages/NotFound.tsx +4 -2
- package/corpus/templates/design/app/pages/Present.tsx +1 -1
- package/corpus/templates/design/app/pages/Templates.tsx +18 -12
- package/corpus/templates/design/app/routes/$.tsx +2 -1
- package/corpus/templates/design/app/routes/design-systems.tsx +2 -1
- package/corpus/templates/design/app/routes/design-systems_.setup.tsx +2 -1
- package/corpus/templates/design/app/routes/design.$id.tsx +2 -1
- package/corpus/templates/design/app/routes/examples.tsx +3 -1
- package/corpus/templates/design/app/routes/extensions.$id.tsx +3 -1
- package/corpus/templates/design/app/routes/extensions._index.tsx +3 -1
- package/corpus/templates/design/app/routes/extensions.tsx +3 -1
- package/corpus/templates/design/app/routes/observability.tsx +3 -1
- package/corpus/templates/design/app/routes/present.$id.tsx +2 -1
- package/corpus/templates/design/app/routes/settings.tsx +2 -1
- package/corpus/templates/design/app/routes/team.tsx +3 -1
- package/corpus/templates/design/app/routes/templates.tsx +2 -1
- package/corpus/templates/dispatch/app/i18n-data.ts +1881 -1
- package/corpus/templates/dispatch/app/routes/chat.$threadId.tsx +10 -7
- package/corpus/templates/dispatch/app/routes/chat.tsx +9 -7
- package/corpus/templates/dispatch/app/routes/extensions.$id.tsx +2 -1
- package/corpus/templates/dispatch/app/routes/extensions._index.tsx +2 -1
- package/corpus/templates/dispatch/app/routes/integrations.tsx +327 -209
- package/corpus/templates/dispatch/app/routes/settings.tsx +3 -1
- package/corpus/templates/dispatch/app/routes/tools.$id.tsx +2 -1
- package/corpus/templates/dispatch/app/routes/tools._index.tsx +2 -1
- package/corpus/templates/forms/app/components/CloudUpgrade.tsx +38 -28
- package/corpus/templates/forms/app/components/ThemeToggle.tsx +3 -1
- package/corpus/templates/forms/app/components/builder/FieldPropertiesPanel.tsx +33 -29
- package/corpus/templates/forms/app/i18n/ar-SA.ts +279 -53
- package/corpus/templates/forms/app/i18n/de-DE.ts +287 -53
- package/corpus/templates/forms/app/i18n/en-US.ts +225 -0
- package/corpus/templates/forms/app/i18n/es-ES.ts +233 -1
- package/corpus/templates/forms/app/i18n/fr-FR.ts +290 -54
- package/corpus/templates/forms/app/i18n/hi-IN.ts +275 -55
- package/corpus/templates/forms/app/i18n/ja-JP.ts +278 -55
- package/corpus/templates/forms/app/i18n/ko-KR.ts +271 -55
- package/corpus/templates/forms/app/i18n/pt-BR.ts +286 -52
- package/corpus/templates/forms/app/i18n/zh-CN.ts +261 -56
- package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +214 -148
- package/corpus/templates/forms/app/pages/FormFillPage.tsx +12 -7
- package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +8 -4
- package/corpus/templates/forms/app/routes/_app.extensions.$id.tsx +3 -1
- package/corpus/templates/forms/app/routes/_app.extensions._index.tsx +3 -1
- package/corpus/templates/forms/app/routes/_app.forms.$id.tsx +2 -1
- package/corpus/templates/forms/app/routes/_app.forms.$id_.responses.tsx +2 -1
- package/corpus/templates/forms/app/routes/_app.forms._index.tsx +3 -4
- package/corpus/templates/forms/app/routes/_app.response-insights.tsx +3 -2
- package/corpus/templates/forms/app/routes/_app.settings.tsx +2 -1
- package/corpus/templates/forms/app/routes/_index.tsx +3 -4
- package/corpus/templates/forms/app/routes/form-preview.tsx +25 -26
- package/corpus/templates/macros/app/components/AddExerciseDialog.tsx +18 -15
- package/corpus/templates/macros/app/components/AddMealDialog.tsx +22 -19
- package/corpus/templates/macros/app/components/AddWeightDialog.tsx +17 -16
- package/corpus/templates/macros/app/components/DailyProgress.tsx +24 -18
- package/corpus/templates/macros/app/components/ExerciseCard.tsx +5 -3
- package/corpus/templates/macros/app/components/MealCard.tsx +5 -3
- package/corpus/templates/macros/app/components/VoiceDictation.tsx +14 -13
- package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +37 -20
- package/corpus/templates/macros/app/components/WeightCard.tsx +16 -9
- package/corpus/templates/macros/app/components/WeightTracker.tsx +13 -6
- package/corpus/templates/macros/app/i18n/ar-SA.ts +154 -2
- package/corpus/templates/macros/app/i18n/de-DE.ts +158 -2
- package/corpus/templates/macros/app/i18n/en-US.ts +152 -0
- package/corpus/templates/macros/app/i18n/es-ES.ts +154 -0
- package/corpus/templates/macros/app/i18n/fr-FR.ts +157 -2
- package/corpus/templates/macros/app/i18n/hi-IN.ts +154 -3
- package/corpus/templates/macros/app/i18n/ja-JP.ts +153 -2
- package/corpus/templates/macros/app/i18n/ko-KR.ts +153 -2
- package/corpus/templates/macros/app/i18n/pt-BR.ts +155 -0
- package/corpus/templates/macros/app/i18n/zh-CN.ts +152 -2
- package/corpus/templates/macros/app/routes/_index.tsx +20 -16
- package/corpus/templates/macros/app/routes/analytics.tsx +3 -3
- package/corpus/templates/macros/app/routes/extensions.$id.tsx +3 -1
- package/corpus/templates/macros/app/routes/extensions._index.tsx +3 -1
- package/corpus/templates/macros/app/routes/settings.tsx +2 -1
- package/corpus/templates/macros/app/routes/team.tsx +6 -3
- package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +69 -62
- package/corpus/templates/mail/app/components/ThemeToggle.tsx +10 -3
- package/corpus/templates/mail/app/components/agent-engine-picker.tsx +6 -5
- package/corpus/templates/mail/app/components/email/CodeBlockLangPicker.tsx +1 -1
- package/corpus/templates/mail/app/components/email/ComposeModal.tsx +6 -8
- package/corpus/templates/mail/app/components/email/ComposeSlashMenu.tsx +45 -34
- package/corpus/templates/mail/app/components/email/EmailThread.tsx +5 -3
- package/corpus/templates/mail/app/components/email/InlineReplyComposer.tsx +4 -6
- package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +16 -10
- package/corpus/templates/mail/app/components/email/MobileActionBar.tsx +28 -20
- package/corpus/templates/mail/app/components/email/SendLaterButton.tsx +12 -7
- package/corpus/templates/mail/app/components/email/SnoozeModal.tsx +9 -6
- package/corpus/templates/mail/app/components/email/SnoozePopover.tsx +9 -9
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +2 -2
- package/corpus/templates/mail/app/components/settings/GmailFiltersSection.tsx +40 -30
- package/corpus/templates/mail/app/i18n/ar-SA.ts +435 -134
- package/corpus/templates/mail/app/i18n/de-DE.ts +441 -131
- package/corpus/templates/mail/app/i18n/en-US.ts +300 -1
- package/corpus/templates/mail/app/i18n/es-ES.ts +443 -134
- package/corpus/templates/mail/app/i18n/fr-FR.ts +444 -134
- package/corpus/templates/mail/app/i18n/hi-IN.ts +441 -138
- package/corpus/templates/mail/app/i18n/ja-JP.ts +437 -134
- package/corpus/templates/mail/app/i18n/ko-KR.ts +437 -134
- package/corpus/templates/mail/app/i18n/pt-BR.ts +440 -133
- package/corpus/templates/mail/app/i18n/zh-CN.ts +361 -70
- package/corpus/templates/mail/app/pages/DraftQueuePage.tsx +66 -41
- package/corpus/templates/mail/app/pages/InboxPage.tsx +5 -1
- package/corpus/templates/mail/app/pages/SettingsPage.tsx +125 -108
- package/corpus/templates/mail/app/routes/$.tsx +2 -1
- package/corpus/templates/mail/app/routes/draft-queue.$id.tsx +2 -1
- package/corpus/templates/mail/app/routes/draft-queue.tsx +2 -1
- package/corpus/templates/mail/app/routes/email.tsx +10 -7
- package/corpus/templates/mail/app/routes/settings.tsx +2 -1
- package/corpus/templates/mail/app/routes/team.tsx +2 -1
- package/corpus/templates/plan/app/components/editor/PlanDocumentEditor.tsx +7 -4
- package/corpus/templates/plan/app/components/editor/planSlashCommands.ts +51 -26
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/plan/app/components/plan/CanvasArea.tsx +7 -4
- package/corpus/templates/plan/app/components/plan/DocumentArea.tsx +19 -15
- package/corpus/templates/plan/app/components/plan/LocalCodebasePicker.tsx +34 -17
- package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +9 -5
- package/corpus/templates/plan/app/components/plan/PlanImageNode.tsx +9 -4
- package/corpus/templates/plan/app/components/plan/PlanImageViewer.tsx +47 -20
- package/corpus/templates/plan/app/components/plan/PlanMarkdownReader.tsx +4 -2
- package/corpus/templates/plan/app/components/plan/PlanTableOfContents.tsx +6 -1
- package/corpus/templates/plan/app/components/plan/PlanVisualSurface.tsx +10 -5
- package/corpus/templates/plan/app/components/plan/PrototypeViewer.tsx +3 -1
- package/corpus/templates/plan/app/components/plan/image-actions.ts +29 -7
- package/corpus/templates/plan/app/components/plan/planBlocks.tsx +16 -8
- package/corpus/templates/plan/app/components/plan/wireframe/LegacyRegionWireframe.tsx +27 -18
- package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +3 -1
- package/corpus/templates/plan/app/components/plan/wireframe/wireframe-icons.ts +1 -0
- package/corpus/templates/plan/app/i18n/ar-SA.ts +663 -1
- package/corpus/templates/plan/app/i18n/de-DE.ts +670 -0
- package/corpus/templates/plan/app/i18n/en-US.ts +643 -0
- package/corpus/templates/plan/app/i18n/es-ES.ts +667 -0
- package/corpus/templates/plan/app/i18n/fr-FR.ts +672 -2
- package/corpus/templates/plan/app/i18n/hi-IN.ts +641 -1
- package/corpus/templates/plan/app/i18n/ja-JP.ts +633 -1
- package/corpus/templates/plan/app/i18n/ko-KR.ts +623 -1
- package/corpus/templates/plan/app/i18n/pt-BR.ts +671 -3
- package/corpus/templates/plan/app/i18n/zh-CN.ts +620 -1
- package/corpus/templates/plan/app/pages/PlansPage.tsx +697 -488
- package/corpus/templates/slides/app/components/CloudUpgrade.tsx +16 -13
- package/corpus/templates/slides/app/components/ThemeToggle.tsx +3 -1
- package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +37 -25
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +3 -2
- package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +3 -1
- package/corpus/templates/slides/app/components/design-system/DesignSystemPreview.tsx +6 -4
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +104 -73
- package/corpus/templates/slides/app/components/editor/AnimationsPanel.tsx +21 -17
- package/corpus/templates/slides/app/components/editor/AssetLibraryPanel.tsx +6 -3
- package/corpus/templates/slides/app/components/editor/BlockBubbleMenu.tsx +4 -2
- package/corpus/templates/slides/app/components/editor/CodeEditor.tsx +7 -4
- package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +26 -18
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +116 -91
- package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +21 -21
- package/corpus/templates/slides/app/components/editor/GenerateSlidesDialog.tsx +16 -16
- package/corpus/templates/slides/app/components/editor/GeneratingOverlay.tsx +4 -2
- package/corpus/templates/slides/app/components/editor/GoogleDocImportHint.tsx +9 -5
- package/corpus/templates/slides/app/components/editor/HistoryPanel.tsx +44 -54
- package/corpus/templates/slides/app/components/editor/ImageDropPromptPopover.tsx +10 -11
- package/corpus/templates/slides/app/components/editor/ImageGenPanel.tsx +4 -2
- package/corpus/templates/slides/app/components/editor/ImageOverlay.tsx +3 -1
- package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +8 -5
- package/corpus/templates/slides/app/components/editor/ImportButton.tsx +3 -2
- package/corpus/templates/slides/app/components/editor/LogoSearchPanel.tsx +20 -10
- package/corpus/templates/slides/app/components/editor/MermaidToExcalidrawPanel.tsx +3 -1
- package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +5 -4
- package/corpus/templates/slides/app/components/editor/ShareDialog.tsx +22 -21
- package/corpus/templates/slides/app/components/editor/SlideBubbleMenu.tsx +32 -21
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +19 -34
- package/corpus/templates/slides/app/components/editor/SlideInlineEditor.tsx +9 -8
- package/corpus/templates/slides/app/components/editor/SlideSlashMenu.tsx +32 -27
- package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +7 -2
- package/corpus/templates/slides/app/components/layout/AgentWorkIndicator.tsx +6 -3
- package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +11 -8
- package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +6 -5
- package/corpus/templates/slides/app/components/visual-editor/DrawOverlay.tsx +8 -6
- package/corpus/templates/slides/app/components/visual-editor/MultiSelectChip.tsx +7 -3
- package/corpus/templates/slides/app/components/visual-editor/SaveStatusIndicator.tsx +4 -2
- package/corpus/templates/slides/app/i18n/ar-SA.ts +525 -3
- package/corpus/templates/slides/app/i18n/de-DE.ts +504 -4
- package/corpus/templates/slides/app/i18n/en-US.ts +490 -0
- package/corpus/templates/slides/app/i18n/es-ES.ts +514 -4
- package/corpus/templates/slides/app/i18n/fr-FR.ts +519 -5
- package/corpus/templates/slides/app/i18n/hi-IN.ts +489 -4
- package/corpus/templates/slides/app/i18n/ja-JP.ts +485 -3
- package/corpus/templates/slides/app/i18n/ko-KR.ts +481 -3
- package/corpus/templates/slides/app/i18n/pt-BR.ts +507 -2
- package/corpus/templates/slides/app/i18n/zh-CN.ts +475 -3
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +25 -21
- package/corpus/templates/slides/app/pages/Index.tsx +47 -45
- package/corpus/templates/slides/app/pages/SharedPresentation.tsx +4 -3
- package/corpus/templates/slides/app/routes/$.tsx +2 -1
- package/corpus/templates/slides/app/routes/deck.$id.tsx +2 -1
- package/corpus/templates/slides/app/routes/design-systems.tsx +2 -1
- package/corpus/templates/slides/app/routes/settings.tsx +2 -1
- package/corpus/templates/slides/app/routes/share.$token.tsx +2 -1
- package/corpus/templates/slides/app/routes/slide.tsx +11 -5
- package/corpus/templates/slides/app/routes/team.tsx +6 -3
- package/corpus/templates/videos/app/components/CameraControls.tsx +11 -7
- package/corpus/templates/videos/app/components/CameraToolbar.tsx +13 -11
- package/corpus/templates/videos/app/components/CloudUpgrade.tsx +19 -16
- package/corpus/templates/videos/app/components/CompSettingsEditor.tsx +6 -1
- package/corpus/templates/videos/app/components/ComponentLibrarySidebar.tsx +29 -29
- package/corpus/templates/videos/app/components/ComponentPropsPanel.tsx +37 -17
- package/corpus/templates/videos/app/components/ComponentsSidebar.tsx +8 -3
- package/corpus/templates/videos/app/components/CompositionCard.tsx +11 -3
- package/corpus/templates/videos/app/components/CurrentElementPanel.tsx +45 -42
- package/corpus/templates/videos/app/components/CursorControls.tsx +37 -18
- package/corpus/templates/videos/app/components/CursorPositioningOverlay.tsx +3 -1
- package/corpus/templates/videos/app/components/LibraryFolderRow.tsx +8 -4
- package/corpus/templates/videos/app/components/MotionCurveSelect.tsx +9 -6
- package/corpus/templates/videos/app/components/PropsEditor.tsx +6 -2
- package/corpus/templates/videos/app/components/Sidebar.tsx +7 -7
- package/corpus/templates/videos/app/components/Timeline.tsx +8 -6
- package/corpus/templates/videos/app/components/TrackPropertiesPanel.tsx +50 -33
- package/corpus/templates/videos/app/components/TweaksPanel.tsx +18 -9
- package/corpus/templates/videos/app/components/VideoPlayer.tsx +9 -5
- package/corpus/templates/videos/app/components/design-system/DesignSystemPreview.tsx +14 -12
- package/corpus/templates/videos/app/components/design-system/DesignSystemSetup.tsx +31 -29
- package/corpus/templates/videos/app/components/keyframes/KeyframeActionButtons.tsx +11 -7
- package/corpus/templates/videos/app/i18n/ar-SA.ts +358 -1
- package/corpus/templates/videos/app/i18n/de-DE.ts +378 -0
- package/corpus/templates/videos/app/i18n/en-US.ts +362 -0
- package/corpus/templates/videos/app/i18n/es-ES.ts +377 -1
- package/corpus/templates/videos/app/i18n/fr-FR.ts +379 -2
- package/corpus/templates/videos/app/i18n/hi-IN.ts +359 -1
- package/corpus/templates/videos/app/i18n/ja-JP.ts +371 -1
- package/corpus/templates/videos/app/i18n/ko-KR.ts +364 -1
- package/corpus/templates/videos/app/i18n/pt-BR.ts +371 -1
- package/corpus/templates/videos/app/i18n/zh-CN.ts +351 -1
- package/corpus/templates/videos/app/pages/ComponentLibrary.tsx +6 -2
- package/corpus/templates/videos/app/pages/ComponentLibraryView.tsx +45 -24
- package/corpus/templates/videos/app/pages/CompositionView.tsx +61 -34
- package/corpus/templates/videos/app/routes/$.tsx +2 -1
- package/corpus/templates/videos/app/routes/c.$compositionId.tsx +2 -1
- package/corpus/templates/videos/app/routes/components.tsx +2 -1
- package/corpus/templates/videos/app/routes/design-systems.tsx +2 -1
- package/corpus/templates/videos/app/routes/settings.tsx +2 -1
- package/corpus/templates/videos/app/routes/team.tsx +2 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +31 -0
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-store.d.ts +2 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +2 -0
- package/dist/agent/run-store.js.map +1 -1
- package/dist/client/changelog/Changelog.d.ts +7 -2
- package/dist/client/changelog/Changelog.d.ts.map +1 -1
- package/dist/client/changelog/Changelog.js +9 -7
- package/dist/client/changelog/Changelog.js.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js +339 -11
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
- package/dist/client/i18n.d.ts.map +1 -1
- package/dist/client/i18n.js +12 -1
- package/dist/client/i18n.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +5 -5
- package/dist/progress/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/server/agent-engine-api-key-route.d.ts +2 -2
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/templates/default/app/i18n/ar-SA.ts +275 -274
- package/dist/templates/default/app/i18n/de-DE.ts +270 -260
- package/dist/templates/default/app/i18n/es-ES.ts +282 -270
- package/dist/templates/default/app/i18n/fr-FR.ts +275 -266
- package/dist/templates/default/app/i18n/hi-IN.ts +274 -276
- package/dist/templates/default/app/i18n/ja-JP.ts +280 -273
- package/dist/templates/default/app/i18n/ko-KR.ts +274 -274
- package/dist/templates/default/app/i18n/pt-BR.ts +273 -266
- package/dist/templates/default/app/i18n/zh-CN.ts +273 -285
- package/docs/content/locales/ar-SA/a2a-protocol.md +2 -2
- package/docs/content/locales/ar-SA/actions.md +6 -6
- package/docs/content/locales/ar-SA/agent-surfaces.md +5 -5
- package/docs/content/locales/ar-SA/agent-teams.md +4 -4
- package/docs/content/locales/ar-SA/agent-web-surfaces.md +2 -2
- package/docs/content/locales/ar-SA/authentication.md +4 -4
- package/docs/content/locales/ar-SA/automations.md +3 -3
- package/docs/content/locales/ar-SA/blueprint-installer.md +2 -2
- package/docs/content/locales/ar-SA/cli-adapters.md +1 -1
- package/docs/content/locales/ar-SA/code-agents-ui.md +2 -2
- package/docs/content/locales/ar-SA/components.md +14 -14
- package/docs/content/locales/ar-SA/context-awareness.md +3 -3
- package/docs/content/locales/ar-SA/creating-templates.md +12 -12
- package/docs/content/locales/ar-SA/cross-app-sso.md +3 -3
- package/docs/content/locales/ar-SA/database.md +7 -7
- package/docs/content/locales/ar-SA/deployment.md +4 -4
- package/docs/content/locales/ar-SA/dispatch.md +3 -3
- package/docs/content/locales/ar-SA/drop-in-agent.md +8 -8
- package/docs/content/locales/ar-SA/durable-resume.md +1 -1
- package/docs/content/locales/ar-SA/embedding-sdk.md +2 -2
- package/docs/content/locales/ar-SA/evals.md +3 -3
- package/docs/content/locales/ar-SA/extensions.md +2 -2
- package/docs/content/locales/ar-SA/external-agents.md +8 -8
- package/docs/content/locales/ar-SA/faq.md +3 -3
- package/docs/content/locales/ar-SA/file-uploads.md +4 -4
- package/docs/content/locales/ar-SA/frames.md +1 -1
- package/docs/content/locales/ar-SA/getting-started.md +13 -13
- package/docs/content/locales/ar-SA/harness-agents.md +3 -3
- package/docs/content/locales/ar-SA/human-approval.md +3 -3
- package/docs/content/locales/ar-SA/key-concepts.md +14 -14
- package/docs/content/locales/ar-SA/local-file-mode.md +5 -5
- package/docs/content/locales/ar-SA/mcp-apps.md +9 -9
- package/docs/content/locales/ar-SA/mcp-clients.md +9 -9
- package/docs/content/locales/ar-SA/mcp-protocol.md +5 -5
- package/docs/content/locales/ar-SA/messaging.md +5 -5
- package/docs/content/locales/ar-SA/migration-workbench.md +1 -1
- package/docs/content/locales/ar-SA/multi-app-workspace.md +1 -1
- package/docs/content/locales/ar-SA/multi-tenancy.md +2 -2
- package/docs/content/locales/ar-SA/native-chat-ui.md +4 -4
- package/docs/content/locales/ar-SA/notifications.md +5 -5
- package/docs/content/locales/ar-SA/observability.md +1 -1
- package/docs/content/locales/ar-SA/observational-memory.md +2 -2
- package/docs/content/locales/ar-SA/onboarding.md +8 -8
- package/docs/content/locales/ar-SA/plan-plugin.md +3 -3
- package/docs/content/locales/ar-SA/pr-visual-recap.md +11 -11
- package/docs/content/locales/ar-SA/processors.md +2 -2
- package/docs/content/locales/ar-SA/progress.md +3 -3
- package/docs/content/locales/ar-SA/pure-agent-apps.md +1 -1
- package/docs/content/locales/ar-SA/real-time-collaboration.md +6 -6
- package/docs/content/locales/ar-SA/recurring-jobs.md +5 -5
- package/docs/content/locales/ar-SA/routing.md +1 -1
- package/docs/content/locales/ar-SA/sandbox-adapters.md +3 -3
- package/docs/content/locales/ar-SA/security.md +10 -10
- package/docs/content/locales/ar-SA/server.md +9 -9
- package/docs/content/locales/ar-SA/sharing.md +7 -7
- package/docs/content/locales/ar-SA/skills-guide.md +16 -16
- package/docs/content/locales/ar-SA/template-analytics.md +10 -10
- package/docs/content/locales/ar-SA/template-assets.md +19 -19
- package/docs/content/locales/ar-SA/template-brain.md +11 -11
- package/docs/content/locales/ar-SA/template-calendar.md +9 -9
- package/docs/content/locales/ar-SA/template-chat.md +3 -3
- package/docs/content/locales/ar-SA/template-clips.md +13 -13
- package/docs/content/locales/ar-SA/template-content.md +15 -15
- package/docs/content/locales/ar-SA/template-design.md +7 -7
- package/docs/content/locales/ar-SA/template-dispatch.md +8 -8
- package/docs/content/locales/ar-SA/template-forms.md +9 -9
- package/docs/content/locales/ar-SA/template-mail.md +7 -7
- package/docs/content/locales/ar-SA/template-plan.md +3 -3
- package/docs/content/locales/ar-SA/template-slides.md +8 -8
- package/docs/content/locales/ar-SA/template-videos.md +5 -5
- package/docs/content/locales/ar-SA/tracking.md +6 -6
- package/docs/content/locales/ar-SA/using-your-agent.md +4 -4
- package/docs/content/locales/ar-SA/voice-input.md +4 -4
- package/docs/content/locales/ar-SA/what-is-agent-native.md +4 -4
- package/docs/content/locales/ar-SA/workspace-connections.md +8 -8
- package/docs/content/locales/ar-SA/workspace-management.md +4 -4
- package/docs/content/locales/ar-SA/workspace.md +24 -24
- package/docs/content/locales/ar-SA/writing-agent-instructions.md +18 -18
- package/docs/content/locales/de-DE/a2a-protocol.md +7 -7
- package/docs/content/locales/de-DE/actions.md +5 -5
- package/docs/content/locales/de-DE/agent-mentions.md +4 -4
- package/docs/content/locales/de-DE/agent-surfaces.md +22 -22
- package/docs/content/locales/de-DE/agent-teams.md +4 -4
- package/docs/content/locales/de-DE/agent-web-surfaces.md +4 -4
- package/docs/content/locales/de-DE/authentication.md +6 -6
- package/docs/content/locales/de-DE/automations.md +8 -8
- package/docs/content/locales/de-DE/blueprint-installer.md +2 -2
- package/docs/content/locales/de-DE/client.md +6 -6
- package/docs/content/locales/de-DE/cloneable-saas.md +2 -2
- package/docs/content/locales/de-DE/code-agents-ui.md +9 -9
- package/docs/content/locales/de-DE/components.md +15 -15
- package/docs/content/locales/de-DE/context-awareness.md +8 -8
- package/docs/content/locales/de-DE/creating-templates.md +13 -13
- package/docs/content/locales/de-DE/cross-app-sso.md +3 -3
- package/docs/content/locales/de-DE/database.md +5 -5
- package/docs/content/locales/de-DE/deployment.md +6 -6
- package/docs/content/locales/de-DE/dispatch.md +3 -3
- package/docs/content/locales/de-DE/drop-in-agent.md +14 -14
- package/docs/content/locales/de-DE/durable-resume.md +1 -1
- package/docs/content/locales/de-DE/embedding-sdk.md +2 -2
- package/docs/content/locales/de-DE/evals.md +2 -2
- package/docs/content/locales/de-DE/extensions.md +2 -2
- package/docs/content/locales/de-DE/external-agents.md +6 -6
- package/docs/content/locales/de-DE/faq.md +5 -5
- package/docs/content/locales/de-DE/file-uploads.md +4 -4
- package/docs/content/locales/de-DE/frames.md +2 -2
- package/docs/content/locales/de-DE/getting-started.md +16 -16
- package/docs/content/locales/de-DE/harness-agents.md +3 -3
- package/docs/content/locales/de-DE/human-approval.md +4 -4
- package/docs/content/locales/de-DE/key-concepts.md +14 -14
- package/docs/content/locales/de-DE/local-file-mode.md +8 -8
- package/docs/content/locales/de-DE/mcp-apps.md +4 -4
- package/docs/content/locales/de-DE/mcp-clients.md +7 -7
- package/docs/content/locales/de-DE/mcp-protocol.md +3 -3
- package/docs/content/locales/de-DE/messaging.md +5 -5
- package/docs/content/locales/de-DE/migration-workbench.md +1 -1
- package/docs/content/locales/de-DE/multi-app-workspace.md +2 -2
- package/docs/content/locales/de-DE/multi-tenancy.md +1 -1
- package/docs/content/locales/de-DE/native-chat-ui.md +8 -8
- package/docs/content/locales/de-DE/notifications.md +3 -3
- package/docs/content/locales/de-DE/observability.md +2 -2
- package/docs/content/locales/de-DE/observational-memory.md +2 -2
- package/docs/content/locales/de-DE/onboarding.md +8 -8
- package/docs/content/locales/de-DE/plan-plugin.md +3 -3
- package/docs/content/locales/de-DE/pr-visual-recap.md +11 -11
- package/docs/content/locales/de-DE/processors.md +1 -1
- package/docs/content/locales/de-DE/progress.md +2 -2
- package/docs/content/locales/de-DE/pure-agent-apps.md +1 -1
- package/docs/content/locales/de-DE/real-time-collaboration.md +8 -8
- package/docs/content/locales/de-DE/recurring-jobs.md +5 -5
- package/docs/content/locales/de-DE/routing.md +1 -1
- package/docs/content/locales/de-DE/sandbox-adapters.md +2 -2
- package/docs/content/locales/de-DE/security.md +10 -10
- package/docs/content/locales/de-DE/server.md +10 -10
- package/docs/content/locales/de-DE/sharing.md +6 -6
- package/docs/content/locales/de-DE/skills-guide.md +17 -17
- package/docs/content/locales/de-DE/template-analytics.md +10 -10
- package/docs/content/locales/de-DE/template-assets.md +21 -21
- package/docs/content/locales/de-DE/template-brain.md +11 -11
- package/docs/content/locales/de-DE/template-calendar.md +10 -10
- package/docs/content/locales/de-DE/template-chat.md +5 -5
- package/docs/content/locales/de-DE/template-clips.md +14 -14
- package/docs/content/locales/de-DE/template-content.md +14 -14
- package/docs/content/locales/de-DE/template-design.md +7 -7
- package/docs/content/locales/de-DE/template-dispatch.md +12 -12
- package/docs/content/locales/de-DE/template-forms.md +9 -9
- package/docs/content/locales/de-DE/template-mail.md +6 -6
- package/docs/content/locales/de-DE/template-plan.md +3 -3
- package/docs/content/locales/de-DE/template-slides.md +8 -8
- package/docs/content/locales/de-DE/template-videos.md +6 -6
- package/docs/content/locales/de-DE/tracking.md +3 -3
- package/docs/content/locales/de-DE/using-your-agent.md +6 -6
- package/docs/content/locales/de-DE/voice-input.md +9 -9
- package/docs/content/locales/de-DE/what-is-agent-native.md +6 -6
- package/docs/content/locales/de-DE/workspace-connections.md +9 -9
- package/docs/content/locales/de-DE/workspace-management.md +5 -5
- package/docs/content/locales/de-DE/workspace.md +23 -23
- package/docs/content/locales/de-DE/writing-agent-instructions.md +30 -30
- package/docs/content/locales/es-ES/a2a-protocol.md +7 -7
- package/docs/content/locales/es-ES/actions.md +2 -2
- package/docs/content/locales/es-ES/agent-mentions.md +3 -3
- package/docs/content/locales/es-ES/agent-surfaces.md +7 -7
- package/docs/content/locales/es-ES/agent-teams.md +3 -3
- package/docs/content/locales/es-ES/agent-web-surfaces.md +5 -5
- package/docs/content/locales/es-ES/authentication.md +6 -6
- package/docs/content/locales/es-ES/automations.md +8 -8
- package/docs/content/locales/es-ES/blueprint-installer.md +2 -2
- package/docs/content/locales/es-ES/client.md +1 -1
- package/docs/content/locales/es-ES/cloneable-saas.md +2 -2
- package/docs/content/locales/es-ES/code-agents-ui.md +4 -4
- package/docs/content/locales/es-ES/components.md +5 -5
- package/docs/content/locales/es-ES/context-awareness.md +8 -8
- package/docs/content/locales/es-ES/creating-templates.md +12 -12
- package/docs/content/locales/es-ES/cross-app-sso.md +3 -3
- package/docs/content/locales/es-ES/database.md +5 -5
- package/docs/content/locales/es-ES/deployment.md +4 -4
- package/docs/content/locales/es-ES/dispatch.md +3 -3
- package/docs/content/locales/es-ES/drop-in-agent.md +8 -8
- package/docs/content/locales/es-ES/durable-resume.md +1 -1
- package/docs/content/locales/es-ES/embedding-sdk.md +2 -2
- package/docs/content/locales/es-ES/evals.md +2 -2
- package/docs/content/locales/es-ES/extensions.md +2 -2
- package/docs/content/locales/es-ES/external-agents.md +5 -5
- package/docs/content/locales/es-ES/faq.md +3 -3
- package/docs/content/locales/es-ES/file-uploads.md +4 -4
- package/docs/content/locales/es-ES/frames.md +1 -1
- package/docs/content/locales/es-ES/getting-started.md +13 -13
- package/docs/content/locales/es-ES/harness-agents.md +3 -3
- package/docs/content/locales/es-ES/human-approval.md +3 -3
- package/docs/content/locales/es-ES/key-concepts.md +14 -14
- package/docs/content/locales/es-ES/local-file-mode.md +6 -6
- package/docs/content/locales/es-ES/mcp-apps.md +4 -4
- package/docs/content/locales/es-ES/mcp-clients.md +8 -8
- package/docs/content/locales/es-ES/mcp-protocol.md +3 -3
- package/docs/content/locales/es-ES/messaging.md +4 -4
- package/docs/content/locales/es-ES/migration-workbench.md +1 -1
- package/docs/content/locales/es-ES/multi-app-workspace.md +1 -1
- package/docs/content/locales/es-ES/multi-tenancy.md +1 -1
- package/docs/content/locales/es-ES/native-chat-ui.md +3 -3
- package/docs/content/locales/es-ES/notifications.md +3 -3
- package/docs/content/locales/es-ES/observability.md +2 -2
- package/docs/content/locales/es-ES/observational-memory.md +2 -2
- package/docs/content/locales/es-ES/onboarding.md +8 -8
- package/docs/content/locales/es-ES/plan-plugin.md +3 -3
- package/docs/content/locales/es-ES/pr-visual-recap.md +11 -11
- package/docs/content/locales/es-ES/processors.md +1 -1
- package/docs/content/locales/es-ES/progress.md +2 -2
- package/docs/content/locales/es-ES/pure-agent-apps.md +1 -1
- package/docs/content/locales/es-ES/real-time-collaboration.md +6 -6
- package/docs/content/locales/es-ES/recurring-jobs.md +5 -5
- package/docs/content/locales/es-ES/routing.md +1 -1
- package/docs/content/locales/es-ES/sandbox-adapters.md +2 -2
- package/docs/content/locales/es-ES/security.md +8 -8
- package/docs/content/locales/es-ES/server.md +11 -11
- package/docs/content/locales/es-ES/sharing.md +6 -6
- package/docs/content/locales/es-ES/skills-guide.md +16 -16
- package/docs/content/locales/es-ES/template-analytics.md +10 -10
- package/docs/content/locales/es-ES/template-assets.md +19 -19
- package/docs/content/locales/es-ES/template-brain.md +11 -11
- package/docs/content/locales/es-ES/template-calendar.md +9 -9
- package/docs/content/locales/es-ES/template-chat.md +3 -3
- package/docs/content/locales/es-ES/template-clips.md +14 -14
- package/docs/content/locales/es-ES/template-content.md +13 -13
- package/docs/content/locales/es-ES/template-design.md +7 -7
- package/docs/content/locales/es-ES/template-dispatch.md +8 -8
- package/docs/content/locales/es-ES/template-forms.md +9 -9
- package/docs/content/locales/es-ES/template-mail.md +6 -6
- package/docs/content/locales/es-ES/template-plan.md +3 -3
- package/docs/content/locales/es-ES/template-slides.md +8 -8
- package/docs/content/locales/es-ES/template-videos.md +5 -5
- package/docs/content/locales/es-ES/tracking.md +3 -3
- package/docs/content/locales/es-ES/using-your-agent.md +5 -5
- package/docs/content/locales/es-ES/voice-input.md +4 -4
- package/docs/content/locales/es-ES/what-is-agent-native.md +6 -6
- package/docs/content/locales/es-ES/workspace-connections.md +8 -8
- package/docs/content/locales/es-ES/workspace-management.md +4 -4
- package/docs/content/locales/es-ES/workspace.md +23 -23
- package/docs/content/locales/es-ES/writing-agent-instructions.md +18 -18
- package/docs/content/locales/fr-FR/a2a-protocol.md +7 -7
- package/docs/content/locales/fr-FR/actions.md +2 -2
- package/docs/content/locales/fr-FR/agent-mentions.md +3 -3
- package/docs/content/locales/fr-FR/agent-surfaces.md +7 -7
- package/docs/content/locales/fr-FR/agent-teams.md +3 -3
- package/docs/content/locales/fr-FR/agent-web-surfaces.md +5 -5
- package/docs/content/locales/fr-FR/authentication.md +6 -6
- package/docs/content/locales/fr-FR/automations.md +8 -8
- package/docs/content/locales/fr-FR/blueprint-installer.md +2 -2
- package/docs/content/locales/fr-FR/client.md +1 -1
- package/docs/content/locales/fr-FR/cloneable-saas.md +2 -2
- package/docs/content/locales/fr-FR/code-agents-ui.md +4 -4
- package/docs/content/locales/fr-FR/components.md +5 -5
- package/docs/content/locales/fr-FR/context-awareness.md +8 -8
- package/docs/content/locales/fr-FR/creating-templates.md +12 -12
- package/docs/content/locales/fr-FR/cross-app-sso.md +4 -4
- package/docs/content/locales/fr-FR/database.md +5 -5
- package/docs/content/locales/fr-FR/deployment.md +5 -5
- package/docs/content/locales/fr-FR/dispatch.md +3 -3
- package/docs/content/locales/fr-FR/drop-in-agent.md +9 -9
- package/docs/content/locales/fr-FR/durable-resume.md +1 -1
- package/docs/content/locales/fr-FR/embedding-sdk.md +7 -7
- package/docs/content/locales/fr-FR/evals.md +2 -2
- package/docs/content/locales/fr-FR/extensions.md +2 -2
- package/docs/content/locales/fr-FR/external-agents.md +5 -5
- package/docs/content/locales/fr-FR/faq.md +3 -3
- package/docs/content/locales/fr-FR/file-uploads.md +5 -5
- package/docs/content/locales/fr-FR/frames.md +1 -1
- package/docs/content/locales/fr-FR/getting-started.md +13 -13
- package/docs/content/locales/fr-FR/harness-agents.md +3 -3
- package/docs/content/locales/fr-FR/human-approval.md +3 -3
- package/docs/content/locales/fr-FR/key-concepts.md +15 -15
- package/docs/content/locales/fr-FR/local-file-mode.md +5 -5
- package/docs/content/locales/fr-FR/mcp-apps.md +4 -4
- package/docs/content/locales/fr-FR/mcp-clients.md +8 -8
- package/docs/content/locales/fr-FR/mcp-protocol.md +3 -3
- package/docs/content/locales/fr-FR/messaging.md +4 -4
- package/docs/content/locales/fr-FR/migration-workbench.md +1 -1
- package/docs/content/locales/fr-FR/multi-app-workspace.md +1 -1
- package/docs/content/locales/fr-FR/multi-tenancy.md +1 -1
- package/docs/content/locales/fr-FR/native-chat-ui.md +3 -3
- package/docs/content/locales/fr-FR/notifications.md +3 -3
- package/docs/content/locales/fr-FR/observability.md +2 -2
- package/docs/content/locales/fr-FR/observational-memory.md +2 -2
- package/docs/content/locales/fr-FR/onboarding.md +8 -8
- package/docs/content/locales/fr-FR/plan-plugin.md +3 -3
- package/docs/content/locales/fr-FR/pr-visual-recap.md +11 -11
- package/docs/content/locales/fr-FR/processors.md +1 -1
- package/docs/content/locales/fr-FR/progress.md +2 -2
- package/docs/content/locales/fr-FR/pure-agent-apps.md +1 -1
- package/docs/content/locales/fr-FR/real-time-collaboration.md +8 -8
- package/docs/content/locales/fr-FR/recurring-jobs.md +5 -5
- package/docs/content/locales/fr-FR/routing.md +1 -1
- package/docs/content/locales/fr-FR/sandbox-adapters.md +2 -2
- package/docs/content/locales/fr-FR/security.md +8 -8
- package/docs/content/locales/fr-FR/server.md +10 -10
- package/docs/content/locales/fr-FR/sharing.md +6 -6
- package/docs/content/locales/fr-FR/skills-guide.md +16 -16
- package/docs/content/locales/fr-FR/template-analytics.md +10 -10
- package/docs/content/locales/fr-FR/template-assets.md +20 -20
- package/docs/content/locales/fr-FR/template-brain.md +11 -11
- package/docs/content/locales/fr-FR/template-calendar.md +9 -9
- package/docs/content/locales/fr-FR/template-chat.md +3 -3
- package/docs/content/locales/fr-FR/template-clips.md +15 -15
- package/docs/content/locales/fr-FR/template-content.md +13 -13
- package/docs/content/locales/fr-FR/template-design.md +8 -8
- package/docs/content/locales/fr-FR/template-dispatch.md +8 -8
- package/docs/content/locales/fr-FR/template-forms.md +10 -10
- package/docs/content/locales/fr-FR/template-mail.md +6 -6
- package/docs/content/locales/fr-FR/template-plan.md +3 -3
- package/docs/content/locales/fr-FR/template-slides.md +9 -9
- package/docs/content/locales/fr-FR/template-videos.md +5 -5
- package/docs/content/locales/fr-FR/tracking.md +3 -3
- package/docs/content/locales/fr-FR/using-your-agent.md +5 -5
- package/docs/content/locales/fr-FR/voice-input.md +4 -4
- package/docs/content/locales/fr-FR/what-is-agent-native.md +6 -6
- package/docs/content/locales/fr-FR/workspace-connections.md +8 -8
- package/docs/content/locales/fr-FR/workspace-management.md +5 -5
- package/docs/content/locales/fr-FR/workspace.md +23 -23
- package/docs/content/locales/fr-FR/writing-agent-instructions.md +18 -18
- package/docs/content/locales/hi-IN/a2a-protocol.md +7 -7
- package/docs/content/locales/hi-IN/actions.md +3 -3
- package/docs/content/locales/hi-IN/agent-mentions.md +3 -3
- package/docs/content/locales/hi-IN/agent-surfaces.md +7 -7
- package/docs/content/locales/hi-IN/agent-teams.md +3 -3
- package/docs/content/locales/hi-IN/agent-web-surfaces.md +5 -5
- package/docs/content/locales/hi-IN/authentication.md +6 -6
- package/docs/content/locales/hi-IN/automations.md +8 -8
- package/docs/content/locales/hi-IN/blueprint-installer.md +2 -2
- package/docs/content/locales/hi-IN/client.md +1 -1
- package/docs/content/locales/hi-IN/cloneable-saas.md +2 -2
- package/docs/content/locales/hi-IN/code-agents-ui.md +4 -4
- package/docs/content/locales/hi-IN/components.md +5 -5
- package/docs/content/locales/hi-IN/context-awareness.md +8 -8
- package/docs/content/locales/hi-IN/creating-templates.md +14 -14
- package/docs/content/locales/hi-IN/cross-app-sso.md +3 -3
- package/docs/content/locales/hi-IN/database.md +5 -5
- package/docs/content/locales/hi-IN/deployment.md +5 -5
- package/docs/content/locales/hi-IN/dispatch.md +4 -4
- package/docs/content/locales/hi-IN/drop-in-agent.md +8 -8
- package/docs/content/locales/hi-IN/durable-resume.md +1 -1
- package/docs/content/locales/hi-IN/embedding-sdk.md +2 -2
- package/docs/content/locales/hi-IN/evals.md +2 -2
- package/docs/content/locales/hi-IN/extensions.md +2 -2
- package/docs/content/locales/hi-IN/external-agents.md +5 -5
- package/docs/content/locales/hi-IN/faq.md +3 -3
- package/docs/content/locales/hi-IN/file-uploads.md +4 -4
- package/docs/content/locales/hi-IN/frames.md +1 -1
- package/docs/content/locales/hi-IN/getting-started.md +14 -14
- package/docs/content/locales/hi-IN/harness-agents.md +3 -3
- package/docs/content/locales/hi-IN/human-approval.md +3 -3
- package/docs/content/locales/hi-IN/key-concepts.md +14 -14
- package/docs/content/locales/hi-IN/local-file-mode.md +5 -5
- package/docs/content/locales/hi-IN/mcp-apps.md +4 -4
- package/docs/content/locales/hi-IN/mcp-clients.md +7 -7
- package/docs/content/locales/hi-IN/mcp-protocol.md +3 -3
- package/docs/content/locales/hi-IN/messaging.md +6 -6
- package/docs/content/locales/hi-IN/migration-workbench.md +1 -1
- package/docs/content/locales/hi-IN/multi-app-workspace.md +1 -1
- package/docs/content/locales/hi-IN/multi-tenancy.md +1 -1
- package/docs/content/locales/hi-IN/native-chat-ui.md +3 -3
- package/docs/content/locales/hi-IN/notifications.md +3 -3
- package/docs/content/locales/hi-IN/observability.md +2 -2
- package/docs/content/locales/hi-IN/observational-memory.md +2 -2
- package/docs/content/locales/hi-IN/onboarding.md +8 -8
- package/docs/content/locales/hi-IN/plan-plugin.md +3 -3
- package/docs/content/locales/hi-IN/pr-visual-recap.md +11 -11
- package/docs/content/locales/hi-IN/processors.md +1 -1
- package/docs/content/locales/hi-IN/progress.md +2 -2
- package/docs/content/locales/hi-IN/pure-agent-apps.md +1 -1
- package/docs/content/locales/hi-IN/real-time-collaboration.md +6 -6
- package/docs/content/locales/hi-IN/recurring-jobs.md +5 -5
- package/docs/content/locales/hi-IN/routing.md +1 -1
- package/docs/content/locales/hi-IN/sandbox-adapters.md +2 -2
- package/docs/content/locales/hi-IN/security.md +8 -8
- package/docs/content/locales/hi-IN/server.md +10 -10
- package/docs/content/locales/hi-IN/sharing.md +6 -6
- package/docs/content/locales/hi-IN/skills-guide.md +16 -16
- package/docs/content/locales/hi-IN/template-analytics.md +10 -10
- package/docs/content/locales/hi-IN/template-assets.md +19 -19
- package/docs/content/locales/hi-IN/template-brain.md +11 -11
- package/docs/content/locales/hi-IN/template-calendar.md +9 -9
- package/docs/content/locales/hi-IN/template-chat.md +3 -3
- package/docs/content/locales/hi-IN/template-clips.md +14 -14
- package/docs/content/locales/hi-IN/template-content.md +13 -13
- package/docs/content/locales/hi-IN/template-design.md +7 -7
- package/docs/content/locales/hi-IN/template-dispatch.md +9 -9
- package/docs/content/locales/hi-IN/template-forms.md +9 -9
- package/docs/content/locales/hi-IN/template-mail.md +6 -6
- package/docs/content/locales/hi-IN/template-plan.md +3 -3
- package/docs/content/locales/hi-IN/template-slides.md +8 -8
- package/docs/content/locales/hi-IN/template-videos.md +5 -5
- package/docs/content/locales/hi-IN/tracking.md +3 -3
- package/docs/content/locales/hi-IN/using-your-agent.md +1 -1
- package/docs/content/locales/hi-IN/voice-input.md +4 -4
- package/docs/content/locales/hi-IN/what-is-agent-native.md +4 -4
- package/docs/content/locales/hi-IN/workspace-connections.md +8 -8
- package/docs/content/locales/hi-IN/workspace-management.md +4 -4
- package/docs/content/locales/hi-IN/workspace.md +23 -23
- package/docs/content/locales/hi-IN/writing-agent-instructions.md +18 -18
- package/docs/content/locales/ja-JP/a2a-protocol.md +7 -7
- package/docs/content/locales/ja-JP/actions.md +3 -3
- package/docs/content/locales/ja-JP/agent-mentions.md +3 -3
- package/docs/content/locales/ja-JP/agent-surfaces.md +7 -7
- package/docs/content/locales/ja-JP/agent-teams.md +3 -3
- package/docs/content/locales/ja-JP/agent-web-surfaces.md +5 -5
- package/docs/content/locales/ja-JP/authentication.md +6 -6
- package/docs/content/locales/ja-JP/automations.md +8 -8
- package/docs/content/locales/ja-JP/blueprint-installer.md +2 -2
- package/docs/content/locales/ja-JP/client.md +1 -1
- package/docs/content/locales/ja-JP/cloneable-saas.md +2 -2
- package/docs/content/locales/ja-JP/code-agents-ui.md +4 -4
- package/docs/content/locales/ja-JP/components.md +5 -5
- package/docs/content/locales/ja-JP/context-awareness.md +8 -8
- package/docs/content/locales/ja-JP/creating-templates.md +12 -12
- package/docs/content/locales/ja-JP/cross-app-sso.md +3 -3
- package/docs/content/locales/ja-JP/database.md +7 -7
- package/docs/content/locales/ja-JP/deployment.md +4 -4
- package/docs/content/locales/ja-JP/dispatch.md +4 -4
- package/docs/content/locales/ja-JP/drop-in-agent.md +8 -8
- package/docs/content/locales/ja-JP/durable-resume.md +1 -1
- package/docs/content/locales/ja-JP/embedding-sdk.md +2 -2
- package/docs/content/locales/ja-JP/evals.md +2 -2
- package/docs/content/locales/ja-JP/extensions.md +2 -2
- package/docs/content/locales/ja-JP/external-agents.md +5 -5
- package/docs/content/locales/ja-JP/faq.md +3 -3
- package/docs/content/locales/ja-JP/file-uploads.md +4 -4
- package/docs/content/locales/ja-JP/frames.md +1 -1
- package/docs/content/locales/ja-JP/getting-started.md +13 -13
- package/docs/content/locales/ja-JP/harness-agents.md +3 -3
- package/docs/content/locales/ja-JP/human-approval.md +3 -3
- package/docs/content/locales/ja-JP/key-concepts.md +14 -14
- package/docs/content/locales/ja-JP/local-file-mode.md +5 -5
- package/docs/content/locales/ja-JP/mcp-apps.md +4 -4
- package/docs/content/locales/ja-JP/mcp-clients.md +8 -8
- package/docs/content/locales/ja-JP/mcp-protocol.md +3 -3
- package/docs/content/locales/ja-JP/messaging.md +6 -6
- package/docs/content/locales/ja-JP/migration-workbench.md +1 -1
- package/docs/content/locales/ja-JP/multi-app-workspace.md +1 -1
- package/docs/content/locales/ja-JP/multi-tenancy.md +1 -1
- package/docs/content/locales/ja-JP/native-chat-ui.md +3 -3
- package/docs/content/locales/ja-JP/notifications.md +3 -3
- package/docs/content/locales/ja-JP/observability.md +2 -2
- package/docs/content/locales/ja-JP/observational-memory.md +2 -2
- package/docs/content/locales/ja-JP/onboarding.md +8 -8
- package/docs/content/locales/ja-JP/plan-plugin.md +3 -3
- package/docs/content/locales/ja-JP/pr-visual-recap.md +11 -11
- package/docs/content/locales/ja-JP/processors.md +1 -1
- package/docs/content/locales/ja-JP/progress.md +2 -2
- package/docs/content/locales/ja-JP/pure-agent-apps.md +1 -1
- package/docs/content/locales/ja-JP/real-time-collaboration.md +6 -6
- package/docs/content/locales/ja-JP/recurring-jobs.md +5 -5
- package/docs/content/locales/ja-JP/routing.md +1 -1
- package/docs/content/locales/ja-JP/sandbox-adapters.md +2 -2
- package/docs/content/locales/ja-JP/security.md +8 -8
- package/docs/content/locales/ja-JP/server.md +10 -10
- package/docs/content/locales/ja-JP/sharing.md +6 -6
- package/docs/content/locales/ja-JP/skills-guide.md +16 -16
- package/docs/content/locales/ja-JP/template-analytics.md +10 -10
- package/docs/content/locales/ja-JP/template-assets.md +19 -19
- package/docs/content/locales/ja-JP/template-brain.md +11 -11
- package/docs/content/locales/ja-JP/template-calendar.md +9 -9
- package/docs/content/locales/ja-JP/template-chat.md +3 -3
- package/docs/content/locales/ja-JP/template-clips.md +14 -14
- package/docs/content/locales/ja-JP/template-content.md +13 -13
- package/docs/content/locales/ja-JP/template-design.md +7 -7
- package/docs/content/locales/ja-JP/template-dispatch.md +12 -12
- package/docs/content/locales/ja-JP/template-forms.md +9 -9
- package/docs/content/locales/ja-JP/template-mail.md +6 -6
- package/docs/content/locales/ja-JP/template-plan.md +3 -3
- package/docs/content/locales/ja-JP/template-slides.md +8 -8
- package/docs/content/locales/ja-JP/template-videos.md +5 -5
- package/docs/content/locales/ja-JP/tracking.md +3 -3
- package/docs/content/locales/ja-JP/using-your-agent.md +4 -4
- package/docs/content/locales/ja-JP/voice-input.md +4 -4
- package/docs/content/locales/ja-JP/what-is-agent-native.md +4 -4
- package/docs/content/locales/ja-JP/workspace-connections.md +8 -8
- package/docs/content/locales/ja-JP/workspace-management.md +5 -5
- package/docs/content/locales/ja-JP/workspace.md +23 -23
- package/docs/content/locales/ja-JP/writing-agent-instructions.md +18 -18
- package/docs/content/locales/ko-KR/a2a-protocol.md +7 -7
- package/docs/content/locales/ko-KR/actions.md +3 -3
- package/docs/content/locales/ko-KR/agent-mentions.md +3 -3
- package/docs/content/locales/ko-KR/agent-surfaces.md +15 -15
- package/docs/content/locales/ko-KR/agent-teams.md +3 -3
- package/docs/content/locales/ko-KR/agent-web-surfaces.md +5 -5
- package/docs/content/locales/ko-KR/authentication.md +13 -13
- package/docs/content/locales/ko-KR/automations.md +8 -8
- package/docs/content/locales/ko-KR/blueprint-installer.md +2 -2
- package/docs/content/locales/ko-KR/client.md +1 -1
- package/docs/content/locales/ko-KR/cloneable-saas.md +2 -2
- package/docs/content/locales/ko-KR/code-agents-ui.md +4 -4
- package/docs/content/locales/ko-KR/components.md +5 -5
- package/docs/content/locales/ko-KR/context-awareness.md +8 -8
- package/docs/content/locales/ko-KR/creating-templates.md +12 -12
- package/docs/content/locales/ko-KR/cross-app-sso.md +3 -3
- package/docs/content/locales/ko-KR/database.md +7 -7
- package/docs/content/locales/ko-KR/deployment.md +4 -4
- package/docs/content/locales/ko-KR/dispatch.md +4 -4
- package/docs/content/locales/ko-KR/drop-in-agent.md +8 -8
- package/docs/content/locales/ko-KR/durable-resume.md +1 -1
- package/docs/content/locales/ko-KR/embedding-sdk.md +2 -2
- package/docs/content/locales/ko-KR/evals.md +2 -2
- package/docs/content/locales/ko-KR/extensions.md +2 -2
- package/docs/content/locales/ko-KR/external-agents.md +5 -5
- package/docs/content/locales/ko-KR/faq.md +3 -3
- package/docs/content/locales/ko-KR/file-uploads.md +4 -4
- package/docs/content/locales/ko-KR/frames.md +1 -1
- package/docs/content/locales/ko-KR/getting-started.md +13 -13
- package/docs/content/locales/ko-KR/harness-agents.md +3 -3
- package/docs/content/locales/ko-KR/human-approval.md +3 -3
- package/docs/content/locales/ko-KR/key-concepts.md +14 -14
- package/docs/content/locales/ko-KR/local-file-mode.md +5 -5
- package/docs/content/locales/ko-KR/mcp-apps.md +4 -4
- package/docs/content/locales/ko-KR/mcp-clients.md +8 -8
- package/docs/content/locales/ko-KR/mcp-protocol.md +3 -3
- package/docs/content/locales/ko-KR/messaging.md +6 -6
- package/docs/content/locales/ko-KR/migration-workbench.md +1 -1
- package/docs/content/locales/ko-KR/multi-app-workspace.md +1 -1
- package/docs/content/locales/ko-KR/multi-tenancy.md +1 -1
- package/docs/content/locales/ko-KR/native-chat-ui.md +3 -3
- package/docs/content/locales/ko-KR/notifications.md +3 -3
- package/docs/content/locales/ko-KR/observability.md +2 -2
- package/docs/content/locales/ko-KR/observational-memory.md +2 -2
- package/docs/content/locales/ko-KR/onboarding.md +8 -8
- package/docs/content/locales/ko-KR/plan-plugin.md +3 -3
- package/docs/content/locales/ko-KR/pr-visual-recap.md +11 -11
- package/docs/content/locales/ko-KR/processors.md +1 -1
- package/docs/content/locales/ko-KR/progress.md +2 -2
- package/docs/content/locales/ko-KR/pure-agent-apps.md +1 -1
- package/docs/content/locales/ko-KR/real-time-collaboration.md +6 -6
- package/docs/content/locales/ko-KR/recurring-jobs.md +5 -5
- package/docs/content/locales/ko-KR/routing.md +1 -1
- package/docs/content/locales/ko-KR/sandbox-adapters.md +2 -2
- package/docs/content/locales/ko-KR/security.md +8 -8
- package/docs/content/locales/ko-KR/server.md +10 -10
- package/docs/content/locales/ko-KR/sharing.md +6 -6
- package/docs/content/locales/ko-KR/skills-guide.md +16 -16
- package/docs/content/locales/ko-KR/template-analytics.md +10 -10
- package/docs/content/locales/ko-KR/template-assets.md +19 -19
- package/docs/content/locales/ko-KR/template-brain.md +11 -11
- package/docs/content/locales/ko-KR/template-calendar.md +9 -9
- package/docs/content/locales/ko-KR/template-chat.md +3 -3
- package/docs/content/locales/ko-KR/template-clips.md +14 -14
- package/docs/content/locales/ko-KR/template-content.md +13 -13
- package/docs/content/locales/ko-KR/template-design.md +7 -7
- package/docs/content/locales/ko-KR/template-dispatch.md +11 -11
- package/docs/content/locales/ko-KR/template-forms.md +9 -9
- package/docs/content/locales/ko-KR/template-mail.md +6 -6
- package/docs/content/locales/ko-KR/template-plan.md +3 -3
- package/docs/content/locales/ko-KR/template-slides.md +8 -8
- package/docs/content/locales/ko-KR/template-videos.md +5 -5
- package/docs/content/locales/ko-KR/tracking.md +3 -3
- package/docs/content/locales/ko-KR/using-your-agent.md +5 -5
- package/docs/content/locales/ko-KR/voice-input.md +4 -4
- package/docs/content/locales/ko-KR/what-is-agent-native.md +6 -6
- package/docs/content/locales/ko-KR/workspace-connections.md +8 -8
- package/docs/content/locales/ko-KR/workspace-management.md +4 -4
- package/docs/content/locales/ko-KR/workspace.md +23 -23
- package/docs/content/locales/ko-KR/writing-agent-instructions.md +18 -18
- package/docs/content/locales/pt-BR/a2a-protocol.md +7 -7
- package/docs/content/locales/pt-BR/actions.md +2 -2
- package/docs/content/locales/pt-BR/agent-mentions.md +3 -3
- package/docs/content/locales/pt-BR/agent-surfaces.md +7 -7
- package/docs/content/locales/pt-BR/agent-teams.md +3 -3
- package/docs/content/locales/pt-BR/agent-web-surfaces.md +5 -5
- package/docs/content/locales/pt-BR/authentication.md +6 -6
- package/docs/content/locales/pt-BR/automations.md +8 -8
- package/docs/content/locales/pt-BR/blueprint-installer.md +2 -2
- package/docs/content/locales/pt-BR/client.md +2 -2
- package/docs/content/locales/pt-BR/cloneable-saas.md +2 -2
- package/docs/content/locales/pt-BR/code-agents-ui.md +4 -4
- package/docs/content/locales/pt-BR/components.md +5 -5
- package/docs/content/locales/pt-BR/context-awareness.md +8 -8
- package/docs/content/locales/pt-BR/creating-templates.md +12 -12
- package/docs/content/locales/pt-BR/cross-app-sso.md +3 -3
- package/docs/content/locales/pt-BR/database.md +5 -5
- package/docs/content/locales/pt-BR/deployment.md +5 -5
- package/docs/content/locales/pt-BR/dispatch.md +3 -3
- package/docs/content/locales/pt-BR/drop-in-agent.md +9 -9
- package/docs/content/locales/pt-BR/durable-resume.md +1 -1
- package/docs/content/locales/pt-BR/embedding-sdk.md +2 -2
- package/docs/content/locales/pt-BR/evals.md +2 -2
- package/docs/content/locales/pt-BR/extensions.md +2 -2
- package/docs/content/locales/pt-BR/external-agents.md +5 -5
- package/docs/content/locales/pt-BR/faq.md +3 -3
- package/docs/content/locales/pt-BR/file-uploads.md +4 -4
- package/docs/content/locales/pt-BR/frames.md +2 -2
- package/docs/content/locales/pt-BR/getting-started.md +13 -13
- package/docs/content/locales/pt-BR/harness-agents.md +3 -3
- package/docs/content/locales/pt-BR/human-approval.md +3 -3
- package/docs/content/locales/pt-BR/key-concepts.md +15 -15
- package/docs/content/locales/pt-BR/local-file-mode.md +5 -5
- package/docs/content/locales/pt-BR/mcp-apps.md +4 -4
- package/docs/content/locales/pt-BR/mcp-clients.md +8 -8
- package/docs/content/locales/pt-BR/mcp-protocol.md +3 -3
- package/docs/content/locales/pt-BR/messaging.md +4 -4
- package/docs/content/locales/pt-BR/migration-workbench.md +1 -1
- package/docs/content/locales/pt-BR/multi-app-workspace.md +1 -1
- package/docs/content/locales/pt-BR/multi-tenancy.md +1 -1
- package/docs/content/locales/pt-BR/native-chat-ui.md +3 -3
- package/docs/content/locales/pt-BR/notifications.md +3 -3
- package/docs/content/locales/pt-BR/observability.md +2 -2
- package/docs/content/locales/pt-BR/observational-memory.md +2 -2
- package/docs/content/locales/pt-BR/onboarding.md +8 -8
- package/docs/content/locales/pt-BR/plan-plugin.md +3 -3
- package/docs/content/locales/pt-BR/pr-visual-recap.md +11 -11
- package/docs/content/locales/pt-BR/processors.md +1 -1
- package/docs/content/locales/pt-BR/progress.md +2 -2
- package/docs/content/locales/pt-BR/pure-agent-apps.md +1 -1
- package/docs/content/locales/pt-BR/real-time-collaboration.md +6 -6
- package/docs/content/locales/pt-BR/recurring-jobs.md +5 -5
- package/docs/content/locales/pt-BR/routing.md +1 -1
- package/docs/content/locales/pt-BR/sandbox-adapters.md +2 -2
- package/docs/content/locales/pt-BR/security.md +9 -9
- package/docs/content/locales/pt-BR/server.md +10 -10
- package/docs/content/locales/pt-BR/sharing.md +6 -6
- package/docs/content/locales/pt-BR/skills-guide.md +16 -16
- package/docs/content/locales/pt-BR/template-analytics.md +10 -10
- package/docs/content/locales/pt-BR/template-assets.md +20 -20
- package/docs/content/locales/pt-BR/template-brain.md +11 -11
- package/docs/content/locales/pt-BR/template-calendar.md +9 -9
- package/docs/content/locales/pt-BR/template-chat.md +3 -3
- package/docs/content/locales/pt-BR/template-clips.md +15 -15
- package/docs/content/locales/pt-BR/template-content.md +13 -13
- package/docs/content/locales/pt-BR/template-design.md +8 -8
- package/docs/content/locales/pt-BR/template-dispatch.md +8 -8
- package/docs/content/locales/pt-BR/template-forms.md +10 -10
- package/docs/content/locales/pt-BR/template-mail.md +6 -6
- package/docs/content/locales/pt-BR/template-plan.md +3 -3
- package/docs/content/locales/pt-BR/template-slides.md +9 -9
- package/docs/content/locales/pt-BR/template-videos.md +5 -5
- package/docs/content/locales/pt-BR/tracking.md +3 -3
- package/docs/content/locales/pt-BR/using-your-agent.md +5 -5
- package/docs/content/locales/pt-BR/voice-input.md +4 -4
- package/docs/content/locales/pt-BR/what-is-agent-native.md +5 -5
- package/docs/content/locales/pt-BR/workspace-connections.md +8 -8
- package/docs/content/locales/pt-BR/workspace-management.md +4 -4
- package/docs/content/locales/pt-BR/workspace.md +23 -23
- package/docs/content/locales/pt-BR/writing-agent-instructions.md +18 -18
- package/docs/content/locales/zh-CN/a2a-protocol.md +7 -7
- package/docs/content/locales/zh-CN/actions.md +3 -3
- package/docs/content/locales/zh-CN/agent-mentions.md +3 -3
- package/docs/content/locales/zh-CN/agent-surfaces.md +7 -7
- package/docs/content/locales/zh-CN/agent-teams.md +3 -3
- package/docs/content/locales/zh-CN/agent-web-surfaces.md +5 -5
- package/docs/content/locales/zh-CN/authentication.md +13 -13
- package/docs/content/locales/zh-CN/automations.md +8 -8
- package/docs/content/locales/zh-CN/blueprint-installer.md +2 -2
- package/docs/content/locales/zh-CN/client.md +1 -1
- package/docs/content/locales/zh-CN/cloneable-saas.md +2 -2
- package/docs/content/locales/zh-CN/code-agents-ui.md +4 -4
- package/docs/content/locales/zh-CN/components.md +7 -7
- package/docs/content/locales/zh-CN/context-awareness.md +8 -8
- package/docs/content/locales/zh-CN/creating-templates.md +12 -12
- package/docs/content/locales/zh-CN/cross-app-sso.md +3 -3
- package/docs/content/locales/zh-CN/database.md +7 -7
- package/docs/content/locales/zh-CN/deployment.md +4 -4
- package/docs/content/locales/zh-CN/dispatch.md +4 -4
- package/docs/content/locales/zh-CN/drop-in-agent.md +8 -8
- package/docs/content/locales/zh-CN/durable-resume.md +1 -1
- package/docs/content/locales/zh-CN/embedding-sdk.md +2 -2
- package/docs/content/locales/zh-CN/evals.md +2 -2
- package/docs/content/locales/zh-CN/extensions.md +2 -2
- package/docs/content/locales/zh-CN/external-agents.md +5 -5
- package/docs/content/locales/zh-CN/faq.md +3 -3
- package/docs/content/locales/zh-CN/file-uploads.md +4 -4
- package/docs/content/locales/zh-CN/frames.md +2 -2
- package/docs/content/locales/zh-CN/getting-started.md +13 -13
- package/docs/content/locales/zh-CN/harness-agents.md +3 -3
- package/docs/content/locales/zh-CN/human-approval.md +3 -3
- package/docs/content/locales/zh-CN/key-concepts.md +14 -14
- package/docs/content/locales/zh-CN/local-file-mode.md +5 -5
- package/docs/content/locales/zh-CN/mcp-apps.md +4 -4
- package/docs/content/locales/zh-CN/mcp-clients.md +7 -7
- package/docs/content/locales/zh-CN/mcp-protocol.md +3 -3
- package/docs/content/locales/zh-CN/messaging.md +6 -6
- package/docs/content/locales/zh-CN/migration-workbench.md +1 -1
- package/docs/content/locales/zh-CN/multi-app-workspace.md +1 -1
- package/docs/content/locales/zh-CN/multi-tenancy.md +1 -1
- package/docs/content/locales/zh-CN/native-chat-ui.md +3 -3
- package/docs/content/locales/zh-CN/notifications.md +3 -3
- package/docs/content/locales/zh-CN/observability.md +2 -2
- package/docs/content/locales/zh-CN/observational-memory.md +2 -2
- package/docs/content/locales/zh-CN/onboarding.md +8 -8
- package/docs/content/locales/zh-CN/plan-plugin.md +3 -3
- package/docs/content/locales/zh-CN/pr-visual-recap.md +11 -11
- package/docs/content/locales/zh-CN/processors.md +1 -1
- package/docs/content/locales/zh-CN/progress.md +2 -2
- package/docs/content/locales/zh-CN/pure-agent-apps.md +1 -1
- package/docs/content/locales/zh-CN/real-time-collaboration.md +6 -6
- package/docs/content/locales/zh-CN/recurring-jobs.md +5 -5
- package/docs/content/locales/zh-CN/routing.md +1 -1
- package/docs/content/locales/zh-CN/sandbox-adapters.md +2 -2
- package/docs/content/locales/zh-CN/security.md +8 -8
- package/docs/content/locales/zh-CN/server.md +10 -10
- package/docs/content/locales/zh-CN/sharing.md +6 -6
- package/docs/content/locales/zh-CN/skills-guide.md +16 -16
- package/docs/content/locales/zh-CN/template-analytics.md +10 -10
- package/docs/content/locales/zh-CN/template-assets.md +20 -20
- package/docs/content/locales/zh-CN/template-brain.md +11 -11
- package/docs/content/locales/zh-CN/template-calendar.md +9 -9
- package/docs/content/locales/zh-CN/template-chat.md +3 -3
- package/docs/content/locales/zh-CN/template-clips.md +14 -14
- package/docs/content/locales/zh-CN/template-content.md +13 -13
- package/docs/content/locales/zh-CN/template-design.md +7 -7
- package/docs/content/locales/zh-CN/template-dispatch.md +11 -11
- package/docs/content/locales/zh-CN/template-forms.md +9 -9
- package/docs/content/locales/zh-CN/template-mail.md +6 -6
- package/docs/content/locales/zh-CN/template-plan.md +3 -3
- package/docs/content/locales/zh-CN/template-slides.md +8 -8
- package/docs/content/locales/zh-CN/template-videos.md +5 -5
- package/docs/content/locales/zh-CN/tracking.md +3 -3
- package/docs/content/locales/zh-CN/using-your-agent.md +5 -5
- package/docs/content/locales/zh-CN/voice-input.md +4 -4
- package/docs/content/locales/zh-CN/what-is-agent-native.md +5 -5
- package/docs/content/locales/zh-CN/workspace-connections.md +8 -8
- package/docs/content/locales/zh-CN/workspace-management.md +5 -5
- package/docs/content/locales/zh-CN/workspace.md +23 -23
- package/docs/content/locales/zh-CN/writing-agent-instructions.md +18 -18
- package/package.json +1 -1
- package/src/templates/default/app/i18n/ar-SA.ts +275 -274
- package/src/templates/default/app/i18n/de-DE.ts +270 -260
- package/src/templates/default/app/i18n/es-ES.ts +282 -270
- package/src/templates/default/app/i18n/fr-FR.ts +275 -266
- package/src/templates/default/app/i18n/hi-IN.ts +274 -276
- package/src/templates/default/app/i18n/ja-JP.ts +280 -273
- package/src/templates/default/app/i18n/ko-KR.ts +274 -274
- package/src/templates/default/app/i18n/pt-BR.ts +273 -266
- package/src/templates/default/app/i18n/zh-CN.ts +273 -285
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
setAgentChatContextItem,
|
|
10
10
|
useAgentEngineConfigured,
|
|
11
11
|
useActionQuery,
|
|
12
|
+
useT,
|
|
12
13
|
useSession,
|
|
13
14
|
track,
|
|
14
15
|
emailToColor,
|
|
@@ -279,28 +280,27 @@ function GoogleLogoIcon({ className }: { className?: string }) {
|
|
|
279
280
|
);
|
|
280
281
|
}
|
|
281
282
|
|
|
282
|
-
const SOURCE_OPTIONS: Array<{ value: PlanSource
|
|
283
|
-
{ value: "codex"
|
|
284
|
-
{ value: "claude-code"
|
|
285
|
-
{ value: "cursor"
|
|
286
|
-
{ value: "pi"
|
|
287
|
-
{ value: "manual"
|
|
288
|
-
{ value: "imported"
|
|
283
|
+
const SOURCE_OPTIONS: Array<{ value: PlanSource }> = [
|
|
284
|
+
{ value: "codex" },
|
|
285
|
+
{ value: "claude-code" },
|
|
286
|
+
{ value: "cursor" },
|
|
287
|
+
{ value: "pi" },
|
|
288
|
+
{ value: "manual" },
|
|
289
|
+
{ value: "imported" },
|
|
289
290
|
];
|
|
290
291
|
|
|
291
292
|
const REPORT_REASON_OPTIONS: Array<{
|
|
292
293
|
value: PlanReportReason;
|
|
293
|
-
label: string;
|
|
294
294
|
}> = [
|
|
295
|
-
{ value: "spam"
|
|
296
|
-
{ value: "harassment"
|
|
297
|
-
{ value: "hate"
|
|
298
|
-
{ value: "sexual"
|
|
299
|
-
{ value: "violence"
|
|
300
|
-
{ value: "self-harm"
|
|
301
|
-
{ value: "privacy"
|
|
302
|
-
{ value: "illegal"
|
|
303
|
-
{ value: "other"
|
|
295
|
+
{ value: "spam" },
|
|
296
|
+
{ value: "harassment" },
|
|
297
|
+
{ value: "hate" },
|
|
298
|
+
{ value: "sexual" },
|
|
299
|
+
{ value: "violence" },
|
|
300
|
+
{ value: "self-harm" },
|
|
301
|
+
{ value: "privacy" },
|
|
302
|
+
{ value: "illegal" },
|
|
303
|
+
{ value: "other" },
|
|
304
304
|
];
|
|
305
305
|
|
|
306
306
|
const PLAN_READER_VIEW_EVENT = "plans-reader-view-change";
|
|
@@ -338,21 +338,21 @@ const PREFERRED_EDITOR_VALUES: PreferredEditor[] = [
|
|
|
338
338
|
];
|
|
339
339
|
|
|
340
340
|
const EDITOR_OPTIONS: Array<{ value: PreferredEditor; label: string }> = [
|
|
341
|
-
{ value: "vscode", label: "VS Code" },
|
|
342
|
-
{ value: "cursor", label: "Cursor" },
|
|
343
|
-
{ value: "finder", label: "Finder" },
|
|
344
|
-
{ value: "terminal", label: "Terminal" },
|
|
345
|
-
{ value: "ghostty", label: "Ghostty" },
|
|
346
|
-
{ value: "xcode", label: "Xcode" },
|
|
341
|
+
{ value: "vscode", label: "VS Code" }, // i18n-ignore stable app name
|
|
342
|
+
{ value: "cursor", label: "Cursor" }, // i18n-ignore stable app name
|
|
343
|
+
{ value: "finder", label: "Finder" }, // i18n-ignore stable app name
|
|
344
|
+
{ value: "terminal", label: "Terminal" }, // i18n-ignore stable app name
|
|
345
|
+
{ value: "ghostty", label: "Ghostty" }, // i18n-ignore stable app name
|
|
346
|
+
{ value: "xcode", label: "Xcode" }, // i18n-ignore stable app name
|
|
347
347
|
];
|
|
348
348
|
|
|
349
349
|
const EDITOR_ICON_HTML: Record<PreferredEditor, string> = {
|
|
350
|
-
vscode: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-brand-vscode" aria-hidden="true"><path d="M16 3v18l4 -2.5v-13l-4 -2.5"></path><path d="M9.165 13.903l-4.165 3.597l-2 -1l4.333 -4.5m1.735 -1.802l6.932 -7.198v5l-4.795 4.141"></path><path d="M16 16.5l-11 -10l-2 1l13 13.5"></path></svg>`,
|
|
351
|
-
cursor: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-cube" aria-hidden="true"><path d="M21 16.008v-8.018a1.98 1.98 0 0 0 -1 -1.717l-7 -4.008a2.016 2.016 0 0 0 -2 0l-7 4.008c-.619 .355 -1 1.01 -1 1.718v8.018c0 .709 .381 1.363 1 1.717l7 4.008a2.016 2.016 0 0 0 2 0l7 -4.008c.619 -.355 1 -1.01 1 -1.718"></path><path d="M12 22v-10"></path><path d="M12 12l8.73 -5.04"></path><path d="M3.27 6.96l8.73 5.04"></path></svg>`,
|
|
352
|
-
finder: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-brand-finder" aria-hidden="true"><path d="M3 5a1 1 0 0 1 1 -1h16a1 1 0 0 1 1 1v14a1 1 0 0 1 -1 1h-16a1 1 0 0 1 -1 -1l0 -14"></path><path d="M7 8v1"></path><path d="M17 8v1"></path><path d="M12.5 4c-.654 1.486 -1.26 3.443 -1.5 9h2.5c-.19 2.867 .094 5.024 .5 7"></path><path d="M7 15.5c3.667 2 6.333 2 10 0"></path></svg>`,
|
|
353
|
-
terminal: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-terminal-2" aria-hidden="true"><path d="M8 9l3 3l-3 3"></path><path d="M13 15l3 0"></path><path d="M3 6a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2l0 -12"></path></svg>`,
|
|
354
|
-
ghostty: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-ghost-3" aria-hidden="true"><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7"></path><path d="M10 10h.01"></path><path d="M14 10h.01"></path></svg>`,
|
|
355
|
-
xcode: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-hammer" aria-hidden="true"><path d="M11.414 10l-7.383 7.418a2.091 2.091 0 0 0 0 2.967a2.11 2.11 0 0 0 2.976 0l7.407 -7.385"></path><path d="M18.121 15.293l2.586 -2.586a1 1 0 0 0 0 -1.414l-7.586 -7.586a1 1 0 0 0 -1.414 0l-2.586 2.586a1 1 0 0 0 0 1.414l7.586 7.586a1 1 0 0 0 1.414 0"></path></svg>`,
|
|
350
|
+
vscode: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-brand-vscode" aria-hidden="true"><path d="M16 3v18l4 -2.5v-13l-4 -2.5"></path><path d="M9.165 13.903l-4.165 3.597l-2 -1l4.333 -4.5m1.735 -1.802l6.932 -7.198v5l-4.795 4.141"></path><path d="M16 16.5l-11 -10l-2 1l13 13.5"></path></svg>`, // i18n-ignore inline SVG icon markup
|
|
351
|
+
cursor: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-cube" aria-hidden="true"><path d="M21 16.008v-8.018a1.98 1.98 0 0 0 -1 -1.717l-7 -4.008a2.016 2.016 0 0 0 -2 0l-7 4.008c-.619 .355 -1 1.01 -1 1.718v8.018c0 .709 .381 1.363 1 1.717l7 4.008a2.016 2.016 0 0 0 2 0l7 -4.008c.619 -.355 1 -1.01 1 -1.718"></path><path d="M12 22v-10"></path><path d="M12 12l8.73 -5.04"></path><path d="M3.27 6.96l8.73 5.04"></path></svg>`, // i18n-ignore inline SVG icon markup
|
|
352
|
+
finder: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-brand-finder" aria-hidden="true"><path d="M3 5a1 1 0 0 1 1 -1h16a1 1 0 0 1 1 1v14a1 1 0 0 1 -1 1h-16a1 1 0 0 1 -1 -1l0 -14"></path><path d="M7 8v1"></path><path d="M17 8v1"></path><path d="M12.5 4c-.654 1.486 -1.26 3.443 -1.5 9h2.5c-.19 2.867 .094 5.024 .5 7"></path><path d="M7 15.5c3.667 2 6.333 2 10 0"></path></svg>`, // i18n-ignore inline SVG icon markup
|
|
353
|
+
terminal: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-terminal-2" aria-hidden="true"><path d="M8 9l3 3l-3 3"></path><path d="M13 15l3 0"></path><path d="M3 6a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2l0 -12"></path></svg>`, // i18n-ignore inline SVG icon markup
|
|
354
|
+
ghostty: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-ghost-3" aria-hidden="true"><path d="M5 11a7 7 0 0 1 14 0v7a1.78 1.78 0 0 1 -3.1 1.4a1.65 1.65 0 0 0 -2.6 0a1.65 1.65 0 0 1 -2.6 0a1.65 1.65 0 0 0 -2.6 0a1.78 1.78 0 0 1 -3.1 -1.4v-7"></path><path d="M10 10h.01"></path><path d="M14 10h.01"></path></svg>`, // i18n-ignore inline SVG icon markup
|
|
355
|
+
xcode: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-hammer" aria-hidden="true"><path d="M11.414 10l-7.383 7.418a2.091 2.091 0 0 0 0 2.967a2.11 2.11 0 0 0 2.976 0l7.407 -7.385"></path><path d="M18.121 15.293l2.586 -2.586a1 1 0 0 0 0 -1.414l-7.586 -7.586a1 1 0 0 0 -1.414 0l-2.586 2.586a1 1 0 0 0 0 1.414l7.586 7.586a1 1 0 0 0 1.414 0"></path></svg>`, // i18n-ignore inline SVG icon markup
|
|
356
356
|
};
|
|
357
357
|
|
|
358
358
|
function readPreferredEditor(): PreferredEditor {
|
|
@@ -656,8 +656,8 @@ export function resolvePlanOrgAccessPrompt(input: {
|
|
|
656
656
|
organizationName: orgName,
|
|
657
657
|
invitationId: pendingInvitation.id,
|
|
658
658
|
invitedBy: pendingInvitation.invitedBy,
|
|
659
|
-
buttonLabel: "
|
|
660
|
-
message:
|
|
659
|
+
buttonLabel: "",
|
|
660
|
+
message: "",
|
|
661
661
|
};
|
|
662
662
|
}
|
|
663
663
|
|
|
@@ -671,10 +671,8 @@ export function resolvePlanOrgAccessPrompt(input: {
|
|
|
671
671
|
organizationId: orgId,
|
|
672
672
|
organizationName: orgName,
|
|
673
673
|
domain,
|
|
674
|
-
buttonLabel:
|
|
675
|
-
message:
|
|
676
|
-
? `Your @${domain} email can join ${orgName}. Join it to open this plan.`
|
|
677
|
-
: `You can join ${orgName} to open this plan.`,
|
|
674
|
+
buttonLabel: "",
|
|
675
|
+
message: "",
|
|
678
676
|
};
|
|
679
677
|
}
|
|
680
678
|
|
|
@@ -827,7 +825,7 @@ async function fetchLocalPlanBridgeBundle(
|
|
|
827
825
|
const slug = payload.slug || fallbackSlug || "local-plan";
|
|
828
826
|
const kind = payload.kind === "recap" ? "recap" : "plan";
|
|
829
827
|
const title = content.title || payload.title || slug;
|
|
830
|
-
const brief = content.brief || payload.brief || "
|
|
828
|
+
const brief = content.brief || payload.brief || "";
|
|
831
829
|
const url = localPlanRouteUrl(slug);
|
|
832
830
|
const bundle: LocalPlanBundle = {
|
|
833
831
|
plan: {
|
|
@@ -985,8 +983,10 @@ function commentDescendantCount(
|
|
|
985
983
|
return count;
|
|
986
984
|
}
|
|
987
985
|
|
|
988
|
-
function deleteCommentLabel(replyCount: number) {
|
|
989
|
-
return replyCount > 0
|
|
986
|
+
function deleteCommentLabel(replyCount: number, t: ReturnType<typeof useT>) {
|
|
987
|
+
return replyCount > 0
|
|
988
|
+
? t("plansPage.comments.deleteThread")
|
|
989
|
+
: t("plansPage.comments.deleteComment");
|
|
990
990
|
}
|
|
991
991
|
|
|
992
992
|
export function shouldKeepCommentPopoverOpenForTarget(
|
|
@@ -1057,9 +1057,9 @@ function commentAuthorName(
|
|
|
1057
1057
|
if (explicitName) return explicitName;
|
|
1058
1058
|
const email = normalizeCommentEmail(source.authorEmail);
|
|
1059
1059
|
if (email) return emailToName(email);
|
|
1060
|
-
if (source.createdBy === "agent") return "Agent";
|
|
1061
|
-
if (source.createdBy === "import") return "Imported";
|
|
1062
|
-
return "Reviewer";
|
|
1060
|
+
if (source.createdBy === "agent") return "Agent"; // i18n-key-ignore stable actor id fallback
|
|
1061
|
+
if (source.createdBy === "import") return "Imported"; // i18n-key-ignore stable import actor fallback
|
|
1062
|
+
return "Reviewer"; // i18n-key-ignore stable anonymous reviewer fallback
|
|
1063
1063
|
}
|
|
1064
1064
|
|
|
1065
1065
|
function commentAuthorInitials(name: string) {
|
|
@@ -2699,15 +2699,6 @@ const APPROVAL_STATUSES: PlanStatus[] = [
|
|
|
2699
2699
|
"complete",
|
|
2700
2700
|
];
|
|
2701
2701
|
|
|
2702
|
-
const STATUS_LABELS: Record<PlanStatus, string> = {
|
|
2703
|
-
draft: "Draft",
|
|
2704
|
-
review: "In review",
|
|
2705
|
-
approved: "Approved",
|
|
2706
|
-
in_progress: "In progress",
|
|
2707
|
-
complete: "Complete",
|
|
2708
|
-
archived: "Archived",
|
|
2709
|
-
};
|
|
2710
|
-
|
|
2711
2702
|
function statusBadgeClasses(status: PlanStatus): string {
|
|
2712
2703
|
if (status === "approved") {
|
|
2713
2704
|
return "border-emerald-500/40 bg-emerald-500/10 text-emerald-700 dark:text-emerald-400";
|
|
@@ -2739,6 +2730,7 @@ function PlanStatusControl({
|
|
|
2739
2730
|
status: PlanStatus;
|
|
2740
2731
|
canEdit: boolean;
|
|
2741
2732
|
}) {
|
|
2733
|
+
const t = useT();
|
|
2742
2734
|
const qc = useQueryClient();
|
|
2743
2735
|
const updateStatus = useUpdatePlanStatus();
|
|
2744
2736
|
|
|
@@ -2773,12 +2765,12 @@ function PlanStatusControl({
|
|
|
2773
2765
|
qc.setQueryData(ACTIVE_PLANS_QUERY_KEY, prevActiveList);
|
|
2774
2766
|
if (prevAllList !== undefined)
|
|
2775
2767
|
qc.setQueryData(ALL_PLANS_QUERY_KEY, prevAllList);
|
|
2776
|
-
toast.error("
|
|
2768
|
+
toast.error(t("plansPage.status.updateFailed"));
|
|
2777
2769
|
},
|
|
2778
2770
|
},
|
|
2779
2771
|
);
|
|
2780
2772
|
},
|
|
2781
|
-
[planId, qc, status, updateStatus],
|
|
2773
|
+
[planId, qc, status, t, updateStatus],
|
|
2782
2774
|
);
|
|
2783
2775
|
|
|
2784
2776
|
const badgeClassName = cn(
|
|
@@ -2791,7 +2783,7 @@ function PlanStatusControl({
|
|
|
2791
2783
|
{status === "approved" && (
|
|
2792
2784
|
<IconCircleCheck className="size-3.5 shrink-0" />
|
|
2793
2785
|
)}
|
|
2794
|
-
{
|
|
2786
|
+
{t(`plansPage.status.labels.${status}`)}
|
|
2795
2787
|
{canEdit && <IconChevronDown className="size-3 shrink-0 opacity-60" />}
|
|
2796
2788
|
</>
|
|
2797
2789
|
);
|
|
@@ -2805,14 +2797,14 @@ function PlanStatusControl({
|
|
|
2805
2797
|
<DropdownMenuTrigger asChild>
|
|
2806
2798
|
<button
|
|
2807
2799
|
type="button"
|
|
2808
|
-
aria-label="
|
|
2800
|
+
aria-label={t("plansPage.status.setPlanStatus")}
|
|
2809
2801
|
className={badgeClassName}
|
|
2810
2802
|
>
|
|
2811
2803
|
{badgeInner}
|
|
2812
2804
|
</button>
|
|
2813
2805
|
</DropdownMenuTrigger>
|
|
2814
2806
|
<DropdownMenuContent align="end" className="w-44 rounded-xl">
|
|
2815
|
-
<DropdownMenuLabel>
|
|
2807
|
+
<DropdownMenuLabel>{t("plansPage.status.setStatus")}</DropdownMenuLabel>
|
|
2816
2808
|
<DropdownMenuGroup>
|
|
2817
2809
|
{APPROVAL_STATUSES.map((s) => (
|
|
2818
2810
|
<DropdownMenuItem
|
|
@@ -2825,7 +2817,7 @@ function PlanStatusControl({
|
|
|
2825
2817
|
) : (
|
|
2826
2818
|
<span className="size-4" />
|
|
2827
2819
|
)}
|
|
2828
|
-
{
|
|
2820
|
+
{t(`plansPage.status.labels.${s}`)}
|
|
2829
2821
|
</DropdownMenuItem>
|
|
2830
2822
|
))}
|
|
2831
2823
|
</DropdownMenuGroup>
|
|
@@ -2835,6 +2827,7 @@ function PlanStatusControl({
|
|
|
2835
2827
|
}
|
|
2836
2828
|
|
|
2837
2829
|
function LocalModeBadge() {
|
|
2830
|
+
const t = useT();
|
|
2838
2831
|
return (
|
|
2839
2832
|
<Tooltip>
|
|
2840
2833
|
<TooltipTrigger asChild>
|
|
@@ -2843,22 +2836,23 @@ function LocalModeBadge() {
|
|
|
2843
2836
|
target="_blank"
|
|
2844
2837
|
rel="noreferrer"
|
|
2845
2838
|
className="pointer-events-auto inline-flex h-8 items-center gap-1.5 rounded-md border border-emerald-500/35 bg-emerald-500/10 px-2.5 text-xs font-medium text-emerald-700 outline-none transition-colors hover:bg-emerald-500/15 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 dark:text-emerald-300"
|
|
2846
|
-
aria-label="
|
|
2839
|
+
aria-label={t("plansPage.localMode.privacyDetails")}
|
|
2847
2840
|
>
|
|
2848
2841
|
<span className="size-1.5 rounded-full bg-emerald-500" />
|
|
2849
|
-
<span>
|
|
2842
|
+
<span>{t("plansPage.localMode.badge")}</span>
|
|
2850
2843
|
<IconHelpCircle className="size-3.5 opacity-75" />
|
|
2851
2844
|
</a>
|
|
2852
2845
|
</TooltipTrigger>
|
|
2853
2846
|
<TooltipContent align="end" side="bottom" className="max-w-xs p-3">
|
|
2854
2847
|
<div className="grid gap-1.5">
|
|
2855
|
-
<p className="font-medium leading-5">
|
|
2848
|
+
<p className="font-medium leading-5">
|
|
2849
|
+
{t("plansPage.localMode.title")}
|
|
2850
|
+
</p>
|
|
2856
2851
|
<p className="text-xs leading-5 text-muted-foreground">
|
|
2857
|
-
|
|
2858
|
-
only renders and edits your local MDX files.
|
|
2852
|
+
{t("plansPage.localMode.description")}
|
|
2859
2853
|
</p>
|
|
2860
2854
|
<p className="text-xs font-medium leading-5 text-foreground">
|
|
2861
|
-
|
|
2855
|
+
{t("plansPage.localMode.openDocs")}
|
|
2862
2856
|
</p>
|
|
2863
2857
|
</div>
|
|
2864
2858
|
</TooltipContent>
|
|
@@ -2871,6 +2865,7 @@ export function canEditPlanContentRole(role?: PlanAccessRole | null) {
|
|
|
2871
2865
|
}
|
|
2872
2866
|
|
|
2873
2867
|
export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
2868
|
+
const t = useT();
|
|
2874
2869
|
const params = useParams<{ id?: string }>();
|
|
2875
2870
|
const navigate = useNavigate();
|
|
2876
2871
|
const location = useLocation();
|
|
@@ -3470,13 +3465,15 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
3470
3465
|
if (prevAll !== undefined)
|
|
3471
3466
|
queryClient.setQueryData(ALL_PLANS_QUERY_KEY, prevAll);
|
|
3472
3467
|
toast.error(
|
|
3473
|
-
archive
|
|
3468
|
+
archive
|
|
3469
|
+
? t("plansPage.reader.archiveFailed")
|
|
3470
|
+
: t("plansPage.reader.unarchiveFailed"),
|
|
3474
3471
|
);
|
|
3475
3472
|
},
|
|
3476
3473
|
},
|
|
3477
3474
|
);
|
|
3478
3475
|
},
|
|
3479
|
-
[queryClient, updatePlan],
|
|
3476
|
+
[queryClient, t, updatePlan],
|
|
3480
3477
|
);
|
|
3481
3478
|
|
|
3482
3479
|
const updatePlanListCaches = useCallback(
|
|
@@ -3519,7 +3516,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
3519
3516
|
),
|
|
3520
3517
|
);
|
|
3521
3518
|
toast.success(
|
|
3522
|
-
|
|
3519
|
+
target.kind === "recap"
|
|
3520
|
+
? t("plansPage.reader.recapMovedToDeleted")
|
|
3521
|
+
: t("plansPage.reader.planMovedToDeleted"),
|
|
3523
3522
|
);
|
|
3524
3523
|
if (selectedId === target.id) navigate("/plans");
|
|
3525
3524
|
} else if (result.mode === "restore") {
|
|
@@ -3531,7 +3530,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
3531
3530
|
),
|
|
3532
3531
|
);
|
|
3533
3532
|
toast.success(
|
|
3534
|
-
|
|
3533
|
+
target.kind === "recap"
|
|
3534
|
+
? t("plansPage.reader.recapRestored")
|
|
3535
|
+
: t("plansPage.reader.planRestored"),
|
|
3535
3536
|
);
|
|
3536
3537
|
} else {
|
|
3537
3538
|
updatePlanListCaches((items) =>
|
|
@@ -3541,7 +3542,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
3541
3542
|
queryKey: planBundleQueryKey(target.id),
|
|
3542
3543
|
});
|
|
3543
3544
|
toast.success(
|
|
3544
|
-
|
|
3545
|
+
target.kind === "recap"
|
|
3546
|
+
? t("plansPage.reader.recapPermanentlyDeleted")
|
|
3547
|
+
: t("plansPage.reader.planPermanentlyDeleted"),
|
|
3545
3548
|
);
|
|
3546
3549
|
if (selectedId === target.id) navigate("/plans");
|
|
3547
3550
|
}
|
|
@@ -3556,6 +3559,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
3556
3559
|
navigate,
|
|
3557
3560
|
queryClient,
|
|
3558
3561
|
selectedId,
|
|
3562
|
+
t,
|
|
3559
3563
|
updatePlanListCaches,
|
|
3560
3564
|
],
|
|
3561
3565
|
);
|
|
@@ -3586,14 +3590,12 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
3586
3590
|
},
|
|
3587
3591
|
{
|
|
3588
3592
|
onError: () => {
|
|
3589
|
-
toast.error(
|
|
3590
|
-
"Could not save answers — they were sent to the agent chat only.",
|
|
3591
|
-
);
|
|
3593
|
+
toast.error(t("plansPage.reader.saveAnswersFailed"));
|
|
3592
3594
|
},
|
|
3593
3595
|
},
|
|
3594
3596
|
);
|
|
3595
3597
|
},
|
|
3596
|
-
[collabUser?.email, collabUser?.name],
|
|
3598
|
+
[collabUser?.email, collabUser?.name, t],
|
|
3597
3599
|
);
|
|
3598
3600
|
|
|
3599
3601
|
const exportPlan = useExportPlan(localPlanMode ? undefined : selectedId);
|
|
@@ -3685,7 +3687,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
3685
3687
|
size="sm"
|
|
3686
3688
|
onClick={() => openSignIn()}
|
|
3687
3689
|
>
|
|
3688
|
-
|
|
3690
|
+
{t("plansPage.loadError.signIn")}
|
|
3689
3691
|
</Button>
|
|
3690
3692
|
) : null,
|
|
3691
3693
|
);
|
|
@@ -3741,8 +3743,14 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
3741
3743
|
|
|
3742
3744
|
const documentHtml = useMemo(() => {
|
|
3743
3745
|
if (!bundle) return "";
|
|
3744
|
-
return
|
|
3745
|
-
|
|
3746
|
+
return (
|
|
3747
|
+
bundle.html ||
|
|
3748
|
+
bundle.plan.html ||
|
|
3749
|
+
buildClientPlanHtml(bundle, {
|
|
3750
|
+
workingPlan: t("plansPage.reader.clientHtmlWorkingPlan"),
|
|
3751
|
+
})
|
|
3752
|
+
);
|
|
3753
|
+
}, [bundle, t]);
|
|
3746
3754
|
|
|
3747
3755
|
const annotatedDocumentHtml = useMemo(() => {
|
|
3748
3756
|
if (!bundle) return "";
|
|
@@ -3753,6 +3761,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
3753
3761
|
false,
|
|
3754
3762
|
defaults.planTheme,
|
|
3755
3763
|
defaults.preferredEditor,
|
|
3764
|
+
{
|
|
3765
|
+
closeCodePreview: t("plansPage.reader.runtimeCloseCodePreview"),
|
|
3766
|
+
},
|
|
3756
3767
|
commentAvatarUrls,
|
|
3757
3768
|
currentCommentAuthor,
|
|
3758
3769
|
);
|
|
@@ -3761,6 +3772,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
3761
3772
|
commentAvatarUrls,
|
|
3762
3773
|
currentCommentAuthor,
|
|
3763
3774
|
documentHtml,
|
|
3775
|
+
t,
|
|
3764
3776
|
visiblePlanComments,
|
|
3765
3777
|
]);
|
|
3766
3778
|
|
|
@@ -4132,7 +4144,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4132
4144
|
/^file:\/\//i.test(data.href)
|
|
4133
4145
|
) {
|
|
4134
4146
|
window.location.href = data.href;
|
|
4135
|
-
toast.info("
|
|
4147
|
+
toast.info(t("plansPage.reader.openingFile"));
|
|
4136
4148
|
}
|
|
4137
4149
|
}
|
|
4138
4150
|
if (data?.type === "agent-native-plan-editor-preference") {
|
|
@@ -4145,7 +4157,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4145
4157
|
window.localStorage.setItem(PREFERRED_EDITOR_STORAGE_KEY, editor);
|
|
4146
4158
|
}
|
|
4147
4159
|
if (data?.type === "agent-native-plan-link-blocked") {
|
|
4148
|
-
toast.info("
|
|
4160
|
+
toast.info(t("plansPage.reader.linksDisabled"));
|
|
4149
4161
|
}
|
|
4150
4162
|
if (data?.type === "agent-native-plan-doc-state" && data.state) {
|
|
4151
4163
|
documentStateRef.current = data.state;
|
|
@@ -4160,7 +4172,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4160
4172
|
typeof data.summary === "string"
|
|
4161
4173
|
) {
|
|
4162
4174
|
void navigator.clipboard.writeText(data.summary).then(() => {
|
|
4163
|
-
toast.success("
|
|
4175
|
+
toast.success(t("plansPage.reader.visualPromptCopied"));
|
|
4164
4176
|
});
|
|
4165
4177
|
}
|
|
4166
4178
|
if (
|
|
@@ -4174,7 +4186,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4174
4186
|
message: buildQuestionFormRevisionMessage(data.summary),
|
|
4175
4187
|
});
|
|
4176
4188
|
persistQuestionFormAnswers(data.summary, bundle?.plan.id);
|
|
4177
|
-
toast.success("
|
|
4189
|
+
toast.success(t("plansPage.reader.sentAnswers"));
|
|
4178
4190
|
}
|
|
4179
4191
|
};
|
|
4180
4192
|
window.addEventListener("message", onMessage);
|
|
@@ -4196,12 +4208,16 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4196
4208
|
const copyPlanLink = async () => {
|
|
4197
4209
|
if (!planShareUrl) return;
|
|
4198
4210
|
await navigator.clipboard.writeText(planShareUrl);
|
|
4199
|
-
toast.success(
|
|
4211
|
+
toast.success(
|
|
4212
|
+
isRecap
|
|
4213
|
+
? t("plansPage.reader.recapLinkCopied")
|
|
4214
|
+
: t("plansPage.reader.planLinkCopied"),
|
|
4215
|
+
);
|
|
4200
4216
|
};
|
|
4201
4217
|
|
|
4202
4218
|
const copyLocalPlanFolder = async () => {
|
|
4203
4219
|
await navigator.clipboard.writeText(localPlanDisplayFolder);
|
|
4204
|
-
toast.success("
|
|
4220
|
+
toast.success(t("plansPage.reader.localPathCopied"));
|
|
4205
4221
|
};
|
|
4206
4222
|
|
|
4207
4223
|
const openPromoteLocalPlanDialog = () => {
|
|
@@ -4217,7 +4233,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4217
4233
|
if (!localPlanSlug || localPlanBridgeUrl) return;
|
|
4218
4234
|
const targetPath = promoteLocalPlanTargetPath.trim();
|
|
4219
4235
|
if (!targetPath) {
|
|
4220
|
-
toast.error("
|
|
4236
|
+
toast.error(t("plansPage.reader.enterRepoFolder"));
|
|
4221
4237
|
return;
|
|
4222
4238
|
}
|
|
4223
4239
|
|
|
@@ -4230,10 +4246,11 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4230
4246
|
setPromoteLocalPlanOpen(false);
|
|
4231
4247
|
toast.success(
|
|
4232
4248
|
result.alreadyPromoted
|
|
4233
|
-
? "
|
|
4234
|
-
:
|
|
4235
|
-
result.
|
|
4236
|
-
|
|
4249
|
+
? t("plansPage.reader.localPlanAlreadySaved")
|
|
4250
|
+
: t("plansPage.reader.savedLocalFiles", {
|
|
4251
|
+
count: result.localFiles?.files.length ?? 0,
|
|
4252
|
+
path: result.targetPath ?? targetPath,
|
|
4253
|
+
}),
|
|
4237
4254
|
);
|
|
4238
4255
|
navigate(localPlanRoutePath(result.slug, result.repoPath ?? targetPath));
|
|
4239
4256
|
};
|
|
@@ -4263,7 +4280,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4263
4280
|
if (localPlanMode) {
|
|
4264
4281
|
const localBundle = bundle as LocalPlanBundle | undefined;
|
|
4265
4282
|
if (!localBundle) {
|
|
4266
|
-
throw new Error("
|
|
4283
|
+
throw new Error(t("plansPage.reader.localSourceUnavailable"));
|
|
4267
4284
|
}
|
|
4268
4285
|
const mdx =
|
|
4269
4286
|
localBundle.mdx ??
|
|
@@ -4271,7 +4288,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4271
4288
|
? { "plan.mdx": localBundle.plan.markdown }
|
|
4272
4289
|
: undefined);
|
|
4273
4290
|
if (!mdx?.["plan.mdx"]) {
|
|
4274
|
-
throw new Error("
|
|
4291
|
+
throw new Error(t("plansPage.reader.localSourceFilesUnavailable"));
|
|
4275
4292
|
}
|
|
4276
4293
|
return {
|
|
4277
4294
|
markdown: localBundle.plan.markdown ?? mdx["plan.mdx"],
|
|
@@ -4293,7 +4310,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4293
4310
|
const result = await exportPlan.refetch();
|
|
4294
4311
|
const data = result.data ?? exportPlan.data;
|
|
4295
4312
|
if (!data) {
|
|
4296
|
-
throw new Error("
|
|
4313
|
+
throw new Error(t("plansPage.reader.exportUnavailable"));
|
|
4297
4314
|
}
|
|
4298
4315
|
return data;
|
|
4299
4316
|
}, [
|
|
@@ -4311,7 +4328,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4311
4328
|
const plan = bundle?.plan;
|
|
4312
4329
|
const planFiles = getDesktopPlanFiles();
|
|
4313
4330
|
if (!plan || !planFiles) {
|
|
4314
|
-
throw new Error("
|
|
4331
|
+
throw new Error(t("plansPage.reader.desktopSyncUnavailable"));
|
|
4315
4332
|
}
|
|
4316
4333
|
|
|
4317
4334
|
setDesktopPlanSyncing(true);
|
|
@@ -4339,7 +4356,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4339
4356
|
|
|
4340
4357
|
const data = await readPlanExport();
|
|
4341
4358
|
if (!data.mdx || !data.mdx["plan.mdx"]) {
|
|
4342
|
-
throw new Error("
|
|
4359
|
+
throw new Error(t("plansPage.reader.sourceFilesUnavailable"));
|
|
4343
4360
|
}
|
|
4344
4361
|
const written = await planFiles.writePlan({
|
|
4345
4362
|
planId: plan.id,
|
|
@@ -4357,7 +4374,11 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4357
4374
|
}
|
|
4358
4375
|
desktopAutoSyncedVersionRef.current[plan.id] = plan.updatedAt;
|
|
4359
4376
|
if (!options.quiet) {
|
|
4360
|
-
toast.success(
|
|
4377
|
+
toast.success(
|
|
4378
|
+
t("plansPage.reader.syncedLocalFiles", {
|
|
4379
|
+
count: written.files?.length ?? 0,
|
|
4380
|
+
}),
|
|
4381
|
+
);
|
|
4361
4382
|
}
|
|
4362
4383
|
return written.folder;
|
|
4363
4384
|
} finally {
|
|
@@ -4371,14 +4392,14 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4371
4392
|
const plan = bundle?.plan;
|
|
4372
4393
|
const planFiles = getDesktopPlanFiles();
|
|
4373
4394
|
if (!plan || !planFiles) {
|
|
4374
|
-
throw new Error("
|
|
4395
|
+
throw new Error(t("plansPage.reader.desktopSyncUnavailable"));
|
|
4375
4396
|
}
|
|
4376
4397
|
|
|
4377
4398
|
setDesktopPlanImporting(true);
|
|
4378
4399
|
try {
|
|
4379
4400
|
const result = await planFiles.readPlan({ planId: plan.id });
|
|
4380
4401
|
if (result.ok === false) throw new Error(result.error);
|
|
4381
|
-
if (!result.mdx) throw new Error("
|
|
4402
|
+
if (!result.mdx) throw new Error(t("plansPage.reader.noSourceFiles"));
|
|
4382
4403
|
const synced = await syncLocalControlResources({
|
|
4383
4404
|
folderName: result.folder.name,
|
|
4384
4405
|
files: result.controlResources,
|
|
@@ -4393,7 +4414,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4393
4414
|
currentFocus: "desktop local files sync",
|
|
4394
4415
|
});
|
|
4395
4416
|
setDesktopPlanFolder(result.folder);
|
|
4396
|
-
toast.success("
|
|
4417
|
+
toast.success(t("plansPage.reader.importedLocalSource"));
|
|
4397
4418
|
const updatedAt = imported.plan?.updatedAt;
|
|
4398
4419
|
if (updatedAt) {
|
|
4399
4420
|
desktopAutoSyncedVersionRef.current[plan.id] = updatedAt;
|
|
@@ -4416,7 +4437,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4416
4437
|
toast.error(
|
|
4417
4438
|
error instanceof Error
|
|
4418
4439
|
? error.message
|
|
4419
|
-
: "
|
|
4440
|
+
: t("plansPage.reader.enableLocalSyncFailed"),
|
|
4420
4441
|
);
|
|
4421
4442
|
},
|
|
4422
4443
|
);
|
|
@@ -4440,7 +4461,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4440
4461
|
toast.error(
|
|
4441
4462
|
error instanceof Error
|
|
4442
4463
|
? error.message
|
|
4443
|
-
: "
|
|
4464
|
+
: t("plansPage.reader.syncLocalFailed"),
|
|
4444
4465
|
);
|
|
4445
4466
|
});
|
|
4446
4467
|
}, [
|
|
@@ -4453,13 +4474,13 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4453
4474
|
const copyPlanHtml = async () => {
|
|
4454
4475
|
const data = await readPlanExport();
|
|
4455
4476
|
await navigator.clipboard.writeText(data.html);
|
|
4456
|
-
toast.success("
|
|
4477
|
+
toast.success(t("plansPage.reader.planHtmlCopied"));
|
|
4457
4478
|
};
|
|
4458
4479
|
|
|
4459
4480
|
const copyPlanMarkdown = async () => {
|
|
4460
4481
|
const data = await readPlanExport();
|
|
4461
4482
|
await navigator.clipboard.writeText(data.markdown);
|
|
4462
|
-
toast.success("
|
|
4483
|
+
toast.success(t("plansPage.reader.planMarkdownCopied"));
|
|
4463
4484
|
};
|
|
4464
4485
|
|
|
4465
4486
|
const downloadPlanHtml = async () => {
|
|
@@ -4480,7 +4501,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4480
4501
|
const data = await readPlanExport();
|
|
4481
4502
|
const files = data.mdx;
|
|
4482
4503
|
if (!files || Object.keys(files).length === 0) {
|
|
4483
|
-
throw new Error("
|
|
4504
|
+
throw new Error(t("plansPage.reader.sourceFilesUnavailable"));
|
|
4484
4505
|
}
|
|
4485
4506
|
const { default: JSZip } = await import("jszip");
|
|
4486
4507
|
const zip = new JSZip();
|
|
@@ -4495,7 +4516,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4495
4516
|
}
|
|
4496
4517
|
const blob = await zip.generateAsync({ type: "blob" });
|
|
4497
4518
|
downloadBlob(planExportFilename(bundle?.plan.title, "zip"), blob);
|
|
4498
|
-
toast.success("
|
|
4519
|
+
toast.success(t("plansPage.reader.planSourceDownloaded"));
|
|
4499
4520
|
};
|
|
4500
4521
|
|
|
4501
4522
|
const runPlanExportAction = (action: () => Promise<void>) => {
|
|
@@ -4504,7 +4525,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
4504
4525
|
toast.error(
|
|
4505
4526
|
error instanceof Error
|
|
4506
4527
|
? error.message
|
|
4507
|
-
: "
|
|
4528
|
+
: t("plansPage.reader.exportUnavailable"),
|
|
4508
4529
|
);
|
|
4509
4530
|
});
|
|
4510
4531
|
});
|
|
@@ -5099,8 +5120,8 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5099
5120
|
});
|
|
5100
5121
|
toast.success(
|
|
5101
5122
|
capture.images.length > 0
|
|
5102
|
-
? "
|
|
5103
|
-
: "
|
|
5123
|
+
? t("plansPage.reader.sentCommentsWithScreenshots")
|
|
5124
|
+
: t("plansPage.reader.sentComments"),
|
|
5104
5125
|
);
|
|
5105
5126
|
} finally {
|
|
5106
5127
|
setSendingFeedback(false);
|
|
@@ -5119,7 +5140,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5119
5140
|
"\n",
|
|
5120
5141
|
),
|
|
5121
5142
|
);
|
|
5122
|
-
toast.success("
|
|
5143
|
+
toast.success(t("plansPage.reader.feedbackCopied"));
|
|
5123
5144
|
};
|
|
5124
5145
|
|
|
5125
5146
|
// Route comment writes to the DB (hosted) or comments.json (local); both
|
|
@@ -5291,7 +5312,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5291
5312
|
)
|
|
5292
5313
|
.then(() => {
|
|
5293
5314
|
setActiveAnnotation(null);
|
|
5294
|
-
toast.success("
|
|
5315
|
+
toast.success(t("plansPage.comments.commentUpdated"));
|
|
5295
5316
|
})
|
|
5296
5317
|
.catch(() => {
|
|
5297
5318
|
// The mutation hook surfaces the failure toast; just clear pending.
|
|
@@ -5366,7 +5387,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5366
5387
|
if (selectedPlanQueryKey) {
|
|
5367
5388
|
queryClient.setQueryData(selectedPlanQueryKey, updated);
|
|
5368
5389
|
}
|
|
5369
|
-
toast.success("
|
|
5390
|
+
toast.success(t("plansPage.comments.replyAdded"));
|
|
5370
5391
|
} catch {
|
|
5371
5392
|
// Roll back the optimistic reply on error.
|
|
5372
5393
|
queryClient.setQueryData(
|
|
@@ -5433,7 +5454,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5433
5454
|
)
|
|
5434
5455
|
.then(() => {
|
|
5435
5456
|
toast.success(
|
|
5436
|
-
status === "resolved"
|
|
5457
|
+
status === "resolved"
|
|
5458
|
+
? t("plansPage.comments.commentResolved")
|
|
5459
|
+
: t("plansPage.comments.commentReopened"),
|
|
5437
5460
|
);
|
|
5438
5461
|
})
|
|
5439
5462
|
.catch(() => {
|
|
@@ -5484,7 +5507,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5484
5507
|
setDeleteCommentRequest(null);
|
|
5485
5508
|
try {
|
|
5486
5509
|
await removeCommentById(commentId);
|
|
5487
|
-
toast.success("
|
|
5510
|
+
toast.success(t("plansPage.comments.commentDeleted"));
|
|
5488
5511
|
} catch (error) {
|
|
5489
5512
|
if (prevBundle !== undefined) {
|
|
5490
5513
|
queryClient.setQueryData(selectedPlanQueryKey, prevBundle);
|
|
@@ -5617,12 +5640,14 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5617
5640
|
window.location.href = appPath("/plans");
|
|
5618
5641
|
}
|
|
5619
5642
|
}}
|
|
5620
|
-
aria-label="
|
|
5643
|
+
aria-label={t("plansPage.reader.backToPlans")}
|
|
5621
5644
|
>
|
|
5622
5645
|
<IconArrowLeft className="size-4" />
|
|
5623
5646
|
</Button>
|
|
5624
5647
|
</TooltipTrigger>
|
|
5625
|
-
<TooltipContent>
|
|
5648
|
+
<TooltipContent>
|
|
5649
|
+
{t("plansPage.reader.backToPlans")}
|
|
5650
|
+
</TooltipContent>
|
|
5626
5651
|
</Tooltip>
|
|
5627
5652
|
</div>
|
|
5628
5653
|
)}
|
|
@@ -5685,8 +5710,8 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5685
5710
|
}
|
|
5686
5711
|
aria-label={
|
|
5687
5712
|
prototypeOnly
|
|
5688
|
-
? "
|
|
5689
|
-
: "
|
|
5713
|
+
? t("plansPage.reader.openFullPlan")
|
|
5714
|
+
: t("plansPage.reader.openPrototypeWindow")
|
|
5690
5715
|
}
|
|
5691
5716
|
>
|
|
5692
5717
|
<IconExternalLink className="size-4" />
|
|
@@ -5694,8 +5719,8 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5694
5719
|
</TooltipTrigger>
|
|
5695
5720
|
<TooltipContent>
|
|
5696
5721
|
{prototypeOnly
|
|
5697
|
-
? "
|
|
5698
|
-
: "
|
|
5722
|
+
? t("plansPage.reader.openFullPlan")
|
|
5723
|
+
: t("plansPage.reader.openPrototypeWindow")}
|
|
5699
5724
|
</TooltipContent>
|
|
5700
5725
|
</Tooltip>
|
|
5701
5726
|
)}
|
|
@@ -5709,7 +5734,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5709
5734
|
className="pointer-events-auto gap-1.5"
|
|
5710
5735
|
disabled={sendingFeedback}
|
|
5711
5736
|
>
|
|
5712
|
-
{sendingFeedback
|
|
5737
|
+
{sendingFeedback
|
|
5738
|
+
? t("plansPage.reader.sending")
|
|
5739
|
+
: t("plansPage.reader.sendToAgent")}
|
|
5713
5740
|
<span className="flex size-4 items-center justify-center rounded-full bg-background/20 text-[10px] font-medium">
|
|
5714
5741
|
{bundle.summary.openCommentCount}
|
|
5715
5742
|
</span>
|
|
@@ -5720,7 +5747,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5720
5747
|
align="end"
|
|
5721
5748
|
className="w-64 rounded-xl"
|
|
5722
5749
|
>
|
|
5723
|
-
<DropdownMenuLabel>
|
|
5750
|
+
<DropdownMenuLabel>
|
|
5751
|
+
{t("plansPage.reader.sendFeedback")}
|
|
5752
|
+
</DropdownMenuLabel>
|
|
5724
5753
|
<DropdownMenuGroup>
|
|
5725
5754
|
<DropdownMenuItem
|
|
5726
5755
|
onClick={() =>
|
|
@@ -5732,9 +5761,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5732
5761
|
>
|
|
5733
5762
|
<IconClipboardText className="mt-0.5 size-4" />
|
|
5734
5763
|
<span className="grid gap-0.5">
|
|
5735
|
-
<span>
|
|
5764
|
+
<span>{t("plansPage.reader.copyForAgent")}</span>
|
|
5736
5765
|
<span className="text-xs font-normal leading-4 text-muted-foreground">
|
|
5737
|
-
|
|
5766
|
+
{t("plansPage.reader.copyForAgentDescription")}
|
|
5738
5767
|
</span>
|
|
5739
5768
|
</span>
|
|
5740
5769
|
</DropdownMenuItem>
|
|
@@ -5749,9 +5778,13 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5749
5778
|
>
|
|
5750
5779
|
<IconSend className="mt-0.5 size-4" />
|
|
5751
5780
|
<span className="grid gap-0.5">
|
|
5752
|
-
<span>
|
|
5781
|
+
<span>
|
|
5782
|
+
{t("plansPage.reader.sendToInlineAgent")}
|
|
5783
|
+
</span>
|
|
5753
5784
|
<span className="text-xs font-normal leading-4 text-muted-foreground">
|
|
5754
|
-
|
|
5785
|
+
{t(
|
|
5786
|
+
"plansPage.reader.sendToInlineAgentDescription",
|
|
5787
|
+
)}
|
|
5755
5788
|
</span>
|
|
5756
5789
|
</span>
|
|
5757
5790
|
</DropdownMenuItem>
|
|
@@ -5773,7 +5806,8 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5773
5806
|
variant="ghost"
|
|
5774
5807
|
size="icon"
|
|
5775
5808
|
className="pointer-events-auto size-8"
|
|
5776
|
-
|
|
5809
|
+
data-plan-actions-trigger
|
|
5810
|
+
aria-label={t("plansPage.overview.planActions")}
|
|
5777
5811
|
>
|
|
5778
5812
|
<IconDotsVertical className="size-4" />
|
|
5779
5813
|
</Button>
|
|
@@ -5782,7 +5816,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5782
5816
|
{localPlanMode && (
|
|
5783
5817
|
<>
|
|
5784
5818
|
<DropdownMenuLabel className="text-xs font-medium text-muted-foreground">
|
|
5785
|
-
|
|
5819
|
+
{t("plansPage.reader.localFiles")}
|
|
5786
5820
|
</DropdownMenuLabel>
|
|
5787
5821
|
<div className="px-2 pb-1 text-xs leading-5 text-muted-foreground">
|
|
5788
5822
|
<div
|
|
@@ -5791,7 +5825,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5791
5825
|
>
|
|
5792
5826
|
{localPlanMenuPath}
|
|
5793
5827
|
</div>
|
|
5794
|
-
<div>
|
|
5828
|
+
<div>{t("plansPage.reader.localFilesNoHosted")}</div>
|
|
5795
5829
|
</div>
|
|
5796
5830
|
<DropdownMenuItem
|
|
5797
5831
|
onClick={() =>
|
|
@@ -5800,7 +5834,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5800
5834
|
className="gap-2"
|
|
5801
5835
|
>
|
|
5802
5836
|
<IconFolder className="size-4" />
|
|
5803
|
-
|
|
5837
|
+
{t("plansPage.reader.copyLocalPath")}
|
|
5804
5838
|
</DropdownMenuItem>
|
|
5805
5839
|
{!localPlanBridgeUrl && (
|
|
5806
5840
|
<DropdownMenuItem
|
|
@@ -5817,7 +5851,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5817
5851
|
) : (
|
|
5818
5852
|
<IconFolder className="size-4" />
|
|
5819
5853
|
)}
|
|
5820
|
-
|
|
5854
|
+
{t("plansPage.reader.saveToRepo")}
|
|
5821
5855
|
</DropdownMenuItem>
|
|
5822
5856
|
)}
|
|
5823
5857
|
{localPlanBridgeUrl && desktopPlanFilesAvailable && (
|
|
@@ -5835,7 +5869,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5835
5869
|
) : (
|
|
5836
5870
|
<IconFolder className="size-4" />
|
|
5837
5871
|
)}
|
|
5838
|
-
|
|
5872
|
+
{t("plansPage.reader.saveSourceToFolder")}
|
|
5839
5873
|
</DropdownMenuItem>
|
|
5840
5874
|
)}
|
|
5841
5875
|
<DropdownMenuSeparator />
|
|
@@ -5845,20 +5879,22 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5845
5879
|
{!localPlanMode && (
|
|
5846
5880
|
<>
|
|
5847
5881
|
<DropdownMenuLabel className="text-xs font-medium text-muted-foreground">
|
|
5848
|
-
|
|
5882
|
+
{t("plansPage.comments.comments")}
|
|
5849
5883
|
</DropdownMenuLabel>
|
|
5850
5884
|
<DropdownMenuRadioGroup value={commentVisibility}>
|
|
5851
5885
|
<DropdownMenuRadioItem
|
|
5852
5886
|
value="hidden"
|
|
5853
5887
|
onSelect={() => chooseCommentVisibility("hidden")}
|
|
5854
5888
|
>
|
|
5855
|
-
|
|
5889
|
+
{t("plansPage.reader.hideComments")}
|
|
5856
5890
|
</DropdownMenuRadioItem>
|
|
5857
5891
|
<DropdownMenuRadioItem
|
|
5858
5892
|
value="open"
|
|
5859
5893
|
onSelect={() => chooseCommentVisibility("open")}
|
|
5860
5894
|
>
|
|
5861
|
-
<span className="flex-1">
|
|
5895
|
+
<span className="flex-1">
|
|
5896
|
+
{t("plansPage.reader.showComments")}
|
|
5897
|
+
</span>
|
|
5862
5898
|
{hasOpenThreads && (
|
|
5863
5899
|
<span className="text-xs text-muted-foreground">
|
|
5864
5900
|
{bundle.summary.openCommentCount}
|
|
@@ -5869,7 +5905,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5869
5905
|
value="all"
|
|
5870
5906
|
onSelect={() => chooseCommentVisibility("all")}
|
|
5871
5907
|
>
|
|
5872
|
-
<span className="flex-1">
|
|
5908
|
+
<span className="flex-1">
|
|
5909
|
+
{t("plansPage.reader.showAllComments")}
|
|
5910
|
+
</span>
|
|
5873
5911
|
{resolvedCommentThreadCount > 0 && (
|
|
5874
5912
|
<span className="text-xs text-muted-foreground">
|
|
5875
5913
|
{commentThreads.length}
|
|
@@ -5887,7 +5925,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5887
5925
|
className="gap-2"
|
|
5888
5926
|
>
|
|
5889
5927
|
<IconHistory className="size-4" />
|
|
5890
|
-
|
|
5928
|
+
{t("plansPage.history.title")}
|
|
5891
5929
|
</DropdownMenuItem>
|
|
5892
5930
|
</>
|
|
5893
5931
|
)}
|
|
@@ -5913,10 +5951,10 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5913
5951
|
<IconArrowsMaximize className="size-4" />
|
|
5914
5952
|
)}
|
|
5915
5953
|
{prototypeOnly
|
|
5916
|
-
? "
|
|
5954
|
+
? t("plansPage.reader.fullPlan")
|
|
5917
5955
|
: immersiveReader
|
|
5918
|
-
? "
|
|
5919
|
-
: "
|
|
5956
|
+
? t("plansPage.reader.appView")
|
|
5957
|
+
: t("plansPage.reader.fullScreen")}
|
|
5920
5958
|
</DropdownMenuItem>
|
|
5921
5959
|
<DropdownMenuItem
|
|
5922
5960
|
onClick={() =>
|
|
@@ -5931,7 +5969,9 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5931
5969
|
) : (
|
|
5932
5970
|
<IconMoon className="size-4" />
|
|
5933
5971
|
)}
|
|
5934
|
-
{isDarkTheme
|
|
5972
|
+
{isDarkTheme
|
|
5973
|
+
? t("plansPage.reader.lightMode")
|
|
5974
|
+
: t("plansPage.reader.darkMode")}
|
|
5935
5975
|
</DropdownMenuItem>
|
|
5936
5976
|
<DropdownMenuItem
|
|
5937
5977
|
onClick={() =>
|
|
@@ -5941,8 +5981,8 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5941
5981
|
>
|
|
5942
5982
|
<IconPencil className="size-4" />
|
|
5943
5983
|
{wireframeStyle === "sketchy"
|
|
5944
|
-
? "
|
|
5945
|
-
: "
|
|
5984
|
+
? t("plansPage.reader.cleanWireframes")
|
|
5985
|
+
: t("plansPage.reader.sketchyWireframes")}
|
|
5946
5986
|
</DropdownMenuItem>
|
|
5947
5987
|
{bundle.plan.content?.prototype ? (
|
|
5948
5988
|
<DropdownMenuItem
|
|
@@ -5952,7 +5992,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5952
5992
|
className="gap-2"
|
|
5953
5993
|
>
|
|
5954
5994
|
<IconExternalLink className="size-4" />
|
|
5955
|
-
|
|
5995
|
+
{t("plansPage.reader.openPrototypeWindow")}
|
|
5956
5996
|
</DropdownMenuItem>
|
|
5957
5997
|
) : null}
|
|
5958
5998
|
</DropdownMenuGroup>
|
|
@@ -5963,7 +6003,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5963
6003
|
className="gap-2"
|
|
5964
6004
|
>
|
|
5965
6005
|
<IconCopy className="size-4" />
|
|
5966
|
-
|
|
6006
|
+
{t("plansPage.reader.copyLink")}
|
|
5967
6007
|
</DropdownMenuItem>
|
|
5968
6008
|
<DropdownMenuItem asChild className="gap-2">
|
|
5969
6009
|
<a
|
|
@@ -5972,7 +6012,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5972
6012
|
rel="noreferrer"
|
|
5973
6013
|
>
|
|
5974
6014
|
<IconHelpCircle className="size-4" />
|
|
5975
|
-
|
|
6015
|
+
{t("plansPage.reader.openDocs")}
|
|
5976
6016
|
</a>
|
|
5977
6017
|
</DropdownMenuItem>
|
|
5978
6018
|
<DropdownMenuItem
|
|
@@ -5980,13 +6020,13 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
5980
6020
|
className="gap-2"
|
|
5981
6021
|
>
|
|
5982
6022
|
<IconFileZip className="size-4" />
|
|
5983
|
-
|
|
6023
|
+
{t("plansPage.reader.downloadSourceZip")}
|
|
5984
6024
|
</DropdownMenuItem>
|
|
5985
6025
|
{desktopPlanFilesAvailable && !localPlanMode && (
|
|
5986
6026
|
<>
|
|
5987
6027
|
<DropdownMenuSeparator />
|
|
5988
6028
|
<DropdownMenuLabel className="text-xs font-medium text-muted-foreground">
|
|
5989
|
-
|
|
6029
|
+
{t("plansPage.reader.localFiles")}
|
|
5990
6030
|
</DropdownMenuLabel>
|
|
5991
6031
|
<DropdownMenuItem
|
|
5992
6032
|
onClick={() =>
|
|
@@ -6005,8 +6045,8 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
6005
6045
|
<IconFolder className="size-4" />
|
|
6006
6046
|
)}
|
|
6007
6047
|
{desktopPlanFolder
|
|
6008
|
-
? "
|
|
6009
|
-
: "
|
|
6048
|
+
? t("plansPage.reader.changeLocalFolder")
|
|
6049
|
+
: t("plansPage.reader.linkLocalFolder")}
|
|
6010
6050
|
</DropdownMenuItem>
|
|
6011
6051
|
<DropdownMenuItem
|
|
6012
6052
|
onClick={() =>
|
|
@@ -6022,7 +6062,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
6022
6062
|
) : (
|
|
6023
6063
|
<IconRefresh className="size-4" />
|
|
6024
6064
|
)}
|
|
6025
|
-
|
|
6065
|
+
{t("plansPage.reader.syncToLocalFolder")}
|
|
6026
6066
|
</DropdownMenuItem>
|
|
6027
6067
|
<DropdownMenuItem
|
|
6028
6068
|
onClick={() =>
|
|
@@ -6040,7 +6080,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
6040
6080
|
) : (
|
|
6041
6081
|
<IconDownload className="size-4" />
|
|
6042
6082
|
)}
|
|
6043
|
-
|
|
6083
|
+
{t("plansPage.reader.importLocalEdits")}
|
|
6044
6084
|
</DropdownMenuItem>
|
|
6045
6085
|
<DropdownMenuCheckboxItem
|
|
6046
6086
|
checked={desktopPlanAutoSync}
|
|
@@ -6049,14 +6089,14 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
6049
6089
|
setDesktopPlanAutoSyncEnabled(checked === true)
|
|
6050
6090
|
}
|
|
6051
6091
|
>
|
|
6052
|
-
|
|
6092
|
+
{t("plansPage.reader.autoSyncChanges")}
|
|
6053
6093
|
</DropdownMenuCheckboxItem>
|
|
6054
6094
|
</>
|
|
6055
6095
|
)}
|
|
6056
6096
|
<DropdownMenuSub>
|
|
6057
6097
|
<DropdownMenuSubTrigger className="gap-2">
|
|
6058
6098
|
<IconDownload className="size-4" />
|
|
6059
|
-
|
|
6099
|
+
{t("plansPage.reader.export")}
|
|
6060
6100
|
</DropdownMenuSubTrigger>
|
|
6061
6101
|
<DropdownMenuSubContent className="w-56 rounded-xl">
|
|
6062
6102
|
<DropdownMenuItem
|
|
@@ -6066,7 +6106,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
6066
6106
|
className="gap-2"
|
|
6067
6107
|
>
|
|
6068
6108
|
<IconClipboardText className="size-4" />
|
|
6069
|
-
|
|
6109
|
+
{t("plansPage.reader.copyMarkdown")}
|
|
6070
6110
|
</DropdownMenuItem>
|
|
6071
6111
|
<DropdownMenuItem
|
|
6072
6112
|
onClick={() =>
|
|
@@ -6075,14 +6115,14 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
6075
6115
|
className="gap-2"
|
|
6076
6116
|
>
|
|
6077
6117
|
<IconDownload className="size-4" />
|
|
6078
|
-
|
|
6118
|
+
{t("plansPage.reader.downloadMarkdown")}
|
|
6079
6119
|
</DropdownMenuItem>
|
|
6080
6120
|
<DropdownMenuItem
|
|
6081
6121
|
onClick={() => runPlanExportAction(copyPlanHtml)}
|
|
6082
6122
|
className="gap-2"
|
|
6083
6123
|
>
|
|
6084
6124
|
<IconCopy className="size-4" />
|
|
6085
|
-
|
|
6125
|
+
{t("plansPage.reader.copyHtml")}
|
|
6086
6126
|
</DropdownMenuItem>
|
|
6087
6127
|
<DropdownMenuItem
|
|
6088
6128
|
onClick={() =>
|
|
@@ -6091,7 +6131,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
6091
6131
|
className="gap-2"
|
|
6092
6132
|
>
|
|
6093
6133
|
<IconDownload className="size-4" />
|
|
6094
|
-
|
|
6134
|
+
{t("plansPage.reader.downloadHtml")}
|
|
6095
6135
|
</DropdownMenuItem>
|
|
6096
6136
|
</DropdownMenuSubContent>
|
|
6097
6137
|
</DropdownMenuSub>
|
|
@@ -6106,7 +6146,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
6106
6146
|
className="gap-2"
|
|
6107
6147
|
>
|
|
6108
6148
|
<IconClipboardText className="size-4" />
|
|
6109
|
-
|
|
6149
|
+
{t("plansPage.reader.copyFeedback")}
|
|
6110
6150
|
</DropdownMenuItem>
|
|
6111
6151
|
)}
|
|
6112
6152
|
</DropdownMenuGroup>
|
|
@@ -6122,7 +6162,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
6122
6162
|
className="gap-2 text-destructive focus:text-destructive"
|
|
6123
6163
|
>
|
|
6124
6164
|
<IconTrash className="size-4" />
|
|
6125
|
-
|
|
6165
|
+
{t("plansPage.overview.delete")}
|
|
6126
6166
|
</DropdownMenuItem>
|
|
6127
6167
|
</>
|
|
6128
6168
|
)}
|
|
@@ -6136,21 +6176,27 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
6136
6176
|
size="icon"
|
|
6137
6177
|
className="pointer-events-auto size-8"
|
|
6138
6178
|
onClick={togglePlansAgent}
|
|
6139
|
-
aria-label="
|
|
6179
|
+
aria-label={t("plansPage.reader.toggleAgentSidebar")}
|
|
6140
6180
|
>
|
|
6141
6181
|
<IconLayoutSidebarRight className="size-4" />
|
|
6142
6182
|
</Button>
|
|
6143
6183
|
</TooltipTrigger>
|
|
6144
|
-
<TooltipContent>
|
|
6184
|
+
<TooltipContent>
|
|
6185
|
+
{t("plansPage.reader.toggleSideChat")}
|
|
6186
|
+
</TooltipContent>
|
|
6145
6187
|
</Tooltip>
|
|
6146
6188
|
</div>
|
|
6147
6189
|
{reviewMode !== "none" && !recapScreenshotMode && (
|
|
6148
6190
|
<div className="pointer-events-none absolute left-1/2 top-3 z-10 -translate-x-1/2 rounded-full border border-border/70 bg-background/82 px-3 py-2 text-xs text-muted-foreground shadow-2xl backdrop-blur-xl">
|
|
6149
6191
|
{reviewMode === "comment"
|
|
6150
|
-
?
|
|
6192
|
+
? t("plansPage.reader.clickToComment", {
|
|
6193
|
+
noun: isRecap
|
|
6194
|
+
? t("plansPage.nouns.recap")
|
|
6195
|
+
: t("plansPage.nouns.plan"),
|
|
6196
|
+
})
|
|
6151
6197
|
: reviewMode === "text"
|
|
6152
|
-
? "
|
|
6153
|
-
: "
|
|
6198
|
+
? t("plansPage.reader.clickCanvasNote")
|
|
6199
|
+
: t("plansPage.reader.dragCanvasCallout")}
|
|
6154
6200
|
</div>
|
|
6155
6201
|
)}
|
|
6156
6202
|
{bundle.plan.content ? (
|
|
@@ -6216,7 +6262,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
6216
6262
|
message: buildQuestionFormRevisionMessage(summary),
|
|
6217
6263
|
});
|
|
6218
6264
|
persistQuestionFormAnswers(summary, bundle.plan.id);
|
|
6219
|
-
toast.success("
|
|
6265
|
+
toast.success(t("plansPage.reader.sentAnswers"));
|
|
6220
6266
|
}}
|
|
6221
6267
|
/>
|
|
6222
6268
|
</div>
|
|
@@ -6235,7 +6281,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
6235
6281
|
onClick={beginNativeSelectionComment}
|
|
6236
6282
|
>
|
|
6237
6283
|
<IconMessageCircle className="size-4 text-primary" />
|
|
6238
|
-
|
|
6284
|
+
{t("plansPage.comments.comment")}
|
|
6239
6285
|
</Button>
|
|
6240
6286
|
</div>
|
|
6241
6287
|
)}
|
|
@@ -6428,13 +6474,17 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
6428
6474
|
className="space-y-4"
|
|
6429
6475
|
>
|
|
6430
6476
|
<DialogHeader>
|
|
6431
|
-
<DialogTitle>
|
|
6477
|
+
<DialogTitle>
|
|
6478
|
+
{t("plansPage.reader.saveLocalPlanToRepo")}
|
|
6479
|
+
</DialogTitle>
|
|
6432
6480
|
<DialogDescription>
|
|
6433
|
-
|
|
6481
|
+
{t("plansPage.reader.chooseRepoFolder")}
|
|
6434
6482
|
</DialogDescription>
|
|
6435
6483
|
</DialogHeader>
|
|
6436
6484
|
<div className="space-y-2">
|
|
6437
|
-
<Label htmlFor="local-plan-repo-path">
|
|
6485
|
+
<Label htmlFor="local-plan-repo-path">
|
|
6486
|
+
{t("plansPage.reader.repoFolder")}
|
|
6487
|
+
</Label>
|
|
6438
6488
|
<Input
|
|
6439
6489
|
id="local-plan-repo-path"
|
|
6440
6490
|
value={promoteLocalPlanTargetPath}
|
|
@@ -6456,7 +6506,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
6456
6506
|
setPromoteLocalPlanOverwrite(checked === true)
|
|
6457
6507
|
}
|
|
6458
6508
|
/>
|
|
6459
|
-
|
|
6509
|
+
{t("plansPage.reader.replaceExistingFolder")}
|
|
6460
6510
|
</label>
|
|
6461
6511
|
<DialogFooter>
|
|
6462
6512
|
<Button
|
|
@@ -6465,7 +6515,7 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
6465
6515
|
onClick={() => setPromoteLocalPlanOpen(false)}
|
|
6466
6516
|
disabled={promoteLocalPlan.isPending}
|
|
6467
6517
|
>
|
|
6468
|
-
|
|
6518
|
+
{t("plansPage.common.cancel")}
|
|
6469
6519
|
</Button>
|
|
6470
6520
|
<Button
|
|
6471
6521
|
type="submit"
|
|
@@ -6529,23 +6579,26 @@ export function PlansPage({ localPlanSlug }: { localPlanSlug?: string } = {}) {
|
|
|
6529
6579
|
// makes clear that anyone-with-link can view, but commenting on a public
|
|
6530
6580
|
// plan/recap still needs an agent-native account (comments are attributed +
|
|
6531
6581
|
// scoped). `noun` is "plan" or "recap" so recaps read as recaps everywhere.
|
|
6532
|
-
const buildShareVisibilityCopy = (
|
|
6582
|
+
const buildShareVisibilityCopy = (
|
|
6583
|
+
t: ReturnType<typeof useT>,
|
|
6584
|
+
noun: string,
|
|
6585
|
+
) => ({
|
|
6533
6586
|
private: {
|
|
6534
|
-
label: "
|
|
6535
|
-
description:
|
|
6587
|
+
label: t("plansPage.share.visibility.private.label"),
|
|
6588
|
+
description: t("plansPage.share.visibility.private.description", { noun }),
|
|
6536
6589
|
},
|
|
6537
6590
|
org: {
|
|
6538
|
-
label: "
|
|
6539
|
-
description: "
|
|
6591
|
+
label: t("plansPage.share.visibility.org.label"),
|
|
6592
|
+
description: t("plansPage.share.visibility.org.description"),
|
|
6540
6593
|
},
|
|
6541
6594
|
public: {
|
|
6542
|
-
label: "
|
|
6543
|
-
description: "
|
|
6595
|
+
label: t("plansPage.share.visibility.public.label"),
|
|
6596
|
+
description: t("plansPage.share.visibility.public.description"),
|
|
6544
6597
|
},
|
|
6545
6598
|
});
|
|
6546
6599
|
|
|
6547
|
-
const buildShareAccessNote = (noun: string) =>
|
|
6548
|
-
|
|
6600
|
+
const buildShareAccessNote = (t: ReturnType<typeof useT>, noun: string) =>
|
|
6601
|
+
t("plansPage.share.accessNote", { noun });
|
|
6549
6602
|
|
|
6550
6603
|
function PlanReportControl({
|
|
6551
6604
|
planId,
|
|
@@ -6558,6 +6611,7 @@ function PlanReportControl({
|
|
|
6558
6611
|
isRecap?: boolean;
|
|
6559
6612
|
onOpenChange?: (open: boolean) => void;
|
|
6560
6613
|
}) {
|
|
6614
|
+
const t = useT();
|
|
6561
6615
|
const noun = isRecap ? "recap" : "plan";
|
|
6562
6616
|
const reportPlan = useReportVisualPlan();
|
|
6563
6617
|
const [open, setOpen] = useState(false);
|
|
@@ -6612,19 +6666,21 @@ function PlanReportControl({
|
|
|
6612
6666
|
size="icon"
|
|
6613
6667
|
className="pointer-events-auto size-8"
|
|
6614
6668
|
onClick={() => setDialogOpen(true)}
|
|
6615
|
-
aria-label={
|
|
6669
|
+
aria-label={t("plansPage.report.reportAria", { noun })}
|
|
6616
6670
|
>
|
|
6617
6671
|
<IconFlag className="size-4" />
|
|
6618
6672
|
</Button>
|
|
6619
6673
|
</TooltipTrigger>
|
|
6620
|
-
<TooltipContent>
|
|
6674
|
+
<TooltipContent>
|
|
6675
|
+
{t("plansPage.report.report", { noun })}
|
|
6676
|
+
</TooltipContent>
|
|
6621
6677
|
</Tooltip>
|
|
6622
6678
|
<DialogContent className="sm:max-w-[460px]">
|
|
6623
6679
|
<form onSubmit={submitReport} className="space-y-4">
|
|
6624
6680
|
<DialogHeader>
|
|
6625
|
-
<DialogTitle>
|
|
6681
|
+
<DialogTitle>{t("plansPage.report.report", { noun })}</DialogTitle>
|
|
6626
6682
|
<DialogDescription>
|
|
6627
|
-
|
|
6683
|
+
{t("plansPage.report.description", { noun })}
|
|
6628
6684
|
</DialogDescription>
|
|
6629
6685
|
</DialogHeader>
|
|
6630
6686
|
|
|
@@ -6633,7 +6689,9 @@ function PlanReportControl({
|
|
|
6633
6689
|
</div>
|
|
6634
6690
|
|
|
6635
6691
|
<div className="space-y-2">
|
|
6636
|
-
<Label htmlFor="plan-report-reason">
|
|
6692
|
+
<Label htmlFor="plan-report-reason">
|
|
6693
|
+
{t("plansPage.report.reason")}
|
|
6694
|
+
</Label>
|
|
6637
6695
|
<Select
|
|
6638
6696
|
value={reason}
|
|
6639
6697
|
onValueChange={(value) => setReason(value as PlanReportReason)}
|
|
@@ -6644,7 +6702,7 @@ function PlanReportControl({
|
|
|
6644
6702
|
<SelectContent>
|
|
6645
6703
|
{REPORT_REASON_OPTIONS.map((option) => (
|
|
6646
6704
|
<SelectItem key={option.value} value={option.value}>
|
|
6647
|
-
{option.
|
|
6705
|
+
{t(`plansPage.report.reasons.${option.value}`)}
|
|
6648
6706
|
</SelectItem>
|
|
6649
6707
|
))}
|
|
6650
6708
|
</SelectContent>
|
|
@@ -6653,7 +6711,9 @@ function PlanReportControl({
|
|
|
6653
6711
|
|
|
6654
6712
|
<div className="space-y-2">
|
|
6655
6713
|
<div className="flex items-center justify-between gap-3">
|
|
6656
|
-
<Label htmlFor="plan-report-details">
|
|
6714
|
+
<Label htmlFor="plan-report-details">
|
|
6715
|
+
{t("plansPage.report.details")}
|
|
6716
|
+
</Label>
|
|
6657
6717
|
<span className="text-xs text-muted-foreground">
|
|
6658
6718
|
{details.length}/1000
|
|
6659
6719
|
</span>
|
|
@@ -6663,7 +6723,7 @@ function PlanReportControl({
|
|
|
6663
6723
|
value={details}
|
|
6664
6724
|
onChange={(event) => setDetails(event.target.value)}
|
|
6665
6725
|
maxLength={1000}
|
|
6666
|
-
placeholder="
|
|
6726
|
+
placeholder={t("plansPage.report.detailsPlaceholder")}
|
|
6667
6727
|
className="min-h-28 resize-none"
|
|
6668
6728
|
/>
|
|
6669
6729
|
</div>
|
|
@@ -6675,18 +6735,18 @@ function PlanReportControl({
|
|
|
6675
6735
|
onClick={() => setDialogOpen(false)}
|
|
6676
6736
|
disabled={reportPlan.isPending}
|
|
6677
6737
|
>
|
|
6678
|
-
|
|
6738
|
+
{t("plansPage.common.cancel")}
|
|
6679
6739
|
</Button>
|
|
6680
6740
|
<Button type="submit" disabled={reportPlan.isPending}>
|
|
6681
6741
|
{reportPlan.isPending ? (
|
|
6682
6742
|
<>
|
|
6683
6743
|
<IconLoader2 className="size-4 animate-spin" />
|
|
6684
|
-
|
|
6744
|
+
{t("plansPage.reader.sending")}
|
|
6685
6745
|
</>
|
|
6686
6746
|
) : (
|
|
6687
6747
|
<>
|
|
6688
6748
|
<IconFlag className="size-4" />
|
|
6689
|
-
|
|
6749
|
+
{t("plansPage.report.submit")}
|
|
6690
6750
|
</>
|
|
6691
6751
|
)}
|
|
6692
6752
|
</Button>
|
|
@@ -6722,6 +6782,7 @@ function PlanShareControl({
|
|
|
6722
6782
|
hostedPlanUrl?: string | null;
|
|
6723
6783
|
onOpenChange?: (open: boolean) => void;
|
|
6724
6784
|
}) {
|
|
6785
|
+
const t = useT();
|
|
6725
6786
|
const noun = isRecap ? "recap" : "plan";
|
|
6726
6787
|
const Noun = isRecap ? "Recap" : "Plan";
|
|
6727
6788
|
const { session, isLoading: sessionLoading } = useSession();
|
|
@@ -6781,12 +6842,15 @@ function PlanShareControl({
|
|
|
6781
6842
|
window.location.href = target;
|
|
6782
6843
|
}, []);
|
|
6783
6844
|
|
|
6784
|
-
const copyPublishedUrl = useCallback(
|
|
6785
|
-
|
|
6786
|
-
()
|
|
6787
|
-
|
|
6788
|
-
|
|
6789
|
-
|
|
6845
|
+
const copyPublishedUrl = useCallback(
|
|
6846
|
+
(url: string) => {
|
|
6847
|
+
void navigator.clipboard.writeText(url).then(
|
|
6848
|
+
() => toast.success(t("plansPage.share.linkCopied")),
|
|
6849
|
+
() => toast.error(t("plansPage.share.copyFailed")),
|
|
6850
|
+
);
|
|
6851
|
+
},
|
|
6852
|
+
[t],
|
|
6853
|
+
);
|
|
6790
6854
|
|
|
6791
6855
|
const handlePublish = useCallback(() => {
|
|
6792
6856
|
publishPlan.mutate(
|
|
@@ -6798,7 +6862,9 @@ function PlanShareControl({
|
|
|
6798
6862
|
authUrl: result.authUrl,
|
|
6799
6863
|
connectCommand: result.connectCommand,
|
|
6800
6864
|
});
|
|
6801
|
-
toast.message(
|
|
6865
|
+
toast.message(
|
|
6866
|
+
t("plansPage.share.createAccountToPublish", { noun }),
|
|
6867
|
+
);
|
|
6802
6868
|
return;
|
|
6803
6869
|
}
|
|
6804
6870
|
setPublishedPlan({
|
|
@@ -6830,13 +6896,13 @@ function PlanShareControl({
|
|
|
6830
6896
|
resourceId={managedShareResourceId}
|
|
6831
6897
|
resourceTitle={planTitle}
|
|
6832
6898
|
shareUrl={managedShareUrl}
|
|
6833
|
-
shareUrlLabel={
|
|
6834
|
-
shareUrlDescription="
|
|
6899
|
+
shareUrlLabel={t("plansPage.share.linkLabel", { noun: Noun })}
|
|
6900
|
+
shareUrlDescription={t("plansPage.share.description")}
|
|
6835
6901
|
shareUrlPlacement="top"
|
|
6836
|
-
peopleAccessLabel={
|
|
6837
|
-
generalAccessLabel={
|
|
6838
|
-
accessNote={buildShareAccessNote(noun)}
|
|
6839
|
-
visibilityCopy={buildShareVisibilityCopy(noun)}
|
|
6902
|
+
peopleAccessLabel={t("plansPage.share.peopleAccess", { noun })}
|
|
6903
|
+
generalAccessLabel={t("plansPage.share.generalAccess", { noun })}
|
|
6904
|
+
accessNote={buildShareAccessNote(t, noun)}
|
|
6905
|
+
visibilityCopy={buildShareVisibilityCopy(t, noun)}
|
|
6840
6906
|
trigger="icon"
|
|
6841
6907
|
triggerClassName="pointer-events-auto size-8"
|
|
6842
6908
|
onOpenChange={onOpenChange}
|
|
@@ -6862,13 +6928,13 @@ function PlanShareControl({
|
|
|
6862
6928
|
variant="ghost"
|
|
6863
6929
|
size="icon"
|
|
6864
6930
|
className="pointer-events-auto size-8"
|
|
6865
|
-
aria-label={
|
|
6931
|
+
aria-label={t("plansPage.share.shareAria", { noun })}
|
|
6866
6932
|
>
|
|
6867
6933
|
<IconShare3 className="size-4" />
|
|
6868
6934
|
</Button>
|
|
6869
6935
|
</PopoverTrigger>
|
|
6870
6936
|
</TooltipTrigger>
|
|
6871
|
-
<TooltipContent>
|
|
6937
|
+
<TooltipContent>{t("plansPage.share.share", { noun })}</TooltipContent>
|
|
6872
6938
|
</Tooltip>
|
|
6873
6939
|
<PopoverContent
|
|
6874
6940
|
align="end"
|
|
@@ -6877,19 +6943,18 @@ function PlanShareControl({
|
|
|
6877
6943
|
>
|
|
6878
6944
|
<div className="mb-1 flex items-center gap-2 text-sm font-semibold">
|
|
6879
6945
|
<IconWorld className="size-4 text-muted-foreground" />
|
|
6880
|
-
|
|
6946
|
+
{t("plansPage.share.shareThis", { noun })}
|
|
6881
6947
|
</div>
|
|
6882
6948
|
<p className="mb-3 text-xs leading-5 text-muted-foreground">
|
|
6883
6949
|
{effectivePublishedUrl
|
|
6884
|
-
?
|
|
6885
|
-
:
|
|
6950
|
+
? t("plansPage.share.hostedCopy", { noun })
|
|
6951
|
+
: t("plansPage.share.publishDescription", { noun })}
|
|
6886
6952
|
</p>
|
|
6887
6953
|
|
|
6888
6954
|
{authPrompt ? (
|
|
6889
6955
|
<div className="space-y-3">
|
|
6890
6956
|
<div className="rounded-md border border-border bg-muted/35 p-3 text-xs leading-5 text-muted-foreground">
|
|
6891
|
-
|
|
6892
|
-
the link.
|
|
6957
|
+
{t("plansPage.share.finishAccount")}
|
|
6893
6958
|
</div>
|
|
6894
6959
|
{authPrompt.connectCommand ? (
|
|
6895
6960
|
<code className="block overflow-x-auto rounded-md border border-border bg-muted/40 px-2.5 py-1.5 font-mono text-[11px] text-foreground">
|
|
@@ -6907,10 +6972,10 @@ function PlanShareControl({
|
|
|
6907
6972
|
{publishPlan.isPending ? (
|
|
6908
6973
|
<>
|
|
6909
6974
|
<IconLoader2 className="size-3.5 animate-spin" />
|
|
6910
|
-
|
|
6975
|
+
{t("plansPage.share.checking")}
|
|
6911
6976
|
</>
|
|
6912
6977
|
) : (
|
|
6913
|
-
"
|
|
6978
|
+
t("plansPage.share.signedInRetry")
|
|
6914
6979
|
)}
|
|
6915
6980
|
</Button>
|
|
6916
6981
|
<Button
|
|
@@ -6918,7 +6983,7 @@ function PlanShareControl({
|
|
|
6918
6983
|
size="sm"
|
|
6919
6984
|
onClick={() => openAuthFlow(authPrompt.authUrl)}
|
|
6920
6985
|
>
|
|
6921
|
-
|
|
6986
|
+
{t("plansPage.loadError.createAccount")}
|
|
6922
6987
|
</Button>
|
|
6923
6988
|
</div>
|
|
6924
6989
|
</div>
|
|
@@ -6938,7 +7003,7 @@ function PlanShareControl({
|
|
|
6938
7003
|
onClick={() => copyPublishedUrl(effectivePublishedUrl)}
|
|
6939
7004
|
>
|
|
6940
7005
|
<IconCopy className="size-3.5" />
|
|
6941
|
-
|
|
7006
|
+
{t("plansPage.loggedOut.copy")}
|
|
6942
7007
|
</Button>
|
|
6943
7008
|
<Button
|
|
6944
7009
|
type="button"
|
|
@@ -6950,12 +7015,12 @@ function PlanShareControl({
|
|
|
6950
7015
|
{publishPlan.isPending ? (
|
|
6951
7016
|
<>
|
|
6952
7017
|
<IconLoader2 className="size-3.5 animate-spin" />
|
|
6953
|
-
|
|
7018
|
+
{t("plansPage.share.updating")}
|
|
6954
7019
|
</>
|
|
6955
7020
|
) : (
|
|
6956
7021
|
<>
|
|
6957
7022
|
<IconRefresh className="size-3.5" />
|
|
6958
|
-
|
|
7023
|
+
{t("plansPage.share.updateLink")}
|
|
6959
7024
|
</>
|
|
6960
7025
|
)}
|
|
6961
7026
|
</Button>
|
|
@@ -6966,7 +7031,7 @@ function PlanShareControl({
|
|
|
6966
7031
|
rel="noreferrer"
|
|
6967
7032
|
>
|
|
6968
7033
|
<IconExternalLink className="size-3.5" />
|
|
6969
|
-
|
|
7034
|
+
{t("plansPage.share.openHostedPlan")}
|
|
6970
7035
|
</a>
|
|
6971
7036
|
</Button>
|
|
6972
7037
|
</div>
|
|
@@ -6981,12 +7046,12 @@ function PlanShareControl({
|
|
|
6981
7046
|
{publishPlan.isPending ? (
|
|
6982
7047
|
<>
|
|
6983
7048
|
<IconLoader2 className="size-4 animate-spin" />
|
|
6984
|
-
|
|
7049
|
+
{t("plansPage.share.creatingLink")}
|
|
6985
7050
|
</>
|
|
6986
7051
|
) : (
|
|
6987
7052
|
<>
|
|
6988
7053
|
<IconLink className="size-4" />
|
|
6989
|
-
|
|
7054
|
+
{t("plansPage.share.createShareableLink")}
|
|
6990
7055
|
</>
|
|
6991
7056
|
)}
|
|
6992
7057
|
</Button>
|
|
@@ -6997,17 +7062,19 @@ function PlanShareControl({
|
|
|
6997
7062
|
}
|
|
6998
7063
|
|
|
6999
7064
|
function PlanSkeleton({ isRecap = false }: { isRecap?: boolean }) {
|
|
7065
|
+
const t = useT();
|
|
7066
|
+
const loadingLabel = isRecap
|
|
7067
|
+
? t("plansPage.skeleton.loadingRecap")
|
|
7068
|
+
: t("plansPage.skeleton.loadingPlan");
|
|
7000
7069
|
// Recaps are document-only review surfaces that almost never use the top
|
|
7001
7070
|
// canvas, so skip the canvas placeholder for them while keeping it for plans.
|
|
7002
7071
|
return (
|
|
7003
7072
|
<div
|
|
7004
7073
|
className="plan-content-surface h-full min-h-0 overflow-auto bg-plan-document text-plan-text"
|
|
7005
7074
|
role="status"
|
|
7006
|
-
aria-label={
|
|
7075
|
+
aria-label={loadingLabel}
|
|
7007
7076
|
>
|
|
7008
|
-
<span className="sr-only">
|
|
7009
|
-
{isRecap ? "Loading recap" : "Loading plan"}
|
|
7010
|
-
</span>
|
|
7077
|
+
<span className="sr-only">{loadingLabel}</span>
|
|
7011
7078
|
{!isRecap && <PlanCanvasSkeleton />}
|
|
7012
7079
|
<PlanDocumentSkeleton />
|
|
7013
7080
|
</div>
|
|
@@ -7211,6 +7278,7 @@ function ReviewMarkupToolbar({
|
|
|
7211
7278
|
mode: CanvasMarkupMode;
|
|
7212
7279
|
onModeChange: (mode: CanvasMarkupMode) => void;
|
|
7213
7280
|
}) {
|
|
7281
|
+
const t = useT();
|
|
7214
7282
|
const value = mode === "comment" ? "comment" : "";
|
|
7215
7283
|
const setValue = (next: string) => {
|
|
7216
7284
|
onModeChange(next === "comment" ? "comment" : "none");
|
|
@@ -7223,20 +7291,26 @@ function ReviewMarkupToolbar({
|
|
|
7223
7291
|
variant="default"
|
|
7224
7292
|
size="sm"
|
|
7225
7293
|
className="pointer-events-auto gap-0.5 rounded-md border border-border/60 bg-background/55 p-0.5"
|
|
7226
|
-
aria-label="
|
|
7294
|
+
aria-label={t("plansPage.reader.reviewMarkupTools")}
|
|
7227
7295
|
>
|
|
7228
7296
|
<Tooltip>
|
|
7229
7297
|
<TooltipTrigger asChild>
|
|
7230
7298
|
<ToggleGroupItem
|
|
7231
7299
|
value="comment"
|
|
7232
7300
|
className="size-7 px-0"
|
|
7233
|
-
aria-label={
|
|
7301
|
+
aria-label={
|
|
7302
|
+
mode === "comment"
|
|
7303
|
+
? t("plansPage.reader.stopCommenting")
|
|
7304
|
+
: t("plansPage.comments.comment")
|
|
7305
|
+
}
|
|
7234
7306
|
>
|
|
7235
7307
|
<IconMessageCircle className="size-4" />
|
|
7236
7308
|
</ToggleGroupItem>
|
|
7237
7309
|
</TooltipTrigger>
|
|
7238
7310
|
<TooltipContent>
|
|
7239
|
-
{mode === "comment"
|
|
7311
|
+
{mode === "comment"
|
|
7312
|
+
? t("plansPage.reader.stopCommenting")
|
|
7313
|
+
: t("plansPage.reader.pinComment")}
|
|
7240
7314
|
</TooltipContent>
|
|
7241
7315
|
</Tooltip>
|
|
7242
7316
|
</ToggleGroup>
|
|
@@ -7252,10 +7326,11 @@ function LocalPlanLoadError({
|
|
|
7252
7326
|
slug: string;
|
|
7253
7327
|
onRetry: () => void;
|
|
7254
7328
|
}) {
|
|
7329
|
+
const t = useT();
|
|
7255
7330
|
const message =
|
|
7256
7331
|
error instanceof Error && error.message
|
|
7257
7332
|
? error.message.replace(/^Action [\w-]+ failed:\s*/, "")
|
|
7258
|
-
:
|
|
7333
|
+
: t("plansPage.localPlanLoadError.message", { slug });
|
|
7259
7334
|
|
|
7260
7335
|
return (
|
|
7261
7336
|
<div className="flex min-h-0 flex-1 items-center justify-center px-6 py-12">
|
|
@@ -7266,7 +7341,7 @@ function LocalPlanLoadError({
|
|
|
7266
7341
|
</div>
|
|
7267
7342
|
<div>
|
|
7268
7343
|
<h1 className="text-lg font-semibold tracking-tight">
|
|
7269
|
-
|
|
7344
|
+
{t("plansPage.localPlanLoadError.title")}
|
|
7270
7345
|
</h1>
|
|
7271
7346
|
<p className="mt-1 text-sm text-muted-foreground">{message}</p>
|
|
7272
7347
|
</div>
|
|
@@ -7274,12 +7349,12 @@ function LocalPlanLoadError({
|
|
|
7274
7349
|
<div className="mt-5 flex flex-wrap gap-2">
|
|
7275
7350
|
<Button type="button" variant="outline" onClick={onRetry}>
|
|
7276
7351
|
<IconRefresh className="me-2 size-4" />
|
|
7277
|
-
|
|
7352
|
+
{t("plansPage.loadError.retry")}
|
|
7278
7353
|
</Button>
|
|
7279
7354
|
<Button asChild type="button" variant="ghost">
|
|
7280
7355
|
<Link to="/plans">
|
|
7281
7356
|
<IconArrowLeft className="me-2 size-4 rtl:-scale-x-100" />
|
|
7282
|
-
|
|
7357
|
+
{t("plansPage.overview.title")}
|
|
7283
7358
|
</Link>
|
|
7284
7359
|
</Button>
|
|
7285
7360
|
</div>
|
|
@@ -7310,6 +7385,7 @@ function PlanLoadError({
|
|
|
7310
7385
|
/** The signed-in identity for THIS origin, or null when anonymous. */
|
|
7311
7386
|
viewerEmail?: string | null;
|
|
7312
7387
|
}) {
|
|
7388
|
+
const t = useT();
|
|
7313
7389
|
const [emailOpen, setEmailOpen] = useState(false);
|
|
7314
7390
|
const [emailMode, setEmailMode] = useState<"sign-in" | "create">("sign-in");
|
|
7315
7391
|
const [email, setEmail] = useState("");
|
|
@@ -7322,7 +7398,7 @@ function PlanLoadError({
|
|
|
7322
7398
|
const message =
|
|
7323
7399
|
error instanceof Error && error.message
|
|
7324
7400
|
? error.message.replace(/^Action [\w-]+ failed:\s*/, "")
|
|
7325
|
-
: "
|
|
7401
|
+
: t("plansPage.loadError.genericMessage");
|
|
7326
7402
|
const status =
|
|
7327
7403
|
error && typeof error === "object" && "status" in error
|
|
7328
7404
|
? (error as { status?: number }).status
|
|
@@ -7340,11 +7416,11 @@ function PlanLoadError({
|
|
|
7340
7416
|
const orgName = accessStatus?.orgName?.trim() || null;
|
|
7341
7417
|
const orgAccessBody =
|
|
7342
7418
|
orgName && accessStatus?.visibility === "org"
|
|
7343
|
-
?
|
|
7419
|
+
? t("plansPage.loadError.orgBody", { orgName })
|
|
7344
7420
|
: null;
|
|
7345
7421
|
const orgAccessTitle =
|
|
7346
7422
|
orgName && accessStatus?.visibility === "org"
|
|
7347
|
-
?
|
|
7423
|
+
? t("plansPage.loadError.orgTitle", { orgName })
|
|
7348
7424
|
: null;
|
|
7349
7425
|
|
|
7350
7426
|
const returnPath = () =>
|
|
@@ -7380,7 +7456,10 @@ function PlanLoadError({
|
|
|
7380
7456
|
);
|
|
7381
7457
|
if (!registerRes.ok) {
|
|
7382
7458
|
throw new Error(
|
|
7383
|
-
await readAuthError(
|
|
7459
|
+
await readAuthError(
|
|
7460
|
+
registerRes,
|
|
7461
|
+
t("plansPage.loadError.createAccountFailed"),
|
|
7462
|
+
),
|
|
7384
7463
|
);
|
|
7385
7464
|
}
|
|
7386
7465
|
}
|
|
@@ -7394,7 +7473,10 @@ function PlanLoadError({
|
|
|
7394
7473
|
);
|
|
7395
7474
|
if (!loginRes.ok) {
|
|
7396
7475
|
throw new Error(
|
|
7397
|
-
await readAuthError(
|
|
7476
|
+
await readAuthError(
|
|
7477
|
+
loginRes,
|
|
7478
|
+
t("plansPage.loadError.emailSignInFailed"),
|
|
7479
|
+
),
|
|
7398
7480
|
);
|
|
7399
7481
|
}
|
|
7400
7482
|
window.location.assign(returnPath());
|
|
@@ -7402,11 +7484,9 @@ function PlanLoadError({
|
|
|
7402
7484
|
const next =
|
|
7403
7485
|
authError instanceof Error
|
|
7404
7486
|
? authError.message
|
|
7405
|
-
: "
|
|
7487
|
+
: t("plansPage.loadError.emailSignInFailed");
|
|
7406
7488
|
if (/not verified|verification/i.test(next)) {
|
|
7407
|
-
setEmailAuthNotice(
|
|
7408
|
-
"Check your email to verify the account, then reopen this link.",
|
|
7409
|
-
);
|
|
7489
|
+
setEmailAuthNotice(t("plansPage.loadError.verifyEmail"));
|
|
7410
7490
|
} else {
|
|
7411
7491
|
setEmailAuthError(next);
|
|
7412
7492
|
}
|
|
@@ -7425,22 +7505,22 @@ function PlanLoadError({
|
|
|
7425
7505
|
};
|
|
7426
7506
|
|
|
7427
7507
|
const title = planMissing
|
|
7428
|
-
? "
|
|
7508
|
+
? t("plansPage.loadError.notFoundTitle")
|
|
7429
7509
|
: showAccessHelp
|
|
7430
7510
|
? signedIn
|
|
7431
|
-
? (orgAccessTitle ?? "
|
|
7432
|
-
: "
|
|
7433
|
-
: "
|
|
7511
|
+
? (orgAccessTitle ?? t("plansPage.loadError.requestAccessTitle"))
|
|
7512
|
+
: t("plansPage.loadError.signInTitle")
|
|
7513
|
+
: t("plansPage.loadError.didNotLoadTitle");
|
|
7434
7514
|
const body = planMissing
|
|
7435
|
-
? "
|
|
7515
|
+
? t("plansPage.loadError.notFoundBody")
|
|
7436
7516
|
: showAccessHelp
|
|
7437
7517
|
? orgAccessBody
|
|
7438
7518
|
? orgAccessBody
|
|
7439
7519
|
: signedIn
|
|
7440
7520
|
? planExists
|
|
7441
|
-
? "
|
|
7442
|
-
: "
|
|
7443
|
-
: "
|
|
7521
|
+
? t("plansPage.loadError.noAccessBody")
|
|
7522
|
+
: t("plansPage.loadError.maybeOtherOrgBody")
|
|
7523
|
+
: t("plansPage.loadError.privateBody")
|
|
7444
7524
|
: message;
|
|
7445
7525
|
|
|
7446
7526
|
return (
|
|
@@ -7461,7 +7541,7 @@ function PlanLoadError({
|
|
|
7461
7541
|
<div className="mt-3 flex items-center gap-2 rounded-md border border-border bg-muted/35 px-3 py-2 text-sm">
|
|
7462
7542
|
<IconAt className="size-4 shrink-0 text-muted-foreground" />
|
|
7463
7543
|
<span className="min-w-0 truncate text-muted-foreground">
|
|
7464
|
-
|
|
7544
|
+
{t("plansPage.loadError.signedInAs")}{" "}
|
|
7465
7545
|
<span className="font-medium text-foreground">
|
|
7466
7546
|
{signedInEmail}
|
|
7467
7547
|
</span>
|
|
@@ -7470,14 +7550,12 @@ function PlanLoadError({
|
|
|
7470
7550
|
) : null}
|
|
7471
7551
|
{accessRequestSent ? (
|
|
7472
7552
|
<div className="mt-3 rounded-md border border-emerald-500/25 bg-emerald-500/10 px-3 py-2 text-sm text-emerald-700 dark:text-emerald-300">
|
|
7473
|
-
|
|
7474
|
-
owner grants access.
|
|
7553
|
+
{t("plansPage.loadError.accessRequestSent")}
|
|
7475
7554
|
</div>
|
|
7476
7555
|
) : null}
|
|
7477
7556
|
{!showAccessHelp && !planMissing ? (
|
|
7478
7557
|
<p className="mt-2 text-xs leading-5 text-muted-foreground">
|
|
7479
|
-
|
|
7480
|
-
private plan link.
|
|
7558
|
+
{t("plansPage.loadError.retryHelp")}
|
|
7481
7559
|
</p>
|
|
7482
7560
|
) : null}
|
|
7483
7561
|
</div>
|
|
@@ -7507,7 +7585,7 @@ function PlanLoadError({
|
|
|
7507
7585
|
) : (
|
|
7508
7586
|
<GoogleLogoIcon className="size-[18px]" />
|
|
7509
7587
|
)}
|
|
7510
|
-
|
|
7588
|
+
{t("plansPage.loadError.continueWithGoogle")}
|
|
7511
7589
|
</Button>
|
|
7512
7590
|
)}
|
|
7513
7591
|
{signedIn ? (
|
|
@@ -7519,7 +7597,7 @@ function PlanLoadError({
|
|
|
7519
7597
|
disabled={googlePending}
|
|
7520
7598
|
>
|
|
7521
7599
|
<IconLogin2 className="size-4" />
|
|
7522
|
-
|
|
7600
|
+
{t("plansPage.loadError.switchAccount")}
|
|
7523
7601
|
</Button>
|
|
7524
7602
|
</div>
|
|
7525
7603
|
) : null}
|
|
@@ -7532,7 +7610,7 @@ function PlanLoadError({
|
|
|
7532
7610
|
>
|
|
7533
7611
|
<span className="inline-flex items-center gap-2">
|
|
7534
7612
|
<IconMail className="size-4" />
|
|
7535
|
-
|
|
7613
|
+
{t("plansPage.loadError.signInWithEmail")}
|
|
7536
7614
|
</span>
|
|
7537
7615
|
<IconChevronDown
|
|
7538
7616
|
className={cn(
|
|
@@ -7548,7 +7626,9 @@ function PlanLoadError({
|
|
|
7548
7626
|
onSubmit={submitEmailAuth}
|
|
7549
7627
|
>
|
|
7550
7628
|
<div className="space-y-1.5">
|
|
7551
|
-
<Label htmlFor="plan-access-email">
|
|
7629
|
+
<Label htmlFor="plan-access-email">
|
|
7630
|
+
{t("plansPage.loadError.email")}
|
|
7631
|
+
</Label>
|
|
7552
7632
|
<Input
|
|
7553
7633
|
id="plan-access-email"
|
|
7554
7634
|
type="email"
|
|
@@ -7559,7 +7639,9 @@ function PlanLoadError({
|
|
|
7559
7639
|
/>
|
|
7560
7640
|
</div>
|
|
7561
7641
|
<div className="space-y-1.5">
|
|
7562
|
-
<Label htmlFor="plan-access-password">
|
|
7642
|
+
<Label htmlFor="plan-access-password">
|
|
7643
|
+
{t("plansPage.loadError.password")}
|
|
7644
|
+
</Label>
|
|
7563
7645
|
<Input
|
|
7564
7646
|
id="plan-access-password"
|
|
7565
7647
|
type="password"
|
|
@@ -7592,8 +7674,8 @@ function PlanLoadError({
|
|
|
7592
7674
|
<IconLock className="size-4" />
|
|
7593
7675
|
)}
|
|
7594
7676
|
{emailMode === "create"
|
|
7595
|
-
? "
|
|
7596
|
-
: "
|
|
7677
|
+
? t("plansPage.loadError.createAccount")
|
|
7678
|
+
: t("plansPage.loadError.signIn")}
|
|
7597
7679
|
</Button>
|
|
7598
7680
|
<Button
|
|
7599
7681
|
type="button"
|
|
@@ -7607,8 +7689,8 @@ function PlanLoadError({
|
|
|
7607
7689
|
}}
|
|
7608
7690
|
>
|
|
7609
7691
|
{emailMode === "create"
|
|
7610
|
-
? "
|
|
7611
|
-
: "
|
|
7692
|
+
? t("plansPage.loadError.haveAccount")
|
|
7693
|
+
: t("plansPage.loadError.createAccount")}
|
|
7612
7694
|
</Button>
|
|
7613
7695
|
</div>
|
|
7614
7696
|
</form>
|
|
@@ -7619,7 +7701,7 @@ function PlanLoadError({
|
|
|
7619
7701
|
<div className="flex flex-wrap gap-2">
|
|
7620
7702
|
<Button type="button" variant="outline" onClick={onSignIn}>
|
|
7621
7703
|
<IconExternalLink className="size-4" />
|
|
7622
|
-
|
|
7704
|
+
{t("plansPage.loadError.signIn")}
|
|
7623
7705
|
</Button>
|
|
7624
7706
|
</div>
|
|
7625
7707
|
)}
|
|
@@ -7634,7 +7716,7 @@ function PlanLoadError({
|
|
|
7634
7716
|
className="mt-3 gap-1.5 text-muted-foreground hover:text-foreground"
|
|
7635
7717
|
>
|
|
7636
7718
|
<IconRefresh className="size-3.5" />
|
|
7637
|
-
|
|
7719
|
+
{t("plansPage.loadError.retry")}
|
|
7638
7720
|
</Button>
|
|
7639
7721
|
</div>
|
|
7640
7722
|
);
|
|
@@ -7653,6 +7735,7 @@ function SignedInPlanAccessActions({
|
|
|
7653
7735
|
requestAccessPending?: boolean;
|
|
7654
7736
|
accessRequestSent?: boolean;
|
|
7655
7737
|
}) {
|
|
7738
|
+
const t = useT();
|
|
7656
7739
|
const { data: org } = useOrg();
|
|
7657
7740
|
const acceptInvitation = useAcceptInvitation();
|
|
7658
7741
|
const joinByDomain = useJoinByDomain();
|
|
@@ -7668,7 +7751,9 @@ function SignedInPlanAccessActions({
|
|
|
7668
7751
|
|
|
7669
7752
|
const onSuccess = () => {
|
|
7670
7753
|
toast.success(
|
|
7671
|
-
|
|
7754
|
+
t("plansPage.loadError.joinedOrg", {
|
|
7755
|
+
orgName: orgAccessPrompt.organizationName,
|
|
7756
|
+
}),
|
|
7672
7757
|
);
|
|
7673
7758
|
onAccessResolved();
|
|
7674
7759
|
};
|
|
@@ -7688,18 +7773,33 @@ function SignedInPlanAccessActions({
|
|
|
7688
7773
|
const label = orgAccessPrompt
|
|
7689
7774
|
? orgAccessPending
|
|
7690
7775
|
? orgAccessPrompt.kind === "invitation"
|
|
7691
|
-
? "
|
|
7692
|
-
: "
|
|
7693
|
-
: orgAccessPrompt.
|
|
7776
|
+
? t("plansPage.loadError.acceptingInvite")
|
|
7777
|
+
: t("plansPage.loadError.joiningOrg")
|
|
7778
|
+
: orgAccessPrompt.kind === "invitation"
|
|
7779
|
+
? t("plansPage.loadError.acceptInvite")
|
|
7780
|
+
: t("plansPage.loadError.joinOrg", {
|
|
7781
|
+
orgName: orgAccessPrompt.organizationName,
|
|
7782
|
+
})
|
|
7694
7783
|
: accessRequestSent
|
|
7695
|
-
? "
|
|
7696
|
-
: "
|
|
7784
|
+
? t("plansPage.loadError.requestSent")
|
|
7785
|
+
: t("plansPage.loadError.requestAccess");
|
|
7697
7786
|
|
|
7698
7787
|
return (
|
|
7699
7788
|
<>
|
|
7700
7789
|
{orgAccessPrompt ? (
|
|
7701
7790
|
<div className="rounded-md border border-border bg-muted/35 px-3 py-2 text-sm leading-5 text-muted-foreground">
|
|
7702
|
-
{orgAccessPrompt.
|
|
7791
|
+
{orgAccessPrompt.kind === "invitation"
|
|
7792
|
+
? t("plansPage.loadError.inviteMessage", {
|
|
7793
|
+
orgName: orgAccessPrompt.organizationName,
|
|
7794
|
+
})
|
|
7795
|
+
: orgAccessPrompt.domain
|
|
7796
|
+
? t("plansPage.loadError.domainMessage", {
|
|
7797
|
+
domain: orgAccessPrompt.domain,
|
|
7798
|
+
orgName: orgAccessPrompt.organizationName,
|
|
7799
|
+
})
|
|
7800
|
+
: t("plansPage.loadError.joinMessage", {
|
|
7801
|
+
orgName: orgAccessPrompt.organizationName,
|
|
7802
|
+
})}
|
|
7703
7803
|
</div>
|
|
7704
7804
|
) : null}
|
|
7705
7805
|
<Button type="button" onClick={handleOrgAccess} disabled={disabled}>
|
|
@@ -7726,25 +7826,16 @@ const PLAN_SKILL_INSTALL_COMMAND =
|
|
|
7726
7826
|
|
|
7727
7827
|
type PlanSkillDemo = {
|
|
7728
7828
|
command: string;
|
|
7729
|
-
label: string;
|
|
7730
|
-
description: string;
|
|
7731
|
-
videoAriaLabel: string;
|
|
7732
7829
|
videoUrl?: string;
|
|
7733
7830
|
};
|
|
7734
7831
|
|
|
7735
7832
|
const PLAN_SKILL_DEMOS: PlanSkillDemo[] = [
|
|
7736
7833
|
{
|
|
7737
7834
|
command: "/visual-plan",
|
|
7738
|
-
label: "Visual Plan",
|
|
7739
|
-
description: "Review the implementation shape before code changes land.",
|
|
7740
|
-
videoAriaLabel: "Visual Plan skill demo video",
|
|
7741
7835
|
videoUrl: import.meta.env.VITE_VISUAL_PLAN_SKILL_DEMO_VIDEO_URL,
|
|
7742
7836
|
},
|
|
7743
7837
|
{
|
|
7744
7838
|
command: "/visual-recap",
|
|
7745
|
-
label: "Visual Recap",
|
|
7746
|
-
description: "Turn a PR or diff into a shareable review recap.",
|
|
7747
|
-
videoAriaLabel: "Visual Recap skill demo video",
|
|
7748
7839
|
videoUrl: import.meta.env.VITE_VISUAL_RECAP_SKILL_DEMO_VIDEO_URL,
|
|
7749
7840
|
},
|
|
7750
7841
|
];
|
|
@@ -7756,6 +7847,7 @@ function EmptyPlan({
|
|
|
7756
7847
|
onCreate: () => void;
|
|
7757
7848
|
canCreate: boolean;
|
|
7758
7849
|
}) {
|
|
7850
|
+
const t = useT();
|
|
7759
7851
|
if (!canCreate) {
|
|
7760
7852
|
return <LoggedOutEmptyPlan />;
|
|
7761
7853
|
}
|
|
@@ -7767,22 +7859,21 @@ function EmptyPlan({
|
|
|
7767
7859
|
<IconClipboardText className="size-5 text-muted-foreground" />
|
|
7768
7860
|
</div>
|
|
7769
7861
|
<h2 className="mt-4 text-xl font-semibold tracking-tight">
|
|
7770
|
-
|
|
7862
|
+
{t("plansPage.empty.title")}
|
|
7771
7863
|
</h2>
|
|
7772
7864
|
<p className="mt-2 text-sm leading-6 text-muted-foreground">
|
|
7773
|
-
|
|
7774
|
-
wireframes, and comments before implementation starts.
|
|
7865
|
+
{t("plansPage.empty.description")}
|
|
7775
7866
|
</p>
|
|
7776
7867
|
<Button className="mt-5" onClick={onCreate}>
|
|
7777
7868
|
<IconPlus className="size-4" />
|
|
7778
|
-
|
|
7869
|
+
{t("plansPage.empty.newPlan")}
|
|
7779
7870
|
</Button>
|
|
7780
7871
|
<p className="mt-3 text-xs text-muted-foreground/70">
|
|
7781
|
-
|
|
7872
|
+
{t("plansPage.empty.installPrefix")}{" "}
|
|
7782
7873
|
<code className="rounded bg-muted/60 px-1 py-0.5 font-mono text-[11px]">
|
|
7783
7874
|
/visual-plan
|
|
7784
7875
|
</code>{" "}
|
|
7785
|
-
|
|
7876
|
+
{t("plansPage.empty.installSuffix")}
|
|
7786
7877
|
<br />
|
|
7787
7878
|
<code className="mt-1 inline-block rounded bg-muted/60 px-1 py-0.5 font-mono text-[11px]">
|
|
7788
7879
|
{PLAN_SKILL_INSTALL_COMMAND}
|
|
@@ -7794,6 +7885,7 @@ function EmptyPlan({
|
|
|
7794
7885
|
}
|
|
7795
7886
|
|
|
7796
7887
|
function PlanSkillDemoVideo({ demo }: { demo: PlanSkillDemo }) {
|
|
7888
|
+
const t = useT();
|
|
7797
7889
|
const [isLoaded, setIsLoaded] = useState(false);
|
|
7798
7890
|
if (!demo.videoUrl) return null;
|
|
7799
7891
|
|
|
@@ -7811,9 +7903,11 @@ function PlanSkillDemoVideo({ demo }: { demo: PlanSkillDemo }) {
|
|
|
7811
7903
|
<article className="flex min-w-0 flex-col overflow-hidden rounded-lg border border-border bg-card text-left">
|
|
7812
7904
|
<div className="flex items-start justify-between gap-3 p-3">
|
|
7813
7905
|
<div className="min-w-0">
|
|
7814
|
-
<p className="text-sm font-medium text-foreground">
|
|
7906
|
+
<p className="text-sm font-medium text-foreground">
|
|
7907
|
+
{t(`plansPage.skillDemos.${demo.command.slice(1)}.label`)}
|
|
7908
|
+
</p>
|
|
7815
7909
|
<p className="mt-1 min-h-10 text-xs leading-5 text-muted-foreground">
|
|
7816
|
-
{demo.description}
|
|
7910
|
+
{t(`plansPage.skillDemos.${demo.command.slice(1)}.description`)}
|
|
7817
7911
|
</p>
|
|
7818
7912
|
</div>
|
|
7819
7913
|
<code className="shrink-0 rounded bg-muted/70 px-1.5 py-1 font-mono text-[11px] text-muted-foreground">
|
|
@@ -7823,7 +7917,9 @@ function PlanSkillDemoVideo({ demo }: { demo: PlanSkillDemo }) {
|
|
|
7823
7917
|
<div className="relative aspect-[1189/1080] overflow-hidden bg-muted">
|
|
7824
7918
|
<video
|
|
7825
7919
|
src={demo.videoUrl}
|
|
7826
|
-
aria-label={
|
|
7920
|
+
aria-label={t(
|
|
7921
|
+
`plansPage.skillDemos.${demo.command.slice(1)}.videoAriaLabel`,
|
|
7922
|
+
)}
|
|
7827
7923
|
autoPlay
|
|
7828
7924
|
muted
|
|
7829
7925
|
loop
|
|
@@ -7858,6 +7954,7 @@ function PlanSkillDemoVideo({ demo }: { demo: PlanSkillDemo }) {
|
|
|
7858
7954
|
}
|
|
7859
7955
|
|
|
7860
7956
|
function LoggedOutEmptyPlan() {
|
|
7957
|
+
const t = useT();
|
|
7861
7958
|
const [installCommandCopied, setInstallCommandCopied] = useState(false);
|
|
7862
7959
|
const copyResetTimeoutRef = useRef<number | null>(null);
|
|
7863
7960
|
|
|
@@ -7873,7 +7970,7 @@ function LoggedOutEmptyPlan() {
|
|
|
7873
7970
|
try {
|
|
7874
7971
|
await navigator.clipboard.writeText(PLAN_SKILL_INSTALL_COMMAND);
|
|
7875
7972
|
setInstallCommandCopied(true);
|
|
7876
|
-
toast.success("
|
|
7973
|
+
toast.success(t("plansPage.loggedOut.installCopied"));
|
|
7877
7974
|
if (copyResetTimeoutRef.current) {
|
|
7878
7975
|
window.clearTimeout(copyResetTimeoutRef.current);
|
|
7879
7976
|
}
|
|
@@ -7881,7 +7978,7 @@ function LoggedOutEmptyPlan() {
|
|
|
7881
7978
|
setInstallCommandCopied(false);
|
|
7882
7979
|
}, 2200);
|
|
7883
7980
|
} catch {
|
|
7884
|
-
toast.error("
|
|
7981
|
+
toast.error(t("plansPage.loggedOut.installCopyFailed"));
|
|
7885
7982
|
}
|
|
7886
7983
|
}, []);
|
|
7887
7984
|
|
|
@@ -7889,11 +7986,10 @@ function LoggedOutEmptyPlan() {
|
|
|
7889
7986
|
<div className="flex min-h-full items-center justify-center overflow-auto p-4 sm:p-8">
|
|
7890
7987
|
<div className="flex w-full max-w-4xl flex-col items-center gap-3 py-8 text-center">
|
|
7891
7988
|
<h2 className="text-2xl font-semibold tracking-tight">
|
|
7892
|
-
|
|
7989
|
+
{t("plansPage.loggedOut.title")}
|
|
7893
7990
|
</h2>
|
|
7894
7991
|
<p className="max-w-md text-sm leading-6 text-muted-foreground">
|
|
7895
|
-
|
|
7896
|
-
command to create your first review plan.
|
|
7992
|
+
{t("plansPage.loggedOut.description")}
|
|
7897
7993
|
</p>
|
|
7898
7994
|
<div className="mt-1 flex w-full max-w-xl items-center gap-2 rounded-md bg-muted/40 p-1.5 text-left">
|
|
7899
7995
|
<code className="min-w-0 flex-1 overflow-x-auto px-2 py-1 font-mono text-xs leading-5 text-foreground">
|
|
@@ -7907,8 +8003,8 @@ function LoggedOutEmptyPlan() {
|
|
|
7907
8003
|
className="h-8 min-w-20 shrink-0 gap-1.5 px-2 text-xs text-muted-foreground hover:text-foreground"
|
|
7908
8004
|
aria-label={
|
|
7909
8005
|
installCommandCopied
|
|
7910
|
-
? "
|
|
7911
|
-
: "
|
|
8006
|
+
? t("plansPage.loggedOut.installCopied")
|
|
8007
|
+
: t("plansPage.loggedOut.copyInstallCommand")
|
|
7912
8008
|
}
|
|
7913
8009
|
>
|
|
7914
8010
|
{installCommandCopied ? (
|
|
@@ -7916,7 +8012,9 @@ function LoggedOutEmptyPlan() {
|
|
|
7916
8012
|
) : (
|
|
7917
8013
|
<IconCopy className="size-3.5" />
|
|
7918
8014
|
)}
|
|
7919
|
-
{installCommandCopied
|
|
8015
|
+
{installCommandCopied
|
|
8016
|
+
? t("plansPage.loggedOut.copied")
|
|
8017
|
+
: t("plansPage.loggedOut.copy")}
|
|
7920
8018
|
</Button>
|
|
7921
8019
|
</div>
|
|
7922
8020
|
<div className="grid w-full gap-3 pt-2 sm:grid-cols-2">
|
|
@@ -7932,7 +8030,7 @@ function LoggedOutEmptyPlan() {
|
|
|
7932
8030
|
>
|
|
7933
8031
|
<a href={PLAN_DOCS_URL} target="_blank" rel="noreferrer">
|
|
7934
8032
|
<IconExternalLink className="size-4" />
|
|
7935
|
-
|
|
8033
|
+
{t("plansPage.loggedOut.viewDocs")}
|
|
7936
8034
|
</a>
|
|
7937
8035
|
</Button>
|
|
7938
8036
|
</div>
|
|
@@ -7963,6 +8061,7 @@ function PlansOverview({
|
|
|
7963
8061
|
onRestore: (plan: DeletePlanTarget) => void;
|
|
7964
8062
|
onSignIn?: () => void;
|
|
7965
8063
|
}) {
|
|
8064
|
+
const t = useT();
|
|
7966
8065
|
const [filter, setFilter] = useState<OverviewFilter>("all");
|
|
7967
8066
|
const [search, setSearch] = useState("");
|
|
7968
8067
|
const [author, setAuthor] = useState<string>("all");
|
|
@@ -8036,15 +8135,19 @@ function PlansOverview({
|
|
|
8036
8135
|
<div className="flex items-center justify-between gap-3">
|
|
8037
8136
|
<div className="min-w-0">
|
|
8038
8137
|
<h1 className="truncate text-xl font-semibold tracking-tight">
|
|
8039
|
-
|
|
8138
|
+
{t("plansPage.overview.title")}
|
|
8040
8139
|
</h1>
|
|
8041
8140
|
<p className="text-sm text-muted-foreground">
|
|
8042
|
-
{
|
|
8141
|
+
{t("plansPage.overview.documentCount", {
|
|
8142
|
+
count: totalVisible,
|
|
8143
|
+
})}
|
|
8043
8144
|
</p>
|
|
8044
8145
|
</div>
|
|
8045
8146
|
<Button type="button" onClick={onCreate}>
|
|
8046
8147
|
<IconPlus className="size-4" />
|
|
8047
|
-
{canCreate
|
|
8148
|
+
{canCreate
|
|
8149
|
+
? t("plansPage.overview.newPlan")
|
|
8150
|
+
: t("plansPage.overview.signInToCreate")}
|
|
8048
8151
|
</Button>
|
|
8049
8152
|
</div>
|
|
8050
8153
|
|
|
@@ -8054,12 +8157,20 @@ function PlansOverview({
|
|
|
8054
8157
|
onValueChange={(v) => setFilter(v as OverviewFilter)}
|
|
8055
8158
|
>
|
|
8056
8159
|
<TabsList>
|
|
8057
|
-
<TabsTrigger value="all">
|
|
8058
|
-
|
|
8059
|
-
|
|
8060
|
-
<TabsTrigger value="
|
|
8160
|
+
<TabsTrigger value="all">
|
|
8161
|
+
{t("plansPage.overview.tabs.all")}
|
|
8162
|
+
</TabsTrigger>
|
|
8163
|
+
<TabsTrigger value="plans">
|
|
8164
|
+
{t("plansPage.overview.tabs.plans")}
|
|
8165
|
+
</TabsTrigger>
|
|
8166
|
+
<TabsTrigger value="recaps">
|
|
8167
|
+
{t("plansPage.overview.tabs.recaps")}
|
|
8168
|
+
</TabsTrigger>
|
|
8169
|
+
<TabsTrigger value="archived">
|
|
8170
|
+
{t("plansPage.overview.tabs.archived")}
|
|
8171
|
+
</TabsTrigger>
|
|
8061
8172
|
<TabsTrigger value="deleted">
|
|
8062
|
-
|
|
8173
|
+
{t("plansPage.overview.tabs.deleted")}
|
|
8063
8174
|
{deletedPlans.length > 0 && (
|
|
8064
8175
|
<span className="ml-1 text-[11px] text-muted-foreground">
|
|
8065
8176
|
{deletedPlans.length}
|
|
@@ -8072,11 +8183,19 @@ function PlansOverview({
|
|
|
8072
8183
|
{authorEmails.length > 1 && (
|
|
8073
8184
|
<Select value={author} onValueChange={setAuthor}>
|
|
8074
8185
|
<SelectTrigger className="h-9 w-[170px] text-sm">
|
|
8075
|
-
<SelectValue
|
|
8186
|
+
<SelectValue
|
|
8187
|
+
placeholder={t("plansPage.overview.createdBy")}
|
|
8188
|
+
/>
|
|
8076
8189
|
</SelectTrigger>
|
|
8077
8190
|
<SelectContent>
|
|
8078
|
-
<SelectItem value="all">
|
|
8079
|
-
|
|
8191
|
+
<SelectItem value="all">
|
|
8192
|
+
{t("plansPage.overview.allAuthors")}
|
|
8193
|
+
</SelectItem>
|
|
8194
|
+
{hasMine && (
|
|
8195
|
+
<SelectItem value="me">
|
|
8196
|
+
{t("plansPage.overview.me")}
|
|
8197
|
+
</SelectItem>
|
|
8198
|
+
)}
|
|
8080
8199
|
{authorEmails
|
|
8081
8200
|
.filter(
|
|
8082
8201
|
(email) =>
|
|
@@ -8098,7 +8217,7 @@ function PlansOverview({
|
|
|
8098
8217
|
<IconSearch className="pointer-events-none absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" />
|
|
8099
8218
|
<Input
|
|
8100
8219
|
type="search"
|
|
8101
|
-
placeholder="
|
|
8220
|
+
placeholder={t("plansPage.overview.searchPlaceholder")}
|
|
8102
8221
|
value={search}
|
|
8103
8222
|
onChange={(e) => setSearch(e.target.value)}
|
|
8104
8223
|
className="h-9 pl-8 text-sm"
|
|
@@ -8109,12 +8228,12 @@ function PlansOverview({
|
|
|
8109
8228
|
{visiblePlans.length === 0 ? (
|
|
8110
8229
|
<div className="py-12 text-center text-sm text-muted-foreground">
|
|
8111
8230
|
{search.trim()
|
|
8112
|
-
? "
|
|
8231
|
+
? t("plansPage.overview.empty.noMatch")
|
|
8113
8232
|
: filter === "archived"
|
|
8114
|
-
? "
|
|
8233
|
+
? t("plansPage.overview.empty.noArchived")
|
|
8115
8234
|
: filter === "deleted"
|
|
8116
|
-
? "
|
|
8117
|
-
: "
|
|
8235
|
+
? t("plansPage.overview.empty.noDeleted")
|
|
8236
|
+
: t("plansPage.overview.empty.noPlans")}
|
|
8118
8237
|
</div>
|
|
8119
8238
|
) : (
|
|
8120
8239
|
<div className="grid gap-3 md:grid-cols-2">
|
|
@@ -8133,7 +8252,7 @@ function PlansOverview({
|
|
|
8133
8252
|
variant="outline"
|
|
8134
8253
|
className="shrink-0 text-[10px]"
|
|
8135
8254
|
>
|
|
8136
|
-
|
|
8255
|
+
{t("plansPage.overview.recapBadge")}
|
|
8137
8256
|
</Badge>
|
|
8138
8257
|
)}
|
|
8139
8258
|
{isDeleted && (
|
|
@@ -8141,7 +8260,7 @@ function PlansOverview({
|
|
|
8141
8260
|
variant="outline"
|
|
8142
8261
|
className="shrink-0 border-destructive/30 text-[10px] text-destructive"
|
|
8143
8262
|
>
|
|
8144
|
-
|
|
8263
|
+
{t("plansPage.overview.deletedBadge")}
|
|
8145
8264
|
</Badge>
|
|
8146
8265
|
)}
|
|
8147
8266
|
</div>
|
|
@@ -8157,7 +8276,11 @@ function PlansOverview({
|
|
|
8157
8276
|
</div>
|
|
8158
8277
|
<div className="mt-4 flex items-center gap-2 text-xs text-muted-foreground">
|
|
8159
8278
|
{isDeleted ? (
|
|
8160
|
-
<span>
|
|
8279
|
+
<span>
|
|
8280
|
+
{t("plansPage.overview.deletedAt", {
|
|
8281
|
+
date: shortDate(plan.deletedAt ?? ""),
|
|
8282
|
+
})}
|
|
8283
|
+
</span>
|
|
8161
8284
|
) : ENABLE_PLAN_STATUS_FEATURE ? (
|
|
8162
8285
|
<>
|
|
8163
8286
|
<span>{statusLabel(plan.status)}</span>
|
|
@@ -8227,7 +8350,8 @@ function PlansOverview({
|
|
|
8227
8350
|
<button
|
|
8228
8351
|
type="button"
|
|
8229
8352
|
className="flex size-7 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
8230
|
-
|
|
8353
|
+
data-plan-actions-trigger
|
|
8354
|
+
aria-label={t("plansPage.overview.planActions")}
|
|
8231
8355
|
>
|
|
8232
8356
|
<IconDots className="size-4" />
|
|
8233
8357
|
</button>
|
|
@@ -8243,7 +8367,7 @@ function PlansOverview({
|
|
|
8243
8367
|
disabled={!plan.canDelete}
|
|
8244
8368
|
>
|
|
8245
8369
|
<IconRestore className="size-4" />
|
|
8246
|
-
|
|
8370
|
+
{t("plansPage.overview.restore")}
|
|
8247
8371
|
</DropdownMenuItem>
|
|
8248
8372
|
<DropdownMenuItem
|
|
8249
8373
|
onClick={(e) => {
|
|
@@ -8254,7 +8378,7 @@ function PlansOverview({
|
|
|
8254
8378
|
className="text-destructive focus:text-destructive"
|
|
8255
8379
|
>
|
|
8256
8380
|
<IconTrash className="size-4" />
|
|
8257
|
-
|
|
8381
|
+
{t("plansPage.overview.deletePermanently")}
|
|
8258
8382
|
</DropdownMenuItem>
|
|
8259
8383
|
</>
|
|
8260
8384
|
) : (
|
|
@@ -8267,7 +8391,7 @@ function PlansOverview({
|
|
|
8267
8391
|
}}
|
|
8268
8392
|
>
|
|
8269
8393
|
<IconArchiveOff className="size-4" />
|
|
8270
|
-
|
|
8394
|
+
{t("plansPage.overview.unarchive")}
|
|
8271
8395
|
</DropdownMenuItem>
|
|
8272
8396
|
) : (
|
|
8273
8397
|
<DropdownMenuItem
|
|
@@ -8277,7 +8401,7 @@ function PlansOverview({
|
|
|
8277
8401
|
}}
|
|
8278
8402
|
>
|
|
8279
8403
|
<IconArchive className="size-4" />
|
|
8280
|
-
|
|
8404
|
+
{t("plansPage.overview.archive")}
|
|
8281
8405
|
</DropdownMenuItem>
|
|
8282
8406
|
)}
|
|
8283
8407
|
{plan.canDelete && (
|
|
@@ -8291,7 +8415,7 @@ function PlansOverview({
|
|
|
8291
8415
|
className="text-destructive focus:text-destructive"
|
|
8292
8416
|
>
|
|
8293
8417
|
<IconTrash className="size-4" />
|
|
8294
|
-
|
|
8418
|
+
{t("plansPage.overview.delete")}
|
|
8295
8419
|
</DropdownMenuItem>
|
|
8296
8420
|
</>
|
|
8297
8421
|
)}
|
|
@@ -8350,11 +8474,18 @@ function PlansOverviewSkeleton() {
|
|
|
8350
8474
|
);
|
|
8351
8475
|
}
|
|
8352
8476
|
|
|
8353
|
-
function planVersionSurfaceLabel(
|
|
8354
|
-
|
|
8355
|
-
|
|
8356
|
-
|
|
8357
|
-
|
|
8477
|
+
function planVersionSurfaceLabel(
|
|
8478
|
+
version: PlanVersionSummary,
|
|
8479
|
+
t: ReturnType<typeof useT>,
|
|
8480
|
+
) {
|
|
8481
|
+
if (version.hasPrototype) return t("plansPage.history.surface.prototype");
|
|
8482
|
+
if (version.hasCanvas) return t("plansPage.history.surface.canvas");
|
|
8483
|
+
if (version.blockCount > 0) {
|
|
8484
|
+
return t("plansPage.history.surface.blocks", { count: version.blockCount });
|
|
8485
|
+
}
|
|
8486
|
+
return t("plansPage.history.surface.sections", {
|
|
8487
|
+
count: version.sectionCount,
|
|
8488
|
+
});
|
|
8358
8489
|
}
|
|
8359
8490
|
|
|
8360
8491
|
function PlanHistorySheet({
|
|
@@ -8368,6 +8499,7 @@ function PlanHistorySheet({
|
|
|
8368
8499
|
onOpenChange: (open: boolean) => void;
|
|
8369
8500
|
canRestore: boolean;
|
|
8370
8501
|
}) {
|
|
8502
|
+
const t = useT();
|
|
8371
8503
|
const [selectedVersionId, setSelectedVersionId] = useState<string | null>(
|
|
8372
8504
|
null,
|
|
8373
8505
|
);
|
|
@@ -8413,14 +8545,14 @@ function PlanHistorySheet({
|
|
|
8413
8545
|
if (!versionId) return;
|
|
8414
8546
|
try {
|
|
8415
8547
|
await restoreVersion.mutateAsync({ planId, versionId });
|
|
8416
|
-
toast.success("
|
|
8548
|
+
toast.success(t("plansPage.history.restoreSuccess"));
|
|
8417
8549
|
setRestoreCandidateId(null);
|
|
8418
8550
|
close(false);
|
|
8419
8551
|
} catch (error) {
|
|
8420
8552
|
toast.error(
|
|
8421
8553
|
error instanceof Error
|
|
8422
8554
|
? error.message.replace(/^Action [\w-]+ failed:\s*/, "")
|
|
8423
|
-
: "
|
|
8555
|
+
: t("plansPage.history.restoreFailed"),
|
|
8424
8556
|
);
|
|
8425
8557
|
}
|
|
8426
8558
|
};
|
|
@@ -8440,17 +8572,17 @@ function PlanHistorySheet({
|
|
|
8440
8572
|
className="inline-flex min-w-0 items-center gap-1.5 text-muted-foreground transition-colors hover:text-foreground"
|
|
8441
8573
|
>
|
|
8442
8574
|
<IconArrowLeft className="size-4" />
|
|
8443
|
-
<span>
|
|
8575
|
+
<span>{t("plansPage.history.back")}</span>
|
|
8444
8576
|
</button>
|
|
8445
8577
|
) : (
|
|
8446
8578
|
<>
|
|
8447
8579
|
<IconHistory className="size-4 text-primary" />
|
|
8448
|
-
<span>
|
|
8580
|
+
<span>{t("plansPage.history.title")}</span>
|
|
8449
8581
|
</>
|
|
8450
8582
|
)}
|
|
8451
8583
|
</SheetTitle>
|
|
8452
8584
|
<SheetDescription className="sr-only">
|
|
8453
|
-
|
|
8585
|
+
{t("plansPage.history.description")}
|
|
8454
8586
|
</SheetDescription>
|
|
8455
8587
|
</SheetHeader>
|
|
8456
8588
|
<Separator className="mt-3" />
|
|
@@ -8466,12 +8598,13 @@ function PlanHistorySheet({
|
|
|
8466
8598
|
) : (
|
|
8467
8599
|
<>
|
|
8468
8600
|
<p className="truncate text-sm font-medium">
|
|
8469
|
-
{selectedVersion?.title ||
|
|
8601
|
+
{selectedVersion?.title ||
|
|
8602
|
+
t("plansPage.history.untitled")}
|
|
8470
8603
|
</p>
|
|
8471
8604
|
<p className="mt-0.5 text-[11px] text-muted-foreground">
|
|
8472
8605
|
{selectedVersion
|
|
8473
|
-
? `${shortDate(selectedVersion.createdAt)} · ${planVersionSurfaceLabel(selectedVersion)}`
|
|
8474
|
-
: "
|
|
8606
|
+
? `${shortDate(selectedVersion.createdAt)} · ${planVersionSurfaceLabel(selectedVersion, t)}`
|
|
8607
|
+
: t("plansPage.history.snapshotUnavailable")}
|
|
8475
8608
|
</p>
|
|
8476
8609
|
</>
|
|
8477
8610
|
)}
|
|
@@ -8495,7 +8628,7 @@ function PlanHistorySheet({
|
|
|
8495
8628
|
/>
|
|
8496
8629
|
) : selectedVersion?.html ? (
|
|
8497
8630
|
<iframe
|
|
8498
|
-
title="
|
|
8631
|
+
title={t("plansPage.history.previewTitle")}
|
|
8499
8632
|
srcDoc={selectedVersion.html}
|
|
8500
8633
|
// Stored plan HTML is agent-authored and may carry
|
|
8501
8634
|
// prompt-injected markup. Match the main document iframe
|
|
@@ -8508,7 +8641,7 @@ function PlanHistorySheet({
|
|
|
8508
8641
|
/>
|
|
8509
8642
|
) : (
|
|
8510
8643
|
<div className="px-6 py-14 text-center text-sm text-muted-foreground">
|
|
8511
|
-
|
|
8644
|
+
{t("plansPage.history.noPreview")}
|
|
8512
8645
|
</div>
|
|
8513
8646
|
)}
|
|
8514
8647
|
</ScrollArea>
|
|
@@ -8528,10 +8661,10 @@ function PlanHistorySheet({
|
|
|
8528
8661
|
) : (
|
|
8529
8662
|
<IconRestore className="size-4" />
|
|
8530
8663
|
)}
|
|
8531
|
-
|
|
8664
|
+
{t("plansPage.history.restoreThisVersion")}
|
|
8532
8665
|
</Button>
|
|
8533
8666
|
<p className="mt-2 text-center text-[11px] text-muted-foreground">
|
|
8534
|
-
|
|
8667
|
+
{t("plansPage.history.savedFirst")}
|
|
8535
8668
|
</p>
|
|
8536
8669
|
</div>
|
|
8537
8670
|
) : null}
|
|
@@ -8597,10 +8730,11 @@ function PlanHistorySheet({
|
|
|
8597
8730
|
<div className="min-w-0 flex-1">
|
|
8598
8731
|
<div className="flex min-w-0 items-center gap-2 pr-7">
|
|
8599
8732
|
<p className="truncate text-sm font-medium">
|
|
8600
|
-
{version.title ||
|
|
8733
|
+
{version.title ||
|
|
8734
|
+
t("plansPage.history.untitled")}
|
|
8601
8735
|
</p>
|
|
8602
8736
|
<span className="shrink-0 text-[10px] text-muted-foreground">
|
|
8603
|
-
{planVersionSurfaceLabel(version)}
|
|
8737
|
+
{planVersionSurfaceLabel(version, t)}
|
|
8604
8738
|
</span>
|
|
8605
8739
|
</div>
|
|
8606
8740
|
<p className="mt-0.5 text-[11px] text-muted-foreground">
|
|
@@ -8626,7 +8760,9 @@ function PlanHistorySheet({
|
|
|
8626
8760
|
<button
|
|
8627
8761
|
type="button"
|
|
8628
8762
|
className="flex size-7 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
8629
|
-
aria-label=
|
|
8763
|
+
aria-label={t(
|
|
8764
|
+
"plansPage.history.versionActions",
|
|
8765
|
+
)}
|
|
8630
8766
|
>
|
|
8631
8767
|
<IconDots className="size-4" />
|
|
8632
8768
|
</button>
|
|
@@ -8639,7 +8775,7 @@ function PlanHistorySheet({
|
|
|
8639
8775
|
}}
|
|
8640
8776
|
>
|
|
8641
8777
|
<IconRestore className="size-4" />
|
|
8642
|
-
|
|
8778
|
+
{t("plansPage.history.restoreThisVersion")}
|
|
8643
8779
|
</DropdownMenuItem>
|
|
8644
8780
|
</DropdownMenuContent>
|
|
8645
8781
|
</DropdownMenu>
|
|
@@ -8652,9 +8788,11 @@ function PlanHistorySheet({
|
|
|
8652
8788
|
) : (
|
|
8653
8789
|
<div className="px-6 py-14 text-center">
|
|
8654
8790
|
<IconHistory className="mx-auto mb-3 size-6 text-muted-foreground/60" />
|
|
8655
|
-
<p className="text-sm font-medium">
|
|
8791
|
+
<p className="text-sm font-medium">
|
|
8792
|
+
{t("plansPage.history.noVersions")}
|
|
8793
|
+
</p>
|
|
8656
8794
|
<p className="mt-1 text-xs leading-5 text-muted-foreground">
|
|
8657
|
-
|
|
8795
|
+
{t("plansPage.history.noVersionsDescription")}
|
|
8658
8796
|
</p>
|
|
8659
8797
|
</div>
|
|
8660
8798
|
)}
|
|
@@ -8670,19 +8808,20 @@ function PlanHistorySheet({
|
|
|
8670
8808
|
>
|
|
8671
8809
|
<AlertDialogContent>
|
|
8672
8810
|
<AlertDialogHeader>
|
|
8673
|
-
<AlertDialogTitle>
|
|
8811
|
+
<AlertDialogTitle>
|
|
8812
|
+
{t("plansPage.history.restoreConfirmTitle")}
|
|
8813
|
+
</AlertDialogTitle>
|
|
8674
8814
|
<AlertDialogDescription>
|
|
8675
|
-
|
|
8676
|
-
|
|
8677
|
-
|
|
8678
|
-
|
|
8679
|
-
|
|
8680
|
-
this.
|
|
8815
|
+
{t("plansPage.history.restoreConfirmDescription", {
|
|
8816
|
+
date: restoreCandidate
|
|
8817
|
+
? shortDate(restoreCandidate.createdAt)
|
|
8818
|
+
: "",
|
|
8819
|
+
})}
|
|
8681
8820
|
</AlertDialogDescription>
|
|
8682
8821
|
</AlertDialogHeader>
|
|
8683
8822
|
<AlertDialogFooter>
|
|
8684
8823
|
<AlertDialogCancel disabled={restoreVersion.isPending}>
|
|
8685
|
-
|
|
8824
|
+
{t("plansPage.common.cancel")}
|
|
8686
8825
|
</AlertDialogCancel>
|
|
8687
8826
|
<AlertDialogAction
|
|
8688
8827
|
onClick={(event) => {
|
|
@@ -8691,7 +8830,9 @@ function PlanHistorySheet({
|
|
|
8691
8830
|
}}
|
|
8692
8831
|
disabled={restoreVersion.isPending}
|
|
8693
8832
|
>
|
|
8694
|
-
{restoreVersion.isPending
|
|
8833
|
+
{restoreVersion.isPending
|
|
8834
|
+
? t("plansPage.history.restoring")
|
|
8835
|
+
: t("plansPage.history.restore")}
|
|
8695
8836
|
</AlertDialogAction>
|
|
8696
8837
|
</AlertDialogFooter>
|
|
8697
8838
|
</AlertDialogContent>
|
|
@@ -8702,19 +8843,13 @@ function PlanHistorySheet({
|
|
|
8702
8843
|
|
|
8703
8844
|
const CREATE_PLAN_PROMPTS = [
|
|
8704
8845
|
{
|
|
8705
|
-
|
|
8706
|
-
prompt:
|
|
8707
|
-
"Plan a checkout review flow with desktop and mobile wireframes, key empty/loading/error states, comment prompts, and implementation notes.",
|
|
8846
|
+
id: "checkout",
|
|
8708
8847
|
},
|
|
8709
8848
|
{
|
|
8710
|
-
|
|
8711
|
-
prompt:
|
|
8712
|
-
"Create a UI flow plan for a settings redesign, including navigation states, risky interactions, review annotations, and code handoff notes.",
|
|
8849
|
+
id: "settings",
|
|
8713
8850
|
},
|
|
8714
8851
|
{
|
|
8715
|
-
|
|
8716
|
-
prompt:
|
|
8717
|
-
"# Implementation plan\n\nPaste the existing Codex or Claude Code plan here and turn it into a visual review document.",
|
|
8852
|
+
id: "imported",
|
|
8718
8853
|
},
|
|
8719
8854
|
] as const;
|
|
8720
8855
|
|
|
@@ -8746,8 +8881,6 @@ function isProbablyImportedPlan(prompt: string) {
|
|
|
8746
8881
|
|
|
8747
8882
|
function assessPlanPrompt(prompt: string): {
|
|
8748
8883
|
kind: AutoPlanKind;
|
|
8749
|
-
label: string;
|
|
8750
|
-
reason: string;
|
|
8751
8884
|
} {
|
|
8752
8885
|
let score = 0;
|
|
8753
8886
|
let ambiguitySignals = 0;
|
|
@@ -8799,34 +8932,38 @@ function assessPlanPrompt(prompt: string): {
|
|
|
8799
8932
|
if (uiDirection) {
|
|
8800
8933
|
return {
|
|
8801
8934
|
kind: "ui",
|
|
8802
|
-
label: "UI flow",
|
|
8803
|
-
reason:
|
|
8804
|
-
"Auto detected UI states or flows; the agent will make a wireframe-first plan.",
|
|
8805
8935
|
};
|
|
8806
8936
|
}
|
|
8807
8937
|
|
|
8808
8938
|
return {
|
|
8809
8939
|
kind: "visual",
|
|
8810
|
-
label: "General visual",
|
|
8811
|
-
reason:
|
|
8812
|
-
"Auto will ask the agent for a rich technical plan with diagrams and implementation detail.",
|
|
8813
8940
|
};
|
|
8814
8941
|
}
|
|
8815
8942
|
|
|
8816
|
-
function
|
|
8817
|
-
|
|
8818
|
-
|
|
8819
|
-
|
|
8943
|
+
function sourceOptionDisplayLabel(
|
|
8944
|
+
source: PlanSource,
|
|
8945
|
+
t: ReturnType<typeof useT>,
|
|
8946
|
+
) {
|
|
8947
|
+
return t(`plansPage.create.sourceOptions.${source}`);
|
|
8948
|
+
}
|
|
8949
|
+
|
|
8950
|
+
function planKindDisplayLabel(
|
|
8951
|
+
kind: CreatePlanKind,
|
|
8952
|
+
t: ReturnType<typeof useT>,
|
|
8953
|
+
) {
|
|
8954
|
+
return t(`plansPage.create.kindOptions.${kind}.label`);
|
|
8820
8955
|
}
|
|
8821
8956
|
|
|
8822
8957
|
function buildCreatePlanAgentMessage({
|
|
8823
8958
|
prompt,
|
|
8824
8959
|
source,
|
|
8825
8960
|
planKind,
|
|
8961
|
+
t,
|
|
8826
8962
|
}: {
|
|
8827
8963
|
prompt: string;
|
|
8828
8964
|
source: PlanSource;
|
|
8829
8965
|
planKind: CreatePlanKind;
|
|
8966
|
+
t: ReturnType<typeof useT>;
|
|
8830
8967
|
}) {
|
|
8831
8968
|
const imported = isProbablyImportedPlan(prompt);
|
|
8832
8969
|
const resolvedPlanKind =
|
|
@@ -8843,7 +8980,7 @@ function buildCreatePlanAgentMessage({
|
|
|
8843
8980
|
"Create an Agent-Native Plan from this request.",
|
|
8844
8981
|
"",
|
|
8845
8982
|
routing,
|
|
8846
|
-
`Source/provenance: ${
|
|
8983
|
+
`Source/provenance: ${sourceOptionDisplayLabel(source, t)}.`,
|
|
8847
8984
|
"",
|
|
8848
8985
|
"Use the Plan actions after you have enough substance. Generate the wireframes, diagrams, implementation map, review prompts, and concrete file/symbol notes yourself. Do not use placeholder file names, generic scaffold text, or browser-generated fallback sections as the final plan content.",
|
|
8849
8986
|
"After creating the plan, open the plan link for review.",
|
|
@@ -8864,6 +9001,7 @@ function CreatePlanDialog({
|
|
|
8864
9001
|
canCreate: boolean;
|
|
8865
9002
|
onRequireSignIn: () => void;
|
|
8866
9003
|
}) {
|
|
9004
|
+
const t = useT();
|
|
8867
9005
|
const [source, setSource] = useState<PlanSource>("codex");
|
|
8868
9006
|
const [planKind, setPlanKind] = useState<CreatePlanKind>("auto");
|
|
8869
9007
|
const [advancedOpen, setAdvancedOpen] = useState(false);
|
|
@@ -8892,33 +9030,30 @@ function CreatePlanDialog({
|
|
|
8892
9030
|
return;
|
|
8893
9031
|
}
|
|
8894
9032
|
if (agentMissing) {
|
|
8895
|
-
toast.message(
|
|
8896
|
-
"Connect the agent to run — add an API key or use Builder.",
|
|
8897
|
-
);
|
|
9033
|
+
toast.message(t("plansPage.create.agentMissing"));
|
|
8898
9034
|
return;
|
|
8899
9035
|
}
|
|
8900
9036
|
const prompt = value.trim();
|
|
8901
9037
|
if (!prompt) {
|
|
8902
|
-
toast.message("
|
|
9038
|
+
toast.message(t("plansPage.create.describeFirst"));
|
|
8903
9039
|
return;
|
|
8904
9040
|
}
|
|
8905
9041
|
sendToAgentChat({
|
|
8906
9042
|
type: "content",
|
|
8907
9043
|
submit: true,
|
|
8908
|
-
message: buildCreatePlanAgentMessage({ prompt, source, planKind }),
|
|
9044
|
+
message: buildCreatePlanAgentMessage({ prompt, source, planKind, t }),
|
|
8909
9045
|
});
|
|
8910
9046
|
onOpenChange(false);
|
|
8911
|
-
toast.success("
|
|
9047
|
+
toast.success(t("plansPage.create.sent"));
|
|
8912
9048
|
};
|
|
8913
9049
|
|
|
8914
9050
|
return (
|
|
8915
9051
|
<Dialog open={open} onOpenChange={onOpenChange}>
|
|
8916
9052
|
<DialogContent className="sm:max-w-[680px]">
|
|
8917
9053
|
<DialogHeader>
|
|
8918
|
-
<DialogTitle>
|
|
9054
|
+
<DialogTitle>{t("plansPage.create.title")}</DialogTitle>
|
|
8919
9055
|
<DialogDescription>
|
|
8920
|
-
|
|
8921
|
-
The Plan agent will generate the wireframes and review structure.
|
|
9056
|
+
{t("plansPage.create.description")}
|
|
8922
9057
|
</DialogDescription>
|
|
8923
9058
|
</DialogHeader>
|
|
8924
9059
|
<div className="grid gap-3">
|
|
@@ -8938,7 +9073,7 @@ function CreatePlanDialog({
|
|
|
8938
9073
|
disabled={composerLocked}
|
|
8939
9074
|
attachmentsEnabled={false}
|
|
8940
9075
|
showModelSelector={false}
|
|
8941
|
-
placeholder="
|
|
9076
|
+
placeholder={t("plansPage.create.placeholder")}
|
|
8942
9077
|
draftScope="plans:create-plan"
|
|
8943
9078
|
initialText={promptSeed}
|
|
8944
9079
|
initialTextKey={promptSeedKey}
|
|
@@ -8949,19 +9084,22 @@ function CreatePlanDialog({
|
|
|
8949
9084
|
<div className="flex flex-wrap gap-2">
|
|
8950
9085
|
{CREATE_PLAN_PROMPTS.map((preset) => (
|
|
8951
9086
|
<Button
|
|
8952
|
-
key={preset.
|
|
9087
|
+
key={preset.id}
|
|
8953
9088
|
type="button"
|
|
8954
9089
|
variant="outline"
|
|
8955
9090
|
size="sm"
|
|
8956
9091
|
className="h-8 rounded-full border-border/80 px-3 text-xs font-medium text-muted-foreground hover:text-foreground"
|
|
8957
9092
|
disabled={composerLocked}
|
|
8958
9093
|
onClick={() => {
|
|
8959
|
-
|
|
9094
|
+
const presetPrompt = t(
|
|
9095
|
+
`plansPage.create.presetPrompts.${preset.id}`,
|
|
9096
|
+
);
|
|
9097
|
+
setPromptSeed(presetPrompt);
|
|
8960
9098
|
setPromptSeedKey((key) => key + 1);
|
|
8961
|
-
setPromptText(
|
|
9099
|
+
setPromptText(presetPrompt);
|
|
8962
9100
|
}}
|
|
8963
9101
|
>
|
|
8964
|
-
{preset.
|
|
9102
|
+
{t(`plansPage.create.presets.${preset.id}`)}
|
|
8965
9103
|
</Button>
|
|
8966
9104
|
))}
|
|
8967
9105
|
</div>
|
|
@@ -8971,19 +9109,26 @@ function CreatePlanDialog({
|
|
|
8971
9109
|
type="button"
|
|
8972
9110
|
className="flex w-full items-center justify-between gap-3 rounded-lg px-1 py-1.5 text-left text-xs text-muted-foreground transition-colors hover:text-foreground"
|
|
8973
9111
|
>
|
|
8974
|
-
<span className="font-medium">
|
|
9112
|
+
<span className="font-medium">
|
|
9113
|
+
{t("plansPage.create.advanced")}
|
|
9114
|
+
</span>
|
|
8975
9115
|
<span className="flex min-w-0 items-center gap-2">
|
|
8976
9116
|
<span className="truncate">
|
|
8977
|
-
{
|
|
9117
|
+
{sourceOptionDisplayLabel(source, t)} ·{" "}
|
|
8978
9118
|
{planKind === "auto"
|
|
8979
9119
|
? promptAssessment
|
|
8980
|
-
?
|
|
8981
|
-
|
|
9120
|
+
? t("plansPage.create.autoWithLabel", {
|
|
9121
|
+
label: planKindDisplayLabel(
|
|
9122
|
+
promptAssessment.kind,
|
|
9123
|
+
t,
|
|
9124
|
+
),
|
|
9125
|
+
})
|
|
9126
|
+
: planKindDisplayLabel("auto", t)
|
|
8982
9127
|
: planKind === "ui"
|
|
8983
|
-
? "
|
|
9128
|
+
? planKindDisplayLabel("ui", t)
|
|
8984
9129
|
: planKind === "questions"
|
|
8985
|
-
? "
|
|
8986
|
-
: "
|
|
9130
|
+
? planKindDisplayLabel("questions", t)
|
|
9131
|
+
: planKindDisplayLabel("visual", t)}
|
|
8987
9132
|
</span>
|
|
8988
9133
|
<IconChevronDown
|
|
8989
9134
|
className={cn(
|
|
@@ -8998,30 +9143,30 @@ function CreatePlanDialog({
|
|
|
8998
9143
|
<div className="grid gap-3 rounded-lg border border-border/70 bg-muted/20 p-3 sm:grid-cols-2">
|
|
8999
9144
|
<div className="grid gap-1.5">
|
|
9000
9145
|
<span className="text-xs font-medium text-foreground">
|
|
9001
|
-
|
|
9146
|
+
{t("plansPage.create.source")}
|
|
9002
9147
|
</span>
|
|
9003
9148
|
<Select
|
|
9004
9149
|
value={source}
|
|
9005
9150
|
onValueChange={(value) => setSource(value as PlanSource)}
|
|
9006
9151
|
>
|
|
9007
|
-
<SelectTrigger aria-label="
|
|
9152
|
+
<SelectTrigger aria-label={t("plansPage.create.source")}>
|
|
9008
9153
|
<SelectValue />
|
|
9009
9154
|
</SelectTrigger>
|
|
9010
9155
|
<SelectContent>
|
|
9011
9156
|
{SOURCE_OPTIONS.map((option) => (
|
|
9012
9157
|
<SelectItem key={option.value} value={option.value}>
|
|
9013
|
-
{option.
|
|
9158
|
+
{sourceOptionDisplayLabel(option.value, t)}
|
|
9014
9159
|
</SelectItem>
|
|
9015
9160
|
))}
|
|
9016
9161
|
</SelectContent>
|
|
9017
9162
|
</Select>
|
|
9018
9163
|
<p className="text-xs leading-5 text-muted-foreground">
|
|
9019
|
-
|
|
9164
|
+
{t("plansPage.create.sourceHelp")}
|
|
9020
9165
|
</p>
|
|
9021
9166
|
</div>
|
|
9022
9167
|
<div className="grid gap-1.5">
|
|
9023
9168
|
<span className="text-xs font-medium text-foreground">
|
|
9024
|
-
|
|
9169
|
+
{t("plansPage.create.planningStyle")}
|
|
9025
9170
|
</span>
|
|
9026
9171
|
<Select
|
|
9027
9172
|
value={planKind}
|
|
@@ -9037,28 +9182,30 @@ function CreatePlanDialog({
|
|
|
9037
9182
|
)
|
|
9038
9183
|
}
|
|
9039
9184
|
>
|
|
9040
|
-
<SelectTrigger
|
|
9185
|
+
<SelectTrigger
|
|
9186
|
+
aria-label={t("plansPage.create.planningStyle")}
|
|
9187
|
+
>
|
|
9041
9188
|
<SelectValue />
|
|
9042
9189
|
</SelectTrigger>
|
|
9043
9190
|
<SelectContent>
|
|
9044
9191
|
<SelectItem value="auto">
|
|
9045
|
-
|
|
9192
|
+
{t("plansPage.create.kindOptions.auto.description")}
|
|
9046
9193
|
</SelectItem>
|
|
9047
9194
|
<SelectItem value="ui">
|
|
9048
|
-
|
|
9195
|
+
{t("plansPage.create.kindOptions.ui.description")}
|
|
9049
9196
|
</SelectItem>
|
|
9050
9197
|
<SelectItem value="questions">
|
|
9051
|
-
|
|
9198
|
+
{t(
|
|
9199
|
+
"plansPage.create.kindOptions.questions.description",
|
|
9200
|
+
)}
|
|
9052
9201
|
</SelectItem>
|
|
9053
9202
|
<SelectItem value="visual">
|
|
9054
|
-
|
|
9203
|
+
{t("plansPage.create.kindOptions.visual.description")}
|
|
9055
9204
|
</SelectItem>
|
|
9056
9205
|
</SelectContent>
|
|
9057
9206
|
</Select>
|
|
9058
9207
|
<p className="text-xs leading-5 text-muted-foreground">
|
|
9059
|
-
|
|
9060
|
-
context. Auto keeps the normal plan flow; choose Visual
|
|
9061
|
-
questions when you want intake first.
|
|
9208
|
+
{t("plansPage.create.planningHelp")}
|
|
9062
9209
|
</p>
|
|
9063
9210
|
</div>
|
|
9064
9211
|
</div>
|
|
@@ -9066,13 +9213,12 @@ function CreatePlanDialog({
|
|
|
9066
9213
|
</Collapsible>
|
|
9067
9214
|
{promptAssessment && planKind === "auto" ? (
|
|
9068
9215
|
<p className="px-1 text-xs text-muted-foreground">
|
|
9069
|
-
{promptAssessment.
|
|
9216
|
+
{t(`plansPage.create.assessment.${promptAssessment.kind}`)}
|
|
9070
9217
|
</p>
|
|
9071
9218
|
) : null}
|
|
9072
9219
|
{promptText.trim() && isProbablyImportedPlan(promptText) ? (
|
|
9073
9220
|
<p className="px-1 text-xs text-muted-foreground">
|
|
9074
|
-
|
|
9075
|
-
visual review structure.
|
|
9221
|
+
{t("plansPage.create.importDetected")}
|
|
9076
9222
|
</p>
|
|
9077
9223
|
) : null}
|
|
9078
9224
|
</div>
|
|
@@ -9208,6 +9354,7 @@ function CommentMentionEditor({
|
|
|
9208
9354
|
onChange: (draft: Pick<CommentDraft, "message" | "mentions">) => void;
|
|
9209
9355
|
onSubmitShortcut?: () => void;
|
|
9210
9356
|
}) {
|
|
9357
|
+
const t = useT();
|
|
9211
9358
|
const editorRef = useRef<HTMLDivElement>(null);
|
|
9212
9359
|
const activeQueryRef = useRef<ReturnType<typeof mentionQueryAtCaret>>(null);
|
|
9213
9360
|
const onChangeRef = useRef(onChange);
|
|
@@ -9336,16 +9483,16 @@ function CommentMentionEditor({
|
|
|
9336
9483
|
{suggestionsOpen && (
|
|
9337
9484
|
<div
|
|
9338
9485
|
role="listbox"
|
|
9339
|
-
aria-label="
|
|
9486
|
+
aria-label={t("plansPage.comments.mentionMember")}
|
|
9340
9487
|
className="absolute bottom-full left-0 z-50 mb-2 w-[min(320px,calc(100vw-48px))] overflow-hidden rounded-xl border border-border/80 bg-background/98 p-1 shadow-2xl backdrop-blur-xl"
|
|
9341
9488
|
>
|
|
9342
9489
|
{isLoading && members.length === 0 ? (
|
|
9343
9490
|
<div className="px-3 py-2 text-xs text-muted-foreground">
|
|
9344
|
-
|
|
9491
|
+
{t("plansPage.comments.searchingPeople")}
|
|
9345
9492
|
</div>
|
|
9346
9493
|
) : members.length === 0 ? (
|
|
9347
9494
|
<div className="px-3 py-2 text-xs text-muted-foreground">
|
|
9348
|
-
|
|
9495
|
+
{t("plansPage.comments.noMatchingMembers")}
|
|
9349
9496
|
</div>
|
|
9350
9497
|
) : (
|
|
9351
9498
|
members.map((member, index) => {
|
|
@@ -9392,6 +9539,7 @@ function ResolutionTargetToggle({
|
|
|
9392
9539
|
value: PlanCommentResolutionTarget;
|
|
9393
9540
|
onChange: (value: PlanCommentResolutionTarget) => void;
|
|
9394
9541
|
}) {
|
|
9542
|
+
const t = useT();
|
|
9395
9543
|
return (
|
|
9396
9544
|
<ToggleGroup
|
|
9397
9545
|
type="single"
|
|
@@ -9402,15 +9550,15 @@ function ResolutionTargetToggle({
|
|
|
9402
9550
|
variant="default"
|
|
9403
9551
|
size="sm"
|
|
9404
9552
|
className="w-fit gap-0.5 rounded-md border border-border/70 bg-muted/35 p-0.5"
|
|
9405
|
-
aria-label="
|
|
9553
|
+
aria-label={t("plansPage.comments.expectedResolver")}
|
|
9406
9554
|
>
|
|
9407
9555
|
<ToggleGroupItem value="agent" className="h-7 gap-1.5 px-2 text-xs">
|
|
9408
9556
|
<IconSend className="size-3.5" />
|
|
9409
|
-
|
|
9557
|
+
{t("plansPage.comments.agent")}
|
|
9410
9558
|
</ToggleGroupItem>
|
|
9411
9559
|
<ToggleGroupItem value="human" className="h-7 gap-1.5 px-2 text-xs">
|
|
9412
9560
|
<IconMessageCircle className="size-3.5" />
|
|
9413
|
-
|
|
9561
|
+
{t("plansPage.comments.human")}
|
|
9414
9562
|
</ToggleGroupItem>
|
|
9415
9563
|
</ToggleGroup>
|
|
9416
9564
|
);
|
|
@@ -9429,6 +9577,7 @@ function InlineCommentPopover({
|
|
|
9429
9577
|
onSubmit: (draft: CommentDraft) => Promise<void>;
|
|
9430
9578
|
lockToAgent?: boolean;
|
|
9431
9579
|
}) {
|
|
9580
|
+
const t = useT();
|
|
9432
9581
|
const initialMessageRef = useRef(initialDraft.message);
|
|
9433
9582
|
const [draft, setDraft] = useState<CommentDraft>(initialDraft);
|
|
9434
9583
|
const [resolverTouched, setResolverTouched] = useState(false);
|
|
@@ -9475,7 +9624,7 @@ function InlineCommentPopover({
|
|
|
9475
9624
|
{lockToAgent ? (
|
|
9476
9625
|
<span className="flex items-center gap-1.5 px-1 text-xs font-medium text-muted-foreground">
|
|
9477
9626
|
<IconSend className="size-3.5" />
|
|
9478
|
-
|
|
9627
|
+
{t("plansPage.comments.toAgent")}
|
|
9479
9628
|
</span>
|
|
9480
9629
|
) : (
|
|
9481
9630
|
<ResolutionTargetToggle
|
|
@@ -9493,7 +9642,7 @@ function InlineCommentPopover({
|
|
|
9493
9642
|
variant="ghost"
|
|
9494
9643
|
className="size-8 shrink-0 text-muted-foreground/70 hover:bg-muted hover:text-foreground"
|
|
9495
9644
|
onClick={onCancel}
|
|
9496
|
-
aria-label="
|
|
9645
|
+
aria-label={t("plansPage.comments.cancelComment")}
|
|
9497
9646
|
>
|
|
9498
9647
|
<IconX className="size-3.5" />
|
|
9499
9648
|
</Button>
|
|
@@ -9502,7 +9651,7 @@ function InlineCommentPopover({
|
|
|
9502
9651
|
<div className="flex items-start gap-2">
|
|
9503
9652
|
<CommentMentionEditor
|
|
9504
9653
|
initialMessage={initialMessageRef.current}
|
|
9505
|
-
placeholder="
|
|
9654
|
+
placeholder={t("plansPage.comments.addPlaceholder")}
|
|
9506
9655
|
autoFocus
|
|
9507
9656
|
onSubmitShortcut={submit}
|
|
9508
9657
|
onChange={(value) =>
|
|
@@ -9524,12 +9673,14 @@ function InlineCommentPopover({
|
|
|
9524
9673
|
onClick={submit}
|
|
9525
9674
|
disabled={!canSubmit}
|
|
9526
9675
|
>
|
|
9527
|
-
{isSubmitting
|
|
9676
|
+
{isSubmitting
|
|
9677
|
+
? t("plansPage.comments.saving")
|
|
9678
|
+
: t("plansPage.common.save")}
|
|
9528
9679
|
</Button>
|
|
9529
9680
|
</div>
|
|
9530
9681
|
{submitError && (
|
|
9531
9682
|
<p className="mt-2 px-1 text-xs text-destructive">
|
|
9532
|
-
|
|
9683
|
+
{t("plansPage.comments.saveFailed")}
|
|
9533
9684
|
</p>
|
|
9534
9685
|
)}
|
|
9535
9686
|
</div>
|
|
@@ -9545,6 +9696,7 @@ function GuestCommentCta({
|
|
|
9545
9696
|
onSignIn: () => void;
|
|
9546
9697
|
onCancel: () => void;
|
|
9547
9698
|
}) {
|
|
9699
|
+
const t = useT();
|
|
9548
9700
|
return (
|
|
9549
9701
|
<div
|
|
9550
9702
|
data-plan-interactive
|
|
@@ -9552,23 +9704,25 @@ function GuestCommentCta({
|
|
|
9552
9704
|
style={{ left: position.left, top: position.top, width: position.width }}
|
|
9553
9705
|
>
|
|
9554
9706
|
<div className="mb-3 flex items-center justify-between gap-2">
|
|
9555
|
-
<p className="text-sm font-semibold">
|
|
9707
|
+
<p className="text-sm font-semibold">
|
|
9708
|
+
{t("plansPage.comments.signInTitle")}
|
|
9709
|
+
</p>
|
|
9556
9710
|
<Button
|
|
9557
9711
|
type="button"
|
|
9558
9712
|
size="icon"
|
|
9559
9713
|
variant="ghost"
|
|
9560
9714
|
className="size-8 shrink-0 text-muted-foreground/70 hover:bg-muted hover:text-foreground"
|
|
9561
9715
|
onClick={onCancel}
|
|
9562
|
-
aria-label="
|
|
9716
|
+
aria-label={t("plansPage.common.cancel")}
|
|
9563
9717
|
>
|
|
9564
9718
|
<IconX className="size-3.5" />
|
|
9565
9719
|
</Button>
|
|
9566
9720
|
</div>
|
|
9567
9721
|
<p className="mb-4 text-sm text-muted-foreground">
|
|
9568
|
-
|
|
9722
|
+
{t("plansPage.comments.signInDescription")}
|
|
9569
9723
|
</p>
|
|
9570
9724
|
<Button type="button" size="sm" className="w-full" onClick={onSignIn}>
|
|
9571
|
-
|
|
9725
|
+
{t("plansPage.loadError.signIn")}
|
|
9572
9726
|
</Button>
|
|
9573
9727
|
</div>
|
|
9574
9728
|
);
|
|
@@ -9635,7 +9789,7 @@ function CommentDeleteButton({
|
|
|
9635
9789
|
function ReplyComposer({
|
|
9636
9790
|
author,
|
|
9637
9791
|
isPending,
|
|
9638
|
-
placeholder
|
|
9792
|
+
placeholder,
|
|
9639
9793
|
onSubmit,
|
|
9640
9794
|
}: {
|
|
9641
9795
|
author: CommentAuthorPresentation;
|
|
@@ -9643,6 +9797,7 @@ function ReplyComposer({
|
|
|
9643
9797
|
placeholder?: string;
|
|
9644
9798
|
onSubmit: (message: string) => Promise<void>;
|
|
9645
9799
|
}) {
|
|
9800
|
+
const t = useT();
|
|
9646
9801
|
const [draft, setDraft] = useState<
|
|
9647
9802
|
Pick<CommentDraft, "message" | "mentions">
|
|
9648
9803
|
>({
|
|
@@ -9676,7 +9831,9 @@ function ReplyComposer({
|
|
|
9676
9831
|
<CommentAvatar author={author} size="md" className="mb-1" />
|
|
9677
9832
|
<div className="flex min-w-0 flex-1 items-end gap-2 rounded-xl border border-border/80 bg-muted/40 px-3 py-2 focus-within:border-primary/60 focus-within:bg-background">
|
|
9678
9833
|
<CommentMentionEditor
|
|
9679
|
-
placeholder={
|
|
9834
|
+
placeholder={
|
|
9835
|
+
placeholder ?? t("plansPage.comments.replyPlaceholder")
|
|
9836
|
+
}
|
|
9680
9837
|
resetKey={`reply-${resetKey}`}
|
|
9681
9838
|
className="min-h-10 border-0 bg-transparent px-0 py-2 shadow-none focus-visible:ring-0"
|
|
9682
9839
|
onChange={setDraft}
|
|
@@ -9688,7 +9845,7 @@ function ReplyComposer({
|
|
|
9688
9845
|
className="mb-0.5 size-8 shrink-0 rounded-full"
|
|
9689
9846
|
onClick={() => void submit()}
|
|
9690
9847
|
disabled={!canSubmit}
|
|
9691
|
-
aria-label="
|
|
9848
|
+
aria-label={t("plansPage.comments.sendReply")}
|
|
9692
9849
|
>
|
|
9693
9850
|
{isSubmitting ? (
|
|
9694
9851
|
<IconLoader2 className="size-4 animate-spin" />
|
|
@@ -9700,7 +9857,7 @@ function ReplyComposer({
|
|
|
9700
9857
|
</div>
|
|
9701
9858
|
{submitError && (
|
|
9702
9859
|
<p className="ml-11 text-xs text-destructive">
|
|
9703
|
-
|
|
9860
|
+
{t("plansPage.comments.sendFailed")}
|
|
9704
9861
|
</p>
|
|
9705
9862
|
)}
|
|
9706
9863
|
</div>
|
|
@@ -9738,6 +9895,7 @@ function AnnotationPopover({
|
|
|
9738
9895
|
onDeleteComment: (commentId: string) => void;
|
|
9739
9896
|
onClose?: () => void;
|
|
9740
9897
|
}) {
|
|
9898
|
+
const t = useT();
|
|
9741
9899
|
const popoverRef = useRef<HTMLDivElement>(null);
|
|
9742
9900
|
const [editing, setEditing] = useState(false);
|
|
9743
9901
|
const [messageDraft, setMessageDraft] = useState<
|
|
@@ -9766,6 +9924,7 @@ function AnnotationPopover({
|
|
|
9766
9924
|
const annotationComments = [rootComment, ...replies];
|
|
9767
9925
|
const rootDeleteLabel = deleteCommentLabel(
|
|
9768
9926
|
commentDescendantCount(annotationComments, rootComment.id),
|
|
9927
|
+
t,
|
|
9769
9928
|
);
|
|
9770
9929
|
const canSave =
|
|
9771
9930
|
canEditRootComment && messageDraft.message.trim().length > 0 && !isPending;
|
|
@@ -9824,7 +9983,9 @@ function AnnotationPopover({
|
|
|
9824
9983
|
<div className="flex h-12 shrink-0 items-center justify-between gap-3 border-b border-border/70 px-4">
|
|
9825
9984
|
<div className="flex min-w-0 items-center gap-2">
|
|
9826
9985
|
<IconMessageCircle className="size-4 text-muted-foreground" />
|
|
9827
|
-
<h2 className="truncate text-sm font-semibold">
|
|
9986
|
+
<h2 className="truncate text-sm font-semibold">
|
|
9987
|
+
{t("plansPage.comments.comment")}
|
|
9988
|
+
</h2>
|
|
9828
9989
|
{annotation.commentCount > 1 && (
|
|
9829
9990
|
<Badge variant="secondary" className="h-5 rounded-md px-1.5">
|
|
9830
9991
|
{annotation.commentCount}
|
|
@@ -9834,7 +9995,9 @@ function AnnotationPopover({
|
|
|
9834
9995
|
variant="outline"
|
|
9835
9996
|
className="h-5 rounded-md px-1.5 text-[11px]"
|
|
9836
9997
|
>
|
|
9837
|
-
{resolver === "human"
|
|
9998
|
+
{resolver === "human"
|
|
9999
|
+
? t("plansPage.comments.humanReview")
|
|
10000
|
+
: t("plansPage.comments.agentAction")}
|
|
9838
10001
|
</Badge>
|
|
9839
10002
|
</div>
|
|
9840
10003
|
<div className="flex shrink-0 items-center gap-1">
|
|
@@ -9846,7 +10009,7 @@ function AnnotationPopover({
|
|
|
9846
10009
|
size="icon"
|
|
9847
10010
|
variant="ghost"
|
|
9848
10011
|
className="size-8 shrink-0"
|
|
9849
|
-
aria-label="
|
|
10012
|
+
aria-label={t("plansPage.comments.options")}
|
|
9850
10013
|
>
|
|
9851
10014
|
<IconDotsVertical className="size-4" />
|
|
9852
10015
|
</Button>
|
|
@@ -9864,7 +10027,9 @@ function AnnotationPopover({
|
|
|
9864
10027
|
}
|
|
9865
10028
|
>
|
|
9866
10029
|
<IconCircleCheck className="size-4" />
|
|
9867
|
-
{isResolved
|
|
10030
|
+
{isResolved
|
|
10031
|
+
? t("plansPage.comments.reopenThread")
|
|
10032
|
+
: t("plansPage.comments.markResolved")}
|
|
9868
10033
|
</DropdownMenuItem>
|
|
9869
10034
|
)}
|
|
9870
10035
|
{canEditRootComment && (
|
|
@@ -9873,7 +10038,7 @@ function AnnotationPopover({
|
|
|
9873
10038
|
onClick={() => setEditing(true)}
|
|
9874
10039
|
>
|
|
9875
10040
|
<IconPencil className="size-4" />
|
|
9876
|
-
|
|
10041
|
+
{t("plansPage.comments.editFirstComment")}
|
|
9877
10042
|
</DropdownMenuItem>
|
|
9878
10043
|
)}
|
|
9879
10044
|
{canDelete && (
|
|
@@ -9902,13 +10067,19 @@ function AnnotationPopover({
|
|
|
9902
10067
|
onClick={() =>
|
|
9903
10068
|
onStatusChange(isResolved ? "open" : "resolved")
|
|
9904
10069
|
}
|
|
9905
|
-
aria-label={
|
|
10070
|
+
aria-label={
|
|
10071
|
+
isResolved
|
|
10072
|
+
? t("plansPage.comments.reopenThread")
|
|
10073
|
+
: t("plansPage.comments.markResolved")
|
|
10074
|
+
}
|
|
9906
10075
|
>
|
|
9907
10076
|
<IconCircleCheck className="size-4" />
|
|
9908
10077
|
</Button>
|
|
9909
10078
|
</TooltipTrigger>
|
|
9910
10079
|
<TooltipContent>
|
|
9911
|
-
{isResolved
|
|
10080
|
+
{isResolved
|
|
10081
|
+
? t("plansPage.comments.reopenThread")
|
|
10082
|
+
: t("plansPage.comments.markResolved")}
|
|
9912
10083
|
</TooltipContent>
|
|
9913
10084
|
</Tooltip>
|
|
9914
10085
|
)}
|
|
@@ -9919,7 +10090,7 @@ function AnnotationPopover({
|
|
|
9919
10090
|
variant="ghost"
|
|
9920
10091
|
className="size-8 shrink-0"
|
|
9921
10092
|
onClick={onClose}
|
|
9922
|
-
aria-label="
|
|
10093
|
+
aria-label={t("plansPage.comments.closeComment")}
|
|
9923
10094
|
>
|
|
9924
10095
|
<IconX className="size-4" />
|
|
9925
10096
|
</Button>
|
|
@@ -9933,7 +10104,7 @@ function AnnotationPopover({
|
|
|
9933
10104
|
<CommentMentionEditor
|
|
9934
10105
|
initialMessage={annotation.message}
|
|
9935
10106
|
resetKey={`edit-${annotation.id}-${editing ? "on" : "off"}`}
|
|
9936
|
-
placeholder="
|
|
10107
|
+
placeholder={t("plansPage.comments.editPlaceholder")}
|
|
9937
10108
|
autoFocus
|
|
9938
10109
|
className="min-h-24"
|
|
9939
10110
|
onChange={setMessageDraft}
|
|
@@ -9952,7 +10123,7 @@ function AnnotationPopover({
|
|
|
9952
10123
|
});
|
|
9953
10124
|
}}
|
|
9954
10125
|
>
|
|
9955
|
-
|
|
10126
|
+
{t("plansPage.common.cancel")}
|
|
9956
10127
|
</Button>
|
|
9957
10128
|
<Button
|
|
9958
10129
|
type="button"
|
|
@@ -9960,7 +10131,7 @@ function AnnotationPopover({
|
|
|
9960
10131
|
onClick={save}
|
|
9961
10132
|
disabled={!canSave}
|
|
9962
10133
|
>
|
|
9963
|
-
|
|
10134
|
+
{t("plansPage.common.save")}
|
|
9964
10135
|
</Button>
|
|
9965
10136
|
</div>
|
|
9966
10137
|
</div>
|
|
@@ -9970,6 +10141,7 @@ function AnnotationPopover({
|
|
|
9970
10141
|
{replies.map((reply) => {
|
|
9971
10142
|
const replyDeleteLabel = deleteCommentLabel(
|
|
9972
10143
|
commentDescendantCount(annotationComments, reply.id),
|
|
10144
|
+
t,
|
|
9973
10145
|
);
|
|
9974
10146
|
return (
|
|
9975
10147
|
<CommentThreadMessage
|
|
@@ -10033,6 +10205,7 @@ function AnnotationsPanel({
|
|
|
10033
10205
|
onDeleteComment: (thread: CommentThread, commentId: string) => void;
|
|
10034
10206
|
onClose: () => void;
|
|
10035
10207
|
}) {
|
|
10208
|
+
const t = useT();
|
|
10036
10209
|
const panelRef = useRef<HTMLElement>(null);
|
|
10037
10210
|
const [filterTab, setFilterTab] = useState<"open" | "resolved">("open");
|
|
10038
10211
|
|
|
@@ -10062,7 +10235,7 @@ function AnnotationsPanel({
|
|
|
10062
10235
|
onClose();
|
|
10063
10236
|
// Return focus to the toolbar dots-menu trigger if reachable.
|
|
10064
10237
|
const trigger = document.querySelector<HTMLElement>(
|
|
10065
|
-
|
|
10238
|
+
"[data-plan-actions-trigger]",
|
|
10066
10239
|
);
|
|
10067
10240
|
trigger?.focus();
|
|
10068
10241
|
};
|
|
@@ -10089,7 +10262,9 @@ function AnnotationsPanel({
|
|
|
10089
10262
|
<div className="flex h-12 shrink-0 items-center justify-between gap-3 border-b border-border/70 px-4">
|
|
10090
10263
|
<div className="flex min-w-0 items-center gap-2">
|
|
10091
10264
|
<IconMessageCircle className="size-4 text-muted-foreground" />
|
|
10092
|
-
<h2 className="truncate text-sm font-semibold">
|
|
10265
|
+
<h2 className="truncate text-sm font-semibold">
|
|
10266
|
+
{t("plansPage.comments.comments")}
|
|
10267
|
+
</h2>
|
|
10093
10268
|
</div>
|
|
10094
10269
|
<Button
|
|
10095
10270
|
type="button"
|
|
@@ -10097,7 +10272,7 @@ function AnnotationsPanel({
|
|
|
10097
10272
|
variant="ghost"
|
|
10098
10273
|
className="size-8"
|
|
10099
10274
|
onClick={onClose}
|
|
10100
|
-
aria-label="
|
|
10275
|
+
aria-label={t("plansPage.comments.closeComments")}
|
|
10101
10276
|
>
|
|
10102
10277
|
<IconX className="size-4" />
|
|
10103
10278
|
</Button>
|
|
@@ -10112,7 +10287,7 @@ function AnnotationsPanel({
|
|
|
10112
10287
|
>
|
|
10113
10288
|
<TabsList className="h-7 gap-0.5 rounded-lg p-0.5">
|
|
10114
10289
|
<TabsTrigger value="open" className="h-6 gap-1.5 px-2 text-xs">
|
|
10115
|
-
|
|
10290
|
+
{t("plansPage.comments.open")}
|
|
10116
10291
|
{openThreads.length > 0 && (
|
|
10117
10292
|
<span className="rounded-md bg-muted px-1 text-[10px] font-medium text-muted-foreground">
|
|
10118
10293
|
{openThreads.length}
|
|
@@ -10123,7 +10298,7 @@ function AnnotationsPanel({
|
|
|
10123
10298
|
value="resolved"
|
|
10124
10299
|
className="h-6 gap-1.5 px-2 text-xs"
|
|
10125
10300
|
>
|
|
10126
|
-
|
|
10301
|
+
{t("plansPage.comments.resolved")}
|
|
10127
10302
|
{resolvedThreads.length > 0 && (
|
|
10128
10303
|
<span className="rounded-md bg-muted px-1 text-[10px] font-medium text-muted-foreground">
|
|
10129
10304
|
{resolvedThreads.length}
|
|
@@ -10139,8 +10314,8 @@ function AnnotationsPanel({
|
|
|
10139
10314
|
{visibleThreads.length === 0 ? (
|
|
10140
10315
|
<p className="rounded-lg border border-dashed border-border p-4 text-sm leading-6 text-muted-foreground">
|
|
10141
10316
|
{showResolvedComments && filterTab === "resolved"
|
|
10142
|
-
? "
|
|
10143
|
-
: "
|
|
10317
|
+
? t("plansPage.comments.noResolved")
|
|
10318
|
+
: t("plansPage.comments.noOpen")}
|
|
10144
10319
|
</p>
|
|
10145
10320
|
) : (
|
|
10146
10321
|
visibleThreads.map((thread) => {
|
|
@@ -10148,6 +10323,7 @@ function AnnotationsPanel({
|
|
|
10148
10323
|
const canDelete = canDeleteThread(thread);
|
|
10149
10324
|
const rootDeleteLabel = deleteCommentLabel(
|
|
10150
10325
|
commentDescendantCount(thread.comments, thread.root.id),
|
|
10326
|
+
t,
|
|
10151
10327
|
);
|
|
10152
10328
|
return (
|
|
10153
10329
|
<article
|
|
@@ -10165,8 +10341,8 @@ function AnnotationsPanel({
|
|
|
10165
10341
|
{normalizePlanCommentResolutionTarget(
|
|
10166
10342
|
thread.anchor.resolutionTarget,
|
|
10167
10343
|
) === "human"
|
|
10168
|
-
? "
|
|
10169
|
-
: "
|
|
10344
|
+
? t("plansPage.comments.humanReview")
|
|
10345
|
+
: t("plansPage.comments.agentAction")}
|
|
10170
10346
|
</span>
|
|
10171
10347
|
{" · "}
|
|
10172
10348
|
{formatAnchorForAgent(thread.anchor)}
|
|
@@ -10189,8 +10365,8 @@ function AnnotationsPanel({
|
|
|
10189
10365
|
}
|
|
10190
10366
|
aria-label={
|
|
10191
10367
|
isResolved
|
|
10192
|
-
? "
|
|
10193
|
-
: "
|
|
10368
|
+
? t("plansPage.comments.reopenThread")
|
|
10369
|
+
: t("plansPage.comments.markResolved")
|
|
10194
10370
|
}
|
|
10195
10371
|
>
|
|
10196
10372
|
<IconCircleCheck className="size-4" />
|
|
@@ -10198,8 +10374,8 @@ function AnnotationsPanel({
|
|
|
10198
10374
|
</TooltipTrigger>
|
|
10199
10375
|
<TooltipContent>
|
|
10200
10376
|
{isResolved
|
|
10201
|
-
? "
|
|
10202
|
-
: "
|
|
10377
|
+
? t("plansPage.comments.reopenThread")
|
|
10378
|
+
: t("plansPage.comments.markResolved")}
|
|
10203
10379
|
</TooltipContent>
|
|
10204
10380
|
</Tooltip>
|
|
10205
10381
|
{canDelete && (
|
|
@@ -10248,6 +10424,7 @@ function AnnotationsPanel({
|
|
|
10248
10424
|
);
|
|
10249
10425
|
const commentDeleteLabel = deleteCommentLabel(
|
|
10250
10426
|
commentDescendantCount(thread.comments, comment.id),
|
|
10427
|
+
t,
|
|
10251
10428
|
);
|
|
10252
10429
|
return (
|
|
10253
10430
|
<CommentThreadMessage
|
|
@@ -10295,29 +10472,36 @@ function DeleteCommentDialog({
|
|
|
10295
10472
|
onOpenChange: (open: boolean) => void;
|
|
10296
10473
|
onConfirm: () => void;
|
|
10297
10474
|
}) {
|
|
10475
|
+
const t = useT();
|
|
10298
10476
|
return (
|
|
10299
10477
|
<AlertDialog open={open} onOpenChange={onOpenChange}>
|
|
10300
10478
|
<AlertDialogContent>
|
|
10301
10479
|
<AlertDialogHeader>
|
|
10302
10480
|
<AlertDialogTitle>
|
|
10303
|
-
{replyCount > 0
|
|
10481
|
+
{replyCount > 0
|
|
10482
|
+
? t("plansPage.comments.deleteThreadTitle")
|
|
10483
|
+
: t("plansPage.comments.deleteCommentTitle")}
|
|
10304
10484
|
</AlertDialogTitle>
|
|
10305
10485
|
<AlertDialogDescription>
|
|
10306
10486
|
{replyCount > 0
|
|
10307
|
-
?
|
|
10308
|
-
|
|
10309
|
-
}
|
|
10310
|
-
: "
|
|
10487
|
+
? t("plansPage.comments.deleteThreadDescription", {
|
|
10488
|
+
count: replyCount,
|
|
10489
|
+
})
|
|
10490
|
+
: t("plansPage.comments.deleteCommentDescription")}
|
|
10311
10491
|
</AlertDialogDescription>
|
|
10312
10492
|
</AlertDialogHeader>
|
|
10313
10493
|
<AlertDialogFooter>
|
|
10314
|
-
<AlertDialogCancel disabled={isDeleting}>
|
|
10494
|
+
<AlertDialogCancel disabled={isDeleting}>
|
|
10495
|
+
{t("plansPage.common.cancel")}
|
|
10496
|
+
</AlertDialogCancel>
|
|
10315
10497
|
<AlertDialogAction
|
|
10316
10498
|
disabled={isDeleting}
|
|
10317
10499
|
onClick={onConfirm}
|
|
10318
10500
|
className="bg-destructive text-destructive-foreground hover:bg-destructive/90"
|
|
10319
10501
|
>
|
|
10320
|
-
{isDeleting
|
|
10502
|
+
{isDeleting
|
|
10503
|
+
? t("plansPage.common.deleting")
|
|
10504
|
+
: t("plansPage.common.delete")}
|
|
10321
10505
|
</AlertDialogAction>
|
|
10322
10506
|
</AlertDialogFooter>
|
|
10323
10507
|
</AlertDialogContent>
|
|
@@ -10340,6 +10524,7 @@ function DeletePlanDialog({
|
|
|
10340
10524
|
onOpenChange: (open: boolean) => void;
|
|
10341
10525
|
onConfirm: (mode: "soft" | "hard", confirmation?: string) => void;
|
|
10342
10526
|
}) {
|
|
10527
|
+
const t = useT();
|
|
10343
10528
|
const [mode, setMode] = useState<"soft" | "hard">("soft");
|
|
10344
10529
|
const [confirmation, setConfirmation] = useState("");
|
|
10345
10530
|
const plan = request?.plan ?? null;
|
|
@@ -10347,6 +10532,10 @@ function DeletePlanDialog({
|
|
|
10347
10532
|
const effectiveMode = hardOnly ? "hard" : mode;
|
|
10348
10533
|
const phrase = plan ? hardDeletePlanPhrase(plan.id) : "";
|
|
10349
10534
|
const noun = plan?.kind === "recap" ? "recap" : "plan";
|
|
10535
|
+
const nounLabel =
|
|
10536
|
+
plan?.kind === "recap"
|
|
10537
|
+
? t("plansPage.nouns.recap")
|
|
10538
|
+
: t("plansPage.nouns.plan");
|
|
10350
10539
|
const canSubmit =
|
|
10351
10540
|
Boolean(plan) &&
|
|
10352
10541
|
!isPending &&
|
|
@@ -10364,12 +10553,13 @@ function DeletePlanDialog({
|
|
|
10364
10553
|
<DialogHeader>
|
|
10365
10554
|
<DialogTitle>
|
|
10366
10555
|
{effectiveMode === "hard"
|
|
10367
|
-
?
|
|
10368
|
-
:
|
|
10556
|
+
? t("plansPage.deletePlan.hardTitle", { noun: nounLabel })
|
|
10557
|
+
: t("plansPage.deletePlan.softTitle", { noun: nounLabel })}
|
|
10369
10558
|
</DialogTitle>
|
|
10370
10559
|
<DialogDescription>
|
|
10371
|
-
{
|
|
10372
|
-
|
|
10560
|
+
{t("plansPage.deletePlan.description", {
|
|
10561
|
+
title: plan?.title ?? t("plansPage.deletePlan.fallbackTitle"),
|
|
10562
|
+
})}
|
|
10373
10563
|
</DialogDescription>
|
|
10374
10564
|
</DialogHeader>
|
|
10375
10565
|
|
|
@@ -10388,9 +10578,11 @@ function DeletePlanDialog({
|
|
|
10388
10578
|
: "border-border hover:bg-accent/40",
|
|
10389
10579
|
)}
|
|
10390
10580
|
>
|
|
10391
|
-
<span className="font-medium">
|
|
10581
|
+
<span className="font-medium">
|
|
10582
|
+
{t("plansPage.deletePlan.moveToDeleted")}
|
|
10583
|
+
</span>
|
|
10392
10584
|
<span className="mt-1 block text-xs leading-5 text-muted-foreground">
|
|
10393
|
-
|
|
10585
|
+
{t("plansPage.deletePlan.softOptionDescription")}
|
|
10394
10586
|
</span>
|
|
10395
10587
|
</button>
|
|
10396
10588
|
<button
|
|
@@ -10404,10 +10596,10 @@ function DeletePlanDialog({
|
|
|
10404
10596
|
)}
|
|
10405
10597
|
>
|
|
10406
10598
|
<span className="font-medium text-destructive">
|
|
10407
|
-
|
|
10599
|
+
{t("plansPage.deletePlan.deletePermanently")}
|
|
10408
10600
|
</span>
|
|
10409
10601
|
<span className="mt-1 block text-xs leading-5 text-muted-foreground">
|
|
10410
|
-
|
|
10602
|
+
{t("plansPage.deletePlan.hardOptionDescription")}
|
|
10411
10603
|
</span>
|
|
10412
10604
|
</button>
|
|
10413
10605
|
</div>
|
|
@@ -10415,9 +10607,7 @@ function DeletePlanDialog({
|
|
|
10415
10607
|
|
|
10416
10608
|
{effectiveMode === "soft" ? (
|
|
10417
10609
|
<div className="rounded-lg border border-border bg-muted/30 p-3 text-sm leading-6 text-muted-foreground">
|
|
10418
|
-
|
|
10419
|
-
public sharing, comments, and agent reads stop working until you
|
|
10420
|
-
restore it.
|
|
10610
|
+
{t("plansPage.deletePlan.softDescription", { noun: nounLabel })}
|
|
10421
10611
|
</div>
|
|
10422
10612
|
) : (
|
|
10423
10613
|
<div className="space-y-3">
|
|
@@ -10426,23 +10616,23 @@ function DeletePlanDialog({
|
|
|
10426
10616
|
<IconAlertTriangle className="mt-0.5 size-4 shrink-0 text-destructive" />
|
|
10427
10617
|
<div className="space-y-1 text-sm">
|
|
10428
10618
|
<p className="font-medium text-destructive">
|
|
10429
|
-
|
|
10619
|
+
{t("plansPage.deletePlan.permanentWarning")}
|
|
10430
10620
|
</p>
|
|
10431
10621
|
<p className="leading-6 text-muted-foreground">
|
|
10432
|
-
|
|
10433
|
-
|
|
10434
|
-
|
|
10622
|
+
{t("plansPage.deletePlan.permanentDescription", {
|
|
10623
|
+
noun: nounLabel,
|
|
10624
|
+
})}
|
|
10435
10625
|
</p>
|
|
10436
10626
|
</div>
|
|
10437
10627
|
</div>
|
|
10438
10628
|
</div>
|
|
10439
10629
|
<div className="space-y-2">
|
|
10440
10630
|
<Label htmlFor="hard-delete-plan-confirmation">
|
|
10441
|
-
|
|
10631
|
+
{t("plansPage.deletePlan.typePrefix")}{" "}
|
|
10442
10632
|
<code className="rounded bg-muted px-1.5 py-0.5 font-mono text-xs">
|
|
10443
10633
|
{phrase}
|
|
10444
10634
|
</code>{" "}
|
|
10445
|
-
|
|
10635
|
+
{t("plansPage.deletePlan.typeSuffix")}
|
|
10446
10636
|
</Label>
|
|
10447
10637
|
<Input
|
|
10448
10638
|
id="hard-delete-plan-confirmation"
|
|
@@ -10462,7 +10652,7 @@ function DeletePlanDialog({
|
|
|
10462
10652
|
onClick={() => onOpenChange(false)}
|
|
10463
10653
|
disabled={isPending}
|
|
10464
10654
|
>
|
|
10465
|
-
|
|
10655
|
+
{t("plansPage.common.cancel")}
|
|
10466
10656
|
</Button>
|
|
10467
10657
|
<Button
|
|
10468
10658
|
type="button"
|
|
@@ -10476,10 +10666,10 @@ function DeletePlanDialog({
|
|
|
10476
10666
|
}
|
|
10477
10667
|
>
|
|
10478
10668
|
{isPending
|
|
10479
|
-
? "
|
|
10669
|
+
? t("plansPage.common.deleting")
|
|
10480
10670
|
: effectiveMode === "hard"
|
|
10481
|
-
? "
|
|
10482
|
-
: "
|
|
10671
|
+
? t("plansPage.deletePlan.deletePermanently")
|
|
10672
|
+
: t("plansPage.deletePlan.moveToDeleted")}
|
|
10483
10673
|
</Button>
|
|
10484
10674
|
</DialogFooter>
|
|
10485
10675
|
</DialogContent>
|
|
@@ -10520,6 +10710,9 @@ function injectAnnotationRuntime(
|
|
|
10520
10710
|
annotateMode: boolean,
|
|
10521
10711
|
theme: "dark" | "light",
|
|
10522
10712
|
preferredEditor: PreferredEditor,
|
|
10713
|
+
labels: {
|
|
10714
|
+
closeCodePreview: string;
|
|
10715
|
+
},
|
|
10523
10716
|
avatarUrls: Record<string, string | null> = {},
|
|
10524
10717
|
currentUser?: CurrentCommentAuthor | null,
|
|
10525
10718
|
) {
|
|
@@ -10574,6 +10767,7 @@ function injectAnnotationRuntime(
|
|
|
10574
10767
|
);
|
|
10575
10768
|
},
|
|
10576
10769
|
);
|
|
10770
|
+
const closeCodePreviewLabel = escapeRuntimeJsString(labels.closeCodePreview);
|
|
10577
10771
|
const runtime = `<style>
|
|
10578
10772
|
:root[data-agent-native-theme="light"] {
|
|
10579
10773
|
color-scheme: light;
|
|
@@ -10885,13 +11079,13 @@ function injectAnnotationRuntime(
|
|
|
10885
11079
|
return editorIconHtml(normalized) + '<span class="editor-picker-sr">Preferred editor: ' + editorLabel(normalized) + '</span><span class="editor-picker-caret" aria-hidden="true"></span>';
|
|
10886
11080
|
}
|
|
10887
11081
|
function editorSelectOptionsHtml() {
|
|
10888
|
-
return editorOptions.map(({ value, label }) => '<option value="' + value + '">' + label + '</option>').join("");
|
|
11082
|
+
return editorOptions.map(({ value, label }) => '<option value="' + value + '">' + label + '</option>').join(""); // i18n-ignore generated editor picker markup with stable app labels
|
|
10889
11083
|
}
|
|
10890
11084
|
function editorMenuHtml(activeEditor) {
|
|
10891
11085
|
const active = normalizeEditor(activeEditor);
|
|
10892
11086
|
return editorOptions.map(({ value, label }) => {
|
|
10893
11087
|
const selected = value === active;
|
|
10894
|
-
return '<button type="button" class="editor-picker-option' + (selected ? " is-active" : "") + '" data-agent-native-editor-option="' + value + '" role="menuitemradio" aria-checked="' + (selected ? "true" : "false") + '">' + editorIconHtml(value) + '<span>' + label + '</span></button>';
|
|
11088
|
+
return '<button type="button" class="editor-picker-option' + (selected ? " is-active" : "") + '" data-agent-native-editor-option="' + value + '" role="menuitemradio" aria-checked="' + (selected ? "true" : "false") + '">' + editorIconHtml(value) + '<span>' + label + '</span></button>'; // i18n-ignore generated editor picker markup with stable app labels
|
|
10895
11089
|
}).join("");
|
|
10896
11090
|
}
|
|
10897
11091
|
function closeEditorMenus(exceptPicker) {
|
|
@@ -10944,13 +11138,13 @@ function injectAnnotationRuntime(
|
|
|
10944
11138
|
const lineSuffix = location.line ? ":" + location.line + ":" + location.column : "";
|
|
10945
11139
|
if (normalized === "finder") return "file://" + encodeURI(location.path);
|
|
10946
11140
|
if (normalized === "xcode") {
|
|
10947
|
-
return "xcode://open?url=" + encodeURIComponent("file://" + location.path) + (location.line ? "&line=" + encodeURIComponent(location.line) : "");
|
|
11141
|
+
return "xcode://open?url=" + encodeURIComponent("file://" + location.path) + (location.line ? "&line=" + encodeURIComponent(location.line) : ""); // i18n-ignore stable editor URL scheme
|
|
10948
11142
|
}
|
|
10949
11143
|
if (normalized === "terminal") {
|
|
10950
|
-
return "terminal://open?path=" + encodeURIComponent(directoryForPath(location.path));
|
|
11144
|
+
return "terminal://open?path=" + encodeURIComponent(directoryForPath(location.path)); // i18n-ignore stable editor URL scheme
|
|
10951
11145
|
}
|
|
10952
11146
|
if (normalized === "ghostty") {
|
|
10953
|
-
return "ghostty://open?path=" + encodeURIComponent(directoryForPath(location.path));
|
|
11147
|
+
return "ghostty://open?path=" + encodeURIComponent(directoryForPath(location.path)); // i18n-ignore stable editor URL scheme
|
|
10954
11148
|
}
|
|
10955
11149
|
return normalized + "://file" + encodeURI(location.path) + lineSuffix;
|
|
10956
11150
|
}
|
|
@@ -11613,7 +11807,7 @@ function injectAnnotationRuntime(
|
|
|
11613
11807
|
hideCodePopover();
|
|
11614
11808
|
const popover = document.createElement("div");
|
|
11615
11809
|
popover.className = "an-plan-code-popover";
|
|
11616
|
-
popover.innerHTML = '<div class="an-plan-code-popover-header"><span class="an-plan-code-popover-title"></span><div class="an-plan-code-popover-actions"></div><button type="button" class="an-plan-code-popover-close" aria-label="
|
|
11810
|
+
popover.innerHTML = '<div class="an-plan-code-popover-header"><span class="an-plan-code-popover-title"></span><div class="an-plan-code-popover-actions"></div><button type="button" class="an-plan-code-popover-close" aria-label="${closeCodePreviewLabel}">×</button></div><div class="an-plan-code-popover-body"></div>';
|
|
11617
11811
|
const content = template.content.cloneNode(true);
|
|
11618
11812
|
const codePreview = content.querySelector?.(".code-preview");
|
|
11619
11813
|
const oldTitle = content.querySelector?.(".code-preview-title");
|
|
@@ -11858,7 +12052,22 @@ function injectAnnotationRuntime(
|
|
|
11858
12052
|
return `${html}${runtime}`;
|
|
11859
12053
|
}
|
|
11860
12054
|
|
|
11861
|
-
function
|
|
12055
|
+
function escapeRuntimeJsString(value: string) {
|
|
12056
|
+
return value
|
|
12057
|
+
.replace(/\\/g, "\\\\")
|
|
12058
|
+
.replace(/'/g, "\\'")
|
|
12059
|
+
.replace(/&/g, "&")
|
|
12060
|
+
.replace(/</g, "\\u003c")
|
|
12061
|
+
.replace(/>/g, "\\u003e")
|
|
12062
|
+
.replace(/"/g, """);
|
|
12063
|
+
}
|
|
12064
|
+
|
|
12065
|
+
function buildClientPlanHtml(
|
|
12066
|
+
bundle: PlanBundle,
|
|
12067
|
+
labels: {
|
|
12068
|
+
workingPlan: string;
|
|
12069
|
+
},
|
|
12070
|
+
) {
|
|
11862
12071
|
const escape = (value: unknown) =>
|
|
11863
12072
|
String(value ?? "")
|
|
11864
12073
|
.replace(/&/g, "&")
|
|
@@ -11876,7 +12085,7 @@ function buildClientPlanHtml(bundle: PlanBundle) {
|
|
|
11876
12085
|
bundle.plan.title,
|
|
11877
12086
|
)}</title><style>
|
|
11878
12087
|
:root{color-scheme:dark;--bg:#0a0a0b;--paper:#111113;--line:#28282c;--text:#f2f2f3;--muted:#a4a4aa;--accent:#00B5FF}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;line-height:1.55}main{width:min(1080px,calc(100vw - 48px));margin:0 auto;padding:96px 0 96px}h1{max-width:760px;margin:0;font-size:clamp(36px,5vw,58px);line-height:1.03;letter-spacing:-.04em}.lede{max-width:760px;margin:20px 0 0;color:#d7d7da;font-size:clamp(18px,2vw,23px);line-height:1.45}.meta{display:grid;gap:7px;margin:24px 0 0;padding-left:20px;color:var(--muted);font-size:13px}.meta li::marker{color:var(--accent)}.section{margin-top:70px;padding-top:46px;border-top:1px solid var(--line)}.type{margin:0 0 12px;color:var(--accent);font-size:12px;font-weight:700;letter-spacing:.14em;text-transform:uppercase}.section h2{margin:0;font-size:clamp(26px,4vw,42px);letter-spacing:-.035em}.section p{max-width:760px;color:#d7d7da;font-size:17px}.visual{margin:24px 0;display:grid;grid-template-columns:repeat(3,1fr);gap:10px}.visual i{display:block;height:120px;border:1px solid rgba(0,181,255,.25);border-radius:14px;background:rgba(0,181,255,.12)}@media(max-width:760px){.visual{grid-template-columns:1fr}main{width:min(100vw - 24px,980px);padding-top:72px}}
|
|
11879
|
-
</style></head><body><main><p class="type"
|
|
12088
|
+
</style></head><body><main><p class="type">${escape(labels.workingPlan)}</p><h1>${escape(
|
|
11880
12089
|
bundle.plan.title,
|
|
11881
12090
|
)}</h1><p class="lede">${escape(
|
|
11882
12091
|
bundle.plan.brief,
|