@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,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ejected from @vendoai/ui v0.4.0 — yours to edit.
|
|
3
|
+
* Presentation only: data and wire logic still flow through @vendoai/ui
|
|
4
|
+
* imports, so protocol updates keep working while these pixels are yours.
|
|
5
|
+
*/
|
|
6
|
+
import type { UIMessage } from "ai";
|
|
7
|
+
import { useEffect, useLayoutEffect, useRef, useState } from "react";
|
|
8
|
+
|
|
9
|
+
/** ENG-218 — windowing for long threads. Rendering a reopened 200-turn thread
|
|
10
|
+
mounts every turn's DOM (and runs every entrance animation) at once. Instead
|
|
11
|
+
we render only a trailing window of the most recent messages and reveal older
|
|
12
|
+
ones in chunks when the reader scrolls to the top — the DOM stays bounded, so
|
|
13
|
+
scroll and paint stay smooth no matter how long the transcript is.
|
|
14
|
+
|
|
15
|
+
The trailing window is what stick-to-bottom and jump-to-latest already care
|
|
16
|
+
about (both operate at the end), so those behaviors are untouched. Only the
|
|
17
|
+
unseen head of a genuinely long thread is deferred. */
|
|
18
|
+
const WINDOW_INITIAL = 60;
|
|
19
|
+
const WINDOW_STEP = 40;
|
|
20
|
+
const NEAR_TOP_PX = 200;
|
|
21
|
+
|
|
22
|
+
export function useMessageWindow(messages: UIMessage[], listRef: React.RefObject<HTMLDivElement | null>, threadKey?: string) {
|
|
23
|
+
// How many trailing messages to render. Grows (never shrinks the head back
|
|
24
|
+
// out from under the reader) as they scroll up; resets when the thread swaps.
|
|
25
|
+
const [count, setCount] = useState(WINDOW_INITIAL);
|
|
26
|
+
useEffect(() => { setCount(WINDOW_INITIAL); }, [threadKey]);
|
|
27
|
+
|
|
28
|
+
const start = Math.max(0, messages.length - count);
|
|
29
|
+
const windowed = start === 0 ? messages : messages.slice(start);
|
|
30
|
+
const hasOlder = start > 0;
|
|
31
|
+
|
|
32
|
+
// Anchor the viewport across a window growth: prepending older turns balloons
|
|
33
|
+
// scrollHeight, which would otherwise yank the reader. Capture distance-from-
|
|
34
|
+
// bottom at expand time and restore it after the new nodes lay out.
|
|
35
|
+
const anchorRef = useRef<number | null>(null);
|
|
36
|
+
const loadOlder = () => {
|
|
37
|
+
if (start === 0) return;
|
|
38
|
+
const node = listRef.current;
|
|
39
|
+
anchorRef.current = node ? node.scrollHeight - node.scrollTop : null;
|
|
40
|
+
setCount(current => current + WINDOW_STEP);
|
|
41
|
+
};
|
|
42
|
+
useLayoutEffect(() => {
|
|
43
|
+
const node = listRef.current;
|
|
44
|
+
if (anchorRef.current === null || !node) return;
|
|
45
|
+
node.scrollTop = node.scrollHeight - anchorRef.current;
|
|
46
|
+
anchorRef.current = null;
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Reveal more when the reader reaches the top of the rendered window.
|
|
50
|
+
const onNearTop = () => {
|
|
51
|
+
const node = listRef.current;
|
|
52
|
+
if (node && node.scrollTop <= NEAR_TOP_PX) loadOlder();
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
return { windowed, hasOlder, olderCount: start, loadOlder, onNearTop };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Within this many pixels of the end the reader counts as "at the bottom" —
|
|
59
|
+
a paragraph of slack so sub-line wobble (fractional scroll positions,
|
|
60
|
+
entrance easing) never breaks the stick. */
|
|
61
|
+
const BOTTOM_SLACK_PX = 32;
|
|
62
|
+
|
|
63
|
+
/** ENG-213 — scroll management for the message list.
|
|
64
|
+
|
|
65
|
+
Stick-to-bottom: while the reader is at the end, every content change
|
|
66
|
+
(history load, streamed deltas, tool chips, approvals) keeps the latest
|
|
67
|
+
content in view. The moment the reader scrolls up, the stick releases —
|
|
68
|
+
streaming must never yank them — and it re-arms when they return to the
|
|
69
|
+
bottom on their own. Jump-to-latest: when new content lands while the
|
|
70
|
+
reader is scrolled up, the stylesheet's .fl-jump affordance appears;
|
|
71
|
+
activating it scrolls to the latest turn and re-sticks. */
|
|
72
|
+
export function useStickToBottom(messages: UIMessage[], threadKey?: string, contentRevision?: unknown) {
|
|
73
|
+
const listRef = useRef<HTMLDivElement>(null);
|
|
74
|
+
// The stick is a ref, not state: it flips inside scroll/effect timing and
|
|
75
|
+
// must be readable synchronously without re-render races.
|
|
76
|
+
const stuckRef = useRef(true);
|
|
77
|
+
const lastScrollHeightRef = useRef(0);
|
|
78
|
+
const [unseen, setUnseen] = useState(false);
|
|
79
|
+
// Lane pick 3A — the jump affordance grew into a bar with a COUNT of turns
|
|
80
|
+
// that landed while scrolled away and a snippet of the newest text. Count =
|
|
81
|
+
// messages appended since the stick released; snippet = the latest turn's
|
|
82
|
+
// trailing text (best-effort, purely presentational).
|
|
83
|
+
const [unseenCount, setUnseenCount] = useState(0);
|
|
84
|
+
const seenLengthRef = useRef(messages.length);
|
|
85
|
+
|
|
86
|
+
// A different conversation is a different reader position: when the caller
|
|
87
|
+
// switches the hook to another thread, re-arm the stick and forget the
|
|
88
|
+
// previous thread's growth baseline — otherwise a scroll-up in the old
|
|
89
|
+
// thread would keep the new one from opening at its latest turn.
|
|
90
|
+
const previousThreadKeyRef = useRef(threadKey);
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
const previousKey = previousThreadKeyRef.current;
|
|
93
|
+
previousThreadKeyRef.current = threadKey;
|
|
94
|
+
// ENG-222 id mint is NOT a thread switch: a conversation started without
|
|
95
|
+
// an id gets its server-minted thr_ fed back mid-first-stream (VendoPage's
|
|
96
|
+
// onThreadId loop), flipping this key while the reader is mid-read. The
|
|
97
|
+
// messages are the same conversation — KEEP the growth baseline: zeroing
|
|
98
|
+
// it makes previousHeight === 0 read as "at bottom by definition", so the
|
|
99
|
+
// next streamed chunk yanks a reader who had scrolled up (deterministic on
|
|
100
|
+
// slow runners — the "streaming must never yank" conformance failure).
|
|
101
|
+
// Re-arm the stick and clear the bar though: with the real baseline
|
|
102
|
+
// intact, the next mutation's previous-height guard releases a genuinely
|
|
103
|
+
// scrolled-up reader, while a bottom reader stays pinned instead of
|
|
104
|
+
// leaking a transient new-replies bar.
|
|
105
|
+
if (previousKey === undefined && threadKey !== undefined && messages.length > 0) {
|
|
106
|
+
stuckRef.current = true;
|
|
107
|
+
setUnseen(false);
|
|
108
|
+
setUnseenCount(0);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
stuckRef.current = true;
|
|
112
|
+
lastScrollHeightRef.current = 0;
|
|
113
|
+
setUnseen(false);
|
|
114
|
+
setUnseenCount(0);
|
|
115
|
+
// messages.length is deliberately unlisted: this effect keys on identity
|
|
116
|
+
// changes only, and the mint guard needs the length at flip time.
|
|
117
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
118
|
+
}, [threadKey]);
|
|
119
|
+
|
|
120
|
+
const atBottom = (node: HTMLElement) =>
|
|
121
|
+
node.scrollHeight - node.scrollTop - node.clientHeight <= BOTTOM_SLACK_PX;
|
|
122
|
+
|
|
123
|
+
const onScroll = () => {
|
|
124
|
+
const node = listRef.current;
|
|
125
|
+
if (!node) return;
|
|
126
|
+
// Both user scrolls and our own programmatic sticks land here; either way
|
|
127
|
+
// the reader's actual position is the single source of truth.
|
|
128
|
+
stuckRef.current = atBottom(node);
|
|
129
|
+
if (stuckRef.current) {
|
|
130
|
+
setUnseen(false);
|
|
131
|
+
setUnseenCount(0);
|
|
132
|
+
seenLengthRef.current = messages.length;
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
const jumpToLatest = () => {
|
|
137
|
+
const node = listRef.current;
|
|
138
|
+
if (!node) return;
|
|
139
|
+
stuckRef.current = true;
|
|
140
|
+
setUnseen(false);
|
|
141
|
+
setUnseenCount(0);
|
|
142
|
+
seenLengthRef.current = messages.length;
|
|
143
|
+
node.scrollTop = node.scrollHeight;
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
// After every content change: stick if the reader is at the bottom, or flag
|
|
147
|
+
// the new content if they've scrolled away. Layout effects would run before
|
|
148
|
+
// paint, but streamed markdown re-renders arrive in bursts — post-paint is
|
|
149
|
+
// indistinguishable here and cheaper.
|
|
150
|
+
useEffect(() => {
|
|
151
|
+
const node = listRef.current;
|
|
152
|
+
if (!node) return;
|
|
153
|
+
const previousHeight = lastScrollHeightRef.current;
|
|
154
|
+
const grew = node.scrollHeight > previousHeight;
|
|
155
|
+
lastScrollHeightRef.current = node.scrollHeight;
|
|
156
|
+
// The scroll event that releases the stick is ASYNC: a reader who just
|
|
157
|
+
// scrolled up can have content land before onScroll flips stuckRef, and
|
|
158
|
+
// trusting the stale ref would yank them back down ("streaming must never
|
|
159
|
+
// yank"). Their position against the PREVIOUS content height is ground
|
|
160
|
+
// truth: stuck growth leaves scrollTop at the old bottom; a scroll-up
|
|
161
|
+
// puts it well above. Release the stick here instead of yanking.
|
|
162
|
+
const atPreviousBottom = previousHeight === 0
|
|
163
|
+
|| previousHeight - node.scrollTop - node.clientHeight <= BOTTOM_SLACK_PX;
|
|
164
|
+
// …unless they are at the CURRENT bottom: when content SHRINKS (a connect
|
|
165
|
+
// card or generated view swaps out), scrollTop can no longer equal the old
|
|
166
|
+
// taller bottom, and the previous-height test alone misreads the reader as
|
|
167
|
+
// scrolled-up — releasing the stick and leaking a new-replies bar on the
|
|
168
|
+
// next turn even though they never moved. At-current-bottom is at bottom.
|
|
169
|
+
if (stuckRef.current && !atPreviousBottom && !atBottom(node)) stuckRef.current = false;
|
|
170
|
+
if (stuckRef.current) {
|
|
171
|
+
node.scrollTop = node.scrollHeight;
|
|
172
|
+
seenLengthRef.current = messages.length;
|
|
173
|
+
} else if (grew) {
|
|
174
|
+
setUnseen(true);
|
|
175
|
+
setUnseenCount(Math.max(1, messages.length - seenLengthRef.current));
|
|
176
|
+
}
|
|
177
|
+
// contentRevision — ENG-215: turn-actions (Edit/Regenerate) mount below the
|
|
178
|
+
// last turn the instant a stream settles (busy→false), adding height AFTER
|
|
179
|
+
// the message-driven stick already ran. Re-run so the reader stays pinned.
|
|
180
|
+
}, [messages, contentRevision]);
|
|
181
|
+
|
|
182
|
+
// A generated view mounts and grows AFTER the messages effect runs (the jail
|
|
183
|
+
// renders async; logos/images load late). Without watching actual size, the
|
|
184
|
+
// stick fires before the growth and the newest content — the approval card,
|
|
185
|
+
// the closing line — lands below the fold. Observe the content box and
|
|
186
|
+
// re-stick whenever it grows while the reader is at the bottom.
|
|
187
|
+
useEffect(() => {
|
|
188
|
+
const node = listRef.current;
|
|
189
|
+
if (!node || typeof ResizeObserver === "undefined") return;
|
|
190
|
+
const observer = new ResizeObserver(() => {
|
|
191
|
+
// Same async-scroll-event guard as the messages effect: only re-stick a
|
|
192
|
+
// reader who was actually at the bottom of the previous content.
|
|
193
|
+
const previousHeight = lastScrollHeightRef.current;
|
|
194
|
+
const atPreviousBottom = previousHeight === 0
|
|
195
|
+
|| previousHeight - node.scrollTop - node.clientHeight <= BOTTOM_SLACK_PX;
|
|
196
|
+
lastScrollHeightRef.current = node.scrollHeight;
|
|
197
|
+
if (stuckRef.current && !atPreviousBottom && !atBottom(node)) stuckRef.current = false;
|
|
198
|
+
if (stuckRef.current) node.scrollTop = node.scrollHeight;
|
|
199
|
+
});
|
|
200
|
+
for (const child of Array.from(node.children)) observer.observe(child);
|
|
201
|
+
const mutation = new MutationObserver(() => {
|
|
202
|
+
for (const child of Array.from(node.children)) observer.observe(child);
|
|
203
|
+
});
|
|
204
|
+
mutation.observe(node, { childList: true, subtree: true });
|
|
205
|
+
return () => {
|
|
206
|
+
observer.disconnect();
|
|
207
|
+
mutation.disconnect();
|
|
208
|
+
};
|
|
209
|
+
}, []);
|
|
210
|
+
|
|
211
|
+
// 3A snippet: trailing text of the newest message (bounded; presentational).
|
|
212
|
+
const lastMessage = messages.at(-1);
|
|
213
|
+
const snippet = unseen && lastMessage
|
|
214
|
+
? lastMessage.parts
|
|
215
|
+
.filter((part): part is Extract<typeof part, { type: "text" }> => part.type === "text")
|
|
216
|
+
.map(part => part.text)
|
|
217
|
+
.join(" ")
|
|
218
|
+
.trim()
|
|
219
|
+
.slice(0, 120)
|
|
220
|
+
: "";
|
|
221
|
+
|
|
222
|
+
return { listRef, onScroll, jumpToLatest, showJump: unseen, unseenCount, snippet };
|
|
223
|
+
}
|
package/dist/embeds.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { VendoAppRef, VendoApprovalRef } from "@vendoai/core";
|
|
2
|
+
/**
|
|
3
|
+
* Existing-agents contract — prop shapes for the three embeds a BYO chat
|
|
4
|
+
* surface renders from `vendo_*` tool outputs (Wave 0 freeze; Wave 1 Lane B
|
|
5
|
+
* builds the components behind them on the existing slot / build-beat /
|
|
6
|
+
* approval-card machinery, inside the same `VendoProvider`).
|
|
7
|
+
* Frozen in `docs/superpowers/specs/2026-07-20-existing-agents-contracts.md`.
|
|
8
|
+
*/
|
|
9
|
+
/** Inline generated app: build-beat while the build streams, then the live
|
|
10
|
+
* app. In-app interactions go over the wire, not through the host loop. */
|
|
11
|
+
export interface VendoAppEmbedProps {
|
|
12
|
+
refValue: VendoAppRef;
|
|
13
|
+
}
|
|
14
|
+
/** Where an approval embed can be, in the order it gets there. The wire owns
|
|
15
|
+
* the state; the embed only renders it — resolving in place to the executed
|
|
16
|
+
* outcome, "declined", or "expired" (the existing failed/expired vocabulary,
|
|
17
|
+
* never a silent blank). */
|
|
18
|
+
export type VendoApprovalEmbedState = "pending" | "executed" | "declined" | "expired";
|
|
19
|
+
/** Approve/deny for a parked guarded call. */
|
|
20
|
+
export interface VendoApprovalEmbedProps {
|
|
21
|
+
refValue: VendoApprovalRef;
|
|
22
|
+
}
|
|
23
|
+
/** The dispatcher: give it any `vendo_*` tool output and it renders the right
|
|
24
|
+
* embed by `parseVendoToolEnvelope`, or nothing for plain data. */
|
|
25
|
+
export interface VendoToolResultProps {
|
|
26
|
+
output: unknown;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=embeds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeds.d.ts","sourceRoot":"","sources":["../src/embeds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEnE;;;;;;GAMG;AAEH;4EAC4E;AAC5E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,WAAW,CAAC;CACvB;AAED;;;6BAG6B;AAC7B,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAEtF,8CAA8C;AAC9C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED;oEACoE;AACpE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;CACjB"}
|
package/dist/embeds.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeds.js","sourceRoot":"","sources":["../src/embeds.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Complete headless hook surface (08-ui §3). */
|
|
2
|
+
export { useActivity } from "./use-activity.js";
|
|
3
|
+
export { useApp } from "./use-app.js";
|
|
4
|
+
export { useApps } from "./use-apps.js";
|
|
5
|
+
export { useApprovals } from "./use-approvals.js";
|
|
6
|
+
export { useAutomations } from "./use-automations.js";
|
|
7
|
+
export { useConnections } from "./use-connections.js";
|
|
8
|
+
export { useConnectorCatalog } from "./use-connector-catalog.js";
|
|
9
|
+
export { useGrants } from "./use-grants.js";
|
|
10
|
+
export { useMobileTakeover, type MobileTakeover } from "./use-mobile-takeover.js";
|
|
11
|
+
export { type PollOptions } from "./use-resource.js";
|
|
12
|
+
export { useSlotApp } from "./use-slot-app.js";
|
|
13
|
+
export { useThreads } from "./use-threads.js";
|
|
14
|
+
export { useVendoOverlay, type VendoOverlayController } from "./use-vendo-overlay.js";
|
|
15
|
+
export { useVendoStatus } from "./use-vendo-status.js";
|
|
16
|
+
export { useVendoThread, type VendoThreadApproval } from "./use-vendo-thread.js";
|
|
17
|
+
export { ScriptedTransport, type DirectorCue, type DirectorScript } from "./scripted-transport.js";
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Complete headless hook surface (08-ui §3). */
|
|
2
|
+
export { useActivity } from "./use-activity.js";
|
|
3
|
+
export { useApp } from "./use-app.js";
|
|
4
|
+
export { useApps } from "./use-apps.js";
|
|
5
|
+
export { useApprovals } from "./use-approvals.js";
|
|
6
|
+
export { useAutomations } from "./use-automations.js";
|
|
7
|
+
export { useConnections } from "./use-connections.js";
|
|
8
|
+
export { useConnectorCatalog } from "./use-connector-catalog.js";
|
|
9
|
+
export { useGrants } from "./use-grants.js";
|
|
10
|
+
// Deliberately public (lane pick 1-H): the ejected thread surface imports it,
|
|
11
|
+
// and hosts placing their own approval chrome need the same breakpoint truth.
|
|
12
|
+
export { useMobileTakeover } from "./use-mobile-takeover.js";
|
|
13
|
+
export { useSlotApp } from "./use-slot-app.js";
|
|
14
|
+
export { useThreads } from "./use-threads.js";
|
|
15
|
+
export { useVendoOverlay } from "./use-vendo-overlay.js";
|
|
16
|
+
export { useVendoStatus } from "./use-vendo-status.js";
|
|
17
|
+
export { useVendoThread } from "./use-vendo-thread.js";
|
|
18
|
+
export { ScriptedTransport } from "./scripted-transport.js";
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,8EAA8E;AAC9E,8EAA8E;AAC9E,OAAO,EAAE,iBAAiB,EAAuB,MAAM,0BAA0B,CAAC;AAElF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAA+B,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAA4B,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAyC,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ChatTransport, UIMessage, UIMessageChunk } from "ai";
|
|
2
|
+
/**
|
|
3
|
+
* Director mode: a chat transport that replays an authored (or recorded)
|
|
4
|
+
* sequence of UI-message chunks at scripted pacing instead of calling the
|
|
5
|
+
* agent. The thread, beats, reveals, approvals, and morphs downstream are the
|
|
6
|
+
* REAL components rendering a real part stream — only the source of the
|
|
7
|
+
* stream is scripted. Demo/capture tooling only; hosts opt in explicitly by
|
|
8
|
+
* passing it through the provider (`VendoProvider transport`), it is never a
|
|
9
|
+
* default.
|
|
10
|
+
*
|
|
11
|
+
* A cue's `chunk` is exactly one SSE `data:` payload of the live wire
|
|
12
|
+
* (`UIMessageChunk`), so a recording of a real build replays verbatim — see
|
|
13
|
+
* the recorder hook in `use-vendo-thread.ts` (`__vendoDirectorRecord`).
|
|
14
|
+
*/
|
|
15
|
+
export interface DirectorCue {
|
|
16
|
+
/** Milliseconds to wait after the previous cue before emitting this chunk. */
|
|
17
|
+
delay: number;
|
|
18
|
+
chunk: UIMessageChunk;
|
|
19
|
+
}
|
|
20
|
+
export interface DirectorScript {
|
|
21
|
+
/** Single-turn form. */
|
|
22
|
+
cues?: DirectorCue[];
|
|
23
|
+
/**
|
|
24
|
+
* Multi-turn form: each sendMessages call (initial send, then each
|
|
25
|
+
* approval-driven resume) plays the next turn in order; the last turn
|
|
26
|
+
* repeats if the surface asks again.
|
|
27
|
+
*/
|
|
28
|
+
turns?: Array<{
|
|
29
|
+
cues: DirectorCue[];
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
export declare class ScriptedTransport implements ChatTransport<UIMessage> {
|
|
33
|
+
private readonly script;
|
|
34
|
+
private readonly options;
|
|
35
|
+
private turnIndex;
|
|
36
|
+
constructor(script: DirectorScript, options?: {
|
|
37
|
+
speed?: number;
|
|
38
|
+
});
|
|
39
|
+
sendMessages(options: {
|
|
40
|
+
abortSignal: AbortSignal | undefined;
|
|
41
|
+
}): Promise<ReadableStream<UIMessageChunk>>;
|
|
42
|
+
reconnectToStream(): Promise<ReadableStream<UIMessageChunk> | null>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=scripted-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripted-transport.d.ts","sourceRoot":"","sources":["../../src/hooks/scripted-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAEnE;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,WAAW;IAC1B,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,cAAc,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,wBAAwB;IACxB,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,WAAW,EAAE,CAAA;KAAE,CAAC,CAAC;CACxC;AAED,qBAAa,iBAAkB,YAAW,aAAa,CAAC,SAAS,CAAC;IAI9D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO,CAAC,SAAS,CAAK;gBAGH,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO;IAGnD,YAAY,CAAC,OAAO,EAAE;QAAE,WAAW,EAAE,WAAW,GAAG,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IA8CxG,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;CAGpE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export class ScriptedTransport {
|
|
2
|
+
script;
|
|
3
|
+
options;
|
|
4
|
+
turnIndex = 0;
|
|
5
|
+
constructor(script, options = {}) {
|
|
6
|
+
this.script = script;
|
|
7
|
+
this.options = options;
|
|
8
|
+
}
|
|
9
|
+
sendMessages(options) {
|
|
10
|
+
const turns = this.script.turns ?? [{ cues: this.script.cues ?? [] }];
|
|
11
|
+
// Past the last authored turn, close gracefully — REPLAYING a turn would
|
|
12
|
+
// emit tool outputs for calls that live in earlier messages and corrupt
|
|
13
|
+
// the transcript.
|
|
14
|
+
const turn = this.turnIndex < turns.length
|
|
15
|
+
? turns[this.turnIndex]
|
|
16
|
+
: {
|
|
17
|
+
cues: [
|
|
18
|
+
{ delay: 0, chunk: { type: "start" } },
|
|
19
|
+
{ delay: 100, chunk: { type: "text-start", id: "director_end" } },
|
|
20
|
+
{ delay: 50, chunk: { type: "text-delta", id: "director_end", delta: "This directed take is finished — reload the page to play it again." } },
|
|
21
|
+
{ delay: 50, chunk: { type: "text-end", id: "director_end" } },
|
|
22
|
+
{ delay: 50, chunk: { type: "finish" } },
|
|
23
|
+
],
|
|
24
|
+
};
|
|
25
|
+
this.turnIndex += 1;
|
|
26
|
+
const cues = turn.cues;
|
|
27
|
+
const speed = this.options.speed ?? 1;
|
|
28
|
+
const signal = options.abortSignal;
|
|
29
|
+
return Promise.resolve(new ReadableStream({
|
|
30
|
+
async start(controller) {
|
|
31
|
+
for (const cue of cues) {
|
|
32
|
+
if (signal?.aborted)
|
|
33
|
+
break;
|
|
34
|
+
if (cue.delay > 0) {
|
|
35
|
+
await new Promise(resolve => setTimeout(resolve, cue.delay / speed));
|
|
36
|
+
}
|
|
37
|
+
if (signal?.aborted)
|
|
38
|
+
break;
|
|
39
|
+
controller.enqueue(cue.chunk);
|
|
40
|
+
// Staging hook: host surfaces (the dashboard slot) can react to
|
|
41
|
+
// the finished view landing — e.g. swapping the original
|
|
42
|
+
// component in place — without a wire round-trip.
|
|
43
|
+
if (typeof window !== "undefined" && cue.chunk.type === "data-vendo-view") {
|
|
44
|
+
const data = cue.chunk.data;
|
|
45
|
+
if (data?.payload && data.payload.streaming !== true) {
|
|
46
|
+
window.dispatchEvent(new CustomEvent("vendo-director:view-final", { detail: data }));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
controller.close();
|
|
51
|
+
},
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
reconnectToStream() {
|
|
55
|
+
return Promise.resolve(null);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=scripted-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripted-transport.js","sourceRoot":"","sources":["../../src/hooks/scripted-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Self-scoped audit activity transport (08-ui §3). */
|
|
2
|
+
import type { AuditEvent } from "@vendoai/core";
|
|
3
|
+
import { type PollOptions } from "./use-resource.js";
|
|
4
|
+
export declare function useActivity(options?: PollOptions): {
|
|
5
|
+
/** Back-compat alias for `data` (contract §3). */
|
|
6
|
+
events: AuditEvent[];
|
|
7
|
+
data: AuditEvent[];
|
|
8
|
+
error: Error | undefined;
|
|
9
|
+
isLoading: boolean;
|
|
10
|
+
/** Whether another page may still exist. Flips to `false` once a fetched page
|
|
11
|
+
is empty or repeats only already-seen rows, so the panel can show a proper
|
|
12
|
+
end-of-list state instead of a "Load more" that fetches nothing new. */
|
|
13
|
+
hasMore: boolean;
|
|
14
|
+
loadMore(): Promise<void>;
|
|
15
|
+
refresh(): Promise<void>;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=use-activity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-activity.d.ts","sourceRoot":"","sources":["../../src/hooks/use-activity.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAoBlE,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG;IAClD,kDAAkD;IAClD,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB;;+EAE2E;IAC3E,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B,CAgCA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
2
|
+
import { useVendoContext } from "../context.js";
|
|
3
|
+
import { useResource } from "./use-resource.js";
|
|
4
|
+
function dedupe(events) {
|
|
5
|
+
const seen = new Set();
|
|
6
|
+
return events.filter(event => !seen.has(event.id) && seen.add(event.id));
|
|
7
|
+
}
|
|
8
|
+
/** The store pages audit rows on `(at, id)` behind an opaque base64url `{c,i}`
|
|
9
|
+
cursor. `/activity` returns a bare `AuditEvent[]` (09 §3), so the client
|
|
10
|
+
reconstructs that cursor from the oldest event it holds to fetch the next
|
|
11
|
+
page — the raw event id alone is not a decodable cursor. */
|
|
12
|
+
function pageCursor(event) {
|
|
13
|
+
if (event === undefined)
|
|
14
|
+
return undefined;
|
|
15
|
+
const json = JSON.stringify({ c: event.at, i: event.id });
|
|
16
|
+
const base64 = typeof btoa === "function"
|
|
17
|
+
? btoa(json)
|
|
18
|
+
: Buffer.from(json, "utf8").toString("base64");
|
|
19
|
+
return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
20
|
+
}
|
|
21
|
+
export function useActivity(options) {
|
|
22
|
+
const { client } = useVendoContext();
|
|
23
|
+
const list = useCallback(() => client.activity.list(), [client]);
|
|
24
|
+
const { data: firstPage, error, isLoading, refresh } = useResource(list, [], options);
|
|
25
|
+
// Pages appended by loadMore; a refresh (manual or poll) reloads the first
|
|
26
|
+
// page rather than appending, so a fresh first page resets pagination and
|
|
27
|
+
// loadMore continues from the reset head.
|
|
28
|
+
const [extra, setExtra] = useState([]);
|
|
29
|
+
const [ended, setEnded] = useState(false);
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
setExtra([]);
|
|
32
|
+
setEnded(false);
|
|
33
|
+
}, [firstPage]);
|
|
34
|
+
const events = useMemo(() => dedupe([...firstPage, ...extra]), [firstPage, extra]);
|
|
35
|
+
// An empty first page is already the end; a full one may have more behind
|
|
36
|
+
// the cursor, proven (or disproven) by the next loadMore.
|
|
37
|
+
const hasMore = !ended && (isLoading || firstPage.length > 0);
|
|
38
|
+
const loadMore = useCallback(async () => {
|
|
39
|
+
const cursor = pageCursor(events.at(-1));
|
|
40
|
+
const next = await client.activity.list(cursor === undefined ? undefined : { cursor });
|
|
41
|
+
const known = new Set(events.map(event => event.id));
|
|
42
|
+
const added = next.filter(event => !known.has(event.id));
|
|
43
|
+
setExtra(current => [...current, ...added]);
|
|
44
|
+
// No page, or a page that surfaced nothing new, means there is nothing
|
|
45
|
+
// older left to fetch — we have reached the end of the audit history.
|
|
46
|
+
setEnded(added.length === 0);
|
|
47
|
+
}, [client, events]);
|
|
48
|
+
return { events, data: events, error, isLoading, hasMore, loadMore, refresh };
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=use-activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-activity.js","sourceRoot":"","sources":["../../src/hooks/use-activity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Single-app transport (08-ui §3). */
|
|
2
|
+
import type { AppDocument, AppId, Json, ToolOutcome } from "@vendoai/core";
|
|
3
|
+
import type { EditResult, OpenSurface, VersionEntry } from "../wire-types.js";
|
|
4
|
+
export declare function useApp(appId: AppId): {
|
|
5
|
+
app: AppDocument | undefined;
|
|
6
|
+
/** Alias for `app` — the consistent `data` field across data hooks (§3). */
|
|
7
|
+
data: AppDocument | undefined;
|
|
8
|
+
surface: OpenSurface | undefined;
|
|
9
|
+
error: Error | undefined;
|
|
10
|
+
isLoading: boolean;
|
|
11
|
+
call(ref: string, args: Json): Promise<ToolOutcome>;
|
|
12
|
+
edit(instruction: string): Promise<EditResult>;
|
|
13
|
+
history: {
|
|
14
|
+
list(): Promise<VersionEntry[]>;
|
|
15
|
+
undo(): Promise<AppDocument>;
|
|
16
|
+
};
|
|
17
|
+
refresh(): Promise<void>;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=use-app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-app.d.ts","sourceRoot":"","sources":["../../src/hooks/use-app.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG3E,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE9E,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG;IACpC,GAAG,EAAE,WAAW,GAAG,SAAS,CAAC;IAC7B,4EAA4E;IAC5E,IAAI,EAAE,WAAW,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACpD,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,OAAO,EAAE;QAAE,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QAAC,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;KAAE,CAAC;IAC3E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B,CAkEA"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
+
import { useVendoContext } from "../context.js";
|
|
3
|
+
export function useApp(appId) {
|
|
4
|
+
const { client } = useVendoContext();
|
|
5
|
+
const [app, setApp] = useState();
|
|
6
|
+
const [surface, setSurface] = useState();
|
|
7
|
+
const [error, setError] = useState();
|
|
8
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
9
|
+
const generationRef = useRef(0);
|
|
10
|
+
// Reset per appId (below), so `isLoading` reflects only the first load of the
|
|
11
|
+
// current app — an edit/undo refresh does not flicker it true→false.
|
|
12
|
+
const loadedRef = useRef(false);
|
|
13
|
+
const refresh = useCallback(async () => {
|
|
14
|
+
// Mirror useResource: bump per call, so overlapping refreshes (manual +
|
|
15
|
+
// edit + undo) can never let a stale response clobber newer app state.
|
|
16
|
+
const generation = (generationRef.current += 1);
|
|
17
|
+
if (!loadedRef.current)
|
|
18
|
+
setIsLoading(true);
|
|
19
|
+
try {
|
|
20
|
+
const [nextApp, nextSurface] = await Promise.all([client.apps.get(appId), client.apps.open(appId)]);
|
|
21
|
+
if (generation !== generationRef.current)
|
|
22
|
+
return;
|
|
23
|
+
setApp(nextApp);
|
|
24
|
+
setSurface(nextSurface);
|
|
25
|
+
setError(undefined);
|
|
26
|
+
loadedRef.current = true;
|
|
27
|
+
}
|
|
28
|
+
catch (reason) {
|
|
29
|
+
if (generation !== generationRef.current)
|
|
30
|
+
return;
|
|
31
|
+
setError(reason instanceof Error ? reason : new Error(String(reason)));
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
if (generation === generationRef.current)
|
|
35
|
+
setIsLoading(false);
|
|
36
|
+
}
|
|
37
|
+
}, [appId, client]);
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
loadedRef.current = false;
|
|
40
|
+
setApp(undefined);
|
|
41
|
+
setSurface(undefined);
|
|
42
|
+
setError(undefined);
|
|
43
|
+
void refresh();
|
|
44
|
+
// Bump the generation on unmount / appId change so an in-flight response
|
|
45
|
+
// can't land on a stale (or torn-down) app.
|
|
46
|
+
return () => {
|
|
47
|
+
generationRef.current += 1;
|
|
48
|
+
};
|
|
49
|
+
}, [refresh]);
|
|
50
|
+
const call = useCallback((ref, args) => client.apps.call(appId, ref, args), [appId, client]);
|
|
51
|
+
const edit = useCallback(async (instruction) => {
|
|
52
|
+
const result = await client.apps.edit(appId, instruction);
|
|
53
|
+
await refresh();
|
|
54
|
+
return result;
|
|
55
|
+
}, [appId, client, refresh]);
|
|
56
|
+
const history = useMemo(() => ({
|
|
57
|
+
list: () => client.apps.history(appId),
|
|
58
|
+
undo: async () => {
|
|
59
|
+
const result = await client.apps.undo(appId);
|
|
60
|
+
await refresh();
|
|
61
|
+
return result;
|
|
62
|
+
},
|
|
63
|
+
}), [appId, client, refresh]);
|
|
64
|
+
return { app, data: app, surface, error, isLoading, call, edit, history, refresh };
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=use-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-app.js","sourceRoot":"","sources":["../../src/hooks/use-app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Pending approval transport (08-ui §3). */
|
|
2
|
+
import type { ApprovalDecision, ApprovalId, ApprovalRequest } from "@vendoai/core";
|
|
3
|
+
import { type PollOptions } from "./use-resource.js";
|
|
4
|
+
export declare function useApprovals(options?: PollOptions): {
|
|
5
|
+
/** Back-compat alias for `data` (contract §3). */
|
|
6
|
+
pending: ApprovalRequest[];
|
|
7
|
+
data: ApprovalRequest[];
|
|
8
|
+
error: Error | undefined;
|
|
9
|
+
isLoading: boolean;
|
|
10
|
+
refresh(): Promise<void>;
|
|
11
|
+
decide(ids: ApprovalId | ApprovalId[], decision: ApprovalDecision): Promise<void>;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=use-approvals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-approvals.d.ts","sourceRoot":"","sources":["../../src/hooks/use-approvals.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGnF,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,mBAAmB,CAAC;AAElE,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG;IACnD,kDAAkD;IAClD,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,UAAU,EAAE,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnF,CAcA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useCallback } from "react";
|
|
2
|
+
import { useVendoContext } from "../context.js";
|
|
3
|
+
import { useResource } from "./use-resource.js";
|
|
4
|
+
export function useApprovals(options) {
|
|
5
|
+
const { client } = useVendoContext();
|
|
6
|
+
const list = useCallback(() => client.approvals.pending(), [client]);
|
|
7
|
+
const { data, error, isLoading, refresh } = useResource(list, [], options);
|
|
8
|
+
const decide = useCallback(async (ids, decision) => {
|
|
9
|
+
await client.approvals.decide(ids, decision);
|
|
10
|
+
await refresh();
|
|
11
|
+
}, [client, refresh]);
|
|
12
|
+
return { pending: data, data, error, isLoading, refresh, decide };
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=use-approvals.js.map
|