@agent-native/core 0.102.1 → 0.103.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +15 -0
- package/corpus/core/docs/content/local-file-mode.mdx +99 -489
- package/corpus/core/docs/content/locales/ar-SA/local-file-mode.mdx +35 -490
- package/corpus/core/docs/content/locales/ar-SA/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/de-DE/local-file-mode.mdx +37 -491
- package/corpus/core/docs/content/locales/de-DE/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/es-ES/local-file-mode.mdx +35 -493
- package/corpus/core/docs/content/locales/es-ES/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/fr-FR/local-file-mode.mdx +38 -491
- package/corpus/core/docs/content/locales/fr-FR/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/hi-IN/local-file-mode.mdx +33 -492
- package/corpus/core/docs/content/locales/hi-IN/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/ja-JP/local-file-mode.mdx +36 -492
- package/corpus/core/docs/content/locales/ja-JP/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/ko-KR/local-file-mode.mdx +35 -490
- package/corpus/core/docs/content/locales/ko-KR/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/pt-BR/local-file-mode.mdx +35 -493
- package/corpus/core/docs/content/locales/pt-BR/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/zh-CN/local-file-mode.mdx +31 -489
- package/corpus/core/docs/content/locales/zh-CN/template-content.mdx +9 -24
- package/corpus/core/docs/content/locales/zh-TW/local-file-mode.mdx +31 -489
- package/corpus/core/docs/content/locales/zh-TW/template-content.mdx +9 -24
- package/corpus/core/docs/content/template-content.mdx +26 -42
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/cli/content-local.ts +86 -18
- package/corpus/core/src/cli/index.ts +2 -2
- package/corpus/core/src/cli/skills-content/content-skill.ts +36 -25
- package/corpus/core/src/cli/skills.ts +47 -13
- package/corpus/core/src/client/AgentPanel.tsx +7 -0
- package/corpus/core/src/client/AssistantChat.tsx +7 -0
- package/corpus/core/src/client/agent-chat-adapter.ts +7 -1
- package/corpus/core/src/client/chat/message-components.tsx +17 -3
- package/corpus/core/src/client/composer/ComposerPlusMenu.tsx +96 -6
- package/corpus/core/src/client/composer/asset-picker-url.ts +80 -0
- package/corpus/core/src/client/error-format.ts +24 -0
- package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +8 -1
- package/corpus/core/src/local-artifacts/index.ts +65 -0
- package/corpus/templates/assets/app/components/library/GenerationPresetsPanel.tsx +325 -0
- package/corpus/templates/assets/app/hooks/use-navigation-state.ts +12 -0
- package/corpus/templates/assets/app/i18n/zh-TW.ts +21 -0
- package/corpus/templates/assets/app/i18n-data.ts +215 -0
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +19 -479
- package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +1 -1
- package/corpus/templates/assets/app/routes/brand-kits.$id_.settings.tsx +446 -0
- package/corpus/templates/assets/app/routes/library.tsx +69 -0
- package/corpus/templates/assets/changelog/2026-07-15-fixed-top-level-image-picker-selections-returning-to-the-com.md +6 -0
- package/corpus/templates/clips/actions/disconnect-calendar.ts +57 -9
- package/corpus/templates/clips/actions/generate-workflow.ts +102 -59
- package/corpus/templates/clips/actions/get-recording-player-data.ts +64 -1
- package/corpus/templates/clips/actions/regenerate-summary.ts +7 -0
- package/corpus/templates/clips/actions/regenerate-title.ts +29 -11
- package/corpus/templates/clips/app/components/editor/editor-layout.tsx +34 -13
- package/corpus/templates/clips/app/components/editor/thumbnail-picker.tsx +87 -9
- package/corpus/templates/clips/app/components/editor/trim-handles.tsx +15 -0
- package/corpus/templates/clips/app/components/editor/waveform.tsx +21 -8
- package/corpus/templates/clips/app/components/library/folder-tree.tsx +52 -0
- package/corpus/templates/clips/app/components/player/settings-panel.tsx +116 -58
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +43 -37
- package/corpus/templates/clips/app/components/player/video-player.tsx +50 -2
- package/corpus/templates/clips/app/components/recorder/microphone-visualizer.tsx +22 -3
- package/corpus/templates/clips/app/i18n/ar-SA.ts +5 -2
- package/corpus/templates/clips/app/i18n/de-DE.ts +6 -2
- package/corpus/templates/clips/app/i18n/en-US.ts +5 -2
- package/corpus/templates/clips/app/i18n/es-ES.ts +6 -2
- package/corpus/templates/clips/app/i18n/fr-FR.ts +5 -2
- package/corpus/templates/clips/app/i18n/hi-IN.ts +5 -2
- package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -1
- package/corpus/templates/clips/app/i18n/ko-KR.ts +5 -2
- package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -2
- package/corpus/templates/clips/app/i18n/zh-CN.ts +5 -2
- package/corpus/templates/clips/app/i18n/zh-TW.ts +5 -2
- package/corpus/templates/clips/app/lib/timestamp-mapping.ts +14 -0
- package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -2
- package/corpus/templates/clips/app/routes/_index.tsx +1 -2
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +98 -32
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +4 -1
- package/corpus/templates/clips/changelog/2026-07-15-ai-workflow-generation-now-stays-visible-avoids-duplicate-re.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-clip-playback-and-cta-controls-remain-interactive-through-ed.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-clip-titles-no-longer-describe-the-product-as-a-loom-alterna.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-description-regeneration-now-opens-the-agent-chat-so-progres.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-direct-recording-urls-now-respect-share-link-and-password-ac.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-disconnecting-a-calendar-now-clears-unrecorded-synced-meetin.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-folders-now-expose-rename-and-delete-actions-directly-in-the.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-recording-pages-now-explain-sign-in-access-and-avoid-showing.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-the-clips-extension-quick-actions-toolbar-can-be-moved-out-o.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-the-editor-now-skips-cut-sections-during-preview-and-keeps-t.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-thumbnail-capture-now-updates-previews-while-scrubbing-and-l.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-windows-permission-links-open-the-matching-settings-page.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/content-script.ts +117 -2
- package/corpus/templates/clips/chrome-extension/src/overlay.ts +27 -0
- package/corpus/templates/clips/desktop/src-tauri/tauri.conf.json +1 -1
- package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +139 -101
- package/corpus/templates/clips/server/lib/recording-page-access.ts +35 -0
- package/corpus/templates/clips/server/lib/share-password.ts +6 -3
- package/corpus/templates/content/.agents/skills/content/SKILL.md +26 -39
- package/corpus/templates/content/AGENTS.md +25 -30
- package/corpus/templates/content/actions/_builder-docs-client.ts +23 -0
- package/corpus/templates/content/actions/_content-database-source-adapters.ts +21 -3
- package/corpus/templates/content/actions/_content-files.ts +338 -0
- package/corpus/templates/content/actions/_content-space-access.ts +135 -0
- package/corpus/templates/content/actions/_content-spaces.ts +640 -0
- package/corpus/templates/content/actions/_database-source-utils.ts +90 -7
- package/corpus/templates/content/actions/_database-utils.ts +7 -1
- package/corpus/templates/content/actions/_local-file-documents.ts +0 -9
- package/corpus/templates/content/actions/_local-folder-source.ts +53 -0
- package/corpus/templates/content/actions/_property-utils.ts +9 -4
- package/corpus/templates/content/actions/add-database-item.ts +108 -65
- package/corpus/templates/content/actions/backfill-content-files.ts +22 -0
- package/corpus/templates/content/actions/connect-local-folder-source.ts +221 -0
- package/corpus/templates/content/actions/create-content-database.ts +129 -3
- package/corpus/templates/content/actions/create-document.ts +65 -55
- package/corpus/templates/content/actions/create-inline-content-database.ts +6 -1
- package/corpus/templates/content/actions/delete-content-database.ts +3 -0
- package/corpus/templates/content/actions/delete-document.ts +7 -11
- package/corpus/templates/content/actions/disconnect-local-folder-source.ts +175 -0
- package/corpus/templates/content/actions/duplicate-database-item.ts +10 -0
- package/corpus/templates/content/actions/duplicate-database-items.ts +13 -0
- package/corpus/templates/content/actions/edit-document.ts +2 -28
- package/corpus/templates/content/actions/ensure-content-spaces.ts +26 -0
- package/corpus/templates/content/actions/export-content-source.ts +47 -9
- package/corpus/templates/content/actions/get-document.ts +0 -14
- package/corpus/templates/content/actions/import-content-source.ts +43 -3
- package/corpus/templates/content/actions/list-content-spaces.ts +103 -0
- package/corpus/templates/content/actions/list-documents.ts +12 -9
- package/corpus/templates/content/actions/move-document.ts +3 -14
- package/corpus/templates/content/actions/pull-document.ts +0 -23
- package/corpus/templates/content/actions/remove-local-file-source.ts +50 -29
- package/corpus/templates/content/actions/resolve-local-folder-conflict.ts +442 -0
- package/corpus/templates/content/actions/reveal-local-source-file.ts +6 -17
- package/corpus/templates/content/actions/search-documents.ts +0 -34
- package/corpus/templates/content/actions/share-local-file-document.ts +25 -1
- package/corpus/templates/content/actions/submit-content-database-form.ts +12 -0
- package/corpus/templates/content/actions/sync-local-folder-source.ts +731 -0
- package/corpus/templates/content/actions/sync-manifest-local-folder-source.ts +123 -0
- package/corpus/templates/content/actions/update-content-database-view.ts +10 -1
- package/corpus/templates/content/actions/update-document.ts +0 -15
- package/corpus/templates/content/actions/view-screen.ts +2 -50
- package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +76 -62
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +70 -22
- package/corpus/templates/content/app/components/editor/database/grouping.ts +2 -1
- package/corpus/templates/content/app/components/editor/database/settings.tsx +23 -20
- package/corpus/templates/content/app/components/editor/database/shared.tsx +2 -0
- package/corpus/templates/content/app/components/editor/database/sidebar.tsx +330 -0
- package/corpus/templates/content/app/components/editor/database/types.ts +1 -0
- package/corpus/templates/content/app/components/editor/database/view-config.ts +3 -1
- package/corpus/templates/content/app/components/layout/Layout.tsx +25 -1
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +209 -113
- package/corpus/templates/content/app/components/sidebar/select-content-space.ts +31 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +16 -0
- package/corpus/templates/content/app/hooks/use-content-spaces.ts +39 -0
- package/corpus/templates/content/app/i18n/zh-TW.ts +11 -0
- package/corpus/templates/content/app/i18n-data.ts +75 -0
- package/corpus/templates/content/app/routes/_app.local-files.tsx +174 -65
- package/corpus/templates/content/changelog/2026-07-16-content-callouts-can-now-be-reviewed-and-published-to-builder.md +6 -0
- package/corpus/templates/content/changelog/2026-07-16-heading-5-and-heading-6-are-available-from-the-editor-slash-.md +6 -0
- package/corpus/templates/content/changelog/2026-07-16-organize-every-workspace-through-a-customizable-files-databa.md +6 -0
- package/corpus/templates/content/parity/matrix.md +2 -1
- package/corpus/templates/content/parity/matrix.ts +37 -1
- package/corpus/templates/content/scripts/dev-database.mjs +7 -5
- package/corpus/templates/content/server/db/schema.ts +113 -40
- package/corpus/templates/content/server/lib/document-context.ts +15 -1
- package/corpus/templates/content/server/lib/notion-sync.ts +6 -0
- package/corpus/templates/content/server/plugins/db.ts +153 -0
- package/corpus/templates/content/shared/api.ts +17 -3
- package/corpus/templates/content/shared/builder-mdx.ts +163 -16
- package/corpus/templates/design/.agents/skills/design-templates/SKILL.md +59 -0
- package/corpus/templates/design/AGENTS.md +6 -1
- package/corpus/templates/design/actions/create-design-from-template.ts +19 -7
- package/corpus/templates/design/actions/list-design-templates.ts +69 -21
- package/corpus/templates/design/actions/navigate.ts +2 -2
- package/corpus/templates/design/actions/view-screen.ts +15 -2
- package/corpus/templates/design/agent-native.app-skill.json +5 -0
- package/corpus/templates/design/app/components/design/design-canvas/external-preview.ts +7 -3
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +281 -56
- package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +14 -2
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +3 -2
- package/corpus/templates/design/app/i18n/zh-TW.ts +3 -3
- package/corpus/templates/design/app/i18n-data.ts +21 -2
- package/corpus/templates/design/app/i18n-template-feature.ts +218 -10
- package/corpus/templates/design/app/pages/Index.tsx +195 -24
- package/corpus/templates/design/app/pages/Templates.tsx +144 -55
- package/corpus/templates/design/app/pages/design-editor/generation-prompt-directives.ts +12 -1
- package/corpus/templates/design/changelog/2026-07-14-templates-now-appear-in-the-new-design-picker-with-previews-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-15-prototype-print-and-download-buttons-now-work-in-preview.md +6 -0
- package/corpus/templates/design/changelog/2026-07-15-templates-now-open-immediately-after-copying-even-while-the-.md +6 -0
- package/corpus/templates/design/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/mail/AGENTS.md +23 -18
- package/corpus/templates/mail/actions/bulk-archive.ts +32 -28
- package/corpus/templates/mail/actions/mark-read.ts +131 -20
- package/corpus/templates/mail/actions/mark-thread-read.ts +1 -1
- package/corpus/templates/mail/actions/move-email.ts +30 -24
- package/corpus/templates/mail/actions/send-email.ts +73 -68
- package/corpus/templates/mail/changelog/2026-07-15-unread-inbox-cleanup-now-completes-reliably.md +6 -0
- package/corpus/templates/mail/server/handlers/emails.ts +218 -209
- package/corpus/templates/mail/server/lib/bulk-mark-read.ts +30 -0
- package/corpus/templates/mail/server/lib/email-state.ts +198 -113
- package/corpus/templates/mail/server/lib/google-auth.ts +218 -25
- package/corpus/templates/mail/server/lib/jobs.ts +69 -74
- package/corpus/templates/mail/server/lib/local-email-store.ts +265 -0
- package/corpus/templates/mail/server/plugins/agent-chat.ts +6 -0
- package/corpus/templates/slides/actions/extract-pdf.ts +1 -1
- package/corpus/templates/slides/actions/import-file.ts +4 -1
- package/corpus/templates/slides/app/components/editor/ImageGenPanel.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +9 -12
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +29 -21
- package/corpus/templates/slides/app/i18n/ar-SA.ts +1 -0
- package/corpus/templates/slides/app/i18n/de-DE.ts +1 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +1 -0
- package/corpus/templates/slides/app/i18n/es-ES.ts +1 -0
- package/corpus/templates/slides/app/i18n/fr-FR.ts +1 -0
- package/corpus/templates/slides/app/i18n/hi-IN.ts +1 -0
- package/corpus/templates/slides/app/i18n/ja-JP.ts +1 -0
- package/corpus/templates/slides/app/i18n/ko-KR.ts +1 -0
- package/corpus/templates/slides/app/i18n/pt-BR.ts +1 -0
- package/corpus/templates/slides/app/i18n/zh-CN.ts +1 -0
- package/corpus/templates/slides/app/i18n/zh-TW.ts +1 -0
- package/corpus/templates/slides/changelog/2026-07-15-image-search-and-generation-controls-now-use-the-registered-.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-15-pdf-deck-references-can-be-imported-for-slide-inspiration-ag.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-15-stable-style-inspector-dock.md +6 -0
- package/dist/cli/content-local.d.ts +1 -0
- package/dist/cli/content-local.d.ts.map +1 -1
- package/dist/cli/content-local.js +75 -17
- package/dist/cli/content-local.js.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/skills-content/content-skill.d.ts +1 -1
- package/dist/cli/skills-content/content-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/content-skill.js +36 -25
- package/dist/cli/skills-content/content-skill.js.map +1 -1
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +47 -14
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +5 -0
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +7 -0
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +8 -1
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +4 -0
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +10 -3
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.js +58 -6
- package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
- package/dist/client/composer/asset-picker-url.d.ts +16 -0
- package/dist/client/composer/asset-picker-url.d.ts.map +1 -0
- package/dist/client/composer/asset-picker-url.js +64 -0
- package/dist/client/composer/asset-picker-url.js.map +1 -0
- package/dist/client/error-format.d.ts.map +1 -1
- package/dist/client/error-format.js +17 -0
- package/dist/client/error-format.js.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.js +6 -1
- package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/local-artifacts/index.d.ts +10 -0
- package/dist/local-artifacts/index.d.ts.map +1 -1
- package/dist/local-artifacts/index.js +39 -0
- package/dist/local-artifacts/index.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/docs/content/local-file-mode.mdx +99 -489
- package/docs/content/locales/ar-SA/local-file-mode.mdx +35 -490
- package/docs/content/locales/ar-SA/template-content.mdx +10 -24
- package/docs/content/locales/de-DE/local-file-mode.mdx +37 -491
- package/docs/content/locales/de-DE/template-content.mdx +10 -24
- package/docs/content/locales/es-ES/local-file-mode.mdx +35 -493
- package/docs/content/locales/es-ES/template-content.mdx +10 -24
- package/docs/content/locales/fr-FR/local-file-mode.mdx +38 -491
- package/docs/content/locales/fr-FR/template-content.mdx +10 -24
- package/docs/content/locales/hi-IN/local-file-mode.mdx +33 -492
- package/docs/content/locales/hi-IN/template-content.mdx +10 -24
- package/docs/content/locales/ja-JP/local-file-mode.mdx +36 -492
- package/docs/content/locales/ja-JP/template-content.mdx +10 -24
- package/docs/content/locales/ko-KR/local-file-mode.mdx +35 -490
- package/docs/content/locales/ko-KR/template-content.mdx +10 -24
- package/docs/content/locales/pt-BR/local-file-mode.mdx +35 -493
- package/docs/content/locales/pt-BR/template-content.mdx +10 -24
- package/docs/content/locales/zh-CN/local-file-mode.mdx +31 -489
- package/docs/content/locales/zh-CN/template-content.mdx +9 -24
- package/docs/content/locales/zh-TW/local-file-mode.mdx +31 -489
- package/docs/content/locales/zh-TW/template-content.mdx +9 -24
- package/docs/content/template-content.mdx +26 -42
- package/package.json +1 -1
- package/corpus/templates/assets/app/components/library/EditLibraryDialog.tsx +0 -126
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
|
|
3
|
+
import { getDbExec, isPostgres } from "@agent-native/core/db";
|
|
4
|
+
import {
|
|
5
|
+
getSettingsEmitter,
|
|
6
|
+
getUserSetting,
|
|
7
|
+
type StoreWriteOptions,
|
|
8
|
+
} from "@agent-native/core/settings";
|
|
9
|
+
import type { EmailMessage } from "@shared/types.js";
|
|
10
|
+
import { nanoid } from "nanoid";
|
|
11
|
+
|
|
12
|
+
const localEmailMutationLocks = new Map<string, Promise<unknown>>();
|
|
13
|
+
const LOCK_SETTING_KEY = "local-emails-mutation-lock";
|
|
14
|
+
const LOCK_LEASE_MS = 60_000;
|
|
15
|
+
const LOCK_ACQUIRE_TIMEOUT_MS = 10_000;
|
|
16
|
+
const LOCK_RETRY_MS = 25;
|
|
17
|
+
const LOCK_RELEASE_ATTEMPTS = 3;
|
|
18
|
+
const MAX_MUTATION_ATTEMPTS = 8;
|
|
19
|
+
|
|
20
|
+
interface LocalEmailMutationContext {
|
|
21
|
+
ownerKey: string;
|
|
22
|
+
expectedMailboxRaw?: string | null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
class LocalEmailWriteConflict extends Error {}
|
|
26
|
+
|
|
27
|
+
const localEmailMutationContext =
|
|
28
|
+
new AsyncLocalStorage<LocalEmailMutationContext>();
|
|
29
|
+
|
|
30
|
+
interface LocalEmailLease {
|
|
31
|
+
token: string;
|
|
32
|
+
expiresAt: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function settingsTable(): string {
|
|
36
|
+
return isPostgres() ? "public.settings" : "settings";
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function lockStorageKey(ownerEmail: string): string {
|
|
40
|
+
return `u:${ownerEmail.toLowerCase()}:${LOCK_SETTING_KEY}`;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function mailboxStorageKey(ownerEmail: string): string {
|
|
44
|
+
return `u:${ownerEmail}:local-emails`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function parseLease(raw: string | null): LocalEmailLease | null {
|
|
48
|
+
if (!raw) return null;
|
|
49
|
+
try {
|
|
50
|
+
const parsed = JSON.parse(raw) as Partial<LocalEmailLease>;
|
|
51
|
+
if (
|
|
52
|
+
typeof parsed.token === "string" &&
|
|
53
|
+
typeof parsed.expiresAt === "number"
|
|
54
|
+
) {
|
|
55
|
+
return { token: parsed.token, expiresAt: parsed.expiresAt };
|
|
56
|
+
}
|
|
57
|
+
} catch {}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function readLeaseRow(
|
|
62
|
+
ownerEmail: string,
|
|
63
|
+
): Promise<{ raw: string | null; lease: LocalEmailLease | null }> {
|
|
64
|
+
// Initialize the framework-owned settings table, then bypass the request
|
|
65
|
+
// settings cache so every lease attempt sees the latest committed owner row.
|
|
66
|
+
await getUserSetting(ownerEmail, LOCK_SETTING_KEY);
|
|
67
|
+
const { rows } = await getDbExec().execute({
|
|
68
|
+
sql: `SELECT value FROM ${settingsTable()} WHERE key = ?`,
|
|
69
|
+
args: [lockStorageKey(ownerEmail)],
|
|
70
|
+
});
|
|
71
|
+
const raw = rows.length ? String(rows[0].value ?? rows[0][0]) : null;
|
|
72
|
+
return { raw, lease: parseLease(raw) };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function compareAndSwapLease(
|
|
76
|
+
ownerEmail: string,
|
|
77
|
+
expectedRaw: string | null,
|
|
78
|
+
nextRaw: string,
|
|
79
|
+
): Promise<boolean> {
|
|
80
|
+
const client = getDbExec();
|
|
81
|
+
const key = lockStorageKey(ownerEmail);
|
|
82
|
+
if (expectedRaw === null) {
|
|
83
|
+
const result = await client.execute({
|
|
84
|
+
sql: isPostgres()
|
|
85
|
+
? `INSERT INTO ${settingsTable()} (key, value, updated_at) VALUES (?, ?, ?) ON CONFLICT (key) DO NOTHING`
|
|
86
|
+
: `INSERT OR IGNORE INTO ${settingsTable()} (key, value, updated_at) VALUES (?, ?, ?)`,
|
|
87
|
+
args: [key, nextRaw, Date.now()],
|
|
88
|
+
});
|
|
89
|
+
return result.rowsAffected === 1;
|
|
90
|
+
}
|
|
91
|
+
const result = await client.execute({
|
|
92
|
+
sql: `UPDATE ${settingsTable()} SET value = ?, updated_at = ? WHERE key = ? AND value = ?`,
|
|
93
|
+
args: [nextRaw, Date.now(), key, expectedRaw],
|
|
94
|
+
});
|
|
95
|
+
return result.rowsAffected === 1;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async function acquireDatabaseLease(ownerEmail: string): Promise<string> {
|
|
99
|
+
const token = nanoid(16);
|
|
100
|
+
const deadline = Date.now() + LOCK_ACQUIRE_TIMEOUT_MS;
|
|
101
|
+
while (Date.now() < deadline) {
|
|
102
|
+
const { raw, lease } = await readLeaseRow(ownerEmail);
|
|
103
|
+
const now = Date.now();
|
|
104
|
+
if (!lease || lease.expiresAt <= now) {
|
|
105
|
+
const nextRaw = JSON.stringify({
|
|
106
|
+
token,
|
|
107
|
+
expiresAt: now + LOCK_LEASE_MS,
|
|
108
|
+
} satisfies LocalEmailLease);
|
|
109
|
+
if (await compareAndSwapLease(ownerEmail, raw, nextRaw)) return nextRaw;
|
|
110
|
+
}
|
|
111
|
+
await new Promise((resolve) => setTimeout(resolve, LOCK_RETRY_MS));
|
|
112
|
+
}
|
|
113
|
+
throw new Error("Timed out waiting for local mailbox mutation lock");
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function releaseDatabaseLease(
|
|
117
|
+
ownerEmail: string,
|
|
118
|
+
leaseRaw: string,
|
|
119
|
+
): Promise<void> {
|
|
120
|
+
for (let attempt = 0; attempt < LOCK_RELEASE_ATTEMPTS; attempt += 1) {
|
|
121
|
+
try {
|
|
122
|
+
await getDbExec().execute({
|
|
123
|
+
sql: `DELETE FROM ${settingsTable()} WHERE key = ? AND value = ?`,
|
|
124
|
+
args: [lockStorageKey(ownerEmail), leaseRaw],
|
|
125
|
+
});
|
|
126
|
+
return;
|
|
127
|
+
} catch (error) {
|
|
128
|
+
if (attempt === LOCK_RELEASE_ATTEMPTS - 1) throw error;
|
|
129
|
+
await new Promise((resolve) => setTimeout(resolve, LOCK_RETRY_MS));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async function readMailboxRow(ownerEmail: string): Promise<string | null> {
|
|
135
|
+
// Initialize the settings table, then bypass its request cache so CAS retry
|
|
136
|
+
// attempts always compare against the latest committed mailbox snapshot.
|
|
137
|
+
await getUserSetting(ownerEmail, "local-emails");
|
|
138
|
+
const { rows } = await getDbExec().execute({
|
|
139
|
+
sql: `SELECT value FROM ${settingsTable()} WHERE key = ?`,
|
|
140
|
+
args: [mailboxStorageKey(ownerEmail)],
|
|
141
|
+
});
|
|
142
|
+
return rows.length ? String(rows[0].value ?? rows[0][0]) : null;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function parseEmails(raw: string | null): EmailMessage[] {
|
|
146
|
+
if (!raw) return [];
|
|
147
|
+
try {
|
|
148
|
+
const data = JSON.parse(raw);
|
|
149
|
+
return Array.isArray(data?.emails) ? data.emails : [];
|
|
150
|
+
} catch {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
async function compareAndSwapMailbox(
|
|
156
|
+
ownerEmail: string,
|
|
157
|
+
expectedRaw: string | null,
|
|
158
|
+
nextRaw: string,
|
|
159
|
+
): Promise<boolean> {
|
|
160
|
+
const client = getDbExec();
|
|
161
|
+
const key = mailboxStorageKey(ownerEmail);
|
|
162
|
+
if (expectedRaw === null) {
|
|
163
|
+
const result = await client.execute({
|
|
164
|
+
sql: isPostgres()
|
|
165
|
+
? `INSERT INTO ${settingsTable()} (key, value, updated_at) VALUES (?, ?, ?) ON CONFLICT (key) DO NOTHING`
|
|
166
|
+
: `INSERT OR IGNORE INTO ${settingsTable()} (key, value, updated_at) VALUES (?, ?, ?)`,
|
|
167
|
+
args: [key, nextRaw, Date.now()],
|
|
168
|
+
});
|
|
169
|
+
return result.rowsAffected === 1;
|
|
170
|
+
}
|
|
171
|
+
const result = await client.execute({
|
|
172
|
+
sql: `UPDATE ${settingsTable()} SET value = ?, updated_at = ? WHERE key = ? AND value = ?`,
|
|
173
|
+
args: [nextRaw, Date.now(), key, expectedRaw],
|
|
174
|
+
});
|
|
175
|
+
return result.rowsAffected === 1;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Serialize read-modify-write operations on an owner's synthetic mailbox.
|
|
180
|
+
* Local mail is one JSON document, so every writer must participate to avoid
|
|
181
|
+
* replacing a concurrent writer's newer snapshot.
|
|
182
|
+
*/
|
|
183
|
+
export function withLocalEmailMutationLock<T>(
|
|
184
|
+
ownerEmail: string,
|
|
185
|
+
mutate: () => Promise<T>,
|
|
186
|
+
): Promise<T> {
|
|
187
|
+
const key = ownerEmail.toLowerCase();
|
|
188
|
+
const previous = localEmailMutationLocks.get(key) ?? Promise.resolve();
|
|
189
|
+
const runWithDatabaseLease = async () => {
|
|
190
|
+
for (let attempt = 0; attempt < MAX_MUTATION_ATTEMPTS; attempt += 1) {
|
|
191
|
+
const leaseRaw = await acquireDatabaseLease(ownerEmail);
|
|
192
|
+
try {
|
|
193
|
+
return await localEmailMutationContext.run({ ownerKey: key }, mutate);
|
|
194
|
+
} catch (error) {
|
|
195
|
+
if (!(error instanceof LocalEmailWriteConflict)) throw error;
|
|
196
|
+
} finally {
|
|
197
|
+
try {
|
|
198
|
+
await releaseDatabaseLease(ownerEmail, leaseRaw);
|
|
199
|
+
} catch (error) {
|
|
200
|
+
// The lease expires and is token-scoped, so a transient cleanup
|
|
201
|
+
// failure must not turn an already committed mailbox write into an
|
|
202
|
+
// ambiguous failure that callers may retry.
|
|
203
|
+
console.warn(
|
|
204
|
+
"[local-email-store] failed to release mutation lease; it will expire",
|
|
205
|
+
error,
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
throw new Error("Local mailbox changed too many times; please retry");
|
|
211
|
+
};
|
|
212
|
+
const next = previous.then(runWithDatabaseLease, runWithDatabaseLease);
|
|
213
|
+
localEmailMutationLocks.set(key, next);
|
|
214
|
+
const cleanup = () => {
|
|
215
|
+
if (localEmailMutationLocks.get(key) === next) {
|
|
216
|
+
localEmailMutationLocks.delete(key);
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
next.then(cleanup, cleanup);
|
|
220
|
+
return next;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export async function readLocalEmails(
|
|
224
|
+
ownerEmail: string,
|
|
225
|
+
): Promise<EmailMessage[]> {
|
|
226
|
+
const raw = await readMailboxRow(ownerEmail);
|
|
227
|
+
const context = localEmailMutationContext.getStore();
|
|
228
|
+
if (context?.ownerKey === ownerEmail.toLowerCase()) {
|
|
229
|
+
context.expectedMailboxRaw = raw;
|
|
230
|
+
}
|
|
231
|
+
return parseEmails(raw);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export async function writeLocalEmails(
|
|
235
|
+
ownerEmail: string,
|
|
236
|
+
emails: EmailMessage[],
|
|
237
|
+
options?: StoreWriteOptions,
|
|
238
|
+
): Promise<void> {
|
|
239
|
+
const context = localEmailMutationContext.getStore();
|
|
240
|
+
if (
|
|
241
|
+
context?.ownerKey !== ownerEmail.toLowerCase() ||
|
|
242
|
+
context.expectedMailboxRaw === undefined
|
|
243
|
+
) {
|
|
244
|
+
throw new Error(
|
|
245
|
+
"Local mailbox writes must run inside withLocalEmailMutationLock after a fresh read",
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
const nextRaw = JSON.stringify({ emails });
|
|
249
|
+
if (
|
|
250
|
+
!(await compareAndSwapMailbox(
|
|
251
|
+
ownerEmail,
|
|
252
|
+
context.expectedMailboxRaw,
|
|
253
|
+
nextRaw,
|
|
254
|
+
))
|
|
255
|
+
) {
|
|
256
|
+
throw new LocalEmailWriteConflict("Local mailbox changed concurrently");
|
|
257
|
+
}
|
|
258
|
+
context.expectedMailboxRaw = nextRaw;
|
|
259
|
+
getSettingsEmitter().emit("settings", {
|
|
260
|
+
source: "settings",
|
|
261
|
+
type: "change",
|
|
262
|
+
key: mailboxStorageKey(ownerEmail),
|
|
263
|
+
...(options?.requestSource && { requestSource: options.requestSource }),
|
|
264
|
+
});
|
|
265
|
+
}
|
|
@@ -105,6 +105,12 @@ Available operations:
|
|
|
105
105
|
- Queue teammate-requested drafts for organization members to review and send
|
|
106
106
|
- Navigate the UI to specific views or threads
|
|
107
107
|
|
|
108
|
+
## Reliable Mail Mutations
|
|
109
|
+
|
|
110
|
+
For requests to mark all, every, or many unread conversations read in one account, call \`mark-read\` exactly once with \`scope: "all-unread"\` and the exact \`accountEmail\`. Resolve conversations the user wants preserved to exact thread IDs and pass them in \`excludeThreadIds\`. Never loop \`mark-thread-read\` for broad cleanup. Report the returned matched, excluded, changed, and remaining-unread counts; completeness comes from the action's verification read, not merely from a successful tool submission.
|
|
111
|
+
|
|
112
|
+
Use \`mark-thread-read\` for one specific conversation only.
|
|
113
|
+
|
|
108
114
|
## Provider APIs Are Escape Hatches, Not Limits
|
|
109
115
|
|
|
110
116
|
Provider-specific Mail actions are shortcuts, not limits. If a first-class action cannot express the exact Gmail, Google Calendar, or CRM endpoint, search query, label/filter setting, request body, pagination mode, account id, payload shape, or API version needed, call \`provider-api-catalog\` and \`provider-api-docs\` as needed, then call \`provider-api-request\` against the provider's real HTTP API.
|
|
@@ -11,7 +11,7 @@ export default async function (args: string[]) {
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
const buf = fs.readFileSync(pdfPath);
|
|
14
|
-
const pdf = new PDFParse(new Uint8Array(buf));
|
|
14
|
+
const pdf = new PDFParse({ data: new Uint8Array(buf) });
|
|
15
15
|
const result = await pdf.getText();
|
|
16
16
|
const pages = result.pages || [];
|
|
17
17
|
console.log("Total pages:", pages.length);
|
|
@@ -214,7 +214,10 @@ export default defineAction({
|
|
|
214
214
|
const { PDFParse } = await import("pdf-parse");
|
|
215
215
|
const { convertSectionsToSlides } =
|
|
216
216
|
await import("../server/handlers/import/html-converter.js");
|
|
217
|
-
|
|
217
|
+
// pdf-parse v2 expects a LoadParameters object. Passing the byte array
|
|
218
|
+
// directly uses the old v1 shape and can fail while pdf.js initializes
|
|
219
|
+
// in production (the reported DOMMatrix error).
|
|
220
|
+
const pdf = new PDFParse({ data: new Uint8Array(fileBuffer) });
|
|
218
221
|
const result = await pdf.getText();
|
|
219
222
|
const pages = normalizePdfPages(result);
|
|
220
223
|
const textPages = pages.filter((p) => p.text.trim());
|
|
@@ -69,7 +69,7 @@ export default function ImageGenPanel({
|
|
|
69
69
|
const contextParts: string[] = [];
|
|
70
70
|
|
|
71
71
|
contextParts.push(
|
|
72
|
-
"Generate 3 image variations
|
|
72
|
+
"Generate 3 image variations by calling the registered `generate-image-api` action three times with the same prompt.",
|
|
73
73
|
);
|
|
74
74
|
contextParts.push(
|
|
75
75
|
"The deliverables must be actual generated image assets from the action. Do not create placeholder HTML/CSS, oversized icon compositions, inline SVGs, or text-only mockups.",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { callAction, useT } from "@agent-native/core/client";
|
|
2
2
|
import { IconX, IconSearch, IconLoader2 } from "@tabler/icons-react";
|
|
3
3
|
import { useState, useEffect, useRef } from "react";
|
|
4
4
|
import { createPortal } from "react-dom";
|
|
@@ -61,18 +61,15 @@ export default function ImageSearchPanel({
|
|
|
61
61
|
setLoading(true);
|
|
62
62
|
setError(null);
|
|
63
63
|
try {
|
|
64
|
-
const
|
|
65
|
-
|
|
64
|
+
const data = await callAction<SearchResult[]>(
|
|
65
|
+
"search-images",
|
|
66
|
+
{ q: query.trim() },
|
|
67
|
+
{ method: "GET" },
|
|
66
68
|
);
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
} else {
|
|
72
|
-
setResults(await res.json());
|
|
73
|
-
}
|
|
74
|
-
} catch {
|
|
75
|
-
setError("Search failed");
|
|
69
|
+
setResults(data);
|
|
70
|
+
} catch (error) {
|
|
71
|
+
setError(error instanceof Error ? error.message : t("raw.searchFailed"));
|
|
72
|
+
setResults([]);
|
|
76
73
|
} finally {
|
|
77
74
|
setLoading(false);
|
|
78
75
|
}
|
|
@@ -1141,7 +1141,10 @@ export default function SlideEditor({
|
|
|
1141
1141
|
const selector = getBuilderSelector(el);
|
|
1142
1142
|
el.contentEditable = "true";
|
|
1143
1143
|
el.setAttribute("data-editing-block", "true");
|
|
1144
|
-
|
|
1144
|
+
// Keep the inspector selection mounted while text is being edited. The
|
|
1145
|
+
// inspector is a stable dock, so clearing it here would make the canvas
|
|
1146
|
+
// resize and auto-fit again on the second click.
|
|
1147
|
+
setSelectedElementRect(null);
|
|
1145
1148
|
captureInlineEditDraft(slide.id);
|
|
1146
1149
|
// Mark the deck dirty immediately so SSE/poll refreshes do not replace
|
|
1147
1150
|
// the deck under an active contentEditable edit, even before the user
|
|
@@ -1167,13 +1170,7 @@ export default function SlideEditor({
|
|
|
1167
1170
|
);
|
|
1168
1171
|
}
|
|
1169
1172
|
},
|
|
1170
|
-
[
|
|
1171
|
-
buildSelectionState,
|
|
1172
|
-
captureInlineEditDraft,
|
|
1173
|
-
clearSelectedElement,
|
|
1174
|
-
onInlineEditStart,
|
|
1175
|
-
slide.id,
|
|
1176
|
-
],
|
|
1173
|
+
[buildSelectionState, captureInlineEditDraft, onInlineEditStart, slide.id],
|
|
1177
1174
|
);
|
|
1178
1175
|
|
|
1179
1176
|
// Exit edit mode when switching slides — save pending content first so
|
|
@@ -2053,18 +2050,29 @@ export default function SlideEditor({
|
|
|
2053
2050
|
)}
|
|
2054
2051
|
</div>
|
|
2055
2052
|
|
|
2056
|
-
{
|
|
2057
|
-
<div
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2053
|
+
{!readOnly && (
|
|
2054
|
+
<div
|
|
2055
|
+
className="relative z-[70] hidden h-full w-[17rem] shrink-0 border-l border-border/70 bg-background/95 lg:block"
|
|
2056
|
+
data-slide-style-dock="true"
|
|
2057
|
+
>
|
|
2058
|
+
{selectedStyleSnapshot ? (
|
|
2059
|
+
<SlideStyleInspector
|
|
2060
|
+
snapshot={selectedStyleSnapshot}
|
|
2061
|
+
designSystem={designSystem}
|
|
2062
|
+
className="h-full w-full rounded-none border-0 bg-transparent shadow-none"
|
|
2063
|
+
onChange={applySelectedStylePatch}
|
|
2064
|
+
onClose={() => {
|
|
2065
|
+
clearSelectedElement();
|
|
2066
|
+
syncSelectionToAppState(null);
|
|
2067
|
+
}}
|
|
2068
|
+
/>
|
|
2069
|
+
) : (
|
|
2070
|
+
<div className="flex h-11 items-center border-b border-border/70 px-3">
|
|
2071
|
+
<span className="text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground/70">
|
|
2072
|
+
{t("styleInspector.title")}
|
|
2073
|
+
</span>
|
|
2074
|
+
</div>
|
|
2075
|
+
)}
|
|
2068
2076
|
</div>
|
|
2069
2077
|
)}
|
|
2070
2078
|
</div>
|
|
@@ -2082,7 +2090,7 @@ export default function SlideEditor({
|
|
|
2082
2090
|
viewportRect={selectionViewportRect}
|
|
2083
2091
|
/>
|
|
2084
2092
|
)}
|
|
2085
|
-
{selectedElementRect && (
|
|
2093
|
+
{selectedElementRect && !editingEl && (
|
|
2086
2094
|
<ElementSelectionOutline
|
|
2087
2095
|
rect={selectedElementRect}
|
|
2088
2096
|
viewportRect={selectionViewportRect}
|
|
@@ -103,6 +103,7 @@ const messages = {
|
|
|
103
103
|
searchImagesPlaceholder: "Buscar imagens...",
|
|
104
104
|
searchForLogosImagesIcons: "Buscar logos, imagens, ícones...",
|
|
105
105
|
search: "بحث",
|
|
106
|
+
searchFailed: "فشل البحث",
|
|
106
107
|
logoSearchTitle: "بحث عن الشعار",
|
|
107
108
|
searchCompanyLogo: "Busque uma empresa para encontrar seu logo",
|
|
108
109
|
searchCompanyPlaceholder: "Buscar nome da empresa (ex.: Intuit)",
|
|
@@ -106,6 +106,7 @@ const messages = {
|
|
|
106
106
|
searchImagesPlaceholder: "Nach Bildern suchen...",
|
|
107
107
|
searchForLogosImagesIcons: "Nach Logos, Bildern, Icons suchen...",
|
|
108
108
|
search: "Suchen",
|
|
109
|
+
searchFailed: "Suche fehlgeschlagen",
|
|
109
110
|
logoSearchTitle: "Logo-Suche",
|
|
110
111
|
searchCompanyLogo: "Suche nach einem Unternehmen, um sein Logo zu finden",
|
|
111
112
|
searchCompanyPlaceholder: "Unternehmensname suchen (z. B. Intuit)",
|
|
@@ -104,6 +104,7 @@ const messages = {
|
|
|
104
104
|
searchImagesPlaceholder: "Search for images...",
|
|
105
105
|
searchForLogosImagesIcons: "Search for logos, images, icons...",
|
|
106
106
|
search: "Search",
|
|
107
|
+
searchFailed: "Search failed",
|
|
107
108
|
logoSearchTitle: "Logo Search",
|
|
108
109
|
searchCompanyLogo: "Search for a company to find their logo",
|
|
109
110
|
searchCompanyPlaceholder: "Search company name (e.g. Intuit)",
|
|
@@ -105,6 +105,7 @@ const messages = {
|
|
|
105
105
|
searchImagesPlaceholder: "Buscar imágenes...",
|
|
106
106
|
searchForLogosImagesIcons: "Buscar logos, imágenes, iconos...",
|
|
107
107
|
search: "Buscar",
|
|
108
|
+
searchFailed: "Error al buscar",
|
|
108
109
|
logoSearchTitle: "Búsqueda de logos",
|
|
109
110
|
searchCompanyLogo: "Busca una empresa para encontrar su logo",
|
|
110
111
|
searchCompanyPlaceholder: "Buscar nombre de empresa (p. ej. Intuit)",
|
|
@@ -106,6 +106,7 @@ const messages = {
|
|
|
106
106
|
searchImagesPlaceholder: "Rechercher des images...",
|
|
107
107
|
searchForLogosImagesIcons: "Rechercher des logos, images, icônes...",
|
|
108
108
|
search: "Rechercher",
|
|
109
|
+
searchFailed: "Échec de la recherche",
|
|
109
110
|
logoSearchTitle: "Recherche de logo",
|
|
110
111
|
searchCompanyLogo: "Recherchez une entreprise pour trouver son logo",
|
|
111
112
|
searchCompanyPlaceholder: "Rechercher un nom d’entreprise (ex. Intuit)",
|
|
@@ -103,6 +103,7 @@ const messages = {
|
|
|
103
103
|
searchImagesPlaceholder: "Buscar imagens...",
|
|
104
104
|
searchForLogosImagesIcons: "Buscar logos, imagens, ícones...",
|
|
105
105
|
search: "खोजें",
|
|
106
|
+
searchFailed: "खोज विफल",
|
|
106
107
|
logoSearchTitle: "लोगो खोज",
|
|
107
108
|
searchCompanyLogo: "Busque uma empresa para encontrar seu logo",
|
|
108
109
|
searchCompanyPlaceholder: "Buscar nome da empresa (ex.: Intuit)",
|
|
@@ -104,6 +104,7 @@ const messages = {
|
|
|
104
104
|
searchImagesPlaceholder: "画像を検索...",
|
|
105
105
|
searchForLogosImagesIcons: "ロゴ、画像、アイコンを検索...",
|
|
106
106
|
search: "検索",
|
|
107
|
+
searchFailed: "検索に失敗しました",
|
|
107
108
|
logoSearchTitle: "ロゴ検索",
|
|
108
109
|
searchCompanyLogo: "会社を検索してロゴを見つける",
|
|
109
110
|
searchCompanyPlaceholder: "会社名を検索(例: Intuit)",
|
|
@@ -104,6 +104,7 @@ const messages = {
|
|
|
104
104
|
searchImagesPlaceholder: "画像を検索...",
|
|
105
105
|
searchForLogosImagesIcons: "ロゴ、画像、アイコンを検索...",
|
|
106
106
|
search: "검색",
|
|
107
|
+
searchFailed: "검색 실패",
|
|
107
108
|
logoSearchTitle: "로고 검색",
|
|
108
109
|
searchCompanyLogo: "会社を検索してロゴを見つける",
|
|
109
110
|
searchCompanyPlaceholder: "会社名を検索(例: Intuit)",
|
|
@@ -104,6 +104,7 @@ const messages = {
|
|
|
104
104
|
searchImagesPlaceholder: "Buscar imagens...",
|
|
105
105
|
searchForLogosImagesIcons: "Buscar logos, imagens, ícones...",
|
|
106
106
|
search: "Buscar",
|
|
107
|
+
searchFailed: "Falha na pesquisa",
|
|
107
108
|
logoSearchTitle: "Busca de logo",
|
|
108
109
|
searchCompanyLogo: "Busque uma empresa para encontrar seu logo",
|
|
109
110
|
searchCompanyPlaceholder: "Buscar nome da empresa (ex.: Intuit)",
|
|
@@ -102,6 +102,7 @@ const messages = {
|
|
|
102
102
|
searchImagesPlaceholder: "画像を検索...",
|
|
103
103
|
searchForLogosImagesIcons: "ロゴ、画像、アイコンを検索...",
|
|
104
104
|
search: "搜索",
|
|
105
|
+
searchFailed: "搜索失败",
|
|
105
106
|
logoSearchTitle: "徽标搜索",
|
|
106
107
|
searchCompanyLogo: "会社を検索してロゴを見つける",
|
|
107
108
|
searchCompanyPlaceholder: "会社名を検索(例: Intuit)",
|
|
@@ -100,6 +100,7 @@ const messages = {
|
|
|
100
100
|
searchImagesPlaceholder: "搜尋圖片...",
|
|
101
101
|
searchForLogosImagesIcons: "搜尋徽標、圖片、圖示...",
|
|
102
102
|
search: "搜尋",
|
|
103
|
+
searchFailed: "搜尋失敗",
|
|
103
104
|
logoSearchTitle: "徽標搜尋",
|
|
104
105
|
searchCompanyLogo: "搜尋公司以尋找徽標",
|
|
105
106
|
searchCompanyPlaceholder: "搜尋公司名稱(例如:Intuit)",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-local.d.ts","sourceRoot":"","sources":["../../src/cli/content-local.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"content-local.d.ts","sourceRoot":"","sources":["../../src/cli/content-local.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AA4CD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CA8CtE;AAuJD,wBAAgB,sBAAsB,CAAC,GAAG,SAAgB,UAmBzD;AAQD,wBAAsB,yBAAyB,CAAC,OAAO,EAAE;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAkDlC;AAgCD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,mBAmDnD"}
|