@agent-native/core 0.79.12 → 0.79.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +25 -0
- package/corpus/core/docs/content/locales/zh-TW/a2a-protocol.md +68 -68
- package/corpus/core/docs/content/locales/zh-TW/actions.md +82 -82
- package/corpus/core/docs/content/locales/zh-TW/agent-mentions.md +22 -22
- package/corpus/core/docs/content/locales/zh-TW/agent-surfaces.md +82 -82
- package/corpus/core/docs/content/locales/zh-TW/agent-teams.md +29 -29
- package/corpus/core/docs/content/locales/zh-TW/agent-web-surfaces.md +11 -11
- package/corpus/core/docs/content/locales/zh-TW/audit-log.md +16 -16
- package/corpus/core/docs/content/locales/zh-TW/authentication.md +32 -32
- package/corpus/core/docs/content/locales/zh-TW/automations.md +32 -32
- package/corpus/core/docs/content/locales/zh-TW/blueprint-installer.md +19 -19
- package/corpus/core/docs/content/locales/zh-TW/cli-adapters.md +17 -17
- package/corpus/core/docs/content/locales/zh-TW/client.md +62 -62
- package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.md +32 -32
- package/corpus/core/docs/content/locales/zh-TW/code-agents-ui.md +91 -91
- package/corpus/core/docs/content/locales/zh-TW/components.md +51 -51
- package/corpus/core/docs/content/locales/zh-TW/context-awareness.md +66 -66
- package/corpus/core/docs/content/locales/zh-TW/creating-templates.md +39 -39
- package/corpus/core/docs/content/locales/zh-TW/cross-app-sso.md +29 -29
- package/corpus/core/docs/content/locales/zh-TW/database.md +21 -21
- package/corpus/core/docs/content/locales/zh-TW/deployment.md +37 -37
- package/corpus/core/docs/content/locales/zh-TW/dispatch.md +43 -43
- package/corpus/core/docs/content/locales/zh-TW/drop-in-agent.md +34 -34
- package/corpus/core/docs/content/locales/zh-TW/durable-resume.md +18 -18
- package/corpus/core/docs/content/locales/zh-TW/embedding-sdk.md +73 -73
- package/corpus/core/docs/content/locales/zh-TW/evals.md +16 -16
- package/corpus/core/docs/content/locales/zh-TW/extensions.md +81 -81
- package/corpus/core/docs/content/locales/zh-TW/external-agents.md +146 -146
- package/corpus/core/docs/content/locales/zh-TW/faq.md +43 -43
- package/corpus/core/docs/content/locales/zh-TW/file-uploads.md +11 -11
- package/corpus/core/docs/content/locales/zh-TW/frames.md +33 -33
- package/corpus/core/docs/content/locales/zh-TW/getting-started.md +28 -28
- package/corpus/core/docs/content/locales/zh-TW/harness-agents.md +78 -78
- package/corpus/core/docs/content/locales/zh-TW/human-approval.md +27 -27
- package/corpus/core/docs/content/locales/zh-TW/internationalization.md +19 -19
- package/corpus/core/docs/content/locales/zh-TW/key-concepts.md +68 -68
- package/corpus/core/docs/content/locales/zh-TW/local-file-mode.md +50 -50
- package/corpus/core/docs/content/locales/zh-TW/mcp-apps.md +38 -38
- package/corpus/core/docs/content/locales/zh-TW/mcp-clients.md +67 -67
- package/corpus/core/docs/content/locales/zh-TW/mcp-protocol.md +50 -50
- package/corpus/core/docs/content/locales/zh-TW/messaging.md +99 -99
- package/corpus/core/docs/content/locales/zh-TW/migration-workbench.md +6 -6
- package/corpus/core/docs/content/locales/zh-TW/multi-app-workspace.md +39 -39
- package/corpus/core/docs/content/locales/zh-TW/multi-tenancy.md +7 -7
- package/corpus/core/docs/content/locales/zh-TW/native-chat-ui.md +38 -38
- package/corpus/core/docs/content/locales/zh-TW/notifications.md +23 -23
- package/corpus/core/docs/content/locales/zh-TW/observability.md +49 -49
- package/corpus/core/docs/content/locales/zh-TW/observational-memory.md +23 -23
- package/corpus/core/docs/content/locales/zh-TW/onboarding.md +40 -40
- package/corpus/core/docs/content/locales/zh-TW/plan-plugin.md +37 -37
- package/corpus/core/docs/content/locales/zh-TW/pr-visual-recap.md +72 -72
- package/corpus/core/docs/content/locales/zh-TW/processors.md +17 -17
- package/corpus/core/docs/content/locales/zh-TW/progress.md +15 -15
- package/corpus/core/docs/content/locales/zh-TW/pure-agent-apps.md +10 -10
- package/corpus/core/docs/content/locales/zh-TW/real-time-collaboration.md +103 -103
- package/corpus/core/docs/content/locales/zh-TW/recurring-jobs.md +19 -19
- package/corpus/core/docs/content/locales/zh-TW/routing.md +9 -9
- package/corpus/core/docs/content/locales/zh-TW/sandbox-adapters.md +48 -48
- package/corpus/core/docs/content/locales/zh-TW/security.md +49 -49
- package/corpus/core/docs/content/locales/zh-TW/server.md +47 -47
- package/corpus/core/docs/content/locales/zh-TW/sharing.md +22 -22
- package/corpus/core/docs/content/locales/zh-TW/skills-guide.md +46 -46
- package/corpus/core/docs/content/locales/zh-TW/template-analytics.md +40 -40
- package/corpus/core/docs/content/locales/zh-TW/template-assets.md +69 -69
- package/corpus/core/docs/content/locales/zh-TW/template-brain.md +81 -81
- package/corpus/core/docs/content/locales/zh-TW/template-calendar.md +40 -40
- package/corpus/core/docs/content/locales/zh-TW/template-chat.md +27 -27
- package/corpus/core/docs/content/locales/zh-TW/template-clips.md +85 -85
- package/corpus/core/docs/content/locales/zh-TW/template-content.md +65 -66
- package/corpus/core/docs/content/locales/zh-TW/template-design.md +29 -29
- package/corpus/core/docs/content/locales/zh-TW/template-dispatch.md +51 -51
- package/corpus/core/docs/content/locales/zh-TW/template-forms.md +25 -25
- package/corpus/core/docs/content/locales/zh-TW/template-mail.md +71 -71
- package/corpus/core/docs/content/locales/zh-TW/template-plan.md +92 -92
- package/corpus/core/docs/content/locales/zh-TW/template-slides.md +52 -52
- package/corpus/core/docs/content/locales/zh-TW/template-videos.md +30 -30
- package/corpus/core/docs/content/locales/zh-TW/tracking.md +29 -29
- package/corpus/core/docs/content/locales/zh-TW/using-your-agent.md +18 -18
- package/corpus/core/docs/content/locales/zh-TW/voice-input.md +19 -19
- package/corpus/core/docs/content/locales/zh-TW/what-is-agent-native.md +61 -61
- package/corpus/core/docs/content/locales/zh-TW/workspace-connections.md +41 -41
- package/corpus/core/docs/content/locales/zh-TW/workspace-management.md +27 -27
- package/corpus/core/docs/content/locales/zh-TW/workspace.md +58 -58
- package/corpus/core/docs/content/locales/zh-TW/writing-agent-instructions.md +41 -41
- package/corpus/core/docs/content/template-clips.md +48 -2
- package/corpus/core/package.json +2 -1
- package/corpus/core/src/client/AgentPanel.tsx +29 -6
- package/corpus/core/src/deploy/build.ts +432 -42
- package/corpus/core/src/deploy/route-discovery.ts +1 -1
- package/corpus/core/src/server/edge.ts +50 -0
- package/corpus/core/src/styles/agent-native.css +123 -0
- package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +44 -44
- package/corpus/core/src/vite/client.ts +1 -0
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +5 -3
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +69 -70
- package/corpus/templates/analytics/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/assets/app/components/layout/Layout.tsx +3 -3
- package/corpus/templates/assets/app/i18n/zh-TW.ts +82 -82
- package/corpus/templates/assets/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/brain/app/components/layout/Layout.tsx +6 -4
- package/corpus/templates/brain/app/i18n/zh-TW.ts +90 -90
- package/corpus/templates/brain/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +1 -1
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +1 -1
- package/corpus/templates/calendar/app/i18n/zh-TW.ts +57 -57
- package/corpus/templates/calendar/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/calendar/server/lib/booking-og-fonts.ts +20 -6
- package/corpus/templates/calendar/server/lib/booking-og-image.ts +17 -9
- package/corpus/templates/chat/app/components/layout/Layout.tsx +5 -3
- package/corpus/templates/chat/app/i18n/zh-TW.ts +3 -3
- package/corpus/templates/chat/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/clips/AGENTS.md +6 -0
- package/corpus/templates/clips/actions/delete-recording-permanent.ts +7 -1
- package/corpus/templates/clips/actions/get-recording-player-data.ts +44 -2
- package/corpus/templates/clips/actions/navigate.ts +2 -0
- package/corpus/templates/clips/actions/save-bug-report-context.ts +173 -0
- package/corpus/templates/clips/actions/view-screen.ts +58 -7
- package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +9 -3
- package/corpus/templates/clips/app/hooks/use-navigation-state.ts +17 -0
- package/corpus/templates/clips/app/i18n/ar-SA.ts +31 -0
- package/corpus/templates/clips/app/i18n/de-DE.ts +32 -0
- package/corpus/templates/clips/app/i18n/en-US.ts +32 -0
- package/corpus/templates/clips/app/i18n/es-ES.ts +32 -0
- package/corpus/templates/clips/app/i18n/fr-FR.ts +32 -0
- package/corpus/templates/clips/app/i18n/hi-IN.ts +32 -0
- package/corpus/templates/clips/app/i18n/ja-JP.ts +31 -0
- package/corpus/templates/clips/app/i18n/ko-KR.ts +32 -0
- package/corpus/templates/clips/app/i18n/pt-BR.ts +32 -0
- package/corpus/templates/clips/app/i18n/zh-CN.ts +30 -0
- package/corpus/templates/clips/app/i18n/zh-TW.ts +461 -451
- package/corpus/templates/clips/app/routes/bug-report.done.tsx +126 -0
- package/corpus/templates/clips/app/routes/bug-report.tsx +222 -0
- package/corpus/templates/clips/app/routes/record.tsx +104 -12
- package/corpus/templates/clips/changelog/2026-06-26-brief-network-blips-no-longer-block-recording-or-wrongly-pro.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-bug-report-recordings-can-keep-redacted-host-app-context-wit.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-bug-report-widgets-can-launch-clips-recordings-from-embedded.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-desktop-recording-keeps-connected-users-out-of-the-storage-s.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-if-a-recording-can-t-be-uploaded-the-chrome-extension-now-sa.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/clips/chrome-extension/public/manifest.json +9 -2
- package/corpus/templates/clips/chrome-extension/src/background.ts +43 -0
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +111 -6
- package/corpus/templates/clips/chrome-extension/src/popup.ts +18 -7
- package/corpus/templates/clips/desktop/src/app.tsx +53 -19
- package/corpus/templates/clips/server/db/schema.ts +26 -0
- package/corpus/templates/clips/server/lib/public-agent-context.ts +51 -0
- package/corpus/templates/clips/server/plugins/auth.ts +1 -0
- package/corpus/templates/clips/server/plugins/db.ts +28 -0
- package/corpus/templates/clips/server/routes/api/agent-context.json.get.ts +4 -1
- package/corpus/templates/clips/shared/bug-report.ts +161 -0
- package/corpus/templates/content/app/components/layout/Layout.tsx +10 -8
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +1 -1
- package/corpus/templates/content/app/i18n/zh-TW.ts +67 -66
- package/corpus/templates/content/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +3 -3
- package/corpus/templates/design/app/i18n/zh-TW.ts +44 -44
- package/corpus/templates/design/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/dispatch/app/i18n/zh-TW.ts +5 -4
- package/corpus/templates/dispatch/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/forms/app/components/layout/Layout.tsx +4 -2
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +1 -1
- package/corpus/templates/forms/app/i18n/zh-TW.ts +48 -48
- package/corpus/templates/forms/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +3 -3
- package/corpus/templates/macros/app/i18n/zh-TW.ts +5 -5
- package/corpus/templates/macros/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/mail/app/i18n/zh-TW.ts +83 -83
- package/corpus/templates/mail/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/plan/app/components/layout/Layout.tsx +5 -3
- package/corpus/templates/plan/app/i18n/zh-TW.ts +69 -69
- package/corpus/templates/plan/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/slides/app/components/layout/Layout.tsx +3 -3
- package/corpus/templates/slides/app/i18n/zh-TW.ts +64 -64
- package/corpus/templates/slides/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/videos/app/components/layout/Layout.tsx +2 -2
- package/corpus/templates/videos/app/i18n/zh-TW.ts +54 -54
- package/corpus/templates/videos/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +16 -6
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/collab/routes.d.ts +2 -2
- package/dist/deploy/build.d.ts +3 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +372 -37
- package/dist/deploy/build.js.map +1 -1
- package/dist/deploy/route-discovery.d.ts +1 -1
- package/dist/deploy/route-discovery.js +1 -1
- package/dist/deploy/route-discovery.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +5 -5
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/server/agent-engine-api-key-route.d.ts +2 -2
- package/dist/server/edge.d.ts +11 -0
- package/dist/server/edge.d.ts.map +1 -0
- package/dist/server/edge.js +11 -0
- package/dist/server/edge.js.map +1 -0
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/styles/agent-native.css +123 -0
- package/dist/templates/default/app/i18n/zh-TW.ts +44 -44
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +1 -0
- package/dist/vite/client.js.map +1 -1
- package/docs/content/locales/zh-TW/a2a-protocol.md +68 -68
- package/docs/content/locales/zh-TW/actions.md +82 -82
- package/docs/content/locales/zh-TW/agent-mentions.md +22 -22
- package/docs/content/locales/zh-TW/agent-surfaces.md +82 -82
- package/docs/content/locales/zh-TW/agent-teams.md +29 -29
- package/docs/content/locales/zh-TW/agent-web-surfaces.md +11 -11
- package/docs/content/locales/zh-TW/audit-log.md +16 -16
- package/docs/content/locales/zh-TW/authentication.md +32 -32
- package/docs/content/locales/zh-TW/automations.md +32 -32
- package/docs/content/locales/zh-TW/blueprint-installer.md +19 -19
- package/docs/content/locales/zh-TW/cli-adapters.md +17 -17
- package/docs/content/locales/zh-TW/client.md +62 -62
- package/docs/content/locales/zh-TW/cloneable-saas.md +32 -32
- package/docs/content/locales/zh-TW/code-agents-ui.md +91 -91
- package/docs/content/locales/zh-TW/components.md +51 -51
- package/docs/content/locales/zh-TW/context-awareness.md +66 -66
- package/docs/content/locales/zh-TW/creating-templates.md +39 -39
- package/docs/content/locales/zh-TW/cross-app-sso.md +29 -29
- package/docs/content/locales/zh-TW/database.md +21 -21
- package/docs/content/locales/zh-TW/deployment.md +37 -37
- package/docs/content/locales/zh-TW/dispatch.md +43 -43
- package/docs/content/locales/zh-TW/drop-in-agent.md +34 -34
- package/docs/content/locales/zh-TW/durable-resume.md +18 -18
- package/docs/content/locales/zh-TW/embedding-sdk.md +73 -73
- package/docs/content/locales/zh-TW/evals.md +16 -16
- package/docs/content/locales/zh-TW/extensions.md +81 -81
- package/docs/content/locales/zh-TW/external-agents.md +146 -146
- package/docs/content/locales/zh-TW/faq.md +43 -43
- package/docs/content/locales/zh-TW/file-uploads.md +11 -11
- package/docs/content/locales/zh-TW/frames.md +33 -33
- package/docs/content/locales/zh-TW/getting-started.md +28 -28
- package/docs/content/locales/zh-TW/harness-agents.md +78 -78
- package/docs/content/locales/zh-TW/human-approval.md +27 -27
- package/docs/content/locales/zh-TW/internationalization.md +19 -19
- package/docs/content/locales/zh-TW/key-concepts.md +68 -68
- package/docs/content/locales/zh-TW/local-file-mode.md +50 -50
- package/docs/content/locales/zh-TW/mcp-apps.md +38 -38
- package/docs/content/locales/zh-TW/mcp-clients.md +67 -67
- package/docs/content/locales/zh-TW/mcp-protocol.md +50 -50
- package/docs/content/locales/zh-TW/messaging.md +99 -99
- package/docs/content/locales/zh-TW/migration-workbench.md +6 -6
- package/docs/content/locales/zh-TW/multi-app-workspace.md +39 -39
- package/docs/content/locales/zh-TW/multi-tenancy.md +7 -7
- package/docs/content/locales/zh-TW/native-chat-ui.md +38 -38
- package/docs/content/locales/zh-TW/notifications.md +23 -23
- package/docs/content/locales/zh-TW/observability.md +49 -49
- package/docs/content/locales/zh-TW/observational-memory.md +23 -23
- package/docs/content/locales/zh-TW/onboarding.md +40 -40
- package/docs/content/locales/zh-TW/plan-plugin.md +37 -37
- package/docs/content/locales/zh-TW/pr-visual-recap.md +72 -72
- package/docs/content/locales/zh-TW/processors.md +17 -17
- package/docs/content/locales/zh-TW/progress.md +15 -15
- package/docs/content/locales/zh-TW/pure-agent-apps.md +10 -10
- package/docs/content/locales/zh-TW/real-time-collaboration.md +103 -103
- package/docs/content/locales/zh-TW/recurring-jobs.md +19 -19
- package/docs/content/locales/zh-TW/routing.md +9 -9
- package/docs/content/locales/zh-TW/sandbox-adapters.md +48 -48
- package/docs/content/locales/zh-TW/security.md +49 -49
- package/docs/content/locales/zh-TW/server.md +47 -47
- package/docs/content/locales/zh-TW/sharing.md +22 -22
- package/docs/content/locales/zh-TW/skills-guide.md +46 -46
- package/docs/content/locales/zh-TW/template-analytics.md +40 -40
- package/docs/content/locales/zh-TW/template-assets.md +69 -69
- package/docs/content/locales/zh-TW/template-brain.md +81 -81
- package/docs/content/locales/zh-TW/template-calendar.md +40 -40
- package/docs/content/locales/zh-TW/template-chat.md +27 -27
- package/docs/content/locales/zh-TW/template-clips.md +85 -85
- package/docs/content/locales/zh-TW/template-content.md +65 -66
- package/docs/content/locales/zh-TW/template-design.md +29 -29
- package/docs/content/locales/zh-TW/template-dispatch.md +51 -51
- package/docs/content/locales/zh-TW/template-forms.md +25 -25
- package/docs/content/locales/zh-TW/template-mail.md +71 -71
- package/docs/content/locales/zh-TW/template-plan.md +92 -92
- package/docs/content/locales/zh-TW/template-slides.md +52 -52
- package/docs/content/locales/zh-TW/template-videos.md +30 -30
- package/docs/content/locales/zh-TW/tracking.md +29 -29
- package/docs/content/locales/zh-TW/using-your-agent.md +18 -18
- package/docs/content/locales/zh-TW/voice-input.md +19 -19
- package/docs/content/locales/zh-TW/what-is-agent-native.md +61 -61
- package/docs/content/locales/zh-TW/workspace-connections.md +41 -41
- package/docs/content/locales/zh-TW/workspace-management.md +27 -27
- package/docs/content/locales/zh-TW/workspace.md +58 -58
- package/docs/content/locales/zh-TW/writing-agent-instructions.md +41 -41
- package/docs/content/template-clips.md +48 -2
- package/package.json +2 -1
- package/src/templates/default/app/i18n/zh-TW.ts +44 -44
|
@@ -63,7 +63,7 @@ const messages = {
|
|
|
63
63
|
testingConnection: "正在測試連線...",
|
|
64
64
|
providers: {
|
|
65
65
|
turso: {
|
|
66
|
-
description: "
|
|
66
|
+
description: "邊緣 SQLite",
|
|
67
67
|
steps: {
|
|
68
68
|
step1: "安裝 CLI:curl -sSfL https://get.tur.so/install.sh | bash",
|
|
69
69
|
step2: "註冊/登入:turso auth login(開啟瀏覽器)",
|
|
@@ -76,17 +76,17 @@ const messages = {
|
|
|
76
76
|
description: "無伺服器 Postgres",
|
|
77
77
|
steps: {
|
|
78
78
|
step1: "前往 console.neon.tech 並註冊或登入",
|
|
79
|
-
step2: '
|
|
79
|
+
step2: '點選 "New Project" → 選取名稱和區域 → 點選 Create',
|
|
80
80
|
step3: "在專案儀表板中找到 Connection Details 面板",
|
|
81
81
|
step4: '選取 "Connection string" 標籤 → 複製 postgres://... URL',
|
|
82
82
|
step5: "在下方貼上完整連線字串(包含密碼)",
|
|
83
83
|
},
|
|
84
84
|
},
|
|
85
85
|
supabase: {
|
|
86
|
-
description: "
|
|
86
|
+
description: "開放原始碼 Firebase 替代方案",
|
|
87
87
|
steps: {
|
|
88
88
|
step1: "前往 supabase.com/dashboard 並註冊或登入",
|
|
89
|
-
step2: '
|
|
89
|
+
step2: '點選 "New Project" → 設定名稱和資料庫密碼 → 點選 Create',
|
|
90
90
|
step3: "等待專案完成預配(約 30 秒)",
|
|
91
91
|
step4: "前往 Project Settings → Database → Connection string",
|
|
92
92
|
step5:
|
|
@@ -94,10 +94,10 @@ const messages = {
|
|
|
94
94
|
},
|
|
95
95
|
},
|
|
96
96
|
d1: {
|
|
97
|
-
description: "Cloudflare
|
|
97
|
+
description: "Cloudflare 邊緣 SQLite",
|
|
98
98
|
steps: {
|
|
99
99
|
step1: "前往 dash.cloudflare.com → Workers & Pages → D1 SQL Database",
|
|
100
|
-
step2: '
|
|
100
|
+
step2: '點選 "Create" → 為資料庫命名 → 點選 Create',
|
|
101
101
|
step3: "從資料庫概覽頁面複製 Database ID",
|
|
102
102
|
step4: "認證權杖:前往 My Profile → API Tokens → Create Token",
|
|
103
103
|
step5: '選取 "Edit Cloudflare Workers" 範本 → Create Token → 複製',
|
|
@@ -111,30 +111,30 @@ const messages = {
|
|
|
111
111
|
attendeeCount_one: "{{count}} 人",
|
|
112
112
|
attendeeCount_other: "{{count}} 人",
|
|
113
113
|
connectApollo: "連線 Apollo",
|
|
114
|
-
description: "新增 Apollo API key
|
|
115
|
-
howToGetKey: "
|
|
114
|
+
description: "新增 Apollo API key,用公司、職位和聯絡資料豐富參會者資料。",
|
|
115
|
+
howToGetKey: "如何取得金鑰",
|
|
116
116
|
openSettings: "開啟 Apollo 設定 →",
|
|
117
117
|
researchMeeting: "研究會議",
|
|
118
118
|
steps: {
|
|
119
119
|
login: "登入 Apollo.io",
|
|
120
120
|
api: "前往 Settings → Integrations → API",
|
|
121
|
-
connect: '
|
|
121
|
+
connect: '點選 "Connect" 生成金鑰',
|
|
122
122
|
},
|
|
123
123
|
},
|
|
124
124
|
attendees: {
|
|
125
125
|
addAnotherGuest: "新增另一位來賓",
|
|
126
|
-
contacts: "
|
|
127
|
-
contactsReconnect: "
|
|
126
|
+
contacts: "聯絡人",
|
|
127
|
+
contactsReconnect: "需要重新連線聯絡人或目錄存取權限。",
|
|
128
128
|
directory: "目錄",
|
|
129
129
|
inviteEmail: "邀請 {{email}}",
|
|
130
|
-
otherContacts: "
|
|
130
|
+
otherContacts: "其他聯絡人",
|
|
131
131
|
removeAttendee: "移除 {{email}}",
|
|
132
132
|
searchingPeople: "正在搜尋人員",
|
|
133
133
|
},
|
|
134
134
|
findTime: {
|
|
135
135
|
busy: "忙碌",
|
|
136
136
|
noMatchingSlots: "沒有匹配時段",
|
|
137
|
-
refreshing: "
|
|
137
|
+
refreshing: "正在重新整理",
|
|
138
138
|
suggestedTimes: "建議時間",
|
|
139
139
|
takeoverDescription: "檢視共用可用性並選取會議時間。",
|
|
140
140
|
you: "你",
|
|
@@ -163,13 +163,13 @@ const messages = {
|
|
|
163
163
|
integrations: {
|
|
164
164
|
addIntegration: "新增整合",
|
|
165
165
|
addIntegrations: "新增整合",
|
|
166
|
-
apolloDescription: "
|
|
166
|
+
apolloDescription: "聯絡人豐富和公司資料",
|
|
167
167
|
apolloKeyPlaceholder: "貼上 Apollo API key...",
|
|
168
168
|
connectedCount: "整合({{connected}}/{{total}})",
|
|
169
|
-
gongDescription: "
|
|
169
|
+
gongDescription: "最近通話和對話智慧",
|
|
170
170
|
gongKeyPlaceholder: "Gong API key 或 access_key:secret...",
|
|
171
171
|
go: "開始",
|
|
172
|
-
hubSpotDescription: "CRM
|
|
172
|
+
hubSpotDescription: "CRM 聯絡人、交易和工單",
|
|
173
173
|
hubSpotKeyPlaceholder: "貼上 HubSpot private app token...",
|
|
174
174
|
newIntegration: "新整合",
|
|
175
175
|
newIntegrationPlaceholder: "例如 Salesforce、Intercom...",
|
|
@@ -177,12 +177,12 @@ const messages = {
|
|
|
177
177
|
pylonDescription: "支援問題和帳號資料",
|
|
178
178
|
pylonKeyPlaceholder: "貼上 Pylon API token...",
|
|
179
179
|
title: "整合",
|
|
180
|
-
toGetApiKey: "
|
|
180
|
+
toGetApiKey: "取得 API key:",
|
|
181
181
|
updateKey: "更新金鑰",
|
|
182
182
|
steps: {
|
|
183
183
|
apolloLogin: "登入 Apollo.io",
|
|
184
184
|
apolloApi: "前往 Settings → Integrations → API",
|
|
185
|
-
apolloConnect: '
|
|
185
|
+
apolloConnect: '點選 "Connect" 生成金鑰',
|
|
186
186
|
hubSpotPrivateApps:
|
|
187
187
|
"Go to HubSpot > Settings > Integrations > Private Apps",
|
|
188
188
|
hubSpotCreateApp: "建立帶 CRM 範圍的 private app",
|
|
@@ -276,7 +276,7 @@ const messages = {
|
|
|
276
276
|
guest_other: "{{count}} 位來賓",
|
|
277
277
|
cancel: "取消",
|
|
278
278
|
dontNotify: "不通知",
|
|
279
|
-
sendCancellation: "
|
|
279
|
+
sendCancellation: "傳送取消通知",
|
|
280
280
|
removeEvent: "移除事件",
|
|
281
281
|
deleteEvent: "刪除事件",
|
|
282
282
|
removeAction: "移除",
|
|
@@ -292,15 +292,15 @@ const messages = {
|
|
|
292
292
|
previousPeriod: "上期",
|
|
293
293
|
goToday: "轉到今天",
|
|
294
294
|
showTeammateCalendars: "顯示隊友行事曆",
|
|
295
|
-
monthView: "
|
|
296
|
-
weekView: "
|
|
295
|
+
monthView: "月檢視",
|
|
296
|
+
weekView: "週檢視",
|
|
297
297
|
dayView: "日景",
|
|
298
298
|
createNewEvent: "建立新事件",
|
|
299
299
|
deleteSelectedEvent: "刪除選定的事件",
|
|
300
300
|
closeDialog: "關閉對話框/取消",
|
|
301
301
|
openCommandPalette: "開啟指令面板",
|
|
302
302
|
showKeyboardShortcuts: "顯示鍵盤快速鍵",
|
|
303
|
-
disabledWhileTyping: "
|
|
303
|
+
disabledWhileTyping: "在文字欄位中輸入時,快速鍵被停用。",
|
|
304
304
|
},
|
|
305
305
|
manageBooking: {
|
|
306
306
|
title: "管理預訂",
|
|
@@ -322,7 +322,7 @@ const messages = {
|
|
|
322
322
|
cancelTitle: "取消此預訂嗎?",
|
|
323
323
|
cancelDescriptionPrefix: "這將取消您的",
|
|
324
324
|
cancelDescriptionDateConnector: "在",
|
|
325
|
-
cancelDescriptionSuffix: "
|
|
325
|
+
cancelDescriptionSuffix: "。此操作無法復原。",
|
|
326
326
|
keepBooking: "繼續預訂",
|
|
327
327
|
cancelling: "正在取消...",
|
|
328
328
|
yesCancel: "是,取消",
|
|
@@ -340,23 +340,23 @@ const messages = {
|
|
|
340
340
|
attachmentUploaded: "附件已上傳",
|
|
341
341
|
attachmentUploadLimit: "上傳附件最大可達 25 MB。",
|
|
342
342
|
uploadFailed: "無法上傳附件。",
|
|
343
|
-
uploadMissingUrl: "
|
|
343
|
+
uploadMissingUrl: "上傳未傳回附件 URL。",
|
|
344
344
|
attachmentFallbackTitle: "依戀",
|
|
345
345
|
fileUploadsNotConfigured: "未設定檔案上傳。改為貼上 Drive 或 HTTPS URL。",
|
|
346
346
|
fileUploadsNeedProvider:
|
|
347
|
-
"
|
|
347
|
+
"檔案上傳需要設定上傳提供者。現在貼上 Drive 或 HTTPS URL。",
|
|
348
348
|
uploadFile: "上傳檔案",
|
|
349
349
|
uploading: "上傳中",
|
|
350
350
|
maxAttachments: "Google Calendar 每個事件最多支援 {{count}} 個附件。",
|
|
351
351
|
uploadProviderPermissionError:
|
|
352
|
-
"目前上傳提供者憑證無法進行檔案上傳。檢查Settings中的Builder.io權限,或貼上Drive
|
|
352
|
+
"目前上傳提供者憑證無法進行檔案上傳。檢查Settings 中的 Builder.io 權限,或貼上Drive 或 HTTPS URL。",
|
|
353
353
|
setEventColorTo: "將事件顏色設定為 {{color}}",
|
|
354
354
|
},
|
|
355
355
|
googleConnect: {
|
|
356
356
|
addAccount: "新增帳戶",
|
|
357
357
|
addAccountWithPlus: "+ 新增帳戶",
|
|
358
|
-
connectGoogleCalendar: "連線Google Calendar",
|
|
359
|
-
connectGoogle: "連線Google",
|
|
358
|
+
connectGoogleCalendar: "連線 Google Calendar",
|
|
359
|
+
connectGoogle: "連線 Google",
|
|
360
360
|
signInWithGoogle: "使用 Google 登入",
|
|
361
361
|
syncEventsDescription: "同步您的活動並管理您的日程安排。",
|
|
362
362
|
readyToConnect: "準備連線 — 使用您的 Google 帳戶登入",
|
|
@@ -364,25 +364,25 @@ const messages = {
|
|
|
364
364
|
hideSetup: "隱藏設定",
|
|
365
365
|
followSteps: "請按照以下步驟連線您的 Google 帳戶。大約需要3分鐘。",
|
|
366
366
|
googleMayShowWarning: "Google 可能會顯示警告",
|
|
367
|
-
googleNotVerifiedTitle: "“Google尚未驗證此應用程式”",
|
|
367
|
+
googleNotVerifiedTitle: "“Google 尚未驗證此應用程式”",
|
|
368
368
|
googleWarningBeforeAdvanced:
|
|
369
|
-
"
|
|
369
|
+
"您將看到此螢幕,因為行事曆是透過您自己的 Google Cloud 專案而不是經過 Google 審核的公開應用程式連線的。可以安全地繼續:點選",
|
|
370
370
|
googleWarningAdvanced: "Advanced",
|
|
371
371
|
googleWarningBetweenActions: ", 然後",
|
|
372
372
|
googleWarningUnsafe: "“Go to … (unsafe)”",
|
|
373
373
|
googleWarningAfterUnsafe: "完成連線。",
|
|
374
374
|
accountConnectedElsewhere: "該帳戶已連線到另一個登入帳戶",
|
|
375
375
|
googleConnectionFailed: "Google 連線失敗",
|
|
376
|
-
thatGoogleAccount: "那個Google帳戶",
|
|
376
|
+
thatGoogleAccount: "那個 Google 帳戶",
|
|
377
377
|
signOutThenSignIn: "登出,然後使用 {{account}} 登入。",
|
|
378
378
|
signOut: "登出",
|
|
379
379
|
dismiss: "解雇",
|
|
380
|
-
dismissNotice: "關閉Google登入通知",
|
|
380
|
+
dismissNotice: "關閉 Google 登入通知",
|
|
381
381
|
copy: "複製",
|
|
382
382
|
copied: "已複製",
|
|
383
383
|
uploadJson: "上傳JSON",
|
|
384
384
|
credentialsConfiguredSignIn:
|
|
385
|
-
"
|
|
385
|
+
"憑證已設定。點選上面的“連線 Google Calendar”即可登入。",
|
|
386
386
|
missingClientCredentials: "在JSON中找不到client_id和client_secret",
|
|
387
387
|
failedSaveCredentials: "無法儲存憑證",
|
|
388
388
|
failedSave: "儲存失敗",
|
|
@@ -396,7 +396,7 @@ const messages = {
|
|
|
396
396
|
saveCredentials: "儲存憑證",
|
|
397
397
|
steps: {
|
|
398
398
|
enableApi: {
|
|
399
|
-
title: "啟用Google Calendar API",
|
|
399
|
+
title: "啟用 Google Calendar API",
|
|
400
400
|
description:
|
|
401
401
|
"開啟 Google Cloud Console 並點選 Calendar API 上的“啟用”。",
|
|
402
402
|
linkText: "啟用Calendar API",
|
|
@@ -410,7 +410,7 @@ const messages = {
|
|
|
410
410
|
credentials: {
|
|
411
411
|
title: "建立 OAuth 憑證",
|
|
412
412
|
description:
|
|
413
|
-
"1)
|
|
413
|
+
"1) 點選“+Create Credentials”→“OAuth client ID”\n2)選取“Web application”\n3) 新增此重新導向 URI:",
|
|
414
414
|
linkText: "建立憑證",
|
|
415
415
|
},
|
|
416
416
|
upload: {
|
|
@@ -463,7 +463,7 @@ const messages = {
|
|
|
463
463
|
collapsePreview: "折疊預覽",
|
|
464
464
|
confirmBooking: "確認預訂",
|
|
465
465
|
confirmation: "確認",
|
|
466
|
-
confirmationSent: "
|
|
466
|
+
confirmationSent: "你已完成!確認郵件已傳送到你的信箱。",
|
|
467
467
|
confirmed: "已確認",
|
|
468
468
|
confirmedCount: "已確認({{count}})",
|
|
469
469
|
confirming: "確認中",
|
|
@@ -475,14 +475,14 @@ const messages = {
|
|
|
475
475
|
createLink: "建立連結",
|
|
476
476
|
custom: "定制",
|
|
477
477
|
customLink: "自訂連結",
|
|
478
|
-
customLinkDescription: "貼上任何會議URL",
|
|
478
|
+
customLinkDescription: "貼上任何會議 URL",
|
|
479
479
|
date: "日期",
|
|
480
480
|
dateAndTime: "日期和時間",
|
|
481
481
|
dateSelection: "日期選取",
|
|
482
482
|
defaultDescription: "選取適合你的時間。",
|
|
483
483
|
deleteBookingLink: "刪除預訂連結",
|
|
484
484
|
deleteDescriptionPrefix: "這將永久刪除",
|
|
485
|
-
deleteDescriptionSuffix: "
|
|
485
|
+
deleteDescriptionSuffix: "及其公開預訂頁面。這無法復原。",
|
|
486
486
|
description: "使用公開連結建立會議型別並設定您的可用性。",
|
|
487
487
|
detailCount_one: "{{count}} 條詳情",
|
|
488
488
|
detailCount_other: "{{count}} 條詳情",
|
|
@@ -518,7 +518,7 @@ const messages = {
|
|
|
518
518
|
meetingLink: "會議連結",
|
|
519
519
|
meetingTypeUnavailable: "此會議型別可能已被移除或不再可用。",
|
|
520
520
|
meetingTypes: "會議型別",
|
|
521
|
-
meetingUrl: "會議URL",
|
|
521
|
+
meetingUrl: "會議 URL",
|
|
522
522
|
minuteMeeting: "{{count}}分鐘會議",
|
|
523
523
|
minutes: "分鐘",
|
|
524
524
|
minutesLong: "{{count}}分鐘",
|
|
@@ -537,7 +537,7 @@ const messages = {
|
|
|
537
537
|
noConferencing: "沒有會議",
|
|
538
538
|
noConferencingDescription: "親自、電話或稍後新增詳細資訊",
|
|
539
539
|
no: "否",
|
|
540
|
-
notesOptional: "
|
|
540
|
+
notesOptional: "註解(可選)",
|
|
541
541
|
notes: "備註",
|
|
542
542
|
notesPlaceholder: "任何您想分享的內容",
|
|
543
543
|
oneOnOne: "一對一",
|
|
@@ -622,7 +622,7 @@ const messages = {
|
|
|
622
622
|
display: "顯示",
|
|
623
623
|
endTimeAfterStart: "結束時間必須晚於開始時間",
|
|
624
624
|
eventDeleted: "事件已刪除",
|
|
625
|
-
eventMoved: "
|
|
625
|
+
eventMoved: "事件已移動",
|
|
626
626
|
eventRemoved: "事件已移除",
|
|
627
627
|
eventUpdated: "事件已更新",
|
|
628
628
|
failedDeleteEvent: "刪除事件失敗",
|
|
@@ -660,11 +660,11 @@ const messages = {
|
|
|
660
660
|
allEvents: "所有活動",
|
|
661
661
|
applyChangesTo: "將更改應用到",
|
|
662
662
|
applyTo: "適用於",
|
|
663
|
-
askAi: "
|
|
663
|
+
askAi: "詢問人工智慧",
|
|
664
664
|
atStart: "開始時",
|
|
665
665
|
attachments: "附件",
|
|
666
666
|
attendees: "出席者",
|
|
667
|
-
attendeesPlaceholder: "
|
|
667
|
+
attendeesPlaceholder: "搜尋聯絡人或輸入電子郵件",
|
|
668
668
|
added: "已新增",
|
|
669
669
|
awaiting: "等待中",
|
|
670
670
|
busy: "忙",
|
|
@@ -680,7 +680,7 @@ const messages = {
|
|
|
680
680
|
conferencingLinkOnSave: "儲存活動時會新增會議連結。",
|
|
681
681
|
connectZoomBeforeCreate: "在建立此事件之前連線 Zoom。",
|
|
682
682
|
create: "建立",
|
|
683
|
-
createAndSend: "
|
|
683
|
+
createAndSend: "建立並傳送",
|
|
684
684
|
createEvent: "建立活動",
|
|
685
685
|
createFailed: "建立事件失敗",
|
|
686
686
|
creating: "創造……",
|
|
@@ -692,7 +692,7 @@ const messages = {
|
|
|
692
692
|
default: "預設",
|
|
693
693
|
delete: "刪除",
|
|
694
694
|
description: "描述",
|
|
695
|
-
directorySearchLimited: "
|
|
695
|
+
directorySearchLimited: "目錄搜尋受限。輸入完整信箱並按 Enter 新增。",
|
|
696
696
|
discard: "丟棄",
|
|
697
697
|
doesNotRepeat: "不重複",
|
|
698
698
|
draftEvent: "選秀活動",
|
|
@@ -716,10 +716,10 @@ const messages = {
|
|
|
716
716
|
googleCalendar: "Google Calendar",
|
|
717
717
|
googleMeet: "Google Meet",
|
|
718
718
|
googleMeetAdded: "新增了 Google Meet",
|
|
719
|
-
googleMeetAddFailed: "新增Google Meet失敗",
|
|
720
|
-
home: "
|
|
719
|
+
googleMeetAddFailed: "新增 Google Meet失敗",
|
|
720
|
+
home: "首頁",
|
|
721
721
|
invite: "邀請",
|
|
722
|
-
invitedNotice: "{{count}} 受邀 — Google
|
|
722
|
+
invitedNotice: "{{count}} 受邀 — Google 在您建立時會向他們傳送電子郵件",
|
|
723
723
|
joinMeet: "加入聚會",
|
|
724
724
|
joinMeeting: "加入會議",
|
|
725
725
|
joinTeams: "加入團隊",
|
|
@@ -755,7 +755,7 @@ const messages = {
|
|
|
755
755
|
private: "私人",
|
|
756
756
|
press: "按",
|
|
757
757
|
public: "公開",
|
|
758
|
-
recurringResponseScope: "
|
|
758
|
+
recurringResponseScope: "重複回覆範圍",
|
|
759
759
|
repeats: "重複",
|
|
760
760
|
reviewInvite: "審核邀請",
|
|
761
761
|
responseAwaitingCount: "{{count}} 等待中",
|
|
@@ -769,16 +769,16 @@ const messages = {
|
|
|
769
769
|
rsvpTentative: "可能",
|
|
770
770
|
rsvpYes: "是",
|
|
771
771
|
save: "儲存",
|
|
772
|
-
saveRecurringResponseStatus: "
|
|
773
|
-
saveResponse: "
|
|
774
|
-
saveResponseStatus: "
|
|
772
|
+
saveRecurringResponseStatus: "儲存重複事件的回覆狀態",
|
|
773
|
+
saveResponse: "儲存回覆",
|
|
774
|
+
saveResponseStatus: "儲存回覆狀態",
|
|
775
775
|
savedAsVideoLink: "已儲存為本次活動的影片連結",
|
|
776
|
-
searchPeoplePlaceholder: "
|
|
776
|
+
searchPeoplePlaceholder: "按姓名搜尋或輸入信箱...",
|
|
777
777
|
seeAllParticipants: "檢視全部 {{count}} 位參與者",
|
|
778
778
|
selectedEvent: "所選事件",
|
|
779
|
-
sendCancellationDescription: "
|
|
780
|
-
sendUpdate: "
|
|
781
|
-
sendUpdateDescription: "
|
|
779
|
+
sendCancellationDescription: "向來賓傳送取消通知,可附加備註。",
|
|
780
|
+
sendUpdate: "傳送更新",
|
|
781
|
+
sendUpdateDescription: "向來賓傳送更新通知,可附加備註。",
|
|
782
782
|
showAs: "顯示為",
|
|
783
783
|
showLess: "收起",
|
|
784
784
|
showMore: "顯示更多",
|
|
@@ -804,7 +804,7 @@ const messages = {
|
|
|
804
804
|
video: "影片",
|
|
805
805
|
viewTeammateCalendar: "檢視隊友的行事曆",
|
|
806
806
|
viewingOwnerCalendar: "檢視 {{owner}} 的行事曆",
|
|
807
|
-
yourResponse: "
|
|
807
|
+
yourResponse: "你的回覆:{{status}}",
|
|
808
808
|
visibility: "能見度",
|
|
809
809
|
weekly: "每週",
|
|
810
810
|
workingFrom: "工作自",
|
|
@@ -15,20 +15,34 @@ export interface BookingOgAssetStorage {
|
|
|
15
15
|
getItemRaw?(id: string): Promise<unknown>;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
function resolveSourceFontPath(relativePath: string): string {
|
|
19
|
+
try {
|
|
20
|
+
const metaUrl = import.meta.url;
|
|
21
|
+
if (!metaUrl.startsWith("file:")) return "";
|
|
22
|
+
return fileURLToPath(new URL(relativePath, metaUrl));
|
|
23
|
+
} catch {
|
|
24
|
+
return "";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
18
28
|
export const BOOKING_OG_FONT_ASSETS: BookingOgFontAsset[] = [
|
|
19
29
|
{
|
|
20
30
|
asset: "server/fonts/LiberationSans-Regular.ttf",
|
|
21
31
|
filename: "LiberationSans-Regular.ttf",
|
|
22
|
-
sourcePath
|
|
23
|
-
|
|
24
|
-
|
|
32
|
+
get sourcePath() {
|
|
33
|
+
return resolveSourceFontPath(
|
|
34
|
+
"../../assets/fonts/LiberationSans-Regular.ttf",
|
|
35
|
+
);
|
|
36
|
+
},
|
|
25
37
|
},
|
|
26
38
|
{
|
|
27
39
|
asset: "server/fonts/LiberationSans-Bold.ttf",
|
|
28
40
|
filename: "LiberationSans-Bold.ttf",
|
|
29
|
-
sourcePath
|
|
30
|
-
|
|
31
|
-
|
|
41
|
+
get sourcePath() {
|
|
42
|
+
return resolveSourceFontPath(
|
|
43
|
+
"../../assets/fonts/LiberationSans-Bold.ttf",
|
|
44
|
+
);
|
|
45
|
+
},
|
|
32
46
|
},
|
|
33
47
|
];
|
|
34
48
|
|
|
@@ -24,14 +24,10 @@ const BORDER = "#1f1f1f";
|
|
|
24
24
|
const FG = "#ededed";
|
|
25
25
|
const MUTED = "#a0a0a0";
|
|
26
26
|
const FONT_FAMILY = "Liberation Sans, Arial, system-ui, sans-serif";
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
fileURLToPath(
|
|
32
|
-
new URL("../../assets/fonts/LiberationSans-Bold.ttf", import.meta.url),
|
|
33
|
-
),
|
|
34
|
-
].filter((fontFile) => existsSync(fontFile));
|
|
27
|
+
const FONT_SOURCE_PATHS = [
|
|
28
|
+
"../../assets/fonts/LiberationSans-Regular.ttf",
|
|
29
|
+
"../../assets/fonts/LiberationSans-Bold.ttf",
|
|
30
|
+
] as const;
|
|
35
31
|
const AVATAR_CX = 996;
|
|
36
32
|
const AVATAR_CY = 170;
|
|
37
33
|
const AVATAR_SIZE = 172;
|
|
@@ -298,11 +294,23 @@ interface BookingOgRenderOptions {
|
|
|
298
294
|
fontFiles?: string[];
|
|
299
295
|
}
|
|
300
296
|
|
|
297
|
+
function resolveSourceFontFiles(): string[] {
|
|
298
|
+
try {
|
|
299
|
+
const metaUrl = import.meta.url;
|
|
300
|
+
if (!metaUrl.startsWith("file:")) return [];
|
|
301
|
+
return FONT_SOURCE_PATHS.map((sourcePath) =>
|
|
302
|
+
fileURLToPath(new URL(sourcePath, metaUrl)),
|
|
303
|
+
).filter((fontFile) => existsSync(fontFile));
|
|
304
|
+
} catch {
|
|
305
|
+
return [];
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
301
309
|
function bookingOgResvgOptions(
|
|
302
310
|
options: BookingOgRenderOptions = {},
|
|
303
311
|
): ResvgRenderOptions {
|
|
304
312
|
const fontFiles = (
|
|
305
|
-
options.fontFiles?.length ? options.fontFiles :
|
|
313
|
+
options.fontFiles?.length ? options.fontFiles : resolveSourceFontFiles()
|
|
306
314
|
).filter((fontFile) => existsSync(fontFile));
|
|
307
315
|
const hasBundledFonts = fontFiles.length > 0;
|
|
308
316
|
return {
|
|
@@ -137,8 +137,8 @@ export function Layout({ children }: LayoutProps) {
|
|
|
137
137
|
|
|
138
138
|
return (
|
|
139
139
|
<HeaderActionsProvider>
|
|
140
|
-
<div className="flex h-screen w-full overflow-hidden bg-background text-foreground">
|
|
141
|
-
<div className="hidden md:block">
|
|
140
|
+
<div className="agent-layout-shell flex h-screen w-full overflow-hidden bg-background text-foreground">
|
|
141
|
+
<div className="agent-layout-left-drawer hidden md:block">
|
|
142
142
|
<Sidebar
|
|
143
143
|
collapsed={sidebarCollapsed}
|
|
144
144
|
onCollapsedChange={setSidebarCollapsed}
|
|
@@ -156,7 +156,9 @@ export function Layout({ children }: LayoutProps) {
|
|
|
156
156
|
</SheetContent>
|
|
157
157
|
</Sheet>
|
|
158
158
|
{isChatRoute ? (
|
|
159
|
-
|
|
159
|
+
<div className="agent-layout-main-surface flex min-w-0 flex-1 overflow-hidden">
|
|
160
|
+
{contentFrame}
|
|
161
|
+
</div>
|
|
160
162
|
) : (
|
|
161
163
|
<AgentSidebar
|
|
162
164
|
position="right"
|
|
@@ -29,9 +29,9 @@ const messages = {
|
|
|
29
29
|
newChat: "新建聊天",
|
|
30
30
|
optionsFor: "選項:",
|
|
31
31
|
pinChat: "置頂聊天",
|
|
32
|
-
renameChat: "
|
|
33
|
-
renameFailed: "
|
|
34
|
-
renameThread: "
|
|
32
|
+
renameChat: "重新命名聊天",
|
|
33
|
+
renameFailed: "重新命名失敗",
|
|
34
|
+
renameThread: "重新命名對話",
|
|
35
35
|
suggestionActions: "顯示可用操作",
|
|
36
36
|
suggestionCapabilities: "這個應用能做什麼?",
|
|
37
37
|
suggestionCustomize: "幫我自訂此應用",
|
|
@@ -73,6 +73,12 @@ Detailed media, meeting, dictation, editing, and sharing rules live in
|
|
|
73
73
|
sanitized URL with query values redacted, status, duration), plus
|
|
74
74
|
`consoleIssues` and `failedNetworkRequests` highlights. All bounded; page
|
|
75
75
|
URL, headers, bodies, and cookies stay omitted.
|
|
76
|
+
- Embedded bug reports use `/bug-report` as an iframe-friendly launcher and
|
|
77
|
+
`/record?intent=bug-report` for the actual top-level capture flow. The
|
|
78
|
+
launcher stores redacted host metadata through `save-bug-report-context`; the
|
|
79
|
+
recording remains the canonical resource and defaults to workspace visibility.
|
|
80
|
+
Do not present this as anonymous customer intake until a signed intake/upload
|
|
81
|
+
token flow exists, because the current upload endpoints are owner-scoped.
|
|
76
82
|
- The Chrome extension lives in `chrome-extension/`. It launches `/record` with
|
|
77
83
|
`clipsExtensionId` and `clipsCaptureSessionId`, then the recorder sends
|
|
78
84
|
`CLIPS_CAPTURE_START/STOP/CANCEL` back to the extension. The extension uses
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
|
|
23
23
|
export default defineAction({
|
|
24
24
|
description:
|
|
25
|
-
"Permanently delete a recording and every related row (comments, reactions, viewers, events, transcript, tags, CTAs, shares). This cannot be undone.",
|
|
25
|
+
"Permanently delete a recording and every related row (comments, reactions, viewers, events, transcript, tags, CTAs, shares, diagnostics, bug reports). This cannot be undone.",
|
|
26
26
|
schema: z.object({
|
|
27
27
|
id: z.string().describe("Recording ID"),
|
|
28
28
|
}),
|
|
@@ -57,6 +57,12 @@ export default defineAction({
|
|
|
57
57
|
await db
|
|
58
58
|
.delete(schema.recordingTranscripts)
|
|
59
59
|
.where(eq(schema.recordingTranscripts.recordingId, args.id));
|
|
60
|
+
await db
|
|
61
|
+
.delete(schema.recordingBrowserDiagnostics)
|
|
62
|
+
.where(eq(schema.recordingBrowserDiagnostics.recordingId, args.id));
|
|
63
|
+
await db
|
|
64
|
+
.delete(schema.recordingBugReports)
|
|
65
|
+
.where(eq(schema.recordingBugReports.recordingId, args.id));
|
|
60
66
|
await db
|
|
61
67
|
.delete(schema.recordingTags)
|
|
62
68
|
.where(eq(schema.recordingTags.recordingId, args.id));
|
|
@@ -33,6 +33,39 @@ import {
|
|
|
33
33
|
parseTranscriptSegments,
|
|
34
34
|
} from "../shared/transcript-segments.js";
|
|
35
35
|
|
|
36
|
+
function safeJsonObject(raw: string | null | undefined) {
|
|
37
|
+
if (!raw) return {};
|
|
38
|
+
try {
|
|
39
|
+
const parsed = JSON.parse(raw);
|
|
40
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed)
|
|
41
|
+
? parsed
|
|
42
|
+
: {};
|
|
43
|
+
} catch {
|
|
44
|
+
return {};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function mapBugReport(row: typeof schema.recordingBugReports._.inferSelect) {
|
|
49
|
+
return {
|
|
50
|
+
recordingId: row.recordingId,
|
|
51
|
+
projectId: row.projectId,
|
|
52
|
+
title: row.title,
|
|
53
|
+
description: row.description,
|
|
54
|
+
severity: row.severity,
|
|
55
|
+
sourceUrl: row.sourceUrl,
|
|
56
|
+
pageTitle: row.pageTitle,
|
|
57
|
+
appVersion: row.appVersion,
|
|
58
|
+
environment: row.environment,
|
|
59
|
+
reporterEmail: row.reporterEmail,
|
|
60
|
+
reporterName: row.reporterName,
|
|
61
|
+
reporterId: row.reporterId,
|
|
62
|
+
metadata: safeJsonObject(row.metadataJson),
|
|
63
|
+
submittedAt: row.submittedAt,
|
|
64
|
+
createdAt: row.createdAt,
|
|
65
|
+
updatedAt: row.updatedAt,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
36
69
|
function recordingDeepLink(recordingId: string): string {
|
|
37
70
|
return buildDeepLink({
|
|
38
71
|
app: "clips",
|
|
@@ -112,10 +145,15 @@ export default defineAction({
|
|
|
112
145
|
const browserDiagnostics = parseBrowserDiagnosticsRow(
|
|
113
146
|
browserDiagnosticsRow,
|
|
114
147
|
);
|
|
115
|
-
const
|
|
148
|
+
const canInspectSensitiveContext =
|
|
116
149
|
access.role === "owner" ||
|
|
117
150
|
access.role === "admin" ||
|
|
118
151
|
access.role === "editor";
|
|
152
|
+
const [bugReportRow] = await db
|
|
153
|
+
.select()
|
|
154
|
+
.from(schema.recordingBugReports)
|
|
155
|
+
.where(eq(schema.recordingBugReports.recordingId, args.recordingId))
|
|
156
|
+
.limit(1);
|
|
119
157
|
|
|
120
158
|
// Reverse-lookup: if a meeting captured this recording, surface it so the
|
|
121
159
|
// player can show a "From meeting: <title>" badge linking back to the
|
|
@@ -289,10 +327,14 @@ export default defineAction({
|
|
|
289
327
|
placement: c.placement,
|
|
290
328
|
})),
|
|
291
329
|
browserDiagnostics: browserDiagnostics
|
|
292
|
-
?
|
|
330
|
+
? canInspectSensitiveContext
|
|
293
331
|
? browserDiagnostics
|
|
294
332
|
: { summary: browserDiagnostics.summary }
|
|
295
333
|
: null,
|
|
334
|
+
bugReport:
|
|
335
|
+
bugReportRow && canInspectSensitiveContext
|
|
336
|
+
? mapBugReport(bugReportRow)
|
|
337
|
+
: null,
|
|
296
338
|
meeting,
|
|
297
339
|
};
|
|
298
340
|
},
|