@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentContextTab.d.ts","sourceRoot":"","sources":["../../../src/client/agent-page/AgentContextTab.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"AgentContextTab.d.ts","sourceRoot":"","sources":["../../../src/client/agent-page/AgentContextTab.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AASpD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,iBAAiB,EAAE,GAC3B,iBAAiB,GAAG,SAAS,CAM/B;AAkRD,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,iBAAiB,+BA2K3D"}
|
|
@@ -9,6 +9,7 @@ import { useT } from "../i18n.js";
|
|
|
9
9
|
import { useActionQuery } from "../use-action.js";
|
|
10
10
|
import { useChatThreads } from "../use-chat-threads.js";
|
|
11
11
|
import { cn } from "../utils.js";
|
|
12
|
+
import { AgentTabFrame } from "./AgentTabFrame.js";
|
|
12
13
|
export function mostRecentlyUpdatedThread(threads) {
|
|
13
14
|
return threads.reduce((latest, thread) => !latest || thread.updatedAt > latest.updatedAt ? thread : latest, undefined);
|
|
14
15
|
}
|
|
@@ -143,7 +144,7 @@ function SystemSectionList({ sections, totalTokens, }) {
|
|
|
143
144
|
}, [sections]);
|
|
144
145
|
return (_jsxs("div", { className: "space-y-4", children: [grouped.map((group) => {
|
|
145
146
|
const tokens = group.items.reduce((sum, item) => sum + item.tokenCount, 0);
|
|
146
|
-
return (_jsxs("section", { children: [_jsxs("div", { className: "mb-1 flex items-center justify-between gap-3", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsx("span", { className: "size-2 rounded-full bg-indigo-500" }), _jsx("h3", { className: "truncate text-sm font-medium", children: provenanceLabel(group.provenance, t) }), _jsx("span", { className: "text-[11px] text-muted-foreground", children: governanceLabel(group.items[0]?.governance ?? "inherited", t) })] }), _jsxs("span", { className: "shrink-0 text-xs tabular-nums text-muted-foreground", children: [formatTokens(tokens), " \u00B7", " ", totalTokens > 0 ? Math.round((tokens / totalTokens) * 100) : 0, "%"] })] }), _jsx("div", { className: "divide-y divide-border/60
|
|
147
|
+
return (_jsxs("section", { children: [_jsxs("div", { className: "mb-1 flex items-center justify-between gap-3", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsx("span", { className: "size-2 rounded-full bg-indigo-500" }), _jsx("h3", { className: "truncate text-sm font-medium", children: provenanceLabel(group.provenance, t) }), _jsx("span", { className: "text-[11px] text-muted-foreground", children: governanceLabel(group.items[0]?.governance ?? "inherited", t) })] }), _jsxs("span", { className: "shrink-0 text-xs tabular-nums text-muted-foreground", children: [formatTokens(tokens), " \u00B7", " ", totalTokens > 0 ? Math.round((tokens / totalTokens) * 100) : 0, "%"] })] }), _jsx("div", { className: "divide-y divide-border/60 border-y border-border/60", children: group.items
|
|
147
148
|
.slice()
|
|
148
149
|
.sort((a, b) => b.tokenCount - a.tokenCount)
|
|
149
150
|
.map((section) => (_jsxs("div", { className: "flex gap-3 px-3 py-2.5", children: [_jsx(IconLock, { className: "mt-0.5 size-4 shrink-0 text-muted-foreground" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-baseline justify-between gap-3", children: [_jsx("div", { className: "truncate text-sm font-medium", children: section.label }), _jsxs("div", { className: "shrink-0 text-xs tabular-nums text-muted-foreground", children: [formatTokens(section.tokenCount), " \u00B7", " ", totalTokens > 0
|
|
@@ -168,35 +169,32 @@ export function AgentContextTab({ scope }) {
|
|
|
168
169
|
const preview = previewQuery.data;
|
|
169
170
|
const previewManifest = preview ? previewAsManifest(preview) : null;
|
|
170
171
|
const budget = resolveContextWindow(preview?.model);
|
|
171
|
-
const title = t("contextXray.pageTitle", { defaultValue: "
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
}) }), _jsx("p", { className: "text-sm text-muted-foreground", children: t("contextXray.orderedSystemDescription", {
|
|
177
|
-
defaultValue: "Ordered system context is grouped by where it comes from. System sections are visible here but cannot be evicted from a thread.",
|
|
178
|
-
}) })] }), _jsxs("div", { className: "inline-flex rounded-md bg-muted/50 p-0.5", children: [_jsxs("button", { type: "button", onClick: () => setView("list"), className: cn("flex cursor-pointer items-center gap-1.5 rounded px-2.5 py-1.5 text-xs", view === "list"
|
|
172
|
+
const title = t("contextXray.pageTitle", { defaultValue: "Snapshots" });
|
|
173
|
+
const description = t("contextXray.headerDescription", {
|
|
174
|
+
defaultValue: "Inspect the latest combined snapshot of what the agent loaded and why.",
|
|
175
|
+
});
|
|
176
|
+
return (_jsx(AgentTabFrame, { title: title, description: description, actions: previewManifest ? (_jsx(ContextMeter, { manifest: previewManifest, enabled: true })) : null, children: _jsxs("div", { className: "space-y-7", children: [previewManifest ? (_jsx(ContextSplitMeter, { manifest: previewManifest, budget: budget })) : null, _jsxs("section", { className: "space-y-4", children: [_jsx("div", { className: "flex justify-end", children: _jsxs("div", { className: "inline-flex rounded-md bg-muted/50 p-0.5", children: [_jsxs("button", { type: "button", onClick: () => setView("list"), className: cn("flex cursor-pointer items-center gap-1.5 rounded px-2.5 py-1.5 text-xs", view === "list"
|
|
179
177
|
? "bg-background text-foreground shadow-sm"
|
|
180
178
|
: "text-muted-foreground"), children: [_jsx(IconList, { className: "size-3.5" }), t("contextXray.list", { defaultValue: "List" })] }), _jsxs("button", { type: "button", onClick: () => setView("map"), className: cn("flex cursor-pointer items-center gap-1.5 rounded px-2.5 py-1.5 text-xs", view === "map"
|
|
181
179
|
? "bg-background text-foreground shadow-sm"
|
|
182
|
-
: "text-muted-foreground"), children: [_jsx(IconChartTreemap, { className: "size-3.5" }), t("contextXray.treemap", { defaultValue: "Treemap" })] })] })
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
180
|
+
: "text-muted-foreground"), children: [_jsx(IconChartTreemap, { className: "size-3.5" }), t("contextXray.treemap", { defaultValue: "Treemap" })] })] }) }), previewQuery.isLoading ? (_jsx("div", { className: "rounded-md border border-border/60 p-8 text-center text-sm text-muted-foreground", children: t("contextXray.loadingPreview", {
|
|
181
|
+
defaultValue: "Loading recent snapshot…",
|
|
182
|
+
}) })) : previewQuery.error ? (_jsx("div", { className: "rounded-md border border-dashed border-border p-8 text-center text-sm text-muted-foreground", children: t("contextXray.previewUnavailable", {
|
|
183
|
+
defaultValue: "A recent snapshot is not available yet.",
|
|
184
|
+
}) })) : previewManifest ? (view === "map" ? (_jsx(ContextTreemap, { segments: [], systemSections: previewManifest.systemSections })) : (_jsx(SystemSectionList, { sections: previewManifest.systemSections ?? [], totalTokens: previewManifest.totalTokens }))) : (_jsx("div", { className: "rounded-md border border-dashed border-border p-8 text-center text-sm text-muted-foreground", children: t("contextXray.noPreview", {
|
|
185
|
+
defaultValue: "No recent snapshot is available for this scope yet.",
|
|
186
|
+
}) }))] }), _jsxs("section", { className: "space-y-3", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-lg font-semibold", children: t("contextXray.liveThread", { defaultValue: "Live thread" }) }), _jsx("p", { className: "text-sm text-muted-foreground", children: t("contextXray.liveThreadDescription", {
|
|
187
|
+
defaultValue: "The latest thread snapshot, when one exists. This is a single current snapshot, not an append-only history.",
|
|
188
|
+
}) })] }), latestThread && liveManifestQuery.data ? (_jsxs("div", { className: "space-y-3 border-y border-border/60 py-4", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate text-sm font-medium", children: latestThread.title ||
|
|
189
|
+
latestThread.preview ||
|
|
190
|
+
t("contextXray.latestThread", {
|
|
191
|
+
defaultValue: "Latest thread",
|
|
192
|
+
}) }), _jsxs("div", { className: "text-xs text-muted-foreground", children: [formatTokens(liveManifestQuery.data.totalTokens), " tokens \u00B7", " ", latestThread.id] })] }), _jsx(ContextMeter, { threadId: latestThread.id })] }), _jsx(ContextTreemap, { segments: liveManifestQuery.data.segments, systemSections: liveManifestQuery.data.systemSections })] })) : (_jsx("div", { className: "rounded-md border border-dashed border-border p-8 text-center text-sm text-muted-foreground", children: t("contextXray.noLiveThread", {
|
|
193
|
+
defaultValue: "No live thread snapshot is available yet.",
|
|
194
|
+
}) }))] }), _jsxs("section", { className: "flex gap-3 border-t border-border/70 pt-5", children: [_jsx(IconInfoCircle, { className: "mt-0.5 size-4 shrink-0 text-muted-foreground" }), _jsxs("div", { className: "space-y-1 text-sm text-muted-foreground", children: [_jsx("p", { className: "font-medium text-foreground", children: t("contextXray.orderedTokensTitle", {
|
|
195
|
+
defaultValue: "Snapshots show ordered tokens, not weighted tokens.",
|
|
196
|
+
}) }), _jsx("p", { children: t("contextXray.orderedTokensDescription", {
|
|
197
|
+
defaultValue: "Required framework and enterprise policy come first, followed by inherited template, workspace, and organization instructions. Personal instructions and memory arrive later and can narrow or override earlier guidance where the prompt permits. These system sections are not evictable; only run-local conversation segments support pin, evict, and restore.",
|
|
198
|
+
}) })] })] })] }) }));
|
|
201
199
|
}
|
|
202
200
|
//# sourceMappingURL=AgentContextTab.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentContextTab.js","sourceRoot":"","sources":["../../../src/client/agent-page/AgentContextTab.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconChartTreemap,\n IconInfoCircle,\n IconList,\n IconLock,\n} from \"@tabler/icons-react\";\nimport { useMemo, useState } from \"react\";\n\nimport type {\n ContextManifest,\n ContextManifestSystemSection,\n ContextPreview,\n} from \"../../shared/context-xray.js\";\nimport { manifestConversationTokens } from \"../../shared/context-xray.js\";\nimport { ContextMeter } from \"../context-xray/ContextMeter.js\";\nimport { ContextTreemap } from \"../context-xray/ContextTreemap.js\";\nimport { formatTokens, resolveContextWindow } from \"../context-xray/format.js\";\nimport { useT } from \"../i18n.js\";\nimport { useActionQuery } from \"../use-action.js\";\nimport { useChatThreads, type ChatThreadSummary } from \"../use-chat-threads.js\";\nimport { cn } from \"../utils.js\";\nimport type { AgentPageTabProps } from \"./types.js\";\n\ntype PreviewQuery = {\n data?: ContextPreview;\n isLoading?: boolean;\n error?: unknown;\n};\ntype ManifestQuery = { data?: ContextManifest; isLoading?: boolean };\n\nexport function mostRecentlyUpdatedThread(\n threads: ChatThreadSummary[],\n): ChatThreadSummary | undefined {\n return threads.reduce<ChatThreadSummary | undefined>(\n (latest, thread) =>\n !latest || thread.updatedAt > latest.updatedAt ? thread : latest,\n undefined,\n );\n}\n\nconst PROVENANCE_ORDER = [\n \"framework-core\",\n \"actions-prompt\",\n \"enterprise-workspace-core\",\n \"template\",\n \"sql-workspace\",\n \"legacy-app-default\",\n \"organization\",\n \"personal\",\n \"memory\",\n \"db-schema\",\n \"tools\",\n \"model-overlay\",\n \"runtime-context\",\n] as const;\n\ntype Translate = (key: string, options?: Record<string, unknown>) => string;\n\nfunction provenanceLabel(\n provenance: ContextManifestSystemSection[\"provenance\"],\n t: Translate,\n): string {\n switch (provenance) {\n case \"framework-core\":\n return t(\"contextXray.provenance.frameworkCore\", {\n defaultValue: \"Framework\",\n });\n case \"actions-prompt\":\n return t(\"contextXray.provenance.actionsPrompt\", {\n defaultValue: \"Actions\",\n });\n case \"template\":\n return t(\"contextXray.provenance.template\", {\n defaultValue: \"Template\",\n });\n case \"enterprise-workspace-core\":\n return t(\"contextXray.provenance.enterpriseWorkspaceCore\", {\n defaultValue: \"Enterprise workspace core\",\n });\n case \"sql-workspace\":\n return t(\"contextXray.provenance.sqlWorkspace\", {\n defaultValue: \"Workspace\",\n });\n case \"legacy-app-default\":\n return t(\"contextXray.provenance.legacyAppDefault\", {\n defaultValue: \"App defaults\",\n });\n case \"organization\":\n return t(\"contextXray.provenance.organization\", {\n defaultValue: \"Organization\",\n });\n case \"personal\":\n return t(\"contextXray.provenance.personal\", {\n defaultValue: \"Personal\",\n });\n case \"memory\":\n return t(\"contextXray.provenance.memory\", {\n defaultValue: \"Memory\",\n });\n case \"db-schema\":\n return t(\"contextXray.provenance.dbSchema\", {\n defaultValue: \"SQL schema\",\n });\n case \"tools\":\n return t(\"contextXray.provenance.tools\", { defaultValue: \"Tools\" });\n case \"model-overlay\":\n return t(\"contextXray.provenance.modelOverlay\", {\n defaultValue: \"Model overlay\",\n });\n case \"runtime-context\":\n return t(\"contextXray.provenance.runtimeContext\", {\n defaultValue: \"Runtime context\",\n });\n }\n}\n\nfunction governanceLabel(\n governance: ContextManifestSystemSection[\"governance\"],\n t: Translate,\n): string {\n switch (governance) {\n case \"required\":\n return t(\"contextXray.governance.required\", {\n defaultValue: \"Required\",\n });\n case \"inherited\":\n return t(\"contextXray.governance.inherited\", {\n defaultValue: \"Inherited\",\n });\n case \"user\":\n return t(\"contextXray.governance.user\", {\n defaultValue: \"Your context\",\n });\n }\n}\n\nfunction sourceLabel(section: ContextManifestSystemSection): string {\n return (\n section.sourceRef?.path ??\n section.sourceRef?.resourceId ??\n section.sourceRef?.scope ??\n \"framework\"\n );\n}\n\nfunction previewAsManifest(preview: ContextPreview): ContextManifest {\n return {\n threadId: \"context-preview\",\n computedAt: preview.computedAt,\n ...(preview.model ? { model: preview.model } : {}),\n totalTokens: preview.totalTokens,\n rawTokens: preview.totalTokens,\n reclaimedTokens: 0,\n tokenCountMethod: preview.tokenCountMethod,\n conversationTokens: 0,\n systemTokens: preview.systemTokens,\n source: \"preview\",\n enforceable: false,\n segments: [],\n systemSections: preview.sections,\n };\n}\n\nfunction ContextSplitMeter({\n manifest,\n budget,\n}: {\n manifest: ContextManifest;\n budget: number;\n}) {\n const t = useT();\n const systemTokens = manifest.systemTokens ?? 0;\n const conversationTokens = manifestConversationTokens(manifest);\n const total = Math.max(1, systemTokens + conversationTokens);\n return (\n <div className=\"space-y-2\">\n <div className=\"flex h-2 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"bg-slate-700 dark:bg-slate-400\"\n style={{ width: `${(systemTokens / total) * 100}%` }}\n />\n <div\n className=\"bg-sky-500\"\n style={{ width: `${(conversationTokens / total) * 100}%` }}\n />\n </div>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n <span>\n <span className=\"mr-1.5 inline-block size-2 rounded-full bg-slate-700 dark:bg-slate-400\" />\n {t(\"contextXray.system\", { defaultValue: \"System\" })}{\" \"}\n {formatTokens(systemTokens)}\n </span>\n <span>\n <span className=\"mr-1.5 inline-block size-2 rounded-full bg-sky-500\" />\n {t(\"contextXray.conversation\", { defaultValue: \"Conversation\" })}{\" \"}\n {formatTokens(conversationTokens)}\n </span>\n <span>\n {formatTokens(Math.max(0, budget - manifest.totalTokens))}{\" \"}\n {t(\"contextXray.free\", { defaultValue: \"free\" })}\n </span>\n </div>\n </div>\n );\n}\n\nfunction SystemSectionList({\n sections,\n totalTokens,\n}: {\n sections: ContextManifestSystemSection[];\n totalTokens: number;\n}) {\n const t = useT();\n const grouped = useMemo(() => {\n const map = new Map<\n ContextManifestSystemSection[\"provenance\"],\n ContextManifestSystemSection[]\n >();\n for (const section of sections) {\n const items = map.get(section.provenance) ?? [];\n items.push(section);\n map.set(section.provenance, items);\n }\n return PROVENANCE_ORDER.flatMap((provenance) => {\n const items = map.get(provenance);\n return items && items.length > 0 ? [{ provenance, items }] : [];\n });\n }, [sections]);\n\n return (\n <div className=\"space-y-4\">\n {grouped.map((group) => {\n const tokens = group.items.reduce(\n (sum, item) => sum + item.tokenCount,\n 0,\n );\n return (\n <section key={group.provenance}>\n <div className=\"mb-1 flex items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"size-2 rounded-full bg-indigo-500\" />\n <h3 className=\"truncate text-sm font-medium\">\n {provenanceLabel(group.provenance, t)}\n </h3>\n <span className=\"text-[11px] text-muted-foreground\">\n {governanceLabel(\n group.items[0]?.governance ?? \"inherited\",\n t,\n )}\n </span>\n </div>\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {formatTokens(tokens)} ·{\" \"}\n {totalTokens > 0 ? Math.round((tokens / totalTokens) * 100) : 0}\n %\n </span>\n </div>\n <div className=\"divide-y divide-border/60 rounded-md border border-border/60\">\n {group.items\n .slice()\n .sort((a, b) => b.tokenCount - a.tokenCount)\n .map((section) => (\n <div\n key={section.segmentId}\n className=\"flex gap-3 px-3 py-2.5\"\n >\n <IconLock className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-baseline justify-between gap-3\">\n <div className=\"truncate text-sm font-medium\">\n {section.label}\n </div>\n <div className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {formatTokens(section.tokenCount)} ·{\" \"}\n {totalTokens > 0\n ? Math.round(\n (section.tokenCount / totalTokens) * 100,\n )\n : 0}\n %\n </div>\n </div>\n <div className=\"truncate text-xs text-muted-foreground\">\n {sourceLabel(section)}\n {section.tokenMethod === \"estimate\"\n ? \" · estimated\"\n : \"\"}\n </div>\n {section.preview ? (\n <div className=\"mt-1 line-clamp-2 text-xs text-muted-foreground/80\">\n {section.preview}\n </div>\n ) : null}\n </div>\n </div>\n ))}\n </div>\n </section>\n );\n })}\n {grouped.length === 0 ? (\n <div className=\"rounded-md border border-dashed border-border p-6 text-center text-sm text-muted-foreground\">\n {t(\"contextXray.noSystemContext\", {\n defaultValue: \"No system context is available for this scope yet.\",\n })}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function AgentContextTab({ scope }: AgentPageTabProps) {\n const t = useT();\n const [view, setView] = useState<\"list\" | \"map\">(\"list\");\n const previewQuery = useActionQuery(\n \"context-preview-get\",\n { scope },\n { staleTime: 5_000 },\n ) as PreviewQuery;\n const threads = useChatThreads(undefined, \"agent-context-page\", null, {\n autoCreate: false,\n restoreActiveThread: false,\n });\n const latestThread = mostRecentlyUpdatedThread(threads.threads);\n const liveManifestQuery = useActionQuery(\n \"context-manifest-get\",\n latestThread ? { threadId: latestThread.id } : undefined,\n { enabled: Boolean(latestThread), staleTime: 1_000 },\n ) as ManifestQuery;\n const preview = previewQuery.data;\n const previewManifest = preview ? previewAsManifest(preview) : null;\n const budget = resolveContextWindow(preview?.model);\n const title = t(\"contextXray.pageTitle\", { defaultValue: \"Context\" });\n\n return (\n <div className=\"mx-auto flex w-full max-w-5xl flex-col gap-8 p-6 lg:p-10\">\n <header className=\"space-y-3\">\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-[0.16em] text-muted-foreground\">\n {t(\"contextXray.agent\", { defaultValue: \"Agent\" })}\n </p>\n <h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1>\n <p className=\"mt-1 max-w-2xl text-sm text-muted-foreground\">\n {t(\"contextXray.headerDescription\", {\n defaultValue:\n \"See the system instructions and conversation tokens that shape the agent.\",\n })}\n </p>\n </div>\n {previewManifest ? (\n <ContextMeter manifest={previewManifest} enabled />\n ) : null}\n </div>\n {previewManifest ? (\n <ContextSplitMeter manifest={previewManifest} budget={budget} />\n ) : null}\n </header>\n\n <section className=\"space-y-4\">\n <div className=\"flex flex-wrap items-end justify-between gap-3\">\n <div>\n <h2 className=\"text-lg font-semibold\">\n {t(\"contextXray.whatAgentKnows\", {\n defaultValue: \"What the agent knows\",\n })}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {t(\"contextXray.orderedSystemDescription\", {\n defaultValue:\n \"Ordered system context is grouped by where it comes from. System sections are visible here but cannot be evicted from a thread.\",\n })}\n </p>\n </div>\n <div className=\"inline-flex rounded-md bg-muted/50 p-0.5\">\n <button\n type=\"button\"\n onClick={() => setView(\"list\")}\n className={cn(\n \"flex cursor-pointer items-center gap-1.5 rounded px-2.5 py-1.5 text-xs\",\n view === \"list\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground\",\n )}\n >\n <IconList className=\"size-3.5\" />\n {t(\"contextXray.list\", { defaultValue: \"List\" })}\n </button>\n <button\n type=\"button\"\n onClick={() => setView(\"map\")}\n className={cn(\n \"flex cursor-pointer items-center gap-1.5 rounded px-2.5 py-1.5 text-xs\",\n view === \"map\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground\",\n )}\n >\n <IconChartTreemap className=\"size-3.5\" />\n {t(\"contextXray.treemap\", { defaultValue: \"Treemap\" })}\n </button>\n </div>\n </div>\n {previewQuery.isLoading ? (\n <div className=\"rounded-md border border-border/60 p-8 text-center text-sm text-muted-foreground\">\n {t(\"contextXray.loadingPreview\", {\n defaultValue: \"Loading context preview…\",\n })}\n </div>\n ) : previewQuery.error ? (\n <div className=\"rounded-md border border-dashed border-border p-8 text-center text-sm text-muted-foreground\">\n {t(\"contextXray.previewUnavailable\", {\n defaultValue: \"Context preview is not available yet.\",\n })}\n </div>\n ) : previewManifest ? (\n view === \"map\" ? (\n <ContextTreemap\n segments={[]}\n systemSections={previewManifest.systemSections}\n />\n ) : (\n <SystemSectionList\n sections={previewManifest.systemSections ?? []}\n totalTokens={previewManifest.totalTokens}\n />\n )\n ) : (\n <div className=\"rounded-md border border-dashed border-border p-8 text-center text-sm text-muted-foreground\">\n {t(\"contextXray.noPreview\", {\n defaultValue:\n \"No context preview is available for this scope yet.\",\n })}\n </div>\n )}\n </section>\n\n <section className=\"space-y-3\">\n <div>\n <h2 className=\"text-lg font-semibold\">\n {t(\"contextXray.liveThread\", { defaultValue: \"Live thread\" })}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {t(\"contextXray.liveThreadDescription\", {\n defaultValue:\n \"The latest thread snapshot, when one exists. This is a single current snapshot, not an append-only history.\",\n })}\n </p>\n </div>\n {latestThread && liveManifestQuery.data ? (\n <div className=\"space-y-3 rounded-md border border-border/60 p-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">\n {latestThread.title ||\n latestThread.preview ||\n t(\"contextXray.latestThread\", {\n defaultValue: \"Latest thread\",\n })}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {formatTokens(liveManifestQuery.data.totalTokens)} tokens ·{\" \"}\n {latestThread.id}\n </div>\n </div>\n <ContextMeter threadId={latestThread.id} />\n </div>\n <ContextTreemap\n segments={liveManifestQuery.data.segments}\n systemSections={liveManifestQuery.data.systemSections}\n />\n </div>\n ) : (\n <div className=\"rounded-md border border-dashed border-border p-8 text-center text-sm text-muted-foreground\">\n {t(\"contextXray.noLiveThread\", {\n defaultValue: \"No live thread snapshot is available yet.\",\n })}\n </div>\n )}\n </section>\n\n <section className=\"flex gap-3 rounded-md border border-border/60 bg-muted/20 p-4\">\n <IconInfoCircle className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\" />\n <div className=\"space-y-1 text-sm text-muted-foreground\">\n <p className=\"font-medium text-foreground\">\n {t(\"contextXray.orderedTokensTitle\", {\n defaultValue: \"Context is ordered tokens, not weighted tokens.\",\n })}\n </p>\n <p>\n {t(\"contextXray.orderedTokensDescription\", {\n defaultValue:\n \"Required framework and enterprise policy come first, followed by inherited template, workspace, and organization instructions. Personal instructions and memory arrive later and can narrow or override earlier guidance where the prompt permits. These system sections are not evictable; only run-local conversation segments support pin, evict, and restore.\",\n })}\n </p>\n </div>\n </section>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AgentContextTab.js","sourceRoot":"","sources":["../../../src/client/agent-page/AgentContextTab.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconChartTreemap,\n IconInfoCircle,\n IconList,\n IconLock,\n} from \"@tabler/icons-react\";\nimport { useMemo, useState } from \"react\";\n\nimport type {\n ContextManifest,\n ContextManifestSystemSection,\n ContextPreview,\n} from \"../../shared/context-xray.js\";\nimport { manifestConversationTokens } from \"../../shared/context-xray.js\";\nimport { ContextMeter } from \"../context-xray/ContextMeter.js\";\nimport { ContextTreemap } from \"../context-xray/ContextTreemap.js\";\nimport { formatTokens, resolveContextWindow } from \"../context-xray/format.js\";\nimport { useT } from \"../i18n.js\";\nimport { useActionQuery } from \"../use-action.js\";\nimport { useChatThreads, type ChatThreadSummary } from \"../use-chat-threads.js\";\nimport { cn } from \"../utils.js\";\nimport { AgentTabFrame } from \"./AgentTabFrame.js\";\nimport type { AgentPageTabProps } from \"./types.js\";\n\ntype PreviewQuery = {\n data?: ContextPreview;\n isLoading?: boolean;\n error?: unknown;\n};\ntype ManifestQuery = { data?: ContextManifest; isLoading?: boolean };\n\nexport function mostRecentlyUpdatedThread(\n threads: ChatThreadSummary[],\n): ChatThreadSummary | undefined {\n return threads.reduce<ChatThreadSummary | undefined>(\n (latest, thread) =>\n !latest || thread.updatedAt > latest.updatedAt ? thread : latest,\n undefined,\n );\n}\n\nconst PROVENANCE_ORDER = [\n \"framework-core\",\n \"actions-prompt\",\n \"enterprise-workspace-core\",\n \"template\",\n \"sql-workspace\",\n \"legacy-app-default\",\n \"organization\",\n \"personal\",\n \"memory\",\n \"db-schema\",\n \"tools\",\n \"model-overlay\",\n \"runtime-context\",\n] as const;\n\ntype Translate = (key: string, options?: Record<string, unknown>) => string;\n\nfunction provenanceLabel(\n provenance: ContextManifestSystemSection[\"provenance\"],\n t: Translate,\n): string {\n switch (provenance) {\n case \"framework-core\":\n return t(\"contextXray.provenance.frameworkCore\", {\n defaultValue: \"Framework\",\n });\n case \"actions-prompt\":\n return t(\"contextXray.provenance.actionsPrompt\", {\n defaultValue: \"Actions\",\n });\n case \"template\":\n return t(\"contextXray.provenance.template\", {\n defaultValue: \"Template\",\n });\n case \"enterprise-workspace-core\":\n return t(\"contextXray.provenance.enterpriseWorkspaceCore\", {\n defaultValue: \"Enterprise workspace core\",\n });\n case \"sql-workspace\":\n return t(\"contextXray.provenance.sqlWorkspace\", {\n defaultValue: \"Workspace\",\n });\n case \"legacy-app-default\":\n return t(\"contextXray.provenance.legacyAppDefault\", {\n defaultValue: \"App defaults\",\n });\n case \"organization\":\n return t(\"contextXray.provenance.organization\", {\n defaultValue: \"Organization\",\n });\n case \"personal\":\n return t(\"contextXray.provenance.personal\", {\n defaultValue: \"Personal\",\n });\n case \"memory\":\n return t(\"contextXray.provenance.memory\", {\n defaultValue: \"Memory\",\n });\n case \"db-schema\":\n return t(\"contextXray.provenance.dbSchema\", {\n defaultValue: \"SQL schema\",\n });\n case \"tools\":\n return t(\"contextXray.provenance.tools\", { defaultValue: \"Tools\" });\n case \"model-overlay\":\n return t(\"contextXray.provenance.modelOverlay\", {\n defaultValue: \"Model overlay\",\n });\n case \"runtime-context\":\n return t(\"contextXray.provenance.runtimeContext\", {\n defaultValue: \"Runtime context\",\n });\n }\n}\n\nfunction governanceLabel(\n governance: ContextManifestSystemSection[\"governance\"],\n t: Translate,\n): string {\n switch (governance) {\n case \"required\":\n return t(\"contextXray.governance.required\", {\n defaultValue: \"Required\",\n });\n case \"inherited\":\n return t(\"contextXray.governance.inherited\", {\n defaultValue: \"Inherited\",\n });\n case \"user\":\n return t(\"contextXray.governance.user\", {\n defaultValue: \"Your context\",\n });\n }\n}\n\nfunction sourceLabel(section: ContextManifestSystemSection): string {\n return (\n section.sourceRef?.path ??\n section.sourceRef?.resourceId ??\n section.sourceRef?.scope ??\n \"framework\"\n );\n}\n\nfunction previewAsManifest(preview: ContextPreview): ContextManifest {\n return {\n threadId: \"context-preview\",\n computedAt: preview.computedAt,\n ...(preview.model ? { model: preview.model } : {}),\n totalTokens: preview.totalTokens,\n rawTokens: preview.totalTokens,\n reclaimedTokens: 0,\n tokenCountMethod: preview.tokenCountMethod,\n conversationTokens: 0,\n systemTokens: preview.systemTokens,\n source: \"preview\",\n enforceable: false,\n segments: [],\n systemSections: preview.sections,\n };\n}\n\nfunction ContextSplitMeter({\n manifest,\n budget,\n}: {\n manifest: ContextManifest;\n budget: number;\n}) {\n const t = useT();\n const systemTokens = manifest.systemTokens ?? 0;\n const conversationTokens = manifestConversationTokens(manifest);\n const total = Math.max(1, systemTokens + conversationTokens);\n return (\n <div className=\"space-y-2\">\n <div className=\"flex h-2 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"bg-slate-700 dark:bg-slate-400\"\n style={{ width: `${(systemTokens / total) * 100}%` }}\n />\n <div\n className=\"bg-sky-500\"\n style={{ width: `${(conversationTokens / total) * 100}%` }}\n />\n </div>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n <span>\n <span className=\"mr-1.5 inline-block size-2 rounded-full bg-slate-700 dark:bg-slate-400\" />\n {t(\"contextXray.system\", { defaultValue: \"System\" })}{\" \"}\n {formatTokens(systemTokens)}\n </span>\n <span>\n <span className=\"mr-1.5 inline-block size-2 rounded-full bg-sky-500\" />\n {t(\"contextXray.conversation\", { defaultValue: \"Conversation\" })}{\" \"}\n {formatTokens(conversationTokens)}\n </span>\n <span>\n {formatTokens(Math.max(0, budget - manifest.totalTokens))}{\" \"}\n {t(\"contextXray.free\", { defaultValue: \"free\" })}\n </span>\n </div>\n </div>\n );\n}\n\nfunction SystemSectionList({\n sections,\n totalTokens,\n}: {\n sections: ContextManifestSystemSection[];\n totalTokens: number;\n}) {\n const t = useT();\n const grouped = useMemo(() => {\n const map = new Map<\n ContextManifestSystemSection[\"provenance\"],\n ContextManifestSystemSection[]\n >();\n for (const section of sections) {\n const items = map.get(section.provenance) ?? [];\n items.push(section);\n map.set(section.provenance, items);\n }\n return PROVENANCE_ORDER.flatMap((provenance) => {\n const items = map.get(provenance);\n return items && items.length > 0 ? [{ provenance, items }] : [];\n });\n }, [sections]);\n\n return (\n <div className=\"space-y-4\">\n {grouped.map((group) => {\n const tokens = group.items.reduce(\n (sum, item) => sum + item.tokenCount,\n 0,\n );\n return (\n <section key={group.provenance}>\n <div className=\"mb-1 flex items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"size-2 rounded-full bg-indigo-500\" />\n <h3 className=\"truncate text-sm font-medium\">\n {provenanceLabel(group.provenance, t)}\n </h3>\n <span className=\"text-[11px] text-muted-foreground\">\n {governanceLabel(\n group.items[0]?.governance ?? \"inherited\",\n t,\n )}\n </span>\n </div>\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {formatTokens(tokens)} ·{\" \"}\n {totalTokens > 0 ? Math.round((tokens / totalTokens) * 100) : 0}\n %\n </span>\n </div>\n <div className=\"divide-y divide-border/60 border-y border-border/60\">\n {group.items\n .slice()\n .sort((a, b) => b.tokenCount - a.tokenCount)\n .map((section) => (\n <div\n key={section.segmentId}\n className=\"flex gap-3 px-3 py-2.5\"\n >\n <IconLock className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-baseline justify-between gap-3\">\n <div className=\"truncate text-sm font-medium\">\n {section.label}\n </div>\n <div className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {formatTokens(section.tokenCount)} ·{\" \"}\n {totalTokens > 0\n ? Math.round(\n (section.tokenCount / totalTokens) * 100,\n )\n : 0}\n %\n </div>\n </div>\n <div className=\"truncate text-xs text-muted-foreground\">\n {sourceLabel(section)}\n {section.tokenMethod === \"estimate\"\n ? \" · estimated\"\n : \"\"}\n </div>\n {section.preview ? (\n <div className=\"mt-1 line-clamp-2 text-xs text-muted-foreground/80\">\n {section.preview}\n </div>\n ) : null}\n </div>\n </div>\n ))}\n </div>\n </section>\n );\n })}\n {grouped.length === 0 ? (\n <div className=\"rounded-md border border-dashed border-border p-6 text-center text-sm text-muted-foreground\">\n {t(\"contextXray.noSystemContext\", {\n defaultValue: \"No system context is available for this scope yet.\",\n })}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function AgentContextTab({ scope }: AgentPageTabProps) {\n const t = useT();\n const [view, setView] = useState<\"list\" | \"map\">(\"list\");\n const previewQuery = useActionQuery(\n \"context-preview-get\",\n { scope },\n { staleTime: 5_000 },\n ) as PreviewQuery;\n const threads = useChatThreads(undefined, \"agent-context-page\", null, {\n autoCreate: false,\n restoreActiveThread: false,\n });\n const latestThread = mostRecentlyUpdatedThread(threads.threads);\n const liveManifestQuery = useActionQuery(\n \"context-manifest-get\",\n latestThread ? { threadId: latestThread.id } : undefined,\n { enabled: Boolean(latestThread), staleTime: 1_000 },\n ) as ManifestQuery;\n const preview = previewQuery.data;\n const previewManifest = preview ? previewAsManifest(preview) : null;\n const budget = resolveContextWindow(preview?.model);\n const title = t(\"contextXray.pageTitle\", { defaultValue: \"Snapshots\" });\n const description = t(\"contextXray.headerDescription\", {\n defaultValue:\n \"Inspect the latest combined snapshot of what the agent loaded and why.\",\n });\n\n return (\n <AgentTabFrame\n title={title}\n description={description}\n actions={\n previewManifest ? (\n <ContextMeter manifest={previewManifest} enabled />\n ) : null\n }\n >\n <div className=\"space-y-7\">\n {previewManifest ? (\n <ContextSplitMeter manifest={previewManifest} budget={budget} />\n ) : null}\n\n <section className=\"space-y-4\">\n <div className=\"flex justify-end\">\n <div className=\"inline-flex rounded-md bg-muted/50 p-0.5\">\n <button\n type=\"button\"\n onClick={() => setView(\"list\")}\n className={cn(\n \"flex cursor-pointer items-center gap-1.5 rounded px-2.5 py-1.5 text-xs\",\n view === \"list\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground\",\n )}\n >\n <IconList className=\"size-3.5\" />\n {t(\"contextXray.list\", { defaultValue: \"List\" })}\n </button>\n <button\n type=\"button\"\n onClick={() => setView(\"map\")}\n className={cn(\n \"flex cursor-pointer items-center gap-1.5 rounded px-2.5 py-1.5 text-xs\",\n view === \"map\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground\",\n )}\n >\n <IconChartTreemap className=\"size-3.5\" />\n {t(\"contextXray.treemap\", { defaultValue: \"Treemap\" })}\n </button>\n </div>\n </div>\n {previewQuery.isLoading ? (\n <div className=\"rounded-md border border-border/60 p-8 text-center text-sm text-muted-foreground\">\n {t(\"contextXray.loadingPreview\", {\n defaultValue: \"Loading recent snapshot…\",\n })}\n </div>\n ) : previewQuery.error ? (\n <div className=\"rounded-md border border-dashed border-border p-8 text-center text-sm text-muted-foreground\">\n {t(\"contextXray.previewUnavailable\", {\n defaultValue: \"A recent snapshot is not available yet.\",\n })}\n </div>\n ) : previewManifest ? (\n view === \"map\" ? (\n <ContextTreemap\n segments={[]}\n systemSections={previewManifest.systemSections}\n />\n ) : (\n <SystemSectionList\n sections={previewManifest.systemSections ?? []}\n totalTokens={previewManifest.totalTokens}\n />\n )\n ) : (\n <div className=\"rounded-md border border-dashed border-border p-8 text-center text-sm text-muted-foreground\">\n {t(\"contextXray.noPreview\", {\n defaultValue:\n \"No recent snapshot is available for this scope yet.\",\n })}\n </div>\n )}\n </section>\n\n <section className=\"space-y-3\">\n <div>\n <h2 className=\"text-lg font-semibold\">\n {t(\"contextXray.liveThread\", { defaultValue: \"Live thread\" })}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {t(\"contextXray.liveThreadDescription\", {\n defaultValue:\n \"The latest thread snapshot, when one exists. This is a single current snapshot, not an append-only history.\",\n })}\n </p>\n </div>\n {latestThread && liveManifestQuery.data ? (\n <div className=\"space-y-3 border-y border-border/60 py-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">\n {latestThread.title ||\n latestThread.preview ||\n t(\"contextXray.latestThread\", {\n defaultValue: \"Latest thread\",\n })}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {formatTokens(liveManifestQuery.data.totalTokens)} tokens ·{\" \"}\n {latestThread.id}\n </div>\n </div>\n <ContextMeter threadId={latestThread.id} />\n </div>\n <ContextTreemap\n segments={liveManifestQuery.data.segments}\n systemSections={liveManifestQuery.data.systemSections}\n />\n </div>\n ) : (\n <div className=\"rounded-md border border-dashed border-border p-8 text-center text-sm text-muted-foreground\">\n {t(\"contextXray.noLiveThread\", {\n defaultValue: \"No live thread snapshot is available yet.\",\n })}\n </div>\n )}\n </section>\n\n <section className=\"flex gap-3 border-t border-border/70 pt-5\">\n <IconInfoCircle className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\" />\n <div className=\"space-y-1 text-sm text-muted-foreground\">\n <p className=\"font-medium text-foreground\">\n {t(\"contextXray.orderedTokensTitle\", {\n defaultValue:\n \"Snapshots show ordered tokens, not weighted tokens.\",\n })}\n </p>\n <p>\n {t(\"contextXray.orderedTokensDescription\", {\n defaultValue:\n \"Required framework and enterprise policy come first, followed by inherited template, workspace, and organization instructions. Personal instructions and memory arrive later and can narrow or override earlier guidance where the prompt permits. These system sections are not evictable; only run-local conversation segments support pin, evict, and restore.\",\n })}\n </p>\n </div>\n </section>\n </div>\n </AgentTabFrame>\n );\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ComponentType, ReactNode } from "react";
|
|
2
|
+
interface AgentEmptyStateProps {
|
|
3
|
+
icon?: ComponentType<{
|
|
4
|
+
className?: string;
|
|
5
|
+
}>;
|
|
6
|
+
title: string;
|
|
7
|
+
description?: ReactNode;
|
|
8
|
+
action?: ReactNode;
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function AgentEmptyState({ icon: Icon, title, description, action, className, }: AgentEmptyStateProps): import("react").JSX.Element;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=AgentEmptyState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentEmptyState.d.ts","sourceRoot":"","sources":["../../../src/client/agent-page/AgentEmptyState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAItD,UAAU,oBAAoB;IAC5B,IAAI,CAAC,EAAE,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EAAE,IAAI,EACV,KAAK,EACL,WAAW,EACX,MAAM,EACN,SAAS,GACV,EAAE,oBAAoB,+BAyBtB"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../utils.js";
|
|
3
|
+
export function AgentEmptyState({ icon: Icon, title, description, action, className, }) {
|
|
4
|
+
return (_jsxs("div", { className: cn("flex min-w-0 items-start gap-3 border-y border-border/60 py-5", className), children: [Icon ? (_jsx(Icon, { "aria-hidden": "true", className: "mt-0.5 size-4 shrink-0 text-muted-foreground" })) : null, _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-sm font-medium text-foreground", children: title }), description ? (_jsx("p", { className: "mt-1 max-w-2xl break-words text-sm leading-relaxed text-muted-foreground", children: description })) : null, action ? _jsx("div", { className: "mt-3", children: action }) : null] })] }));
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=AgentEmptyState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentEmptyState.js","sourceRoot":"","sources":["../../../src/client/agent-page/AgentEmptyState.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAUjC,MAAM,UAAU,eAAe,CAAC,EAC9B,IAAI,EAAE,IAAI,EACV,KAAK,EACL,WAAW,EACX,MAAM,EACN,SAAS,GACY;IACrB,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,+DAA+D,EAC/D,SAAS,CACV,aAEA,IAAI,CAAC,CAAC,CAAC,CACN,KAAC,IAAI,mBACS,MAAM,EAClB,SAAS,EAAC,8CAA8C,GACxD,CACH,CAAC,CAAC,CAAC,IAAI,EACR,eAAK,SAAS,EAAC,gBAAgB,aAC7B,YAAG,SAAS,EAAC,qCAAqC,YAAE,KAAK,GAAK,EAC7D,WAAW,CAAC,CAAC,CAAC,CACb,YAAG,SAAS,EAAC,0EAA0E,YACpF,WAAW,GACV,CACL,CAAC,CAAC,CAAC,IAAI,EACP,MAAM,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,MAAM,YAAE,MAAM,GAAO,CAAC,CAAC,CAAC,IAAI,IACjD,IACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["import type { ComponentType, ReactNode } from \"react\";\n\nimport { cn } from \"../utils.js\";\n\ninterface AgentEmptyStateProps {\n icon?: ComponentType<{ className?: string }>;\n title: string;\n description?: ReactNode;\n action?: ReactNode;\n className?: string;\n}\n\nexport function AgentEmptyState({\n icon: Icon,\n title,\n description,\n action,\n className,\n}: AgentEmptyStateProps) {\n return (\n <div\n className={cn(\n \"flex min-w-0 items-start gap-3 border-y border-border/60 py-5\",\n className,\n )}\n >\n {Icon ? (\n <Icon\n aria-hidden=\"true\"\n className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\"\n />\n ) : null}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{title}</p>\n {description ? (\n <p className=\"mt-1 max-w-2xl break-words text-sm leading-relaxed text-muted-foreground\">\n {description}\n </p>\n ) : null}\n {action ? <div className=\"mt-3\">{action}</div> : null}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { AgentPageTabProps } from "./types.js";
|
|
2
|
-
export declare function AgentJobsTab({
|
|
2
|
+
export declare function AgentJobsTab({ canManageOrg }: AgentPageTabProps): import("react").JSX.Element;
|
|
3
3
|
//# sourceMappingURL=AgentJobsTab.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentJobsTab.d.ts","sourceRoot":"","sources":["../../../src/client/agent-page/AgentJobsTab.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AgentJobsTab.d.ts","sourceRoot":"","sources":["../../../src/client/agent-page/AgentJobsTab.tsx"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAOpD,wBAAgB,YAAY,CAAC,EAAE,YAAoB,EAAE,EAAE,iBAAiB,+BAoZvE"}
|
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Button } from "@agent-native/toolkit/ui/button";
|
|
3
|
-
import { IconClock, IconEye, IconLoader2, IconPlayerPause, IconPlayerPlay, IconTrash, } from "@tabler/icons-react";
|
|
3
|
+
import { IconBolt, IconCalendarEvent, IconClock, IconEye, IconLoader2, IconPlayerPause, IconPlayerPlay, IconTrash, } from "@tabler/icons-react";
|
|
4
4
|
import { useState } from "react";
|
|
5
|
+
import { AgentAskPopover } from "../AgentAskPopover.js";
|
|
5
6
|
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "../components/ui/dialog.js";
|
|
6
7
|
import { useFormatters, useT } from "../i18n.js";
|
|
7
|
-
import { AutomationsList } from "../settings/AutomationsSection.js";
|
|
8
|
+
import { automationCreationContext, AutomationsList, } from "../settings/AutomationsSection.js";
|
|
9
|
+
import { AgentEmptyState } from "./AgentEmptyState.js";
|
|
10
|
+
import { AgentTabFrame } from "./AgentTabFrame.js";
|
|
8
11
|
import { useManageRecurringJob, useRecurringJobs, } from "./use-jobs.js";
|
|
9
|
-
export function AgentJobsTab({
|
|
12
|
+
export function AgentJobsTab({ canManageOrg = false }) {
|
|
10
13
|
const t = useT();
|
|
11
14
|
const { formatDate } = useFormatters();
|
|
12
|
-
const
|
|
13
|
-
const
|
|
15
|
+
const personalQuery = useRecurringJobs("user");
|
|
16
|
+
const organizationQuery = useRecurringJobs("org");
|
|
17
|
+
const personalMutation = useManageRecurringJob("user");
|
|
18
|
+
const organizationMutation = useManageRecurringJob("org");
|
|
14
19
|
const [deleteTarget, setDeleteTarget] = useState(null);
|
|
15
20
|
const [detailsTarget, setDetailsTarget] = useState(null);
|
|
16
21
|
const formatDateTime = (value) => {
|
|
@@ -23,71 +28,98 @@ export function AgentJobsTab({ scope, canManageOrg = false, }) {
|
|
|
23
28
|
minute: "2-digit",
|
|
24
29
|
});
|
|
25
30
|
};
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
:
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
scope: job.scope,
|
|
56
|
-
enabled: !job.enabled,
|
|
57
|
-
}), children: [job.enabled ? (_jsx(IconPlayerPause, { className: "size-3.5" })) : (_jsx(IconPlayerPlay, { className: "size-3.5" })), job.enabled
|
|
58
|
-
? t("jobs.pause", { defaultValue: "Pause" })
|
|
59
|
-
: t("jobs.resume", { defaultValue: "Resume" })] }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "size-8 cursor-pointer text-muted-foreground hover:text-destructive", "aria-label": t("jobs.delete", {
|
|
60
|
-
defaultValue: "Delete",
|
|
61
|
-
}), onClick: () => setDeleteTarget(job), children: _jsx(IconTrash, { className: "size-3.5" }) })] })) : null] })] }) }, job.id));
|
|
62
|
-
}) })), mutation.error ? (_jsx("p", { className: "text-sm text-destructive", children: mutation.error.message ||
|
|
63
|
-
t("jobs.recurringUpdateError", {
|
|
64
|
-
defaultValue: "Could not update recurring job.",
|
|
65
|
-
}) })) : null] }), _jsxs("section", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-lg font-semibold", children: t("jobs.automationsTitle", { defaultValue: "Automations" }) }), _jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: scope === "org"
|
|
66
|
-
? t("jobs.organizationAutomationsDescription", {
|
|
67
|
-
defaultValue: "Automations are personal today, so none are shown in the organization view.",
|
|
68
|
-
})
|
|
69
|
-
: t("jobs.automationsDescription", {
|
|
70
|
-
defaultValue: "Event-triggered and scheduled agent tasks managed from one place.",
|
|
71
|
-
}) })] }), _jsx(AutomationsList, { scope: scope, emptyMessage: scope === "org"
|
|
72
|
-
? t("jobs.automationsPersonalOnly", {
|
|
73
|
-
defaultValue: "Automations are personal today.",
|
|
31
|
+
const renderRecurringSection = (title, scope, query, mutation) => {
|
|
32
|
+
const jobs = query.data ?? [];
|
|
33
|
+
return (_jsxs("section", { className: "space-y-4", children: [_jsxs("div", { className: "flex flex-wrap items-end justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("h2", { className: "text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground/70", children: title }), _jsx("p", { className: "mt-2 max-w-2xl text-sm text-muted-foreground", children: scope === "org"
|
|
34
|
+
? t("jobs.organizationRecurringDescription", {
|
|
35
|
+
defaultValue: "Jobs shared with this organization. Members can view them; creators and admins can manage them.",
|
|
36
|
+
})
|
|
37
|
+
: t("jobs.recurringDescription", {
|
|
38
|
+
defaultValue: "Scheduled prompts that ask the agent to do work automatically.",
|
|
39
|
+
}) })] }), scope === "org" && !canManageOrg ? (_jsx("span", { className: "text-xs text-muted-foreground", children: t("jobs.organizationMemberNote", {
|
|
40
|
+
defaultValue: "You can manage jobs you created.",
|
|
41
|
+
}) })) : null] }), query.isLoading ? (_jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", "aria-busy": "true", children: [_jsx(IconLoader2, { className: "size-4 animate-spin" }), t("jobs.loading", { defaultValue: "Loading…" })] })) : query.error ? (_jsx("p", { className: "text-sm text-destructive", children: t("jobs.recurringLoadError", {
|
|
42
|
+
defaultValue: "Could not load recurring jobs.",
|
|
43
|
+
}) })) : jobs.length === 0 ? (_jsx(AgentEmptyState, { icon: IconCalendarEvent, title: scope === "org"
|
|
44
|
+
? t("jobs.organizationEmptyTitle", {
|
|
45
|
+
defaultValue: "No organization jobs yet",
|
|
46
|
+
})
|
|
47
|
+
: t("jobs.recurringEmptyTitle", {
|
|
48
|
+
defaultValue: "No recurring jobs yet",
|
|
49
|
+
}), description: scope === "org"
|
|
50
|
+
? t("jobs.organizationEmptyDescription", {
|
|
51
|
+
defaultValue: "Describe a shared job for this organization.",
|
|
52
|
+
})
|
|
53
|
+
: t("jobs.recurringEmptyDescription", {
|
|
54
|
+
defaultValue: "Describe what should run and when.",
|
|
55
|
+
}), action: _jsx(AgentAskPopover, { context: scope === "org"
|
|
56
|
+
? "The user wants to create an organization recurring job. Create it in the organization jobs resource with the schedule and instructions from their prompt."
|
|
57
|
+
: "The user wants to create a personal recurring job. Create it in the personal jobs resource with the schedule and instructions from their prompt.", prompt: scope === "org"
|
|
58
|
+
? t("jobs.organizationPrompt", {
|
|
59
|
+
defaultValue: "Create a shared organization job that runs on a schedule and does this: ",
|
|
74
60
|
})
|
|
75
|
-
:
|
|
76
|
-
|
|
61
|
+
: t("jobs.recurringPrompt", {
|
|
62
|
+
defaultValue: "Create a recurring job that runs on a schedule and does this: every morning, summarize my inbox.",
|
|
63
|
+
}), title: scope === "org"
|
|
64
|
+
? t("jobs.organizationCreateTitle", {
|
|
65
|
+
defaultValue: "Create an organization job",
|
|
66
|
+
})
|
|
67
|
+
: t("jobs.recurringCreateTitle", {
|
|
68
|
+
defaultValue: "Create a recurring job",
|
|
69
|
+
}) }) })) : (_jsx("div", { className: "divide-y divide-border/60 border-y border-border/60", children: jobs.map((job) => {
|
|
70
|
+
const lastRun = formatDateTime(job.lastRun);
|
|
71
|
+
const nextRun = formatDateTime(job.nextRun);
|
|
72
|
+
return (_jsx("article", { className: "py-4 first:pt-5 last:pb-5", children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "mt-0.5 text-muted-foreground", children: _jsx(IconClock, { className: "size-4" }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("h3", { className: "truncate text-sm font-medium", children: job.name.replace(/-/g, " ") }), _jsx("span", { className: job.enabled
|
|
73
|
+
? "rounded-full bg-emerald-500/15 px-2 py-0.5 text-[10px] font-medium text-emerald-600 dark:text-emerald-400"
|
|
74
|
+
: "rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground", children: job.enabled
|
|
75
|
+
? t("jobs.enabled", { defaultValue: "Enabled" })
|
|
76
|
+
: t("jobs.paused", { defaultValue: "Paused" }) }), job.lastStatus ? (_jsx("span", { className: "rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground", children: job.lastStatus })) : null] }), _jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: job.scheduleDescription || job.schedule }), _jsx("p", { className: "mt-1 line-clamp-2 text-xs text-muted-foreground/80", children: job.instructions }), lastRun || nextRun ? (_jsxs("div", { className: "mt-2 flex flex-wrap gap-x-4 gap-y-1 text-[11px] text-muted-foreground", children: [nextRun ? (_jsxs("span", { children: [t("jobs.nextRun", { defaultValue: "Next run" }), ":", " ", nextRun] })) : null, lastRun ? (_jsxs("span", { children: [t("jobs.lastRun", { defaultValue: "Last run" }), ":", " ", lastRun] })) : null] })) : null] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [_jsxs(Button, { type: "button", variant: "ghost", size: "sm", className: "cursor-pointer px-2 text-xs", onClick: () => setDetailsTarget(job), children: [_jsx(IconEye, { className: "size-3.5" }), t("jobs.details", { defaultValue: "Details" })] }), job.canUpdate ? (_jsxs(_Fragment, { children: [_jsxs(Button, { type: "button", variant: "ghost", size: "sm", className: "cursor-pointer px-2 text-xs", disabled: mutation.isPending, onClick: () => mutation.mutate({
|
|
77
|
+
operation: "update",
|
|
78
|
+
name: job.name,
|
|
79
|
+
scope: job.scope,
|
|
80
|
+
enabled: !job.enabled,
|
|
81
|
+
}), children: [job.enabled ? (_jsx(IconPlayerPause, { className: "size-3.5" })) : (_jsx(IconPlayerPlay, { className: "size-3.5" })), job.enabled
|
|
82
|
+
? t("jobs.pause", { defaultValue: "Pause" })
|
|
83
|
+
: t("jobs.resume", { defaultValue: "Resume" })] }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "size-8 cursor-pointer text-muted-foreground hover:text-destructive", "aria-label": t("jobs.delete", {
|
|
84
|
+
defaultValue: "Delete",
|
|
85
|
+
}), onClick: () => setDeleteTarget(job), children: _jsx(IconTrash, { className: "size-3.5" }) })] })) : null] })] }) }, job.id));
|
|
86
|
+
}) })), mutation.error ? (_jsx("p", { className: "text-sm text-destructive", children: mutation.error.message ||
|
|
87
|
+
t("jobs.recurringUpdateError", {
|
|
88
|
+
defaultValue: "Could not update recurring job.",
|
|
89
|
+
}) })) : null] }));
|
|
90
|
+
};
|
|
91
|
+
const mutationPending = personalMutation.isPending || organizationMutation.isPending;
|
|
92
|
+
const deleteMutation = deleteTarget?.scope === "organization"
|
|
93
|
+
? organizationMutation
|
|
94
|
+
: personalMutation;
|
|
95
|
+
return (_jsxs(AgentTabFrame, { title: t("jobs.pageTitle", { defaultValue: "Jobs" }), description: t("jobs.pageDescription", {
|
|
96
|
+
defaultValue: "See recurring jobs and automations that run work for you.",
|
|
97
|
+
}), children: [_jsxs("div", { className: "space-y-7", children: [renderRecurringSection("Personal", "user", personalQuery, personalMutation), renderRecurringSection("Organization", "org", organizationQuery, organizationMutation), _jsxs("section", { className: "space-y-4 border-t border-border/70 pt-6", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground/70", children: t("jobs.automationsTitle", { defaultValue: "Automations" }) }), _jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: t("jobs.automationsDescription", {
|
|
98
|
+
defaultValue: "Event-triggered and scheduled agent tasks managed from one place.",
|
|
99
|
+
}) })] }), _jsx(AutomationsList, { scope: "user", emptyState: _jsx(AgentEmptyState, { icon: IconBolt, title: t("jobs.automationsEmptyTitle", {
|
|
100
|
+
defaultValue: "No automations yet",
|
|
101
|
+
}), description: t("jobs.automationsEmptyDescription", {
|
|
102
|
+
defaultValue: "Describe what should happen and when.",
|
|
103
|
+
}), action: _jsx(AgentAskPopover, { context: automationCreationContext(), prompt: t("jobs.automationPrompt", {
|
|
104
|
+
defaultValue: "Create an automation that does this: ",
|
|
105
|
+
}), title: t("jobs.automationsCreateTitle", {
|
|
106
|
+
defaultValue: "Create an automation",
|
|
107
|
+
}) }) }) })] })] }), _jsx(Dialog, { open: deleteTarget !== null, onOpenChange: (open) => {
|
|
108
|
+
if (!open && !mutationPending)
|
|
77
109
|
setDeleteTarget(null);
|
|
78
110
|
}, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: t("jobs.deleteRecurringTitle", {
|
|
79
111
|
defaultValue: "Delete recurring job?",
|
|
80
112
|
}) }), _jsx(DialogDescription, { children: t("jobs.deleteRecurringDescription", {
|
|
81
113
|
defaultValue: "This permanently removes the job and cannot be undone.",
|
|
82
|
-
}) })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "outline", className: "cursor-pointer", disabled:
|
|
114
|
+
}) })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "outline", className: "cursor-pointer", disabled: mutationPending, onClick: () => setDeleteTarget(null), children: t("jobs.cancel", { defaultValue: "Cancel" }) }), _jsxs(Button, { type: "button", variant: "destructive", className: "cursor-pointer", disabled: mutationPending, onClick: () => {
|
|
83
115
|
if (!deleteTarget)
|
|
84
116
|
return;
|
|
85
|
-
|
|
117
|
+
deleteMutation.mutate({
|
|
86
118
|
operation: "delete",
|
|
87
119
|
name: deleteTarget.name,
|
|
88
120
|
scope: deleteTarget.scope,
|
|
89
121
|
}, { onSuccess: () => setDeleteTarget(null) });
|
|
90
|
-
}, children: [
|
|
122
|
+
}, children: [mutationPending ? (_jsx(IconLoader2, { className: "size-4 animate-spin" })) : null, t("jobs.delete", { defaultValue: "Delete" })] })] })] }) }), _jsx(Dialog, { open: detailsTarget !== null, onOpenChange: (open) => {
|
|
91
123
|
if (!open)
|
|
92
124
|
setDetailsTarget(null);
|
|
93
125
|
}, children: _jsxs(DialogContent, { className: "max-w-2xl", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: detailsTarget?.name.replace(/-/g, " ") ??
|