@agent-native/core 0.103.1 → 0.104.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 +30 -0
- package/corpus/core/package.json +9 -2
- package/corpus/core/src/agent/engine/credential-errors.ts +2 -2
- package/corpus/core/src/agent/production-agent.ts +30 -0
- package/corpus/core/src/agent/run-store.ts +12 -2
- package/corpus/core/src/cli/create.ts +1 -0
- package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +30 -11
- package/corpus/core/src/cli/templates-meta.ts +4 -3
- package/corpus/core/src/client/AgentAskPopover.tsx +89 -0
- package/corpus/core/src/client/AgentChatHome.tsx +4 -0
- package/corpus/core/src/client/AgentPanel.tsx +321 -223
- package/corpus/core/src/client/AssistantChat.tsx +6 -10
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +53 -372
- package/corpus/core/src/client/agent-chat-adapter.ts +13 -1
- package/corpus/core/src/client/agent-page/AgentContextTab.tsx +133 -149
- package/corpus/core/src/client/agent-page/AgentEmptyState.tsx +44 -0
- package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +153 -82
- package/corpus/core/src/client/agent-page/AgentTabFrame.tsx +39 -0
- package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +368 -356
- package/corpus/core/src/client/agent-page/types.ts +1 -1
- package/corpus/core/src/client/analytics.ts +51 -5
- package/corpus/core/src/client/chat/run-recovery.tsx +12 -4
- package/corpus/core/src/client/composer/PromptComposer.tsx +5 -15
- package/corpus/core/src/client/composer/TiptapComposer.tsx +32 -3
- package/corpus/core/src/client/dynamic-suggestions.ts +3 -3
- package/corpus/core/src/client/index.ts +16 -1
- package/corpus/core/src/client/resources/ResourceTree.tsx +249 -38
- package/corpus/core/src/client/resources/ResourcesPanel.tsx +307 -140
- package/corpus/core/src/client/session-replay.ts +158 -5
- package/corpus/core/src/client/settings/AutomationsSection.tsx +30 -10
- package/corpus/core/src/client/settings/SettingsPanel.tsx +3 -2
- package/corpus/core/src/client/settings/SettingsTabsPage.tsx +2 -0
- package/corpus/core/src/client/settings/agent-settings-search.ts +2 -2
- package/corpus/core/src/client/use-chat-threads.ts +2 -0
- package/corpus/core/src/connections/catalog.ts +49 -7
- package/corpus/core/src/db/index.ts +6 -1
- package/corpus/core/src/extensions/actions.ts +106 -16
- package/corpus/core/src/extensions/content-patch.ts +22 -0
- package/corpus/core/src/extensions/routes.ts +18 -0
- package/corpus/core/src/extensions/store.ts +8 -0
- package/corpus/core/src/index.ts +3 -0
- package/corpus/core/src/ingestion/docx.ts +158 -0
- package/corpus/core/src/ingestion/figma-node-to-html.ts +1860 -0
- package/corpus/core/src/ingestion/figma.ts +548 -0
- package/corpus/core/src/ingestion/index.ts +107 -0
- package/corpus/core/src/ingestion/media.ts +264 -0
- package/corpus/core/src/ingestion/notion.ts +121 -0
- package/corpus/core/src/ingestion/office.ts +214 -0
- package/corpus/core/src/ingestion/orchestration.ts +160 -0
- package/corpus/core/src/ingestion/pptx.ts +333 -0
- package/corpus/core/src/ingestion/selection.ts +81 -0
- package/corpus/core/src/ingestion/website.ts +151 -0
- package/corpus/core/src/integrations/plugin.ts +45 -37
- package/corpus/core/src/localization/default-messages.ts +35 -12
- package/corpus/core/src/observability/hosted-model-experiment.ts +118 -0
- package/corpus/core/src/observability/traces.ts +5 -3
- package/corpus/core/src/provider-api/index.ts +452 -8
- package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +18 -1
- package/corpus/core/src/search-utils/index.ts +112 -0
- package/corpus/core/src/secrets/register-framework-secrets.ts +61 -0
- package/corpus/core/src/server/action-discovery.ts +33 -8
- package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
- package/corpus/core/src/server/agent-chat/prompt-resources.ts +144 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +6 -0
- package/corpus/core/src/server/core-routes-plugin.ts +12 -0
- package/corpus/core/src/server/index.ts +30 -0
- package/corpus/core/src/server/workspace-provider-oauth.ts +583 -0
- package/corpus/core/src/styles/agent-native.css +9 -0
- package/corpus/core/src/templates/default/app/i18n/en-US.ts +3 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
- package/corpus/core/src/templates/workspace-root/.env.example +12 -0
- package/corpus/core/src/workspace-connections/index.ts +6 -0
- package/corpus/core/src/workspace-connections/lifecycle.ts +43 -0
- package/corpus/core/src/workspace-connections/store.ts +16 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +46 -3
- package/corpus/templates/analytics/AGENTS.md +9 -0
- package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +120 -6
- package/corpus/templates/analytics/actions/mutate-dashboard.ts +92 -30
- package/corpus/templates/analytics/actions/update-dashboard.ts +5 -5
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +313 -220
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -2
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +9 -6
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +90 -64
- package/corpus/templates/analytics/app/i18n-data.ts +3 -3
- package/corpus/templates/analytics/app/lib/dashboard-list-loading.ts +25 -0
- package/corpus/templates/analytics/app/lib/item-popularity.ts +13 -4
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/pivot.ts +8 -3
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +1 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +15 -3
- package/corpus/templates/analytics/changelog/2026-07-16-dashboard-filter-defaults-can-now-be-changed-reliably-withou.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-16-dashboard-lists-load-in-one-stable-order-without-popping-bet.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-16-fixed-dashboard-filter-dropdown-text-alignment.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-16-recurring-signed-in-users-can-now-be-viewed-as-weekly-bars-b.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-16-the-analytics-agent-can-now-duplicate-a-chart-and-place-the-.md +6 -0
- package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +41 -1
- package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -1
- package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +47 -1
- package/corpus/templates/analytics/server/lib/session-replay.ts +68 -0
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/analytics/server/routes/sessions/lookup.get.ts +47 -0
- package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +16 -9
- package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +86 -0
- package/corpus/templates/assets/AGENTS.md +10 -0
- package/corpus/templates/assets/actions/create-generation-session.ts +59 -1
- package/corpus/templates/assets/actions/edit-image.ts +2 -0
- package/corpus/templates/assets/actions/generate-asset.ts +52 -0
- package/corpus/templates/assets/actions/generate-image-batch.ts +55 -0
- package/corpus/templates/assets/actions/generate-image.ts +219 -1
- package/corpus/templates/assets/actions/open-asset-picker.ts +14 -0
- package/corpus/templates/assets/actions/refine-image.ts +3 -0
- package/corpus/templates/assets/actions/restyle-image.ts +2 -0
- package/corpus/templates/assets/agent-native.app-skill.json +4 -0
- package/corpus/templates/assets/app/components/layout/Layout.tsx +2 -0
- package/corpus/templates/assets/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/assets/app/i18n-data.ts +29 -13
- package/corpus/templates/assets/app/routes/agent.tsx +7 -1
- package/corpus/templates/assets/app/routes/library.tsx +9 -0
- package/corpus/templates/assets/app/routes/settings.tsx +3 -0
- package/corpus/templates/assets/changelog/2026-07-16-creative-context-library.md +6 -0
- package/corpus/templates/assets/package.json +1 -0
- package/corpus/templates/assets/server/lib/image-processing.ts +1 -22
- package/corpus/templates/assets/server/plugins/creative-context.ts +205 -0
- package/corpus/templates/brain/app/i18n-data.ts +3 -3
- package/corpus/templates/brain/app/lib/brain.ts +1 -1
- package/corpus/templates/brain/server/lib/search.ts +17 -67
- package/corpus/templates/calendar/app/i18n-data.ts +3 -3
- package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +19 -18
- package/corpus/templates/chat/app/i18n/en-US.ts +3 -3
- package/corpus/templates/chat/app/lib/agent-page.tsx +10 -1
- package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +1 -1
- package/corpus/templates/clips/AGENTS.md +4 -0
- package/corpus/templates/clips/actions/cleanup-transcript.ts +35 -4
- package/corpus/templates/clips/actions/create-meeting.ts +6 -2
- package/corpus/templates/clips/actions/create-organization.ts +3 -2
- package/corpus/templates/clips/actions/create-recording.ts +4 -1
- package/corpus/templates/clips/actions/finalize-recording.ts +44 -7
- package/corpus/templates/clips/actions/import-loom-recording.ts +4 -1
- package/corpus/templates/clips/actions/lib/create-recording-schema.ts +2 -2
- package/corpus/templates/clips/actions/list-meetings.ts +23 -5
- package/corpus/templates/clips/actions/list-organization-state.ts +1 -1
- package/corpus/templates/clips/actions/remove-silences.ts +10 -1
- package/corpus/templates/clips/actions/request-transcript.ts +53 -11
- package/corpus/templates/clips/actions/search-recordings-utils.ts +7 -0
- package/corpus/templates/clips/actions/search-recordings.ts +5 -8
- package/corpus/templates/clips/actions/set-organization-branding.ts +2 -2
- package/corpus/templates/clips/actions/stitch-recordings.ts +10 -5
- package/corpus/templates/clips/actions/update-ai-request-status.ts +38 -0
- package/corpus/templates/clips/app/components/editor/editor-layout.tsx +3 -4
- package/corpus/templates/clips/app/components/editor/editor-selection.ts +19 -0
- package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +10 -10
- package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +1 -2
- package/corpus/templates/clips/app/components/library/library-grid.tsx +101 -93
- package/corpus/templates/clips/app/components/player/video-player.tsx +11 -0
- package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +53 -1
- package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
- package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
- package/corpus/templates/clips/app/i18n/en-US.ts +10 -4
- package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
- package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
- package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
- package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
- package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
- package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
- package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -1
- package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -1
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +5 -9
- package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +6 -2
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +129 -27
- package/corpus/templates/clips/app/routes/record.tsx +23 -2
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -2
- package/corpus/templates/clips/changelog/2026-07-16-authorized-viewers-can-open-shared-private-clips-without-a-m.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-camera-bubble-hover-controls-appear-above-the-face.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-chrome-extension-recovers-stale-recorder-state.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-clips-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-clips-search-now-matches-recording-content-without-requiring.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-declined-meetings-no-longer-show-desktop-reminders.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-failed-desktop-saves-now-show-their-local-recovery-copy.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-long-desktop-clips-now-preserve-complete-playback-synced-aud.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-long-recording-lists-keep-stitch-and-library-actions-visible.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-organization-admins-can-choose-new-recording-visibility.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-remove-silences-now-shows-queued-active-completed-and-failed.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-settings-no-longer-repeats-the-builder-connection-status-in-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-transcripts-now-appear-from-native-browser-speech-sooner-wit.md +6 -0
- package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
- package/corpus/templates/clips/chrome-extension/src/background.ts +73 -1
- package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +32 -0
- package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +248 -0
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +106 -0
- package/corpus/templates/clips/desktop/src/app.tsx +66 -28
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +335 -285
- package/corpus/templates/clips/desktop/src/lib/single-flight.ts +7 -0
- package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +51 -0
- package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +2 -2
- package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +10 -2
- package/corpus/templates/clips/desktop/src/styles.css +13 -11
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +8 -9
- package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +1 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +88 -13
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +13 -2
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +241 -6
- package/corpus/templates/clips/server/db/schema.ts +2 -2
- package/corpus/templates/clips/server/lib/builder-media-compression.ts +64 -67
- package/corpus/templates/clips/server/lib/calendar-event-classification.ts +19 -0
- package/corpus/templates/clips/server/lib/google-calendar-client.ts +1 -0
- package/corpus/templates/clips/server/lib/recordings.ts +40 -1
- package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/clips/server/plugins/db.ts +2 -2
- package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +1 -1
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -5
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +51 -1
- package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +1 -64
- package/corpus/templates/clips/shared/media-worker-contract.ts +32 -15
- package/corpus/templates/content/.agents/skills/content/SKILL.md +16 -0
- package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +85 -0
- package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +8 -0
- package/corpus/templates/content/AGENTS.md +9 -0
- package/corpus/templates/content/actions/create-document.ts +94 -0
- package/corpus/templates/content/actions/edit-document.ts +144 -4
- package/corpus/templates/content/actions/update-document.ts +138 -0
- package/corpus/templates/content/agent-native.app-skill.json +4 -0
- package/corpus/templates/content/app/components/layout/Layout.tsx +2 -0
- package/corpus/templates/content/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/content/app/i18n-data.ts +13 -4
- package/corpus/templates/content/app/routes/_app.agent.tsx +2 -1
- package/corpus/templates/content/app/routes/_app.settings.tsx +3 -0
- package/corpus/templates/content/changelog/2026-07-16-creative-context-library.md +6 -0
- package/corpus/templates/content/package.json +1 -0
- package/corpus/templates/content/server/plugins/creative-context.ts +31 -0
- package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +116 -0
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
- package/corpus/templates/design/AGENTS.md +6 -0
- package/corpus/templates/design/actions/clone-creative-context-design.ts +176 -0
- package/corpus/templates/design/actions/edit-design.ts +128 -0
- package/corpus/templates/design/actions/generate-design.ts +278 -14
- package/corpus/templates/design/actions/generate-screens.ts +42 -1
- package/corpus/templates/design/agent-native.app-skill.json +4 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +7 -3
- package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/design/app/i18n-data.ts +10 -4
- package/corpus/templates/design/app/routes/agent.tsx +2 -1
- package/corpus/templates/design/app/routes/settings.tsx +3 -0
- package/corpus/templates/design/changelog/2026-07-16-creative-context-library.md +6 -0
- package/corpus/templates/design/changelog/2026-07-16-design-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
- package/corpus/templates/design/package.json +1 -0
- package/corpus/templates/design/server/lib/figma-design-context.ts +5 -335
- package/corpus/templates/design/server/lib/figma-node-to-html.ts +1 -1859
- package/corpus/templates/design/server/lib/import-design-files.ts +6 -8
- package/corpus/templates/design/server/plugins/creative-context.ts +31 -0
- package/corpus/templates/design/shared/generation-session.ts +7 -0
- package/corpus/templates/dispatch/app/i18n-data.ts +3 -3
- package/corpus/templates/forms/app/i18n/en-US.ts +3 -3
- package/corpus/templates/macros/app/i18n/en-US.ts +3 -3
- package/corpus/templates/mail/app/components/email/EmailThread.tsx +35 -5
- package/corpus/templates/mail/app/i18n/en-US.ts +3 -3
- package/corpus/templates/mail/changelog/2026-07-16-mail-previews-now-expand-to-show-the-full-message-without-an.md +6 -0
- package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +30 -11
- package/corpus/templates/plan/AGENTS.md +21 -1
- package/corpus/templates/plan/actions/get-visual-plan.ts +1 -1
- package/corpus/templates/plan/actions/patch-visual-plan-source.ts +161 -0
- package/corpus/templates/plan/actions/read-visual-plan-source.ts +1 -1
- package/corpus/templates/plan/actions/update-visual-plan.ts +126 -10
- package/corpus/templates/plan/app/hooks/use-plans.ts +2 -0
- package/corpus/templates/plan/app/i18n/en-US.ts +3 -3
- package/corpus/templates/plan/app/pages/PlansPage.tsx +65 -62
- package/corpus/templates/plan/changelog/2026-07-16-local-plan-previews-now-load-annotations-containing-html-lik.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-16-plan-agents-now-prevent-stale-edits-from-overwriting-newer-p.md +6 -0
- package/corpus/templates/plan/server/plan-mdx.ts +75 -2
- package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +21 -4
- package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +122 -0
- package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +11 -0
- package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +12 -3
- package/corpus/templates/slides/AGENTS.md +6 -0
- package/corpus/templates/slides/actions/add-slide.ts +230 -14
- package/corpus/templates/slides/actions/clone-context-slide.ts +302 -0
- package/corpus/templates/slides/actions/create-deck.ts +130 -0
- package/corpus/templates/slides/actions/extract-pdf.ts +6 -2
- package/corpus/templates/slides/actions/import-file.ts +5 -4
- package/corpus/templates/slides/actions/patch-deck.ts +200 -10
- package/corpus/templates/slides/actions/update-slide.ts +208 -15
- package/corpus/templates/slides/app/components/layout/Layout.tsx +2 -0
- package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +16 -1
- package/corpus/templates/slides/app/i18n/ar-SA.ts +3 -0
- package/corpus/templates/slides/app/i18n/de-DE.ts +3 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +6 -3
- package/corpus/templates/slides/app/i18n/es-ES.ts +3 -0
- package/corpus/templates/slides/app/i18n/fr-FR.ts +3 -0
- package/corpus/templates/slides/app/i18n/hi-IN.ts +3 -0
- package/corpus/templates/slides/app/i18n/ja-JP.ts +3 -0
- package/corpus/templates/slides/app/i18n/ko-KR.ts +3 -0
- package/corpus/templates/slides/app/i18n/pt-BR.ts +3 -0
- package/corpus/templates/slides/app/i18n/zh-CN.ts +3 -0
- package/corpus/templates/slides/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/slides/app/lib/validate-native-slide-html.ts +176 -0
- package/corpus/templates/slides/app/routes/agent.tsx +7 -1
- package/corpus/templates/slides/app/routes/settings.tsx +3 -0
- package/corpus/templates/slides/changelog/2026-07-16-creative-context-library.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-16-google-slides-native-cloning.md +6 -0
- package/corpus/templates/slides/package.json +1 -0
- package/corpus/templates/slides/server/handlers/import/docx-parser.ts +4 -85
- package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +7 -421
- package/corpus/templates/slides/server/plugins/creative-context.ts +166 -0
- package/dist/agent/engine/credential-errors.d.ts +1 -1
- package/dist/agent/engine/credential-errors.d.ts.map +1 -1
- package/dist/agent/engine/credential-errors.js +2 -2
- package/dist/agent/engine/credential-errors.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +25 -0
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +12 -2
- package/dist/agent/run-store.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +1 -0
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.js +30 -11
- package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +4 -3
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/AgentAskPopover.d.ts +11 -0
- package/dist/client/AgentAskPopover.d.ts.map +1 -0
- package/dist/client/AgentAskPopover.js +30 -0
- package/dist/client/AgentAskPopover.js.map +1 -0
- package/dist/client/AgentChatHome.d.ts +1 -1
- package/dist/client/AgentChatHome.d.ts.map +1 -1
- package/dist/client/AgentChatHome.js +2 -2
- package/dist/client/AgentChatHome.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +9 -19
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +119 -80
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +4 -4
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts +3 -9
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +49 -189
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +12 -1
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-page/AgentContextTab.d.ts.map +1 -1
- package/dist/client/agent-page/AgentContextTab.js +26 -28
- package/dist/client/agent-page/AgentContextTab.js.map +1 -1
- package/dist/client/agent-page/AgentEmptyState.d.ts +13 -0
- package/dist/client/agent-page/AgentEmptyState.d.ts.map +1 -0
- package/dist/client/agent-page/AgentEmptyState.js +6 -0
- package/dist/client/agent-page/AgentEmptyState.js.map +1 -0
- package/dist/client/agent-page/AgentJobsTab.d.ts +1 -1
- package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
- package/dist/client/agent-page/AgentJobsTab.js +90 -58
- package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
- package/dist/client/agent-page/AgentTabFrame.d.ts +12 -0
- package/dist/client/agent-page/AgentTabFrame.d.ts.map +1 -0
- package/dist/client/agent-page/AgentTabFrame.js +7 -0
- package/dist/client/agent-page/AgentTabFrame.js.map +1 -0
- package/dist/client/agent-page/AgentTabsPage.d.ts +9 -1
- package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
- package/dist/client/agent-page/AgentTabsPage.js +135 -99
- package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
- package/dist/client/agent-page/types.d.ts +1 -1
- package/dist/client/agent-page/types.d.ts.map +1 -1
- package/dist/client/agent-page/types.js.map +1 -1
- package/dist/client/analytics.d.ts +10 -3
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +37 -2
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +10 -3
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/composer/PromptComposer.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.js +2 -2
- package/dist/client/composer/PromptComposer.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +15 -3
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/dynamic-suggestions.js +3 -3
- package/dist/client/dynamic-suggestions.js.map +1 -1
- package/dist/client/index.d.ts +4 -3
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -2
- package/dist/client/index.js.map +1 -1
- package/dist/client/resources/ResourceTree.d.ts +5 -1
- package/dist/client/resources/ResourceTree.d.ts.map +1 -1
- package/dist/client/resources/ResourceTree.js +74 -5
- package/dist/client/resources/ResourceTree.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts +11 -2
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +105 -31
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/session-replay.d.ts +28 -0
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +122 -8
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/settings/AutomationsSection.d.ts +3 -1
- package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
- package/dist/client/settings/AutomationsSection.js +16 -6
- package/dist/client/settings/AutomationsSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +3 -3
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/SettingsTabsPage.d.ts +2 -0
- package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
- package/dist/client/settings/SettingsTabsPage.js.map +1 -1
- package/dist/client/settings/agent-settings-search.js +2 -2
- package/dist/client/settings/agent-settings-search.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts +2 -0
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/connections/catalog.d.ts +41 -7
- package/dist/connections/catalog.d.ts.map +1 -1
- package/dist/connections/catalog.js +40 -7
- package/dist/connections/catalog.js.map +1 -1
- package/dist/db/index.d.ts +2 -2
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +2 -2
- package/dist/db/index.js.map +1 -1
- package/dist/extensions/actions.d.ts.map +1 -1
- package/dist/extensions/actions.js +85 -15
- package/dist/extensions/actions.js.map +1 -1
- package/dist/extensions/content-patch.d.ts +4 -0
- package/dist/extensions/content-patch.d.ts.map +1 -1
- package/dist/extensions/content-patch.js +18 -0
- package/dist/extensions/content-patch.js.map +1 -1
- package/dist/extensions/routes.d.ts.map +1 -1
- package/dist/extensions/routes.js +14 -0
- package/dist/extensions/routes.js.map +1 -1
- package/dist/extensions/store.d.ts +1 -0
- package/dist/extensions/store.d.ts.map +1 -1
- package/dist/extensions/store.js +4 -1
- package/dist/extensions/store.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/ingestion/docx.d.ts +16 -0
- package/dist/ingestion/docx.d.ts.map +1 -0
- package/dist/ingestion/docx.js +129 -0
- package/dist/ingestion/docx.js.map +1 -0
- package/dist/ingestion/figma-node-to-html.d.ts +304 -0
- package/dist/ingestion/figma-node-to-html.d.ts.map +1 -0
- package/dist/ingestion/figma-node-to-html.js +1292 -0
- package/dist/ingestion/figma-node-to-html.js.map +1 -0
- package/dist/ingestion/figma.d.ts +115 -0
- package/dist/ingestion/figma.d.ts.map +1 -0
- package/dist/ingestion/figma.js +399 -0
- package/dist/ingestion/figma.js.map +1 -0
- package/dist/ingestion/index.d.ts +11 -0
- package/dist/ingestion/index.d.ts.map +1 -0
- package/dist/ingestion/index.js +11 -0
- package/dist/ingestion/index.js.map +1 -0
- package/dist/ingestion/media.d.ts +36 -0
- package/dist/ingestion/media.d.ts.map +1 -0
- package/dist/ingestion/media.js +178 -0
- package/dist/ingestion/media.js.map +1 -0
- package/dist/ingestion/notion.d.ts +12 -0
- package/dist/ingestion/notion.d.ts.map +1 -0
- package/dist/ingestion/notion.js +104 -0
- package/dist/ingestion/notion.js.map +1 -0
- package/dist/ingestion/office.d.ts +45 -0
- package/dist/ingestion/office.d.ts.map +1 -0
- package/dist/ingestion/office.js +141 -0
- package/dist/ingestion/office.js.map +1 -0
- package/dist/ingestion/orchestration.d.ts +52 -0
- package/dist/ingestion/orchestration.d.ts.map +1 -0
- package/dist/ingestion/orchestration.js +89 -0
- package/dist/ingestion/orchestration.js.map +1 -0
- package/dist/ingestion/pptx.d.ts +28 -0
- package/dist/ingestion/pptx.d.ts.map +1 -0
- package/dist/ingestion/pptx.js +255 -0
- package/dist/ingestion/pptx.js.map +1 -0
- package/dist/ingestion/selection.d.ts +20 -0
- package/dist/ingestion/selection.d.ts.map +1 -0
- package/dist/ingestion/selection.js +52 -0
- package/dist/ingestion/selection.js.map +1 -0
- package/dist/ingestion/website.d.ts +27 -0
- package/dist/ingestion/website.d.ts.map +1 -0
- package/dist/ingestion/website.js +100 -0
- package/dist/ingestion/website.js.map +1 -0
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +32 -27
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/localization/default-messages.d.ts +22 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +31 -9
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/hosted-model-experiment.d.ts +39 -0
- package/dist/observability/hosted-model-experiment.d.ts.map +1 -0
- package/dist/observability/hosted-model-experiment.js +90 -0
- package/dist/observability/hosted-model-experiment.js.map +1 -0
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js +5 -3
- package/dist/observability/traces.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/index.d.ts +35 -4
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +339 -8
- package/dist/provider-api/index.js.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +18 -1
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/search-utils/index.d.ts +12 -0
- package/dist/search-utils/index.d.ts.map +1 -0
- package/dist/search-utils/index.js +95 -0
- package/dist/search-utils/index.js.map +1 -0
- package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
- package/dist/secrets/register-framework-secrets.js +57 -0
- package/dist/secrets/register-framework-secrets.js.map +1 -1
- package/dist/server/action-discovery.d.ts +8 -0
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +26 -9
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/agent-chat/framework-prompts.js +2 -2
- package/dist/server/agent-chat/framework-prompts.js.map +1 -1
- package/dist/server/agent-chat/prompt-resources.d.ts +19 -0
- package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
- package/dist/server/agent-chat/prompt-resources.js +95 -0
- package/dist/server/agent-chat/prompt-resources.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +7 -0
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +5 -0
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/index.d.ts +5 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +5 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/workspace-provider-oauth.d.ts +48 -0
- package/dist/server/workspace-provider-oauth.d.ts.map +1 -0
- package/dist/server/workspace-provider-oauth.js +415 -0
- package/dist/server/workspace-provider-oauth.js.map +1 -0
- package/dist/styles/agent-native.css +9 -0
- package/dist/templates/chat/app/i18n/en-US.ts +3 -3
- package/dist/templates/chat/app/lib/agent-page.tsx +10 -1
- package/dist/templates/default/app/i18n/en-US.ts +3 -3
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
- package/dist/templates/workspace-root/.env.example +12 -0
- package/dist/workspace-connections/index.d.ts +1 -0
- package/dist/workspace-connections/index.d.ts.map +1 -1
- package/dist/workspace-connections/index.js +1 -0
- package/dist/workspace-connections/index.js.map +1 -1
- package/dist/workspace-connections/lifecycle.d.ts +16 -0
- package/dist/workspace-connections/lifecycle.d.ts.map +1 -0
- package/dist/workspace-connections/lifecycle.js +14 -0
- package/dist/workspace-connections/lifecycle.js.map +1 -0
- package/dist/workspace-connections/store.d.ts.map +1 -1
- package/dist/workspace-connections/store.js +16 -0
- package/dist/workspace-connections/store.js.map +1 -1
- package/package.json +10 -3
- package/src/templates/chat/app/i18n/en-US.ts +3 -3
- package/src/templates/chat/app/lib/agent-page.spec.tsx +10 -1
- package/src/templates/chat/app/lib/agent-page.tsx +10 -1
- package/src/templates/default/app/i18n/en-US.ts +3 -3
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
- package/src/templates/workspace-root/.env.example +12 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ACTION_CHAT_UI_INLINE_EXTENSION_RENDERER } from "../action-ui.js";
|
|
2
|
-
import type
|
|
2
|
+
import { AgentActionStopError, type ActionRunContext } from "../action.js";
|
|
3
3
|
import type { ActionEntry } from "../agent/production-agent.js";
|
|
4
4
|
import type { AgentChatAttachment } from "../agent/types.js";
|
|
5
5
|
import { writeAppState } from "../application-state/script-helpers.js";
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
readWorkspaceFile,
|
|
15
15
|
type WorkspaceFilesScope,
|
|
16
16
|
} from "../workspace-files/store.js";
|
|
17
|
+
import { ExtensionContentEditError } from "./content-patch.js";
|
|
17
18
|
import type {
|
|
18
19
|
ExtensionContentEdit,
|
|
19
20
|
ExtensionLegacyPatch,
|
|
@@ -617,7 +618,7 @@ export function createExtensionActionEntries(): Record<string, ActionEntry> {
|
|
|
617
618
|
"update-extension": {
|
|
618
619
|
tool: {
|
|
619
620
|
description:
|
|
620
|
-
'Update an existing sandboxed Alpine.js mini-app extension. If the user is viewing the extension, use the extensionId from <current-screen> or <current-url> directly; do not list extensions first just to find the current id. Prefer granular edits for surgical changes;
|
|
621
|
+
'Update an existing sandboxed Alpine.js mini-app extension. If the user is viewing the extension, use the extensionId from <current-screen> or <current-url> directly; do not list extensions first just to find the current id. Prefer granular edits for surgical changes; full-body replacement is blocked by default to preserve existing layout, CSS, copy, and interactions during data-only fixes. Use `patches` or `edits` for targeted changes; set `allowFullReplacement=true` only when the user explicitly asks for a visual rewrite or supplies a complete replacement body. Supported edits include literal replace, insert-before/after marker, replace-between markers, replace-section/wrap-section/remove-section for <!-- agent-native:section name --> blocks, and regex-replace. Pass format=true to run Prettier on the final HTML. To replace the whole body with a large pasted file, pass contentFromAttachment (the attachment name, or "latest") instead of copying the file into `content` — that avoids re-emitting thousands of tokens.',
|
|
621
622
|
parameters: {
|
|
622
623
|
type: "object",
|
|
623
624
|
properties: {
|
|
@@ -649,15 +650,26 @@ export function createExtensionActionEntries(): Record<string, ActionEntry> {
|
|
|
649
650
|
description:
|
|
650
651
|
'Optional full replacement sourced from a workspace/shared resource file, by resource path (e.g. "intuit-analytics-extension.html"). The server reads the full file and uses it as the replacement body. Use instead of `content` when replacing the whole body with a large file that exists as a workspace resource. Ignored when `content` is provided.',
|
|
651
652
|
},
|
|
653
|
+
allowFullReplacement: {
|
|
654
|
+
type: "boolean",
|
|
655
|
+
description:
|
|
656
|
+
"Explicitly allow replacing the entire existing body. Omit or set false for data-only repairs so the existing visual design is protected. Use true only when the user explicitly requested a broad visual rewrite or supplied a complete replacement body.",
|
|
657
|
+
},
|
|
652
658
|
patches: {
|
|
653
|
-
|
|
659
|
+
anyOf: [
|
|
660
|
+
{ type: "string" },
|
|
661
|
+
{ type: "array", items: { type: "object" } },
|
|
662
|
+
],
|
|
654
663
|
description:
|
|
655
|
-
'
|
|
664
|
+
'Optional patches as a JSON-encoded string or native array of { "find": "...", "replace": "...", "all"?: true, "expectedMatches"?: 1, "required"?: true } objects. Missing required targets fail instead of silently no-oping.',
|
|
656
665
|
},
|
|
657
666
|
edits: {
|
|
658
|
-
|
|
667
|
+
anyOf: [
|
|
668
|
+
{ type: "string" },
|
|
669
|
+
{ type: "array", items: { type: "object" } },
|
|
670
|
+
],
|
|
659
671
|
description:
|
|
660
|
-
'Preferred optional JSON
|
|
672
|
+
'Preferred optional granular edit operations as a JSON-encoded string or native array. Examples: { "op": "insert-after", "marker": "<!-- section:metrics -->", "content": "..." }, { "op": "replace-section", "section": "npm-chart", "content": "..." }, { "op": "wrap-section", "section": "charts", "before": "<div>", "after": "</div>" }, { "op": "regex-replace", "pattern": "...", "replace": "...", "expectedMatches": 1 }.',
|
|
661
673
|
},
|
|
662
674
|
format: {
|
|
663
675
|
type: "boolean",
|
|
@@ -670,8 +682,9 @@ export function createExtensionActionEntries(): Record<string, ActionEntry> {
|
|
|
670
682
|
},
|
|
671
683
|
visibility: {
|
|
672
684
|
type: "string",
|
|
673
|
-
description:
|
|
674
|
-
|
|
685
|
+
description:
|
|
686
|
+
"Optional sharing visibility. Public extension sharing is not supported; use private or org.",
|
|
687
|
+
enum: ["private", "org"],
|
|
675
688
|
},
|
|
676
689
|
},
|
|
677
690
|
required: ["id"],
|
|
@@ -683,6 +696,53 @@ export function createExtensionActionEntries(): Record<string, ActionEntry> {
|
|
|
683
696
|
const localMessage = await localExtensionEditMessage(id);
|
|
684
697
|
if (localMessage) return localMessage;
|
|
685
698
|
|
|
699
|
+
if (
|
|
700
|
+
typeof args?.visibility === "string" &&
|
|
701
|
+
args.visibility.trim().toLowerCase() === "public"
|
|
702
|
+
) {
|
|
703
|
+
const message =
|
|
704
|
+
"Public extension sharing is not supported. Use visibility=private or visibility=org. No content changes were applied; do not retry visibility=public.";
|
|
705
|
+
throw new AgentActionStopError(message, {
|
|
706
|
+
errorCode: "extension_public_visibility_unsupported",
|
|
707
|
+
toolResult: JSON.stringify(
|
|
708
|
+
{
|
|
709
|
+
error: "extension_public_visibility_unsupported",
|
|
710
|
+
message,
|
|
711
|
+
recoverable: false,
|
|
712
|
+
next: "Retry only with visibility=private or visibility=org.",
|
|
713
|
+
},
|
|
714
|
+
null,
|
|
715
|
+
2,
|
|
716
|
+
),
|
|
717
|
+
});
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
const fullReplacementRequested =
|
|
721
|
+
(typeof args?.content === "string" &&
|
|
722
|
+
args.content.trim().length > 0) ||
|
|
723
|
+
args?.contentFromAttachment !== undefined ||
|
|
724
|
+
args?.contentFromWorkspaceFile !== undefined;
|
|
725
|
+
if (
|
|
726
|
+
fullReplacementRequested &&
|
|
727
|
+
!coerceBoolean(args?.allowFullReplacement)
|
|
728
|
+
) {
|
|
729
|
+
const message =
|
|
730
|
+
"Full extension-body replacement was blocked to preserve the existing visual design. Read the current extension and use focused patches/edits for a data-only repair. Only retry with allowFullReplacement=true when the user explicitly requested a broad visual rewrite or supplied a complete replacement body.";
|
|
731
|
+
throw new AgentActionStopError(message, {
|
|
732
|
+
errorCode: "extension_full_replacement_requires_explicit_intent",
|
|
733
|
+
toolResult: JSON.stringify(
|
|
734
|
+
{
|
|
735
|
+
error: "extension_full_replacement_requires_explicit_intent",
|
|
736
|
+
message,
|
|
737
|
+
recoverable: false,
|
|
738
|
+
next: "Call get-extension once, then update-extension with patches or edits that change only the data-loading code. Use allowFullReplacement=true only for an explicitly requested visual rewrite.",
|
|
739
|
+
},
|
|
740
|
+
null,
|
|
741
|
+
2,
|
|
742
|
+
),
|
|
743
|
+
});
|
|
744
|
+
}
|
|
745
|
+
|
|
686
746
|
// Full-replacement content can come inline (`content`) or by reference
|
|
687
747
|
// (`contentFromAttachment`) so the model never has to re-type a large
|
|
688
748
|
// pasted file. Inline wins only when NON-EMPTY — the docstring tells
|
|
@@ -718,12 +778,33 @@ export function createExtensionActionEntries(): Record<string, ActionEntry> {
|
|
|
718
778
|
if (args?.edits !== undefined && !edits) {
|
|
719
779
|
return "Error: edits must be a JSON array of supported extension edit operations.";
|
|
720
780
|
}
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
781
|
+
try {
|
|
782
|
+
result = await updateExtensionContent(id, {
|
|
783
|
+
content: replacementContent,
|
|
784
|
+
allowFullReplacement: coerceBoolean(args?.allowFullReplacement),
|
|
785
|
+
patches,
|
|
786
|
+
edits,
|
|
787
|
+
format: coerceBoolean(args?.format),
|
|
788
|
+
});
|
|
789
|
+
} catch (error) {
|
|
790
|
+
if (!(error instanceof ExtensionContentEditError)) throw error;
|
|
791
|
+
const message =
|
|
792
|
+
`The extension edit was not applied: ${error.message} ` +
|
|
793
|
+
"Do not retry the same arguments. Read the current extension and submit one focused patch or edit with an exact target.";
|
|
794
|
+
throw new AgentActionStopError(message, {
|
|
795
|
+
errorCode: "extension_content_edit_failed",
|
|
796
|
+
toolResult: JSON.stringify(
|
|
797
|
+
{
|
|
798
|
+
error: "extension_content_edit_failed",
|
|
799
|
+
message: error.message,
|
|
800
|
+
recoverable: false,
|
|
801
|
+
next: "Read the current extension with get-extension, then make one focused update-extension patches/edits call. Do not retry unchanged arguments.",
|
|
802
|
+
},
|
|
803
|
+
null,
|
|
804
|
+
2,
|
|
805
|
+
),
|
|
806
|
+
});
|
|
807
|
+
}
|
|
727
808
|
}
|
|
728
809
|
|
|
729
810
|
const meta: Record<string, string> = {};
|
|
@@ -1492,7 +1573,7 @@ function coerceLimit(value: unknown): number {
|
|
|
1492
1573
|
|
|
1493
1574
|
function parsePatches(value: unknown): ExtensionLegacyPatch[] | undefined {
|
|
1494
1575
|
if (value === undefined) return undefined;
|
|
1495
|
-
const parsed =
|
|
1576
|
+
const parsed = parseJsonArray(value);
|
|
1496
1577
|
if (!Array.isArray(parsed)) return undefined;
|
|
1497
1578
|
if (
|
|
1498
1579
|
parsed.some(
|
|
@@ -1509,13 +1590,22 @@ function parsePatches(value: unknown): ExtensionLegacyPatch[] | undefined {
|
|
|
1509
1590
|
|
|
1510
1591
|
function parseEdits(value: unknown): ExtensionContentEdit[] | undefined {
|
|
1511
1592
|
if (value === undefined) return undefined;
|
|
1512
|
-
const parsed =
|
|
1593
|
+
const parsed = parseJsonArray(value);
|
|
1513
1594
|
if (!Array.isArray(parsed)) return undefined;
|
|
1514
1595
|
return parsed.every(isValidContentEdit)
|
|
1515
1596
|
? (parsed as ExtensionContentEdit[])
|
|
1516
1597
|
: undefined;
|
|
1517
1598
|
}
|
|
1518
1599
|
|
|
1600
|
+
function parseJsonArray(value: unknown): unknown {
|
|
1601
|
+
if (typeof value !== "string") return value;
|
|
1602
|
+
try {
|
|
1603
|
+
return JSON.parse(value);
|
|
1604
|
+
} catch {
|
|
1605
|
+
return undefined;
|
|
1606
|
+
}
|
|
1607
|
+
}
|
|
1608
|
+
|
|
1519
1609
|
function isValidContentEdit(value: unknown): boolean {
|
|
1520
1610
|
if (!value || typeof value !== "object") return false;
|
|
1521
1611
|
const edit = value as Record<string, unknown>;
|
|
@@ -64,6 +64,15 @@ export type ExtensionContentEdit =
|
|
|
64
64
|
required?: boolean;
|
|
65
65
|
};
|
|
66
66
|
|
|
67
|
+
export class ExtensionContentEditError extends Error {
|
|
68
|
+
readonly code = "extension_content_edit_failed";
|
|
69
|
+
|
|
70
|
+
constructor(message: string) {
|
|
71
|
+
super(message);
|
|
72
|
+
this.name = "ExtensionContentEditError";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
67
76
|
export interface ExtensionContentUpdateOpts {
|
|
68
77
|
content?: string;
|
|
69
78
|
patches?: ExtensionLegacyPatch[];
|
|
@@ -80,6 +89,19 @@ export interface ExtensionContentUpdateResult {
|
|
|
80
89
|
export async function applyExtensionContentUpdate(
|
|
81
90
|
currentContent: string,
|
|
82
91
|
opts: ExtensionContentUpdateOpts,
|
|
92
|
+
): Promise<ExtensionContentUpdateResult> {
|
|
93
|
+
try {
|
|
94
|
+
return await applyExtensionContentUpdateUnchecked(currentContent, opts);
|
|
95
|
+
} catch (error) {
|
|
96
|
+
if (error instanceof ExtensionContentEditError) throw error;
|
|
97
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
98
|
+
throw new ExtensionContentEditError(message);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async function applyExtensionContentUpdateUnchecked(
|
|
103
|
+
currentContent: string,
|
|
104
|
+
opts: ExtensionContentUpdateOpts,
|
|
83
105
|
): Promise<ExtensionContentUpdateResult> {
|
|
84
106
|
let content = opts.content ?? currentContent;
|
|
85
107
|
const applied: string[] = [];
|
|
@@ -24,6 +24,7 @@ import {
|
|
|
24
24
|
} from "../server/request-context.js";
|
|
25
25
|
import { ForbiddenError, resolveAccess } from "../sharing/access.js";
|
|
26
26
|
import { ROLE_RANK, type ShareRole } from "../sharing/schema.js";
|
|
27
|
+
import { ExtensionContentEditError } from "./content-patch.js";
|
|
27
28
|
import { buildExtensionHtml, EXTENSION_IFRAME_CSP } from "./html-shell.js";
|
|
28
29
|
import {
|
|
29
30
|
getLocalExtension,
|
|
@@ -102,6 +103,10 @@ export function createExtensionsHandler() {
|
|
|
102
103
|
setResponseStatus(event, 403);
|
|
103
104
|
return { error: err.message };
|
|
104
105
|
}
|
|
106
|
+
if (err instanceof ExtensionContentEditError) {
|
|
107
|
+
setResponseStatus(event, 400);
|
|
108
|
+
return { error: err.message, errorCode: err.code };
|
|
109
|
+
}
|
|
105
110
|
throw err;
|
|
106
111
|
}
|
|
107
112
|
});
|
|
@@ -373,6 +378,16 @@ async function dispatch(
|
|
|
373
378
|
const localResponse = await localExtensionSqlOnlyResponse(event, parts[0]);
|
|
374
379
|
if (localResponse) return localResponse;
|
|
375
380
|
const body = await readBody(event);
|
|
381
|
+
if (
|
|
382
|
+
typeof body.visibility === "string" &&
|
|
383
|
+
body.visibility.trim().toLowerCase() === "public"
|
|
384
|
+
) {
|
|
385
|
+
setResponseStatus(event, 403);
|
|
386
|
+
return {
|
|
387
|
+
error:
|
|
388
|
+
"Extensions cannot be made public — use private or org visibility instead. No content changes were applied.",
|
|
389
|
+
};
|
|
390
|
+
}
|
|
376
391
|
const hasContentUpdate =
|
|
377
392
|
body.content !== undefined ||
|
|
378
393
|
body.patches !== undefined ||
|
|
@@ -388,6 +403,9 @@ async function dispatch(
|
|
|
388
403
|
if (hasContentUpdate) {
|
|
389
404
|
result = await updateExtensionContent(parts[0], {
|
|
390
405
|
content: body.content,
|
|
406
|
+
allowFullReplacement:
|
|
407
|
+
body.allowFullReplacement === true ||
|
|
408
|
+
body.allowFullReplacement === "true",
|
|
391
409
|
patches: body.patches,
|
|
392
410
|
edits: body.edits,
|
|
393
411
|
format: body.format === true || body.format === "true",
|
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
} from "./change-marker.js";
|
|
31
31
|
import {
|
|
32
32
|
applyExtensionContentUpdate,
|
|
33
|
+
ExtensionContentEditError,
|
|
33
34
|
type ExtensionContentEdit,
|
|
34
35
|
type ExtensionLegacyPatch,
|
|
35
36
|
} from "./content-patch.js";
|
|
@@ -1166,6 +1167,7 @@ export async function updateExtension(
|
|
|
1166
1167
|
|
|
1167
1168
|
export interface UpdateExtensionContentOpts {
|
|
1168
1169
|
content?: string;
|
|
1170
|
+
allowFullReplacement?: boolean;
|
|
1169
1171
|
patches?: ExtensionLegacyPatch[];
|
|
1170
1172
|
edits?: ExtensionContentEdit[];
|
|
1171
1173
|
format?: boolean;
|
|
@@ -1188,6 +1190,12 @@ export async function updateExtensionContent(
|
|
|
1188
1190
|
return null;
|
|
1189
1191
|
}
|
|
1190
1192
|
|
|
1193
|
+
if (opts.content !== undefined && opts.allowFullReplacement !== true) {
|
|
1194
|
+
throw new ExtensionContentEditError(
|
|
1195
|
+
"Full extension-body replacement requires explicit allowFullReplacement=true. Use patches or edits for a targeted data-only repair so the existing design is preserved.",
|
|
1196
|
+
);
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1191
1199
|
const existingRows = await db
|
|
1192
1200
|
.select()
|
|
1193
1201
|
.from(extensions)
|
package/corpus/core/src/index.ts
CHANGED
|
@@ -299,6 +299,9 @@ export {
|
|
|
299
299
|
type WorkspaceConnectionPublicCredentialRef,
|
|
300
300
|
type WorkspaceConnectionStatus,
|
|
301
301
|
workspaceConnectionIsAvailableToApp,
|
|
302
|
+
registerWorkspaceConnectionLifecycleListener,
|
|
303
|
+
type WorkspaceConnectionLifecycleEvent,
|
|
304
|
+
type WorkspaceConnectionLifecycleListener,
|
|
302
305
|
} from "./workspace-connections/index.js";
|
|
303
306
|
|
|
304
307
|
// Reusable workspace connection provider catalog
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
export interface ParsedDocxSection {
|
|
2
|
+
heading: string;
|
|
3
|
+
content: string;
|
|
4
|
+
html: string;
|
|
5
|
+
text: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface ParsedDocxDocument {
|
|
9
|
+
title: string;
|
|
10
|
+
html: string;
|
|
11
|
+
text: string;
|
|
12
|
+
sections: ParsedDocxSection[];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export async function parseDocxDocument(
|
|
16
|
+
data: Uint8Array,
|
|
17
|
+
): Promise<ParsedDocxDocument> {
|
|
18
|
+
const mammoth = await loadMammoth();
|
|
19
|
+
const buffer = Buffer.from(data);
|
|
20
|
+
const [htmlResult, textResult] = await Promise.all([
|
|
21
|
+
mammoth.convertToHtml({ buffer }),
|
|
22
|
+
mammoth.extractRawText({ buffer }),
|
|
23
|
+
]);
|
|
24
|
+
const html = sanitizeInertDocumentHtml(htmlResult.value);
|
|
25
|
+
const text = textResult.value;
|
|
26
|
+
const sections = extractDocxSections(html);
|
|
27
|
+
const firstLine = text.split("\n").find((line) => line.trim());
|
|
28
|
+
return {
|
|
29
|
+
title:
|
|
30
|
+
sections.find((section) => section.heading)?.heading ??
|
|
31
|
+
(firstLine && firstLine.length < 200
|
|
32
|
+
? firstLine.trim()
|
|
33
|
+
: "Imported Document"),
|
|
34
|
+
html,
|
|
35
|
+
text,
|
|
36
|
+
sections,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function extractDocxSections(html: string): ParsedDocxSection[] {
|
|
41
|
+
html = sanitizeInertDocumentHtml(html);
|
|
42
|
+
const sections: ParsedDocxSection[] = [];
|
|
43
|
+
for (const part of html.split(/(?=<h[1-3][^>]*>)/i)) {
|
|
44
|
+
const trimmed = part.trim();
|
|
45
|
+
if (!trimmed) continue;
|
|
46
|
+
const heading = trimmed.match(/^<h[1-3][^>]*>(.*?)<\/h[1-3]>/is);
|
|
47
|
+
if (heading) {
|
|
48
|
+
const sectionHtml = trimmed.slice(heading[0].length).trim();
|
|
49
|
+
sections.push({
|
|
50
|
+
heading: stripHtml(heading[1]).trim(),
|
|
51
|
+
content: sectionHtml,
|
|
52
|
+
html: sectionHtml,
|
|
53
|
+
text: stripHtml(sectionHtml),
|
|
54
|
+
});
|
|
55
|
+
} else if (sections.length === 0) {
|
|
56
|
+
sections.push({
|
|
57
|
+
heading: "",
|
|
58
|
+
content: trimmed,
|
|
59
|
+
html: trimmed,
|
|
60
|
+
text: stripHtml(trimmed),
|
|
61
|
+
});
|
|
62
|
+
} else {
|
|
63
|
+
const previous = sections.at(-1)!;
|
|
64
|
+
previous.html += `\n${trimmed}`;
|
|
65
|
+
previous.content = previous.html;
|
|
66
|
+
previous.text = stripHtml(previous.html);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return sections.length > 0
|
|
70
|
+
? sections
|
|
71
|
+
: html.trim()
|
|
72
|
+
? [{ heading: "", content: html, html, text: stripHtml(html) }]
|
|
73
|
+
: [];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const SAFE_DOCUMENT_TAGS = new Set([
|
|
77
|
+
"p",
|
|
78
|
+
"br",
|
|
79
|
+
"h1",
|
|
80
|
+
"h2",
|
|
81
|
+
"h3",
|
|
82
|
+
"h4",
|
|
83
|
+
"h5",
|
|
84
|
+
"h6",
|
|
85
|
+
"ul",
|
|
86
|
+
"ol",
|
|
87
|
+
"li",
|
|
88
|
+
"strong",
|
|
89
|
+
"b",
|
|
90
|
+
"em",
|
|
91
|
+
"i",
|
|
92
|
+
"u",
|
|
93
|
+
"s",
|
|
94
|
+
"blockquote",
|
|
95
|
+
"pre",
|
|
96
|
+
"code",
|
|
97
|
+
"table",
|
|
98
|
+
"thead",
|
|
99
|
+
"tbody",
|
|
100
|
+
"tfoot",
|
|
101
|
+
"tr",
|
|
102
|
+
"th",
|
|
103
|
+
"td",
|
|
104
|
+
"hr",
|
|
105
|
+
"sup",
|
|
106
|
+
"sub",
|
|
107
|
+
]);
|
|
108
|
+
|
|
109
|
+
export function sanitizeInertDocumentHtml(value: string): string {
|
|
110
|
+
return value
|
|
111
|
+
.replace(/<!--[^]*?-->/g, "")
|
|
112
|
+
.replace(/<!\s*(?:doctype|entity)[^>]*>/gi, "")
|
|
113
|
+
.replace(/<\?[^>]*>/g, "")
|
|
114
|
+
.replace(
|
|
115
|
+
/<\s*(script|style|iframe|object|embed|svg|math|template|noscript|form)\b[^>]*>[^]*?<\s*\/\s*\1\s*>/gi,
|
|
116
|
+
"",
|
|
117
|
+
)
|
|
118
|
+
.replace(
|
|
119
|
+
/<\s*\/?\s*([a-z][a-z0-9:-]*)\b[^>]*>/gi,
|
|
120
|
+
(tag, rawName: string) => {
|
|
121
|
+
const name = rawName.toLowerCase();
|
|
122
|
+
if (!SAFE_DOCUMENT_TAGS.has(name)) return "";
|
|
123
|
+
const closing = /^<\s*\//.test(tag);
|
|
124
|
+
if (closing && (name === "br" || name === "hr")) return "";
|
|
125
|
+
return closing ? `</${name}>` : `<${name}>`;
|
|
126
|
+
},
|
|
127
|
+
)
|
|
128
|
+
.trim();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function stripHtml(value: string): string {
|
|
132
|
+
return value
|
|
133
|
+
.replace(/<br\s*\/?\s*>/gi, "\n")
|
|
134
|
+
.replace(/<\/p>/gi, "\n")
|
|
135
|
+
.replace(/<[^>]+>/g, "")
|
|
136
|
+
.replace(/ /gi, " ")
|
|
137
|
+
.replace(/&/gi, "&")
|
|
138
|
+
.replace(/</gi, "<")
|
|
139
|
+
.replace(/>/gi, ">")
|
|
140
|
+
.trim();
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async function loadMammoth(): Promise<{
|
|
144
|
+
convertToHtml(input: { buffer: Buffer }): Promise<{ value: string }>;
|
|
145
|
+
extractRawText(input: { buffer: Buffer }): Promise<{ value: string }>;
|
|
146
|
+
}> {
|
|
147
|
+
const moduleName = "mammoth";
|
|
148
|
+
try {
|
|
149
|
+
return (await import(moduleName)) as {
|
|
150
|
+
convertToHtml(input: { buffer: Buffer }): Promise<{ value: string }>;
|
|
151
|
+
extractRawText(input: { buffer: Buffer }): Promise<{ value: string }>;
|
|
152
|
+
};
|
|
153
|
+
} catch {
|
|
154
|
+
throw new Error(
|
|
155
|
+
"Structured DOCX parsing requires the optional mammoth dependency.",
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
}
|