@vendoai/ui 0.4.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/LICENSE +202 -0
- package/README.md +7 -0
- package/dist/chrome/activity-ledger.d.ts +14 -0
- package/dist/chrome/activity-ledger.d.ts.map +1 -0
- package/dist/chrome/activity-ledger.js +40 -0
- package/dist/chrome/activity-ledger.js.map +1 -0
- package/dist/chrome/activity-panel.d.ts +7 -0
- package/dist/chrome/activity-panel.d.ts.map +1 -0
- package/dist/chrome/activity-panel.js +27 -0
- package/dist/chrome/activity-panel.js.map +1 -0
- package/dist/chrome/activity-semantics.d.ts +42 -0
- package/dist/chrome/activity-semantics.d.ts.map +1 -0
- package/dist/chrome/activity-semantics.js +119 -0
- package/dist/chrome/activity-semantics.js.map +1 -0
- package/dist/chrome/approval-card.d.ts +22 -0
- package/dist/chrome/approval-card.d.ts.map +1 -0
- package/dist/chrome/approval-card.js +95 -0
- package/dist/chrome/approval-card.js.map +1 -0
- package/dist/chrome/approval-sheet.d.ts +23 -0
- package/dist/chrome/approval-sheet.d.ts.map +1 -0
- package/dist/chrome/approval-sheet.js +72 -0
- package/dist/chrome/approval-sheet.js.map +1 -0
- package/dist/chrome/automations-panel.d.ts +3 -0
- package/dist/chrome/automations-panel.d.ts.map +1 -0
- package/dist/chrome/automations-panel.js +305 -0
- package/dist/chrome/automations-panel.js.map +1 -0
- package/dist/chrome/build-beat.d.ts +70 -0
- package/dist/chrome/build-beat.d.ts.map +1 -0
- package/dist/chrome/build-beat.js +101 -0
- package/dist/chrome/build-beat.js.map +1 -0
- package/dist/chrome/chrome-css.d.ts +7 -0
- package/dist/chrome/chrome-css.d.ts.map +1 -0
- package/dist/chrome/chrome-css.js +2042 -0
- package/dist/chrome/chrome-css.js.map +1 -0
- package/dist/chrome/chrome-root.d.ts +13 -0
- package/dist/chrome/chrome-root.d.ts.map +1 -0
- package/dist/chrome/chrome-root.js +39 -0
- package/dist/chrome/chrome-root.js.map +1 -0
- package/dist/chrome/clipboard.d.ts +4 -0
- package/dist/chrome/clipboard.d.ts.map +1 -0
- package/dist/chrome/clipboard.js +49 -0
- package/dist/chrome/clipboard.js.map +1 -0
- package/dist/chrome/connect-card.d.ts +19 -0
- package/dist/chrome/connect-card.d.ts.map +1 -0
- package/dist/chrome/connect-card.js +57 -0
- package/dist/chrome/connect-card.js.map +1 -0
- package/dist/chrome/connect-dock.d.ts +25 -0
- package/dist/chrome/connect-dock.d.ts.map +1 -0
- package/dist/chrome/connect-dock.js +192 -0
- package/dist/chrome/connect-dock.js.map +1 -0
- package/dist/chrome/connected-accounts-panel.d.ts +14 -0
- package/dist/chrome/connected-accounts-panel.d.ts.map +1 -0
- package/dist/chrome/connected-accounts-panel.js +157 -0
- package/dist/chrome/connected-accounts-panel.js.map +1 -0
- package/dist/chrome/dev-mode.d.ts +5 -0
- package/dist/chrome/dev-mode.d.ts.map +1 -0
- package/dist/chrome/dev-mode.js +7 -0
- package/dist/chrome/dev-mode.js.map +1 -0
- package/dist/chrome/discoverability.d.ts +33 -0
- package/dist/chrome/discoverability.d.ts.map +1 -0
- package/dist/chrome/discoverability.js +63 -0
- package/dist/chrome/discoverability.js.map +1 -0
- package/dist/chrome/embeds.d.ts +21 -0
- package/dist/chrome/embeds.d.ts.map +1 -0
- package/dist/chrome/embeds.js +181 -0
- package/dist/chrome/embeds.js.map +1 -0
- package/dist/chrome/fluid-thinking.d.ts +15 -0
- package/dist/chrome/fluid-thinking.d.ts.map +1 -0
- package/dist/chrome/fluid-thinking.js +37 -0
- package/dist/chrome/fluid-thinking.js.map +1 -0
- package/dist/chrome/humanize.d.ts +46 -0
- package/dist/chrome/humanize.d.ts.map +1 -0
- package/dist/chrome/humanize.js +104 -0
- package/dist/chrome/humanize.js.map +1 -0
- package/dist/chrome/index.d.ts +39 -0
- package/dist/chrome/index.d.ts.map +1 -0
- package/dist/chrome/index.js +38 -0
- package/dist/chrome/index.js.map +1 -0
- package/dist/chrome/markdown.d.ts +23 -0
- package/dist/chrome/markdown.d.ts.map +1 -0
- package/dist/chrome/markdown.js +149 -0
- package/dist/chrome/markdown.js.map +1 -0
- package/dist/chrome/morph-toast.d.ts +43 -0
- package/dist/chrome/morph-toast.d.ts.map +1 -0
- package/dist/chrome/morph-toast.js +89 -0
- package/dist/chrome/morph-toast.js.map +1 -0
- package/dist/chrome/no-policy-notice.d.ts +8 -0
- package/dist/chrome/no-policy-notice.d.ts.map +1 -0
- package/dist/chrome/no-policy-notice.js +18 -0
- package/dist/chrome/no-policy-notice.js.map +1 -0
- package/dist/chrome/onest-font.gen.d.ts +10 -0
- package/dist/chrome/onest-font.gen.d.ts.map +1 -0
- package/dist/chrome/onest-font.gen.js +10 -0
- package/dist/chrome/onest-font.gen.js.map +1 -0
- package/dist/chrome/overlay-registry.d.ts +66 -0
- package/dist/chrome/overlay-registry.d.ts.map +1 -0
- package/dist/chrome/overlay-registry.js +103 -0
- package/dist/chrome/overlay-registry.js.map +1 -0
- package/dist/chrome/palette-hotkey.d.ts +42 -0
- package/dist/chrome/palette-hotkey.d.ts.map +1 -0
- package/dist/chrome/palette-hotkey.js +91 -0
- package/dist/chrome/palette-hotkey.js.map +1 -0
- package/dist/chrome/policy-notice-body.d.ts +3 -0
- package/dist/chrome/policy-notice-body.d.ts.map +1 -0
- package/dist/chrome/policy-notice-body.js +6 -0
- package/dist/chrome/policy-notice-body.js.map +1 -0
- package/dist/chrome/takeover-portal.d.ts +16 -0
- package/dist/chrome/takeover-portal.d.ts.map +1 -0
- package/dist/chrome/takeover-portal.js +21 -0
- package/dist/chrome/takeover-portal.js.map +1 -0
- package/dist/chrome/thread/attachments.d.ts +24 -0
- package/dist/chrome/thread/attachments.d.ts.map +1 -0
- package/dist/chrome/thread/attachments.js +50 -0
- package/dist/chrome/thread/attachments.js.map +1 -0
- package/dist/chrome/thread/composer.d.ts +63 -0
- package/dist/chrome/thread/composer.d.ts.map +1 -0
- package/dist/chrome/thread/composer.js +259 -0
- package/dist/chrome/thread/composer.js.map +1 -0
- package/dist/chrome/thread/index.d.ts +41 -0
- package/dist/chrome/thread/index.d.ts.map +1 -0
- package/dist/chrome/thread/index.js +258 -0
- package/dist/chrome/thread/index.js.map +1 -0
- package/dist/chrome/thread/message-data.d.ts +35 -0
- package/dist/chrome/thread/message-data.d.ts.map +1 -0
- package/dist/chrome/thread/message-data.js +127 -0
- package/dist/chrome/thread/message-data.js.map +1 -0
- package/dist/chrome/thread/message-list.d.ts +30 -0
- package/dist/chrome/thread/message-list.d.ts.map +1 -0
- package/dist/chrome/thread/message-list.js +11 -0
- package/dist/chrome/thread/message-list.js.map +1 -0
- package/dist/chrome/thread/message.d.ts +18 -0
- package/dist/chrome/thread/message.d.ts.map +1 -0
- package/dist/chrome/thread/message.js +57 -0
- package/dist/chrome/thread/message.js.map +1 -0
- package/dist/chrome/thread/parts.d.ts +53 -0
- package/dist/chrome/thread/parts.d.ts.map +1 -0
- package/dist/chrome/thread/parts.js +184 -0
- package/dist/chrome/thread/parts.js.map +1 -0
- package/dist/chrome/thread/scrolling.d.ts +26 -0
- package/dist/chrome/thread/scrolling.d.ts.map +1 -0
- package/dist/chrome/thread/scrolling.js +214 -0
- package/dist/chrome/thread/scrolling.js.map +1 -0
- package/dist/chrome/truncate.d.ts +12 -0
- package/dist/chrome/truncate.d.ts.map +1 -0
- package/dist/chrome/truncate.js +18 -0
- package/dist/chrome/truncate.js.map +1 -0
- package/dist/chrome/vendo-activities.d.ts +24 -0
- package/dist/chrome/vendo-activities.d.ts.map +1 -0
- package/dist/chrome/vendo-activities.js +38 -0
- package/dist/chrome/vendo-activities.js.map +1 -0
- package/dist/chrome/vendo-overlay.d.ts +63 -0
- package/dist/chrome/vendo-overlay.d.ts.map +1 -0
- package/dist/chrome/vendo-overlay.js +256 -0
- package/dist/chrome/vendo-overlay.js.map +1 -0
- package/dist/chrome/vendo-page.d.ts +3 -0
- package/dist/chrome/vendo-page.d.ts.map +1 -0
- package/dist/chrome/vendo-page.js +162 -0
- package/dist/chrome/vendo-page.js.map +1 -0
- package/dist/chrome/vendo-palette.d.ts +29 -0
- package/dist/chrome/vendo-palette.d.ts.map +1 -0
- package/dist/chrome/vendo-palette.js +95 -0
- package/dist/chrome/vendo-palette.js.map +1 -0
- package/dist/chrome/vendo-slot.d.ts +79 -0
- package/dist/chrome/vendo-slot.d.ts.map +1 -0
- package/dist/chrome/vendo-slot.js +153 -0
- package/dist/chrome/vendo-slot.js.map +1 -0
- package/dist/chrome/vendo-toasts.d.ts +40 -0
- package/dist/chrome/vendo-toasts.d.ts.map +1 -0
- package/dist/chrome/vendo-toasts.js +135 -0
- package/dist/chrome/vendo-toasts.js.map +1 -0
- package/dist/chrome/vendo-trigger.d.ts +24 -0
- package/dist/chrome/vendo-trigger.d.ts.map +1 -0
- package/dist/chrome/vendo-trigger.js +30 -0
- package/dist/chrome/vendo-trigger.js.map +1 -0
- package/dist/chrome/waiting-queue.d.ts +8 -0
- package/dist/chrome/waiting-queue.d.ts.map +1 -0
- package/dist/chrome/waiting-queue.js +21 -0
- package/dist/chrome/waiting-queue.js.map +1 -0
- package/dist/client-impl.d.ts +4 -0
- package/dist/client-impl.d.ts.map +1 -0
- package/dist/client-impl.js +160 -0
- package/dist/client-impl.js.map +1 -0
- package/dist/client.d.ts +136 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +2 -0
- package/dist/client.js.map +1 -0
- package/dist/context.d.ts +97 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +71 -0
- package/dist/context.js.map +1 -0
- package/dist/eject-templates/activities/index.tsx +113 -0
- package/dist/eject-templates/templates.json +29 -0
- package/dist/eject-templates/thread/attachments.tsx +69 -0
- package/dist/eject-templates/thread/composer.tsx +409 -0
- package/dist/eject-templates/thread/index.tsx +422 -0
- package/dist/eject-templates/thread/message-data.ts +151 -0
- package/dist/eject-templates/thread/message-list.tsx +123 -0
- package/dist/eject-templates/thread/message.tsx +149 -0
- package/dist/eject-templates/thread/parts.tsx +293 -0
- package/dist/eject-templates/thread/scrolling.ts +223 -0
- package/dist/embeds.d.ts +28 -0
- package/dist/embeds.d.ts.map +1 -0
- package/dist/embeds.js +2 -0
- package/dist/embeds.js.map +1 -0
- package/dist/hooks/index.d.ts +18 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +19 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/scripted-transport.d.ts +44 -0
- package/dist/hooks/scripted-transport.d.ts.map +1 -0
- package/dist/hooks/scripted-transport.js +58 -0
- package/dist/hooks/scripted-transport.js.map +1 -0
- package/dist/hooks/use-activity.d.ts +17 -0
- package/dist/hooks/use-activity.d.ts.map +1 -0
- package/dist/hooks/use-activity.js +50 -0
- package/dist/hooks/use-activity.js.map +1 -0
- package/dist/hooks/use-app.d.ts +19 -0
- package/dist/hooks/use-app.d.ts.map +1 -0
- package/dist/hooks/use-app.js +66 -0
- package/dist/hooks/use-app.js.map +1 -0
- package/dist/hooks/use-approvals.d.ts +13 -0
- package/dist/hooks/use-approvals.d.ts.map +1 -0
- package/dist/hooks/use-approvals.js +14 -0
- package/dist/hooks/use-approvals.js.map +1 -0
- package/dist/hooks/use-apps.d.ts +17 -0
- package/dist/hooks/use-apps.d.ts.map +1 -0
- package/dist/hooks/use-apps.js +30 -0
- package/dist/hooks/use-apps.js.map +1 -0
- package/dist/hooks/use-automations.d.ts +25 -0
- package/dist/hooks/use-automations.d.ts.map +1 -0
- package/dist/hooks/use-automations.js +30 -0
- package/dist/hooks/use-automations.js.map +1 -0
- package/dist/hooks/use-connections.d.ts +12 -0
- package/dist/hooks/use-connections.d.ts.map +1 -0
- package/dist/hooks/use-connections.js +15 -0
- package/dist/hooks/use-connections.js.map +1 -0
- package/dist/hooks/use-connector-catalog.d.ts +8 -0
- package/dist/hooks/use-connector-catalog.d.ts.map +1 -0
- package/dist/hooks/use-connector-catalog.js +52 -0
- package/dist/hooks/use-connector-catalog.js.map +1 -0
- package/dist/hooks/use-grants.d.ts +13 -0
- package/dist/hooks/use-grants.d.ts.map +1 -0
- package/dist/hooks/use-grants.js +14 -0
- package/dist/hooks/use-grants.js.map +1 -0
- package/dist/hooks/use-mobile-takeover.d.ts +22 -0
- package/dist/hooks/use-mobile-takeover.d.ts.map +1 -0
- package/dist/hooks/use-mobile-takeover.js +66 -0
- package/dist/hooks/use-mobile-takeover.js.map +1 -0
- package/dist/hooks/use-resource.d.ts +21 -0
- package/dist/hooks/use-resource.d.ts.map +1 -0
- package/dist/hooks/use-resource.js +79 -0
- package/dist/hooks/use-resource.js.map +1 -0
- package/dist/hooks/use-slot-app.d.ts +19 -0
- package/dist/hooks/use-slot-app.d.ts.map +1 -0
- package/dist/hooks/use-slot-app.js +18 -0
- package/dist/hooks/use-slot-app.js.map +1 -0
- package/dist/hooks/use-threads.d.ts +16 -0
- package/dist/hooks/use-threads.d.ts.map +1 -0
- package/dist/hooks/use-threads.js +15 -0
- package/dist/hooks/use-threads.js.map +1 -0
- package/dist/hooks/use-vendo-overlay.d.ts +31 -0
- package/dist/hooks/use-vendo-overlay.d.ts.map +1 -0
- package/dist/hooks/use-vendo-overlay.js +23 -0
- package/dist/hooks/use-vendo-overlay.js.map +1 -0
- package/dist/hooks/use-vendo-status.d.ts +6 -0
- package/dist/hooks/use-vendo-status.d.ts.map +1 -0
- package/dist/hooks/use-vendo-status.js +28 -0
- package/dist/hooks/use-vendo-status.js.map +1 -0
- package/dist/hooks/use-vendo-thread.d.ts +39 -0
- package/dist/hooks/use-vendo-thread.d.ts.map +1 -0
- package/dist/hooks/use-vendo-thread.js +185 -0
- package/dist/hooks/use-vendo-thread.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/kit/charts/bar.d.ts +16 -0
- package/dist/kit/charts/bar.d.ts.map +1 -0
- package/dist/kit/charts/bar.js +21 -0
- package/dist/kit/charts/bar.js.map +1 -0
- package/dist/kit/charts/donut.d.ts +16 -0
- package/dist/kit/charts/donut.d.ts.map +1 -0
- package/dist/kit/charts/donut.js +17 -0
- package/dist/kit/charts/donut.js.map +1 -0
- package/dist/kit/charts/line.d.ts +19 -0
- package/dist/kit/charts/line.d.ts.map +1 -0
- package/dist/kit/charts/line.js +21 -0
- package/dist/kit/charts/line.js.map +1 -0
- package/dist/kit/charts/progress.d.ts +12 -0
- package/dist/kit/charts/progress.d.ts.map +1 -0
- package/dist/kit/charts/progress.js +25 -0
- package/dist/kit/charts/progress.js.map +1 -0
- package/dist/kit/charts/sanitize.d.ts +24 -0
- package/dist/kit/charts/sanitize.d.ts.map +1 -0
- package/dist/kit/charts/sanitize.js +50 -0
- package/dist/kit/charts/sanitize.js.map +1 -0
- package/dist/kit/charts/sparkline.d.ts +11 -0
- package/dist/kit/charts/sparkline.d.ts.map +1 -0
- package/dist/kit/charts/sparkline.js +17 -0
- package/dist/kit/charts/sparkline.js.map +1 -0
- package/dist/kit/data/badge.d.ts +13 -0
- package/dist/kit/data/badge.d.ts.map +1 -0
- package/dist/kit/data/badge.js +12 -0
- package/dist/kit/data/badge.js.map +1 -0
- package/dist/kit/data/card-list.d.ts +23 -0
- package/dist/kit/data/card-list.d.ts.map +1 -0
- package/dist/kit/data/card-list.js +43 -0
- package/dist/kit/data/card-list.js.map +1 -0
- package/dist/kit/data/data-table.d.ts +32 -0
- package/dist/kit/data/data-table.d.ts.map +1 -0
- package/dist/kit/data/data-table.js +153 -0
- package/dist/kit/data/data-table.js.map +1 -0
- package/dist/kit/data/stat.d.ts +15 -0
- package/dist/kit/data/stat.d.ts.map +1 -0
- package/dist/kit/data/stat.js +28 -0
- package/dist/kit/data/stat.js.map +1 -0
- package/dist/kit/feedback/accordion.d.ts +15 -0
- package/dist/kit/feedback/accordion.d.ts.map +1 -0
- package/dist/kit/feedback/accordion.js +33 -0
- package/dist/kit/feedback/accordion.js.map +1 -0
- package/dist/kit/feedback/callout.d.ts +13 -0
- package/dist/kit/feedback/callout.d.ts.map +1 -0
- package/dist/kit/feedback/callout.js +24 -0
- package/dist/kit/feedback/callout.js.map +1 -0
- package/dist/kit/feedback/tabs.d.ts +14 -0
- package/dist/kit/feedback/tabs.d.ts.map +1 -0
- package/dist/kit/feedback/tabs.js +37 -0
- package/dist/kit/feedback/tabs.js.map +1 -0
- package/dist/kit/format.d.ts +60 -0
- package/dist/kit/format.d.ts.map +1 -0
- package/dist/kit/format.js +123 -0
- package/dist/kit/format.js.map +1 -0
- package/dist/kit/forms/button.d.ts +17 -0
- package/dist/kit/forms/button.d.ts.map +1 -0
- package/dist/kit/forms/button.js +33 -0
- package/dist/kit/forms/button.js.map +1 -0
- package/dist/kit/forms/checkbox.d.ts +9 -0
- package/dist/kit/forms/checkbox.d.ts.map +1 -0
- package/dist/kit/forms/checkbox.js +9 -0
- package/dist/kit/forms/checkbox.js.map +1 -0
- package/dist/kit/forms/date-picker.d.ts +13 -0
- package/dist/kit/forms/date-picker.d.ts.map +1 -0
- package/dist/kit/forms/date-picker.js +9 -0
- package/dist/kit/forms/date-picker.js.map +1 -0
- package/dist/kit/forms/disclaimer.d.ts +8 -0
- package/dist/kit/forms/disclaimer.d.ts.map +1 -0
- package/dist/kit/forms/disclaimer.js +20 -0
- package/dist/kit/forms/disclaimer.js.map +1 -0
- package/dist/kit/forms/field.d.ts +18 -0
- package/dist/kit/forms/field.d.ts.map +1 -0
- package/dist/kit/forms/field.js +19 -0
- package/dist/kit/forms/field.js.map +1 -0
- package/dist/kit/forms/form.d.ts +10 -0
- package/dist/kit/forms/form.d.ts.map +1 -0
- package/dist/kit/forms/form.js +9 -0
- package/dist/kit/forms/form.js.map +1 -0
- package/dist/kit/forms/input.d.ts +14 -0
- package/dist/kit/forms/input.d.ts.map +1 -0
- package/dist/kit/forms/input.js +9 -0
- package/dist/kit/forms/input.js.map +1 -0
- package/dist/kit/forms/select.d.ts +21 -0
- package/dist/kit/forms/select.d.ts.map +1 -0
- package/dist/kit/forms/select.js +35 -0
- package/dist/kit/forms/select.js.map +1 -0
- package/dist/kit/forms/textarea.d.ts +12 -0
- package/dist/kit/forms/textarea.d.ts.map +1 -0
- package/dist/kit/forms/textarea.js +9 -0
- package/dist/kit/forms/textarea.js.map +1 -0
- package/dist/kit/index.d.ts +42 -0
- package/dist/kit/index.d.ts.map +1 -0
- package/dist/kit/index.js +45 -0
- package/dist/kit/index.js.map +1 -0
- package/dist/kit/kit-prompt.d.ts +7 -0
- package/dist/kit/kit-prompt.d.ts.map +1 -0
- package/dist/kit/kit-prompt.js +7 -0
- package/dist/kit/kit-prompt.js.map +1 -0
- package/dist/kit/layout.d.ts +29 -0
- package/dist/kit/layout.d.ts.map +1 -0
- package/dist/kit/layout.js +64 -0
- package/dist/kit/layout.js.map +1 -0
- package/dist/kit/registry.d.ts +11 -0
- package/dist/kit/registry.d.ts.map +1 -0
- package/dist/kit/registry.js +34 -0
- package/dist/kit/registry.js.map +1 -0
- package/dist/kit/schema.d.ts +9 -0
- package/dist/kit/schema.d.ts.map +1 -0
- package/dist/kit/schema.js +9 -0
- package/dist/kit/schema.js.map +1 -0
- package/dist/kit/tokens.d.ts +33 -0
- package/dist/kit/tokens.d.ts.map +1 -0
- package/dist/kit/tokens.js +48 -0
- package/dist/kit/tokens.js.map +1 -0
- package/dist/kit/values.d.ts +55 -0
- package/dist/kit/values.d.ts.map +1 -0
- package/dist/kit/values.js +108 -0
- package/dist/kit/values.js.map +1 -0
- package/dist/theme.d.ts +25 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +100 -0
- package/dist/theme.js.map +1 -0
- package/dist/tree/bindings.d.ts +4 -0
- package/dist/tree/bindings.d.ts.map +1 -0
- package/dist/tree/bindings.js +20 -0
- package/dist/tree/bindings.js.map +1 -0
- package/dist/tree/branded.d.ts +124 -0
- package/dist/tree/branded.d.ts.map +1 -0
- package/dist/tree/branded.js +319 -0
- package/dist/tree/branded.js.map +1 -0
- package/dist/tree/error-boundary.d.ts +22 -0
- package/dist/tree/error-boundary.d.ts.map +1 -0
- package/dist/tree/error-boundary.js +25 -0
- package/dist/tree/error-boundary.js.map +1 -0
- package/dist/tree/fluid-reveal.d.ts +22 -0
- package/dist/tree/fluid-reveal.d.ts.map +1 -0
- package/dist/tree/fluid-reveal.js +28 -0
- package/dist/tree/fluid-reveal.js.map +1 -0
- package/dist/tree/forming-skeleton.d.ts +14 -0
- package/dist/tree/forming-skeleton.d.ts.map +1 -0
- package/dist/tree/forming-skeleton.js +36 -0
- package/dist/tree/forming-skeleton.js.map +1 -0
- package/dist/tree/frames.d.ts +52 -0
- package/dist/tree/frames.d.ts.map +1 -0
- package/dist/tree/frames.js +143 -0
- package/dist/tree/frames.js.map +1 -0
- package/dist/tree/host-mount.d.ts +24 -0
- package/dist/tree/host-mount.d.ts.map +1 -0
- package/dist/tree/host-mount.js +0 -0
- package/dist/tree/host-mount.js.map +1 -0
- package/dist/tree/index.d.ts +9 -0
- package/dist/tree/index.d.ts.map +1 -0
- package/dist/tree/index.js +9 -0
- package/dist/tree/index.js.map +1 -0
- package/dist/tree/jail/JailedComponent.d.ts +41 -0
- package/dist/tree/jail/JailedComponent.d.ts.map +1 -0
- package/dist/tree/jail/JailedComponent.js +269 -0
- package/dist/tree/jail/JailedComponent.js.map +1 -0
- package/dist/tree/jail/runtime-bundle.gen.d.ts +3 -0
- package/dist/tree/jail/runtime-bundle.gen.d.ts.map +1 -0
- package/dist/tree/jail/runtime-bundle.gen.js +3 -0
- package/dist/tree/jail/runtime-bundle.gen.js.map +1 -0
- package/dist/tree/jail/runtime-entry.d.ts +18 -0
- package/dist/tree/jail/runtime-entry.d.ts.map +1 -0
- package/dist/tree/jail/runtime-entry.js +440 -0
- package/dist/tree/jail/runtime-entry.js.map +1 -0
- package/dist/tree/jail/viewport-css.d.ts +17 -0
- package/dist/tree/jail/viewport-css.d.ts.map +1 -0
- package/dist/tree/jail/viewport-css.js +32 -0
- package/dist/tree/jail/viewport-css.js.map +1 -0
- package/dist/tree/mcp-shim/entry.d.ts +2 -0
- package/dist/tree/mcp-shim/entry.d.ts.map +1 -0
- package/dist/tree/mcp-shim/entry.js +45 -0
- package/dist/tree/mcp-shim/entry.js.map +1 -0
- package/dist/tree/mcp-shim/http-open-card.d.ts +5 -0
- package/dist/tree/mcp-shim/http-open-card.d.ts.map +1 -0
- package/dist/tree/mcp-shim/http-open-card.js +61 -0
- package/dist/tree/mcp-shim/http-open-card.js.map +1 -0
- package/dist/tree/mcp-shim/shim-core.d.ts +58 -0
- package/dist/tree/mcp-shim/shim-core.d.ts.map +1 -0
- package/dist/tree/mcp-shim/shim-core.js +176 -0
- package/dist/tree/mcp-shim/shim-core.js.map +1 -0
- package/dist/tree/mcp-shim/theme.d.ts +8 -0
- package/dist/tree/mcp-shim/theme.d.ts.map +1 -0
- package/dist/tree/mcp-shim/theme.js +36 -0
- package/dist/tree/mcp-shim/theme.js.map +1 -0
- package/dist/tree/notice.d.ts +8 -0
- package/dist/tree/notice.d.ts.map +1 -0
- package/dist/tree/notice.js +30 -0
- package/dist/tree/notice.js.map +1 -0
- package/dist/tree/primitives.d.ts +30 -0
- package/dist/tree/primitives.d.ts.map +1 -0
- package/dist/tree/primitives.js +105 -0
- package/dist/tree/primitives.js.map +1 -0
- package/dist/tree/renderer-v2.d.ts +15 -0
- package/dist/tree/renderer-v2.d.ts.map +1 -0
- package/dist/tree/renderer-v2.js +71 -0
- package/dist/tree/renderer-v2.js.map +1 -0
- package/dist/tree/renderer.d.ts +77 -0
- package/dist/tree/renderer.d.ts.map +1 -0
- package/dist/tree/renderer.js +376 -0
- package/dist/tree/renderer.js.map +1 -0
- package/dist/voice/driver.d.ts +94 -0
- package/dist/voice/driver.d.ts.map +1 -0
- package/dist/voice/driver.js +2 -0
- package/dist/voice/driver.js.map +1 -0
- package/dist/voice/index.d.ts +7 -0
- package/dist/voice/index.d.ts.map +1 -0
- package/dist/voice/index.js +5 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/voice/realtime-driver.d.ts +57 -0
- package/dist/voice/realtime-driver.d.ts.map +1 -0
- package/dist/voice/realtime-driver.js +592 -0
- package/dist/voice/realtime-driver.js.map +1 -0
- package/dist/voice/stage.d.ts +12 -0
- package/dist/voice/stage.d.ts.map +1 -0
- package/dist/voice/stage.js +259 -0
- package/dist/voice/stage.js.map +1 -0
- package/dist/voice/use-voice-approvals.d.ts +16 -0
- package/dist/voice/use-voice-approvals.d.ts.map +1 -0
- package/dist/voice/use-voice-approvals.js +77 -0
- package/dist/voice/use-voice-approvals.js.map +1 -0
- package/dist/voice/use-voice.d.ts +26 -0
- package/dist/voice/use-voice.d.ts.map +1 -0
- package/dist/voice/use-voice.js +201 -0
- package/dist/voice/use-voice.js.map +1 -0
- package/dist/voice/voice-act.d.ts +13 -0
- package/dist/voice/voice-act.d.ts.map +1 -0
- package/dist/voice/voice-act.js +301 -0
- package/dist/voice/voice-act.js.map +1 -0
- package/dist/voice/voice-blob.d.ts +17 -0
- package/dist/voice/voice-blob.d.ts.map +1 -0
- package/dist/voice/voice-blob.js +67 -0
- package/dist/voice/voice-blob.js.map +1 -0
- package/dist/voice/voice-consent.d.ts +17 -0
- package/dist/voice/voice-consent.d.ts.map +1 -0
- package/dist/voice/voice-consent.js +45 -0
- package/dist/voice/voice-consent.js.map +1 -0
- package/dist/voice/voice-drawer.d.ts +10 -0
- package/dist/voice/voice-drawer.d.ts.map +1 -0
- package/dist/voice/voice-drawer.js +22 -0
- package/dist/voice/voice-drawer.js.map +1 -0
- package/dist/wire-types.d.ts +238 -0
- package/dist/wire-types.d.ts.map +1 -0
- package/dist/wire-types.js +2 -0
- package/dist/wire-types.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type VendoCommand } from "./overlay-registry.js";
|
|
2
|
+
import { type PaletteHotkey } from "./palette-hotkey.js";
|
|
3
|
+
export type { VendoCommand } from "./overlay-registry.js";
|
|
4
|
+
/** 08-ui §4 — the ⌘K entry point, one-surface edition (ui-lane-entry pick P-C).
|
|
5
|
+
*
|
|
6
|
+
* The palette no longer renders a dialog of its own: ⌘K opens the SAME
|
|
7
|
+
* conversation overlay the launcher opens (toggling it closed on a second
|
|
8
|
+
* press), and the palette's commands render as the overlay's chip strip above
|
|
9
|
+
* the composer. Typed text that matches no command was never anything but a
|
|
10
|
+
* question — now it simply IS the message, so the "No matching commands" dead
|
|
11
|
+
* end no longer exists.
|
|
12
|
+
*
|
|
13
|
+
* What remains here is everything that made VendoPalette safe to drop into a
|
|
14
|
+
* host, unchanged in behavior:
|
|
15
|
+
* - the host-collision-safe singleton keybinding (ENG-222): one shared
|
|
16
|
+
* document listener no matter how many palettes mount, a configurable /
|
|
17
|
+
* disable-able `hotkey` chord, and no keystroke stolen from a focused host
|
|
18
|
+
* input;
|
|
19
|
+
* - the programmatic opener seam (ENG-223): `openVendoPalette()` still works
|
|
20
|
+
* and now opens the conversation surface;
|
|
21
|
+
* - command routing: a host `onCommand` receives every chip activation;
|
|
22
|
+
* without one, conversation commands self-route through the overlay
|
|
23
|
+
* registry and the rest hint in dev instead of dying silently.
|
|
24
|
+
*/
|
|
25
|
+
export declare function VendoPalette({ onCommand, hotkey }: {
|
|
26
|
+
onCommand?(command: VendoCommand): void;
|
|
27
|
+
hotkey?: PaletteHotkey;
|
|
28
|
+
}): null;
|
|
29
|
+
//# sourceMappingURL=vendo-palette.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendo-palette.d.ts","sourceRoot":"","sources":["../../src/chrome/vendo-palette.tsx"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAwF,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAI/I,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE;IAAE,SAAS,CAAC,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,aAAa,CAAA;CAAE,QAoEtH"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { useEffect, useMemo } from "react";
|
|
2
|
+
import { useApps } from "../hooks/use-apps.js";
|
|
3
|
+
import { developmentMode } from "./dev-mode.js";
|
|
4
|
+
import { openVendoConversation, registerConversationCommands, } from "./overlay-registry.js";
|
|
5
|
+
import { isEditableTarget, registerPaletteHotkey, registerPaletteOpener, resolveHotkeyMatcher } from "./palette-hotkey.js";
|
|
6
|
+
/** 08-ui §4 — the ⌘K entry point, one-surface edition (ui-lane-entry pick P-C).
|
|
7
|
+
*
|
|
8
|
+
* The palette no longer renders a dialog of its own: ⌘K opens the SAME
|
|
9
|
+
* conversation overlay the launcher opens (toggling it closed on a second
|
|
10
|
+
* press), and the palette's commands render as the overlay's chip strip above
|
|
11
|
+
* the composer. Typed text that matches no command was never anything but a
|
|
12
|
+
* question — now it simply IS the message, so the "No matching commands" dead
|
|
13
|
+
* end no longer exists.
|
|
14
|
+
*
|
|
15
|
+
* What remains here is everything that made VendoPalette safe to drop into a
|
|
16
|
+
* host, unchanged in behavior:
|
|
17
|
+
* - the host-collision-safe singleton keybinding (ENG-222): one shared
|
|
18
|
+
* document listener no matter how many palettes mount, a configurable /
|
|
19
|
+
* disable-able `hotkey` chord, and no keystroke stolen from a focused host
|
|
20
|
+
* input;
|
|
21
|
+
* - the programmatic opener seam (ENG-223): `openVendoPalette()` still works
|
|
22
|
+
* and now opens the conversation surface;
|
|
23
|
+
* - command routing: a host `onCommand` receives every chip activation;
|
|
24
|
+
* without one, conversation commands self-route through the overlay
|
|
25
|
+
* registry and the rest hint in dev instead of dying silently.
|
|
26
|
+
*/
|
|
27
|
+
export function VendoPalette({ onCommand, hotkey }) {
|
|
28
|
+
const { apps } = useApps();
|
|
29
|
+
const commands = useMemo(() => [
|
|
30
|
+
{ id: "new-conversation", label: "New conversation", kind: "new-conversation" },
|
|
31
|
+
...apps.map(app => ({ id: `open-${app.id}`, label: `Open ${app.name}`, kind: "open-app", appId: app.id })),
|
|
32
|
+
{ id: "show-activity", label: "Show activity", kind: "show-activity" },
|
|
33
|
+
], [apps]);
|
|
34
|
+
// Publish the command set for the overlay's chip strip. Routing preserves
|
|
35
|
+
// the old select() semantics exactly — host onCommand wins outright; the
|
|
36
|
+
// self-sufficient default opens a fresh conversation in the mounted overlay.
|
|
37
|
+
useEffect(() => registerConversationCommands({
|
|
38
|
+
commands,
|
|
39
|
+
select(command) {
|
|
40
|
+
if (onCommand) {
|
|
41
|
+
// The old palette dialog closed on select; mirror that for host-routed
|
|
42
|
+
// commands so navigation (show-activity etc.) never lands behind the
|
|
43
|
+
// open modal (cubic PR#391 finding).
|
|
44
|
+
openVendoConversation({ close: true });
|
|
45
|
+
onCommand(command);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (command.kind === "new-conversation") {
|
|
49
|
+
const opened = openVendoConversation({ newConversation: true });
|
|
50
|
+
if (!opened && developmentMode()) {
|
|
51
|
+
console.warn("[vendo] VendoPalette: \"New conversation\" opens the conversation surface — mount a VendoOverlay for it to land in (or supply onCommand).");
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (developmentMode()) {
|
|
56
|
+
console.warn(`[vendo] VendoPalette: "${command.label}" needs an onCommand handler to route (kind "${command.kind}").`);
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
}), [commands, onCommand]);
|
|
60
|
+
// ENG-223 — the programmatic opener seam. Open-only (no toggle): a CTA that
|
|
61
|
+
// finds the surface already open should leave it open, not dismiss it.
|
|
62
|
+
useEffect(() => registerPaletteOpener(() => {
|
|
63
|
+
const opened = openVendoConversation();
|
|
64
|
+
if (!opened && developmentMode()) {
|
|
65
|
+
console.warn("[vendo] VendoPalette: nothing to open — mount a VendoOverlay for the conversation surface to land in.");
|
|
66
|
+
}
|
|
67
|
+
}), []);
|
|
68
|
+
// The singleton keybinding (ENG-222). ⌘K TOGGLES the overlay — the
|
|
69
|
+
// one-surface replacement for the old dialog toggle. The editable-target
|
|
70
|
+
// guard is unconditional now (the palette no longer tracks an open state);
|
|
71
|
+
// closing from inside the overlay's composer stays on Escape.
|
|
72
|
+
const matcher = useMemo(() => resolveHotkeyMatcher(hotkey), [hotkey]);
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
if (hotkey === false)
|
|
75
|
+
return;
|
|
76
|
+
const handler = (event) => {
|
|
77
|
+
if (!matcher(event))
|
|
78
|
+
return;
|
|
79
|
+
// Never steal a keystroke a HOST input owns — but the overlay's own
|
|
80
|
+
// composer is ours: ⌘K from inside the open surface toggles it closed
|
|
81
|
+
// (the old dialog's while-open behavior, one-surface edition).
|
|
82
|
+
const insideOverlay = event.target instanceof HTMLElement && event.target.closest("#vendo-overlay-dialog") !== null;
|
|
83
|
+
if (isEditableTarget(event.target) && !insideOverlay)
|
|
84
|
+
return;
|
|
85
|
+
event.preventDefault();
|
|
86
|
+
const opened = openVendoConversation({ toggle: true });
|
|
87
|
+
if (!opened && developmentMode()) {
|
|
88
|
+
console.warn("[vendo] VendoPalette: ⌘K opens the conversation surface — mount a VendoOverlay for it to land in.");
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
return registerPaletteHotkey(handler);
|
|
92
|
+
}, [matcher, hotkey]);
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=vendo-palette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendo-palette.js","sourceRoot":"","sources":["../../src/chrome/vendo-palette.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { Json, ToolOutcome, UIPayload } from "@vendoai/core";
|
|
2
|
+
import { type ReactNode } from "react";
|
|
3
|
+
/** A generated view pinned into a slot (08-ui §4 — "or a pinned component").
|
|
4
|
+
* Unlike an app (a whole document), a pin is a single `vendo-genui/v2` tree the
|
|
5
|
+
* user authored and pinned in place; it mounts through the same tree renderer +
|
|
6
|
+
* error boundary, falling back to the host's original markup if it throws. */
|
|
7
|
+
export interface VendoSlotPin {
|
|
8
|
+
/** The pinned generated view (a `vendo-genui/v2` tree payload). */
|
|
9
|
+
payload: UIPayload;
|
|
10
|
+
/** Live data overriding the tree's embedded data model (08-ui §5). */
|
|
11
|
+
data?: Record<string, Json>;
|
|
12
|
+
/** Action dispatch for the pinned component; defaults to the tree renderer's
|
|
13
|
+
* fail-soft no-op when a pin carries no live handler. */
|
|
14
|
+
onAction?(req: {
|
|
15
|
+
nodeId: string;
|
|
16
|
+
action: string;
|
|
17
|
+
payload?: Json;
|
|
18
|
+
}): Promise<ToolOutcome>;
|
|
19
|
+
}
|
|
20
|
+
/** 08-ui §4; 06-apps §8 — inline mount that never sacrifices host fallback content.
|
|
21
|
+
*
|
|
22
|
+
* Three states:
|
|
23
|
+
* - empty: no `appId`, no `pin`, no `children` → the ghost with a REAL CTA button
|
|
24
|
+
* that opens the authoring surface (`onAuthor`, else the mounted ⌘K palette);
|
|
25
|
+
* - app: `appId` → the whole app document mounts (via the single-app transport);
|
|
26
|
+
* - pinned component: `pin` → the authored `vendo-genui/v2` view mounts in place.
|
|
27
|
+
*
|
|
28
|
+
* In both filled states the swap morphs through the ENG-205 render slot, using
|
|
29
|
+
* the host's own markup as the exit frame, and the PinMount error boundary keeps
|
|
30
|
+
* the original `children` as the visible recovery path (06-apps §8). Without any
|
|
31
|
+
* of the three, the children render UNTOUCHED (no wrapper — hosts may inline
|
|
32
|
+
* slots anywhere). */
|
|
33
|
+
export declare function VendoSlot({ id, appId: appIdProp, pin, onAuthor, remix, remixPrompt, discover, emptyState, children }: {
|
|
34
|
+
id: string;
|
|
35
|
+
appId?: string;
|
|
36
|
+
pin?: VendoSlotPin;
|
|
37
|
+
/** Invoked when the empty-state CTA is activated — the seam to open a thread
|
|
38
|
+
* or palette to author the view. Defaults to opening a mounted VendoPalette. */
|
|
39
|
+
onAuthor?(slotId: string): void;
|
|
40
|
+
/** Pass `false` to stand pin self-discovery down even with no `appId`/`pin`
|
|
41
|
+
* prop — for hosts that resolve the pin themselves (e.g. via useSlotApp
|
|
42
|
+
* for a layout decision) and must not start a second poll. */
|
|
43
|
+
discover?: boolean;
|
|
44
|
+
/** Remix folds into Slot as a flag (ui-usage-dx §2): show the hover Remix
|
|
45
|
+
* affordance on the slot's content. Gesture-owned forking (2026-07-21):
|
|
46
|
+
* activating it on an EMPTY slot forks the captured component
|
|
47
|
+
* DETERMINISTICALLY (the engine copies the trusted source and records the
|
|
48
|
+
* pin — no model call, no model fork decision) and the fork mounts in
|
|
49
|
+
* place; on a slot already holding an app it opens the overlay composer
|
|
50
|
+
* prefilled so the instruction rides an ordinary edit. The slot id should
|
|
51
|
+
* match a registered (remixable) host component so sync has captured its
|
|
52
|
+
* source — init/doctor verify the flag against catalog registrations. */
|
|
53
|
+
remix?: boolean;
|
|
54
|
+
/** Override for the composer prefill when remixing a slot that already
|
|
55
|
+
* holds an app; defaults to a prompt naming the slot's component. (The
|
|
56
|
+
* empty-slot gesture itself never sends text to the model.) */
|
|
57
|
+
remixPrompt?: string;
|
|
58
|
+
/** Empty-state invitation config (ui-lane-entry pick S-A×S-D). Every string
|
|
59
|
+
* is host-customizable with white-label defaults; suggestions are 3
|
|
60
|
+
* host-aware prompts (generic fallbacks otherwise) whose tap PREFILLS the
|
|
61
|
+
* conversation composer — never sends. */
|
|
62
|
+
emptyState?: {
|
|
63
|
+
/** Default "This space builds itself". */
|
|
64
|
+
title?: string;
|
|
65
|
+
/** Default "describe a view — it renders here, live on your data". */
|
|
66
|
+
subtitle?: string;
|
|
67
|
+
/** Up to 3 prompt chips. Default: generic view-authoring prompts. */
|
|
68
|
+
suggestions?: string[];
|
|
69
|
+
/** Primary button label (layout "button"). Default "Design a view". */
|
|
70
|
+
ctaLabel?: string;
|
|
71
|
+
/** "button" (chips + primary CTA, default) or "chips-first" (chips are
|
|
72
|
+
* the actions; a quiet "or describe your own…" link opens the composer). */
|
|
73
|
+
layout?: "button" | "chips-first";
|
|
74
|
+
/** Optional mark above the title. Default "none" (Yousef's pick). */
|
|
75
|
+
mark?: "none" | "sparkle" | "tile";
|
|
76
|
+
};
|
|
77
|
+
children?: ReactNode;
|
|
78
|
+
}): import("react").JSX.Element;
|
|
79
|
+
//# sourceMappingURL=vendo-slot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendo-slot.d.ts","sourceRoot":"","sources":["../../src/chrome/vendo-slot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAwDrE;;;+EAG+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,OAAO,EAAE,SAAS,CAAC;IACnB,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B;8DAC0D;IAC1D,QAAQ,CAAC,CAAC,GAAG,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAC1F;AAED;;;;;;;;;;;;uBAYuB;AACvB,wBAAgB,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAa,EAAE,WAAW,EAAE,QAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE;IACpI,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB;qFACiF;IACjF,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;mEAE+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;;8EAQ0E;IAC1E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;oEAEgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;+CAG2C;IAC3C,UAAU,CAAC,EAAE;QACX,0CAA0C;QAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,sEAAsE;QACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,qEAAqE;QACrE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,uEAAuE;QACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB;qFAC6E;QAC7E,MAAM,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC;QAClC,qEAAqE;QACrE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;KACpC,CAAC;IACF,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,+BA4KA"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useState } from "react";
|
|
3
|
+
import { useVendoContext } from "../context.js";
|
|
4
|
+
import { useApp } from "../hooks/use-app.js";
|
|
5
|
+
import { useSlotApp } from "../hooks/use-slot-app.js";
|
|
6
|
+
import { FluidReveal } from "../tree/fluid-reveal.js";
|
|
7
|
+
import { AppFrame, PinMount } from "../tree/frames.js";
|
|
8
|
+
import { ChromeRoot } from "./chrome-root.js";
|
|
9
|
+
import { developmentMode } from "./dev-mode.js";
|
|
10
|
+
import { defaultSlotSuggestions } from "./discoverability.js";
|
|
11
|
+
import { openVendoConversation } from "./overlay-registry.js";
|
|
12
|
+
import { openVendoPalette } from "./palette-hotkey.js";
|
|
13
|
+
/** The faint skeleton behind the ghost/empty states — decorative only. */
|
|
14
|
+
function GhostSkeleton() {
|
|
15
|
+
return (_jsxs("span", { className: "fl-slot-skel", "aria-hidden": "true", children: [_jsx("span", { className: "fl-skel-line", style: { width: "54%" } }), _jsx("span", { className: "fl-skel-line", style: { width: "78%" } }), _jsx("span", { className: "fl-skel-line", style: { width: "42%" } }), _jsxs("span", { className: "fl-skel-bars", children: [_jsx("span", { style: { height: "42%" } }), _jsx("span", { style: { height: "68%" } }), _jsx("span", { style: { height: "52%" } }), _jsx("span", { style: { height: "84%" } }), _jsx("span", { style: { height: "62%" } })] })] }));
|
|
16
|
+
}
|
|
17
|
+
function SlotGhost({ label, detail, loading = false }) {
|
|
18
|
+
return (_jsxs("div", { className: "fl-slot-ghost", role: loading ? "status" : undefined, "aria-live": loading ? "polite" : undefined, children: [_jsx(GhostSkeleton, {}), _jsxs("span", { className: "fl-slot-cta", children: [_jsx("span", { className: "fl-slot-cta-label", children: label }), detail ? _jsx("small", { children: detail }) : null] })] }));
|
|
19
|
+
}
|
|
20
|
+
function MountedApp({ appId }) {
|
|
21
|
+
const { client, components } = useVendoContext();
|
|
22
|
+
const { surface, refresh } = useApp(appId);
|
|
23
|
+
// Wave 7 H2 — the served-surface keepalive: user activity pings the machine
|
|
24
|
+
// (host-proxied) so an embedded served app doesn't idle out under the user;
|
|
25
|
+
// a "woke" ping re-opens for the fresh machine URL.
|
|
26
|
+
const keepalive = useMemo(() => ({ ping: () => client.apps.pingMachine(appId), reopen: refresh }), [appId, client, refresh]);
|
|
27
|
+
if (!surface)
|
|
28
|
+
return _jsx(SlotGhost, { label: "Loading app\u2026", loading: true });
|
|
29
|
+
return _jsx(AppFrame, { surface: surface, components: components, keepalive: keepalive, onAction: ({ action, payload }) => client.apps.call(appId, action, payload ?? {}) }, appId);
|
|
30
|
+
}
|
|
31
|
+
/** 08-ui §4; 06-apps §8 — inline mount that never sacrifices host fallback content.
|
|
32
|
+
*
|
|
33
|
+
* Three states:
|
|
34
|
+
* - empty: no `appId`, no `pin`, no `children` → the ghost with a REAL CTA button
|
|
35
|
+
* that opens the authoring surface (`onAuthor`, else the mounted ⌘K palette);
|
|
36
|
+
* - app: `appId` → the whole app document mounts (via the single-app transport);
|
|
37
|
+
* - pinned component: `pin` → the authored `vendo-genui/v2` view mounts in place.
|
|
38
|
+
*
|
|
39
|
+
* In both filled states the swap morphs through the ENG-205 render slot, using
|
|
40
|
+
* the host's own markup as the exit frame, and the PinMount error boundary keeps
|
|
41
|
+
* the original `children` as the visible recovery path (06-apps §8). Without any
|
|
42
|
+
* of the three, the children render UNTOUCHED (no wrapper — hosts may inline
|
|
43
|
+
* slots anywhere). */
|
|
44
|
+
export function VendoSlot({ id, appId: appIdProp, pin, onAuthor, remix = false, remixPrompt, discover = true, emptyState, children }) {
|
|
45
|
+
const { client, components } = useVendoContext();
|
|
46
|
+
// Self-discovery (ui-usage-dx §2): with no explicit `appId`/`pin`, the slot
|
|
47
|
+
// resolves its own pinned app — hosts never write the polling dance.
|
|
48
|
+
const discovery = useSlotApp(id, { enabled: discover && appIdProp === undefined && pin === undefined });
|
|
49
|
+
const appId = appIdProp ?? (pin === undefined ? discovery.appId : undefined);
|
|
50
|
+
const [remixBusy, setRemixBusy] = useState(false);
|
|
51
|
+
// Latch: a fork that RESOLVED but has not surfaced as `appId` yet. With
|
|
52
|
+
// discover={false} the parent manages appId on its own poll cadence, so the
|
|
53
|
+
// slot still looks empty after the fast wire fork returns — and the wire
|
|
54
|
+
// fork is not idempotent, so a second tap would mint a duplicate app.
|
|
55
|
+
const [forkPending, setForkPending] = useState(false);
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
if (appId !== undefined)
|
|
58
|
+
setForkPending(false);
|
|
59
|
+
}, [appId]);
|
|
60
|
+
const remixLatched = remixBusy || (forkPending && appId === undefined);
|
|
61
|
+
// Dev rail: the remix gesture forks the component captured under this slot's
|
|
62
|
+
// registered name — an unregistered name means there is nothing to fork.
|
|
63
|
+
// (The client can't see catalog `remixable` flags; init verifies those.)
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
if (!remix || !developmentMode() || components[id] !== undefined)
|
|
66
|
+
return;
|
|
67
|
+
console.warn(`[vendo] VendoSlot "${id}" sets remix, but no host component is registered under that name — register it (marked remixable) so sync captures the source the Remix gesture forks.`);
|
|
68
|
+
}, [remix, id, components]);
|
|
69
|
+
const author = () => {
|
|
70
|
+
if (onAuthor) {
|
|
71
|
+
onAuthor(id);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// One-surface model (pick P-C): authoring opens the conversation overlay
|
|
75
|
+
// with the composer focused. The palette-opener fallback keeps hosts that
|
|
76
|
+
// mounted only a VendoPalette (custom onCommand routing) working.
|
|
77
|
+
if (!openVendoConversation())
|
|
78
|
+
openVendoPalette();
|
|
79
|
+
};
|
|
80
|
+
// Suggestion chips prefill the composer — never send (safe on any prompt).
|
|
81
|
+
// No palette-opener fallback here: it cannot carry the prompt, so it would
|
|
82
|
+
// open an empty surface and silently drop the chip's text (cubic PR#391
|
|
83
|
+
// finding). Without an overlay the chip is a dev-warned no-op instead.
|
|
84
|
+
const suggest = (prompt) => {
|
|
85
|
+
const opened = openVendoConversation({ prompt, send: false });
|
|
86
|
+
if (!opened && developmentMode()) {
|
|
87
|
+
console.warn(`[vendo] VendoSlot "${id}": suggestions open the conversation surface — mount a VendoOverlay for them to land in.`);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
// Gesture-owned forking (2026-07-21): the Remix gesture on an EMPTY slot
|
|
91
|
+
// executes the fork DETERMINISTICALLY through the wire (the engine copies
|
|
92
|
+
// the captured source and records the pin — no model call, and the model
|
|
93
|
+
// never decides to fork); the fork then mounts via slot discovery. On a
|
|
94
|
+
// slot already holding an app the fork exists, so the gesture opens the
|
|
95
|
+
// composer prefilled — the instruction rides an ordinary edit.
|
|
96
|
+
const startRemix = () => {
|
|
97
|
+
// A slot is FILLED when it holds an app OR a host-supplied pin (the pin
|
|
98
|
+
// branch mounts through AppFrame the same way) — either way the fork
|
|
99
|
+
// already exists, so the gesture opens the composer, never the wire fork.
|
|
100
|
+
if (appId !== undefined || pin !== undefined) {
|
|
101
|
+
const prompt = remixPrompt ?? `Update my ${id} remix: `;
|
|
102
|
+
const opened = openVendoConversation({ prompt, send: false });
|
|
103
|
+
if (!opened && developmentMode()) {
|
|
104
|
+
console.warn(`[vendo] VendoSlot "${id}": remix opens the conversation surface — mount a VendoOverlay for it to land in.`);
|
|
105
|
+
}
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (remixLatched)
|
|
109
|
+
return;
|
|
110
|
+
setRemixBusy(true);
|
|
111
|
+
client.apps.forkPin({ slot: id })
|
|
112
|
+
.then(() => {
|
|
113
|
+
setForkPending(true);
|
|
114
|
+
return discovery.refresh();
|
|
115
|
+
})
|
|
116
|
+
.catch((error) => {
|
|
117
|
+
if (developmentMode()) {
|
|
118
|
+
console.warn(`[vendo] VendoSlot "${id}": the remix fork failed — ${error instanceof Error ? error.message : String(error)}`);
|
|
119
|
+
}
|
|
120
|
+
})
|
|
121
|
+
.finally(() => setRemixBusy(false));
|
|
122
|
+
};
|
|
123
|
+
const remixButton = remix ? (_jsxs("button", { type: "button", className: "fl-slot-remix", "aria-label": `Remix ${id} with Vendo`, "aria-busy": remixLatched || undefined, disabled: remixLatched, onClick: startRemix, children: [_jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "m12 3 1.5 4.5L18 9l-4.5 1.5L12 15l-1.5-4.5L6 9l4.5-1.5L12 3Z" }) }), remixLatched ? "Remixing…" : "Remix"] })) : null;
|
|
124
|
+
if (!appId && !pin) {
|
|
125
|
+
if (children !== undefined) {
|
|
126
|
+
if (remixButton === null)
|
|
127
|
+
return _jsx(_Fragment, { children: children });
|
|
128
|
+
// The affordance needs a positioned boundary over the host's own markup;
|
|
129
|
+
// the inline wrapper stays layout-neutral (the ChromeRoot child is an
|
|
130
|
+
// empty block carrying only the absolutely-positioned button).
|
|
131
|
+
return (_jsxs("div", { "data-vendo-slot": id, style: { position: "relative", height: "100%" }, children: [_jsx(ChromeRoot, { automaticPolicyNotice: false, children: remixButton }), children] }));
|
|
132
|
+
}
|
|
133
|
+
// The invitation (pick S-A×S-D): accent-washed surface, real copy, up to
|
|
134
|
+
// three concrete suggestion chips, and (layout "button") a primary CTA.
|
|
135
|
+
// The skeleton stays behind at low opacity so it still reads as "a view
|
|
136
|
+
// goes here". No icon by default.
|
|
137
|
+
const invite = {
|
|
138
|
+
title: emptyState?.title ?? "This space builds itself",
|
|
139
|
+
subtitle: emptyState?.subtitle ?? "describe a view — it renders here, live on your data",
|
|
140
|
+
suggestions: (emptyState?.suggestions ?? defaultSlotSuggestions).slice(0, 3),
|
|
141
|
+
ctaLabel: emptyState?.ctaLabel ?? "Design a view",
|
|
142
|
+
layout: emptyState?.layout ?? "button",
|
|
143
|
+
mark: emptyState?.mark ?? "none",
|
|
144
|
+
};
|
|
145
|
+
return (_jsx(ChromeRoot, { children: _jsx("div", { className: "fl-slot", "data-vendo-slot": id, children: _jsxs("div", { className: "fl-slot-ghost fl-slot-invite", children: [_jsx(GhostSkeleton, {}), _jsxs("div", { className: "fl-slot-cta", role: "group", "aria-label": invite.title, children: [invite.mark !== "none" ? (_jsx("span", { className: `fl-invite-mark${invite.mark === "tile" ? " fl-invite-mark-tile" : ""}`, "aria-hidden": "true", children: _jsxs("svg", { width: "19", height: "19", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "m12 3 1.4 4.1L17.5 8.5l-4.1 1.4L12 14l-1.4-4.1-4.1-1.4 4.1-1.4L12 3Z" }), _jsx("path", { d: "m18 14 .8 2.2L21 17l-2.2.8L18 20l-.8-2.2L15 17l2.2-.8L18 14Z" })] }) })) : null, _jsx("span", { className: "fl-invite-title", children: invite.title }), _jsx("small", { className: "fl-invite-sub", children: invite.subtitle }), invite.suggestions.length > 0 ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "fl-invite-try", children: "Try one" }), _jsx("div", { className: "fl-invite-chips", children: invite.suggestions.map((prompt, i) => (_jsx("button", { type: "button", className: "fl-invite-chip", onClick: () => suggest(prompt), children: prompt }, `${i}-${prompt}`))) })] })) : null, invite.layout === "button" ? (_jsx("button", { type: "button", className: "fl-invite-btn", onClick: author, children: invite.ctaLabel })) : (_jsx("button", { type: "button", className: "fl-invite-own", onClick: author, children: "or describe your own\u2026" }))] })] }) }) }));
|
|
146
|
+
}
|
|
147
|
+
const Fallback = () => _jsx(_Fragment, { children: children });
|
|
148
|
+
const mounted = appId
|
|
149
|
+
? _jsx(MountedApp, { appId: appId })
|
|
150
|
+
: _jsx(AppFrame, { surface: { kind: "tree", payload: pin.payload }, components: components, data: pin.data, onAction: pin.onAction });
|
|
151
|
+
return (_jsx(ChromeRoot, { children: _jsxs("div", { className: "fl-slot", "data-vendo-slot": id, children: [remixButton, _jsx("div", { className: "fl-slot-filled", children: _jsx(FluidReveal, { stateKey: appId ? `app:${appId}` : `pin:${id}`, initialExit: children, children: _jsx(PinMount, { slot: id, fallback: Fallback, children: mounted }) }) })] }) }));
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=vendo-slot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendo-slot.js","sourceRoot":"","sources":["../../src/chrome/vendo-slot.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** ENG-225 — VendoToasts: the delivery surface for moments that land while the
|
|
2
|
+
user is elsewhere on the page (an automation finishing, an approval parking).
|
|
3
|
+
One fixed stack (.fl-toasts), portaled to <body> so no host stacking context
|
|
4
|
+
can trap it, carrying its own theme boundary like MorphToast.
|
|
5
|
+
|
|
6
|
+
Two feeds compose it:
|
|
7
|
+
- `vendoToast(...)` — the imperative host API (module singleton, works from
|
|
8
|
+
any code path; automations delivery wires through this).
|
|
9
|
+
- `approvals` — opt-in polling of pending approvals: a NEWLY parked approval
|
|
10
|
+
raises an approval-required toast, decidable in place. */
|
|
11
|
+
import { type ReactNode } from "react";
|
|
12
|
+
export interface VendoToastAction {
|
|
13
|
+
label: string;
|
|
14
|
+
onAction(): void;
|
|
15
|
+
/** Primary renders as the filled approve-style button. */
|
|
16
|
+
primary?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface VendoToastInput {
|
|
19
|
+
text: string;
|
|
20
|
+
kind?: "info" | "approval-required";
|
|
21
|
+
state?: "info" | "error";
|
|
22
|
+
hint?: string;
|
|
23
|
+
actions?: VendoToastAction[];
|
|
24
|
+
/** Auto-dismiss after this many ms; 0 keeps the toast until dismissed.
|
|
25
|
+
Defaults to 6000, or sticky for approval-required. */
|
|
26
|
+
durationMs?: number;
|
|
27
|
+
}
|
|
28
|
+
/** Withdraw every queued toast (host page teardown, tests). */
|
|
29
|
+
export declare function dismissAllVendoToasts(): void;
|
|
30
|
+
/** Raise a toast. Returns a dismiss handle. */
|
|
31
|
+
export declare function vendoToast(input: VendoToastInput): () => void;
|
|
32
|
+
export interface VendoToastsProps {
|
|
33
|
+
placement?: "bottom-right" | "bottom-left" | "top-right";
|
|
34
|
+
/** Also surface newly parked approvals as toasts (polls /approvals/pending). */
|
|
35
|
+
approvals?: boolean;
|
|
36
|
+
pollMs?: number;
|
|
37
|
+
}
|
|
38
|
+
/** 08-ui §4 chrome — mount once per page. */
|
|
39
|
+
export declare function VendoToasts({ placement, approvals, pollMs }?: VendoToastsProps): ReactNode;
|
|
40
|
+
//# sourceMappingURL=vendo-toasts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendo-toasts.d.ts","sourceRoot":"","sources":["../../src/chrome/vendo-toasts.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;+DAS+D;AAC/D,OAAO,EAA2C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAQhF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,IAAI,IAAI,CAAC;IACjB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B;6DACyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA2BD,+DAA+D;AAC/D,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,+CAA+C;AAC/C,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,IAAI,CAO7D;AAyED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,cAAc,GAAG,aAAa,GAAG,WAAW,CAAC;IACzD,gFAAgF;IAChF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,6CAA6C;AAC7C,wBAAgB,WAAW,CAAC,EAAE,SAA0B,EAAE,SAAiB,EAAE,MAAc,EAAE,GAAE,gBAAqB,GAAG,SAAS,CA8D/H"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/** ENG-225 — VendoToasts: the delivery surface for moments that land while the
|
|
3
|
+
user is elsewhere on the page (an automation finishing, an approval parking).
|
|
4
|
+
One fixed stack (.fl-toasts), portaled to <body> so no host stacking context
|
|
5
|
+
can trap it, carrying its own theme boundary like MorphToast.
|
|
6
|
+
|
|
7
|
+
Two feeds compose it:
|
|
8
|
+
- `vendoToast(...)` — the imperative host API (module singleton, works from
|
|
9
|
+
any code path; automations delivery wires through this).
|
|
10
|
+
- `approvals` — opt-in polling of pending approvals: a NEWLY parked approval
|
|
11
|
+
raises an approval-required toast, decidable in place. */
|
|
12
|
+
import { useEffect, useRef, useSyncExternalStore } from "react";
|
|
13
|
+
import { createPortal } from "react-dom";
|
|
14
|
+
import { useVendoContext } from "../context.js";
|
|
15
|
+
import { useApprovals } from "../hooks/use-approvals.js";
|
|
16
|
+
import { themeCssVariables } from "../theme.js";
|
|
17
|
+
import { ensureChromeStyles } from "./chrome-root.js";
|
|
18
|
+
import { toolTitle } from "./humanize.js";
|
|
19
|
+
// Module singleton so `vendoToast` works from any code path, not only under a
|
|
20
|
+
// provider. Every mounted <VendoToasts> renders the same queue.
|
|
21
|
+
let nextToastId = 1;
|
|
22
|
+
let queue = [];
|
|
23
|
+
const listeners = new Set();
|
|
24
|
+
const timers = new Map();
|
|
25
|
+
function notify() {
|
|
26
|
+
for (const listener of listeners)
|
|
27
|
+
listener();
|
|
28
|
+
}
|
|
29
|
+
function removeToast(id) {
|
|
30
|
+
const timer = timers.get(id);
|
|
31
|
+
if (timer !== undefined)
|
|
32
|
+
clearTimeout(timer);
|
|
33
|
+
timers.delete(id);
|
|
34
|
+
if (queue.some(toast => toast.id === id)) {
|
|
35
|
+
queue = queue.filter(toast => toast.id !== id);
|
|
36
|
+
notify();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Withdraw every queued toast (host page teardown, tests). */
|
|
40
|
+
export function dismissAllVendoToasts() {
|
|
41
|
+
for (const toast of [...queue])
|
|
42
|
+
removeToast(toast.id);
|
|
43
|
+
}
|
|
44
|
+
/** Raise a toast. Returns a dismiss handle. */
|
|
45
|
+
export function vendoToast(input) {
|
|
46
|
+
const id = nextToastId++;
|
|
47
|
+
queue = [...queue, { ...input, id }];
|
|
48
|
+
const duration = input.durationMs ?? (input.kind === "approval-required" ? 0 : 6_000);
|
|
49
|
+
if (duration > 0)
|
|
50
|
+
timers.set(id, setTimeout(() => removeToast(id), duration));
|
|
51
|
+
notify();
|
|
52
|
+
return () => removeToast(id);
|
|
53
|
+
}
|
|
54
|
+
function subscribe(listener) {
|
|
55
|
+
listeners.add(listener);
|
|
56
|
+
return () => listeners.delete(listener);
|
|
57
|
+
}
|
|
58
|
+
const EMPTY = [];
|
|
59
|
+
function useToastQueue() {
|
|
60
|
+
return useSyncExternalStore(subscribe, () => queue, () => EMPTY);
|
|
61
|
+
}
|
|
62
|
+
/** Opt-in approval feed: raises a toast for every approval that parks AFTER
|
|
63
|
+
mount (the pre-existing backlog belongs to the WaitingQueue, not to a toast
|
|
64
|
+
storm on page load), and withdraws it once decided elsewhere. */
|
|
65
|
+
function ApprovalToasts({ pollMs }) {
|
|
66
|
+
const { tools } = useVendoContext();
|
|
67
|
+
const { pending, isLoading, decide } = useApprovals({ pollMs });
|
|
68
|
+
// null until the first fetch settles — that first batch is baseline, not news.
|
|
69
|
+
const seenRef = useRef(null);
|
|
70
|
+
const dismissersRef = useRef(new Map());
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
const dismissers = dismissersRef.current;
|
|
73
|
+
if (seenRef.current === null) {
|
|
74
|
+
// The hook's initial [] (fetch still in flight) is not the baseline —
|
|
75
|
+
// waiting for it would toast the whole pre-existing backlog on load.
|
|
76
|
+
if (isLoading)
|
|
77
|
+
return;
|
|
78
|
+
seenRef.current = new Set(pending.map(approval => approval.id));
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const seen = seenRef.current;
|
|
82
|
+
for (const approval of pending) {
|
|
83
|
+
if (seen.has(approval.id) || dismissers.has(approval.id))
|
|
84
|
+
continue;
|
|
85
|
+
seen.add(approval.id);
|
|
86
|
+
const dismiss = vendoToast({
|
|
87
|
+
kind: "approval-required",
|
|
88
|
+
text: `Waiting on you: ${toolTitle(approval.call.tool, tools[approval.call.tool])}`,
|
|
89
|
+
hint: "recorded in Activity",
|
|
90
|
+
actions: [{
|
|
91
|
+
label: "Approve",
|
|
92
|
+
primary: true,
|
|
93
|
+
onAction: () => {
|
|
94
|
+
void decide(approval.id, { approve: true }).then(() => {
|
|
95
|
+
dismissers.get(approval.id)?.();
|
|
96
|
+
dismissers.delete(approval.id);
|
|
97
|
+
}).catch(() => {
|
|
98
|
+
// The decide failed — the approval is still parked server-side.
|
|
99
|
+
// Keep the toast so Approve stays retryable, and un-see the id
|
|
100
|
+
// so a later poll can re-raise it once this card is gone.
|
|
101
|
+
seen.delete(approval.id);
|
|
102
|
+
});
|
|
103
|
+
},
|
|
104
|
+
}],
|
|
105
|
+
});
|
|
106
|
+
dismissers.set(approval.id, dismiss);
|
|
107
|
+
}
|
|
108
|
+
// Decided (or expired) elsewhere: withdraw the stale toast.
|
|
109
|
+
const pendingIds = new Set(pending.map(approval => approval.id));
|
|
110
|
+
for (const [id, dismiss] of dismissers) {
|
|
111
|
+
if (!pendingIds.has(id)) {
|
|
112
|
+
dismiss();
|
|
113
|
+
dismissers.delete(id);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}, [pending, isLoading, decide, tools]);
|
|
117
|
+
useEffect(() => () => {
|
|
118
|
+
for (const dismiss of dismissersRef.current.values())
|
|
119
|
+
dismiss();
|
|
120
|
+
dismissersRef.current.clear();
|
|
121
|
+
}, []);
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
/** 08-ui §4 chrome — mount once per page. */
|
|
125
|
+
export function VendoToasts({ placement = "bottom-right", approvals = false, pollMs = 5_000 } = {}) {
|
|
126
|
+
const { theme } = useVendoContext();
|
|
127
|
+
const toasts = useToastQueue();
|
|
128
|
+
// The stack portals out of any ChromeRoot subtree, so it owns its own style
|
|
129
|
+
// injection — a page that mounts ONLY VendoToasts still renders styled.
|
|
130
|
+
useEffect(ensureChromeStyles, []);
|
|
131
|
+
if (typeof document === "undefined")
|
|
132
|
+
return null;
|
|
133
|
+
return (_jsxs(_Fragment, { children: [approvals ? _jsx(ApprovalToasts, { pollMs: pollMs }) : null, toasts.length > 0 ? createPortal(_jsx("div", { className: "vendo-root", "data-vendo-motion": theme.motion, "data-vendo-density": theme.density, style: themeCssVariables(theme), children: _jsx("div", { className: "fl-toasts", "data-placement": placement, role: "region", "aria-label": "Notifications", children: toasts.map(toast => (_jsxs("div", { className: "fl-toasts-card", "data-kind": toast.kind ?? "info", "data-state": toast.state ?? "info", role: "status", children: [_jsx("span", { className: "fl-toasts-icon", "aria-hidden": "true", children: toast.kind === "approval-required" ? (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("path", { d: "M12 6v6l4 2" })] })) : (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("path", { d: "M12 16v-4M12 8h.01" })] })) }), _jsxs("div", { className: "fl-toasts-body", children: [_jsx("div", { className: "fl-toasts-text", children: toast.text }), _jsxs("div", { className: "fl-toasts-actions", children: [(toast.actions ?? []).map(action => (_jsx("button", { type: "button", className: action.primary === true ? "fl-toasts-approve" : "fl-toasts-view", onClick: action.onAction, children: action.label }, action.label))), toast.hint !== undefined ? _jsx("span", { className: "fl-toasts-hint", children: toast.hint }) : null, _jsx("button", { type: "button", className: "fl-toasts-dismiss", "aria-label": "Dismiss notification", onClick: () => removeToast(toast.id), children: "\u00D7" })] })] })] }, toast.id))) }) }), document.body) : null] }));
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=vendo-toasts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendo-toasts.js","sourceRoot":"","sources":["../../src/chrome/vendo-toasts.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
export interface VendoTriggerProps {
|
|
3
|
+
/** The prompt preloaded into the conversation composer — prefilled, never
|
|
4
|
+
* auto-sent, so a trigger is safe even on destructive prompts. */
|
|
5
|
+
prompt: string;
|
|
6
|
+
/** Optional context appended to the prompt (blank-line separated) — the
|
|
7
|
+
* record or state on screen, so the agent starts oriented. */
|
|
8
|
+
context?: string;
|
|
9
|
+
/** Button label. Default "Ask Vendo". */
|
|
10
|
+
children?: ReactNode;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The shelf's "do it with AI" button (ui-usage-dx §2): every host affordance
|
|
14
|
+
* that hands a task to the agent is this piece. Activation opens the most
|
|
15
|
+
* recently mounted conversation surface (the VendoOverlay) with the prompt
|
|
16
|
+
* seeded into the composer.
|
|
17
|
+
*
|
|
18
|
+
* Hosts that want their own element as the trigger skip this component and
|
|
19
|
+
* call `openVendoConversation({ prompt })` from it directly — the same
|
|
20
|
+
* programmatic seam this button uses (the repo's idiom; there is deliberately
|
|
21
|
+
* no render-prop API on chrome, ui-usage-dx §4).
|
|
22
|
+
*/
|
|
23
|
+
export declare function VendoTrigger({ prompt, context, children }: VendoTriggerProps): import("react").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=vendo-trigger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendo-trigger.d.ts","sourceRoot":"","sources":["../../src/chrome/vendo-trigger.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,MAAM,WAAW,iBAAiB;IAChC;uEACmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf;mEAC+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,iBAAiB,+BA2B5E"}
|