@graph8/sdk 0.308.1 → 0.357.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/README.md +81 -0
- package/blocks/README.md +32 -0
- package/blocks/_foundation/README.md +78 -0
- package/blocks/_foundation/block.json +79 -0
- package/blocks/_foundation/components/api-error.tsx +62 -0
- package/blocks/_foundation/components/confirm-spend-dialog.tsx +142 -0
- package/blocks/_foundation/components/empty-state.tsx +24 -0
- package/blocks/_foundation/hooks/use-g8-mutation.ts +88 -0
- package/blocks/_foundation/hooks/use-g8-query.ts +87 -0
- package/blocks/_foundation/hooks/use-job-poll.ts +130 -0
- package/blocks/_foundation/hooks/use-paginated.ts +105 -0
- package/blocks/_foundation/lib/g8-client.ts +128 -0
- package/blocks/_foundation/recipes/verify-proxy-key.ts +18 -0
- package/blocks/_foundation/server/proxy.ts +233 -0
- package/blocks/_foundation/server/route.ts +30 -0
- package/blocks/agents/README.md +133 -0
- package/blocks/agents/block.json +223 -0
- package/blocks/agents/components/agent-builder.tsx +199 -0
- package/blocks/agents/components/agent-knowledge-panel.tsx +144 -0
- package/blocks/agents/components/agent-runs.tsx +175 -0
- package/blocks/agents/components/agent-skills-panel.tsx +126 -0
- package/blocks/agents/components/agent-test-console.tsx +175 -0
- package/blocks/agents/lib/agent-types.ts +114 -0
- package/blocks/agents/recipes/create-agent-and-attach-skill.ts +50 -0
- package/blocks/agents/recipes/run-and-follow-agent-run.ts +46 -0
- package/blocks/agents/recipes/test-agent-before-activating.ts +36 -0
- package/blocks/analytics/README.md +73 -0
- package/blocks/analytics/block.json +178 -0
- package/blocks/analytics/components/funnel-chart.tsx +79 -0
- package/blocks/analytics/components/kpi-tiles.tsx +74 -0
- package/blocks/analytics/components/leaderboard.tsx +86 -0
- package/blocks/analytics/components/report-builder.tsx +200 -0
- package/blocks/analytics/hooks/use-report.ts +26 -0
- package/blocks/analytics/lib/analytics-types.ts +108 -0
- package/blocks/analytics/lib/use-debounced.ts +16 -0
- package/blocks/analytics/recipes/01-weekly-outbound-report.ts +32 -0
- package/blocks/analytics/recipes/02-revenue-snapshot.ts +22 -0
- package/blocks/analytics/recipes/03-saved-report.ts +30 -0
- package/blocks/appointments/README.md +80 -0
- package/blocks/appointments/block.json +218 -0
- package/blocks/appointments/components/availability-editor.tsx +192 -0
- package/blocks/appointments/components/booking-page.tsx +154 -0
- package/blocks/appointments/components/event-type-editor.tsx +214 -0
- package/blocks/appointments/components/meeting-detail.tsx +147 -0
- package/blocks/appointments/components/meeting-list.tsx +148 -0
- package/blocks/appointments/hooks/use-available-slots.ts +29 -0
- package/blocks/appointments/hooks/use-schedules.ts +18 -0
- package/blocks/appointments/lib/appointments-types.ts +159 -0
- package/blocks/appointments/lib/idempotency.ts +30 -0
- package/blocks/appointments/recipes/01-create-event-type-and-hours.ts +27 -0
- package/blocks/appointments/recipes/02-find-slots-and-book.ts +34 -0
- package/blocks/appointments/recipes/03-bookings-digest.ts +22 -0
- package/blocks/appointments/recipes/04-calendar-invite.ts +21 -0
- package/blocks/block.schema.json +130 -0
- package/blocks/block.types.ts +109 -0
- package/blocks/campaigns/README.md +118 -0
- package/blocks/campaigns/block.json +361 -0
- package/blocks/campaigns/components/campaign-assets.tsx +180 -0
- package/blocks/campaigns/components/campaign-audience-step.tsx +91 -0
- package/blocks/campaigns/components/campaign-launch-step.tsx +147 -0
- package/blocks/campaigns/components/campaign-list.tsx +120 -0
- package/blocks/campaigns/components/campaign-metrics.tsx +93 -0
- package/blocks/campaigns/components/campaign-select.tsx +52 -0
- package/blocks/campaigns/components/campaign-sequence-step.tsx +158 -0
- package/blocks/campaigns/components/campaign-wizard.tsx +238 -0
- package/blocks/campaigns/components/form-field.tsx +29 -0
- package/blocks/campaigns/components/icp-editor.tsx +230 -0
- package/blocks/campaigns/components/persona-editor.tsx +210 -0
- package/blocks/campaigns/hooks/use-company-profile.ts +34 -0
- package/blocks/campaigns/lib/campaigns-utils.ts +155 -0
- package/blocks/campaigns/recipes/attach-audience-and-launch.ts +33 -0
- package/blocks/campaigns/recipes/campaign-report.ts +22 -0
- package/blocks/campaigns/recipes/generate-ideas-and-create-campaign.ts +51 -0
- package/blocks/campaigns/recipes/set-up-icp-and-personas.ts +37 -0
- package/blocks/coach/README.md +93 -0
- package/blocks/coach/block.json +125 -0
- package/blocks/coach/components/call-scorecard.tsx +126 -0
- package/blocks/coach/components/coaching-feed.tsx +140 -0
- package/blocks/coach/lib/coach-types.ts +116 -0
- package/blocks/coach/recipes/read-a-scorecard.ts +27 -0
- package/blocks/coach/recipes/weekly-coaching-digest.ts +53 -0
- package/blocks/copilot/README.md +99 -0
- package/blocks/copilot/block.json +151 -0
- package/blocks/copilot/components/copilot-memory.tsx +87 -0
- package/blocks/copilot/components/copilot-panel.tsx +189 -0
- package/blocks/copilot/components/copilot-team-chat.tsx +111 -0
- package/blocks/copilot/lib/copilot-types.ts +111 -0
- package/blocks/copilot/recipes/ask-the-copilot.ts +35 -0
- package/blocks/copilot/recipes/post-in-a-work-channel.ts +33 -0
- package/blocks/copilot/recipes/remember-and-recall.ts +19 -0
- package/blocks/crm/README.md +122 -0
- package/blocks/crm/block.json +378 -0
- package/blocks/crm/components/activity-timeline.tsx +99 -0
- package/blocks/crm/components/company-detail.tsx +118 -0
- package/blocks/crm/components/company-table.tsx +173 -0
- package/blocks/crm/components/contact-detail.tsx +135 -0
- package/blocks/crm/components/contact-table.tsx +217 -0
- package/blocks/crm/components/dedupe-review.tsx +164 -0
- package/blocks/crm/components/import-wizard.tsx +193 -0
- package/blocks/crm/components/notes-panel.tsx +112 -0
- package/blocks/crm/components/record-form.tsx +191 -0
- package/blocks/crm/components/task-list.tsx +107 -0
- package/blocks/crm/hooks/use-custom-fields.ts +18 -0
- package/blocks/crm/hooks/use-debounced.ts +13 -0
- package/blocks/crm/hooks/use-page-query.ts +52 -0
- package/blocks/crm/lib/crm-types.ts +136 -0
- package/blocks/crm/recipes/custom-fields-and-values.ts +28 -0
- package/blocks/crm/recipes/dedupe-and-merge.ts +30 -0
- package/blocks/crm/recipes/notes-tasks-and-activity.ts +23 -0
- package/blocks/crm/recipes/upsert-contact-with-company.ts +33 -0
- package/blocks/deals/README.md +78 -0
- package/blocks/deals/block.json +198 -0
- package/blocks/deals/components/deal-detail.tsx +134 -0
- package/blocks/deals/components/forecast-view.tsx +112 -0
- package/blocks/deals/components/pipeline-board.tsx +142 -0
- package/blocks/deals/components/stage-editor.tsx +96 -0
- package/blocks/deals/hooks/use-pipeline-deals.ts +67 -0
- package/blocks/deals/hooks/use-pipelines.ts +19 -0
- package/blocks/deals/lib/deals-types.ts +128 -0
- package/blocks/deals/recipes/01-create-deal-and-advance.ts +32 -0
- package/blocks/deals/recipes/02-pipeline-report.ts +35 -0
- package/blocks/deals/recipes/03-stale-deals-sweep.ts +20 -0
- package/blocks/dialer/README.md +114 -0
- package/blocks/dialer/block.json +260 -0
- package/blocks/dialer/components/call-log.tsx +78 -0
- package/blocks/dialer/components/call-queue.tsx +188 -0
- package/blocks/dialer/components/dialer-workspace.tsx +47 -0
- package/blocks/dialer/components/disposition-panel.tsx +75 -0
- package/blocks/dialer/components/live-calls-table.tsx +107 -0
- package/blocks/dialer/components/session-start-form.tsx +111 -0
- package/blocks/dialer/components/softphone.tsx +122 -0
- package/blocks/dialer/components/transcript-viewer.tsx +82 -0
- package/blocks/dialer/hooks/use-dialer-numbers.ts +19 -0
- package/blocks/dialer/hooks/use-dialer-session.ts +68 -0
- package/blocks/dialer/hooks/use-dispositions.ts +29 -0
- package/blocks/dialer/lib/dialer-types.ts +158 -0
- package/blocks/dialer/lib/softphone-transport.ts +67 -0
- package/blocks/dialer/lib/twilio-transport.ts +74 -0
- package/blocks/dialer/recipes/01-create-session-and-dial.ts +39 -0
- package/blocks/dialer/recipes/02-disposition-calls.ts +26 -0
- package/blocks/dialer/recipes/03-review-a-call.ts +23 -0
- package/blocks/enrichment/README.md +105 -0
- package/blocks/enrichment/block.json +204 -0
- package/blocks/enrichment/components/bulk-enrich-panel.tsx +205 -0
- package/blocks/enrichment/components/email-verify-badge.tsx +82 -0
- package/blocks/enrichment/components/enrich-button.tsx +136 -0
- package/blocks/enrichment/components/waterfall-config.tsx +127 -0
- package/blocks/enrichment/hooks/use-providers.ts +18 -0
- package/blocks/enrichment/lib/enrichment-types.ts +104 -0
- package/blocks/enrichment/recipes/bulk-enrich-and-poll.ts +41 -0
- package/blocks/enrichment/recipes/lookup-and-verify.ts +25 -0
- package/blocks/enrichment/recipes/waterfall-pipeline.ts +26 -0
- package/blocks/forms/README.md +112 -0
- package/blocks/forms/block.json +200 -0
- package/blocks/forms/components/form-builder.tsx +150 -0
- package/blocks/forms/components/form-embed.tsx +103 -0
- package/blocks/forms/components/form-mapping-editor.tsx +125 -0
- package/blocks/forms/components/site-audit-panel.tsx +73 -0
- package/blocks/forms/components/submissions-table.tsx +158 -0
- package/blocks/forms/lib/form-types.ts +127 -0
- package/blocks/forms/recipes/install-snippet-and-form.ts +21 -0
- package/blocks/forms/recipes/retry-failed-deliveries.ts +26 -0
- package/blocks/forms/recipes/route-form-to-list.ts +44 -0
- package/blocks/inbox/README.md +72 -0
- package/blocks/inbox/block.json +194 -0
- package/blocks/inbox/components/inbox-list.tsx +156 -0
- package/blocks/inbox/components/inbox-screen.tsx +49 -0
- package/blocks/inbox/components/reply-composer.tsx +183 -0
- package/blocks/inbox/components/tag-and-assign.tsx +189 -0
- package/blocks/inbox/components/thread-badge.tsx +17 -0
- package/blocks/inbox/components/thread-view.tsx +108 -0
- package/blocks/inbox/hooks/use-inbox-thread.ts +24 -0
- package/blocks/inbox/hooks/use-inbox-threads.ts +40 -0
- package/blocks/inbox/lib/idempotency.ts +30 -0
- package/blocks/inbox/lib/inbox-types.ts +100 -0
- package/blocks/inbox/recipes/01-triage-and-reply.ts +43 -0
- package/blocks/inbox/recipes/02-tag-and-assign.ts +31 -0
- package/blocks/inbox/recipes/03-hot-contacts-digest.ts +16 -0
- package/blocks/integrations/README.md +75 -0
- package/blocks/integrations/block.json +172 -0
- package/blocks/integrations/components/integration-list.tsx +165 -0
- package/blocks/integrations/components/sync-status.tsx +223 -0
- package/blocks/integrations/components/webhook-manager.tsx +300 -0
- package/blocks/integrations/lib/integrations-utils.ts +62 -0
- package/blocks/integrations/recipes/crm-sync-health.ts +19 -0
- package/blocks/integrations/recipes/push-contacts-to-crm.ts +20 -0
- package/blocks/integrations/recipes/register-webhook.ts +18 -0
- package/blocks/integrations/recipes/verify-webhook-route.ts +33 -0
- package/blocks/intent/README.md +57 -0
- package/blocks/intent/block.json +138 -0
- package/blocks/intent/components/account-intent-score.tsx +91 -0
- package/blocks/intent/components/intent-feed.tsx +215 -0
- package/blocks/intent/components/intent-keyword-manager.tsx +331 -0
- package/blocks/intent/hooks/use-account-intent.ts +46 -0
- package/blocks/intent/lib/intent-utils.ts +95 -0
- package/blocks/intent/recipes/rank-intent-accounts.ts +36 -0
- package/blocks/intent/recipes/track-competitor-domain.ts +23 -0
- package/blocks/intent/recipes/who-visited-url.ts +18 -0
- package/blocks/lifecycle/README.md +79 -0
- package/blocks/lifecycle/block.json +198 -0
- package/blocks/lifecycle/components/churn-list.tsx +92 -0
- package/blocks/lifecycle/components/customer-table.tsx +119 -0
- package/blocks/lifecycle/components/lead-queue.tsx +127 -0
- package/blocks/lifecycle/components/lifecycle-board.tsx +102 -0
- package/blocks/lifecycle/components/stage-move-dialog.tsx +75 -0
- package/blocks/lifecycle/hooks/use-debounced.ts +13 -0
- package/blocks/lifecycle/hooks/use-lifecycle-stages.ts +27 -0
- package/blocks/lifecycle/lib/lifecycle.ts +99 -0
- package/blocks/lifecycle/recipes/customer-brief.ts +23 -0
- package/blocks/lifecycle/recipes/move-company-stage.ts +17 -0
- package/blocks/lifecycle/recipes/read-lifecycle-board.ts +21 -0
- package/blocks/lifecycle/recipes/unlock-stage-contacts.ts +25 -0
- package/blocks/lists/README.md +96 -0
- package/blocks/lists/block.json +166 -0
- package/blocks/lists/components/add-to-list-button.tsx +111 -0
- package/blocks/lists/components/list-picker.tsx +94 -0
- package/blocks/lists/components/list-table.tsx +160 -0
- package/blocks/lists/components/suppression-manager.tsx +153 -0
- package/blocks/lists/recipes/create-list-and-add-contacts.ts +35 -0
- package/blocks/lists/recipes/refresh-and-check-lists.ts +21 -0
- package/blocks/lists/recipes/suppress-and-reinstate.ts +30 -0
- package/blocks/mailboxes/README.md +71 -0
- package/blocks/mailboxes/block.json +187 -0
- package/blocks/mailboxes/components/connect-mailbox.tsx +284 -0
- package/blocks/mailboxes/components/domain-purchase.tsx +271 -0
- package/blocks/mailboxes/components/mailbox-list.tsx +185 -0
- package/blocks/mailboxes/components/warmup-health.tsx +232 -0
- package/blocks/mailboxes/lib/mailboxes-utils.ts +69 -0
- package/blocks/mailboxes/recipes/buy-domain-and-mailboxes.ts +64 -0
- package/blocks/mailboxes/recipes/connect-imap-mailbox.ts +38 -0
- package/blocks/mailboxes/recipes/is-it-safe-to-send.ts +17 -0
- package/blocks/mailboxes/recipes/warmup-report.ts +31 -0
- package/blocks/newsletter/README.md +122 -0
- package/blocks/newsletter/block.json +224 -0
- package/blocks/newsletter/components/issue-form.tsx +124 -0
- package/blocks/newsletter/components/issue-scheduler.tsx +152 -0
- package/blocks/newsletter/components/newsletter-editor.tsx +131 -0
- package/blocks/newsletter/components/newsletter-stats.tsx +93 -0
- package/blocks/newsletter/components/subscriber-table.tsx +173 -0
- package/blocks/newsletter/lib/newsletter-types.ts +97 -0
- package/blocks/newsletter/recipes/create-newsletter-and-draft-issue.ts +27 -0
- package/blocks/newsletter/recipes/import-audience-and-send.ts +43 -0
- package/blocks/newsletter/recipes/issue-performance-report.ts +26 -0
- package/blocks/nurture/README.md +110 -0
- package/blocks/nurture/block.json +191 -0
- package/blocks/nurture/components/nurture-builder.tsx +114 -0
- package/blocks/nurture/components/nurture-enroll.tsx +107 -0
- package/blocks/nurture/components/nurture-form.tsx +120 -0
- package/blocks/nurture/components/nurture-stats.tsx +81 -0
- package/blocks/nurture/lib/nurture-types.ts +109 -0
- package/blocks/nurture/recipes/create-a-nurture.ts +34 -0
- package/blocks/nurture/recipes/enroll-contacts-and-launch.ts +24 -0
- package/blocks/nurture/recipes/nurture-health-check.ts +28 -0
- package/blocks/objects/README.md +120 -0
- package/blocks/objects/block.json +243 -0
- package/blocks/objects/components/attribute-field-input.tsx +82 -0
- package/blocks/objects/components/attribute-form-dialog.tsx +159 -0
- package/blocks/objects/components/object-not-found.tsx +34 -0
- package/blocks/objects/components/object-record-detail.tsx +143 -0
- package/blocks/objects/components/object-schema-editor.tsx +197 -0
- package/blocks/objects/components/object-table.tsx +130 -0
- package/blocks/objects/components/record-form-dialog.tsx +112 -0
- package/blocks/objects/components/record-roles-panel.tsx +106 -0
- package/blocks/objects/hooks/use-object-schema.ts +36 -0
- package/blocks/objects/lib/object-types.ts +214 -0
- package/blocks/objects/recipes/define-object-and-add-records.ts +24 -0
- package/blocks/objects/recipes/update-audit-and-archive-records.ts +39 -0
- package/blocks/objects/recipes/upsert-records-from-your-system.ts +30 -0
- package/blocks/pages/README.md +104 -0
- package/blocks/pages/block.json +223 -0
- package/blocks/pages/components/brand-kit-editor.tsx +152 -0
- package/blocks/pages/components/content-library.tsx +163 -0
- package/blocks/pages/components/page-editor.tsx +253 -0
- package/blocks/pages/components/page-list.tsx +159 -0
- package/blocks/pages/components/seo-report.tsx +159 -0
- package/blocks/pages/lib/studio.ts +77 -0
- package/blocks/pages/recipes/audit-site-seo.ts +28 -0
- package/blocks/pages/recipes/create-and-publish-page.ts +26 -0
- package/blocks/pages/recipes/edit-page-section.ts +25 -0
- package/blocks/pages/recipes/refresh-brand-kit.ts +22 -0
- package/blocks/quotes/README.md +79 -0
- package/blocks/quotes/block.json +183 -0
- package/blocks/quotes/components/product-picker.tsx +80 -0
- package/blocks/quotes/components/quote-builder.tsx +195 -0
- package/blocks/quotes/components/quote-list.tsx +79 -0
- package/blocks/quotes/components/quote-viewer.tsx +135 -0
- package/blocks/quotes/components/signature-status.tsx +77 -0
- package/blocks/quotes/hooks/use-debounced.ts +13 -0
- package/blocks/quotes/lib/quotes.ts +142 -0
- package/blocks/quotes/recipes/create-and-send-quote.ts +44 -0
- package/blocks/quotes/recipes/revise-sent-quote.ts +18 -0
- package/blocks/quotes/recipes/track-quote-signature.ts +22 -0
- package/blocks/radar/README.md +106 -0
- package/blocks/radar/block.json +189 -0
- package/blocks/radar/components/competitor-battle-card.tsx +53 -0
- package/blocks/radar/components/competitor-tracker.tsx +158 -0
- package/blocks/radar/components/radar-overview.tsx +67 -0
- package/blocks/radar/components/radar-report.tsx +86 -0
- package/blocks/radar/hooks/use-competitors.ts +23 -0
- package/blocks/radar/lib/radar-types.ts +124 -0
- package/blocks/radar/recipes/battle-card.ts +28 -0
- package/blocks/radar/recipes/deep-dive-report.ts +32 -0
- package/blocks/radar/recipes/marketing-snapshot.ts +18 -0
- package/blocks/radar/recipes/track-and-scan.ts +39 -0
- package/blocks/search/README.md +129 -0
- package/blocks/search/block.json +185 -0
- package/blocks/search/components/filter-builder.tsx +149 -0
- package/blocks/search/components/prospect-results.tsx +175 -0
- package/blocks/search/components/save-to-list-dialog.tsx +135 -0
- package/blocks/search/components/saved-searches.tsx +95 -0
- package/blocks/search/hooks/use-filter-options.ts +41 -0
- package/blocks/search/lib/search-types.ts +149 -0
- package/blocks/search/recipes/explore-filter-values.ts +27 -0
- package/blocks/search/recipes/saved-searches.ts +34 -0
- package/blocks/search/recipes/search-and-save-to-list.ts +37 -0
- package/blocks/sequencer/README.md +87 -0
- package/blocks/sequencer/block.json +214 -0
- package/blocks/sequencer/components/enroll-dialog.tsx +93 -0
- package/blocks/sequencer/components/sequence-builder.tsx +306 -0
- package/blocks/sequencer/components/sequence-list.tsx +200 -0
- package/blocks/sequencer/components/sequence-stats.tsx +256 -0
- package/blocks/sequencer/components/step-editor.tsx +213 -0
- package/blocks/sequencer/lib/sequencer-utils.ts +168 -0
- package/blocks/sequencer/recipes/create-multichannel-sequence.ts +51 -0
- package/blocks/sequencer/recipes/launch-and-enroll.ts +44 -0
- package/blocks/sequencer/recipes/pause-when-unsafe.ts +30 -0
- package/blocks/sequencer/recipes/sequence-report.ts +22 -0
- package/blocks/social-ads/README.md +128 -0
- package/blocks/social-ads/block.json +256 -0
- package/blocks/social-ads/components/ad-campaign-list.tsx +136 -0
- package/blocks/social-ads/components/audience-sync.tsx +150 -0
- package/blocks/social-ads/components/creative-gallery.tsx +121 -0
- package/blocks/social-ads/components/post-composer.tsx +122 -0
- package/blocks/social-ads/components/social-post-list.tsx +116 -0
- package/blocks/social-ads/hooks/use-social-accounts.ts +16 -0
- package/blocks/social-ads/lib/social-ads-types.ts +167 -0
- package/blocks/social-ads/recipes/creative-to-gallery.ts +41 -0
- package/blocks/social-ads/recipes/schedule-post.ts +51 -0
- package/blocks/social-ads/recipes/sync-audience-and-launch.ts +41 -0
- package/blocks/visitors/README.md +56 -0
- package/blocks/visitors/block.json +139 -0
- package/blocks/visitors/components/snippet-install.tsx +169 -0
- package/blocks/visitors/components/traffic-chart.tsx +156 -0
- package/blocks/visitors/components/visitor-company-card.tsx +92 -0
- package/blocks/visitors/components/visitor-feed.tsx +157 -0
- package/blocks/visitors/lib/visitors-utils.ts +78 -0
- package/blocks/visitors/recipes/check-snippet-installed.ts +24 -0
- package/blocks/visitors/recipes/recent-company-visits.ts +27 -0
- package/blocks/visitors/recipes/traffic-summary.ts +24 -0
- package/blocks/webchat/README.md +87 -0
- package/blocks/webchat/block.json +134 -0
- package/blocks/webchat/components/chat-widget-config.tsx +160 -0
- package/blocks/webchat/components/conversation-list.tsx +74 -0
- package/blocks/webchat/lib/webchat-types.ts +83 -0
- package/blocks/webchat/recipes/create-bot-and-style-widget.ts +24 -0
- package/blocks/webchat/recipes/list-chat-visitors.ts +24 -0
- package/blocks/workbench/README.md +135 -0
- package/blocks/workbench/block.json +259 -0
- package/blocks/workbench/components/column-recipe-editor.tsx +183 -0
- package/blocks/workbench/components/run-progress.tsx +132 -0
- package/blocks/workbench/components/workbench-add-rows.tsx +100 -0
- package/blocks/workbench/components/workbench-grid.tsx +159 -0
- package/blocks/workbench/components/workbench-row-actions.tsx +102 -0
- package/blocks/workbench/components/workbench-table-list.tsx +105 -0
- package/blocks/workbench/hooks/use-workbench-table.ts +30 -0
- package/blocks/workbench/lib/waterfall-presets.ts +119 -0
- package/blocks/workbench/lib/workbench-types.ts +191 -0
- package/blocks/workbench/recipes/build-enriched-table.ts +65 -0
- package/blocks/workbench/recipes/import-from-search.ts +42 -0
- package/blocks/workbench/recipes/scrape-into-table.ts +36 -0
- package/blocks/workbench/recipes/waterfall-column.ts +55 -0
- package/blocks/workflows/README.md +100 -0
- package/blocks/workflows/block.json +188 -0
- package/blocks/workflows/components/run-history.tsx +136 -0
- package/blocks/workflows/components/trigger-config.tsx +134 -0
- package/blocks/workflows/components/workflow-editor.tsx +142 -0
- package/blocks/workflows/components/workflow-list.tsx +153 -0
- package/blocks/workflows/hooks/use-workflow.ts +51 -0
- package/blocks/workflows/lib/graph.ts +187 -0
- package/blocks/workflows/recipes/create-workflow.ts +35 -0
- package/blocks/workflows/recipes/find-failed-runs.ts +15 -0
- package/blocks/workflows/recipes/run-workflow-and-wait.ts +32 -0
- package/blocks/workflows/recipes/set-trigger.ts +22 -0
- package/dist/cli.js +5330 -29
- package/dist/index.browser.js +7740 -0
- package/dist/index.browser.js.map +1 -0
- package/dist/index.browser.mjs +7717 -0
- package/dist/index.browser.mjs.map +1 -0
- package/dist/index.d.mts +1440 -21
- package/dist/index.d.ts +1440 -21
- package/dist/index.js +42 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +42 -3
- package/dist/index.mjs.map +1 -1
- package/dist/react.browser.js +7598 -0
- package/dist/react.browser.js.map +1 -0
- package/dist/react.browser.mjs +7568 -0
- package/dist/react.browser.mjs.map +1 -0
- package/dist/react.d.mts +1340 -18
- package/dist/react.d.ts +1340 -18
- package/dist/react.js +41 -2
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +41 -2
- package/dist/react.mjs.map +1 -1
- package/dist/types/agentSetup.d.ts +6 -6
- package/dist/types/blocks/add.d.ts +53 -0
- package/dist/types/blocks/create.d.ts +46 -0
- package/dist/types/blocks/doctor.d.ts +26 -0
- package/dist/types/blocks/registry.d.ts +134 -0
- package/dist/types/cli.d.ts +16 -0
- package/dist/types/core.d.ts +1 -1
- package/dist/types/crypto-browser.d.ts +2 -0
- package/dist/types/crypto-node.d.ts +6 -0
- package/dist/types/react.d.ts +1 -1
- package/dist/types/version.d.ts +2 -2
- package/dist/types/webhooks.d.ts +2 -2
- package/dist/ui/index.d.mts +54 -0
- package/dist/ui/index.d.ts +54 -0
- package/dist/ui/index.js +105 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/index.mjs +44 -0
- package/dist/ui/index.mjs.map +1 -0
- package/dist/ui/lib/compose-refs.d.mts +19 -0
- package/dist/ui/lib/compose-refs.d.ts +19 -0
- package/dist/ui/lib/compose-refs.js +76 -0
- package/dist/ui/lib/compose-refs.js.map +1 -0
- package/dist/ui/lib/compose-refs.mjs +41 -0
- package/dist/ui/lib/compose-refs.mjs.map +1 -0
- package/dist/ui/lib/use-mobile.d.mts +4 -0
- package/dist/ui/lib/use-mobile.d.ts +4 -0
- package/dist/ui/lib/use-mobile.js +57 -0
- package/dist/ui/lib/use-mobile.js.map +1 -0
- package/dist/ui/lib/use-mobile.mjs +22 -0
- package/dist/ui/lib/use-mobile.mjs.map +1 -0
- package/dist/ui/lib/utils.d.mts +10 -0
- package/dist/ui/lib/utils.d.ts +10 -0
- package/dist/ui/lib/utils.js +33 -0
- package/dist/ui/lib/utils.js.map +1 -0
- package/dist/ui/lib/utils.mjs +9 -0
- package/dist/ui/lib/utils.mjs.map +1 -0
- package/dist/ui/primitives/alert-dialog.d.mts +22 -0
- package/dist/ui/primitives/alert-dialog.d.ts +22 -0
- package/dist/ui/primitives/alert-dialog.js +163 -0
- package/dist/ui/primitives/alert-dialog.js.map +1 -0
- package/dist/ui/primitives/alert-dialog.mjs +119 -0
- package/dist/ui/primitives/alert-dialog.mjs.map +1 -0
- package/dist/ui/primitives/avatar.d.mts +8 -0
- package/dist/ui/primitives/avatar.d.ts +8 -0
- package/dist/ui/primitives/avatar.js +91 -0
- package/dist/ui/primitives/avatar.js.map +1 -0
- package/dist/ui/primitives/avatar.mjs +55 -0
- package/dist/ui/primitives/avatar.mjs.map +1 -0
- package/dist/ui/primitives/breadcrumb.d.mts +13 -0
- package/dist/ui/primitives/breadcrumb.d.ts +13 -0
- package/dist/ui/primitives/breadcrumb.js +127 -0
- package/dist/ui/primitives/breadcrumb.js.map +1 -0
- package/dist/ui/primitives/breadcrumb.mjs +97 -0
- package/dist/ui/primitives/breadcrumb.mjs.map +1 -0
- package/dist/ui/primitives/button.d.mts +15 -0
- package/dist/ui/primitives/button.d.ts +15 -0
- package/dist/ui/primitives/button.js +91 -0
- package/dist/ui/primitives/button.js.map +1 -0
- package/dist/ui/primitives/button.mjs +56 -0
- package/dist/ui/primitives/button.mjs.map +1 -0
- package/dist/ui/primitives/card.d.mts +10 -0
- package/dist/ui/primitives/card.d.ts +10 -0
- package/dist/ui/primitives/card.js +101 -0
- package/dist/ui/primitives/card.js.map +1 -0
- package/dist/ui/primitives/card.mjs +62 -0
- package/dist/ui/primitives/card.mjs.map +1 -0
- package/dist/ui/primitives/carousel.d.mts +45 -0
- package/dist/ui/primitives/carousel.d.ts +45 -0
- package/dist/ui/primitives/carousel.js +300 -0
- package/dist/ui/primitives/carousel.js.map +1 -0
- package/dist/ui/primitives/carousel.mjs +261 -0
- package/dist/ui/primitives/carousel.mjs.map +1 -0
- package/dist/ui/primitives/chart.d.mts +68 -0
- package/dist/ui/primitives/chart.d.ts +68 -0
- package/dist/ui/primitives/chart.js +280 -0
- package/dist/ui/primitives/chart.js.map +1 -0
- package/dist/ui/primitives/chart.mjs +241 -0
- package/dist/ui/primitives/chart.mjs.map +1 -0
- package/dist/ui/primitives/collapsible.d.mts +8 -0
- package/dist/ui/primitives/collapsible.d.ts +8 -0
- package/dist/ui/primitives/collapsible.js +72 -0
- package/dist/ui/primitives/collapsible.js.map +1 -0
- package/dist/ui/primitives/collapsible.mjs +36 -0
- package/dist/ui/primitives/collapsible.mjs.map +1 -0
- package/dist/ui/primitives/context-menu.d.mts +29 -0
- package/dist/ui/primitives/context-menu.d.ts +29 -0
- package/dist/ui/primitives/context-menu.js +203 -0
- package/dist/ui/primitives/context-menu.js.map +1 -0
- package/dist/ui/primitives/context-menu.mjs +155 -0
- package/dist/ui/primitives/context-menu.mjs.map +1 -0
- package/dist/ui/primitives/dialog.d.mts +26 -0
- package/dist/ui/primitives/dialog.d.ts +26 -0
- package/dist/ui/primitives/dialog.js +192 -0
- package/dist/ui/primitives/dialog.js.map +1 -0
- package/dist/ui/primitives/dialog.mjs +148 -0
- package/dist/ui/primitives/dialog.mjs.map +1 -0
- package/dist/ui/primitives/drawer.d.mts +26 -0
- package/dist/ui/primitives/drawer.d.ts +26 -0
- package/dist/ui/primitives/drawer.js +146 -0
- package/dist/ui/primitives/drawer.js.map +1 -0
- package/dist/ui/primitives/drawer.mjs +103 -0
- package/dist/ui/primitives/drawer.mjs.map +1 -0
- package/dist/ui/primitives/input.d.mts +5 -0
- package/dist/ui/primitives/input.d.ts +5 -0
- package/dist/ui/primitives/input.js +46 -0
- package/dist/ui/primitives/input.js.map +1 -0
- package/dist/ui/primitives/input.mjs +22 -0
- package/dist/ui/primitives/input.mjs.map +1 -0
- package/dist/ui/primitives/item.d.mts +27 -0
- package/dist/ui/primitives/item.d.ts +27 -0
- package/dist/ui/primitives/item.js +221 -0
- package/dist/ui/primitives/item.js.map +1 -0
- package/dist/ui/primitives/item.mjs +188 -0
- package/dist/ui/primitives/item.mjs.map +1 -0
- package/dist/ui/primitives/kbd.d.mts +15 -0
- package/dist/ui/primitives/kbd.d.ts +15 -0
- package/dist/ui/primitives/kbd.js +45 -0
- package/dist/ui/primitives/kbd.js.map +1 -0
- package/dist/ui/primitives/kbd.mjs +21 -0
- package/dist/ui/primitives/kbd.mjs.map +1 -0
- package/dist/ui/primitives/label.d.mts +6 -0
- package/dist/ui/primitives/label.d.ts +6 -0
- package/dist/ui/primitives/label.js +55 -0
- package/dist/ui/primitives/label.js.map +1 -0
- package/dist/ui/primitives/label.mjs +21 -0
- package/dist/ui/primitives/label.mjs.map +1 -0
- package/dist/ui/primitives/resizable.d.mts +10 -0
- package/dist/ui/primitives/resizable.d.ts +10 -0
- package/dist/ui/primitives/resizable.js +68 -0
- package/dist/ui/primitives/resizable.js.map +1 -0
- package/dist/ui/primitives/resizable.mjs +42 -0
- package/dist/ui/primitives/resizable.mjs.map +1 -0
- package/dist/ui/primitives/save-status.d.mts +31 -0
- package/dist/ui/primitives/save-status.d.ts +31 -0
- package/dist/ui/primitives/save-status.js +150 -0
- package/dist/ui/primitives/save-status.js.map +1 -0
- package/dist/ui/primitives/save-status.mjs +126 -0
- package/dist/ui/primitives/save-status.mjs.map +1 -0
- package/dist/ui/primitives/separator.d.mts +6 -0
- package/dist/ui/primitives/separator.d.ts +6 -0
- package/dist/ui/primitives/separator.js +62 -0
- package/dist/ui/primitives/separator.js.map +1 -0
- package/dist/ui/primitives/separator.mjs +28 -0
- package/dist/ui/primitives/separator.mjs.map +1 -0
- package/dist/ui/primitives/sheet.d.mts +16 -0
- package/dist/ui/primitives/sheet.d.ts +16 -0
- package/dist/ui/primitives/sheet.js +170 -0
- package/dist/ui/primitives/sheet.js.map +1 -0
- package/dist/ui/primitives/sheet.mjs +129 -0
- package/dist/ui/primitives/sheet.mjs.map +1 -0
- package/dist/ui/primitives/sidebar.d.mts +74 -0
- package/dist/ui/primitives/sidebar.d.ts +74 -0
- package/dist/ui/primitives/sidebar.js +697 -0
- package/dist/ui/primitives/sidebar.js.map +1 -0
- package/dist/ui/primitives/sidebar.mjs +651 -0
- package/dist/ui/primitives/sidebar.mjs.map +1 -0
- package/dist/ui/primitives/skeleton.d.mts +5 -0
- package/dist/ui/primitives/skeleton.d.ts +5 -0
- package/dist/ui/primitives/skeleton.js +40 -0
- package/dist/ui/primitives/skeleton.js.map +1 -0
- package/dist/ui/primitives/skeleton.mjs +16 -0
- package/dist/ui/primitives/skeleton.mjs.map +1 -0
- package/dist/ui/primitives/slider.d.mts +20 -0
- package/dist/ui/primitives/slider.d.ts +20 -0
- package/dist/ui/primitives/slider.js +112 -0
- package/dist/ui/primitives/slider.js.map +1 -0
- package/dist/ui/primitives/slider.mjs +78 -0
- package/dist/ui/primitives/slider.mjs.map +1 -0
- package/dist/ui/primitives/sortable.d.mts +50 -0
- package/dist/ui/primitives/sortable.d.ts +50 -0
- package/dist/ui/primitives/sortable.js +456 -0
- package/dist/ui/primitives/sortable.js.map +1 -0
- package/dist/ui/primitives/sortable.mjs +435 -0
- package/dist/ui/primitives/sortable.mjs.map +1 -0
- package/dist/ui/primitives/switch.d.mts +6 -0
- package/dist/ui/primitives/switch.d.ts +6 -0
- package/dist/ui/primitives/switch.js +67 -0
- package/dist/ui/primitives/switch.js.map +1 -0
- package/dist/ui/primitives/switch.mjs +33 -0
- package/dist/ui/primitives/switch.mjs.map +1 -0
- package/dist/ui/primitives/table.d.mts +12 -0
- package/dist/ui/primitives/table.d.ts +12 -0
- package/dist/ui/primitives/table.js +130 -0
- package/dist/ui/primitives/table.js.map +1 -0
- package/dist/ui/primitives/table.mjs +89 -0
- package/dist/ui/primitives/table.mjs.map +1 -0
- package/dist/ui/primitives/tabs.d.mts +9 -0
- package/dist/ui/primitives/tabs.d.ts +9 -0
- package/dist/ui/primitives/tabs.js +86 -0
- package/dist/ui/primitives/tabs.js.map +1 -0
- package/dist/ui/primitives/tabs.mjs +49 -0
- package/dist/ui/primitives/tabs.mjs.map +1 -0
- package/dist/ui/primitives/textarea.d.mts +5 -0
- package/dist/ui/primitives/textarea.d.ts +5 -0
- package/dist/ui/primitives/textarea.js +43 -0
- package/dist/ui/primitives/textarea.js.map +1 -0
- package/dist/ui/primitives/textarea.mjs +19 -0
- package/dist/ui/primitives/textarea.mjs.map +1 -0
- package/dist/ui/primitives/tooltip.d.mts +9 -0
- package/dist/ui/primitives/tooltip.d.ts +9 -0
- package/dist/ui/primitives/tooltip.js +94 -0
- package/dist/ui/primitives/tooltip.js.map +1 -0
- package/dist/ui/primitives/tooltip.mjs +57 -0
- package/dist/ui/primitives/tooltip.mjs.map +1 -0
- package/docs/agents.md +72 -29
- package/docs/api/README.md +6 -3
- package/docs/api/appObjects.d.ts +1 -1
- package/docs/api/appObjects.md +1 -1
- package/docs/api/by-path.md +29 -0
- package/docs/api/objects.d.ts +72 -5
- package/docs/api/objects.md +84 -7
- package/docs/api/processLists.d.ts +247 -0
- package/docs/api/processLists.md +409 -0
- package/docs/api/reports.d.ts +476 -0
- package/docs/api/reports.md +539 -0
- package/docs/api/scheduleBuy.d.ts +12 -8
- package/docs/api/scheduleBuy.md +13 -10
- package/docs/api/seo.d.ts +406 -3
- package/docs/api/seo.md +505 -1
- package/docs/api/workspaceBackup.d.ts +324 -0
- package/docs/api/workspaceBackup.md +427 -0
- package/package.json +174 -5
- package/stacks/6sense.json +46 -0
- package/stacks/README.md +20 -0
- package/stacks/apollo.json +128 -0
- package/stacks/clay.json +59 -0
- package/stacks/gong.json +72 -0
- package/stacks/hubspot.json +162 -0
- package/stacks/intercom.json +53 -0
- package/stacks/mailchimp.json +71 -0
- package/stacks/outreach.json +86 -0
- package/stacks/salesforce.json +94 -0
- package/stacks/stack.schema.json +32 -0
- package/stacks/starter.json +22 -0
- package/styles/styles.css +2 -0
- package/styles/theme.css +181 -0
- package/styles/tokens.css +284 -0
- package/templates/next-app/README.md.tmpl +35 -0
- package/templates/next-app/_pages/redirect-page.tsx.tmpl +5 -0
- package/templates/next-app/_pages/route-page.tsx.tmpl +9 -0
- package/templates/next-app/app/globals.css.tmpl +8 -0
- package/templates/next-app/app/layout.tsx.tmpl +19 -0
- package/templates/next-app/components/app-shell.tsx.tmpl +34 -0
- package/templates/next-app/dot-env.local.example.tmpl +6 -0
- package/templates/next-app/dot-gitignore.tmpl +7 -0
- package/templates/next-app/lib/nav.ts.tmpl +2 -0
- package/templates/next-app/next.config.mjs.tmpl +4 -0
- package/templates/next-app/package.json.tmpl +25 -0
- package/templates/next-app/postcss.config.mjs.tmpl +4 -0
- package/templates/next-app/tsconfig.json.tmpl +21 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Shapes and helpers for the analytics components.
|
|
5
|
+
*
|
|
6
|
+
* Most analytics endpoints return the app's own report wrapper inside the API envelope:
|
|
7
|
+
* { data: { success, data: <the report>, meta: { cached, stale, days, ... } } }
|
|
8
|
+
* Read the report through `reportBody()`, which also accepts the bare shape a few endpoints use (the revenue team
|
|
9
|
+
* dashboards return the report directly under `data`). `meta.stale` true means the numbers came from a cache after
|
|
10
|
+
* a failed refresh; show it, do not hide it.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export interface ReportMeta {
|
|
14
|
+
cached?: boolean;
|
|
15
|
+
stale?: boolean;
|
|
16
|
+
days?: number;
|
|
17
|
+
timestamp?: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** `GET /analytics/outbound/summary` (rates are percentages, 0 to 100). */
|
|
21
|
+
export interface OutboundSummary {
|
|
22
|
+
emails_sent?: number;
|
|
23
|
+
emails_delivered?: number;
|
|
24
|
+
emails_bounced?: number;
|
|
25
|
+
emails_replied?: number;
|
|
26
|
+
delivery_rate?: number;
|
|
27
|
+
reply_rate?: number;
|
|
28
|
+
calls_dispatched?: number;
|
|
29
|
+
calls_connected?: number;
|
|
30
|
+
connect_rate?: number;
|
|
31
|
+
meetings_booked?: number;
|
|
32
|
+
meetings_active?: number;
|
|
33
|
+
meetings_cancelled?: number;
|
|
34
|
+
[key: string]: unknown;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** A row of `GET /analytics/outbound/sdr-activity/leaderboard` (reps with at least 10 emails sent). */
|
|
38
|
+
export interface LeaderRow {
|
|
39
|
+
sdr_email?: string;
|
|
40
|
+
emails_sent?: number;
|
|
41
|
+
replies?: number;
|
|
42
|
+
bounced?: number;
|
|
43
|
+
reply_rate?: number;
|
|
44
|
+
meetings_booked?: number;
|
|
45
|
+
[key: string]: unknown;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface FunnelStep {
|
|
49
|
+
key: string;
|
|
50
|
+
label: string;
|
|
51
|
+
count: number;
|
|
52
|
+
/** Percent of the previous step, when known. */
|
|
53
|
+
conversion?: number | null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface ResultRow {
|
|
57
|
+
key: string;
|
|
58
|
+
group: Array<{ label?: string | null; value?: unknown } | string | number | null>;
|
|
59
|
+
measures: Record<string, unknown>;
|
|
60
|
+
record_count?: number;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface ReportResultData {
|
|
64
|
+
status?: "ok" | "restricted";
|
|
65
|
+
columns?: Array<{ id: string; kind: string; label?: string | null }>;
|
|
66
|
+
rows?: ResultRow[];
|
|
67
|
+
totals?: { record_count: number; measures?: Record<string, unknown> } | null;
|
|
68
|
+
truncated?: boolean;
|
|
69
|
+
disclosures?: string[];
|
|
70
|
+
source?: { slug: string; singular_noun: string; plural_noun: string };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface SavedReport {
|
|
74
|
+
id: string;
|
|
75
|
+
title: string;
|
|
76
|
+
chart_type: string;
|
|
77
|
+
revision: number;
|
|
78
|
+
visibility: string;
|
|
79
|
+
source: { slug: string; plural_noun: string };
|
|
80
|
+
can_delete?: boolean;
|
|
81
|
+
config: Record<string, unknown>;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** The report inside the response wrapper, however many `data` layers the endpoint adds. */
|
|
85
|
+
export function reportBody<T>(env: unknown): T {
|
|
86
|
+
let v: unknown = (env as { data?: unknown } | null)?.data ?? env;
|
|
87
|
+
for (let i = 0; i < 2; i++) {
|
|
88
|
+
const o = v as { success?: unknown; data?: unknown } | null;
|
|
89
|
+
if (o && typeof o === "object" && !Array.isArray(o) && "data" in o && (o.success !== undefined || "meta" in o) && o.data != null) v = o.data;
|
|
90
|
+
}
|
|
91
|
+
return v as T;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function reportMeta(env: unknown): ReportMeta {
|
|
95
|
+
const outer = (env as { data?: { meta?: ReportMeta } } | null)?.data;
|
|
96
|
+
return outer?.meta ?? {};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function formatNumber(n: number | null | undefined): string {
|
|
100
|
+
return n == null ? "n/a" : n.toLocaleString();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** `value` is already a percentage (the outbound reports return 12.5, not 0.125). */
|
|
104
|
+
export function formatPercent(value: number | null | undefined, digits = 1): string {
|
|
105
|
+
return value == null ? "n/a" : `${Number(value).toFixed(digits).replace(/\.0+$/, "")}%`;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export const DAY_RANGES = [7, 30, 90] as const;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* useDebounced: a value that follows `value` after it has stopped changing for `ms`. Use it for search and slug
|
|
5
|
+
* inputs so each keystroke does not fire a request.
|
|
6
|
+
*/
|
|
7
|
+
import { useEffect, useState } from "react";
|
|
8
|
+
|
|
9
|
+
export function useDebounced<T>(value: T, ms = 300): T {
|
|
10
|
+
const [v, setV] = useState(value);
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
const t = setTimeout(() => setV(value), ms);
|
|
13
|
+
return () => clearTimeout(t);
|
|
14
|
+
}, [value, ms]);
|
|
15
|
+
return v;
|
|
16
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Weekly outbound report: top-line numbers, rep leaderboard and meeting funnel
|
|
3
|
+
* @when A Monday summary for a manager, or an agent answering "how did outbound do?". Read-only, spends nothing.
|
|
4
|
+
* Every report answers `{ success, data, meta }` inside the API's `data`, so the numbers are at `res.data.data`.
|
|
5
|
+
* Rates are percentages (12.5, not 0.125). `meta.stale` true means a cached answer after a failed refresh.
|
|
6
|
+
*/
|
|
7
|
+
import { g8 } from "@graph8/sdk";
|
|
8
|
+
|
|
9
|
+
g8.init({ apiKey: process.env.G8_API_KEY! });
|
|
10
|
+
|
|
11
|
+
type Wrapped<T> = { data?: { success?: boolean; data?: T; meta?: { stale?: boolean; cached?: boolean } } };
|
|
12
|
+
|
|
13
|
+
const days = 7;
|
|
14
|
+
const summary = (await g8.api.analytics.getOutboundSummary({ query: { days } })) as Wrapped<{
|
|
15
|
+
emails_sent?: number;
|
|
16
|
+
reply_rate?: number;
|
|
17
|
+
calls_dispatched?: number;
|
|
18
|
+
connect_rate?: number;
|
|
19
|
+
meetings_booked?: number;
|
|
20
|
+
}>;
|
|
21
|
+
const s = summary.data?.data;
|
|
22
|
+
console.log(`Last ${days} days: ${s?.emails_sent} emails (${s?.reply_rate}% reply), ${s?.calls_dispatched} calls (${s?.connect_rate}% connected), ${s?.meetings_booked} meetings`);
|
|
23
|
+
if (summary.data?.meta?.stale) console.log("(numbers are from a cache)");
|
|
24
|
+
|
|
25
|
+
// Reps are ranked by reply rate once they have sent at least 10 emails.
|
|
26
|
+
const board = (await g8.api.analytics.getSdrLeaderboard({ query: { days, limit: 10 } })) as Wrapped<
|
|
27
|
+
Array<{ sdr_email?: string; reply_rate?: number; emails_sent?: number; meetings_booked?: number }>
|
|
28
|
+
>;
|
|
29
|
+
for (const [i, r] of (board.data?.data ?? []).entries()) console.log(`${i + 1}. ${r.sdr_email} ${r.reply_rate}% of ${r.emails_sent} emails, ${r.meetings_booked} meetings`);
|
|
30
|
+
|
|
31
|
+
const funnel = (await g8.api.analytics.getMeetingFunnel({ query: { days } })) as Wrapped<{ summary?: Record<string, number> }>;
|
|
32
|
+
console.log("meeting funnel", JSON.stringify(funnel.data?.data?.summary));
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Revenue snapshot: team dashboard, conversion funnel and forecast
|
|
3
|
+
* @when A board-pack style summary of pipeline health. Read-only. These three reports return the report object
|
|
4
|
+
* directly under `data` (no `{ success, data, meta }` wrapper), unlike the outbound reports. The forecast is the
|
|
5
|
+
* open pipeline weighted by stage probabilities; stages with no probability set contribute nothing, so check
|
|
6
|
+
* the deals block's StageEditor first if the number looks low.
|
|
7
|
+
*/
|
|
8
|
+
import { g8 } from "@graph8/sdk";
|
|
9
|
+
|
|
10
|
+
g8.init({ apiKey: process.env.G8_API_KEY! });
|
|
11
|
+
|
|
12
|
+
const dashboard = await g8.api.revenueAnalytics.getTeamRevenueDashboard({ query: { period_days: 30 } });
|
|
13
|
+
console.log("dashboard", JSON.stringify(dashboard.data));
|
|
14
|
+
|
|
15
|
+
const funnel = (await g8.api.revenueAnalytics.getTeamConversionFunnel({ query: { period_days: 90 } })) as {
|
|
16
|
+
data?: { funnel_stages?: Array<{ stage_label: string; count: number; conversion_rate?: number | null }>; overall_conversion_rate?: number };
|
|
17
|
+
};
|
|
18
|
+
for (const stage of funnel.data?.funnel_stages ?? []) console.log(stage.stage_label, stage.count, stage.conversion_rate != null ? `${stage.conversion_rate}% of previous` : "");
|
|
19
|
+
console.log("overall", funnel.data?.overall_conversion_rate, "%");
|
|
20
|
+
|
|
21
|
+
const forecast = await g8.api.revenueAnalytics.getTeamRevenueForecast();
|
|
22
|
+
console.log("forecast", JSON.stringify(forecast.data));
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Define, preview, save and run a custom-object report
|
|
3
|
+
* @when Reporting on a custom object (the objects block): "records by status", "sum of amount by month". The reports
|
|
4
|
+
* feature is switched on per organisation (404 while off). Preview and execute count against shared report-run
|
|
5
|
+
* slots (429 `too_many_report_runs`: wait and retry). Deleting a saved report is destructive, so ask first.
|
|
6
|
+
*/
|
|
7
|
+
import { g8 } from "@graph8/sdk";
|
|
8
|
+
import type { ApiInput } from "@graph8/sdk";
|
|
9
|
+
|
|
10
|
+
g8.init({ apiKey: process.env.G8_API_KEY! });
|
|
11
|
+
|
|
12
|
+
const objectSlug = process.argv[2];
|
|
13
|
+
if (!objectSlug) throw new Error("usage: tsx 03-saved-report.ts <object slug>");
|
|
14
|
+
|
|
15
|
+
type Preview = ApiInput<"preview_object_report_api_reports_preview_post">["body"];
|
|
16
|
+
const definition: Preview = {
|
|
17
|
+
object_slug: objectSlug,
|
|
18
|
+
chart_type: "table",
|
|
19
|
+
// Count the records, grouped by the month they were created in.
|
|
20
|
+
config: { measures: [{ kind: "count" }], group_by: [{ kind: "created_at", grain: "month" }], filters: [] },
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
// 1. Run it unsaved first.
|
|
24
|
+
const preview = await g8.api.reports.previewObjectReportApi({ body: definition });
|
|
25
|
+
for (const row of preview.data.rows ?? []) console.log(JSON.stringify(row.group), JSON.stringify(row.measures), row.record_count);
|
|
26
|
+
|
|
27
|
+
// 2. Save it (private by default), then run the saved definition by id.
|
|
28
|
+
const created = await g8.api.reports.createObjectReportApi({ body: { ...definition, title: "Records by month", visibility: "private" } });
|
|
29
|
+
const run = await g8.api.reports.executeObjectReportApi({ path: { report_id: created.data.id }, body: {} });
|
|
30
|
+
console.log(JSON.stringify(run.data).slice(0, 400));
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# appointments: scheduling and meetings
|
|
2
|
+
|
|
3
|
+
Event types, weekly working hours, a booking page, a list of booked and recorded meetings, and the actions a
|
|
4
|
+
rep takes on a booking (confirm, cancel, add a note). Install with `npx @graph8/sdk add appointments`
|
|
5
|
+
(depends on `crm`).
|
|
6
|
+
|
|
7
|
+
## The flow, in order
|
|
8
|
+
|
|
9
|
+
1. **Hours** (`AvailabilityEditor`): `GET /appointments/schedules` -> pick `schedule.id` ->
|
|
10
|
+
`GET /appointments/schedules/{id}/availability` -> `PATCH` the same path with the full rule set.
|
|
11
|
+
Days are ISO weekdays (1 = Monday ... 7 = Sunday), times are `"HH:MM"`. The PATCH **replaces** the rules.
|
|
12
|
+
2. **Event type** (`EventTypeEditor`): `POST /appointments/event-types` with `{ title, slug, length,
|
|
13
|
+
schedule_id }` returns the event type; **save its `id`**. There is no list-event-types operation.
|
|
14
|
+
3. **Slots** (`BookingPage`): `GET /appointments/slots?event_type_id=&start=&end=&time_zone=` returns
|
|
15
|
+
`{ slots: { "YYYY-MM-DD": [{ time, duration }] } }` (window at most 60 days, never in the past).
|
|
16
|
+
4. **Book** (`BookingPage`, **external**, confirm first): `POST /appointments/bookings` with
|
|
17
|
+
`{ event_type_id, start_time (the slot's time), end_time, attendees: [{ name, email, time_zone }] }`.
|
|
18
|
+
It creates the calendar event and emails the attendee. An `Idempotency-Key` makes a double click safe.
|
|
19
|
+
5. **Manage** (`MeetingList` -> `MeetingDetail`): `GET /appointments/bookings` (paged with `skip`/`take`)
|
|
20
|
+
-> `GET /appointments/bookings/{uid}` -> `confirm` (accept or decline a pending booking, external),
|
|
21
|
+
`cancel` (destructive) or `notes` (external). Recorded meetings (`GET /inbox/meetings`, then
|
|
22
|
+
`/inbox/meetings/{id}`) carry transcripts and AI summaries and are a different record from a booking.
|
|
23
|
+
|
|
24
|
+
IDs passed between steps: `schedule.id` (hours -> event type), `eventType.id` (event type -> slots ->
|
|
25
|
+
booking), `booking.uid` (list -> detail -> confirm/cancel/notes), recorded `meeting.id`.
|
|
26
|
+
|
|
27
|
+
## Prerequisites a human must do
|
|
28
|
+
|
|
29
|
+
- **Connect the host's calendar in the graph8 app** (`where: "app"`). Calendar OAuth (Google/Microsoft) is
|
|
30
|
+
not in the API. `AvailabilityEditor` shows connection state and links out via `connectCalendarUrl`.
|
|
31
|
+
- Use an API key minted by the host. Appointments act as a person; an organisation key can read and
|
|
32
|
+
list slots, but anything personal (profile, slot reservation) requires a personal key.
|
|
33
|
+
- Scopes: `meetings:read`, `meetings:write`, `meetings:run`, `meetings:delete` (cancel a booking, delete an event type).
|
|
34
|
+
|
|
35
|
+
## Defaults (the agent does not need to ask)
|
|
36
|
+
|
|
37
|
+
- New event type: 30 minutes, 120 minutes minimum notice, no host confirmation.
|
|
38
|
+
- New schedule: Monday to Friday 09:00 to 17:00 in the host's zone.
|
|
39
|
+
- BookingPage offers 14 days ahead.
|
|
40
|
+
- Ask the human about two things only: **whether the booking page is public**, and **where event type ids
|
|
41
|
+
are stored**.
|
|
42
|
+
|
|
43
|
+
## Public booking pages: read this
|
|
44
|
+
|
|
45
|
+
The contract deliberately has **no unauthenticated booking operations** (a prospect's browser cannot call the
|
|
46
|
+
API directly). `BookingPage` therefore books on behalf of a prospect through your `/api/g8` proxy with the
|
|
47
|
+
org key. Use it inside your app (a rep scheduling), or for a public page add your own protections: the
|
|
48
|
+
proxy `authorize` hook, an `allowedPrefixes` of exactly `/appointments/slots`, `/appointments/event-types`
|
|
49
|
+
and `/appointments/bookings`, rate limits and bot protection. Never mount the proxy open to the internet
|
|
50
|
+
with the full API key.
|
|
51
|
+
|
|
52
|
+
## Operations
|
|
53
|
+
|
|
54
|
+
| Operation | Method and path | Tier | Used by |
|
|
55
|
+
|---|---|---|---|
|
|
56
|
+
| `appointments.listSchedules` | GET /appointments/schedules | read | EventTypeEditor, AvailabilityEditor |
|
|
57
|
+
| `appointments.getEventType` | GET /appointments/event-types/{id} | read | EventTypeEditor, BookingPage |
|
|
58
|
+
| `appointments.createEventType` | POST /appointments/event-types | write | EventTypeEditor |
|
|
59
|
+
| `appointments.updateEventType` | PATCH /appointments/event-types/{id} | write | EventTypeEditor |
|
|
60
|
+
| `appointments.deleteEventType` | DELETE /appointments/event-types/{id} | destructive | EventTypeEditor |
|
|
61
|
+
| `appointments.getAvailability` | GET /appointments/schedules/{id}/availability | read | AvailabilityEditor |
|
|
62
|
+
| `appointments.updateAvailability` | PATCH /appointments/schedules/{id}/availability | write | AvailabilityEditor |
|
|
63
|
+
| `appointments.listCalendars` | GET /appointments/calendars | read | AvailabilityEditor |
|
|
64
|
+
| `appointments.getAvailableSlots` | GET /appointments/slots | read | BookingPage |
|
|
65
|
+
| `appointments.createBooking` | POST /appointments/bookings | external | BookingPage |
|
|
66
|
+
| `appointments.listBookings` | GET /appointments/bookings | read | MeetingList |
|
|
67
|
+
| `appointments.getBooking` | GET /appointments/bookings/{uid} | read | MeetingDetail |
|
|
68
|
+
| `appointments.confirmBooking` | POST /appointments/bookings/{uid}/confirm | external | MeetingDetail |
|
|
69
|
+
| `appointments.cancelBooking` | POST /appointments/bookings/{uid}/cancel | destructive | MeetingDetail |
|
|
70
|
+
| `appointments.addBookingNote` | POST /appointments/bookings/{uid}/notes | external | MeetingDetail |
|
|
71
|
+
| `meetings.listMeetings` | GET /inbox/meetings | read | MeetingList |
|
|
72
|
+
| `meetings.getMeeting` | GET /inbox/meetings/{id} | read | MeetingDetail |
|
|
73
|
+
|
|
74
|
+
## Recipes (server side)
|
|
75
|
+
|
|
76
|
+
- `01-create-event-type-and-hours.ts`: schedule + event type.
|
|
77
|
+
- `02-find-slots-and-book.ts`: slots, then an external booking.
|
|
78
|
+
- `03-bookings-digest.ts`: upcoming bookings, pending approvals, recorded meetings.
|
|
79
|
+
- `04-calendar-invite.ts`: ad-hoc invite via `calendarInvites.createCalendarInvite` (not part of the block's
|
|
80
|
+
UI; add the operation to your own proxy allowlist if you call it from the browser).
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../block.schema.json",
|
|
3
|
+
"id": "appointments",
|
|
4
|
+
"title": "Appointments & meetings",
|
|
5
|
+
"summary": "Scheduling: event types, working hours, a booking page, and lists and details of booked and recorded meetings.",
|
|
6
|
+
"features": [
|
|
7
|
+
"create and edit bookable event types",
|
|
8
|
+
"weekly working hours with multiple windows and date overrides",
|
|
9
|
+
"booking page: day, time, attendee, confirmed invite",
|
|
10
|
+
"bookings list (upcoming, past, cancelled) and recorded meetings with summaries",
|
|
11
|
+
"confirm, cancel and annotate a booking"
|
|
12
|
+
],
|
|
13
|
+
"dependsOn": [
|
|
14
|
+
"crm"
|
|
15
|
+
],
|
|
16
|
+
"operations": [
|
|
17
|
+
"add_booking_note_appointments_bookings__booking_uid__notes_post",
|
|
18
|
+
"cancel_booking_appointments_bookings__booking_uid__cancel_post",
|
|
19
|
+
"confirm_booking_appointments_bookings__booking_uid__confirm_post",
|
|
20
|
+
"create_booking_appointments_bookings_post",
|
|
21
|
+
"create_event_type_appointments_event_types_post",
|
|
22
|
+
"delete_event_type_appointments_event_types__event_type_id__delete",
|
|
23
|
+
"get_availability_appointments_schedules__schedule_id__availability_get",
|
|
24
|
+
"get_available_slots_appointments_slots_get",
|
|
25
|
+
"get_booking_appointments_bookings__booking_uid__get",
|
|
26
|
+
"get_event_type_appointments_event_types__event_type_id__get",
|
|
27
|
+
"get_meeting_inbox_meetings__meeting_id__get",
|
|
28
|
+
"list_bookings_appointments_bookings_get",
|
|
29
|
+
"list_calendars_appointments_calendars_get",
|
|
30
|
+
"list_meetings_inbox_meetings_get",
|
|
31
|
+
"list_schedules_appointments_schedules_get",
|
|
32
|
+
"update_availability_appointments_schedules__schedule_id__availability_patch",
|
|
33
|
+
"update_event_type_appointments_event_types__event_type_id__patch"
|
|
34
|
+
],
|
|
35
|
+
"components": [
|
|
36
|
+
{
|
|
37
|
+
"name": "EventTypeEditor",
|
|
38
|
+
"file": "components/event-type-editor.tsx",
|
|
39
|
+
"purpose": "Create or edit a meeting type (title, length, schedule, notice, confirmation); delete behind a confirm dialog.",
|
|
40
|
+
"operations": [
|
|
41
|
+
"create_event_type_appointments_event_types_post",
|
|
42
|
+
"delete_event_type_appointments_event_types__event_type_id__delete",
|
|
43
|
+
"get_event_type_appointments_event_types__event_type_id__get",
|
|
44
|
+
"list_schedules_appointments_schedules_get",
|
|
45
|
+
"update_event_type_appointments_event_types__event_type_id__patch"
|
|
46
|
+
],
|
|
47
|
+
"tiers": [
|
|
48
|
+
"read",
|
|
49
|
+
"write",
|
|
50
|
+
"destructive"
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"name": "AvailabilityEditor",
|
|
55
|
+
"file": "components/availability-editor.tsx",
|
|
56
|
+
"purpose": "Weekly working hours and date overrides for a schedule, plus connected calendars with a link out to connect them.",
|
|
57
|
+
"operations": [
|
|
58
|
+
"get_availability_appointments_schedules__schedule_id__availability_get",
|
|
59
|
+
"list_calendars_appointments_calendars_get",
|
|
60
|
+
"list_schedules_appointments_schedules_get",
|
|
61
|
+
"update_availability_appointments_schedules__schedule_id__availability_patch"
|
|
62
|
+
],
|
|
63
|
+
"tiers": [
|
|
64
|
+
"read",
|
|
65
|
+
"write"
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"name": "BookingPage",
|
|
70
|
+
"file": "components/booking-page.tsx",
|
|
71
|
+
"purpose": "Pick a day and time from live slots, enter the attendee, and book (external, confirmed).",
|
|
72
|
+
"operations": [
|
|
73
|
+
"create_booking_appointments_bookings_post",
|
|
74
|
+
"get_available_slots_appointments_slots_get",
|
|
75
|
+
"get_event_type_appointments_event_types__event_type_id__get"
|
|
76
|
+
],
|
|
77
|
+
"tiers": [
|
|
78
|
+
"read",
|
|
79
|
+
"external"
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"name": "MeetingList",
|
|
84
|
+
"file": "components/meeting-list.tsx",
|
|
85
|
+
"purpose": "Upcoming, past and cancelled bookings plus recorded meetings, with paging and search.",
|
|
86
|
+
"operations": [
|
|
87
|
+
"list_bookings_appointments_bookings_get",
|
|
88
|
+
"list_meetings_inbox_meetings_get"
|
|
89
|
+
],
|
|
90
|
+
"tiers": [
|
|
91
|
+
"read"
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"name": "MeetingDetail",
|
|
96
|
+
"file": "components/meeting-detail.tsx",
|
|
97
|
+
"purpose": "One booking (confirm, cancel, notes) or one recorded meeting (summary, topics, action items, transcript).",
|
|
98
|
+
"operations": [
|
|
99
|
+
"add_booking_note_appointments_bookings__booking_uid__notes_post",
|
|
100
|
+
"cancel_booking_appointments_bookings__booking_uid__cancel_post",
|
|
101
|
+
"confirm_booking_appointments_bookings__booking_uid__confirm_post",
|
|
102
|
+
"get_booking_appointments_bookings__booking_uid__get",
|
|
103
|
+
"get_meeting_inbox_meetings__meeting_id__get"
|
|
104
|
+
],
|
|
105
|
+
"tiers": [
|
|
106
|
+
"read",
|
|
107
|
+
"external",
|
|
108
|
+
"destructive"
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
],
|
|
112
|
+
"hooks": [
|
|
113
|
+
{
|
|
114
|
+
"name": "useSchedules",
|
|
115
|
+
"file": "hooks/use-schedules.ts",
|
|
116
|
+
"purpose": "The org's availability schedules, default first.",
|
|
117
|
+
"operations": [
|
|
118
|
+
"list_schedules_appointments_schedules_get"
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"name": "useAvailableSlots",
|
|
123
|
+
"file": "hooks/use-available-slots.ts",
|
|
124
|
+
"purpose": "Bookable times for an event type grouped by local date.",
|
|
125
|
+
"operations": [
|
|
126
|
+
"get_available_slots_appointments_slots_get"
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
],
|
|
130
|
+
"lib": [
|
|
131
|
+
{
|
|
132
|
+
"file": "lib/appointments-types.ts",
|
|
133
|
+
"purpose": "Event type, schedule, booking and slot types plus unwrap/listOf helpers for the engine's mixed response shapes."
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"file": "lib/idempotency.ts",
|
|
137
|
+
"purpose": "useIdempotencyKey: one Idempotency-Key per distinct payload, rotated when the body changes so an edited retry never hits a 409."
|
|
138
|
+
}
|
|
139
|
+
],
|
|
140
|
+
"recipes": [
|
|
141
|
+
{
|
|
142
|
+
"file": "recipes/01-create-event-type-and-hours.ts",
|
|
143
|
+
"title": "Create working hours and a bookable event type",
|
|
144
|
+
"when": "Setting up scheduling for an org or rep; both writes are low risk."
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"file": "recipes/02-find-slots-and-book.ts",
|
|
148
|
+
"title": "Find open times and book a meeting",
|
|
149
|
+
"when": "An agent scheduling for a rep; booking emails the attendee so a human approves first."
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"file": "recipes/03-bookings-digest.ts",
|
|
153
|
+
"title": "Upcoming bookings and pending approvals",
|
|
154
|
+
"when": "A read-only daily digest, including recorded meetings."
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"file": "recipes/04-calendar-invite.ts",
|
|
158
|
+
"title": "Create an ad-hoc calendar invite",
|
|
159
|
+
"when": "A shareable invite without an event type or booking."
|
|
160
|
+
}
|
|
161
|
+
],
|
|
162
|
+
"prerequisites": [
|
|
163
|
+
{
|
|
164
|
+
"id": "calendar-connected",
|
|
165
|
+
"description": "A Google or Microsoft calendar connected for the host. Calendar OAuth exists only in the graph8 app, so a human must connect it; without it busy time is not checked and bookings do not create calendar events.",
|
|
166
|
+
"where": "app",
|
|
167
|
+
"verify": "GET /appointments/calendars returns a calendar with is_valid true (AvailabilityEditor shows it as connected)."
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"id": "personal-key",
|
|
171
|
+
"description": "Event types, schedules, slots and bookings act as a person. Use an API key minted by the host (an org key works for most reads and for slots; profile and slot reservation need a personal key).",
|
|
172
|
+
"where": "api",
|
|
173
|
+
"verify": "`g8.api.appointments.listSchedules()` returns the host's schedules, not a 404 User not found."
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"id": "meetings-scopes",
|
|
177
|
+
"description": "Key scopes meetings:read, meetings:write, meetings:run (booking, confirm, notes are tier external) and meetings:delete (cancel, delete event type).",
|
|
178
|
+
"where": "api",
|
|
179
|
+
"verify": "`g8.api.me.describeCurrentKey()` lists the meetings:* scopes."
|
|
180
|
+
}
|
|
181
|
+
],
|
|
182
|
+
"scopes": [
|
|
183
|
+
"meetings:delete",
|
|
184
|
+
"meetings:read",
|
|
185
|
+
"meetings:run",
|
|
186
|
+
"meetings:write"
|
|
187
|
+
],
|
|
188
|
+
"defaults": [
|
|
189
|
+
{
|
|
190
|
+
"decision": "Meeting length and notice for a new event type",
|
|
191
|
+
"default": "30 minutes, 120 minutes minimum notice, no host confirmation",
|
|
192
|
+
"askHuman": false
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"decision": "Working hours for a new schedule",
|
|
196
|
+
"default": "Monday to Friday 09:00 to 17:00 in the host's time zone",
|
|
197
|
+
"askHuman": false
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"decision": "How far ahead the BookingPage offers times",
|
|
201
|
+
"default": "14 days (the API allows at most 60)",
|
|
202
|
+
"askHuman": false
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"decision": "Whether the BookingPage is public to prospects or only used by reps inside the app",
|
|
206
|
+
"default": "Inside the app. A public page needs your own auth and bot protection on the proxy because the API has no public booking operations",
|
|
207
|
+
"askHuman": true
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"decision": "Where event type ids are stored (there is no list-event-types operation)",
|
|
211
|
+
"default": "Your own database, saved from the create response",
|
|
212
|
+
"askHuman": true
|
|
213
|
+
}
|
|
214
|
+
],
|
|
215
|
+
"peerDependencies": {
|
|
216
|
+
"react": ">=18"
|
|
217
|
+
}
|
|
218
|
+
}
|