@agent-native/core 0.80.8 → 0.80.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +12 -0
- package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +6 -0
- package/corpus/core/docs/content/locales/de-DE/template-design.mdx +8 -0
- package/corpus/core/docs/content/locales/es-ES/template-design.mdx +10 -2
- package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +10 -2
- package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +7 -0
- package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +7 -0
- package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +7 -0
- package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +9 -2
- package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +6 -0
- package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +6 -0
- package/corpus/core/docs/content/template-design.mdx +9 -2
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/cli/mcp.ts +10 -0
- package/corpus/core/src/cli/skills.ts +58 -12
- package/corpus/core/src/client/error-format.ts +25 -0
- package/corpus/core/src/client/extensions/ExtensionViewer.tsx +13 -11
- package/corpus/core/src/client/guided-questions.tsx +32 -4
- package/corpus/core/src/client/onboarding/OnboardingPanel.tsx +33 -1
- package/corpus/core/src/client/resources/BuiltinCapabilityDetail.tsx +8 -0
- package/corpus/core/src/client/resources/use-builtin-capabilities.ts +4 -2
- package/corpus/core/src/client/session-replay.ts +34 -0
- package/corpus/core/src/client/sharing/ShareButton.tsx +106 -21
- package/corpus/core/src/coding-tools/index.ts +1 -1
- package/corpus/core/src/mcp/index.ts +2 -0
- package/corpus/core/src/mcp/screen-memory-stdio.ts +290 -0
- package/corpus/core/src/mcp-client/builtin-capabilities.ts +13 -1
- package/corpus/core/src/mcp-client/index.ts +9 -0
- package/corpus/core/src/mcp-client/screen-memory-local.ts +461 -0
- package/corpus/core/src/onboarding/types.ts +7 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +25 -0
- package/corpus/core/src/server/agents-bundle.ts +35 -7
- package/corpus/core/src/styles/agent-native.css +5 -0
- package/corpus/core/src/templates/default/app/global.css +35 -35
- package/corpus/templates/analytics/AGENTS.md +6 -0
- package/corpus/templates/analytics/actions/github-repo-files.ts +9 -0
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +4 -4
- package/corpus/templates/analytics/app/global.css +144 -40
- package/corpus/templates/analytics/app/pages/adhoc/explorer/index.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/ChartCard.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +1 -1
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +4 -4
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +9 -9
- package/corpus/templates/analytics/changelog/2026-06-29-agents-can-search-and-read-connected-github-repositories-whe.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-sessions-and-explorer-layouts-adapt-when-the-agent-sidebar-is.md +6 -0
- package/corpus/templates/assets/app/components/layout/Layout.tsx +3 -1
- package/corpus/templates/assets/app/components/library/LibraryPresetGrid.tsx +1 -1
- package/corpus/templates/assets/app/global.css +99 -35
- package/corpus/templates/assets/app/routes/asset.$id.tsx +2 -2
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +4 -4
- package/corpus/templates/assets/app/routes/library.tsx +4 -4
- package/corpus/templates/assets/changelog/2026-06-29-asset-library-and-detail-layouts-adapt-when-the-agent-sidebar.md +6 -0
- package/corpus/templates/brain/app/components/layout/Layout.tsx +1 -1
- package/corpus/templates/brain/app/global.css +63 -35
- package/corpus/templates/brain/app/routes/search.tsx +1 -1
- package/corpus/templates/brain/app/routes/settings.tsx +1 -1
- package/corpus/templates/brain/app/routes/sources.tsx +2 -2
- package/corpus/templates/brain/changelog/2026-06-29-search-settings-and-source-layouts-adapt-when-the-agent-sidebar.md +6 -0
- package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +4 -4
- package/corpus/templates/calendar/app/components/calendar/FindTimePanel.tsx +3 -2
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +4 -2
- package/corpus/templates/calendar/app/global.css +69 -35
- package/corpus/templates/calendar/changelog/2026-06-29-event-and-find-time-layouts-adapt-when-the-agent-sidebar-is.md +6 -0
- package/corpus/templates/chat/app/components/layout/Layout.tsx +1 -1
- package/corpus/templates/chat/app/global.css +35 -35
- package/corpus/templates/chat/changelog/2026-06-29-chat-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
- package/corpus/templates/clips/AGENTS.md +13 -0
- package/corpus/templates/clips/actions/get-screen-memory-status.ts +12 -0
- package/corpus/templates/clips/actions/query-screen-memory-context.ts +29 -0
- package/corpus/templates/clips/actions/view-screen.ts +2 -2
- package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
- package/corpus/templates/clips/app/global.css +47 -35
- package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +3 -3
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +45 -18
- package/corpus/templates/clips/changelog/2026-06-29-meeting-detail-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-29-screen-memory-keeps-a-local-rolling-screen-buffer-for-agent-context.md +5 -0
- package/corpus/templates/clips/changelog/2026-06-29-video-chat-is-easier-to-find-on-recording-pages-and-s3-setup.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/styles.css +39 -39
- package/corpus/templates/clips/desktop/src/app.tsx +290 -1
- package/corpus/templates/clips/desktop/src/shared/config.ts +83 -0
- package/corpus/templates/clips/desktop/src/styles.css +67 -52
- package/corpus/templates/clips/desktop/src-tauri/src/config.rs +50 -0
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +17 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +13 -13
- package/corpus/templates/clips/desktop/src-tauri/src/screen_memory.rs +990 -0
- package/corpus/templates/clips/server/plugins/onboarding.ts +2 -0
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +3 -3
- package/corpus/templates/content/app/components/layout/Layout.tsx +1 -1
- package/corpus/templates/content/app/global.css +29 -15
- package/corpus/templates/content/changelog/2026-06-29-database-gallery-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +25 -20
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
- package/corpus/templates/design/.agents/skills/export-handoff/SKILL.md +8 -0
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +13 -0
- package/corpus/templates/design/AGENTS.md +20 -12
- package/corpus/templates/design/CODE_NATIVE_DESIGN_STUDIO_IMPLEMENTATION_PLAN.md +1054 -0
- package/corpus/templates/design/actions/apply-visual-edit.ts +24 -4
- package/corpus/templates/design/actions/export-coding-handoff.ts +12 -4
- package/corpus/templates/design/actions/generate-design.ts +6 -21
- package/corpus/templates/design/actions/generate-screens.ts +43 -2
- package/corpus/templates/design/actions/get-design.ts +1 -0
- package/corpus/templates/design/actions/present-design-variants.ts +355 -30
- package/corpus/templates/design/actions/view-screen.ts +75 -31
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +329 -69
- package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +1 -1
- package/corpus/templates/design/app/components/design/EditPanel.tsx +479 -77
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +380 -216
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1050 -196
- package/corpus/templates/design/app/components/design/QuestionFlow.tsx +83 -206
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +1 -1
- package/corpus/templates/design/app/components/design/index.ts +0 -1
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +225 -133
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +122 -11
- package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +24 -5
- package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +57 -1
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +37 -12
- package/corpus/templates/design/app/components/design/inspector/index.ts +1 -0
- package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +12 -5
- package/corpus/templates/design/app/components/design/types.ts +9 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +23 -5
- package/corpus/templates/design/app/global.css +77 -49
- package/corpus/templates/design/app/hooks/use-question-flow.ts +2 -2
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +8 -1
- package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/design/app/i18n-data.ts +45 -3
- package/corpus/templates/design/app/pages/DesignEditor.tsx +2602 -657
- package/corpus/templates/design/app/root.tsx +1 -1
- package/corpus/templates/design/changelog/2026-06-29-containers-no-longer-block-selecting-nested-elements-and-nor.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-agents-now-generate-and-refine-variants-from-stronger.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-inspector-controls-now-match-figmas-softer-dark-chrome.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-questions-now-appear-as-a-cleaner-canvas-intake-with-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-variant-directions-now-appear-as-board-screens-with-chat-buttons.md +5 -0
- package/corpus/templates/design/changelog/2026-06-29-element-selection-no-longer-snaps-back-to-the-previous-layer.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-frame-resize-measurements-now-stay-beside-the-cursor-while-d.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-inspector-number-fields-have-cleaner-tooltips-and-draggable-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-layer-locking-layer-nesting-generated-question-intake-and-im.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-layer-names-in-the-sidebar-can-scroll-horizontally-instead-o.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-layer-nesting-in-the-sidebar-now-uses-tighter-spacing-so-nam.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-layers-no-longer-repeat-document-wrapper-rows-when-a-screen-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-overview-previews-now-keep-element-hover-and-selection-tied-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-pressing-escape-now-cancels-a-stuck-screen-drag-in-the-overv.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-is-easier-to-find-and-named-screens-open-dir.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-only-highlights-screens-when-the-frame-or-ti.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-previews-now-resize-to-match-the-selected-de.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-selection-now-uses-a-pointer-cursor-instead-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-selection-outlines-now-stay-locked-to-the-se.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-zoom-now-reports-real-screen-scale-separatel.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-zooming-feels-smoother-and-selection-outline.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-zooming-now-stays-on-the-overview-canvas-ins.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-selecting-a-nested-layer-from-all-screens-now-keeps-you-in-a.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-share-now-groups-link-sharing-exports-and-agent-handoff.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-the-design-editor-loading-skeleton-now-uses-a-softer-charcoa.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-the-device-preview-menu-now-sits-next-to-the-preview-button-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-the-inspector-stays-read-only-while-an-empty-design-is-still.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-the-missing-design-view-now-matches-the-rest-of-the-editor-c.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-the-pen-tool-icon-and-tool-option-menus-better-match-the-edi.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-typography-controls-now-keep-the-font-name-visible-and-move-.md +6 -0
- package/corpus/templates/design/e2e/README.md +3 -3
- package/corpus/templates/design/e2e/global-setup.ts +11 -22
- package/corpus/templates/design/e2e/helpers.ts +122 -11
- package/corpus/templates/design/playwright.config.ts +9 -3
- package/corpus/templates/design/server/lib/coding-handoff.ts +126 -2
- package/corpus/templates/design/server/plugins/core-routes.ts +1 -2
- package/corpus/templates/design/server/routes/api/design-handoff/[id].zip.get.ts +86 -0
- package/corpus/templates/design/shared/code-layer.ts +125 -22
- package/corpus/templates/design/shared/generation-session.ts +41 -0
- package/corpus/templates/dispatch/app/global.css +79 -35
- package/corpus/templates/dispatch/app/routes/integrations.tsx +8 -7
- package/corpus/templates/dispatch/changelog/2026-06-29-integration-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
- package/corpus/templates/forms/app/components/layout/Layout.tsx +6 -2
- package/corpus/templates/forms/app/global.css +64 -35
- package/corpus/templates/forms/app/pages/FormsListPage.tsx +2 -2
- package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +3 -3
- package/corpus/templates/forms/changelog/2026-06-29-form-list-and-insight-layouts-adapt-when-the-agent-sidebar.md +6 -0
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +3 -1
- package/corpus/templates/macros/app/global.css +25 -9
- package/corpus/templates/macros/changelog/2026-06-29-macro-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +6 -2
- package/corpus/templates/mail/app/global.css +42 -36
- package/corpus/templates/mail/app/pages/InboxPage.tsx +1 -1
- package/corpus/templates/mail/changelog/2026-06-29-the-contact-panel-now-adapts-to-the-available-mail-pane-width.md +6 -0
- package/corpus/templates/plan/app/components/layout/Layout.tsx +3 -1
- package/corpus/templates/plan/app/components/plan/DocumentArea.tsx +6 -7
- package/corpus/templates/plan/app/global.css +74 -42
- package/corpus/templates/plan/changelog/2026-06-29-plan-document-blocks-adapt-to-the-available-document-width.md +6 -0
- package/corpus/templates/plan/changelog/2026-06-29-plan-titles-and-summaries-can-be-edited-inline-without-focus.md +6 -0
- package/corpus/templates/slides/app/components/layout/Layout.tsx +3 -1
- package/corpus/templates/slides/app/global.css +49 -33
- package/corpus/templates/slides/changelog/2026-06-29-slide-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
- package/corpus/templates/videos/app/components/layout/Layout.tsx +3 -1
- package/corpus/templates/videos/app/global.css +35 -35
- package/corpus/templates/videos/changelog/2026-06-29-video-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +10 -0
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +58 -12
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/error-format.d.ts.map +1 -1
- package/dist/client/error-format.js +17 -0
- package/dist/client/error-format.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +3 -4
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/guided-questions.d.ts +4 -0
- package/dist/client/guided-questions.d.ts.map +1 -1
- package/dist/client/guided-questions.js +16 -7
- package/dist/client/guided-questions.js.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.js +26 -1
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/resources/BuiltinCapabilityDetail.d.ts.map +1 -1
- package/dist/client/resources/BuiltinCapabilityDetail.js +1 -1
- package/dist/client/resources/BuiltinCapabilityDetail.js.map +1 -1
- package/dist/client/resources/use-builtin-capabilities.d.ts +1 -1
- package/dist/client/resources/use-builtin-capabilities.d.ts.map +1 -1
- package/dist/client/resources/use-builtin-capabilities.js +2 -1
- package/dist/client/resources/use-builtin-capabilities.js.map +1 -1
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +31 -0
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/sharing/ShareButton.d.ts +14 -0
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +36 -7
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/coding-tools/index.js +1 -1
- package/dist/coding-tools/index.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/screen-memory-stdio.d.ts +6 -0
- package/dist/mcp/screen-memory-stdio.d.ts.map +1 -0
- package/dist/mcp/screen-memory-stdio.js +213 -0
- package/dist/mcp/screen-memory-stdio.js.map +1 -0
- package/dist/mcp-client/builtin-capabilities.d.ts +1 -1
- package/dist/mcp-client/builtin-capabilities.d.ts.map +1 -1
- package/dist/mcp-client/builtin-capabilities.js +10 -0
- package/dist/mcp-client/builtin-capabilities.js.map +1 -1
- package/dist/mcp-client/index.d.ts +1 -0
- package/dist/mcp-client/index.d.ts.map +1 -1
- package/dist/mcp-client/index.js +1 -0
- package/dist/mcp-client/index.js.map +1 -1
- package/dist/mcp-client/screen-memory-local.d.ts +61 -0
- package/dist/mcp-client/screen-memory-local.d.ts.map +1 -0
- package/dist/mcp-client/screen-memory-local.js +336 -0
- package/dist/mcp-client/screen-memory-local.js.map +1 -0
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/routes.d.ts +8 -8
- package/dist/onboarding/types.d.ts +7 -0
- package/dist/onboarding/types.d.ts.map +1 -1
- package/dist/onboarding/types.js.map +1 -1
- package/dist/resources/handlers.d.ts +2 -2
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +26 -0
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/agents-bundle.d.ts.map +1 -1
- package/dist/server/agents-bundle.js +22 -7
- package/dist/server/agents-bundle.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/styles/agent-native.css +5 -0
- package/dist/templates/default/app/global.css +35 -35
- package/docs/content/locales/ar-SA/template-design.mdx +6 -0
- package/docs/content/locales/de-DE/template-design.mdx +8 -0
- package/docs/content/locales/es-ES/template-design.mdx +10 -2
- package/docs/content/locales/fr-FR/template-design.mdx +10 -2
- package/docs/content/locales/hi-IN/template-design.mdx +7 -0
- package/docs/content/locales/ja-JP/template-design.mdx +7 -0
- package/docs/content/locales/ko-KR/template-design.mdx +7 -0
- package/docs/content/locales/pt-BR/template-design.mdx +9 -2
- package/docs/content/locales/zh-CN/template-design.mdx +6 -0
- package/docs/content/locales/zh-TW/template-design.mdx +6 -0
- package/docs/content/template-design.mdx +9 -2
- package/package.json +1 -1
- package/src/templates/default/app/global.css +35 -35
- package/corpus/templates/design/app/components/design/VariantGrid.tsx +0 -189
- package/corpus/templates/design/app/components/design/VariantHandoffCard.tsx +0 -115
- package/corpus/templates/design/app/hooks/use-variant-flow.ts +0 -342
|
@@ -28,6 +28,8 @@ export interface GuidedQuestion {
|
|
|
28
28
|
allowOther?: boolean;
|
|
29
29
|
includeExplore?: boolean;
|
|
30
30
|
includeDecide?: boolean;
|
|
31
|
+
/** Submit immediately when a single-select option is clicked. */
|
|
32
|
+
submitOnSelect?: boolean;
|
|
31
33
|
}
|
|
32
34
|
export type GuidedQuestionAnswers = Record<string, unknown>;
|
|
33
35
|
export interface GuidedQuestionPayload {
|
|
@@ -36,6 +38,8 @@ export interface GuidedQuestionPayload {
|
|
|
36
38
|
description?: string;
|
|
37
39
|
skipLabel?: string;
|
|
38
40
|
submitLabel?: string;
|
|
41
|
+
submitMessage?: string;
|
|
42
|
+
skipMessage?: string;
|
|
39
43
|
/**
|
|
40
44
|
* @internal Set by {@link askUserQuestion} for client-initiated questions.
|
|
41
45
|
* When present, `useGuidedQuestionFlow` resolves the matching in-memory
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guided-questions.d.ts","sourceRoot":"","sources":["../../src/client/guided-questions.tsx"],"names":[],"mappings":"AAeA,MAAM,MAAM,kBAAkB,GAC1B,cAAc,GACd,eAAe,GACf,QAAQ,GACR,MAAM,GACN,UAAU,CAAC;AAEf,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;oEAEgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACjC,OAAO,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"guided-questions.d.ts","sourceRoot":"","sources":["../../src/client/guided-questions.tsx"],"names":[],"mappings":"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"}
|
|
@@ -227,6 +227,7 @@ export function guidedQuestionsFingerprint(questions) {
|
|
|
227
227
|
allowOther: question.allowOther ?? null,
|
|
228
228
|
includeExplore: question.includeExplore ?? null,
|
|
229
229
|
includeDecide: question.includeDecide ?? null,
|
|
230
|
+
submitOnSelect: question.submitOnSelect ?? false,
|
|
230
231
|
min: question.min ?? null,
|
|
231
232
|
max: question.max ?? null,
|
|
232
233
|
step: question.step ?? null,
|
|
@@ -271,17 +272,18 @@ export function GuidedQuestionFlow({ questions, onSubmit, onSkip, title = "A few
|
|
|
271
272
|
const setAnswer = useCallback((id, value) => {
|
|
272
273
|
setAnswers((prev) => ({ ...prev, [id]: value }));
|
|
273
274
|
}, []);
|
|
275
|
+
const submitAnswers = useCallback((nextAnswers = answers) => onSubmit(normalizeGuidedAnswers(nextAnswers)), [answers, onSubmit]);
|
|
274
276
|
const allRequiredAnswered = questions
|
|
275
277
|
.filter((question) => question.required)
|
|
276
278
|
.every((question) => hasGuidedAnswer(answers[question.id]));
|
|
277
|
-
return (_jsx("div", { className: cn("flex h-full w-full items-center justify-center bg-background text-foreground", className), children: _jsxs("div", { className: "flex max-h-full w-full max-w-3xl flex-col px-4 py-6 sm:px-8 sm:py-10", children: [_jsxs("div", { className: "mb-6 flex items-start gap-3", children: [_jsx("div", { className: "mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-muted/40 text-primary", children: _jsx(IconHelpCircle, { className: "h-5 w-5" }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("h2", { className: "text-xl font-semibold tracking-normal text-foreground sm:text-2xl", children: title }), description && (_jsx("p", { className: "mt-1 max-w-2xl text-sm leading-5 text-muted-foreground", children: description }))] })] }), _jsx("div", { className: "min-h-0 flex-1 space-y-4 overflow-y-auto pe-1", children: questions.map((question, index) => (_jsx(QuestionCard, { index: index, question: question, value: answers[question.id], onChange: (value) => setAnswer(question.id, value) }, question.id))) }), _jsxs("div", { className: "mt-5 flex shrink-0 items-center justify-between gap-4 border-t border-border pt-4", children: [_jsx("div", { className: "flex items-center gap-1.5", children: questions.map((question, index) => (_jsx("span", { className: cn("h-1.5 w-1.5 rounded-full", hasGuidedAnswer(answers[question.id])
|
|
279
|
+
return (_jsx("div", { className: cn("flex h-full w-full items-center justify-center bg-background text-foreground", className), children: _jsxs("div", { className: "flex max-h-full w-full max-w-3xl flex-col px-4 py-6 sm:px-8 sm:py-10", children: [_jsxs("div", { className: "mb-6 flex items-start gap-3", children: [_jsx("div", { className: "mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-muted/40 text-primary", children: _jsx(IconHelpCircle, { className: "h-5 w-5" }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("h2", { className: "text-xl font-semibold tracking-normal text-foreground sm:text-2xl", children: title }), description && (_jsx("p", { className: "mt-1 max-w-2xl text-sm leading-5 text-muted-foreground", children: description }))] })] }), _jsx("div", { className: "min-h-0 flex-1 space-y-4 overflow-y-auto pe-1", children: questions.map((question, index) => (_jsx(QuestionCard, { index: index, question: question, value: answers[question.id], onChange: (value) => setAnswer(question.id, value), onSubmitAnswer: (value) => submitAnswers({ ...answers, [question.id]: value }) }, question.id))) }), _jsxs("div", { className: "mt-5 flex shrink-0 items-center justify-between gap-4 border-t border-border pt-4", children: [_jsx("div", { className: "flex items-center gap-1.5", children: questions.map((question, index) => (_jsx("span", { className: cn("h-1.5 w-1.5 rounded-full", hasGuidedAnswer(answers[question.id])
|
|
278
280
|
? "bg-primary"
|
|
279
|
-
: "bg-muted-foreground/30") }, question.id || index))) }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { type: "button", onClick: onSkip, className: "cursor-pointer rounded-md px-3 py-2 text-sm text-muted-foreground transition-colors hover:bg-muted/60 hover:text-foreground", children: skipLabel }), _jsxs("button", { type: "button", onClick: () =>
|
|
281
|
+
: "bg-muted-foreground/30") }, question.id || index))) }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { type: "button", onClick: onSkip, className: "cursor-pointer rounded-md px-3 py-2 text-sm text-muted-foreground transition-colors hover:bg-muted/60 hover:text-foreground", children: skipLabel }), _jsxs("button", { type: "button", onClick: () => submitAnswers(), disabled: !allRequiredAnswered, className: "inline-flex cursor-pointer items-center gap-2 rounded-md bg-primary px-3.5 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-45", children: [submitLabel, _jsx(IconChevronRight, { className: "h-4 w-4 rtl:-scale-x-100" })] })] })] })] }) }));
|
|
280
282
|
}
|
|
281
|
-
function QuestionCard({ index, question, value, onChange, }) {
|
|
282
|
-
return (_jsxs("section", { className: "rounded-lg border border-border bg-card/65 p-4 shadow-sm", children: [_jsxs("div", { className: "mb-3 flex gap-3", children: [_jsx("div", { className: "flex h-6 min-w-6 items-center justify-center rounded-md bg-muted text-xs font-medium text-muted-foreground", children: index + 1 }), _jsxs("div", { className: "min-w-0", children: [question.header && (_jsx("p", { className: "mb-1 text-[11px] font-medium uppercase text-muted-foreground", children: question.header })), _jsxs("h3", { className: "text-sm font-medium leading-5 text-foreground", children: [question.question, question.required && (_jsx("span", { className: "ms-1 text-destructive", children: "*" }))] }), question.description && (_jsx("p", { className: "mt-1 text-xs leading-5 text-muted-foreground", children: question.description }))] })] }), question.type === "text-options" && (_jsx(TextOptions, { question: question, value: value, onChange: onChange })), question.type === "color-options" && (_jsx(ColorOptions, { question: question, value: value, onChange: onChange })), question.type === "slider" && (_jsx(SliderQuestion, { question: question, value: value, onChange: onChange })), question.type === "file" && (_jsx(FileDropZone, { value: value, onChange: onChange })), question.type === "freeform" && (_jsx("textarea", { value: typeof value === "string" ? value : "", onChange: (event) => onChange(event.target.value), placeholder: question.placeholder ?? "Type your answer...", className: "min-h-[84px] w-full resize-none rounded-md border border-border bg-muted/45 px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground/70 focus:border-primary" }))] }));
|
|
283
|
+
function QuestionCard({ index, question, value, onChange, onSubmitAnswer, }) {
|
|
284
|
+
return (_jsxs("section", { className: "rounded-lg border border-border bg-card/65 p-4 shadow-sm", children: [_jsxs("div", { className: "mb-3 flex gap-3", children: [_jsx("div", { className: "flex h-6 min-w-6 items-center justify-center rounded-md bg-muted text-xs font-medium text-muted-foreground", children: index + 1 }), _jsxs("div", { className: "min-w-0", children: [question.header && (_jsx("p", { className: "mb-1 text-[11px] font-medium uppercase text-muted-foreground", children: question.header })), _jsxs("h3", { className: "text-sm font-medium leading-5 text-foreground", children: [question.question, question.required && (_jsx("span", { className: "ms-1 text-destructive", children: "*" }))] }), question.description && (_jsx("p", { className: "mt-1 text-xs leading-5 text-muted-foreground", children: question.description }))] })] }), question.type === "text-options" && (_jsx(TextOptions, { question: question, value: value, onChange: onChange, onSubmitAnswer: onSubmitAnswer })), question.type === "color-options" && (_jsx(ColorOptions, { question: question, value: value, onChange: onChange })), question.type === "slider" && (_jsx(SliderQuestion, { question: question, value: value, onChange: onChange })), question.type === "file" && (_jsx(FileDropZone, { value: value, onChange: onChange })), question.type === "freeform" && (_jsx("textarea", { value: typeof value === "string" ? value : "", onChange: (event) => onChange(event.target.value), placeholder: question.placeholder ?? "Type your answer...", className: "min-h-[84px] w-full resize-none rounded-md border border-border bg-muted/45 px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground/70 focus:border-primary" }))] }));
|
|
283
285
|
}
|
|
284
|
-
function TextOptions({ question, value, onChange, }) {
|
|
286
|
+
function TextOptions({ question, value, onChange, onSubmitAnswer, }) {
|
|
285
287
|
const options = useMemo(() => withDefaultOptions(question), [question]);
|
|
286
288
|
const multiSelect = question.multiSelect === true;
|
|
287
289
|
const selectedValues = Array.isArray(value) ? value : [];
|
|
@@ -295,6 +297,8 @@ function TextOptions({ question, value, onChange, }) {
|
|
|
295
297
|
const toggleOption = (optionValue) => {
|
|
296
298
|
if (!multiSelect) {
|
|
297
299
|
onChange(optionValue);
|
|
300
|
+
if (question.submitOnSelect)
|
|
301
|
+
onSubmitAnswer(optionValue);
|
|
298
302
|
return;
|
|
299
303
|
}
|
|
300
304
|
const next = selectedValues.includes(optionValue)
|
|
@@ -481,6 +485,7 @@ export function useGuidedQuestionFlow({ stateKey = "show-questions", browserTabI
|
|
|
481
485
|
return;
|
|
482
486
|
}
|
|
483
487
|
const formattedAnswers = formatGuidedAnswersForAgent(answers);
|
|
488
|
+
const resolvedSubmitMessage = payload?.submitMessage ?? submitMessage;
|
|
484
489
|
const context = buildSubmitContext?.({ answers, formattedAnswers }) ??
|
|
485
490
|
[
|
|
486
491
|
"The user answered the pre-generation questions.",
|
|
@@ -488,7 +493,11 @@ export function useGuidedQuestionFlow({ stateKey = "show-questions", browserTabI
|
|
|
488
493
|
"Answers:",
|
|
489
494
|
formattedAnswers,
|
|
490
495
|
].join("\n");
|
|
491
|
-
sendToAgentChat({
|
|
496
|
+
sendToAgentChat({
|
|
497
|
+
message: resolvedSubmitMessage,
|
|
498
|
+
context,
|
|
499
|
+
submit: true,
|
|
500
|
+
});
|
|
492
501
|
clear();
|
|
493
502
|
}, [buildSubmitContext, clear, payload, submitMessage]);
|
|
494
503
|
const handleSkip = useCallback(() => {
|
|
@@ -499,7 +508,7 @@ export function useGuidedQuestionFlow({ stateKey = "show-questions", browserTabI
|
|
|
499
508
|
return;
|
|
500
509
|
}
|
|
501
510
|
sendToAgentChat({
|
|
502
|
-
message: skipMessage,
|
|
511
|
+
message: payload?.skipMessage ?? skipMessage,
|
|
503
512
|
context: buildSkipContext?.(),
|
|
504
513
|
submit: true,
|
|
505
514
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guided-questions.js","sourceRoot":"","sources":["../../src/client/guided-questions.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconCheck,\n IconChevronRight,\n IconHelpCircle,\n IconUpload,\n IconX,\n} from \"@tabler/icons-react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { sendToAgentChat } from \"./agent-chat.js\";\nimport { agentNativePath } from \"./api-path.js\";\nimport { setClientAppState } from \"./application-state.js\";\nimport { cn } from \"./utils.js\";\n\nexport type GuidedQuestionType =\n | \"text-options\"\n | \"color-options\"\n | \"slider\"\n | \"file\"\n | \"freeform\";\n\nexport interface GuidedQuestionOption {\n label: string;\n value: string;\n color?: string;\n icon?: string;\n description?: string;\n recommended?: boolean;\n /** Optional preview content (mockup, code snippet, or short comparison)\n * shown beneath the option to help the user compare choices. Mirrors the\n * `preview` field of Claude Code's AskUserQuestion options. */\n preview?: string;\n}\n\nexport interface GuidedQuestion {\n id: string;\n type: GuidedQuestionType;\n header?: string;\n question: string;\n description?: string;\n options?: GuidedQuestionOption[];\n choices?: GuidedQuestionOption[];\n multiSelect?: boolean;\n min?: number;\n max?: number;\n step?: number;\n required?: boolean;\n placeholder?: string;\n allowOther?: boolean;\n includeExplore?: boolean;\n includeDecide?: boolean;\n}\n\nexport type GuidedQuestionAnswers = Record<string, unknown>;\n\nexport interface GuidedQuestionPayload {\n questions: GuidedQuestion[];\n title?: string;\n description?: string;\n skipLabel?: string;\n submitLabel?: string;\n /**\n * @internal Set by {@link askUserQuestion} for client-initiated questions.\n * When present, `useGuidedQuestionFlow` resolves the matching in-memory\n * promise with the answer instead of forwarding it to the agent chat.\n */\n clientResolveId?: string;\n}\n\nconst OTHER_OPTION_PREFIX = \"__other__:\";\nconst EXPLORE_OPTION: GuidedQuestionOption = {\n label: \"Explore a few options\",\n value: \"__explore__\",\n description: \"Show me a few distinct directions before committing.\",\n};\nconst DECIDE_OPTION: GuidedQuestionOption = {\n label: \"Decide for me\",\n value: \"__decide__\",\n description: \"Use your judgment and keep moving.\",\n};\n\nfunction isFileLike(value: unknown): value is { name: string } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"name\" in value &&\n typeof (value as { name?: unknown }).name === \"string\"\n );\n}\n\nexport function isOtherGuidedAnswer(value: unknown): value is string {\n return typeof value === \"string\" && value.startsWith(OTHER_OPTION_PREFIX);\n}\n\nexport function getOtherGuidedAnswerText(value: unknown): string {\n return isOtherGuidedAnswer(value)\n ? value.slice(OTHER_OPTION_PREFIX.length)\n : \"\";\n}\n\nexport function makeOtherGuidedAnswer(text = \"\"): string {\n return `${OTHER_OPTION_PREFIX}${text}`;\n}\n\nexport function hasGuidedAnswer(value: unknown): boolean {\n if (value == null || value === \"\") return false;\n if (Array.isArray(value)) return value.some(hasGuidedAnswer);\n if (isOtherGuidedAnswer(value)) {\n return getOtherGuidedAnswerText(value).trim().length > 0;\n }\n return true;\n}\n\nexport function formatGuidedAnswerValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(formatGuidedAnswerValue).filter(hasGuidedAnswer);\n }\n if (isOtherGuidedAnswer(value)) {\n const text = getOtherGuidedAnswerText(value).trim();\n return text ? `Other: ${text}` : \"\";\n }\n if (isFileLike(value)) return value.name;\n return value;\n}\n\nexport function normalizeGuidedAnswers(\n answers: GuidedQuestionAnswers,\n): GuidedQuestionAnswers {\n return Object.fromEntries(\n Object.entries(answers).map(([id, value]) => [\n id,\n formatGuidedAnswerValue(value),\n ]),\n );\n}\n\nexport function formatGuidedAnswersForAgent(\n answers: GuidedQuestionAnswers,\n): string {\n return Object.entries(normalizeGuidedAnswers(answers))\n .filter(([, value]) => hasGuidedAnswer(value))\n .map(([id, value]) => {\n if (Array.isArray(value)) return `${id}: ${value.join(\", \")}`;\n return `${id}: ${String(value)}`;\n })\n .join(\"\\n\");\n}\n\n/** A single option for {@link askUserQuestion}. Mirrors the agent `ask-question`\n * tool and Claude Code's AskUserQuestion option shape. */\nexport interface AskUserQuestionOption {\n /** Display text the user picks (1-5 words). */\n label: string;\n /** Value reported back. Defaults to `label` when omitted. */\n value?: string;\n /** Short explanation of the trade-off. */\n description?: string;\n /** Optional preview (mockup, code snippet, short comparison) shown under the option. */\n preview?: string;\n /** Mark the most likely option so the UI highlights it. */\n recommended?: boolean;\n}\n\n/** Input for {@link askUserQuestion}. */\nexport interface AskUserQuestionInput {\n /** The complete question. Clear, specific, ends with a question mark. */\n question: string;\n /** Optional very short chip/heading (≈12 chars), e.g. \"Date range\". */\n header?: string;\n /** 2-4 distinct options (mutually exclusive unless `allowMultiple`). */\n options: AskUserQuestionOption[];\n /** Allow a free-text \"Other\" answer. Default `true`. */\n allowFreeText?: boolean;\n /** Allow selecting more than one option (multi-select). Default `false`. */\n allowMultiple?: boolean;\n /** Application-state key the agent panel polls. Default `\"guided-questions\"`. */\n stateKey?: string;\n}\n\nconst GUIDED_QUESTIONS_STATE_KEY = \"guided-questions\";\n\n/** The user's answer to an {@link askUserQuestion}: the selected option\n * value(s), the free-text \"Other\" string, or `null` if the user skipped. */\nexport type AskUserQuestionResult = string | string[] | null;\n\n// In-memory resolver registry shared between `askUserQuestion` (which registers\n// a resolver and writes the question to application state) and\n// `useGuidedQuestionFlow` (which renders the question and, on submit/skip,\n// resolves the matching promise). Same module → the map is shared.\ntype AskQuestionResolver = (answer: AskUserQuestionResult) => void;\nconst clientQuestionResolvers = new Map<string, AskQuestionResolver>();\nlet askQuestionCounter = 0;\n\nfunction nextClientResolveId(): string {\n askQuestionCounter += 1;\n const rand =\n typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\"\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n return `askq-${askQuestionCounter}-${rand}`;\n}\n\n/** Resolve a pending client-initiated question by id. Returns false when no\n * resolver is registered (e.g. an agent-initiated question, or a reload). */\nfunction resolveClientQuestion(\n id: string,\n answer: AskUserQuestionResult,\n): boolean {\n const resolver = clientQuestionResolvers.get(id);\n if (!resolver) return false;\n clientQuestionResolvers.delete(id);\n resolver(answer);\n return true;\n}\n\n/** Pull the answer for a single guided question out of the answers map,\n * normalizing \"Other\" free-text and multi-select arrays. */\nfunction extractSingleAnswer(\n answers: GuidedQuestionAnswers,\n questionId: string,\n): AskUserQuestionResult {\n const raw = answers[questionId];\n if (!hasGuidedAnswer(raw)) return null;\n if (Array.isArray(raw)) {\n const values = raw\n .map((v) =>\n isOtherGuidedAnswer(v) ? getOtherGuidedAnswerText(v).trim() : String(v),\n )\n .filter((s) => s.length > 0);\n return values.length ? values : null;\n }\n if (isOtherGuidedAnswer(raw)) {\n const text = getOtherGuidedAnswerText(raw).trim();\n return text.length ? text : null;\n }\n return String(raw);\n}\n\n/**\n * Ask the user a multiple-choice question from app code and render it inline in\n * the agent panel — the client-side twin of the agent's `ask-question` tool.\n *\n * The question is written to application state (`\"guided-questions\"` by\n * default), where the mounted `GuidedQuestionFlow` (driven by\n * {@link useGuidedQuestionFlow}) renders it, and the agent panel is revealed so\n * it's visible. **Resolves with the user's answer** — the selected option\n * value (or `value[]` when `allowMultiple`), the free-text \"Other\" string, or\n * `null` if they skip — so the caller can branch on it (e.g. build the right\n * generate prompt before kicking off agent work):\n *\n * ```ts\n * const length = await askUserQuestion({\n * question: \"How long should this deck be?\",\n * header: \"Deck length\",\n * options: [{ label: \"Short\", recommended: true }, { label: \"Long\" }],\n * });\n * if (length) sendToAgentChat({ message: `Make a ${length} deck`, submit: true });\n * ```\n *\n * Requires the agent panel (the mounted `GuidedQuestionFlow`) to exist, which\n * it does in every template. The returned promise stays pending until the user\n * answers or skips.\n */\nexport async function askUserQuestion(\n input: AskUserQuestionInput,\n): Promise<AskUserQuestionResult> {\n const question = String(input?.question ?? \"\").trim();\n if (!question) {\n throw new TypeError(\"askUserQuestion: `question` is required.\");\n }\n const header =\n typeof input.header === \"string\" && input.header.trim()\n ? input.header.trim()\n : undefined;\n const allowMultiple = input.allowMultiple === true;\n const allowFreeText = input.allowFreeText !== false;\n\n const options: GuidedQuestionOption[] = (\n Array.isArray(input.options) ? input.options : []\n )\n .map((raw): GuidedQuestionOption | null => {\n const label =\n typeof raw?.label === \"string\" && raw.label.trim()\n ? raw.label.trim()\n : typeof raw?.value === \"string\"\n ? String(raw.value).trim()\n : \"\";\n if (!label) return null;\n const value =\n typeof raw?.value === \"string\" && raw.value.trim()\n ? raw.value.trim()\n : label;\n const option: GuidedQuestionOption = { label, value };\n if (typeof raw.description === \"string\" && raw.description.trim()) {\n option.description = raw.description.trim();\n }\n if (typeof raw.preview === \"string\" && raw.preview.trim()) {\n option.preview = raw.preview;\n }\n if (raw.recommended === true) option.recommended = true;\n return option;\n })\n .filter((opt): opt is GuidedQuestionOption => opt !== null);\n\n if (options.length === 0) {\n throw new TypeError(\n \"askUserQuestion: `options` must contain at least one option with a label.\",\n );\n }\n\n const resolveId = nextClientResolveId();\n const payload: GuidedQuestionPayload = {\n clientResolveId: resolveId,\n questions: [\n {\n id: \"q1\",\n type: \"text-options\",\n question,\n ...(header ? { header } : {}),\n required: !allowFreeText,\n multiSelect: allowMultiple,\n allowOther: allowFreeText,\n includeExplore: false,\n includeDecide: false,\n options,\n },\n ],\n };\n\n const answerPromise = new Promise<AskUserQuestionResult>((resolve) => {\n clientQuestionResolvers.set(resolveId, resolve);\n });\n\n // Reveal the agent panel so the inline question is visible even if collapsed.\n if (typeof window !== \"undefined\") {\n try {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n } catch {\n // best-effort — the question still renders if the panel is already open\n }\n }\n\n try {\n await setClientAppState(\n input.stateKey ?? GUIDED_QUESTIONS_STATE_KEY,\n payload,\n );\n } catch (err) {\n clientQuestionResolvers.delete(resolveId);\n throw err;\n }\n\n return answerPromise;\n}\n\nfunction optionKey(option: GuidedQuestionOption): string {\n return `${option.value.toLowerCase()}::${option.label.toLowerCase()}`;\n}\n\n/** Stable content hash so poll refreshes do not reset in-progress answers. */\nexport function guidedQuestionsFingerprint(\n questions: GuidedQuestion[],\n): string {\n return JSON.stringify(\n questions.map((question) => ({\n id: question.id,\n type: question.type,\n header: question.header ?? null,\n question: question.question,\n description: question.description ?? null,\n multiSelect: question.multiSelect ?? false,\n required: question.required ?? false,\n allowOther: question.allowOther ?? null,\n includeExplore: question.includeExplore ?? null,\n includeDecide: question.includeDecide ?? null,\n min: question.min ?? null,\n max: question.max ?? null,\n step: question.step ?? null,\n placeholder: question.placeholder ?? null,\n options: (question.options ?? question.choices ?? []).map((option) => ({\n label: option.label,\n value: option.value,\n color: option.color ?? null,\n description: option.description ?? null,\n recommended: option.recommended ?? false,\n })),\n })),\n );\n}\n\nfunction withDefaultOptions(question: GuidedQuestion): GuidedQuestionOption[] {\n const base = question.options ?? question.choices ?? [];\n const seen = new Set(base.map(optionKey));\n const result = [...base];\n const maybePush = (option: GuidedQuestionOption, enabled: boolean) => {\n if (!enabled) return;\n const key = optionKey(option);\n const label = option.label.toLowerCase();\n const value = option.value.toLowerCase();\n const duplicate = result.some(\n (existing) =>\n optionKey(existing) === key ||\n existing.label.toLowerCase() === label ||\n existing.value.toLowerCase() === value,\n );\n if (duplicate || seen.has(key)) return;\n seen.add(key);\n result.push(option);\n };\n maybePush(EXPLORE_OPTION, question.includeExplore !== false);\n maybePush(DECIDE_OPTION, question.includeDecide !== false);\n return result;\n}\n\nexport interface GuidedQuestionFlowProps {\n questions: GuidedQuestion[];\n onSubmit: (answers: GuidedQuestionAnswers) => void;\n onSkip: () => void;\n title?: string;\n description?: string;\n skipLabel?: string;\n submitLabel?: string;\n className?: string;\n}\n\nexport function GuidedQuestionFlow({\n questions,\n onSubmit,\n onSkip,\n title = \"A few choices before I generate\",\n description = \"Pick what you know. Use Other for anything that does not fit, or let the agent decide.\",\n skipLabel = \"Skip\",\n submitLabel = \"Continue\",\n className,\n}: GuidedQuestionFlowProps) {\n const [answers, setAnswers] = useState<GuidedQuestionAnswers>({});\n const questionsFingerprint = useMemo(\n () => guidedQuestionsFingerprint(questions),\n [questions],\n );\n\n useEffect(() => {\n setAnswers({});\n }, [questionsFingerprint]);\n\n const setAnswer = useCallback((id: string, value: unknown) => {\n setAnswers((prev) => ({ ...prev, [id]: value }));\n }, []);\n\n const allRequiredAnswered = questions\n .filter((question) => question.required)\n .every((question) => hasGuidedAnswer(answers[question.id]));\n\n return (\n <div\n className={cn(\n \"flex h-full w-full items-center justify-center bg-background text-foreground\",\n className,\n )}\n >\n <div className=\"flex max-h-full w-full max-w-3xl flex-col px-4 py-6 sm:px-8 sm:py-10\">\n <div className=\"mb-6 flex items-start gap-3\">\n <div className=\"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-muted/40 text-primary\">\n <IconHelpCircle className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0\">\n <h2 className=\"text-xl font-semibold tracking-normal text-foreground sm:text-2xl\">\n {title}\n </h2>\n {description && (\n <p className=\"mt-1 max-w-2xl text-sm leading-5 text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"min-h-0 flex-1 space-y-4 overflow-y-auto pe-1\">\n {questions.map((question, index) => (\n <QuestionCard\n key={question.id}\n index={index}\n question={question}\n value={answers[question.id]}\n onChange={(value) => setAnswer(question.id, value)}\n />\n ))}\n </div>\n\n <div className=\"mt-5 flex shrink-0 items-center justify-between gap-4 border-t border-border pt-4\">\n <div className=\"flex items-center gap-1.5\">\n {questions.map((question, index) => (\n <span\n key={question.id || index}\n className={cn(\n \"h-1.5 w-1.5 rounded-full\",\n hasGuidedAnswer(answers[question.id])\n ? \"bg-primary\"\n : \"bg-muted-foreground/30\",\n )}\n />\n ))}\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={onSkip}\n className=\"cursor-pointer rounded-md px-3 py-2 text-sm text-muted-foreground transition-colors hover:bg-muted/60 hover:text-foreground\"\n >\n {skipLabel}\n </button>\n <button\n type=\"button\"\n onClick={() => onSubmit(normalizeGuidedAnswers(answers))}\n disabled={!allRequiredAnswered}\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-md bg-primary px-3.5 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-45\"\n >\n {submitLabel}\n <IconChevronRight className=\"h-4 w-4 rtl:-scale-x-100\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction QuestionCard({\n index,\n question,\n value,\n onChange,\n}: {\n index: number;\n question: GuidedQuestion;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n return (\n <section className=\"rounded-lg border border-border bg-card/65 p-4 shadow-sm\">\n <div className=\"mb-3 flex gap-3\">\n <div className=\"flex h-6 min-w-6 items-center justify-center rounded-md bg-muted text-xs font-medium text-muted-foreground\">\n {index + 1}\n </div>\n <div className=\"min-w-0\">\n {question.header && (\n <p className=\"mb-1 text-[11px] font-medium uppercase text-muted-foreground\">\n {question.header}\n </p>\n )}\n <h3 className=\"text-sm font-medium leading-5 text-foreground\">\n {question.question}\n {question.required && (\n <span className=\"ms-1 text-destructive\">*</span>\n )}\n </h3>\n {question.description && (\n <p className=\"mt-1 text-xs leading-5 text-muted-foreground\">\n {question.description}\n </p>\n )}\n </div>\n </div>\n\n {question.type === \"text-options\" && (\n <TextOptions question={question} value={value} onChange={onChange} />\n )}\n {question.type === \"color-options\" && (\n <ColorOptions question={question} value={value} onChange={onChange} />\n )}\n {question.type === \"slider\" && (\n <SliderQuestion question={question} value={value} onChange={onChange} />\n )}\n {question.type === \"file\" && (\n <FileDropZone value={value} onChange={onChange} />\n )}\n {question.type === \"freeform\" && (\n <textarea\n value={typeof value === \"string\" ? value : \"\"}\n onChange={(event) => onChange(event.target.value)}\n placeholder={question.placeholder ?? \"Type your answer...\"}\n className=\"min-h-[84px] w-full resize-none rounded-md border border-border bg-muted/45 px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground/70 focus:border-primary\"\n />\n )}\n </section>\n );\n}\n\nfunction TextOptions({\n question,\n value,\n onChange,\n}: {\n question: GuidedQuestion;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const options = useMemo(() => withDefaultOptions(question), [question]);\n const multiSelect = question.multiSelect === true;\n const selectedValues = Array.isArray(value) ? value : [];\n const otherSelected = multiSelect\n ? selectedValues.some(isOtherGuidedAnswer)\n : isOtherGuidedAnswer(value);\n const otherText = multiSelect\n ? getOtherGuidedAnswerText(selectedValues.find(isOtherGuidedAnswer))\n : getOtherGuidedAnswerText(value);\n\n const isSelected = (optionValue: string) =>\n multiSelect ? selectedValues.includes(optionValue) : value === optionValue;\n\n const toggleOption = (optionValue: string) => {\n if (!multiSelect) {\n onChange(optionValue);\n return;\n }\n const next = selectedValues.includes(optionValue)\n ? selectedValues.filter((item) => item !== optionValue)\n : [...selectedValues, optionValue];\n onChange(next);\n };\n\n const toggleOther = () => {\n if (!multiSelect) {\n onChange(otherSelected ? \"\" : makeOtherGuidedAnswer());\n return;\n }\n if (otherSelected) {\n onChange(selectedValues.filter((item) => !isOtherGuidedAnswer(item)));\n return;\n }\n onChange([...selectedValues, makeOtherGuidedAnswer()]);\n };\n\n const setOtherText = (text: string) => {\n const nextOther = makeOtherGuidedAnswer(text);\n if (!multiSelect) {\n onChange(nextOther);\n return;\n }\n onChange([\n ...selectedValues.filter((item) => !isOtherGuidedAnswer(item)),\n nextOther,\n ]);\n };\n\n const allowOther = question.allowOther !== false;\n\n return (\n <div className=\"space-y-3\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {options.map((option) => (\n <OptionButton\n key={`${option.value}:${option.label}`}\n option={option}\n selected={isSelected(option.value)}\n multiSelect={multiSelect}\n onClick={() => toggleOption(option.value)}\n />\n ))}\n {allowOther && (\n <OptionButton\n option={{\n label: \"Other...\",\n value: \"__other__\",\n description: \"Tell the agent exactly what you mean.\",\n }}\n selected={otherSelected}\n multiSelect={multiSelect}\n onClick={toggleOther}\n />\n )}\n </div>\n {allowOther && otherSelected && (\n <textarea\n autoFocus\n value={otherText}\n onChange={(event) => setOtherText(event.target.value)}\n placeholder={question.placeholder ?? \"Type a custom answer...\"}\n className=\"min-h-[72px] w-full resize-none rounded-md border border-border bg-muted/45 px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground/70 focus:border-primary\"\n />\n )}\n </div>\n );\n}\n\nfunction OptionButton({\n option,\n selected,\n multiSelect,\n onClick,\n}: {\n option: GuidedQuestionOption;\n selected: boolean;\n multiSelect?: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-pressed={selected}\n className={cn(\n \"group flex min-h-[56px] cursor-pointer items-start gap-2 rounded-md border px-3 py-2 text-start transition-colors\",\n selected\n ? \"border-primary bg-primary/10 text-foreground ring-2 ring-primary/25\"\n : \"border-border bg-muted/30 text-muted-foreground hover:border-muted-foreground/50 hover:bg-muted/45 hover:text-foreground\",\n )}\n >\n <span\n className={cn(\n \"mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center border\",\n multiSelect ? \"rounded-sm\" : \"rounded-full\",\n selected\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-border bg-background\",\n )}\n aria-hidden\n >\n {selected && <IconCheck className=\"h-3 w-3\" />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex flex-wrap items-center gap-1.5 text-sm font-medium leading-5\">\n {option.label}\n {option.recommended && (\n <span className=\"rounded-sm bg-primary/15 px-1.5 py-0.5 text-[10px] font-medium uppercase text-primary\">\n Recommended\n </span>\n )}\n </span>\n {option.description && (\n <span className=\"mt-0.5 block text-xs leading-4 text-muted-foreground\">\n {option.description}\n </span>\n )}\n {option.preview && (\n <span className=\"mt-1.5 block max-h-40 overflow-auto whitespace-pre-wrap rounded border border-border/60 bg-background/60 px-2 py-1.5 font-mono text-[11px] leading-4 text-muted-foreground\">\n {option.preview}\n </span>\n )}\n </span>\n </button>\n );\n}\n\nfunction ColorOptions({\n question,\n value,\n onChange,\n}: {\n question: GuidedQuestion;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const options = question.options ?? question.choices ?? [];\n const multiSelect = question.multiSelect === true;\n const selectedValues = Array.isArray(value) ? value : [];\n const isSelected = (optionValue: string) =>\n multiSelect ? selectedValues.includes(optionValue) : value === optionValue;\n\n const toggleOption = (optionValue: string) => {\n if (!multiSelect) {\n onChange(optionValue);\n return;\n }\n onChange(\n selectedValues.includes(optionValue)\n ? selectedValues.filter((item) => item !== optionValue)\n : [...selectedValues, optionValue],\n );\n };\n\n return (\n <div className=\"flex flex-wrap gap-3\">\n {options.map((option) => {\n const selected = isSelected(option.value);\n return (\n <button\n type=\"button\"\n key={`${option.value}:${option.label}`}\n onClick={() => toggleOption(option.value)}\n className=\"group flex cursor-pointer flex-col items-center gap-1.5\"\n >\n <span\n className={cn(\n \"h-10 w-10 rounded-full\",\n selected\n ? \"ring-2 ring-primary ring-offset-2 ring-offset-background\"\n : \"ring-1 ring-border group-hover:ring-muted-foreground/50\",\n )}\n style={{ backgroundColor: option.color || option.value }}\n />\n <span\n className={cn(\n \"max-w-20 truncate text-[10px]\",\n selected ? \"text-foreground\" : \"text-muted-foreground\",\n )}\n >\n {option.label}\n </span>\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction SliderQuestion({\n question,\n value,\n onChange,\n}: {\n question: GuidedQuestion;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const min = question.min ?? 0;\n const max = question.max ?? 100;\n const step = question.step ?? 1;\n const current =\n typeof value === \"number\" ? value : Math.round((min + max) / 2);\n\n return (\n <div className=\"flex items-center gap-4\">\n <span className=\"w-8 text-xs text-muted-foreground\">{min}</span>\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={current}\n onChange={(event) => onChange(Number(event.target.value))}\n className=\"h-2 flex-1 cursor-pointer accent-primary\"\n />\n <span className=\"w-8 text-end text-xs text-muted-foreground\">{max}</span>\n <span className=\"min-w-10 text-end text-sm font-medium tabular-nums text-foreground\">\n {current}\n </span>\n </div>\n );\n}\n\nfunction FileDropZone({\n value,\n onChange,\n}: {\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const [dragOver, setDragOver] = useState(false);\n const files: File[] = Array.isArray(value) ? (value as File[]) : [];\n\n const addFiles = (incoming: File[]) => onChange([...files, ...incoming]);\n const removeFile = (index: number) =>\n onChange(files.filter((_, fileIndex) => fileIndex !== index));\n\n return (\n <div>\n <div\n onDragOver={(event) => {\n event.preventDefault();\n setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={(event) => {\n event.preventDefault();\n setDragOver(false);\n addFiles(Array.from(event.dataTransfer.files));\n }}\n className={cn(\n \"flex cursor-pointer flex-col items-center justify-center rounded-md border-2 border-dashed p-5 transition-colors\",\n dragOver\n ? \"border-primary bg-primary/5\"\n : \"border-border bg-muted/30 hover:border-muted-foreground/50\",\n )}\n >\n <IconUpload className=\"mb-2 h-5 w-5 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n Drag files here or{\" \"}\n <label className=\"cursor-pointer text-primary hover:underline\">\n browse\n <input\n type=\"file\"\n multiple\n onChange={(event) => {\n if (event.target.files)\n addFiles(Array.from(event.target.files));\n event.currentTarget.value = \"\";\n }}\n className=\"hidden\"\n />\n </label>\n </p>\n </div>\n\n {files.length > 0 && (\n <div className=\"mt-2 space-y-1\">\n {files.map((file, index) => (\n <div\n key={`${file.name}:${index}`}\n className=\"flex items-center gap-2 rounded-md bg-muted/50 px-2 py-1 text-xs text-muted-foreground\"\n >\n <IconCheck className=\"h-3 w-3 text-primary\" />\n <span className=\"min-w-0 flex-1 truncate\">{file.name}</span>\n <button\n type=\"button\"\n onClick={() => removeFile(index)}\n className=\"cursor-pointer text-muted-foreground/70 hover:text-foreground\"\n aria-label={`Remove ${file.name}`}\n >\n <IconX className=\"h-3 w-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nconst SAFE_BROWSER_TAB_ID_RE = /^[A-Za-z0-9_-]{1,96}$/;\n\nfunction normalizeBrowserTabId(browserTabId?: string): string | undefined {\n if (typeof browserTabId !== \"string\") return undefined;\n const trimmed = browserTabId.trim();\n return SAFE_BROWSER_TAB_ID_RE.test(trimmed) ? trimmed : undefined;\n}\n\nexport interface UseGuidedQuestionFlowOptions {\n stateKey?: string;\n /**\n * The current browser tab id. Agent actions that write the guided-questions\n * payload scope the application-state key per tab (`<key>:<tabId>`), so the\n * client must read the scoped key first and fall back to the bare key. Without\n * this, the question card never renders when the agent run carries a tab id\n * (which it almost always does — see `sessionBrowserTabId`).\n */\n browserTabId?: string;\n queryKey?: readonly unknown[];\n refetchInterval?: number | false;\n submitMessage?: string;\n skipMessage?: string;\n buildSubmitContext?: (args: {\n answers: GuidedQuestionAnswers;\n formattedAnswers: string;\n }) => string;\n buildSkipContext?: () => string;\n}\n\nexport function useGuidedQuestionFlow({\n stateKey = \"show-questions\",\n browserTabId,\n queryKey = [\"show-questions\"],\n refetchInterval = 2_000,\n submitMessage = \"Here are my answers — go ahead.\",\n skipMessage = \"Skip the questions — decide for me.\",\n buildSubmitContext,\n buildSkipContext,\n}: UseGuidedQuestionFlowOptions = {}) {\n const queryClient = useQueryClient();\n const [payload, setPayload] = useState<GuidedQuestionPayload | null>(null);\n const normalizedBrowserTabId = useMemo(\n () => normalizeBrowserTabId(browserTabId),\n [browserTabId],\n );\n const endpointFor = useCallback(\n (key: string) => agentNativePath(`/_agent-native/application-state/${key}`),\n [],\n );\n const scopedKey = normalizedBrowserTabId\n ? `${stateKey}:${normalizedBrowserTabId}`\n : stateKey;\n // Match the queryKey to the scope so two tabs polling different scoped keys\n // don't share a cache entry.\n const resolvedQueryKey = useMemo(\n () => [...queryKey, normalizedBrowserTabId ?? \"global\"],\n [queryKey, normalizedBrowserTabId],\n );\n\n const resolvedRefetchInterval =\n refetchInterval === false\n ? false\n : (query: { state: { data?: GuidedQuestionPayload | null } }) => {\n const activeQuestions = query.state.data?.questions;\n if (Array.isArray(activeQuestions) && activeQuestions.length > 0) {\n return false;\n }\n return refetchInterval;\n };\n\n const { data } = useQuery({\n queryKey: resolvedQueryKey,\n queryFn: async () => {\n const read = async (key: string) => {\n const res = await fetch(endpointFor(key));\n if (!res.ok) return null;\n const text = await res.text();\n if (!text) return null;\n try {\n const parsed = JSON.parse(text);\n if (Array.isArray(parsed?.questions) && parsed.questions.length > 0) {\n return parsed as GuidedQuestionPayload;\n }\n } catch {\n return null;\n }\n return null;\n };\n // Agent writes are tab-scoped; read the scoped key first, then fall back\n // to the bare key (e.g. a deterministic write that omits the tab id).\n return (\n (normalizedBrowserTabId ? await read(scopedKey) : null) ??\n (await read(stateKey))\n );\n },\n refetchInterval: resolvedRefetchInterval,\n structuralSharing: false,\n });\n\n useEffect(() => {\n if (Array.isArray(data?.questions) && data.questions.length > 0) {\n setPayload((prev) => {\n if (\n prev &&\n guidedQuestionsFingerprint(prev.questions) ===\n guidedQuestionsFingerprint(data.questions)\n ) {\n return prev;\n }\n return data;\n });\n } else {\n setPayload(null);\n }\n }, [data]);\n\n const clear = useCallback(() => {\n setPayload(null);\n queryClient.setQueryData(resolvedQueryKey, null);\n const del = (key: string) =>\n fetch(endpointFor(key), {\n method: \"DELETE\",\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n }).catch(() => {});\n // Clear whichever key actually held the payload (scoped or bare) so the\n // card doesn't reappear on the next poll.\n del(scopedKey);\n if (scopedKey !== stateKey) del(stateKey);\n }, [endpointFor, queryClient, resolvedQueryKey, scopedKey, stateKey]);\n\n const handleSubmit = useCallback(\n (answers: GuidedQuestionAnswers) => {\n // Client-initiated question (askUserQuestion): resolve the caller's\n // promise with the answer instead of forwarding it to the agent chat.\n const resolveId = payload?.clientResolveId;\n if (resolveId) {\n const firstId = payload?.questions?.[0]?.id ?? \"q1\";\n resolveClientQuestion(resolveId, extractSingleAnswer(answers, firstId));\n clear();\n return;\n }\n const formattedAnswers = formatGuidedAnswersForAgent(answers);\n const context =\n buildSubmitContext?.({ answers, formattedAnswers }) ??\n [\n \"The user answered the pre-generation questions.\",\n \"\",\n \"Answers:\",\n formattedAnswers,\n ].join(\"\\n\");\n sendToAgentChat({ message: submitMessage, context, submit: true });\n clear();\n },\n [buildSubmitContext, clear, payload, submitMessage],\n );\n\n const handleSkip = useCallback(() => {\n const resolveId = payload?.clientResolveId;\n if (resolveId) {\n resolveClientQuestion(resolveId, null);\n clear();\n return;\n }\n sendToAgentChat({\n message: skipMessage,\n context: buildSkipContext?.(),\n submit: true,\n });\n clear();\n }, [buildSkipContext, clear, payload, skipMessage]);\n\n return {\n payload,\n questions: payload?.questions ?? null,\n title: payload?.title,\n description: payload?.description,\n skipLabel: payload?.skipLabel,\n submitLabel: payload?.submitLabel,\n clear,\n handleSubmit,\n handleSkip,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"guided-questions.js","sourceRoot":"","sources":["../../src/client/guided-questions.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconCheck,\n IconChevronRight,\n IconHelpCircle,\n IconUpload,\n IconX,\n} from \"@tabler/icons-react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { sendToAgentChat } from \"./agent-chat.js\";\nimport { agentNativePath } from \"./api-path.js\";\nimport { setClientAppState } from \"./application-state.js\";\nimport { cn } from \"./utils.js\";\n\nexport type GuidedQuestionType =\n | \"text-options\"\n | \"color-options\"\n | \"slider\"\n | \"file\"\n | \"freeform\";\n\nexport interface GuidedQuestionOption {\n label: string;\n value: string;\n color?: string;\n icon?: string;\n description?: string;\n recommended?: boolean;\n /** Optional preview content (mockup, code snippet, or short comparison)\n * shown beneath the option to help the user compare choices. Mirrors the\n * `preview` field of Claude Code's AskUserQuestion options. */\n preview?: string;\n}\n\nexport interface GuidedQuestion {\n id: string;\n type: GuidedQuestionType;\n header?: string;\n question: string;\n description?: string;\n options?: GuidedQuestionOption[];\n choices?: GuidedQuestionOption[];\n multiSelect?: boolean;\n min?: number;\n max?: number;\n step?: number;\n required?: boolean;\n placeholder?: string;\n allowOther?: boolean;\n includeExplore?: boolean;\n includeDecide?: boolean;\n /** Submit immediately when a single-select option is clicked. */\n submitOnSelect?: boolean;\n}\n\nexport type GuidedQuestionAnswers = Record<string, unknown>;\n\nexport interface GuidedQuestionPayload {\n questions: GuidedQuestion[];\n title?: string;\n description?: string;\n skipLabel?: string;\n submitLabel?: string;\n submitMessage?: string;\n skipMessage?: string;\n /**\n * @internal Set by {@link askUserQuestion} for client-initiated questions.\n * When present, `useGuidedQuestionFlow` resolves the matching in-memory\n * promise with the answer instead of forwarding it to the agent chat.\n */\n clientResolveId?: string;\n}\n\nconst OTHER_OPTION_PREFIX = \"__other__:\";\nconst EXPLORE_OPTION: GuidedQuestionOption = {\n label: \"Explore a few options\",\n value: \"__explore__\",\n description: \"Show me a few distinct directions before committing.\",\n};\nconst DECIDE_OPTION: GuidedQuestionOption = {\n label: \"Decide for me\",\n value: \"__decide__\",\n description: \"Use your judgment and keep moving.\",\n};\n\nfunction isFileLike(value: unknown): value is { name: string } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"name\" in value &&\n typeof (value as { name?: unknown }).name === \"string\"\n );\n}\n\nexport function isOtherGuidedAnswer(value: unknown): value is string {\n return typeof value === \"string\" && value.startsWith(OTHER_OPTION_PREFIX);\n}\n\nexport function getOtherGuidedAnswerText(value: unknown): string {\n return isOtherGuidedAnswer(value)\n ? value.slice(OTHER_OPTION_PREFIX.length)\n : \"\";\n}\n\nexport function makeOtherGuidedAnswer(text = \"\"): string {\n return `${OTHER_OPTION_PREFIX}${text}`;\n}\n\nexport function hasGuidedAnswer(value: unknown): boolean {\n if (value == null || value === \"\") return false;\n if (Array.isArray(value)) return value.some(hasGuidedAnswer);\n if (isOtherGuidedAnswer(value)) {\n return getOtherGuidedAnswerText(value).trim().length > 0;\n }\n return true;\n}\n\nexport function formatGuidedAnswerValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(formatGuidedAnswerValue).filter(hasGuidedAnswer);\n }\n if (isOtherGuidedAnswer(value)) {\n const text = getOtherGuidedAnswerText(value).trim();\n return text ? `Other: ${text}` : \"\";\n }\n if (isFileLike(value)) return value.name;\n return value;\n}\n\nexport function normalizeGuidedAnswers(\n answers: GuidedQuestionAnswers,\n): GuidedQuestionAnswers {\n return Object.fromEntries(\n Object.entries(answers).map(([id, value]) => [\n id,\n formatGuidedAnswerValue(value),\n ]),\n );\n}\n\nexport function formatGuidedAnswersForAgent(\n answers: GuidedQuestionAnswers,\n): string {\n return Object.entries(normalizeGuidedAnswers(answers))\n .filter(([, value]) => hasGuidedAnswer(value))\n .map(([id, value]) => {\n if (Array.isArray(value)) return `${id}: ${value.join(\", \")}`;\n return `${id}: ${String(value)}`;\n })\n .join(\"\\n\");\n}\n\n/** A single option for {@link askUserQuestion}. Mirrors the agent `ask-question`\n * tool and Claude Code's AskUserQuestion option shape. */\nexport interface AskUserQuestionOption {\n /** Display text the user picks (1-5 words). */\n label: string;\n /** Value reported back. Defaults to `label` when omitted. */\n value?: string;\n /** Short explanation of the trade-off. */\n description?: string;\n /** Optional preview (mockup, code snippet, short comparison) shown under the option. */\n preview?: string;\n /** Mark the most likely option so the UI highlights it. */\n recommended?: boolean;\n}\n\n/** Input for {@link askUserQuestion}. */\nexport interface AskUserQuestionInput {\n /** The complete question. Clear, specific, ends with a question mark. */\n question: string;\n /** Optional very short chip/heading (≈12 chars), e.g. \"Date range\". */\n header?: string;\n /** 2-4 distinct options (mutually exclusive unless `allowMultiple`). */\n options: AskUserQuestionOption[];\n /** Allow a free-text \"Other\" answer. Default `true`. */\n allowFreeText?: boolean;\n /** Allow selecting more than one option (multi-select). Default `false`. */\n allowMultiple?: boolean;\n /** Application-state key the agent panel polls. Default `\"guided-questions\"`. */\n stateKey?: string;\n}\n\nconst GUIDED_QUESTIONS_STATE_KEY = \"guided-questions\";\n\n/** The user's answer to an {@link askUserQuestion}: the selected option\n * value(s), the free-text \"Other\" string, or `null` if the user skipped. */\nexport type AskUserQuestionResult = string | string[] | null;\n\n// In-memory resolver registry shared between `askUserQuestion` (which registers\n// a resolver and writes the question to application state) and\n// `useGuidedQuestionFlow` (which renders the question and, on submit/skip,\n// resolves the matching promise). Same module → the map is shared.\ntype AskQuestionResolver = (answer: AskUserQuestionResult) => void;\nconst clientQuestionResolvers = new Map<string, AskQuestionResolver>();\nlet askQuestionCounter = 0;\n\nfunction nextClientResolveId(): string {\n askQuestionCounter += 1;\n const rand =\n typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\"\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n return `askq-${askQuestionCounter}-${rand}`;\n}\n\n/** Resolve a pending client-initiated question by id. Returns false when no\n * resolver is registered (e.g. an agent-initiated question, or a reload). */\nfunction resolveClientQuestion(\n id: string,\n answer: AskUserQuestionResult,\n): boolean {\n const resolver = clientQuestionResolvers.get(id);\n if (!resolver) return false;\n clientQuestionResolvers.delete(id);\n resolver(answer);\n return true;\n}\n\n/** Pull the answer for a single guided question out of the answers map,\n * normalizing \"Other\" free-text and multi-select arrays. */\nfunction extractSingleAnswer(\n answers: GuidedQuestionAnswers,\n questionId: string,\n): AskUserQuestionResult {\n const raw = answers[questionId];\n if (!hasGuidedAnswer(raw)) return null;\n if (Array.isArray(raw)) {\n const values = raw\n .map((v) =>\n isOtherGuidedAnswer(v) ? getOtherGuidedAnswerText(v).trim() : String(v),\n )\n .filter((s) => s.length > 0);\n return values.length ? values : null;\n }\n if (isOtherGuidedAnswer(raw)) {\n const text = getOtherGuidedAnswerText(raw).trim();\n return text.length ? text : null;\n }\n return String(raw);\n}\n\n/**\n * Ask the user a multiple-choice question from app code and render it inline in\n * the agent panel — the client-side twin of the agent's `ask-question` tool.\n *\n * The question is written to application state (`\"guided-questions\"` by\n * default), where the mounted `GuidedQuestionFlow` (driven by\n * {@link useGuidedQuestionFlow}) renders it, and the agent panel is revealed so\n * it's visible. **Resolves with the user's answer** — the selected option\n * value (or `value[]` when `allowMultiple`), the free-text \"Other\" string, or\n * `null` if they skip — so the caller can branch on it (e.g. build the right\n * generate prompt before kicking off agent work):\n *\n * ```ts\n * const length = await askUserQuestion({\n * question: \"How long should this deck be?\",\n * header: \"Deck length\",\n * options: [{ label: \"Short\", recommended: true }, { label: \"Long\" }],\n * });\n * if (length) sendToAgentChat({ message: `Make a ${length} deck`, submit: true });\n * ```\n *\n * Requires the agent panel (the mounted `GuidedQuestionFlow`) to exist, which\n * it does in every template. The returned promise stays pending until the user\n * answers or skips.\n */\nexport async function askUserQuestion(\n input: AskUserQuestionInput,\n): Promise<AskUserQuestionResult> {\n const question = String(input?.question ?? \"\").trim();\n if (!question) {\n throw new TypeError(\"askUserQuestion: `question` is required.\");\n }\n const header =\n typeof input.header === \"string\" && input.header.trim()\n ? input.header.trim()\n : undefined;\n const allowMultiple = input.allowMultiple === true;\n const allowFreeText = input.allowFreeText !== false;\n\n const options: GuidedQuestionOption[] = (\n Array.isArray(input.options) ? input.options : []\n )\n .map((raw): GuidedQuestionOption | null => {\n const label =\n typeof raw?.label === \"string\" && raw.label.trim()\n ? raw.label.trim()\n : typeof raw?.value === \"string\"\n ? String(raw.value).trim()\n : \"\";\n if (!label) return null;\n const value =\n typeof raw?.value === \"string\" && raw.value.trim()\n ? raw.value.trim()\n : label;\n const option: GuidedQuestionOption = { label, value };\n if (typeof raw.description === \"string\" && raw.description.trim()) {\n option.description = raw.description.trim();\n }\n if (typeof raw.preview === \"string\" && raw.preview.trim()) {\n option.preview = raw.preview;\n }\n if (raw.recommended === true) option.recommended = true;\n return option;\n })\n .filter((opt): opt is GuidedQuestionOption => opt !== null);\n\n if (options.length === 0) {\n throw new TypeError(\n \"askUserQuestion: `options` must contain at least one option with a label.\",\n );\n }\n\n const resolveId = nextClientResolveId();\n const payload: GuidedQuestionPayload = {\n clientResolveId: resolveId,\n questions: [\n {\n id: \"q1\",\n type: \"text-options\",\n question,\n ...(header ? { header } : {}),\n required: !allowFreeText,\n multiSelect: allowMultiple,\n allowOther: allowFreeText,\n includeExplore: false,\n includeDecide: false,\n options,\n },\n ],\n };\n\n const answerPromise = new Promise<AskUserQuestionResult>((resolve) => {\n clientQuestionResolvers.set(resolveId, resolve);\n });\n\n // Reveal the agent panel so the inline question is visible even if collapsed.\n if (typeof window !== \"undefined\") {\n try {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n } catch {\n // best-effort — the question still renders if the panel is already open\n }\n }\n\n try {\n await setClientAppState(\n input.stateKey ?? GUIDED_QUESTIONS_STATE_KEY,\n payload,\n );\n } catch (err) {\n clientQuestionResolvers.delete(resolveId);\n throw err;\n }\n\n return answerPromise;\n}\n\nfunction optionKey(option: GuidedQuestionOption): string {\n return `${option.value.toLowerCase()}::${option.label.toLowerCase()}`;\n}\n\n/** Stable content hash so poll refreshes do not reset in-progress answers. */\nexport function guidedQuestionsFingerprint(\n questions: GuidedQuestion[],\n): string {\n return JSON.stringify(\n questions.map((question) => ({\n id: question.id,\n type: question.type,\n header: question.header ?? null,\n question: question.question,\n description: question.description ?? null,\n multiSelect: question.multiSelect ?? false,\n required: question.required ?? false,\n allowOther: question.allowOther ?? null,\n includeExplore: question.includeExplore ?? null,\n includeDecide: question.includeDecide ?? null,\n submitOnSelect: question.submitOnSelect ?? false,\n min: question.min ?? null,\n max: question.max ?? null,\n step: question.step ?? null,\n placeholder: question.placeholder ?? null,\n options: (question.options ?? question.choices ?? []).map((option) => ({\n label: option.label,\n value: option.value,\n color: option.color ?? null,\n description: option.description ?? null,\n recommended: option.recommended ?? false,\n })),\n })),\n );\n}\n\nfunction withDefaultOptions(question: GuidedQuestion): GuidedQuestionOption[] {\n const base = question.options ?? question.choices ?? [];\n const seen = new Set(base.map(optionKey));\n const result = [...base];\n const maybePush = (option: GuidedQuestionOption, enabled: boolean) => {\n if (!enabled) return;\n const key = optionKey(option);\n const label = option.label.toLowerCase();\n const value = option.value.toLowerCase();\n const duplicate = result.some(\n (existing) =>\n optionKey(existing) === key ||\n existing.label.toLowerCase() === label ||\n existing.value.toLowerCase() === value,\n );\n if (duplicate || seen.has(key)) return;\n seen.add(key);\n result.push(option);\n };\n maybePush(EXPLORE_OPTION, question.includeExplore !== false);\n maybePush(DECIDE_OPTION, question.includeDecide !== false);\n return result;\n}\n\nexport interface GuidedQuestionFlowProps {\n questions: GuidedQuestion[];\n onSubmit: (answers: GuidedQuestionAnswers) => void;\n onSkip: () => void;\n title?: string;\n description?: string;\n skipLabel?: string;\n submitLabel?: string;\n className?: string;\n}\n\nexport function GuidedQuestionFlow({\n questions,\n onSubmit,\n onSkip,\n title = \"A few choices before I generate\",\n description = \"Pick what you know. Use Other for anything that does not fit, or let the agent decide.\",\n skipLabel = \"Skip\",\n submitLabel = \"Continue\",\n className,\n}: GuidedQuestionFlowProps) {\n const [answers, setAnswers] = useState<GuidedQuestionAnswers>({});\n const questionsFingerprint = useMemo(\n () => guidedQuestionsFingerprint(questions),\n [questions],\n );\n\n useEffect(() => {\n setAnswers({});\n }, [questionsFingerprint]);\n\n const setAnswer = useCallback((id: string, value: unknown) => {\n setAnswers((prev) => ({ ...prev, [id]: value }));\n }, []);\n const submitAnswers = useCallback(\n (nextAnswers: GuidedQuestionAnswers = answers) =>\n onSubmit(normalizeGuidedAnswers(nextAnswers)),\n [answers, onSubmit],\n );\n\n const allRequiredAnswered = questions\n .filter((question) => question.required)\n .every((question) => hasGuidedAnswer(answers[question.id]));\n\n return (\n <div\n className={cn(\n \"flex h-full w-full items-center justify-center bg-background text-foreground\",\n className,\n )}\n >\n <div className=\"flex max-h-full w-full max-w-3xl flex-col px-4 py-6 sm:px-8 sm:py-10\">\n <div className=\"mb-6 flex items-start gap-3\">\n <div className=\"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-muted/40 text-primary\">\n <IconHelpCircle className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0\">\n <h2 className=\"text-xl font-semibold tracking-normal text-foreground sm:text-2xl\">\n {title}\n </h2>\n {description && (\n <p className=\"mt-1 max-w-2xl text-sm leading-5 text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"min-h-0 flex-1 space-y-4 overflow-y-auto pe-1\">\n {questions.map((question, index) => (\n <QuestionCard\n key={question.id}\n index={index}\n question={question}\n value={answers[question.id]}\n onChange={(value) => setAnswer(question.id, value)}\n onSubmitAnswer={(value) =>\n submitAnswers({ ...answers, [question.id]: value })\n }\n />\n ))}\n </div>\n\n <div className=\"mt-5 flex shrink-0 items-center justify-between gap-4 border-t border-border pt-4\">\n <div className=\"flex items-center gap-1.5\">\n {questions.map((question, index) => (\n <span\n key={question.id || index}\n className={cn(\n \"h-1.5 w-1.5 rounded-full\",\n hasGuidedAnswer(answers[question.id])\n ? \"bg-primary\"\n : \"bg-muted-foreground/30\",\n )}\n />\n ))}\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={onSkip}\n className=\"cursor-pointer rounded-md px-3 py-2 text-sm text-muted-foreground transition-colors hover:bg-muted/60 hover:text-foreground\"\n >\n {skipLabel}\n </button>\n <button\n type=\"button\"\n onClick={() => submitAnswers()}\n disabled={!allRequiredAnswered}\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-md bg-primary px-3.5 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-45\"\n >\n {submitLabel}\n <IconChevronRight className=\"h-4 w-4 rtl:-scale-x-100\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction QuestionCard({\n index,\n question,\n value,\n onChange,\n onSubmitAnswer,\n}: {\n index: number;\n question: GuidedQuestion;\n value: unknown;\n onChange: (value: unknown) => void;\n onSubmitAnswer: (value: unknown) => void;\n}) {\n return (\n <section className=\"rounded-lg border border-border bg-card/65 p-4 shadow-sm\">\n <div className=\"mb-3 flex gap-3\">\n <div className=\"flex h-6 min-w-6 items-center justify-center rounded-md bg-muted text-xs font-medium text-muted-foreground\">\n {index + 1}\n </div>\n <div className=\"min-w-0\">\n {question.header && (\n <p className=\"mb-1 text-[11px] font-medium uppercase text-muted-foreground\">\n {question.header}\n </p>\n )}\n <h3 className=\"text-sm font-medium leading-5 text-foreground\">\n {question.question}\n {question.required && (\n <span className=\"ms-1 text-destructive\">*</span>\n )}\n </h3>\n {question.description && (\n <p className=\"mt-1 text-xs leading-5 text-muted-foreground\">\n {question.description}\n </p>\n )}\n </div>\n </div>\n\n {question.type === \"text-options\" && (\n <TextOptions\n question={question}\n value={value}\n onChange={onChange}\n onSubmitAnswer={onSubmitAnswer}\n />\n )}\n {question.type === \"color-options\" && (\n <ColorOptions question={question} value={value} onChange={onChange} />\n )}\n {question.type === \"slider\" && (\n <SliderQuestion question={question} value={value} onChange={onChange} />\n )}\n {question.type === \"file\" && (\n <FileDropZone value={value} onChange={onChange} />\n )}\n {question.type === \"freeform\" && (\n <textarea\n value={typeof value === \"string\" ? value : \"\"}\n onChange={(event) => onChange(event.target.value)}\n placeholder={question.placeholder ?? \"Type your answer...\"}\n className=\"min-h-[84px] w-full resize-none rounded-md border border-border bg-muted/45 px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground/70 focus:border-primary\"\n />\n )}\n </section>\n );\n}\n\nfunction TextOptions({\n question,\n value,\n onChange,\n onSubmitAnswer,\n}: {\n question: GuidedQuestion;\n value: unknown;\n onChange: (value: unknown) => void;\n onSubmitAnswer: (value: unknown) => void;\n}) {\n const options = useMemo(() => withDefaultOptions(question), [question]);\n const multiSelect = question.multiSelect === true;\n const selectedValues = Array.isArray(value) ? value : [];\n const otherSelected = multiSelect\n ? selectedValues.some(isOtherGuidedAnswer)\n : isOtherGuidedAnswer(value);\n const otherText = multiSelect\n ? getOtherGuidedAnswerText(selectedValues.find(isOtherGuidedAnswer))\n : getOtherGuidedAnswerText(value);\n\n const isSelected = (optionValue: string) =>\n multiSelect ? selectedValues.includes(optionValue) : value === optionValue;\n\n const toggleOption = (optionValue: string) => {\n if (!multiSelect) {\n onChange(optionValue);\n if (question.submitOnSelect) onSubmitAnswer(optionValue);\n return;\n }\n const next = selectedValues.includes(optionValue)\n ? selectedValues.filter((item) => item !== optionValue)\n : [...selectedValues, optionValue];\n onChange(next);\n };\n\n const toggleOther = () => {\n if (!multiSelect) {\n onChange(otherSelected ? \"\" : makeOtherGuidedAnswer());\n return;\n }\n if (otherSelected) {\n onChange(selectedValues.filter((item) => !isOtherGuidedAnswer(item)));\n return;\n }\n onChange([...selectedValues, makeOtherGuidedAnswer()]);\n };\n\n const setOtherText = (text: string) => {\n const nextOther = makeOtherGuidedAnswer(text);\n if (!multiSelect) {\n onChange(nextOther);\n return;\n }\n onChange([\n ...selectedValues.filter((item) => !isOtherGuidedAnswer(item)),\n nextOther,\n ]);\n };\n\n const allowOther = question.allowOther !== false;\n\n return (\n <div className=\"space-y-3\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {options.map((option) => (\n <OptionButton\n key={`${option.value}:${option.label}`}\n option={option}\n selected={isSelected(option.value)}\n multiSelect={multiSelect}\n onClick={() => toggleOption(option.value)}\n />\n ))}\n {allowOther && (\n <OptionButton\n option={{\n label: \"Other...\",\n value: \"__other__\",\n description: \"Tell the agent exactly what you mean.\",\n }}\n selected={otherSelected}\n multiSelect={multiSelect}\n onClick={toggleOther}\n />\n )}\n </div>\n {allowOther && otherSelected && (\n <textarea\n autoFocus\n value={otherText}\n onChange={(event) => setOtherText(event.target.value)}\n placeholder={question.placeholder ?? \"Type a custom answer...\"}\n className=\"min-h-[72px] w-full resize-none rounded-md border border-border bg-muted/45 px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground/70 focus:border-primary\"\n />\n )}\n </div>\n );\n}\n\nfunction OptionButton({\n option,\n selected,\n multiSelect,\n onClick,\n}: {\n option: GuidedQuestionOption;\n selected: boolean;\n multiSelect?: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-pressed={selected}\n className={cn(\n \"group flex min-h-[56px] cursor-pointer items-start gap-2 rounded-md border px-3 py-2 text-start transition-colors\",\n selected\n ? \"border-primary bg-primary/10 text-foreground ring-2 ring-primary/25\"\n : \"border-border bg-muted/30 text-muted-foreground hover:border-muted-foreground/50 hover:bg-muted/45 hover:text-foreground\",\n )}\n >\n <span\n className={cn(\n \"mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center border\",\n multiSelect ? \"rounded-sm\" : \"rounded-full\",\n selected\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-border bg-background\",\n )}\n aria-hidden\n >\n {selected && <IconCheck className=\"h-3 w-3\" />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex flex-wrap items-center gap-1.5 text-sm font-medium leading-5\">\n {option.label}\n {option.recommended && (\n <span className=\"rounded-sm bg-primary/15 px-1.5 py-0.5 text-[10px] font-medium uppercase text-primary\">\n Recommended\n </span>\n )}\n </span>\n {option.description && (\n <span className=\"mt-0.5 block text-xs leading-4 text-muted-foreground\">\n {option.description}\n </span>\n )}\n {option.preview && (\n <span className=\"mt-1.5 block max-h-40 overflow-auto whitespace-pre-wrap rounded border border-border/60 bg-background/60 px-2 py-1.5 font-mono text-[11px] leading-4 text-muted-foreground\">\n {option.preview}\n </span>\n )}\n </span>\n </button>\n );\n}\n\nfunction ColorOptions({\n question,\n value,\n onChange,\n}: {\n question: GuidedQuestion;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const options = question.options ?? question.choices ?? [];\n const multiSelect = question.multiSelect === true;\n const selectedValues = Array.isArray(value) ? value : [];\n const isSelected = (optionValue: string) =>\n multiSelect ? selectedValues.includes(optionValue) : value === optionValue;\n\n const toggleOption = (optionValue: string) => {\n if (!multiSelect) {\n onChange(optionValue);\n return;\n }\n onChange(\n selectedValues.includes(optionValue)\n ? selectedValues.filter((item) => item !== optionValue)\n : [...selectedValues, optionValue],\n );\n };\n\n return (\n <div className=\"flex flex-wrap gap-3\">\n {options.map((option) => {\n const selected = isSelected(option.value);\n return (\n <button\n type=\"button\"\n key={`${option.value}:${option.label}`}\n onClick={() => toggleOption(option.value)}\n className=\"group flex cursor-pointer flex-col items-center gap-1.5\"\n >\n <span\n className={cn(\n \"h-10 w-10 rounded-full\",\n selected\n ? \"ring-2 ring-primary ring-offset-2 ring-offset-background\"\n : \"ring-1 ring-border group-hover:ring-muted-foreground/50\",\n )}\n style={{ backgroundColor: option.color || option.value }}\n />\n <span\n className={cn(\n \"max-w-20 truncate text-[10px]\",\n selected ? \"text-foreground\" : \"text-muted-foreground\",\n )}\n >\n {option.label}\n </span>\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction SliderQuestion({\n question,\n value,\n onChange,\n}: {\n question: GuidedQuestion;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const min = question.min ?? 0;\n const max = question.max ?? 100;\n const step = question.step ?? 1;\n const current =\n typeof value === \"number\" ? value : Math.round((min + max) / 2);\n\n return (\n <div className=\"flex items-center gap-4\">\n <span className=\"w-8 text-xs text-muted-foreground\">{min}</span>\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={current}\n onChange={(event) => onChange(Number(event.target.value))}\n className=\"h-2 flex-1 cursor-pointer accent-primary\"\n />\n <span className=\"w-8 text-end text-xs text-muted-foreground\">{max}</span>\n <span className=\"min-w-10 text-end text-sm font-medium tabular-nums text-foreground\">\n {current}\n </span>\n </div>\n );\n}\n\nfunction FileDropZone({\n value,\n onChange,\n}: {\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const [dragOver, setDragOver] = useState(false);\n const files: File[] = Array.isArray(value) ? (value as File[]) : [];\n\n const addFiles = (incoming: File[]) => onChange([...files, ...incoming]);\n const removeFile = (index: number) =>\n onChange(files.filter((_, fileIndex) => fileIndex !== index));\n\n return (\n <div>\n <div\n onDragOver={(event) => {\n event.preventDefault();\n setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={(event) => {\n event.preventDefault();\n setDragOver(false);\n addFiles(Array.from(event.dataTransfer.files));\n }}\n className={cn(\n \"flex cursor-pointer flex-col items-center justify-center rounded-md border-2 border-dashed p-5 transition-colors\",\n dragOver\n ? \"border-primary bg-primary/5\"\n : \"border-border bg-muted/30 hover:border-muted-foreground/50\",\n )}\n >\n <IconUpload className=\"mb-2 h-5 w-5 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n Drag files here or{\" \"}\n <label className=\"cursor-pointer text-primary hover:underline\">\n browse\n <input\n type=\"file\"\n multiple\n onChange={(event) => {\n if (event.target.files)\n addFiles(Array.from(event.target.files));\n event.currentTarget.value = \"\";\n }}\n className=\"hidden\"\n />\n </label>\n </p>\n </div>\n\n {files.length > 0 && (\n <div className=\"mt-2 space-y-1\">\n {files.map((file, index) => (\n <div\n key={`${file.name}:${index}`}\n className=\"flex items-center gap-2 rounded-md bg-muted/50 px-2 py-1 text-xs text-muted-foreground\"\n >\n <IconCheck className=\"h-3 w-3 text-primary\" />\n <span className=\"min-w-0 flex-1 truncate\">{file.name}</span>\n <button\n type=\"button\"\n onClick={() => removeFile(index)}\n className=\"cursor-pointer text-muted-foreground/70 hover:text-foreground\"\n aria-label={`Remove ${file.name}`}\n >\n <IconX className=\"h-3 w-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nconst SAFE_BROWSER_TAB_ID_RE = /^[A-Za-z0-9_-]{1,96}$/;\n\nfunction normalizeBrowserTabId(browserTabId?: string): string | undefined {\n if (typeof browserTabId !== \"string\") return undefined;\n const trimmed = browserTabId.trim();\n return SAFE_BROWSER_TAB_ID_RE.test(trimmed) ? trimmed : undefined;\n}\n\nexport interface UseGuidedQuestionFlowOptions {\n stateKey?: string;\n /**\n * The current browser tab id. Agent actions that write the guided-questions\n * payload scope the application-state key per tab (`<key>:<tabId>`), so the\n * client must read the scoped key first and fall back to the bare key. Without\n * this, the question card never renders when the agent run carries a tab id\n * (which it almost always does — see `sessionBrowserTabId`).\n */\n browserTabId?: string;\n queryKey?: readonly unknown[];\n refetchInterval?: number | false;\n submitMessage?: string;\n skipMessage?: string;\n buildSubmitContext?: (args: {\n answers: GuidedQuestionAnswers;\n formattedAnswers: string;\n }) => string;\n buildSkipContext?: () => string;\n}\n\nexport function useGuidedQuestionFlow({\n stateKey = \"show-questions\",\n browserTabId,\n queryKey = [\"show-questions\"],\n refetchInterval = 2_000,\n submitMessage = \"Here are my answers — go ahead.\",\n skipMessage = \"Skip the questions — decide for me.\",\n buildSubmitContext,\n buildSkipContext,\n}: UseGuidedQuestionFlowOptions = {}) {\n const queryClient = useQueryClient();\n const [payload, setPayload] = useState<GuidedQuestionPayload | null>(null);\n const normalizedBrowserTabId = useMemo(\n () => normalizeBrowserTabId(browserTabId),\n [browserTabId],\n );\n const endpointFor = useCallback(\n (key: string) => agentNativePath(`/_agent-native/application-state/${key}`),\n [],\n );\n const scopedKey = normalizedBrowserTabId\n ? `${stateKey}:${normalizedBrowserTabId}`\n : stateKey;\n // Match the queryKey to the scope so two tabs polling different scoped keys\n // don't share a cache entry.\n const resolvedQueryKey = useMemo(\n () => [...queryKey, normalizedBrowserTabId ?? \"global\"],\n [queryKey, normalizedBrowserTabId],\n );\n\n const resolvedRefetchInterval =\n refetchInterval === false\n ? false\n : (query: { state: { data?: GuidedQuestionPayload | null } }) => {\n const activeQuestions = query.state.data?.questions;\n if (Array.isArray(activeQuestions) && activeQuestions.length > 0) {\n return false;\n }\n return refetchInterval;\n };\n\n const { data } = useQuery({\n queryKey: resolvedQueryKey,\n queryFn: async () => {\n const read = async (key: string) => {\n const res = await fetch(endpointFor(key));\n if (!res.ok) return null;\n const text = await res.text();\n if (!text) return null;\n try {\n const parsed = JSON.parse(text);\n if (Array.isArray(parsed?.questions) && parsed.questions.length > 0) {\n return parsed as GuidedQuestionPayload;\n }\n } catch {\n return null;\n }\n return null;\n };\n // Agent writes are tab-scoped; read the scoped key first, then fall back\n // to the bare key (e.g. a deterministic write that omits the tab id).\n return (\n (normalizedBrowserTabId ? await read(scopedKey) : null) ??\n (await read(stateKey))\n );\n },\n refetchInterval: resolvedRefetchInterval,\n structuralSharing: false,\n });\n\n useEffect(() => {\n if (Array.isArray(data?.questions) && data.questions.length > 0) {\n setPayload((prev) => {\n if (\n prev &&\n guidedQuestionsFingerprint(prev.questions) ===\n guidedQuestionsFingerprint(data.questions)\n ) {\n return prev;\n }\n return data;\n });\n } else {\n setPayload(null);\n }\n }, [data]);\n\n const clear = useCallback(() => {\n setPayload(null);\n queryClient.setQueryData(resolvedQueryKey, null);\n const del = (key: string) =>\n fetch(endpointFor(key), {\n method: \"DELETE\",\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n }).catch(() => {});\n // Clear whichever key actually held the payload (scoped or bare) so the\n // card doesn't reappear on the next poll.\n del(scopedKey);\n if (scopedKey !== stateKey) del(stateKey);\n }, [endpointFor, queryClient, resolvedQueryKey, scopedKey, stateKey]);\n\n const handleSubmit = useCallback(\n (answers: GuidedQuestionAnswers) => {\n // Client-initiated question (askUserQuestion): resolve the caller's\n // promise with the answer instead of forwarding it to the agent chat.\n const resolveId = payload?.clientResolveId;\n if (resolveId) {\n const firstId = payload?.questions?.[0]?.id ?? \"q1\";\n resolveClientQuestion(resolveId, extractSingleAnswer(answers, firstId));\n clear();\n return;\n }\n const formattedAnswers = formatGuidedAnswersForAgent(answers);\n const resolvedSubmitMessage = payload?.submitMessage ?? submitMessage;\n const context =\n buildSubmitContext?.({ answers, formattedAnswers }) ??\n [\n \"The user answered the pre-generation questions.\",\n \"\",\n \"Answers:\",\n formattedAnswers,\n ].join(\"\\n\");\n sendToAgentChat({\n message: resolvedSubmitMessage,\n context,\n submit: true,\n });\n clear();\n },\n [buildSubmitContext, clear, payload, submitMessage],\n );\n\n const handleSkip = useCallback(() => {\n const resolveId = payload?.clientResolveId;\n if (resolveId) {\n resolveClientQuestion(resolveId, null);\n clear();\n return;\n }\n sendToAgentChat({\n message: payload?.skipMessage ?? skipMessage,\n context: buildSkipContext?.(),\n submit: true,\n });\n clear();\n }, [buildSkipContext, clear, payload, skipMessage]);\n\n return {\n payload,\n questions: payload?.questions ?? null,\n title: payload?.title,\n description: payload?.description,\n skipLabel: payload?.skipLabel,\n submitLabel: payload?.submitLabel,\n clear,\n handleSubmit,\n handleSkip,\n };\n}\n"]}
|
|
@@ -145,7 +145,7 @@ function LinkMethod({ method, onMarkComplete, }) {
|
|
|
145
145
|
}
|
|
146
146
|
// ─── form ──────────────────────────────────────────────────────────────────
|
|
147
147
|
function FormMethod({ method, onCompleted, }) {
|
|
148
|
-
const { fields, writeScope } = method.payload;
|
|
148
|
+
const { fields, writeScope, saveTo, secretDescription } = method.payload;
|
|
149
149
|
const [values, setValues] = useState({});
|
|
150
150
|
const [saving, setSaving] = useState(false);
|
|
151
151
|
const [err, setErr] = useState(null);
|
|
@@ -161,6 +161,31 @@ function FormMethod({ method, onCompleted, }) {
|
|
|
161
161
|
setErr("Enter a value first.");
|
|
162
162
|
return;
|
|
163
163
|
}
|
|
164
|
+
if (saveTo === "scoped-secrets") {
|
|
165
|
+
const secretScope = writeScope === "workspace" || writeScope === "app"
|
|
166
|
+
? "workspace"
|
|
167
|
+
: "user";
|
|
168
|
+
for (const entry of vars) {
|
|
169
|
+
const res = await fetch(agentNativePath("/_agent-native/secrets/adhoc"), {
|
|
170
|
+
method: "POST",
|
|
171
|
+
headers: { "Content-Type": "application/json" },
|
|
172
|
+
body: JSON.stringify({
|
|
173
|
+
name: entry.key,
|
|
174
|
+
value: entry.value,
|
|
175
|
+
scope: secretScope,
|
|
176
|
+
description: secretDescription ?? method.description ?? "Setup key",
|
|
177
|
+
}),
|
|
178
|
+
});
|
|
179
|
+
if (!res.ok) {
|
|
180
|
+
const data = await res.json().catch(() => ({}));
|
|
181
|
+
throw new Error(data.error ??
|
|
182
|
+
`Save failed: ${res.status}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
setValues({});
|
|
186
|
+
await onCompleted();
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
164
189
|
const res = await fetch(agentNativePath("/_agent-native/env-vars"), {
|
|
165
190
|
method: "POST",
|
|
166
191
|
headers: { "Content-Type": "application/json" },
|