@flanksource/clicky-ui 0.3.26 → 0.3.28
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/NOTICE.md +14 -0
- package/dist/ai.cjs +52 -6
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +53 -7
- package/dist/ai.js.map +1 -1
- package/dist/comments/CommentCard.cjs +24 -39
- package/dist/comments/CommentCard.cjs.map +1 -1
- package/dist/comments/CommentCard.d.ts +9 -2
- package/dist/comments/CommentCard.d.ts.map +1 -1
- package/dist/comments/CommentCard.js +24 -39
- package/dist/comments/CommentCard.js.map +1 -1
- package/dist/comments/CommentProvider.cjs +4 -3
- package/dist/comments/CommentProvider.cjs.map +1 -1
- package/dist/comments/CommentProvider.d.ts +6 -1
- package/dist/comments/CommentProvider.d.ts.map +1 -1
- package/dist/comments/CommentProvider.js +4 -3
- package/dist/comments/CommentProvider.js.map +1 -1
- package/dist/comments/CommentSidePanel.cjs +65 -52
- package/dist/comments/CommentSidePanel.cjs.map +1 -1
- package/dist/comments/CommentSidePanel.d.ts.map +1 -1
- package/dist/comments/CommentSidePanel.js +67 -54
- package/dist/comments/CommentSidePanel.js.map +1 -1
- package/dist/comments/CommentThread.cjs +2 -2
- package/dist/comments/CommentThread.cjs.map +1 -1
- package/dist/comments/CommentThread.d.ts +3 -3
- package/dist/comments/CommentThread.d.ts.map +1 -1
- package/dist/comments/CommentThread.js +2 -2
- package/dist/comments/CommentThread.js.map +1 -1
- package/dist/comments/CommentThreadList.cjs +85 -37
- package/dist/comments/CommentThreadList.cjs.map +1 -1
- package/dist/comments/CommentThreadList.d.ts +3 -3
- package/dist/comments/CommentThreadList.d.ts.map +1 -1
- package/dist/comments/CommentThreadList.js +86 -38
- package/dist/comments/CommentThreadList.js.map +1 -1
- package/dist/comments/comment-utils.cjs +26 -0
- package/dist/comments/comment-utils.cjs.map +1 -1
- package/dist/comments/comment-utils.d.ts +11 -0
- package/dist/comments/comment-utils.d.ts.map +1 -1
- package/dist/comments/comment-utils.js +26 -0
- package/dist/comments/comment-utils.js.map +1 -1
- package/dist/comments.cjs +2 -0
- package/dist/comments.cjs.map +1 -1
- package/dist/comments.js +3 -1
- package/dist/components/AccordionList.cjs +3 -0
- package/dist/components/AccordionList.cjs.map +1 -1
- package/dist/components/AccordionList.d.ts +3 -1
- package/dist/components/AccordionList.d.ts.map +1 -1
- package/dist/components/AccordionList.js +3 -0
- package/dist/components/AccordionList.js.map +1 -1
- package/dist/components/CopyButton.cjs +35 -0
- package/dist/components/CopyButton.cjs.map +1 -0
- package/dist/components/CopyButton.d.ts +20 -0
- package/dist/components/CopyButton.d.ts.map +1 -0
- package/dist/components/CopyButton.js +35 -0
- package/dist/components/CopyButton.js.map +1 -0
- package/dist/components/FilterBar.cjs +29 -6
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +10 -1
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +29 -6
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/ListMenu.cjs +4 -1
- package/dist/components/ListMenu.cjs.map +1 -1
- package/dist/components/ListMenu.d.ts +5 -1
- package/dist/components/ListMenu.d.ts.map +1 -1
- package/dist/components/ListMenu.js +4 -1
- package/dist/components/ListMenu.js.map +1 -1
- package/dist/components/SegmentedControl.cjs +4 -2
- package/dist/components/SegmentedControl.cjs.map +1 -1
- package/dist/components/SegmentedControl.d.ts +4 -0
- package/dist/components/SegmentedControl.d.ts.map +1 -1
- package/dist/components/SegmentedControl.js +4 -2
- package/dist/components/SegmentedControl.js.map +1 -1
- package/dist/components/clipboard.cjs +60 -0
- package/dist/components/clipboard.cjs.map +1 -0
- package/dist/components/clipboard.d.ts +13 -0
- package/dist/components/clipboard.d.ts.map +1 -0
- package/dist/components/clipboard.js +60 -0
- package/dist/components/clipboard.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +15 -1
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +15 -1
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-list-array.cjs +113 -0
- package/dist/components/json-schema-form-list-array.cjs.map +1 -0
- package/dist/components/json-schema-form-list-array.d.ts +7 -0
- package/dist/components/json-schema-form-list-array.d.ts.map +1 -0
- package/dist/components/json-schema-form-list-array.js +113 -0
- package/dist/components/json-schema-form-list-array.js.map +1 -0
- package/dist/components/json-schema-form-resolve.cjs +1 -1
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +1 -1
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +1 -1
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components.cjs +5 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +2 -0
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +5 -0
- package/dist/components.js.map +1 -1
- package/dist/data/Clicky.cjs +4 -1
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.js +4 -1
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/DataTable.cjs +202 -40
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +163 -3
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +202 -40
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/FixtureEditor/FixtureFrontmatterDialog.cjs +1 -1
- package/dist/data/FixtureEditor/FixtureFrontmatterDialog.cjs.map +1 -1
- package/dist/data/FixtureEditor/FixtureFrontmatterDialog.js +1 -1
- package/dist/data/FixtureEditor/FixtureFrontmatterDialog.js.map +1 -1
- package/dist/data/FixtureEditor/fixture-frontmatter.cjs +8 -6
- package/dist/data/FixtureEditor/fixture-frontmatter.cjs.map +1 -1
- package/dist/data/FixtureEditor/fixture-frontmatter.js +8 -6
- package/dist/data/FixtureEditor/fixture-frontmatter.js.map +1 -1
- package/dist/data/SelectionActionBar.cjs +242 -0
- package/dist/data/SelectionActionBar.cjs.map +1 -0
- package/dist/data/SelectionActionBar.d.ts +28 -0
- package/dist/data/SelectionActionBar.d.ts.map +1 -0
- package/dist/data/SelectionActionBar.js +242 -0
- package/dist/data/SelectionActionBar.js.map +1 -0
- package/dist/data/TaskManager.cjs +34 -12
- package/dist/data/TaskManager.cjs.map +1 -1
- package/dist/data/TaskManager.d.ts.map +1 -1
- package/dist/data/TaskManager.js +34 -12
- package/dist/data/TaskManager.js.map +1 -1
- package/dist/data/TaskManagerButton.cjs +11 -7
- package/dist/data/TaskManagerButton.cjs.map +1 -1
- package/dist/data/TaskManagerButton.d.ts.map +1 -1
- package/dist/data/TaskManagerButton.js +11 -7
- package/dist/data/TaskManagerButton.js.map +1 -1
- package/dist/data/TaskProgress.cjs +55 -11
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +53 -9
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +2 -4
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +2 -4
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.cjs +1 -2
- package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.js +1 -2
- package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
- package/dist/data/ai/PromptCatalog/PromptCatalogTable.cjs +262 -0
- package/dist/data/ai/PromptCatalog/PromptCatalogTable.cjs.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptCatalogTable.d.ts +16 -0
- package/dist/data/ai/PromptCatalog/PromptCatalogTable.d.ts.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptCatalogTable.js +262 -0
- package/dist/data/ai/PromptCatalog/PromptCatalogTable.js.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.cjs +77 -0
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.cjs.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.d.ts +8 -0
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.d.ts.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.js +77 -0
- package/dist/data/ai/PromptCatalog/PromptLayerStrip.js.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptPage.cjs +332 -0
- package/dist/data/ai/PromptCatalog/PromptPage.cjs.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptPage.d.ts +17 -0
- package/dist/data/ai/PromptCatalog/PromptPage.d.ts.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptPage.js +332 -0
- package/dist/data/ai/PromptCatalog/PromptPage.js.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptPageEditor.cjs +102 -0
- package/dist/data/ai/PromptCatalog/PromptPageEditor.cjs.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptPageEditor.d.ts +16 -0
- package/dist/data/ai/PromptCatalog/PromptPageEditor.d.ts.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptPageEditor.js +102 -0
- package/dist/data/ai/PromptCatalog/PromptPageEditor.js.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptPageHeader.cjs +102 -0
- package/dist/data/ai/PromptCatalog/PromptPageHeader.cjs.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptPageHeader.d.ts +10 -0
- package/dist/data/ai/PromptCatalog/PromptPageHeader.d.ts.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptPageHeader.js +102 -0
- package/dist/data/ai/PromptCatalog/PromptPageHeader.js.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptPagePreview.cjs +90 -0
- package/dist/data/ai/PromptCatalog/PromptPagePreview.cjs.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptPagePreview.d.ts +8 -0
- package/dist/data/ai/PromptCatalog/PromptPagePreview.d.ts.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptPagePreview.js +90 -0
- package/dist/data/ai/PromptCatalog/PromptPagePreview.js.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.cjs +168 -0
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.cjs.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.d.ts +17 -0
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.d.ts.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.js +168 -0
- package/dist/data/ai/PromptCatalog/PromptPageSaveBar.js.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptSourceBadge.cjs +36 -0
- package/dist/data/ai/PromptCatalog/PromptSourceBadge.cjs.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptSourceBadge.d.ts +7 -0
- package/dist/data/ai/PromptCatalog/PromptSourceBadge.d.ts.map +1 -0
- package/dist/data/ai/PromptCatalog/PromptSourceBadge.js +36 -0
- package/dist/data/ai/PromptCatalog/PromptSourceBadge.js.map +1 -0
- package/dist/data/ai/PromptCatalog/index.d.ts +9 -0
- package/dist/data/ai/PromptCatalog/index.d.ts.map +1 -0
- package/dist/data/ai/PromptCatalog/prompt-catalog-model.cjs +137 -0
- package/dist/data/ai/PromptCatalog/prompt-catalog-model.cjs.map +1 -0
- package/dist/data/ai/PromptCatalog/prompt-catalog-model.d.ts +28 -0
- package/dist/data/ai/PromptCatalog/prompt-catalog-model.d.ts.map +1 -0
- package/dist/data/ai/PromptCatalog/prompt-catalog-model.js +137 -0
- package/dist/data/ai/PromptCatalog/prompt-catalog-model.js.map +1 -0
- package/dist/data/ai/PromptCatalog/prompt-page-model.cjs +114 -0
- package/dist/data/ai/PromptCatalog/prompt-page-model.cjs.map +1 -0
- package/dist/data/ai/PromptCatalog/prompt-page-model.d.ts +45 -0
- package/dist/data/ai/PromptCatalog/prompt-page-model.d.ts.map +1 -0
- package/dist/data/ai/PromptCatalog/prompt-page-model.js +114 -0
- package/dist/data/ai/PromptCatalog/prompt-page-model.js.map +1 -0
- package/dist/data/ai/PromptCatalog/types.d.ts +70 -0
- package/dist/data/ai/PromptCatalog/types.d.ts.map +1 -0
- package/dist/data/ai/PromptPicker/PromptPicker.cjs +9 -12
- package/dist/data/ai/PromptPicker/PromptPicker.cjs.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.js +9 -12
- package/dist/data/ai/PromptPicker/PromptPicker.js.map +1 -1
- package/dist/data/ai/PromptPicker/index.d.ts +1 -1
- package/dist/data/ai/PromptPicker/index.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/types.cjs.map +1 -1
- package/dist/data/ai/PromptPicker/types.d.ts +9 -0
- package/dist/data/ai/PromptPicker/types.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/types.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.cjs +4 -5
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +5 -6
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/model.cjs +1 -1
- package/dist/data/ai/PromptRunEditor/model.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/model.d.ts +1 -1
- package/dist/data/ai/PromptRunEditor/model.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/model.js +1 -1
- package/dist/data/ai/PromptRunEditor/model.js.map +1 -1
- package/dist/data/ai/RuntimeModePicker.cjs +25 -14
- package/dist/data/ai/RuntimeModePicker.cjs.map +1 -1
- package/dist/data/ai/RuntimeModePicker.d.ts.map +1 -1
- package/dist/data/ai/RuntimeModePicker.js +26 -15
- package/dist/data/ai/RuntimeModePicker.js.map +1 -1
- package/dist/data/ai/SessionInspector.collection-types.d.ts +1 -1
- package/dist/data/ai/SessionInspector.collection-types.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.collection.cjs +3 -3
- package/dist/data/ai/SessionInspector.collection.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.collection.js +3 -3
- package/dist/data/ai/SessionInspector.collection.js.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
- package/dist/data/ai/SessionInspector.model.cjs +3 -3
- package/dist/data/ai/SessionInspector.model.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.model.d.ts +1 -1
- package/dist/data/ai/SessionInspector.model.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.model.js +3 -3
- package/dist/data/ai/SessionInspector.model.js.map +1 -1
- package/dist/data/ai/SessionInspector.panels.cjs +1 -1
- package/dist/data/ai/SessionInspector.panels.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.panels.js +1 -1
- package/dist/data/ai/SessionInspector.panels.js.map +1 -1
- package/dist/data/ai/SessionInspector.summary.cjs +3 -3
- package/dist/data/ai/SessionInspector.summary.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.summary.js +3 -3
- package/dist/data/ai/SessionInspector.summary.js.map +1 -1
- package/dist/data/ai/SessionViewer.fixtures.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +3 -2
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +18 -30
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +19 -31
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/EnvironmentSection.cjs +71 -86
- package/dist/data/ai/SpecRuntimeEditor/EnvironmentSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/EnvironmentSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/EnvironmentSection.js +72 -87
- package/dist/data/ai/SpecRuntimeEditor/EnvironmentSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.cjs +99 -0
- package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.cjs.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.d.ts +13 -0
- package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.d.ts.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.js +99 -0
- package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.js.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +37 -21
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts +6 -2
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +38 -22
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.cjs +114 -0
- package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.cjs.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.d.ts +10 -0
- package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.d.ts.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.js +114 -0
- package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.js.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.cjs +160 -0
- package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.cjs.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.d.ts +9 -0
- package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.d.ts.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.js +160 -0
- package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.js.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.cjs +27 -241
- package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.d.ts +5 -6
- package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.js +25 -239
- package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs +21 -8
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.d.ts +4 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js +22 -9
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/SandboxSection.cjs +207 -164
- package/dist/data/ai/SpecRuntimeEditor/SandboxSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/SandboxSection.d.ts +4 -3
- package/dist/data/ai/SpecRuntimeEditor/SandboxSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/SandboxSection.js +210 -167
- package/dist/data/ai/SpecRuntimeEditor/SandboxSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/SectionCard.cjs +15 -15
- package/dist/data/ai/SpecRuntimeEditor/SectionCard.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/SectionCard.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/SectionCard.js +15 -15
- package/dist/data/ai/SpecRuntimeEditor/SectionCard.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs +120 -42
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.d.ts +4 -1
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js +123 -45
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/env-model.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/env-model.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/env-model.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs +136 -48
- package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts +13 -3
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js +137 -49
- package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.cjs +93 -0
- package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.cjs.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.d.ts +6 -0
- package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.d.ts.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.js +93 -0
- package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.js.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.cjs +35 -0
- package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.cjs.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.d.ts +5 -0
- package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.d.ts.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.js +35 -0
- package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.js.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor/presets.cjs +2 -9
- package/dist/data/ai/SpecRuntimeEditor/presets.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/presets.d.ts +1 -2
- package/dist/data/ai/SpecRuntimeEditor/presets.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/presets.js +2 -9
- package/dist/data/ai/SpecRuntimeEditor/presets.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/types.cjs +2 -7
- package/dist/data/ai/SpecRuntimeEditor/types.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/types.d.ts +0 -1
- package/dist/data/ai/SpecRuntimeEditor/types.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/types.js +3 -8
- package/dist/data/ai/SpecRuntimeEditor/types.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.cjs +43 -33
- package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts +7 -13
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.js +43 -33
- package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.cjs +33 -45
- package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts +54 -29
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.js +33 -44
- package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.sandbox-model.cjs +276 -0
- package/dist/data/ai/SpecRuntimeEditor.sandbox-model.cjs.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor.sandbox-model.d.ts +58 -0
- package/dist/data/ai/SpecRuntimeEditor.sandbox-model.d.ts.map +1 -0
- package/dist/data/ai/SpecRuntimeEditor.sandbox-model.js +276 -0
- package/dist/data/ai/SpecRuntimeEditor.sandbox-model.js.map +1 -0
- package/dist/data/ai/ThreadPicker.cjs +55 -42
- package/dist/data/ai/ThreadPicker.cjs.map +1 -1
- package/dist/data/ai/ThreadPicker.d.ts.map +1 -1
- package/dist/data/ai/ThreadPicker.js +56 -43
- package/dist/data/ai/ThreadPicker.js.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +9 -1
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +9 -1
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.cjs +41 -487
- package/dist/data/ai/ToolSchemaBrowser.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.d.ts +7 -2
- package/dist/data/ai/ToolSchemaBrowser.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.detail.cjs +238 -0
- package/dist/data/ai/ToolSchemaBrowser.detail.cjs.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.detail.d.ts +8 -0
- package/dist/data/ai/ToolSchemaBrowser.detail.d.ts.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.detail.js +238 -0
- package/dist/data/ai/ToolSchemaBrowser.detail.js.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs +57 -0
- package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts +9 -0
- package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.directory-header.js +57 -0
- package/dist/data/ai/ToolSchemaBrowser.directory-header.js.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.js +42 -488
- package/dist/data/ai/ToolSchemaBrowser.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.model.cjs +130 -0
- package/dist/data/ai/ToolSchemaBrowser.model.cjs.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.model.d.ts +35 -0
- package/dist/data/ai/ToolSchemaBrowser.model.d.ts.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.model.js +130 -0
- package/dist/data/ai/ToolSchemaBrowser.model.js.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs +57 -0
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts +7 -0
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js +57 -0
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs +389 -0
- package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts +23 -0
- package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.sidebar.js +389 -0
- package/dist/data/ai/ToolSchemaBrowser.sidebar.js.map +1 -0
- package/dist/data/ai/agent-action-icons.cjs +14 -6
- package/dist/data/ai/agent-action-icons.cjs.map +1 -1
- package/dist/data/ai/agent-action-icons.d.ts.map +1 -1
- package/dist/data/ai/agent-action-icons.js +14 -6
- package/dist/data/ai/agent-action-icons.js.map +1 -1
- package/dist/data/ai/examples/sessions/claude-complete.cjs +17 -9
- package/dist/data/ai/examples/sessions/claude-complete.cjs.map +1 -1
- package/dist/data/ai/examples/sessions/claude-complete.d.ts.map +1 -1
- package/dist/data/ai/examples/sessions/claude-complete.js +17 -9
- package/dist/data/ai/examples/sessions/claude-complete.js.map +1 -1
- package/dist/data/ai/examples/sessions/claude.cjs +7 -4
- package/dist/data/ai/examples/sessions/claude.cjs.map +1 -1
- package/dist/data/ai/examples/sessions/claude.d.ts.map +1 -1
- package/dist/data/ai/examples/sessions/claude.js +7 -4
- package/dist/data/ai/examples/sessions/claude.js.map +1 -1
- package/dist/data/ai/examples/sessions/codex-complete.cjs +17 -10
- package/dist/data/ai/examples/sessions/codex-complete.cjs.map +1 -1
- package/dist/data/ai/examples/sessions/codex-complete.d.ts.map +1 -1
- package/dist/data/ai/examples/sessions/codex-complete.js +17 -10
- package/dist/data/ai/examples/sessions/codex-complete.js.map +1 -1
- package/dist/data/ai/examples/sessions/codex.cjs +7 -4
- package/dist/data/ai/examples/sessions/codex.cjs.map +1 -1
- package/dist/data/ai/examples/sessions/codex.d.ts.map +1 -1
- package/dist/data/ai/examples/sessions/codex.js +7 -4
- package/dist/data/ai/examples/sessions/codex.js.map +1 -1
- package/dist/data/ai/index.d.ts +6 -3
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/runtime-profile.cjs +93 -0
- package/dist/data/ai/runtime-profile.cjs.map +1 -0
- package/dist/data/ai/runtime-profile.d.ts +73 -0
- package/dist/data/ai/runtime-profile.d.ts.map +1 -0
- package/dist/data/ai/runtime-profile.js +93 -0
- package/dist/data/ai/runtime-profile.js.map +1 -0
- package/dist/data/ai/sandbox-kind-meta.cjs +38 -4
- package/dist/data/ai/sandbox-kind-meta.cjs.map +1 -1
- package/dist/data/ai/sandbox-kind-meta.d.ts +3 -0
- package/dist/data/ai/sandbox-kind-meta.d.ts.map +1 -1
- package/dist/data/ai/sandbox-kind-meta.js +38 -4
- package/dist/data/ai/sandbox-kind-meta.js.map +1 -1
- package/dist/data/chat/Chat.cjs +17 -5
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.fixtures.cjs +3 -3
- package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
- package/dist/data/chat/Chat.fixtures.js +3 -3
- package/dist/data/chat/Chat.fixtures.js.map +1 -1
- package/dist/data/chat/Chat.js +18 -6
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/Chat.runtime.cjs +15 -9
- package/dist/data/chat/Chat.runtime.cjs.map +1 -1
- package/dist/data/chat/Chat.runtime.d.ts.map +1 -1
- package/dist/data/chat/Chat.runtime.js +16 -10
- package/dist/data/chat/Chat.runtime.js.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.cjs +5 -5
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.js +5 -5
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
- package/dist/data/chat/ContextMeter.cjs +3 -3
- package/dist/data/chat/ContextMeter.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.d.ts +3 -3
- package/dist/data/chat/ContextMeter.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.js +3 -3
- package/dist/data/chat/ContextMeter.js.map +1 -1
- package/dist/data/chat/approval.cjs.map +1 -1
- package/dist/data/chat/approval.d.ts +21 -1
- package/dist/data/chat/approval.d.ts.map +1 -1
- package/dist/data/chat/approval.js.map +1 -1
- package/dist/data/chat/clickyOperationsToTools.cjs +5 -0
- package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
- package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
- package/dist/data/chat/clickyOperationsToTools.js +5 -0
- package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +7 -5
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/chat/usage-snapshot.cjs +21 -1
- package/dist/data/chat/usage-snapshot.cjs.map +1 -1
- package/dist/data/chat/usage-snapshot.d.ts +2 -0
- package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
- package/dist/data/chat/usage-snapshot.js +22 -2
- package/dist/data/chat/usage-snapshot.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.cjs +49 -51
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts +10 -2
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.js +51 -53
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.model.cjs +55 -0
- package/dist/data/runtime/RuntimeBar.model.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.model.d.ts +11 -3
- package/dist/data/runtime/RuntimeBar.model.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.model.js +55 -0
- package/dist/data/runtime/RuntimeBar.model.js.map +1 -1
- package/dist/data/runtime/RuntimeBarCombo.cjs +11 -6
- package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarCombo.d.ts +3 -1
- package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarCombo.js +11 -6
- package/dist/data/runtime/RuntimeBarCombo.js.map +1 -1
- package/dist/data/runtime/RuntimeBarSegments.cjs +7 -5
- package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarSegments.d.ts +4 -2
- package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarSegments.js +7 -5
- package/dist/data/runtime/RuntimeBarSegments.js.map +1 -1
- package/dist/data/runtime/model-capabilities.cjs +6 -6
- package/dist/data/runtime/model-capabilities.cjs.map +1 -1
- package/dist/data/runtime/model-capabilities.d.ts +5 -1
- package/dist/data/runtime/model-capabilities.d.ts.map +1 -1
- package/dist/data/runtime/model-capabilities.js +6 -6
- package/dist/data/runtime/model-capabilities.js.map +1 -1
- package/dist/data/runtime/provider-status.cjs +1 -1
- package/dist/data/runtime/provider-status.cjs.map +1 -1
- package/dist/data/runtime/provider-status.js +1 -1
- package/dist/data/runtime/provider-status.js.map +1 -1
- package/dist/data/runtime/runtime-field-support.cjs +63 -0
- package/dist/data/runtime/runtime-field-support.cjs.map +1 -0
- package/dist/data/runtime/runtime-field-support.d.ts +13 -0
- package/dist/data/runtime/runtime-field-support.d.ts.map +1 -0
- package/dist/data/runtime/runtime-field-support.js +63 -0
- package/dist/data/runtime/runtime-field-support.js.map +1 -0
- package/dist/data/runtime/runtime-mode.cjs +170 -111
- package/dist/data/runtime/runtime-mode.cjs.map +1 -1
- package/dist/data/runtime/runtime-mode.d.ts +58 -14
- package/dist/data/runtime/runtime-mode.d.ts.map +1 -1
- package/dist/data/runtime/runtime-mode.js +170 -111
- package/dist/data/runtime/runtime-mode.js.map +1 -1
- package/dist/data/selectionActionSplit.cjs +33 -0
- package/dist/data/selectionActionSplit.cjs.map +1 -0
- package/dist/data/selectionActionSplit.d.ts +36 -0
- package/dist/data/selectionActionSplit.d.ts.map +1 -0
- package/dist/data/selectionActionSplit.js +33 -0
- package/dist/data/selectionActionSplit.js.map +1 -0
- package/dist/data/task-copy.cjs +76 -0
- package/dist/data/task-copy.cjs.map +1 -0
- package/dist/data/task-copy.d.ts +12 -0
- package/dist/data/task-copy.d.ts.map +1 -0
- package/dist/data/task-copy.js +76 -0
- package/dist/data/task-copy.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +34 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +4 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +34 -0
- package/dist/data.js.map +1 -1
- package/dist/hooks/use-task-run.cjs +24 -17
- package/dist/hooks/use-task-run.cjs.map +1 -1
- package/dist/hooks/use-task-run.d.ts +3 -1
- package/dist/hooks/use-task-run.d.ts.map +1 -1
- package/dist/hooks/use-task-run.js +25 -18
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/icons/components/UiCalendarCheck.cjs +15 -0
- package/dist/icons/components/UiCalendarCheck.cjs.map +1 -0
- package/dist/icons/components/UiCalendarCheck.d.ts +15 -0
- package/dist/icons/components/UiCalendarCheck.d.ts.map +1 -0
- package/dist/icons/components/UiCalendarCheck.js +15 -0
- package/dist/icons/components/UiCalendarCheck.js.map +1 -0
- package/dist/icons/components/UiChartLineUp.cjs +15 -0
- package/dist/icons/components/UiChartLineUp.cjs.map +1 -0
- package/dist/icons/components/UiChartLineUp.d.ts +15 -0
- package/dist/icons/components/UiChartLineUp.d.ts.map +1 -0
- package/dist/icons/components/UiChartLineUp.js +15 -0
- package/dist/icons/components/UiChartLineUp.js.map +1 -0
- package/dist/icons/components/UiClockCountdown.cjs +15 -0
- package/dist/icons/components/UiClockCountdown.cjs.map +1 -0
- package/dist/icons/components/UiClockCountdown.d.ts +15 -0
- package/dist/icons/components/UiClockCountdown.d.ts.map +1 -0
- package/dist/icons/components/UiClockCountdown.js +15 -0
- package/dist/icons/components/UiClockCountdown.js.map +1 -0
- package/dist/icons/components/UiFactory.cjs +15 -0
- package/dist/icons/components/UiFactory.cjs.map +1 -0
- package/dist/icons/components/UiFactory.d.ts +15 -0
- package/dist/icons/components/UiFactory.d.ts.map +1 -0
- package/dist/icons/components/UiFactory.js +15 -0
- package/dist/icons/components/UiFactory.js.map +1 -0
- package/dist/icons/components/UiHandCoins.cjs +15 -0
- package/dist/icons/components/UiHandCoins.cjs.map +1 -0
- package/dist/icons/components/UiHandCoins.d.ts +15 -0
- package/dist/icons/components/UiHandCoins.d.ts.map +1 -0
- package/dist/icons/components/UiHandCoins.js +15 -0
- package/dist/icons/components/UiHandCoins.js.map +1 -0
- package/dist/icons/components/UiInvoice.cjs +15 -0
- package/dist/icons/components/UiInvoice.cjs.map +1 -0
- package/dist/icons/components/UiInvoice.d.ts +15 -0
- package/dist/icons/components/UiInvoice.d.ts.map +1 -0
- package/dist/icons/components/UiInvoice.js +15 -0
- package/dist/icons/components/UiInvoice.js.map +1 -0
- package/dist/icons/components/UiTax.cjs +15 -0
- package/dist/icons/components/UiTax.cjs.map +1 -0
- package/dist/icons/components/UiTax.d.ts +15 -0
- package/dist/icons/components/UiTax.d.ts.map +1 -0
- package/dist/icons/components/UiTax.js +15 -0
- package/dist/icons/components/UiTax.js.map +1 -0
- package/dist/icons/index.d.ts +14 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +14 -0
- package/dist/icons/registry.cjs.map +1 -1
- package/dist/icons/registry.d.ts.map +1 -1
- package/dist/icons/registry.js +14 -0
- package/dist/icons/registry.js.map +1 -1
- package/dist/icons.cjs +21 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.js +21 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +43 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +44 -1
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.cjs +17 -3
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.js +17 -3
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/overlay/DropdownMenu.cjs +46 -35
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.js +46 -35
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/rpc/FilterForm.cjs +26 -11
- package/dist/rpc/FilterForm.cjs.map +1 -1
- package/dist/rpc/FilterForm.d.ts +4 -1
- package/dist/rpc/FilterForm.d.ts.map +1 -1
- package/dist/rpc/FilterForm.js +26 -11
- package/dist/rpc/FilterForm.js.map +1 -1
- package/dist/rpc/FilterFormFields.cjs +3 -2
- package/dist/rpc/FilterFormFields.cjs.map +1 -1
- package/dist/rpc/FilterFormFields.d.ts +2 -1
- package/dist/rpc/FilterFormFields.d.ts.map +1 -1
- package/dist/rpc/FilterFormFields.js +3 -2
- package/dist/rpc/FilterFormFields.js.map +1 -1
- package/dist/rpc/OperationActionBar.cjs +67 -15
- package/dist/rpc/OperationActionBar.cjs.map +1 -1
- package/dist/rpc/OperationActionBar.d.ts +11 -3
- package/dist/rpc/OperationActionBar.d.ts.map +1 -1
- package/dist/rpc/OperationActionBar.js +68 -16
- package/dist/rpc/OperationActionBar.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +69 -76
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +3 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +69 -76
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationCatalogActions.cjs +69 -0
- package/dist/rpc/OperationCatalogActions.cjs.map +1 -0
- package/dist/rpc/OperationCatalogActions.d.ts +17 -0
- package/dist/rpc/OperationCatalogActions.d.ts.map +1 -0
- package/dist/rpc/OperationCatalogActions.js +69 -0
- package/dist/rpc/OperationCatalogActions.js.map +1 -0
- package/dist/rpc/OperationEntityContextPicker.cjs +129 -116
- package/dist/rpc/OperationEntityContextPicker.cjs.map +1 -1
- package/dist/rpc/OperationEntityContextPicker.d.ts +18 -1
- package/dist/rpc/OperationEntityContextPicker.d.ts.map +1 -1
- package/dist/rpc/OperationEntityContextPicker.js +130 -117
- package/dist/rpc/OperationEntityContextPicker.js.map +1 -1
- package/dist/rpc/OperationResultView.cjs +7 -4
- package/dist/rpc/OperationResultView.cjs.map +1 -1
- package/dist/rpc/OperationResultView.d.ts +4 -2
- package/dist/rpc/OperationResultView.d.ts.map +1 -1
- package/dist/rpc/OperationResultView.js +7 -4
- package/dist/rpc/OperationResultView.js.map +1 -1
- package/dist/rpc/operationCatalogUrl.cjs +28 -0
- package/dist/rpc/operationCatalogUrl.cjs.map +1 -0
- package/dist/rpc/operationCatalogUrl.d.ts +3 -0
- package/dist/rpc/operationCatalogUrl.d.ts.map +1 -0
- package/dist/rpc/operationCatalogUrl.js +28 -0
- package/dist/rpc/operationCatalogUrl.js.map +1 -0
- package/dist/rpc/rowNavigation.cjs +4 -3
- package/dist/rpc/rowNavigation.cjs.map +1 -1
- package/dist/rpc/rowNavigation.d.ts +1 -1
- package/dist/rpc/rowNavigation.d.ts.map +1 -1
- package/dist/rpc/rowNavigation.js +4 -3
- package/dist/rpc/rowNavigation.js.map +1 -1
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +2 -2
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/rpc.cjs +2 -0
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +2 -1
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -0
- package/dist/rpc.js.map +1 -1
- package/dist/runtime-profile.cjs +7 -0
- package/dist/runtime-profile.cjs.map +1 -0
- package/dist/runtime-profile.d.ts +2 -0
- package/dist/runtime-profile.d.ts.map +1 -0
- package/dist/runtime-profile.js +7 -0
- package/dist/runtime-profile.js.map +1 -0
- package/dist/styles.css +1 -1
- package/package.json +6 -1
|
@@ -31,7 +31,7 @@ const DEFAULT_SOURCES = [
|
|
|
31
31
|
];
|
|
32
32
|
const DefaultModelIcon = ({ className }) => /* @__PURE__ */ jsxRuntime.jsx(UiRobotAi.UiRobotAi, { className });
|
|
33
33
|
function runtimeModeMatchesShortcut(mode, shortcut) {
|
|
34
|
-
return mode.id === shortcut
|
|
34
|
+
return mode.id === shortcut;
|
|
35
35
|
}
|
|
36
36
|
function resolveModelShortcut(detail, models, families) {
|
|
37
37
|
var _a;
|
|
@@ -53,7 +53,7 @@ function resolveModelShortcut(detail, models, families) {
|
|
|
53
53
|
throw new Error(`shortcut ${value} needs a model catalog`);
|
|
54
54
|
}
|
|
55
55
|
const model = modelForShortcut(value, alias, models);
|
|
56
|
-
const
|
|
56
|
+
const specMode = modeForShortcut(value, mode, model, runtimeFamilies);
|
|
57
57
|
if (effort && ((_a = model.supportedEfforts) == null ? void 0 : _a.length) && !model.supportedEfforts.includes(effort)) {
|
|
58
58
|
throw new Error(`shortcut ${value} does not support effort ${effort}`);
|
|
59
59
|
}
|
|
@@ -62,7 +62,7 @@ function resolveModelShortcut(detail, models, families) {
|
|
|
62
62
|
spec: {
|
|
63
63
|
...detail.spec,
|
|
64
64
|
model: model.id,
|
|
65
|
-
|
|
65
|
+
mode: specMode,
|
|
66
66
|
...effort ? { effort } : {}
|
|
67
67
|
}
|
|
68
68
|
};
|
|
@@ -82,20 +82,17 @@ function modelForShortcut(value, alias, models) {
|
|
|
82
82
|
`model shortcut ${JSON.stringify(value)} matched ${matches.length} catalog models`
|
|
83
83
|
);
|
|
84
84
|
}
|
|
85
|
-
function
|
|
86
|
-
const
|
|
85
|
+
function modeForShortcut(value, mode, model, families) {
|
|
86
|
+
const modes = new Set(
|
|
87
87
|
families.flatMap(
|
|
88
88
|
(family) => family.modes.filter(
|
|
89
|
-
(item) =>
|
|
90
|
-
|
|
91
|
-
return runtimeModeMatchesShortcut(item, mode) && (((_a = model.backends) == null ? void 0 : _a.includes(item.backend)) || !((_b = model.backends) == null ? void 0 : _b.length) && family.provider === model.provider);
|
|
92
|
-
}
|
|
93
|
-
).map((item) => item.backend)
|
|
89
|
+
(item) => runtimeModeMatchesShortcut(item, mode) && family.provider === model.provider
|
|
90
|
+
).map((item) => item.id)
|
|
94
91
|
)
|
|
95
92
|
);
|
|
96
|
-
if (
|
|
93
|
+
if (modes.size === 1) return [...modes][0];
|
|
97
94
|
throw new Error(
|
|
98
|
-
`model shortcut ${JSON.stringify(value)} matched ${
|
|
95
|
+
`model shortcut ${JSON.stringify(value)} matched ${modes.size} runtime modes`
|
|
99
96
|
);
|
|
100
97
|
}
|
|
101
98
|
function PromptPickerField({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PromptPicker.cjs","sources":["../../../../src/data/ai/PromptPicker/PromptPicker.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../../components/button\";\nimport { SegmentedControl } from \"../../../components/SegmentedControl\";\nimport { UiRobotAi } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport { Modal } from \"../../../overlay/Modal\";\nimport { providerIcon, type ProviderGlyph } from \"../../chat/provider-icons\";\nimport type { ChatModel } from \"../../chat/types\";\nimport { SpecRuntimeEditor } from \"../SpecRuntimeEditor\";\nimport type { SpecSectionId } from \"../SpecRuntimeEditor/types\";\nimport type { AISpecRuntimeValue } from \"../SpecRuntimeEditor.model\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport {\n promptPreviewText,\n promptRuntimeValueToPayload,\n specToPromptRuntimeValue,\n} from \"./prompt-runtime\";\nimport { PromptSourceRepair } from \"./PromptSourceRepair\";\nimport {\n isValidPromptSpecDetail,\n type PromptPickerValue,\n type PromptSpecDetail,\n type PromptSpecSavePayload,\n type ValidPromptSpecDetail,\n} from \"./types\";\n\nexport type PromptPickerFieldProps = {\n value?: PromptPickerValue | undefined;\n onChange: (value: PromptPickerValue | undefined) => void;\n title: string;\n description?: string | undefined;\n loadDetail: () => Promise<PromptSpecDetail>;\n saveDetail: (payload: PromptSpecSavePayload) => Promise<PromptSpecDetail>;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n sections?: readonly SpecSectionId[] | undefined;\n sources?: readonly [PromptSource, ...PromptSource[]] | undefined;\n className?: string | undefined;\n disabled?: boolean | undefined;\n};\n\nexport type SpecEditorDialogProps = {\n open: boolean;\n title: string;\n detail: ValidPromptSpecDetail;\n saveDetail: (payload: PromptSpecSavePayload) => Promise<PromptSpecDetail>;\n onClose: () => void;\n onSaved: (detail: PromptSpecDetail) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n sections?: readonly SpecSectionId[] | undefined;\n sources?: readonly [PromptSource, ...PromptSource[]] | undefined;\n};\n\nexport type PromptSource = \"inline\" | \"file\";\n\nconst DEFAULT_SECTIONS: readonly SpecSectionId[] = [\n \"model\",\n \"prompt\",\n \"workspace\",\n \"permissions\",\n \"environment\",\n \"cli\",\n];\n\nconst SOURCE_OPTIONS: Array<{ id: PromptSource; label: string }> = [\n { id: \"inline\", label: \"Inline\" },\n { id: \"file\", label: \"File\" },\n];\nconst DEFAULT_SOURCES: readonly [PromptSource, ...PromptSource[]] = [\n \"inline\",\n \"file\",\n];\n\nconst DefaultModelIcon: ProviderGlyph = ({ className }) => (\n <UiRobotAi className={className} />\n);\n\nfunction runtimeModeMatchesShortcut(\n mode: { id: string; backend: string },\n shortcut: string\n): boolean {\n return mode.id === shortcut || mode.backend.endsWith(`-${shortcut}`);\n}\n\nfunction resolveModelShortcut(\n detail: PromptSpecDetail,\n models: ChatModel[] | undefined,\n families: SpecRuntimeFamily[] | undefined\n): PromptSpecDetail {\n if (!isValidPromptSpecDetail(detail)) return detail;\n const value = detail.spec.model;\n if (typeof value !== \"string\") return detail;\n\n const parts = value.split(\":\").map((part) => part.trim());\n if (parts.length < 2 || parts.length > 3) return detail;\n const [prefix, alias, effort] = parts;\n if (!prefix) return detail;\n const mode = prefix === \"sdk\" ? \"agent\" : prefix;\n const runtimeFamilies = families ?? SPEC_RUNTIME_FAMILIES;\n if (\n !runtimeFamilies.some((family) =>\n family.modes.some((item) => runtimeModeMatchesShortcut(item, mode))\n )\n ) {\n return detail;\n }\n if (!alias || !models?.length) {\n throw new Error(`shortcut ${value} needs a model catalog`);\n }\n\n const model = modelForShortcut(value, alias, models);\n const backend = backendForShortcut(value, mode, model, runtimeFamilies);\n if (\n effort &&\n model.supportedEfforts?.length &&\n !model.supportedEfforts.includes(effort)\n ) {\n throw new Error(`shortcut ${value} does not support effort ${effort}`);\n }\n\n return {\n ...detail,\n spec: {\n ...detail.spec,\n model: model.id,\n backend,\n ...(effort ? { effort } : {}),\n },\n };\n}\n\nfunction modelForShortcut(\n value: string,\n alias: string,\n models: ChatModel[]\n): ChatModel {\n const normalizedAlias = alias.toLowerCase();\n const exact = models.filter((model) =>\n [model.id, model.label].some(\n (candidate) => candidate.toLowerCase() === normalizedAlias\n )\n );\n const matches = exact.length\n ? exact\n : models.filter(\n (model) =>\n model.id\n .toLowerCase()\n .split(/[\\s/_.-]+/)\n .filter(Boolean)\n .at(-1) === normalizedAlias\n );\n if (matches.length === 1) return matches[0]!;\n throw new Error(\n `model shortcut ${JSON.stringify(value)} matched ${\n matches.length\n } catalog models`\n );\n}\n\nfunction backendForShortcut(\n value: string,\n mode: string,\n model: ChatModel,\n families: SpecRuntimeFamily[]\n): string {\n const backends = new Set(\n families.flatMap((family) =>\n family.modes\n .filter(\n (item) =>\n runtimeModeMatchesShortcut(item, mode) &&\n (model.backends?.includes(item.backend) ||\n (!model.backends?.length && family.provider === model.provider))\n )\n .map((item) => item.backend)\n )\n );\n if (backends.size === 1) return [...backends][0]!;\n throw new Error(\n `model shortcut ${JSON.stringify(value)} matched ${\n backends.size\n } runtime backends`\n );\n}\n\nexport function PromptPickerField({\n value: _value,\n onChange,\n title,\n description,\n loadDetail,\n saveDetail,\n models,\n families,\n sections,\n sources = DEFAULT_SOURCES,\n className,\n disabled,\n}: PromptPickerFieldProps) {\n const [detail, setDetail] = useState<PromptSpecDetail | null>(null);\n const [error, setError] = useState(\"\");\n const [editing, setEditing] = useState(false);\n\n const load = useCallback(() => {\n setError(\"\");\n void loadDetail()\n .then((next) => setDetail(resolveModelShortcut(next, models, families)))\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : \"failed to load prompt\");\n });\n }, [families, loadDetail, models]);\n\n useEffect(() => {\n load();\n }, [load]);\n\n const model = useMemo(() => modelDisplay(detail, models), [detail, models]);\n const prompt = promptPreviewText(detail);\n const rowTitle = [title, description, prompt].filter(Boolean).join(\"\\n\");\n // A parse error is rendered data, not a load failure: it keeps the row\n // actionable so the raw source can be repaired. Only a genuine load failure\n // (no detail) disables the row.\n const parseError = detail?.parseError ?? \"\";\n const shownError = error || parseError;\n const isDisabled = disabled || !detail;\n\n const onSaved = (next: PromptSpecDetail) => {\n setDetail(next);\n if (next.source === \"default\") {\n onChange(undefined);\n } else {\n onChange(\n next.source === \"file\"\n ? { file: next.path ?? \"\" }\n : { inline: next.raw }\n );\n }\n setEditing(false);\n };\n\n const Glyph = model.icon;\n\n return (\n <div className={cn(\"w-full min-w-0 max-w-full overflow-hidden\", className)}>\n <button\n type=\"button\"\n className={cn(\n \"flex h-9 w-full min-w-0 max-w-full items-center gap-2 overflow-hidden rounded-md border border-border bg-background px-2 text-left text-sm transition-colors\",\n \"hover:bg-muted/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n shownError && \"border-destructive/40 text-destructive\"\n )}\n title={shownError || rowTitle}\n aria-label={`Edit prompt ${title}`}\n disabled={isDisabled}\n onClick={() => setEditing(true)}\n >\n <Glyph className=\"size-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 max-w-[40%] flex-none truncate font-medium text-foreground\">\n {shownError ? \"Prompt error\" : model.label}\n </span>\n <span className=\"h-4 w-px shrink-0 bg-border\" aria-hidden=\"true\" />\n <span className=\"min-w-0 basis-0 flex-1 truncate text-muted-foreground\">\n {shownError || (detail ? prompt : \"Loading prompt...\")}\n </span>\n </button>\n\n {editing &&\n detail &&\n (isValidPromptSpecDetail(detail) ? (\n <SpecEditorDialog\n open={editing}\n title={title}\n detail={detail}\n saveDetail={saveDetail}\n onClose={() => setEditing(false)}\n onSaved={onSaved}\n models={models}\n families={families}\n sections={sections}\n sources={sources}\n />\n ) : (\n <PromptSourceRepair\n open={editing}\n title={title}\n detail={detail}\n saveDetail={saveDetail}\n onClose={() => setEditing(false)}\n onSaved={onSaved}\n />\n ))}\n </div>\n );\n}\n\nexport function SpecEditorDialog({\n open,\n title,\n detail,\n saveDetail,\n onClose,\n onSaved,\n models,\n families,\n sections = DEFAULT_SECTIONS,\n sources = DEFAULT_SOURCES,\n}: SpecEditorDialogProps) {\n const [value, setValue] = useState<AISpecRuntimeValue>(() =>\n specToPromptRuntimeValue(detail.spec, detail.body)\n );\n const selectedSource = detail.source === \"file\" ? \"file\" : \"inline\";\n const initialSource = sources.includes(selectedSource)\n ? selectedSource\n : sources[0];\n const sourceOptions = SOURCE_OPTIONS.filter((option) =>\n sources.includes(option.id)\n );\n const [source, setSource] = useState<PromptSource>(initialSource);\n const [path, setPath] = useState(detail.path ?? \"\");\n const [error, setError] = useState(\"\");\n const [saving, setSaving] = useState(false);\n\n useEffect(() => {\n if (!open) return;\n setValue(specToPromptRuntimeValue(detail.spec, detail.body));\n setSource(initialSource);\n setPath(detail.path ?? \"\");\n setError(\"\");\n }, [detail, initialSource, open]);\n\n if (!open) return null;\n\n const dirty =\n JSON.stringify(value) !==\n JSON.stringify(specToPromptRuntimeValue(detail.spec, detail.body)) ||\n source !== initialSource ||\n path !== (detail.path ?? \"\");\n\n async function save() {\n setSaving(true);\n setError(\"\");\n const { spec, body } = promptRuntimeValueToPayload(value);\n try {\n const next = await saveDetail({\n source,\n path: source === \"file\" ? path : undefined,\n spec,\n body,\n baseRaw: detail.raw,\n });\n onSaved(next);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : \"save failed\");\n } finally {\n setSaving(false);\n }\n }\n\n async function resetDefault() {\n setSaving(true);\n setError(\"\");\n try {\n const next = await saveDetail({ source: \"default\", baseRaw: detail.raw });\n onSaved(next);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : \"reset failed\");\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n confirmClose={dirty}\n title={`Edit prompt · ${title}`}\n size=\"2xl\"\n className=\"h-[92vh]\"\n footer={\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n {error ? (\n <span className=\"whitespace-pre-wrap text-sm text-destructive\">\n {error}\n </span>\n ) : detail.source !== \"default\" ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={resetDefault}\n disabled={saving}\n >\n Reset to default\n </Button>\n ) : null}\n </div>\n <div className=\"flex shrink-0 gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={onClose}\n disabled={saving}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={save}\n disabled={saving || (source === \"file\" && path.trim() === \"\")}\n >\n {saving ? \"Saving...\" : \"Save\"}\n </Button>\n </div>\n </div>\n }\n >\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n {sourceOptions.length > 1 && (\n <>\n <span className=\"text-xs font-medium text-muted-foreground\">\n Save to\n </span>\n <SegmentedControl\n size=\"sm\"\n value={source}\n options={sourceOptions}\n onChange={setSource}\n aria-label=\"Save location\"\n />\n </>\n )}\n {source === \"file\" && (\n <input\n type=\"text\"\n className=\"flex-1 rounded-md border border-border bg-background p-1.5 font-mono text-xs\"\n value={path}\n placeholder=\"./prompts/my-prompt.prompt\"\n spellCheck={false}\n onChange={(event) => setPath(event.currentTarget.value)}\n />\n )}\n </div>\n\n <SpecRuntimeEditor\n value={value}\n onChange={setValue}\n models={models}\n families={families}\n sections={sections}\n showHeader={false}\n />\n </div>\n </Modal>\n );\n}\n\nfunction modelDisplay(\n detail: PromptSpecDetail | null,\n models: ChatModel[] | undefined\n): { label: string; icon: ProviderGlyph } {\n const modelValue = detail?.spec?.model;\n const modelID =\n typeof modelValue === \"string\" && modelValue.trim()\n ? modelValue.trim()\n : \"\";\n const matched = models?.find(\n (model) => model.id === modelID || model.label === modelID\n );\n const provider = matched?.provider ?? inferProvider(modelID);\n return {\n label: matched?.label ?? (modelID || \"Default model\"),\n icon: providerIcon(provider) ?? DefaultModelIcon,\n };\n}\n\nfunction inferProvider(modelID: string): string | undefined {\n const model = modelID.toLowerCase();\n if (!model) return undefined;\n if (model.includes(\"claude\") || model.includes(\"anthropic\"))\n return \"anthropic\";\n if (model.includes(\"gemini\") || model.includes(\"google\")) return \"gemini\";\n if (\n model.includes(\"openai\") ||\n model.includes(\"gpt\") ||\n model.includes(\"codex\") ||\n /^o\\d/.test(model)\n ) {\n return \"openai\";\n }\n return undefined;\n}\n"],"names":["jsx","UiRobotAi","isValidPromptSpecDetail","SPEC_RUNTIME_FAMILIES","useState","useCallback","useEffect","useMemo","promptPreviewText","cn","jsxs","PromptSourceRepair","specToPromptRuntimeValue","promptRuntimeValueToPayload","Modal","Button","Fragment","SegmentedControl","SpecRuntimeEditor","providerIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PromptPicker.cjs","sources":["../../../../src/data/ai/PromptPicker/PromptPicker.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../../components/button\";\nimport { SegmentedControl } from \"../../../components/SegmentedControl\";\nimport { UiRobotAi } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport { Modal } from \"../../../overlay/Modal\";\nimport { providerIcon, type ProviderGlyph } from \"../../chat/provider-icons\";\nimport type { ChatModel } from \"../../chat/types\";\nimport { SpecRuntimeEditor } from \"../SpecRuntimeEditor\";\nimport type { SpecSectionId } from \"../SpecRuntimeEditor/types\";\nimport type { AISpecRuntimeValue } from \"../SpecRuntimeEditor.model\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport {\n promptPreviewText,\n promptRuntimeValueToPayload,\n specToPromptRuntimeValue,\n} from \"./prompt-runtime\";\nimport { PromptSourceRepair } from \"./PromptSourceRepair\";\nimport {\n isValidPromptSpecDetail,\n type PromptPickerValue,\n type PromptSpecDetail,\n type PromptSpecSavePayload,\n type ValidPromptSpecDetail,\n} from \"./types\";\n\nexport type PromptPickerFieldProps = {\n value?: PromptPickerValue | undefined;\n onChange: (value: PromptPickerValue | undefined) => void;\n title: string;\n description?: string | undefined;\n loadDetail: () => Promise<PromptSpecDetail>;\n saveDetail: (payload: PromptSpecSavePayload) => Promise<PromptSpecDetail>;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n sections?: readonly SpecSectionId[] | undefined;\n sources?: readonly [PromptSource, ...PromptSource[]] | undefined;\n className?: string | undefined;\n disabled?: boolean | undefined;\n};\n\nexport type SpecEditorDialogProps = {\n open: boolean;\n title: string;\n detail: ValidPromptSpecDetail;\n saveDetail: (payload: PromptSpecSavePayload) => Promise<PromptSpecDetail>;\n onClose: () => void;\n onSaved: (detail: PromptSpecDetail) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n sections?: readonly SpecSectionId[] | undefined;\n sources?: readonly [PromptSource, ...PromptSource[]] | undefined;\n};\n\nexport type PromptSource = \"inline\" | \"file\";\n\nconst DEFAULT_SECTIONS: readonly SpecSectionId[] = [\n \"model\",\n \"prompt\",\n \"workspace\",\n \"permissions\",\n \"environment\",\n \"cli\",\n];\n\nconst SOURCE_OPTIONS: Array<{ id: PromptSource; label: string }> = [\n { id: \"inline\", label: \"Inline\" },\n { id: \"file\", label: \"File\" },\n];\nconst DEFAULT_SOURCES: readonly [PromptSource, ...PromptSource[]] = [\n \"inline\",\n \"file\",\n];\n\nconst DefaultModelIcon: ProviderGlyph = ({ className }) => (\n <UiRobotAi className={className} />\n);\n\n// A mode id is the shortcut. The suffix match this replaces (`-${shortcut}`)\n// only ever fired on the composite adapter ids — \"claude-agent\" ending in\n// \"-agent\" — which no longer exist.\nfunction runtimeModeMatchesShortcut(\n mode: { id: string },\n shortcut: string\n): boolean {\n return mode.id === shortcut;\n}\n\nfunction resolveModelShortcut(\n detail: PromptSpecDetail,\n models: ChatModel[] | undefined,\n families: SpecRuntimeFamily[] | undefined\n): PromptSpecDetail {\n if (!isValidPromptSpecDetail(detail)) return detail;\n const value = detail.spec.model;\n if (typeof value !== \"string\") return detail;\n\n const parts = value.split(\":\").map((part) => part.trim());\n if (parts.length < 2 || parts.length > 3) return detail;\n const [prefix, alias, effort] = parts;\n if (!prefix) return detail;\n const mode = prefix === \"sdk\" ? \"agent\" : prefix;\n const runtimeFamilies = families ?? SPEC_RUNTIME_FAMILIES;\n if (\n !runtimeFamilies.some((family) =>\n family.modes.some((item) => runtimeModeMatchesShortcut(item, mode))\n )\n ) {\n return detail;\n }\n if (!alias || !models?.length) {\n throw new Error(`shortcut ${value} needs a model catalog`);\n }\n\n const model = modelForShortcut(value, alias, models);\n const specMode = modeForShortcut(value, mode, model, runtimeFamilies);\n if (\n effort &&\n model.supportedEfforts?.length &&\n !model.supportedEfforts.includes(effort)\n ) {\n throw new Error(`shortcut ${value} does not support effort ${effort}`);\n }\n\n return {\n ...detail,\n spec: {\n ...detail.spec,\n model: model.id,\n mode: specMode,\n ...(effort ? { effort } : {}),\n },\n };\n}\n\nfunction modelForShortcut(\n value: string,\n alias: string,\n models: ChatModel[]\n): ChatModel {\n const normalizedAlias = alias.toLowerCase();\n const exact = models.filter((model) =>\n [model.id, model.label].some(\n (candidate) => candidate.toLowerCase() === normalizedAlias\n )\n );\n const matches = exact.length\n ? exact\n : models.filter(\n (model) =>\n model.id\n .toLowerCase()\n .split(/[\\s/_.-]+/)\n .filter(Boolean)\n .at(-1) === normalizedAlias\n );\n if (matches.length === 1) return matches[0]!;\n throw new Error(\n `model shortcut ${JSON.stringify(value)} matched ${\n matches.length\n } catalog models`\n );\n}\n\nfunction modeForShortcut(\n value: string,\n mode: string,\n model: ChatModel,\n families: SpecRuntimeFamily[]\n): string {\n const modes = new Set(\n families.flatMap((family) =>\n family.modes\n .filter(\n (item) =>\n runtimeModeMatchesShortcut(item, mode) &&\n family.provider === model.provider\n )\n .map((item) => item.id)\n )\n );\n if (modes.size === 1) return [...modes][0]!;\n throw new Error(\n `model shortcut ${JSON.stringify(value)} matched ${modes.size} runtime modes`\n );\n}\n\nexport function PromptPickerField({\n value: _value,\n onChange,\n title,\n description,\n loadDetail,\n saveDetail,\n models,\n families,\n sections,\n sources = DEFAULT_SOURCES,\n className,\n disabled,\n}: PromptPickerFieldProps) {\n const [detail, setDetail] = useState<PromptSpecDetail | null>(null);\n const [error, setError] = useState(\"\");\n const [editing, setEditing] = useState(false);\n\n const load = useCallback(() => {\n setError(\"\");\n void loadDetail()\n .then((next) => setDetail(resolveModelShortcut(next, models, families)))\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : \"failed to load prompt\");\n });\n }, [families, loadDetail, models]);\n\n useEffect(() => {\n load();\n }, [load]);\n\n const model = useMemo(() => modelDisplay(detail, models), [detail, models]);\n const prompt = promptPreviewText(detail);\n const rowTitle = [title, description, prompt].filter(Boolean).join(\"\\n\");\n // A parse error is rendered data, not a load failure: it keeps the row\n // actionable so the raw source can be repaired. Only a genuine load failure\n // (no detail) disables the row.\n const parseError = detail?.parseError ?? \"\";\n const shownError = error || parseError;\n const isDisabled = disabled || !detail;\n\n const onSaved = (next: PromptSpecDetail) => {\n setDetail(next);\n if (next.source === \"default\") {\n onChange(undefined);\n } else {\n onChange(\n next.source === \"file\"\n ? { file: next.path ?? \"\" }\n : { inline: next.raw }\n );\n }\n setEditing(false);\n };\n\n const Glyph = model.icon;\n\n return (\n <div className={cn(\"w-full min-w-0 max-w-full overflow-hidden\", className)}>\n <button\n type=\"button\"\n className={cn(\n \"flex h-9 w-full min-w-0 max-w-full items-center gap-2 overflow-hidden rounded-md border border-border bg-background px-2 text-left text-sm transition-colors\",\n \"hover:bg-muted/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n shownError && \"border-destructive/40 text-destructive\"\n )}\n title={shownError || rowTitle}\n aria-label={`Edit prompt ${title}`}\n disabled={isDisabled}\n onClick={() => setEditing(true)}\n >\n <Glyph className=\"size-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 max-w-[40%] flex-none truncate font-medium text-foreground\">\n {shownError ? \"Prompt error\" : model.label}\n </span>\n <span className=\"h-4 w-px shrink-0 bg-border\" aria-hidden=\"true\" />\n <span className=\"min-w-0 basis-0 flex-1 truncate text-muted-foreground\">\n {shownError || (detail ? prompt : \"Loading prompt...\")}\n </span>\n </button>\n\n {editing &&\n detail &&\n (isValidPromptSpecDetail(detail) ? (\n <SpecEditorDialog\n open={editing}\n title={title}\n detail={detail}\n saveDetail={saveDetail}\n onClose={() => setEditing(false)}\n onSaved={onSaved}\n models={models}\n families={families}\n sections={sections}\n sources={sources}\n />\n ) : (\n <PromptSourceRepair\n open={editing}\n title={title}\n detail={detail}\n saveDetail={saveDetail}\n onClose={() => setEditing(false)}\n onSaved={onSaved}\n />\n ))}\n </div>\n );\n}\n\nexport function SpecEditorDialog({\n open,\n title,\n detail,\n saveDetail,\n onClose,\n onSaved,\n models,\n families,\n sections = DEFAULT_SECTIONS,\n sources = DEFAULT_SOURCES,\n}: SpecEditorDialogProps) {\n const [value, setValue] = useState<AISpecRuntimeValue>(() =>\n specToPromptRuntimeValue(detail.spec, detail.body)\n );\n const selectedSource = detail.source === \"file\" ? \"file\" : \"inline\";\n const initialSource = sources.includes(selectedSource)\n ? selectedSource\n : sources[0];\n const sourceOptions = SOURCE_OPTIONS.filter((option) =>\n sources.includes(option.id)\n );\n const [source, setSource] = useState<PromptSource>(initialSource);\n const [path, setPath] = useState(detail.path ?? \"\");\n const [error, setError] = useState(\"\");\n const [saving, setSaving] = useState(false);\n\n useEffect(() => {\n if (!open) return;\n setValue(specToPromptRuntimeValue(detail.spec, detail.body));\n setSource(initialSource);\n setPath(detail.path ?? \"\");\n setError(\"\");\n }, [detail, initialSource, open]);\n\n if (!open) return null;\n\n const dirty =\n JSON.stringify(value) !==\n JSON.stringify(specToPromptRuntimeValue(detail.spec, detail.body)) ||\n source !== initialSource ||\n path !== (detail.path ?? \"\");\n\n async function save() {\n setSaving(true);\n setError(\"\");\n const { spec, body } = promptRuntimeValueToPayload(value);\n try {\n const next = await saveDetail({\n source,\n path: source === \"file\" ? path : undefined,\n spec,\n body,\n baseRaw: detail.raw,\n });\n onSaved(next);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : \"save failed\");\n } finally {\n setSaving(false);\n }\n }\n\n async function resetDefault() {\n setSaving(true);\n setError(\"\");\n try {\n const next = await saveDetail({ source: \"default\", baseRaw: detail.raw });\n onSaved(next);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : \"reset failed\");\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n confirmClose={dirty}\n title={`Edit prompt · ${title}`}\n size=\"2xl\"\n className=\"h-[92vh]\"\n footer={\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n {error ? (\n <span className=\"whitespace-pre-wrap text-sm text-destructive\">\n {error}\n </span>\n ) : detail.source !== \"default\" ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={resetDefault}\n disabled={saving}\n >\n Reset to default\n </Button>\n ) : null}\n </div>\n <div className=\"flex shrink-0 gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={onClose}\n disabled={saving}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={save}\n disabled={saving || (source === \"file\" && path.trim() === \"\")}\n >\n {saving ? \"Saving...\" : \"Save\"}\n </Button>\n </div>\n </div>\n }\n >\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n {sourceOptions.length > 1 && (\n <>\n <span className=\"text-xs font-medium text-muted-foreground\">\n Save to\n </span>\n <SegmentedControl\n size=\"sm\"\n value={source}\n options={sourceOptions}\n onChange={setSource}\n aria-label=\"Save location\"\n />\n </>\n )}\n {source === \"file\" && (\n <input\n type=\"text\"\n className=\"flex-1 rounded-md border border-border bg-background p-1.5 font-mono text-xs\"\n value={path}\n placeholder=\"./prompts/my-prompt.prompt\"\n spellCheck={false}\n onChange={(event) => setPath(event.currentTarget.value)}\n />\n )}\n </div>\n\n <SpecRuntimeEditor\n value={value}\n onChange={setValue}\n models={models}\n families={families}\n sections={sections}\n showHeader={false}\n />\n </div>\n </Modal>\n );\n}\n\nfunction modelDisplay(\n detail: PromptSpecDetail | null,\n models: ChatModel[] | undefined\n): { label: string; icon: ProviderGlyph } {\n const modelValue = detail?.spec?.model;\n const modelID =\n typeof modelValue === \"string\" && modelValue.trim()\n ? modelValue.trim()\n : \"\";\n const matched = models?.find(\n (model) => model.id === modelID || model.label === modelID\n );\n const provider = matched?.provider ?? inferProvider(modelID);\n return {\n label: matched?.label ?? (modelID || \"Default model\"),\n icon: providerIcon(provider) ?? DefaultModelIcon,\n };\n}\n\nfunction inferProvider(modelID: string): string | undefined {\n const model = modelID.toLowerCase();\n if (!model) return undefined;\n if (model.includes(\"claude\") || model.includes(\"anthropic\"))\n return \"anthropic\";\n if (model.includes(\"gemini\") || model.includes(\"google\")) return \"gemini\";\n if (\n model.includes(\"openai\") ||\n model.includes(\"gpt\") ||\n model.includes(\"codex\") ||\n /^o\\d/.test(model)\n ) {\n return \"openai\";\n }\n return undefined;\n}\n"],"names":["jsx","UiRobotAi","isValidPromptSpecDetail","SPEC_RUNTIME_FAMILIES","useState","useCallback","useEffect","useMemo","promptPreviewText","cn","jsxs","PromptSourceRepair","specToPromptRuntimeValue","promptRuntimeValueToPayload","Modal","Button","Fragment","SegmentedControl","SpecRuntimeEditor","providerIcon"],"mappings":";;;;;;;;;;;;;;;AA2DA,MAAM,mBAA6C;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,iBAA6D;AAAA,EACjE,EAAE,IAAI,UAAU,OAAO,SAAA;AAAA,EACvB,EAAE,IAAI,QAAQ,OAAO,OAAA;AACvB;AACA,MAAM,kBAA8D;AAAA,EAClE;AAAA,EACA;AACF;AAEA,MAAM,mBAAkC,CAAC,EAAE,gBACzCA,2BAAAA,IAACC,UAAAA,aAAU,WAAsB;AAMnC,SAAS,2BACP,MACA,UACS;AACT,SAAO,KAAK,OAAO;AACrB;AAEA,SAAS,qBACP,QACA,QACA,UACkB;;AAClB,MAAI,CAACC,MAAAA,wBAAwB,MAAM,EAAG,QAAO;AAC7C,QAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,QAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,MAAM;AACxD,MAAI,MAAM,SAAS,KAAK,MAAM,SAAS,EAAG,QAAO;AACjD,QAAM,CAAC,QAAQ,OAAO,MAAM,IAAI;AAChC,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,OAAO,WAAW,QAAQ,UAAU;AAC1C,QAAM,kBAAkB,YAAYC,YAAAA;AACpC,MACE,CAAC,gBAAgB;AAAA,IAAK,CAAC,WACrB,OAAO,MAAM,KAAK,CAAC,SAAS,2BAA2B,MAAM,IAAI,CAAC;AAAA,EAAA,GAEpE;AACA,WAAO;AAAA,EACT;AACA,MAAI,CAAC,SAAS,EAAC,iCAAQ,SAAQ;AAC7B,UAAM,IAAI,MAAM,YAAY,KAAK,wBAAwB;AAAA,EAC3D;AAEA,QAAM,QAAQ,iBAAiB,OAAO,OAAO,MAAM;AACnD,QAAM,WAAW,gBAAgB,OAAO,MAAM,OAAO,eAAe;AACpE,MACE,YACA,WAAM,qBAAN,mBAAwB,WACxB,CAAC,MAAM,iBAAiB,SAAS,MAAM,GACvC;AACA,UAAM,IAAI,MAAM,YAAY,KAAK,4BAA4B,MAAM,EAAE;AAAA,EACvE;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM;AAAA,MACJ,GAAG,OAAO;AAAA,MACV,OAAO,MAAM;AAAA,MACb,MAAM;AAAA,MACN,GAAI,SAAS,EAAE,WAAW,CAAA;AAAA,IAAC;AAAA,EAC7B;AAEJ;AAEA,SAAS,iBACP,OACA,OACA,QACW;AACX,QAAM,kBAAkB,MAAM,YAAA;AAC9B,QAAM,QAAQ,OAAO;AAAA,IAAO,CAAC,UAC3B,CAAC,MAAM,IAAI,MAAM,KAAK,EAAE;AAAA,MACtB,CAAC,cAAc,UAAU,kBAAkB;AAAA,IAAA;AAAA,EAC7C;AAEF,QAAM,UAAU,MAAM,SAClB,QACA,OAAO;AAAA,IACL,CAAC,UACC,MAAM,GACH,cACA,MAAM,WAAW,EACjB,OAAO,OAAO,EACd,GAAG,EAAE,MAAM;AAAA,EAAA;AAEtB,MAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,CAAC;AAC1C,QAAM,IAAI;AAAA,IACR,kBAAkB,KAAK,UAAU,KAAK,CAAC,YACrC,QAAQ,MACV;AAAA,EAAA;AAEJ;AAEA,SAAS,gBACP,OACA,MACA,OACA,UACQ;AACR,QAAM,QAAQ,IAAI;AAAA,IAChB,SAAS;AAAA,MAAQ,CAAC,WAChB,OAAO,MACJ;AAAA,QACC,CAAC,SACC,2BAA2B,MAAM,IAAI,KACrC,OAAO,aAAa,MAAM;AAAA,MAAA,EAE7B,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,IAAA;AAAA,EAC1B;AAEF,MAAI,MAAM,SAAS,EAAG,QAAO,CAAC,GAAG,KAAK,EAAE,CAAC;AACzC,QAAM,IAAI;AAAA,IACR,kBAAkB,KAAK,UAAU,KAAK,CAAC,YAAY,MAAM,IAAI;AAAA,EAAA;AAEjE;AAEO,SAAS,kBAAkB;AAAA,EAChC,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,CAAC,QAAQ,SAAS,IAAIC,MAAAA,SAAkC,IAAI;AAClE,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAIA,MAAAA,SAAS,KAAK;AAE5C,QAAM,OAAOC,MAAAA,YAAY,MAAM;AAC7B,aAAS,EAAE;AACX,SAAK,WAAA,EACF,KAAK,CAAC,SAAS,UAAU,qBAAqB,MAAM,QAAQ,QAAQ,CAAC,CAAC,EACtE,MAAM,CAAC,QAAiB;AACvB,eAAS,eAAe,QAAQ,IAAI,UAAU,uBAAuB;AAAA,IACvE,CAAC;AAAA,EACL,GAAG,CAAC,UAAU,YAAY,MAAM,CAAC;AAEjCC,QAAAA,UAAU,MAAM;AACd,SAAA;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,QAAQC,cAAQ,MAAM,aAAa,QAAQ,MAAM,GAAG,CAAC,QAAQ,MAAM,CAAC;AAC1E,QAAM,SAASC,cAAAA,kBAAkB,MAAM;AACvC,QAAM,WAAW,CAAC,OAAO,aAAa,MAAM,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAIvE,QAAM,cAAa,iCAAQ,eAAc;AACzC,QAAM,aAAa,SAAS;AAC5B,QAAM,aAAa,YAAY,CAAC;AAEhC,QAAM,UAAU,CAAC,SAA2B;AAC1C,cAAU,IAAI;AACd,QAAI,KAAK,WAAW,WAAW;AAC7B,eAAS,MAAS;AAAA,IACpB,OAAO;AACL;AAAA,QACE,KAAK,WAAW,SACZ,EAAE,MAAM,KAAK,QAAQ,GAAA,IACrB,EAAE,QAAQ,KAAK,IAAA;AAAA,MAAI;AAAA,IAE3B;AACA,eAAW,KAAK;AAAA,EAClB;AAEA,QAAM,QAAQ,MAAM;AAEpB,yCACG,OAAA,EAAI,WAAWC,MAAAA,GAAG,6CAA6C,SAAS,GACvE,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWD,MAAAA;AAAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAc;AAAA,QAAA;AAAA,QAEhB,OAAO,cAAc;AAAA,QACrB,cAAY,eAAe,KAAK;AAAA,QAChC,UAAU;AAAA,QACV,SAAS,MAAM,WAAW,IAAI;AAAA,QAE9B,UAAA;AAAA,UAAAT,2BAAAA,IAAC,OAAA,EAAM,WAAU,wCAAA,CAAwC;AAAA,yCACxD,QAAA,EAAK,WAAU,sEACb,UAAA,aAAa,iBAAiB,MAAM,OACvC;AAAA,UACAA,2BAAAA,IAAC,QAAA,EAAK,WAAU,+BAA8B,eAAY,QAAO;AAAA,yCAChE,QAAA,EAAK,WAAU,yDACb,UAAA,eAAe,SAAS,SAAS,qBAAA,CACpC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGD,WACC,WACCE,8BAAwB,MAAM,IAC7BF,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,MAAM,WAAW,KAAK;AAAA,QAC/B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA,IAGFA,2BAAAA;AAAAA,MAACW,mBAAAA;AAAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,MAAM,WAAW,KAAK;AAAA,QAC/B;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GAEN;AAEJ;AAEO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,UAAU;AACZ,GAA0B;AACxB,QAAM,CAAC,OAAO,QAAQ,IAAIP,MAAAA;AAAAA,IAA6B,MACrDQ,uCAAyB,OAAO,MAAM,OAAO,IAAI;AAAA,EAAA;AAEnD,QAAM,iBAAiB,OAAO,WAAW,SAAS,SAAS;AAC3D,QAAM,gBAAgB,QAAQ,SAAS,cAAc,IACjD,iBACA,QAAQ,CAAC;AACb,QAAM,gBAAgB,eAAe;AAAA,IAAO,CAAC,WAC3C,QAAQ,SAAS,OAAO,EAAE;AAAA,EAAA;AAE5B,QAAM,CAAC,QAAQ,SAAS,IAAIR,MAAAA,SAAuB,aAAa;AAChE,QAAM,CAAC,MAAM,OAAO,IAAIA,MAAAA,SAAS,OAAO,QAAQ,EAAE;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAAS,EAAE;AACrC,QAAM,CAAC,QAAQ,SAAS,IAAIA,MAAAA,SAAS,KAAK;AAE1CE,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,aAASM,cAAAA,yBAAyB,OAAO,MAAM,OAAO,IAAI,CAAC;AAC3D,cAAU,aAAa;AACvB,YAAQ,OAAO,QAAQ,EAAE;AACzB,aAAS,EAAE;AAAA,EACb,GAAG,CAAC,QAAQ,eAAe,IAAI,CAAC;AAEhC,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,QACJ,KAAK,UAAU,KAAK,MAClB,KAAK,UAAUA,cAAAA,yBAAyB,OAAO,MAAM,OAAO,IAAI,CAAC,KACnE,WAAW,iBACX,UAAU,OAAO,QAAQ;AAE3B,iBAAe,OAAO;AACpB,cAAU,IAAI;AACd,aAAS,EAAE;AACX,UAAM,EAAE,MAAM,SAASC,cAAAA,4BAA4B,KAAK;AACxD,QAAI;AACF,YAAM,OAAO,MAAM,WAAW;AAAA,QAC5B;AAAA,QACA,MAAM,WAAW,SAAS,OAAO;AAAA,QACjC;AAAA,QACA;AAAA,QACA,SAAS,OAAO;AAAA,MAAA,CACjB;AACD,cAAQ,IAAI;AAAA,IACd,SAAS,KAAc;AACrB,eAAS,eAAe,QAAQ,IAAI,UAAU,aAAa;AAAA,IAC7D,UAAA;AACE,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF;AAEA,iBAAe,eAAe;AAC5B,cAAU,IAAI;AACd,aAAS,EAAE;AACX,QAAI;AACF,YAAM,OAAO,MAAM,WAAW,EAAE,QAAQ,WAAW,SAAS,OAAO,KAAK;AACxE,cAAQ,IAAI;AAAA,IACd,SAAS,KAAc;AACrB,eAAS,eAAe,QAAQ,IAAI,UAAU,cAAc;AAAA,IAC9D,UAAA;AACE,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF;AAEA,SACEb,2BAAAA;AAAAA,IAACc,MAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,OAAO,iBAAiB,KAAK;AAAA,MAC7B,MAAK;AAAA,MACL,WAAU;AAAA,MACV,QACEJ,2BAAAA,KAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,QAAAV,2BAAAA,IAAC,OAAA,EAAI,WAAU,WACZ,UAAA,QACCA,2BAAAA,IAAC,QAAA,EAAK,WAAU,gDACb,UAAA,MAAA,CACH,IACE,OAAO,WAAW,YACpBA,2BAAAA;AAAAA,UAACe,OAAAA;AAAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU;AAAA,YACX,UAAA;AAAA,UAAA;AAAA,QAAA,IAGC,KAAA,CACN;AAAA,QACAL,2BAAAA,KAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,UAAAV,2BAAAA;AAAAA,YAACe,OAAAA;AAAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,SAAS;AAAA,cACT,UAAU;AAAA,cACX,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGDf,2BAAAA;AAAAA,YAACe,OAAAA;AAAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU,UAAW,WAAW,UAAU,KAAK,WAAW;AAAA,cAEzD,mBAAS,cAAc;AAAA,YAAA;AAAA,UAAA;AAAA,QAC1B,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAGF,UAAAL,2BAAAA,KAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,QAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,UAAA,cAAc,SAAS,KACtBA,2BAAAA,KAAAM,WAAAA,UAAA,EACE,UAAA;AAAA,YAAAhB,2BAAAA,IAAC,QAAA,EAAK,WAAU,6CAA4C,UAAA,WAE5D;AAAA,YACAA,2BAAAA;AAAAA,cAACiB,iBAAAA;AAAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,cAAW;AAAA,cAAA;AAAA,YAAA;AAAA,UACb,GACF;AAAA,UAED,WAAW,UACVjB,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,OAAO;AAAA,cACP,aAAY;AAAA,cACZ,YAAY;AAAA,cACZ,UAAU,CAAC,UAAU,QAAQ,MAAM,cAAc,KAAK;AAAA,YAAA;AAAA,UAAA;AAAA,QACxD,GAEJ;AAAA,QAEAA,2BAAAA;AAAAA,UAACkB,MAAAA;AAAAA,UAAA;AAAA,YACC;AAAA,YACA,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY;AAAA,UAAA;AAAA,QAAA;AAAA,MACd,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,SAAS,aACP,QACA,QACwC;;AACxC,QAAM,cAAa,sCAAQ,SAAR,mBAAc;AACjC,QAAM,UACJ,OAAO,eAAe,YAAY,WAAW,SACzC,WAAW,KAAA,IACX;AACN,QAAM,UAAU,iCAAQ;AAAA,IACtB,CAAC,UAAU,MAAM,OAAO,WAAW,MAAM,UAAU;AAAA;AAErD,QAAM,YAAW,mCAAS,aAAY,cAAc,OAAO;AAC3D,SAAO;AAAA,IACL,QAAO,mCAAS,WAAU,WAAW;AAAA,IACrC,MAAMC,cAAAA,aAAa,QAAQ,KAAK;AAAA,EAAA;AAEpC;AAEA,SAAS,cAAc,SAAqC;AAC1D,QAAM,QAAQ,QAAQ,YAAA;AACtB,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,WAAW;AACxD,WAAO;AACT,MAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,QAAQ,EAAG,QAAO;AACjE,MACE,MAAM,SAAS,QAAQ,KACvB,MAAM,SAAS,KAAK,KACpB,MAAM,SAAS,OAAO,KACtB,OAAO,KAAK,KAAK,GACjB;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;"}
|
|
@@ -29,7 +29,7 @@ const DEFAULT_SOURCES = [
|
|
|
29
29
|
];
|
|
30
30
|
const DefaultModelIcon = ({ className }) => /* @__PURE__ */ jsx(UiRobotAi, { className });
|
|
31
31
|
function runtimeModeMatchesShortcut(mode, shortcut) {
|
|
32
|
-
return mode.id === shortcut
|
|
32
|
+
return mode.id === shortcut;
|
|
33
33
|
}
|
|
34
34
|
function resolveModelShortcut(detail, models, families) {
|
|
35
35
|
var _a;
|
|
@@ -51,7 +51,7 @@ function resolveModelShortcut(detail, models, families) {
|
|
|
51
51
|
throw new Error(`shortcut ${value} needs a model catalog`);
|
|
52
52
|
}
|
|
53
53
|
const model = modelForShortcut(value, alias, models);
|
|
54
|
-
const
|
|
54
|
+
const specMode = modeForShortcut(value, mode, model, runtimeFamilies);
|
|
55
55
|
if (effort && ((_a = model.supportedEfforts) == null ? void 0 : _a.length) && !model.supportedEfforts.includes(effort)) {
|
|
56
56
|
throw new Error(`shortcut ${value} does not support effort ${effort}`);
|
|
57
57
|
}
|
|
@@ -60,7 +60,7 @@ function resolveModelShortcut(detail, models, families) {
|
|
|
60
60
|
spec: {
|
|
61
61
|
...detail.spec,
|
|
62
62
|
model: model.id,
|
|
63
|
-
|
|
63
|
+
mode: specMode,
|
|
64
64
|
...effort ? { effort } : {}
|
|
65
65
|
}
|
|
66
66
|
};
|
|
@@ -80,20 +80,17 @@ function modelForShortcut(value, alias, models) {
|
|
|
80
80
|
`model shortcut ${JSON.stringify(value)} matched ${matches.length} catalog models`
|
|
81
81
|
);
|
|
82
82
|
}
|
|
83
|
-
function
|
|
84
|
-
const
|
|
83
|
+
function modeForShortcut(value, mode, model, families) {
|
|
84
|
+
const modes = new Set(
|
|
85
85
|
families.flatMap(
|
|
86
86
|
(family) => family.modes.filter(
|
|
87
|
-
(item) =>
|
|
88
|
-
|
|
89
|
-
return runtimeModeMatchesShortcut(item, mode) && (((_a = model.backends) == null ? void 0 : _a.includes(item.backend)) || !((_b = model.backends) == null ? void 0 : _b.length) && family.provider === model.provider);
|
|
90
|
-
}
|
|
91
|
-
).map((item) => item.backend)
|
|
87
|
+
(item) => runtimeModeMatchesShortcut(item, mode) && family.provider === model.provider
|
|
88
|
+
).map((item) => item.id)
|
|
92
89
|
)
|
|
93
90
|
);
|
|
94
|
-
if (
|
|
91
|
+
if (modes.size === 1) return [...modes][0];
|
|
95
92
|
throw new Error(
|
|
96
|
-
`model shortcut ${JSON.stringify(value)} matched ${
|
|
93
|
+
`model shortcut ${JSON.stringify(value)} matched ${modes.size} runtime modes`
|
|
97
94
|
);
|
|
98
95
|
}
|
|
99
96
|
function PromptPickerField({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PromptPicker.js","sources":["../../../../src/data/ai/PromptPicker/PromptPicker.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../../components/button\";\nimport { SegmentedControl } from \"../../../components/SegmentedControl\";\nimport { UiRobotAi } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport { Modal } from \"../../../overlay/Modal\";\nimport { providerIcon, type ProviderGlyph } from \"../../chat/provider-icons\";\nimport type { ChatModel } from \"../../chat/types\";\nimport { SpecRuntimeEditor } from \"../SpecRuntimeEditor\";\nimport type { SpecSectionId } from \"../SpecRuntimeEditor/types\";\nimport type { AISpecRuntimeValue } from \"../SpecRuntimeEditor.model\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport {\n promptPreviewText,\n promptRuntimeValueToPayload,\n specToPromptRuntimeValue,\n} from \"./prompt-runtime\";\nimport { PromptSourceRepair } from \"./PromptSourceRepair\";\nimport {\n isValidPromptSpecDetail,\n type PromptPickerValue,\n type PromptSpecDetail,\n type PromptSpecSavePayload,\n type ValidPromptSpecDetail,\n} from \"./types\";\n\nexport type PromptPickerFieldProps = {\n value?: PromptPickerValue | undefined;\n onChange: (value: PromptPickerValue | undefined) => void;\n title: string;\n description?: string | undefined;\n loadDetail: () => Promise<PromptSpecDetail>;\n saveDetail: (payload: PromptSpecSavePayload) => Promise<PromptSpecDetail>;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n sections?: readonly SpecSectionId[] | undefined;\n sources?: readonly [PromptSource, ...PromptSource[]] | undefined;\n className?: string | undefined;\n disabled?: boolean | undefined;\n};\n\nexport type SpecEditorDialogProps = {\n open: boolean;\n title: string;\n detail: ValidPromptSpecDetail;\n saveDetail: (payload: PromptSpecSavePayload) => Promise<PromptSpecDetail>;\n onClose: () => void;\n onSaved: (detail: PromptSpecDetail) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n sections?: readonly SpecSectionId[] | undefined;\n sources?: readonly [PromptSource, ...PromptSource[]] | undefined;\n};\n\nexport type PromptSource = \"inline\" | \"file\";\n\nconst DEFAULT_SECTIONS: readonly SpecSectionId[] = [\n \"model\",\n \"prompt\",\n \"workspace\",\n \"permissions\",\n \"environment\",\n \"cli\",\n];\n\nconst SOURCE_OPTIONS: Array<{ id: PromptSource; label: string }> = [\n { id: \"inline\", label: \"Inline\" },\n { id: \"file\", label: \"File\" },\n];\nconst DEFAULT_SOURCES: readonly [PromptSource, ...PromptSource[]] = [\n \"inline\",\n \"file\",\n];\n\nconst DefaultModelIcon: ProviderGlyph = ({ className }) => (\n <UiRobotAi className={className} />\n);\n\nfunction runtimeModeMatchesShortcut(\n mode: { id: string; backend: string },\n shortcut: string\n): boolean {\n return mode.id === shortcut || mode.backend.endsWith(`-${shortcut}`);\n}\n\nfunction resolveModelShortcut(\n detail: PromptSpecDetail,\n models: ChatModel[] | undefined,\n families: SpecRuntimeFamily[] | undefined\n): PromptSpecDetail {\n if (!isValidPromptSpecDetail(detail)) return detail;\n const value = detail.spec.model;\n if (typeof value !== \"string\") return detail;\n\n const parts = value.split(\":\").map((part) => part.trim());\n if (parts.length < 2 || parts.length > 3) return detail;\n const [prefix, alias, effort] = parts;\n if (!prefix) return detail;\n const mode = prefix === \"sdk\" ? \"agent\" : prefix;\n const runtimeFamilies = families ?? SPEC_RUNTIME_FAMILIES;\n if (\n !runtimeFamilies.some((family) =>\n family.modes.some((item) => runtimeModeMatchesShortcut(item, mode))\n )\n ) {\n return detail;\n }\n if (!alias || !models?.length) {\n throw new Error(`shortcut ${value} needs a model catalog`);\n }\n\n const model = modelForShortcut(value, alias, models);\n const backend = backendForShortcut(value, mode, model, runtimeFamilies);\n if (\n effort &&\n model.supportedEfforts?.length &&\n !model.supportedEfforts.includes(effort)\n ) {\n throw new Error(`shortcut ${value} does not support effort ${effort}`);\n }\n\n return {\n ...detail,\n spec: {\n ...detail.spec,\n model: model.id,\n backend,\n ...(effort ? { effort } : {}),\n },\n };\n}\n\nfunction modelForShortcut(\n value: string,\n alias: string,\n models: ChatModel[]\n): ChatModel {\n const normalizedAlias = alias.toLowerCase();\n const exact = models.filter((model) =>\n [model.id, model.label].some(\n (candidate) => candidate.toLowerCase() === normalizedAlias\n )\n );\n const matches = exact.length\n ? exact\n : models.filter(\n (model) =>\n model.id\n .toLowerCase()\n .split(/[\\s/_.-]+/)\n .filter(Boolean)\n .at(-1) === normalizedAlias\n );\n if (matches.length === 1) return matches[0]!;\n throw new Error(\n `model shortcut ${JSON.stringify(value)} matched ${\n matches.length\n } catalog models`\n );\n}\n\nfunction backendForShortcut(\n value: string,\n mode: string,\n model: ChatModel,\n families: SpecRuntimeFamily[]\n): string {\n const backends = new Set(\n families.flatMap((family) =>\n family.modes\n .filter(\n (item) =>\n runtimeModeMatchesShortcut(item, mode) &&\n (model.backends?.includes(item.backend) ||\n (!model.backends?.length && family.provider === model.provider))\n )\n .map((item) => item.backend)\n )\n );\n if (backends.size === 1) return [...backends][0]!;\n throw new Error(\n `model shortcut ${JSON.stringify(value)} matched ${\n backends.size\n } runtime backends`\n );\n}\n\nexport function PromptPickerField({\n value: _value,\n onChange,\n title,\n description,\n loadDetail,\n saveDetail,\n models,\n families,\n sections,\n sources = DEFAULT_SOURCES,\n className,\n disabled,\n}: PromptPickerFieldProps) {\n const [detail, setDetail] = useState<PromptSpecDetail | null>(null);\n const [error, setError] = useState(\"\");\n const [editing, setEditing] = useState(false);\n\n const load = useCallback(() => {\n setError(\"\");\n void loadDetail()\n .then((next) => setDetail(resolveModelShortcut(next, models, families)))\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : \"failed to load prompt\");\n });\n }, [families, loadDetail, models]);\n\n useEffect(() => {\n load();\n }, [load]);\n\n const model = useMemo(() => modelDisplay(detail, models), [detail, models]);\n const prompt = promptPreviewText(detail);\n const rowTitle = [title, description, prompt].filter(Boolean).join(\"\\n\");\n // A parse error is rendered data, not a load failure: it keeps the row\n // actionable so the raw source can be repaired. Only a genuine load failure\n // (no detail) disables the row.\n const parseError = detail?.parseError ?? \"\";\n const shownError = error || parseError;\n const isDisabled = disabled || !detail;\n\n const onSaved = (next: PromptSpecDetail) => {\n setDetail(next);\n if (next.source === \"default\") {\n onChange(undefined);\n } else {\n onChange(\n next.source === \"file\"\n ? { file: next.path ?? \"\" }\n : { inline: next.raw }\n );\n }\n setEditing(false);\n };\n\n const Glyph = model.icon;\n\n return (\n <div className={cn(\"w-full min-w-0 max-w-full overflow-hidden\", className)}>\n <button\n type=\"button\"\n className={cn(\n \"flex h-9 w-full min-w-0 max-w-full items-center gap-2 overflow-hidden rounded-md border border-border bg-background px-2 text-left text-sm transition-colors\",\n \"hover:bg-muted/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n shownError && \"border-destructive/40 text-destructive\"\n )}\n title={shownError || rowTitle}\n aria-label={`Edit prompt ${title}`}\n disabled={isDisabled}\n onClick={() => setEditing(true)}\n >\n <Glyph className=\"size-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 max-w-[40%] flex-none truncate font-medium text-foreground\">\n {shownError ? \"Prompt error\" : model.label}\n </span>\n <span className=\"h-4 w-px shrink-0 bg-border\" aria-hidden=\"true\" />\n <span className=\"min-w-0 basis-0 flex-1 truncate text-muted-foreground\">\n {shownError || (detail ? prompt : \"Loading prompt...\")}\n </span>\n </button>\n\n {editing &&\n detail &&\n (isValidPromptSpecDetail(detail) ? (\n <SpecEditorDialog\n open={editing}\n title={title}\n detail={detail}\n saveDetail={saveDetail}\n onClose={() => setEditing(false)}\n onSaved={onSaved}\n models={models}\n families={families}\n sections={sections}\n sources={sources}\n />\n ) : (\n <PromptSourceRepair\n open={editing}\n title={title}\n detail={detail}\n saveDetail={saveDetail}\n onClose={() => setEditing(false)}\n onSaved={onSaved}\n />\n ))}\n </div>\n );\n}\n\nexport function SpecEditorDialog({\n open,\n title,\n detail,\n saveDetail,\n onClose,\n onSaved,\n models,\n families,\n sections = DEFAULT_SECTIONS,\n sources = DEFAULT_SOURCES,\n}: SpecEditorDialogProps) {\n const [value, setValue] = useState<AISpecRuntimeValue>(() =>\n specToPromptRuntimeValue(detail.spec, detail.body)\n );\n const selectedSource = detail.source === \"file\" ? \"file\" : \"inline\";\n const initialSource = sources.includes(selectedSource)\n ? selectedSource\n : sources[0];\n const sourceOptions = SOURCE_OPTIONS.filter((option) =>\n sources.includes(option.id)\n );\n const [source, setSource] = useState<PromptSource>(initialSource);\n const [path, setPath] = useState(detail.path ?? \"\");\n const [error, setError] = useState(\"\");\n const [saving, setSaving] = useState(false);\n\n useEffect(() => {\n if (!open) return;\n setValue(specToPromptRuntimeValue(detail.spec, detail.body));\n setSource(initialSource);\n setPath(detail.path ?? \"\");\n setError(\"\");\n }, [detail, initialSource, open]);\n\n if (!open) return null;\n\n const dirty =\n JSON.stringify(value) !==\n JSON.stringify(specToPromptRuntimeValue(detail.spec, detail.body)) ||\n source !== initialSource ||\n path !== (detail.path ?? \"\");\n\n async function save() {\n setSaving(true);\n setError(\"\");\n const { spec, body } = promptRuntimeValueToPayload(value);\n try {\n const next = await saveDetail({\n source,\n path: source === \"file\" ? path : undefined,\n spec,\n body,\n baseRaw: detail.raw,\n });\n onSaved(next);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : \"save failed\");\n } finally {\n setSaving(false);\n }\n }\n\n async function resetDefault() {\n setSaving(true);\n setError(\"\");\n try {\n const next = await saveDetail({ source: \"default\", baseRaw: detail.raw });\n onSaved(next);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : \"reset failed\");\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n confirmClose={dirty}\n title={`Edit prompt · ${title}`}\n size=\"2xl\"\n className=\"h-[92vh]\"\n footer={\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n {error ? (\n <span className=\"whitespace-pre-wrap text-sm text-destructive\">\n {error}\n </span>\n ) : detail.source !== \"default\" ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={resetDefault}\n disabled={saving}\n >\n Reset to default\n </Button>\n ) : null}\n </div>\n <div className=\"flex shrink-0 gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={onClose}\n disabled={saving}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={save}\n disabled={saving || (source === \"file\" && path.trim() === \"\")}\n >\n {saving ? \"Saving...\" : \"Save\"}\n </Button>\n </div>\n </div>\n }\n >\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n {sourceOptions.length > 1 && (\n <>\n <span className=\"text-xs font-medium text-muted-foreground\">\n Save to\n </span>\n <SegmentedControl\n size=\"sm\"\n value={source}\n options={sourceOptions}\n onChange={setSource}\n aria-label=\"Save location\"\n />\n </>\n )}\n {source === \"file\" && (\n <input\n type=\"text\"\n className=\"flex-1 rounded-md border border-border bg-background p-1.5 font-mono text-xs\"\n value={path}\n placeholder=\"./prompts/my-prompt.prompt\"\n spellCheck={false}\n onChange={(event) => setPath(event.currentTarget.value)}\n />\n )}\n </div>\n\n <SpecRuntimeEditor\n value={value}\n onChange={setValue}\n models={models}\n families={families}\n sections={sections}\n showHeader={false}\n />\n </div>\n </Modal>\n );\n}\n\nfunction modelDisplay(\n detail: PromptSpecDetail | null,\n models: ChatModel[] | undefined\n): { label: string; icon: ProviderGlyph } {\n const modelValue = detail?.spec?.model;\n const modelID =\n typeof modelValue === \"string\" && modelValue.trim()\n ? modelValue.trim()\n : \"\";\n const matched = models?.find(\n (model) => model.id === modelID || model.label === modelID\n );\n const provider = matched?.provider ?? inferProvider(modelID);\n return {\n label: matched?.label ?? (modelID || \"Default model\"),\n icon: providerIcon(provider) ?? DefaultModelIcon,\n };\n}\n\nfunction inferProvider(modelID: string): string | undefined {\n const model = modelID.toLowerCase();\n if (!model) return undefined;\n if (model.includes(\"claude\") || model.includes(\"anthropic\"))\n return \"anthropic\";\n if (model.includes(\"gemini\") || model.includes(\"google\")) return \"gemini\";\n if (\n model.includes(\"openai\") ||\n model.includes(\"gpt\") ||\n model.includes(\"codex\") ||\n /^o\\d/.test(model)\n ) {\n return \"openai\";\n }\n return undefined;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PromptPicker.js","sources":["../../../../src/data/ai/PromptPicker/PromptPicker.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../../components/button\";\nimport { SegmentedControl } from \"../../../components/SegmentedControl\";\nimport { UiRobotAi } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport { Modal } from \"../../../overlay/Modal\";\nimport { providerIcon, type ProviderGlyph } from \"../../chat/provider-icons\";\nimport type { ChatModel } from \"../../chat/types\";\nimport { SpecRuntimeEditor } from \"../SpecRuntimeEditor\";\nimport type { SpecSectionId } from \"../SpecRuntimeEditor/types\";\nimport type { AISpecRuntimeValue } from \"../SpecRuntimeEditor.model\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport {\n promptPreviewText,\n promptRuntimeValueToPayload,\n specToPromptRuntimeValue,\n} from \"./prompt-runtime\";\nimport { PromptSourceRepair } from \"./PromptSourceRepair\";\nimport {\n isValidPromptSpecDetail,\n type PromptPickerValue,\n type PromptSpecDetail,\n type PromptSpecSavePayload,\n type ValidPromptSpecDetail,\n} from \"./types\";\n\nexport type PromptPickerFieldProps = {\n value?: PromptPickerValue | undefined;\n onChange: (value: PromptPickerValue | undefined) => void;\n title: string;\n description?: string | undefined;\n loadDetail: () => Promise<PromptSpecDetail>;\n saveDetail: (payload: PromptSpecSavePayload) => Promise<PromptSpecDetail>;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n sections?: readonly SpecSectionId[] | undefined;\n sources?: readonly [PromptSource, ...PromptSource[]] | undefined;\n className?: string | undefined;\n disabled?: boolean | undefined;\n};\n\nexport type SpecEditorDialogProps = {\n open: boolean;\n title: string;\n detail: ValidPromptSpecDetail;\n saveDetail: (payload: PromptSpecSavePayload) => Promise<PromptSpecDetail>;\n onClose: () => void;\n onSaved: (detail: PromptSpecDetail) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n sections?: readonly SpecSectionId[] | undefined;\n sources?: readonly [PromptSource, ...PromptSource[]] | undefined;\n};\n\nexport type PromptSource = \"inline\" | \"file\";\n\nconst DEFAULT_SECTIONS: readonly SpecSectionId[] = [\n \"model\",\n \"prompt\",\n \"workspace\",\n \"permissions\",\n \"environment\",\n \"cli\",\n];\n\nconst SOURCE_OPTIONS: Array<{ id: PromptSource; label: string }> = [\n { id: \"inline\", label: \"Inline\" },\n { id: \"file\", label: \"File\" },\n];\nconst DEFAULT_SOURCES: readonly [PromptSource, ...PromptSource[]] = [\n \"inline\",\n \"file\",\n];\n\nconst DefaultModelIcon: ProviderGlyph = ({ className }) => (\n <UiRobotAi className={className} />\n);\n\n// A mode id is the shortcut. The suffix match this replaces (`-${shortcut}`)\n// only ever fired on the composite adapter ids — \"claude-agent\" ending in\n// \"-agent\" — which no longer exist.\nfunction runtimeModeMatchesShortcut(\n mode: { id: string },\n shortcut: string\n): boolean {\n return mode.id === shortcut;\n}\n\nfunction resolveModelShortcut(\n detail: PromptSpecDetail,\n models: ChatModel[] | undefined,\n families: SpecRuntimeFamily[] | undefined\n): PromptSpecDetail {\n if (!isValidPromptSpecDetail(detail)) return detail;\n const value = detail.spec.model;\n if (typeof value !== \"string\") return detail;\n\n const parts = value.split(\":\").map((part) => part.trim());\n if (parts.length < 2 || parts.length > 3) return detail;\n const [prefix, alias, effort] = parts;\n if (!prefix) return detail;\n const mode = prefix === \"sdk\" ? \"agent\" : prefix;\n const runtimeFamilies = families ?? SPEC_RUNTIME_FAMILIES;\n if (\n !runtimeFamilies.some((family) =>\n family.modes.some((item) => runtimeModeMatchesShortcut(item, mode))\n )\n ) {\n return detail;\n }\n if (!alias || !models?.length) {\n throw new Error(`shortcut ${value} needs a model catalog`);\n }\n\n const model = modelForShortcut(value, alias, models);\n const specMode = modeForShortcut(value, mode, model, runtimeFamilies);\n if (\n effort &&\n model.supportedEfforts?.length &&\n !model.supportedEfforts.includes(effort)\n ) {\n throw new Error(`shortcut ${value} does not support effort ${effort}`);\n }\n\n return {\n ...detail,\n spec: {\n ...detail.spec,\n model: model.id,\n mode: specMode,\n ...(effort ? { effort } : {}),\n },\n };\n}\n\nfunction modelForShortcut(\n value: string,\n alias: string,\n models: ChatModel[]\n): ChatModel {\n const normalizedAlias = alias.toLowerCase();\n const exact = models.filter((model) =>\n [model.id, model.label].some(\n (candidate) => candidate.toLowerCase() === normalizedAlias\n )\n );\n const matches = exact.length\n ? exact\n : models.filter(\n (model) =>\n model.id\n .toLowerCase()\n .split(/[\\s/_.-]+/)\n .filter(Boolean)\n .at(-1) === normalizedAlias\n );\n if (matches.length === 1) return matches[0]!;\n throw new Error(\n `model shortcut ${JSON.stringify(value)} matched ${\n matches.length\n } catalog models`\n );\n}\n\nfunction modeForShortcut(\n value: string,\n mode: string,\n model: ChatModel,\n families: SpecRuntimeFamily[]\n): string {\n const modes = new Set(\n families.flatMap((family) =>\n family.modes\n .filter(\n (item) =>\n runtimeModeMatchesShortcut(item, mode) &&\n family.provider === model.provider\n )\n .map((item) => item.id)\n )\n );\n if (modes.size === 1) return [...modes][0]!;\n throw new Error(\n `model shortcut ${JSON.stringify(value)} matched ${modes.size} runtime modes`\n );\n}\n\nexport function PromptPickerField({\n value: _value,\n onChange,\n title,\n description,\n loadDetail,\n saveDetail,\n models,\n families,\n sections,\n sources = DEFAULT_SOURCES,\n className,\n disabled,\n}: PromptPickerFieldProps) {\n const [detail, setDetail] = useState<PromptSpecDetail | null>(null);\n const [error, setError] = useState(\"\");\n const [editing, setEditing] = useState(false);\n\n const load = useCallback(() => {\n setError(\"\");\n void loadDetail()\n .then((next) => setDetail(resolveModelShortcut(next, models, families)))\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : \"failed to load prompt\");\n });\n }, [families, loadDetail, models]);\n\n useEffect(() => {\n load();\n }, [load]);\n\n const model = useMemo(() => modelDisplay(detail, models), [detail, models]);\n const prompt = promptPreviewText(detail);\n const rowTitle = [title, description, prompt].filter(Boolean).join(\"\\n\");\n // A parse error is rendered data, not a load failure: it keeps the row\n // actionable so the raw source can be repaired. Only a genuine load failure\n // (no detail) disables the row.\n const parseError = detail?.parseError ?? \"\";\n const shownError = error || parseError;\n const isDisabled = disabled || !detail;\n\n const onSaved = (next: PromptSpecDetail) => {\n setDetail(next);\n if (next.source === \"default\") {\n onChange(undefined);\n } else {\n onChange(\n next.source === \"file\"\n ? { file: next.path ?? \"\" }\n : { inline: next.raw }\n );\n }\n setEditing(false);\n };\n\n const Glyph = model.icon;\n\n return (\n <div className={cn(\"w-full min-w-0 max-w-full overflow-hidden\", className)}>\n <button\n type=\"button\"\n className={cn(\n \"flex h-9 w-full min-w-0 max-w-full items-center gap-2 overflow-hidden rounded-md border border-border bg-background px-2 text-left text-sm transition-colors\",\n \"hover:bg-muted/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n shownError && \"border-destructive/40 text-destructive\"\n )}\n title={shownError || rowTitle}\n aria-label={`Edit prompt ${title}`}\n disabled={isDisabled}\n onClick={() => setEditing(true)}\n >\n <Glyph className=\"size-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 max-w-[40%] flex-none truncate font-medium text-foreground\">\n {shownError ? \"Prompt error\" : model.label}\n </span>\n <span className=\"h-4 w-px shrink-0 bg-border\" aria-hidden=\"true\" />\n <span className=\"min-w-0 basis-0 flex-1 truncate text-muted-foreground\">\n {shownError || (detail ? prompt : \"Loading prompt...\")}\n </span>\n </button>\n\n {editing &&\n detail &&\n (isValidPromptSpecDetail(detail) ? (\n <SpecEditorDialog\n open={editing}\n title={title}\n detail={detail}\n saveDetail={saveDetail}\n onClose={() => setEditing(false)}\n onSaved={onSaved}\n models={models}\n families={families}\n sections={sections}\n sources={sources}\n />\n ) : (\n <PromptSourceRepair\n open={editing}\n title={title}\n detail={detail}\n saveDetail={saveDetail}\n onClose={() => setEditing(false)}\n onSaved={onSaved}\n />\n ))}\n </div>\n );\n}\n\nexport function SpecEditorDialog({\n open,\n title,\n detail,\n saveDetail,\n onClose,\n onSaved,\n models,\n families,\n sections = DEFAULT_SECTIONS,\n sources = DEFAULT_SOURCES,\n}: SpecEditorDialogProps) {\n const [value, setValue] = useState<AISpecRuntimeValue>(() =>\n specToPromptRuntimeValue(detail.spec, detail.body)\n );\n const selectedSource = detail.source === \"file\" ? \"file\" : \"inline\";\n const initialSource = sources.includes(selectedSource)\n ? selectedSource\n : sources[0];\n const sourceOptions = SOURCE_OPTIONS.filter((option) =>\n sources.includes(option.id)\n );\n const [source, setSource] = useState<PromptSource>(initialSource);\n const [path, setPath] = useState(detail.path ?? \"\");\n const [error, setError] = useState(\"\");\n const [saving, setSaving] = useState(false);\n\n useEffect(() => {\n if (!open) return;\n setValue(specToPromptRuntimeValue(detail.spec, detail.body));\n setSource(initialSource);\n setPath(detail.path ?? \"\");\n setError(\"\");\n }, [detail, initialSource, open]);\n\n if (!open) return null;\n\n const dirty =\n JSON.stringify(value) !==\n JSON.stringify(specToPromptRuntimeValue(detail.spec, detail.body)) ||\n source !== initialSource ||\n path !== (detail.path ?? \"\");\n\n async function save() {\n setSaving(true);\n setError(\"\");\n const { spec, body } = promptRuntimeValueToPayload(value);\n try {\n const next = await saveDetail({\n source,\n path: source === \"file\" ? path : undefined,\n spec,\n body,\n baseRaw: detail.raw,\n });\n onSaved(next);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : \"save failed\");\n } finally {\n setSaving(false);\n }\n }\n\n async function resetDefault() {\n setSaving(true);\n setError(\"\");\n try {\n const next = await saveDetail({ source: \"default\", baseRaw: detail.raw });\n onSaved(next);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : \"reset failed\");\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n confirmClose={dirty}\n title={`Edit prompt · ${title}`}\n size=\"2xl\"\n className=\"h-[92vh]\"\n footer={\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n {error ? (\n <span className=\"whitespace-pre-wrap text-sm text-destructive\">\n {error}\n </span>\n ) : detail.source !== \"default\" ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={resetDefault}\n disabled={saving}\n >\n Reset to default\n </Button>\n ) : null}\n </div>\n <div className=\"flex shrink-0 gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={onClose}\n disabled={saving}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={save}\n disabled={saving || (source === \"file\" && path.trim() === \"\")}\n >\n {saving ? \"Saving...\" : \"Save\"}\n </Button>\n </div>\n </div>\n }\n >\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n {sourceOptions.length > 1 && (\n <>\n <span className=\"text-xs font-medium text-muted-foreground\">\n Save to\n </span>\n <SegmentedControl\n size=\"sm\"\n value={source}\n options={sourceOptions}\n onChange={setSource}\n aria-label=\"Save location\"\n />\n </>\n )}\n {source === \"file\" && (\n <input\n type=\"text\"\n className=\"flex-1 rounded-md border border-border bg-background p-1.5 font-mono text-xs\"\n value={path}\n placeholder=\"./prompts/my-prompt.prompt\"\n spellCheck={false}\n onChange={(event) => setPath(event.currentTarget.value)}\n />\n )}\n </div>\n\n <SpecRuntimeEditor\n value={value}\n onChange={setValue}\n models={models}\n families={families}\n sections={sections}\n showHeader={false}\n />\n </div>\n </Modal>\n );\n}\n\nfunction modelDisplay(\n detail: PromptSpecDetail | null,\n models: ChatModel[] | undefined\n): { label: string; icon: ProviderGlyph } {\n const modelValue = detail?.spec?.model;\n const modelID =\n typeof modelValue === \"string\" && modelValue.trim()\n ? modelValue.trim()\n : \"\";\n const matched = models?.find(\n (model) => model.id === modelID || model.label === modelID\n );\n const provider = matched?.provider ?? inferProvider(modelID);\n return {\n label: matched?.label ?? (modelID || \"Default model\"),\n icon: providerIcon(provider) ?? DefaultModelIcon,\n };\n}\n\nfunction inferProvider(modelID: string): string | undefined {\n const model = modelID.toLowerCase();\n if (!model) return undefined;\n if (model.includes(\"claude\") || model.includes(\"anthropic\"))\n return \"anthropic\";\n if (model.includes(\"gemini\") || model.includes(\"google\")) return \"gemini\";\n if (\n model.includes(\"openai\") ||\n model.includes(\"gpt\") ||\n model.includes(\"codex\") ||\n /^o\\d/.test(model)\n ) {\n return \"openai\";\n }\n return undefined;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { PromptPickerField, SpecEditorDialog, type PromptPickerFieldProps, type SpecEditorDialogProps, } from './PromptPicker';
|
|
2
2
|
export { PromptSourceRepair, type PromptSourceRepairProps, } from './PromptSourceRepair';
|
|
3
3
|
export { promptPreviewText, promptRuntimeValueToPayload, specToPromptRuntimeValue, } from './prompt-runtime';
|
|
4
|
-
export { isValidPromptSpecDetail, type InvalidPromptSpecDetail, type PromptPickerValue, type PromptSpecDetail, type PromptSpecSavePayload, type ValidPromptSpecDetail, } from './types';
|
|
4
|
+
export { isValidPromptSpecDetail, type InvalidPromptSpecDetail, type PromptPickerValue, type PromptSpecDetail, type PromptSpecEffective, type PromptSpecSavePayload, type ValidPromptSpecDetail, } from './types';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/PromptPicker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,GAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC3B,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/PromptPicker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,GAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC3B,MAAM,SAAS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.cjs","sources":["../../../../src/data/ai/PromptPicker/types.ts"],"sourcesContent":["import type { AISpecRuntimeSpec } from \"../SpecRuntimeEditor.model\";\n\nexport type PromptPickerValue = string | { inline?: string; file?: string };\n\n// PromptSpecDetailBase carries the identity + source of a resolved prompt for a\n// config layer, independent of whether its .prompt frontmatter parsed cleanly.\n// `raw` is always present so a malformed override can still be repaired.\ntype PromptSpecDetailBase = {\n id?: string | undefined;\n scope?: string | undefined;\n source: \"default\" | \"inline\" | \"file\";\n path?: string | undefined;\n raw: string;\n};\n\n// ValidPromptSpecDetail is a prompt whose frontmatter parsed: it carries the\n// parsed spec + body the structured editor binds to.\nexport type ValidPromptSpecDetail = PromptSpecDetailBase & {\n parseError?: undefined;\n spec: Record<string, unknown>;\n body: string;\n};\n\n// InvalidPromptSpecDetail is a prompt whose frontmatter failed to parse. It has\n// no spec/body — only the raw source and the parser message — so the row stays\n// actionable for a raw-source repair instead of being disabled.\nexport type InvalidPromptSpecDetail = PromptSpecDetailBase & {\n parseError: string;\n spec?: undefined;\n body?: undefined;\n};\n\nexport type PromptSpecDetail = ValidPromptSpecDetail | InvalidPromptSpecDetail;\n\n// isValidPromptSpecDetail narrows a detail to its parsed form so runtime/form\n// conversion is only ever run against a real spec + body.\nexport function isValidPromptSpecDetail(\n detail: PromptSpecDetail,\n): detail is ValidPromptSpecDetail {\n return !detail.parseError;\n}\n\nexport type PromptSpecSavePayload =\n | {\n source: \"default\";\n baseRaw?: string | undefined;\n }\n | {\n source: \"inline\" | \"file\";\n path?: string | undefined;\n spec: AISpecRuntimeSpec;\n body: string;\n baseRaw?: string | undefined;\n }\n | {\n source: \"inline\" | \"file\";\n path?: string | undefined;\n raw: string;\n baseRaw?: string | undefined;\n };\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"types.cjs","sources":["../../../../src/data/ai/PromptPicker/types.ts"],"sourcesContent":["import type { AISpecRuntimeSpec } from \"../SpecRuntimeEditor.model\";\n\nexport type PromptPickerValue = string | { inline?: string; file?: string };\n\n// PromptSpecEffective is what actually runs once every config layer is merged —\n// distinct from the layer being edited, which can be untouched (\"default\")\n// while a lower layer supplies the override.\nexport type PromptSpecEffective = {\n source: \"default\" | \"inline\" | \"file\";\n origin?: string | undefined;\n path?: string | undefined;\n raw: string;\n version: string;\n};\n\n// PromptSpecDetailBase carries the identity + source of a resolved prompt for a\n// config layer, independent of whether its .prompt frontmatter parsed cleanly.\n// `raw` is always present so a malformed override can still be repaired;\n// `version` hashes it so a save can be refused when the layer moved on.\ntype PromptSpecDetailBase = {\n id?: string | undefined;\n scope?: string | undefined;\n source: \"default\" | \"inline\" | \"file\";\n path?: string | undefined;\n raw: string;\n version?: string | undefined;\n effective?: PromptSpecEffective | undefined;\n};\n\n// ValidPromptSpecDetail is a prompt whose frontmatter parsed: it carries the\n// parsed spec + body the structured editor binds to.\nexport type ValidPromptSpecDetail = PromptSpecDetailBase & {\n parseError?: undefined;\n spec: Record<string, unknown>;\n body: string;\n};\n\n// InvalidPromptSpecDetail is a prompt whose frontmatter failed to parse. It has\n// no spec/body — only the raw source and the parser message — so the row stays\n// actionable for a raw-source repair instead of being disabled.\nexport type InvalidPromptSpecDetail = PromptSpecDetailBase & {\n parseError: string;\n spec?: undefined;\n body?: undefined;\n};\n\nexport type PromptSpecDetail = ValidPromptSpecDetail | InvalidPromptSpecDetail;\n\n// isValidPromptSpecDetail narrows a detail to its parsed form so runtime/form\n// conversion is only ever run against a real spec + body.\nexport function isValidPromptSpecDetail(\n detail: PromptSpecDetail,\n): detail is ValidPromptSpecDetail {\n return !detail.parseError;\n}\n\nexport type PromptSpecSavePayload =\n | {\n source: \"default\";\n baseRaw?: string | undefined;\n }\n | {\n source: \"inline\" | \"file\";\n path?: string | undefined;\n spec: AISpecRuntimeSpec;\n body: string;\n baseRaw?: string | undefined;\n }\n | {\n source: \"inline\" | \"file\";\n path?: string | undefined;\n raw: string;\n baseRaw?: string | undefined;\n };\n"],"names":[],"mappings":";;AAkDO,SAAS,wBACd,QACiC;AACjC,SAAO,CAAC,OAAO;AACjB;;"}
|
|
@@ -3,12 +3,21 @@ export type PromptPickerValue = string | {
|
|
|
3
3
|
inline?: string;
|
|
4
4
|
file?: string;
|
|
5
5
|
};
|
|
6
|
+
export type PromptSpecEffective = {
|
|
7
|
+
source: "default" | "inline" | "file";
|
|
8
|
+
origin?: string | undefined;
|
|
9
|
+
path?: string | undefined;
|
|
10
|
+
raw: string;
|
|
11
|
+
version: string;
|
|
12
|
+
};
|
|
6
13
|
type PromptSpecDetailBase = {
|
|
7
14
|
id?: string | undefined;
|
|
8
15
|
scope?: string | undefined;
|
|
9
16
|
source: "default" | "inline" | "file";
|
|
10
17
|
path?: string | undefined;
|
|
11
18
|
raw: string;
|
|
19
|
+
version?: string | undefined;
|
|
20
|
+
effective?: PromptSpecEffective | undefined;
|
|
12
21
|
};
|
|
13
22
|
export type ValidPromptSpecDetail = PromptSpecDetailBase & {
|
|
14
23
|
parseError?: undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/PromptPicker/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAK5E,KAAK,oBAAoB,GAAG;IAC1B,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/PromptPicker/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAK5E,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAMF,KAAK,oBAAoB,GAAG;IAC1B,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;CAC7C,CAAC;AAIF,MAAM,MAAM,qBAAqB,GAAG,oBAAoB,GAAG;IACzD,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAKF,MAAM,MAAM,uBAAuB,GAAG,oBAAoB,GAAG;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,qBAAqB,GAAG,uBAAuB,CAAC;AAI/E,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,gBAAgB,GACvB,MAAM,IAAI,qBAAqB,CAEjC;AAED,MAAM,MAAM,qBAAqB,GAC7B;IACE,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,GACD;IACE,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,GACD;IACE,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../../../../src/data/ai/PromptPicker/types.ts"],"sourcesContent":["import type { AISpecRuntimeSpec } from \"../SpecRuntimeEditor.model\";\n\nexport type PromptPickerValue = string | { inline?: string; file?: string };\n\n// PromptSpecDetailBase carries the identity + source of a resolved prompt for a\n// config layer, independent of whether its .prompt frontmatter parsed cleanly.\n// `raw` is always present so a malformed override can still be repaired.\ntype PromptSpecDetailBase = {\n id?: string | undefined;\n scope?: string | undefined;\n source: \"default\" | \"inline\" | \"file\";\n path?: string | undefined;\n raw: string;\n};\n\n// ValidPromptSpecDetail is a prompt whose frontmatter parsed: it carries the\n// parsed spec + body the structured editor binds to.\nexport type ValidPromptSpecDetail = PromptSpecDetailBase & {\n parseError?: undefined;\n spec: Record<string, unknown>;\n body: string;\n};\n\n// InvalidPromptSpecDetail is a prompt whose frontmatter failed to parse. It has\n// no spec/body — only the raw source and the parser message — so the row stays\n// actionable for a raw-source repair instead of being disabled.\nexport type InvalidPromptSpecDetail = PromptSpecDetailBase & {\n parseError: string;\n spec?: undefined;\n body?: undefined;\n};\n\nexport type PromptSpecDetail = ValidPromptSpecDetail | InvalidPromptSpecDetail;\n\n// isValidPromptSpecDetail narrows a detail to its parsed form so runtime/form\n// conversion is only ever run against a real spec + body.\nexport function isValidPromptSpecDetail(\n detail: PromptSpecDetail,\n): detail is ValidPromptSpecDetail {\n return !detail.parseError;\n}\n\nexport type PromptSpecSavePayload =\n | {\n source: \"default\";\n baseRaw?: string | undefined;\n }\n | {\n source: \"inline\" | \"file\";\n path?: string | undefined;\n spec: AISpecRuntimeSpec;\n body: string;\n baseRaw?: string | undefined;\n }\n | {\n source: \"inline\" | \"file\";\n path?: string | undefined;\n raw: string;\n baseRaw?: string | undefined;\n };\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../../../src/data/ai/PromptPicker/types.ts"],"sourcesContent":["import type { AISpecRuntimeSpec } from \"../SpecRuntimeEditor.model\";\n\nexport type PromptPickerValue = string | { inline?: string; file?: string };\n\n// PromptSpecEffective is what actually runs once every config layer is merged —\n// distinct from the layer being edited, which can be untouched (\"default\")\n// while a lower layer supplies the override.\nexport type PromptSpecEffective = {\n source: \"default\" | \"inline\" | \"file\";\n origin?: string | undefined;\n path?: string | undefined;\n raw: string;\n version: string;\n};\n\n// PromptSpecDetailBase carries the identity + source of a resolved prompt for a\n// config layer, independent of whether its .prompt frontmatter parsed cleanly.\n// `raw` is always present so a malformed override can still be repaired;\n// `version` hashes it so a save can be refused when the layer moved on.\ntype PromptSpecDetailBase = {\n id?: string | undefined;\n scope?: string | undefined;\n source: \"default\" | \"inline\" | \"file\";\n path?: string | undefined;\n raw: string;\n version?: string | undefined;\n effective?: PromptSpecEffective | undefined;\n};\n\n// ValidPromptSpecDetail is a prompt whose frontmatter parsed: it carries the\n// parsed spec + body the structured editor binds to.\nexport type ValidPromptSpecDetail = PromptSpecDetailBase & {\n parseError?: undefined;\n spec: Record<string, unknown>;\n body: string;\n};\n\n// InvalidPromptSpecDetail is a prompt whose frontmatter failed to parse. It has\n// no spec/body — only the raw source and the parser message — so the row stays\n// actionable for a raw-source repair instead of being disabled.\nexport type InvalidPromptSpecDetail = PromptSpecDetailBase & {\n parseError: string;\n spec?: undefined;\n body?: undefined;\n};\n\nexport type PromptSpecDetail = ValidPromptSpecDetail | InvalidPromptSpecDetail;\n\n// isValidPromptSpecDetail narrows a detail to its parsed form so runtime/form\n// conversion is only ever run against a real spec + body.\nexport function isValidPromptSpecDetail(\n detail: PromptSpecDetail,\n): detail is ValidPromptSpecDetail {\n return !detail.parseError;\n}\n\nexport type PromptSpecSavePayload =\n | {\n source: \"default\";\n baseRaw?: string | undefined;\n }\n | {\n source: \"inline\" | \"file\";\n path?: string | undefined;\n spec: AISpecRuntimeSpec;\n body: string;\n baseRaw?: string | undefined;\n }\n | {\n source: \"inline\" | \"file\";\n path?: string | undefined;\n raw: string;\n baseRaw?: string | undefined;\n };\n"],"names":[],"mappings":"AAkDO,SAAS,wBACd,QACiC;AACjC,SAAO,CAAC,OAAO;AACjB;"}
|
|
@@ -11,6 +11,7 @@ const effortIcons = require("../../chat/effort-icons.cjs");
|
|
|
11
11
|
const Attachment = require("../../chat/Attachment.cjs");
|
|
12
12
|
const attachmentUpload = require("../../chat/attachment-upload.cjs");
|
|
13
13
|
const RuntimeBar = require("../../runtime/RuntimeBar.cjs");
|
|
14
|
+
const RuntimeBar_model = require("../../runtime/RuntimeBar.model.cjs");
|
|
14
15
|
const runtimeMode = require("../../runtime/runtime-mode.cjs");
|
|
15
16
|
const index = require("../SpecRuntimeEditor/index.cjs");
|
|
16
17
|
const update = require("../SpecRuntimeEditor/update.cjs");
|
|
@@ -50,9 +51,7 @@ function PromptRunEditor({
|
|
|
50
51
|
const [specOpen, setSpecOpen] = react.useState(false);
|
|
51
52
|
const spec = value.spec ?? {};
|
|
52
53
|
const rows = model.runtimeRows(value);
|
|
53
|
-
const selectedModel =
|
|
54
|
-
(model2) => model2.id === spec.id || model2.id === spec.model
|
|
55
|
-
);
|
|
54
|
+
const selectedModel = RuntimeBar_model.runtimeModelForValue(models, spec);
|
|
56
55
|
const resolvedAttachmentUpload = react.useMemo(
|
|
57
56
|
() => attachmentUpload$1 ?? attachmentUpload.createAttachmentUploadAdapter(),
|
|
58
57
|
[attachmentUpload$1]
|
|
@@ -128,7 +127,7 @@ function PromptRunEditor({
|
|
|
128
127
|
return onChange(
|
|
129
128
|
model.withRuntimeRows(value, [
|
|
130
129
|
...rows,
|
|
131
|
-
((_a2 = rows[0]) == null ? void 0 : _a2.
|
|
130
|
+
((_a2 = rows[0]) == null ? void 0 : _a2.mode) ? { mode: rows[0].mode } : {}
|
|
132
131
|
])
|
|
133
132
|
);
|
|
134
133
|
},
|
|
@@ -254,7 +253,7 @@ function PromptRunEditor({
|
|
|
254
253
|
onSave: () => setSpecOpen(false),
|
|
255
254
|
onCancel: () => setSpecOpen(false),
|
|
256
255
|
saveLabel: "Done",
|
|
257
|
-
footerStatus: runtimeMode.
|
|
256
|
+
footerStatus: runtimeMode.labelForMode(spec.mode, families)
|
|
258
257
|
}
|
|
259
258
|
)
|
|
260
259
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/data/ai/PromptRunEditor/index.tsx"],"sourcesContent":["import { useId, useMemo, useState, type ReactNode } from \"react\";\nimport { Button } from \"../../../components/button\";\nimport { JsonSchemaForm } from \"../../../components/JsonSchemaForm\";\nimport type { JsonSchemaObject } from \"../../../components/json-schema-form-types\";\nimport { UiAdd, UiGearSix, UiTrash } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport { Modal } from \"../../../overlay/Modal\";\nimport { Icon } from \"../../Icon\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../../chat/effort-icons\";\nimport { AttachmentButton, AttachmentList } from \"../../chat/Attachment\";\nimport {\n createAttachmentUploadAdapter,\n type AttachmentFilePart,\n type AttachmentLimits,\n type AttachmentUploadAdapter,\n} from \"../../chat/attachment-upload\";\nimport type { ChatModel, ToolMeta } from \"../../chat/types\";\nimport type { FileUIPart } from \"../../chat/types\";\nimport { RuntimeBar } from \"../../runtime/RuntimeBar\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n labelForBackend,\n} from \"../../runtime/runtime-mode\";\nimport { SpecRuntimeEditor } from \"../SpecRuntimeEditor\";\nimport type { SpecRuntimeSandboxCreateConfig } from \"../SandboxCreateWizard.model\";\nimport type { SpecRuntimeCLIOptions } from \"../SpecRuntimeEditor/CLIArgsSection\";\nimport type { SpecRuntimeSandboxCatalog } from \"../SpecRuntimeEditor/types\";\nimport type {\n SpecRuntimeSecretSelectorConfig,\n SpecSectionId,\n} from \"../SpecRuntimeEditor/types\";\nimport { withPrompt } from \"../SpecRuntimeEditor/update\";\nimport type { AISpecRuntimePermissionCatalog } from \"../SpecRuntimeEditor.model\";\nimport { runtimeRows, withRuntimeRows, type AIPromptRunValue } from \"./model\";\n\nexport type PromptRunEditorProps = {\n value: AIPromptRunValue;\n onChange: (value: AIPromptRunValue) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n tools?: ToolMeta[] | undefined;\n permissionCatalog?: AISpecRuntimePermissionCatalog | undefined;\n secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;\n cliOptions?: SpecRuntimeCLIOptions | undefined;\n /** Sandbox adapter catalog; enables the spec editor's Sandbox section. */\n sandboxCatalog?: SpecRuntimeSandboxCatalog | undefined;\n /** Host-owned sandbox creation and credential-reference adapter. */\n sandboxCreate?: SpecRuntimeSandboxCreateConfig | undefined;\n reasoningEfforts?: string[] | undefined;\n\n /** Schema-driven variables form; omit to render a raw-JSON editor. */\n variablesSchema?: JsonSchemaObject | undefined;\n /** Fires false while raw-JSON variables fail to parse; always true with a schema. */\n onVariablesValidityChange?: ((valid: boolean) => void) | undefined;\n\n /** Host-supplied editor for the `prompt.user` override; defaults to a textarea. */\n promptEditor?: ReactNode | undefined;\n promptLabel?: string | undefined;\n promptPlaceholder?: string | undefined;\n enableAttachments?: boolean | undefined;\n attachmentUpload?: AttachmentUploadAdapter | undefined;\n attachmentLimits?: AttachmentLimits | undefined;\n\n /** Extra fields injected inside the Runtime block, below Model/Effort. */\n children?: ReactNode | undefined;\n header?: ReactNode | undefined;\n footer?: ReactNode | undefined;\n className?: string | undefined;\n\n editSpecLabel?: string | undefined;\n specModalTitle?: string | undefined;\n /** Restrict which SpecRuntimeEditor sections the \"Edit spec\" modal shows. */\n specSections?: readonly SpecSectionId[] | undefined;\n};\n\n// The inline \"prompt + variables + runtime\" composer shared by captain's prompt\n// workbench and gavel's todo run dialog. It edits Captain's complete prompt-run\n// request without making hosts project that contract into editor-specific state.\n// Hosts should mount it with a `key` per prompt/todo so internal draft state\n// (raw-JSON text, modal open) resets on selection change.\nexport function PromptRunEditor({\n value,\n onChange,\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n tools = [],\n permissionCatalog,\n secretSelector,\n cliOptions,\n sandboxCatalog,\n sandboxCreate,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n variablesSchema,\n onVariablesValidityChange,\n promptEditor,\n promptLabel = \"User prompt\",\n promptPlaceholder = \"Override the rendered user prompt\",\n enableAttachments = false,\n attachmentUpload,\n attachmentLimits,\n children,\n header,\n footer,\n className,\n editSpecLabel = \"Edit spec\",\n specModalTitle = \"Runtime spec\",\n specSections,\n}: PromptRunEditorProps) {\n const [specOpen, setSpecOpen] = useState(false);\n const spec = value.spec ?? {};\n const rows = runtimeRows(value);\n const selectedModel = models.find(\n (model) => model.id === spec.id || model.id === spec.model,\n );\n const resolvedAttachmentUpload = useMemo(\n () => attachmentUpload ?? createAttachmentUploadAdapter(),\n [attachmentUpload],\n );\n const attachmentFiles: FileUIPart[] = (spec.prompt?.attachments ?? []).map(\n (attachment) => ({\n type: \"file\",\n url: attachment.id\n ? `/api/attachments/${attachment.id}`\n : (attachment.url ?? \"\"),\n mediaType: attachment.mediaType ?? \"application/octet-stream\",\n ...(attachment.id ? { attachmentId: attachment.id } : {}),\n ...(attachment.size != null ? { size: attachment.size } : {}),\n ...(attachment.filename ? { filename: attachment.filename } : {}),\n ...(!attachment.filename && attachment.path\n ? { filename: attachment.path }\n : {}),\n }),\n ) as FileUIPart[];\n\n return (\n <div className={cn(\"grid gap-density-4\", className)}>\n {header}\n\n <Block title=\"Runtime\">\n <div className=\"grid gap-density-2\">\n {rows.map((runtime, index) => (\n <div\n key={index}\n role=\"group\"\n aria-label={`Runtime ${index + 1}`}\n className=\"flex min-w-0 items-center gap-density-2\"\n >\n <RuntimeBar\n value={runtime}\n onChange={(next) =>\n onChange(\n withRuntimeRows(\n value,\n rows.map((item, itemIndex) =>\n itemIndex === index ? next : item,\n ),\n ),\n )\n }\n models={models}\n families={families}\n reasoningEfforts={reasoningEfforts}\n ariaLabel={`Runtime ${index + 1} controls`}\n />\n {rows.length > 1 && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Remove runtime ${index + 1}`}\n onClick={() =>\n onChange(\n withRuntimeRows(\n value,\n rows.filter((_, itemIndex) => itemIndex !== index),\n ),\n )\n }\n >\n <Icon icon={UiTrash} className=\"size-4\" />\n </Button>\n )}\n </div>\n ))}\n <div className=\"flex flex-wrap items-center gap-density-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n aria-label=\"Add runtime\"\n onClick={() =>\n onChange(\n withRuntimeRows(value, [\n ...rows,\n rows[0]?.backend ? { backend: rows[0].backend } : {},\n ]),\n )\n }\n >\n <Icon icon={UiAdd} className=\"size-4\" />\n Add runtime\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setSpecOpen(true)}\n >\n <Icon icon={UiGearSix} className=\"size-4\" />\n {editSpecLabel}\n </Button>\n </div>\n </div>\n {children}\n </Block>\n\n <Block title=\"Variables\">\n <VariablesField\n {...(variablesSchema ? { schema: variablesSchema } : {})}\n value={value.variables ?? {}}\n onChange={(variables) => onChange({ ...value, variables })}\n {...(onVariablesValidityChange\n ? { onValidityChange: onVariablesValidityChange }\n : {})}\n />\n </Block>\n\n <Block title={promptLabel}>\n {promptEditor ?? (\n <textarea\n value={spec.prompt?.user ?? \"\"}\n onChange={(event) =>\n onChange({\n ...value,\n spec: withPrompt(spec, { user: event.target.value }),\n })\n }\n spellCheck={false}\n placeholder={promptPlaceholder}\n aria-label={promptLabel}\n className=\"min-h-[7rem] w-full resize-y rounded-md border border-border bg-background px-density-2 py-density-1 text-sm outline-none focus:ring-2 focus:ring-ring\"\n />\n )}\n {enableAttachments && (\n <div className=\"space-y-density-2\">\n <AttachmentList\n files={attachmentFiles}\n onRemove={(index) =>\n onChange({\n ...value,\n spec: withPrompt(spec, {\n attachments: (spec.prompt?.attachments ?? []).filter(\n (_, itemIndex) => itemIndex !== index,\n ),\n }),\n })\n }\n />\n <AttachmentButton\n files={attachmentFiles}\n upload={resolvedAttachmentUpload}\n onAdd={(parts) =>\n onChange({\n ...value,\n spec: withPrompt(spec, {\n attachments: [\n ...(spec.prompt?.attachments ?? []),\n ...parts.map((part) => {\n const uploaded = part as AttachmentFilePart;\n return {\n id: uploaded.attachmentId,\n mediaType: uploaded.mediaType,\n size: uploaded.size,\n ...(uploaded.filename\n ? { filename: uploaded.filename }\n : {}),\n };\n }),\n ],\n }),\n })\n }\n {...(selectedModel?.inputMediaTypes\n ? { acceptedMediaTypes: selectedModel.inputMediaTypes }\n : {})}\n {...(attachmentLimits ? { limits: attachmentLimits } : {})}\n />\n </div>\n )}\n </Block>\n\n {footer}\n\n <Modal\n open={specOpen}\n onClose={() => setSpecOpen(false)}\n title={specModalTitle}\n size=\"full\"\n closeOnEsc\n className=\"h-[95vh]\"\n >\n <SpecRuntimeEditor\n value={spec}\n onChange={(next) => onChange({ ...value, spec: next })}\n models={models}\n families={families}\n tools={tools}\n {...(permissionCatalog ? { permissionCatalog } : {})}\n {...(secretSelector ? { secretSelector } : {})}\n {...(cliOptions ? { cliOptions } : {})}\n {...(sandboxCatalog ? { sandboxCatalog } : {})}\n {...(sandboxCreate ? { sandboxCreate } : {})}\n {...(specSections ? { sections: specSections } : {})}\n onSave={() => setSpecOpen(false)}\n onCancel={() => setSpecOpen(false)}\n saveLabel=\"Done\"\n footerStatus={labelForBackend(spec.backend, families)}\n />\n </Modal>\n </div>\n );\n}\n\nfunction Block({ title, children }: { title: string; children: ReactNode }) {\n return (\n <section className=\"space-y-density-2\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {title}\n </div>\n {children}\n </section>\n );\n}\n\n// Variables are edited via the prompt's declared schema when present, otherwise\n// as a raw JSON object; the raw text is held locally and only committed to the\n// host when it parses to an object.\nfunction VariablesField({\n schema,\n value,\n onChange,\n onValidityChange,\n}: {\n schema?: JsonSchemaObject | undefined;\n value: Record<string, unknown>;\n onChange: (next: Record<string, unknown>) => void;\n onValidityChange?: ((valid: boolean) => void) | undefined;\n}) {\n const idPrefix = useId();\n const [rawText, setRawText] = useState(() => stringifyVariables(value));\n const [rawError, setRawError] = useState<string | null>(null);\n\n if (schema) {\n return (\n <JsonSchemaForm\n idPrefix={`prompt-vars-${idPrefix}`}\n schema={schema}\n value={value}\n onChange={(next) => onChange(next as Record<string, unknown>)}\n size=\"sm\"\n />\n );\n }\n\n const commit = (text: string) => {\n setRawText(text);\n if (!text.trim()) {\n setRawError(null);\n onValidityChange?.(true);\n onChange({});\n return;\n }\n try {\n const parsed = JSON.parse(text);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n setRawError(null);\n onValidityChange?.(true);\n onChange(parsed as Record<string, unknown>);\n } else {\n setRawError(\"Expected a JSON object\");\n onValidityChange?.(false);\n }\n } catch (error) {\n setRawError(error instanceof Error ? error.message : \"Invalid JSON\");\n onValidityChange?.(false);\n }\n };\n\n return (\n <div className=\"space-y-1\">\n <textarea\n value={rawText}\n onChange={(event) => commit(event.target.value)}\n spellCheck={false}\n placeholder=\"{}\"\n aria-label=\"Variables JSON\"\n className=\"h-28 w-full resize-y rounded-md border border-border bg-background px-density-2 py-density-1 font-mono text-xs outline-none focus:ring-2 focus:ring-ring\"\n />\n {rawError && <div className=\"text-xs text-destructive\">{rawError}</div>}\n </div>\n );\n}\n\nfunction stringifyVariables(value: Record<string, unknown>) {\n if (!value || Object.keys(value).length === 0) return \"{}\";\n return JSON.stringify(value, null, 2);\n}\n"],"names":["SPEC_RUNTIME_FAMILIES","DEFAULT_REASONING_EFFORTS","attachmentUpload","useState","runtimeRows","model","useMemo","createAttachmentUploadAdapter","cn","jsxs","index","jsx","RuntimeBar","withRuntimeRows","Button","Icon","UiTrash","_a","UiAdd","UiGearSix","withPrompt","AttachmentList","AttachmentButton","Modal","SpecRuntimeEditor","labelForBackend","useId","JsonSchemaForm"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/data/ai/PromptRunEditor/index.tsx"],"sourcesContent":["import { useId, useMemo, useState, type ReactNode } from \"react\";\nimport { Button } from \"../../../components/button\";\nimport { JsonSchemaForm } from \"../../../components/JsonSchemaForm\";\nimport type { JsonSchemaObject } from \"../../../components/json-schema-form-types\";\nimport { UiAdd, UiGearSix, UiTrash } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport { Modal } from \"../../../overlay/Modal\";\nimport { Icon } from \"../../Icon\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../../chat/effort-icons\";\nimport { AttachmentButton, AttachmentList } from \"../../chat/Attachment\";\nimport {\n createAttachmentUploadAdapter,\n type AttachmentFilePart,\n type AttachmentLimits,\n type AttachmentUploadAdapter,\n} from \"../../chat/attachment-upload\";\nimport type { ChatModel, ToolMeta } from \"../../chat/types\";\nimport type { FileUIPart } from \"../../chat/types\";\nimport { RuntimeBar } from \"../../runtime/RuntimeBar\";\nimport { runtimeModelForValue } from \"../../runtime/RuntimeBar.model\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n labelForMode,\n} from \"../../runtime/runtime-mode\";\nimport { SpecRuntimeEditor } from \"../SpecRuntimeEditor\";\nimport type { SpecRuntimeSandboxCreateConfig } from \"../SandboxCreateWizard.model\";\nimport type { SpecRuntimeCLIOptions } from \"../SpecRuntimeEditor/CLIArgsSection\";\nimport type { SpecRuntimeSandboxCatalog } from \"../SpecRuntimeEditor/types\";\nimport type {\n SpecRuntimeSecretSelectorConfig,\n SpecSectionId,\n} from \"../SpecRuntimeEditor/types\";\nimport { withPrompt } from \"../SpecRuntimeEditor/update\";\nimport type { AISpecRuntimePermissionCatalog } from \"../SpecRuntimeEditor.model\";\nimport { runtimeRows, withRuntimeRows, type AIPromptRunValue } from \"./model\";\n\nexport type PromptRunEditorProps = {\n value: AIPromptRunValue;\n onChange: (value: AIPromptRunValue) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n tools?: ToolMeta[] | undefined;\n permissionCatalog?: AISpecRuntimePermissionCatalog | undefined;\n secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;\n cliOptions?: SpecRuntimeCLIOptions | undefined;\n /** Sandbox adapter catalog; enables the spec editor's Sandbox section. */\n sandboxCatalog?: SpecRuntimeSandboxCatalog | undefined;\n /** Host-owned sandbox creation and credential-reference adapter. */\n sandboxCreate?: SpecRuntimeSandboxCreateConfig | undefined;\n reasoningEfforts?: string[] | undefined;\n\n /** Schema-driven variables form; omit to render a raw-JSON editor. */\n variablesSchema?: JsonSchemaObject | undefined;\n /** Fires false while raw-JSON variables fail to parse; always true with a schema. */\n onVariablesValidityChange?: ((valid: boolean) => void) | undefined;\n\n /** Host-supplied editor for the `prompt.user` override; defaults to a textarea. */\n promptEditor?: ReactNode | undefined;\n promptLabel?: string | undefined;\n promptPlaceholder?: string | undefined;\n enableAttachments?: boolean | undefined;\n attachmentUpload?: AttachmentUploadAdapter | undefined;\n attachmentLimits?: AttachmentLimits | undefined;\n\n /** Extra fields injected inside the Runtime block, below Model/Effort. */\n children?: ReactNode | undefined;\n header?: ReactNode | undefined;\n footer?: ReactNode | undefined;\n className?: string | undefined;\n\n editSpecLabel?: string | undefined;\n specModalTitle?: string | undefined;\n /** Restrict which SpecRuntimeEditor sections the \"Edit spec\" modal shows. */\n specSections?: readonly SpecSectionId[] | undefined;\n};\n\n// The inline \"prompt + variables + runtime\" composer shared by captain's prompt\n// workbench and gavel's todo run dialog. It edits Captain's complete prompt-run\n// request without making hosts project that contract into editor-specific state.\n// Hosts should mount it with a `key` per prompt/todo so internal draft state\n// (raw-JSON text, modal open) resets on selection change.\nexport function PromptRunEditor({\n value,\n onChange,\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n tools = [],\n permissionCatalog,\n secretSelector,\n cliOptions,\n sandboxCatalog,\n sandboxCreate,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n variablesSchema,\n onVariablesValidityChange,\n promptEditor,\n promptLabel = \"User prompt\",\n promptPlaceholder = \"Override the rendered user prompt\",\n enableAttachments = false,\n attachmentUpload,\n attachmentLimits,\n children,\n header,\n footer,\n className,\n editSpecLabel = \"Edit spec\",\n specModalTitle = \"Runtime spec\",\n specSections,\n}: PromptRunEditorProps) {\n const [specOpen, setSpecOpen] = useState(false);\n const spec = value.spec ?? {};\n const rows = runtimeRows(value);\n const selectedModel = runtimeModelForValue(models, spec);\n const resolvedAttachmentUpload = useMemo(\n () => attachmentUpload ?? createAttachmentUploadAdapter(),\n [attachmentUpload],\n );\n const attachmentFiles: FileUIPart[] = (spec.prompt?.attachments ?? []).map(\n (attachment) => ({\n type: \"file\",\n url: attachment.id\n ? `/api/attachments/${attachment.id}`\n : (attachment.url ?? \"\"),\n mediaType: attachment.mediaType ?? \"application/octet-stream\",\n ...(attachment.id ? { attachmentId: attachment.id } : {}),\n ...(attachment.size != null ? { size: attachment.size } : {}),\n ...(attachment.filename ? { filename: attachment.filename } : {}),\n ...(!attachment.filename && attachment.path\n ? { filename: attachment.path }\n : {}),\n }),\n ) as FileUIPart[];\n\n return (\n <div className={cn(\"grid gap-density-4\", className)}>\n {header}\n\n <Block title=\"Runtime\">\n <div className=\"grid gap-density-2\">\n {rows.map((runtime, index) => (\n <div\n key={index}\n role=\"group\"\n aria-label={`Runtime ${index + 1}`}\n className=\"flex min-w-0 items-center gap-density-2\"\n >\n <RuntimeBar\n value={runtime}\n onChange={(next) =>\n onChange(\n withRuntimeRows(\n value,\n rows.map((item, itemIndex) =>\n itemIndex === index ? next : item,\n ),\n ),\n )\n }\n models={models}\n families={families}\n reasoningEfforts={reasoningEfforts}\n ariaLabel={`Runtime ${index + 1} controls`}\n />\n {rows.length > 1 && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Remove runtime ${index + 1}`}\n onClick={() =>\n onChange(\n withRuntimeRows(\n value,\n rows.filter((_, itemIndex) => itemIndex !== index),\n ),\n )\n }\n >\n <Icon icon={UiTrash} className=\"size-4\" />\n </Button>\n )}\n </div>\n ))}\n <div className=\"flex flex-wrap items-center gap-density-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n aria-label=\"Add runtime\"\n onClick={() =>\n onChange(\n withRuntimeRows(value, [\n ...rows,\n rows[0]?.mode ? { mode: rows[0].mode } : {},\n ]),\n )\n }\n >\n <Icon icon={UiAdd} className=\"size-4\" />\n Add runtime\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setSpecOpen(true)}\n >\n <Icon icon={UiGearSix} className=\"size-4\" />\n {editSpecLabel}\n </Button>\n </div>\n </div>\n {children}\n </Block>\n\n <Block title=\"Variables\">\n <VariablesField\n {...(variablesSchema ? { schema: variablesSchema } : {})}\n value={value.variables ?? {}}\n onChange={(variables) => onChange({ ...value, variables })}\n {...(onVariablesValidityChange\n ? { onValidityChange: onVariablesValidityChange }\n : {})}\n />\n </Block>\n\n <Block title={promptLabel}>\n {promptEditor ?? (\n <textarea\n value={spec.prompt?.user ?? \"\"}\n onChange={(event) =>\n onChange({\n ...value,\n spec: withPrompt(spec, { user: event.target.value }),\n })\n }\n spellCheck={false}\n placeholder={promptPlaceholder}\n aria-label={promptLabel}\n className=\"min-h-[7rem] w-full resize-y rounded-md border border-border bg-background px-density-2 py-density-1 text-sm outline-none focus:ring-2 focus:ring-ring\"\n />\n )}\n {enableAttachments && (\n <div className=\"space-y-density-2\">\n <AttachmentList\n files={attachmentFiles}\n onRemove={(index) =>\n onChange({\n ...value,\n spec: withPrompt(spec, {\n attachments: (spec.prompt?.attachments ?? []).filter(\n (_, itemIndex) => itemIndex !== index,\n ),\n }),\n })\n }\n />\n <AttachmentButton\n files={attachmentFiles}\n upload={resolvedAttachmentUpload}\n onAdd={(parts) =>\n onChange({\n ...value,\n spec: withPrompt(spec, {\n attachments: [\n ...(spec.prompt?.attachments ?? []),\n ...parts.map((part) => {\n const uploaded = part as AttachmentFilePart;\n return {\n id: uploaded.attachmentId,\n mediaType: uploaded.mediaType,\n size: uploaded.size,\n ...(uploaded.filename\n ? { filename: uploaded.filename }\n : {}),\n };\n }),\n ],\n }),\n })\n }\n {...(selectedModel?.inputMediaTypes\n ? { acceptedMediaTypes: selectedModel.inputMediaTypes }\n : {})}\n {...(attachmentLimits ? { limits: attachmentLimits } : {})}\n />\n </div>\n )}\n </Block>\n\n {footer}\n\n <Modal\n open={specOpen}\n onClose={() => setSpecOpen(false)}\n title={specModalTitle}\n size=\"full\"\n closeOnEsc\n className=\"h-[95vh]\"\n >\n <SpecRuntimeEditor\n value={spec}\n onChange={(next) => onChange({ ...value, spec: next })}\n models={models}\n families={families}\n tools={tools}\n {...(permissionCatalog ? { permissionCatalog } : {})}\n {...(secretSelector ? { secretSelector } : {})}\n {...(cliOptions ? { cliOptions } : {})}\n {...(sandboxCatalog ? { sandboxCatalog } : {})}\n {...(sandboxCreate ? { sandboxCreate } : {})}\n {...(specSections ? { sections: specSections } : {})}\n onSave={() => setSpecOpen(false)}\n onCancel={() => setSpecOpen(false)}\n saveLabel=\"Done\"\n footerStatus={labelForMode(spec.mode, families)}\n />\n </Modal>\n </div>\n );\n}\n\nfunction Block({ title, children }: { title: string; children: ReactNode }) {\n return (\n <section className=\"space-y-density-2\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {title}\n </div>\n {children}\n </section>\n );\n}\n\n// Variables are edited via the prompt's declared schema when present, otherwise\n// as a raw JSON object; the raw text is held locally and only committed to the\n// host when it parses to an object.\nfunction VariablesField({\n schema,\n value,\n onChange,\n onValidityChange,\n}: {\n schema?: JsonSchemaObject | undefined;\n value: Record<string, unknown>;\n onChange: (next: Record<string, unknown>) => void;\n onValidityChange?: ((valid: boolean) => void) | undefined;\n}) {\n const idPrefix = useId();\n const [rawText, setRawText] = useState(() => stringifyVariables(value));\n const [rawError, setRawError] = useState<string | null>(null);\n\n if (schema) {\n return (\n <JsonSchemaForm\n idPrefix={`prompt-vars-${idPrefix}`}\n schema={schema}\n value={value}\n onChange={(next) => onChange(next as Record<string, unknown>)}\n size=\"sm\"\n />\n );\n }\n\n const commit = (text: string) => {\n setRawText(text);\n if (!text.trim()) {\n setRawError(null);\n onValidityChange?.(true);\n onChange({});\n return;\n }\n try {\n const parsed = JSON.parse(text);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n setRawError(null);\n onValidityChange?.(true);\n onChange(parsed as Record<string, unknown>);\n } else {\n setRawError(\"Expected a JSON object\");\n onValidityChange?.(false);\n }\n } catch (error) {\n setRawError(error instanceof Error ? error.message : \"Invalid JSON\");\n onValidityChange?.(false);\n }\n };\n\n return (\n <div className=\"space-y-1\">\n <textarea\n value={rawText}\n onChange={(event) => commit(event.target.value)}\n spellCheck={false}\n placeholder=\"{}\"\n aria-label=\"Variables JSON\"\n className=\"h-28 w-full resize-y rounded-md border border-border bg-background px-density-2 py-density-1 font-mono text-xs outline-none focus:ring-2 focus:ring-ring\"\n />\n {rawError && <div className=\"text-xs text-destructive\">{rawError}</div>}\n </div>\n );\n}\n\nfunction stringifyVariables(value: Record<string, unknown>) {\n if (!value || Object.keys(value).length === 0) return \"{}\";\n return JSON.stringify(value, null, 2);\n}\n"],"names":["SPEC_RUNTIME_FAMILIES","DEFAULT_REASONING_EFFORTS","attachmentUpload","useState","runtimeRows","runtimeModelForValue","useMemo","createAttachmentUploadAdapter","cn","jsxs","index","jsx","RuntimeBar","withRuntimeRows","Button","Icon","UiTrash","_a","UiAdd","UiGearSix","withPrompt","AttachmentList","AttachmentButton","Modal","SpecRuntimeEditor","labelForMode","useId","JsonSchemaForm"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/PromptRunEditor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAOnF,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC7B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/PromptRunEditor/index.tsx"],"names":[],"mappings":"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"}
|