@flanksource/clicky-ui 0.3.27 → 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 -10
- package/dist/data/FixtureEditor/fixture-frontmatter.cjs.map +1 -1
- package/dist/data/FixtureEditor/fixture-frontmatter.d.ts.map +1 -1
- package/dist/data/FixtureEditor/fixture-frontmatter.js +8 -10
- 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 +2 -2
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +3 -3
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/model.cjs +0 -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 +0 -1
- package/dist/data/ai/PromptRunEditor/model.js.map +1 -1
- package/dist/data/ai/RuntimeModePicker.cjs +15 -6
- 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 +17 -8
- 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 +34 -23
- 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 +35 -24
- 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 -49
- package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts +52 -29
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.js +33 -48
- 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 +13 -3
- 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 +14 -4
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/Chat.runtime.cjs +4 -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 +4 -9
- 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 +29 -16
- 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 +31 -18
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.model.cjs +10 -20
- package/dist/data/runtime/RuntimeBar.model.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.model.d.ts +2 -2
- package/dist/data/runtime/RuntimeBar.model.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.model.js +11 -21
- 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 +0 -3
- package/dist/data/runtime/model-capabilities.cjs.map +1 -1
- package/dist/data/runtime/model-capabilities.d.ts +0 -1
- package/dist/data/runtime/model-capabilities.d.ts.map +1 -1
- package/dist/data/runtime/model-capabilities.js +0 -3
- 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 +158 -116
- package/dist/data/runtime/runtime-mode.cjs.map +1 -1
- package/dist/data/runtime/runtime-mode.d.ts +57 -19
- package/dist/data/runtime/runtime-mode.d.ts.map +1 -1
- package/dist/data/runtime/runtime-mode.js +158 -116
- 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
|
@@ -141,7 +141,7 @@ function FixtureFrontmatterDialog({
|
|
|
141
141
|
}
|
|
142
142
|
function hasRuntimeModelOverride(value) {
|
|
143
143
|
return Boolean(
|
|
144
|
-
value.model || value.
|
|
144
|
+
value.model || value.mode || value.id || value.effort || value.temperature != null || value.noCache || value.budget
|
|
145
145
|
);
|
|
146
146
|
}
|
|
147
147
|
exports.FixtureFrontmatterDialog = FixtureFrontmatterDialog;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FixtureFrontmatterDialog.cjs","sources":["../../../src/data/FixtureEditor/FixtureFrontmatterDialog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { UiCheck, UiFileCode } from \"../../icons\";\nimport { Badge } from \"../Badge\";\nimport { Icon } from \"../Icon\";\nimport { SpecRuntimeEditor } from \"../ai/SpecRuntimeEditor\";\nimport type { SpecSectionId } from \"../ai/SpecRuntimeEditor/types\";\nimport type {\n FixtureEditorSize,\n FixtureFrontmatterEditorOptions,\n} from \"./types\";\nimport {\n applyFixtureFrontmatterRaw,\n applyFixtureFrontmatterState,\n fixtureFrontmatterState,\n parseFixtureFrontmatter,\n type FixtureFrontmatterState,\n} from \"./fixture-frontmatter\";\n\nexport type FixtureFrontmatterDialogProps = {\n open: boolean;\n markdown: string;\n onChange: (markdown: string) => void;\n onClose: () => void;\n size: FixtureEditorSize;\n options?: FixtureFrontmatterEditorOptions | undefined;\n};\n\nconst EMPTY_STATE: FixtureFrontmatterState = {\n runtime: {},\n aiExtras: {},\n};\n\ntype VerificationModelMode = \"same\" | \"different\";\n\nconst VERIFICATION_MODEL_OPTIONS: Array<{\n id: VerificationModelMode;\n label: string;\n}> = [\n { id: \"same\", label: \"Use same model\" },\n { id: \"different\", label: \"Use different model for verification\" },\n];\n\nconst DEFAULT_SECTIONS: readonly SpecSectionId[] = [\"model\", \"prompt\"];\nconst VERIFICATION_MODEL_SECTIONS: readonly SpecSectionId[] = [\n \"model\",\n \"prompt\",\n \"environment\",\n];\nconst VERIFICATION_INHERIT_SECTIONS: readonly SpecSectionId[] = [\n \"prompt\",\n \"environment\",\n];\nconst COLLAPSED_VERIFICATION_SECTIONS: readonly SpecSectionId[] = [\n \"environment\",\n];\n\nexport function FixtureFrontmatterDialog({\n open,\n markdown,\n onChange,\n onClose,\n options,\n}: FixtureFrontmatterDialogProps) {\n const parsed = useMemo(() => parseFixtureFrontmatter(markdown), [markdown]);\n const initialState = useMemo(\n () => (parsed.ok ? fixtureFrontmatterState(parsed.frontmatter) : EMPTY_STATE),\n [parsed],\n );\n const isVerification = options?.mode === \"verification\";\n const initialVerificationModelMode = useMemo<VerificationModelMode>(\n () => (hasRuntimeModelOverride(initialState.runtime) ? \"different\" : \"same\"),\n [initialState.runtime],\n );\n const [draft, setDraft] = useState<FixtureFrontmatterState>(initialState);\n const [rawDraft, setRawDraft] = useState(parsed.raw);\n const [verificationModelMode, setVerificationModelMode] =\n useState<VerificationModelMode>(initialVerificationModelMode);\n\n useEffect(() => {\n if (!open) return;\n setDraft(initialState);\n setRawDraft(parsed.raw);\n setVerificationModelMode(initialVerificationModelMode);\n }, [initialState, initialVerificationModelMode, open, parsed.raw]);\n\n const dirty = parsed.ok\n ? JSON.stringify(draft) !== JSON.stringify(initialState) ||\n (isVerification &&\n verificationModelMode !== initialVerificationModelMode)\n : rawDraft !== parsed.raw;\n\n const save = () => {\n const next = parsed.ok\n ? applyFixtureFrontmatterState(markdown, draft, {\n inheritModel: isVerification && verificationModelMode === \"same\",\n })\n : applyFixtureFrontmatterRaw(markdown, rawDraft);\n onChange(next);\n onClose();\n };\n\n const sections =\n isVerification && verificationModelMode === \"same\"\n ? VERIFICATION_INHERIT_SECTIONS\n : isVerification\n ? VERIFICATION_MODEL_SECTIONS\n : DEFAULT_SECTIONS;\n const verificationModelSelector = isVerification ? (\n <div className=\"pb-density-3\">\n <SegmentedControl\n aria-label=\"Verification model\"\n value={verificationModelMode}\n options={VERIFICATION_MODEL_OPTIONS}\n onChange={(mode) =>\n setVerificationModelMode(mode as VerificationModelMode)\n }\n size=\"lg\"\n wrap\n className=\"w-full\"\n />\n </div>\n ) : undefined;\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n confirmClose={dirty}\n title=\"Fixture frontmatter\"\n size=\"2xl\"\n className=\"h-[92vh]\"\n footer={\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-xs text-muted-foreground\">\n {parsed.ok ? \"ai / env\" : \"YAML source\"}\n </span>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onClose}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={save}>\n <Icon icon={UiCheck} className=\"size-4\" />\n Save frontmatter\n </Button>\n </div>\n </div>\n }\n >\n {parsed.ok ? (\n <div className=\"min-h-0\">\n <SpecRuntimeEditor\n value={draft.runtime}\n onChange={(runtime) => setDraft((current) => ({ ...current, runtime }))}\n models={options?.models}\n families={options?.families}\n tools={options?.tools}\n permissionCatalog={options?.permissionCatalog}\n secretSelector={options?.secretSelector}\n cliOptions={options?.cliOptions}\n sections={sections}\n showHeader={false}\n {...(verificationModelSelector\n ? { beforeSections: verificationModelSelector }\n : {})}\n defaultCollapsedSections={\n isVerification ? COLLAPSED_VERIFICATION_SECTIONS : undefined\n }\n />\n </div>\n ) : (\n <div className=\"grid gap-3\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"status\" status=\"error\" size=\"xs\" clickToCopy={false}>\n YAML error\n </Badge>\n <span className=\"text-xs text-muted-foreground\">{parsed.error}</span>\n </div>\n <label className=\"grid gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1.5\">\n <Icon icon={UiFileCode} className=\"size-4\" />\n Frontmatter source\n </span>\n <textarea\n aria-label=\"Frontmatter source\"\n value={rawDraft}\n onChange={(event) => setRawDraft(event.currentTarget.value)}\n spellCheck={false}\n className=\"min-h-80 w-full resize-y rounded-md border border-input bg-background px-3 py-2 font-mono text-xs leading-5 text-foreground shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </label>\n </div>\n )}\n </Modal>\n );\n}\n\nfunction hasRuntimeModelOverride(value: FixtureFrontmatterState[\"runtime\"]) {\n return Boolean(\n value.model ||\n value.backend ||\n value.id ||\n value.effort ||\n value.temperature != null ||\n value.noCache ||\n value.budget,\n );\n}\n"],"names":["useMemo","parseFixtureFrontmatter","fixtureFrontmatterState","useState","useEffect","applyFixtureFrontmatterState","applyFixtureFrontmatterRaw","jsx","SegmentedControl","Modal","jsxs","Button","Icon","UiCheck","SpecRuntimeEditor","Badge","UiFileCode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FixtureFrontmatterDialog.cjs","sources":["../../../src/data/FixtureEditor/FixtureFrontmatterDialog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { UiCheck, UiFileCode } from \"../../icons\";\nimport { Badge } from \"../Badge\";\nimport { Icon } from \"../Icon\";\nimport { SpecRuntimeEditor } from \"../ai/SpecRuntimeEditor\";\nimport type { SpecSectionId } from \"../ai/SpecRuntimeEditor/types\";\nimport type {\n FixtureEditorSize,\n FixtureFrontmatterEditorOptions,\n} from \"./types\";\nimport {\n applyFixtureFrontmatterRaw,\n applyFixtureFrontmatterState,\n fixtureFrontmatterState,\n parseFixtureFrontmatter,\n type FixtureFrontmatterState,\n} from \"./fixture-frontmatter\";\n\nexport type FixtureFrontmatterDialogProps = {\n open: boolean;\n markdown: string;\n onChange: (markdown: string) => void;\n onClose: () => void;\n size: FixtureEditorSize;\n options?: FixtureFrontmatterEditorOptions | undefined;\n};\n\nconst EMPTY_STATE: FixtureFrontmatterState = {\n runtime: {},\n aiExtras: {},\n};\n\ntype VerificationModelMode = \"same\" | \"different\";\n\nconst VERIFICATION_MODEL_OPTIONS: Array<{\n id: VerificationModelMode;\n label: string;\n}> = [\n { id: \"same\", label: \"Use same model\" },\n { id: \"different\", label: \"Use different model for verification\" },\n];\n\nconst DEFAULT_SECTIONS: readonly SpecSectionId[] = [\"model\", \"prompt\"];\nconst VERIFICATION_MODEL_SECTIONS: readonly SpecSectionId[] = [\n \"model\",\n \"prompt\",\n \"environment\",\n];\nconst VERIFICATION_INHERIT_SECTIONS: readonly SpecSectionId[] = [\n \"prompt\",\n \"environment\",\n];\nconst COLLAPSED_VERIFICATION_SECTIONS: readonly SpecSectionId[] = [\n \"environment\",\n];\n\nexport function FixtureFrontmatterDialog({\n open,\n markdown,\n onChange,\n onClose,\n options,\n}: FixtureFrontmatterDialogProps) {\n const parsed = useMemo(() => parseFixtureFrontmatter(markdown), [markdown]);\n const initialState = useMemo(\n () => (parsed.ok ? fixtureFrontmatterState(parsed.frontmatter) : EMPTY_STATE),\n [parsed],\n );\n const isVerification = options?.mode === \"verification\";\n const initialVerificationModelMode = useMemo<VerificationModelMode>(\n () => (hasRuntimeModelOverride(initialState.runtime) ? \"different\" : \"same\"),\n [initialState.runtime],\n );\n const [draft, setDraft] = useState<FixtureFrontmatterState>(initialState);\n const [rawDraft, setRawDraft] = useState(parsed.raw);\n const [verificationModelMode, setVerificationModelMode] =\n useState<VerificationModelMode>(initialVerificationModelMode);\n\n useEffect(() => {\n if (!open) return;\n setDraft(initialState);\n setRawDraft(parsed.raw);\n setVerificationModelMode(initialVerificationModelMode);\n }, [initialState, initialVerificationModelMode, open, parsed.raw]);\n\n const dirty = parsed.ok\n ? JSON.stringify(draft) !== JSON.stringify(initialState) ||\n (isVerification &&\n verificationModelMode !== initialVerificationModelMode)\n : rawDraft !== parsed.raw;\n\n const save = () => {\n const next = parsed.ok\n ? applyFixtureFrontmatterState(markdown, draft, {\n inheritModel: isVerification && verificationModelMode === \"same\",\n })\n : applyFixtureFrontmatterRaw(markdown, rawDraft);\n onChange(next);\n onClose();\n };\n\n const sections =\n isVerification && verificationModelMode === \"same\"\n ? VERIFICATION_INHERIT_SECTIONS\n : isVerification\n ? VERIFICATION_MODEL_SECTIONS\n : DEFAULT_SECTIONS;\n const verificationModelSelector = isVerification ? (\n <div className=\"pb-density-3\">\n <SegmentedControl\n aria-label=\"Verification model\"\n value={verificationModelMode}\n options={VERIFICATION_MODEL_OPTIONS}\n onChange={(mode) =>\n setVerificationModelMode(mode as VerificationModelMode)\n }\n size=\"lg\"\n wrap\n className=\"w-full\"\n />\n </div>\n ) : undefined;\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n confirmClose={dirty}\n title=\"Fixture frontmatter\"\n size=\"2xl\"\n className=\"h-[92vh]\"\n footer={\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-xs text-muted-foreground\">\n {parsed.ok ? \"ai / env\" : \"YAML source\"}\n </span>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onClose}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={save}>\n <Icon icon={UiCheck} className=\"size-4\" />\n Save frontmatter\n </Button>\n </div>\n </div>\n }\n >\n {parsed.ok ? (\n <div className=\"min-h-0\">\n <SpecRuntimeEditor\n value={draft.runtime}\n onChange={(runtime) => setDraft((current) => ({ ...current, runtime }))}\n models={options?.models}\n families={options?.families}\n tools={options?.tools}\n permissionCatalog={options?.permissionCatalog}\n secretSelector={options?.secretSelector}\n cliOptions={options?.cliOptions}\n sections={sections}\n showHeader={false}\n {...(verificationModelSelector\n ? { beforeSections: verificationModelSelector }\n : {})}\n defaultCollapsedSections={\n isVerification ? COLLAPSED_VERIFICATION_SECTIONS : undefined\n }\n />\n </div>\n ) : (\n <div className=\"grid gap-3\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"status\" status=\"error\" size=\"xs\" clickToCopy={false}>\n YAML error\n </Badge>\n <span className=\"text-xs text-muted-foreground\">{parsed.error}</span>\n </div>\n <label className=\"grid gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1.5\">\n <Icon icon={UiFileCode} className=\"size-4\" />\n Frontmatter source\n </span>\n <textarea\n aria-label=\"Frontmatter source\"\n value={rawDraft}\n onChange={(event) => setRawDraft(event.currentTarget.value)}\n spellCheck={false}\n className=\"min-h-80 w-full resize-y rounded-md border border-input bg-background px-3 py-2 font-mono text-xs leading-5 text-foreground shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </label>\n </div>\n )}\n </Modal>\n );\n}\n\nfunction hasRuntimeModelOverride(value: FixtureFrontmatterState[\"runtime\"]) {\n return Boolean(\n value.model ||\n value.mode ||\n value.id ||\n value.effort ||\n value.temperature != null ||\n value.noCache ||\n value.budget,\n );\n}\n"],"names":["useMemo","parseFixtureFrontmatter","fixtureFrontmatterState","useState","useEffect","applyFixtureFrontmatterState","applyFixtureFrontmatterRaw","jsx","SegmentedControl","Modal","jsxs","Button","Icon","UiCheck","SpecRuntimeEditor","Badge","UiFileCode"],"mappings":"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"}
|
|
@@ -139,7 +139,7 @@ function FixtureFrontmatterDialog({
|
|
|
139
139
|
}
|
|
140
140
|
function hasRuntimeModelOverride(value) {
|
|
141
141
|
return Boolean(
|
|
142
|
-
value.model || value.
|
|
142
|
+
value.model || value.mode || value.id || value.effort || value.temperature != null || value.noCache || value.budget
|
|
143
143
|
);
|
|
144
144
|
}
|
|
145
145
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FixtureFrontmatterDialog.js","sources":["../../../src/data/FixtureEditor/FixtureFrontmatterDialog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { UiCheck, UiFileCode } from \"../../icons\";\nimport { Badge } from \"../Badge\";\nimport { Icon } from \"../Icon\";\nimport { SpecRuntimeEditor } from \"../ai/SpecRuntimeEditor\";\nimport type { SpecSectionId } from \"../ai/SpecRuntimeEditor/types\";\nimport type {\n FixtureEditorSize,\n FixtureFrontmatterEditorOptions,\n} from \"./types\";\nimport {\n applyFixtureFrontmatterRaw,\n applyFixtureFrontmatterState,\n fixtureFrontmatterState,\n parseFixtureFrontmatter,\n type FixtureFrontmatterState,\n} from \"./fixture-frontmatter\";\n\nexport type FixtureFrontmatterDialogProps = {\n open: boolean;\n markdown: string;\n onChange: (markdown: string) => void;\n onClose: () => void;\n size: FixtureEditorSize;\n options?: FixtureFrontmatterEditorOptions | undefined;\n};\n\nconst EMPTY_STATE: FixtureFrontmatterState = {\n runtime: {},\n aiExtras: {},\n};\n\ntype VerificationModelMode = \"same\" | \"different\";\n\nconst VERIFICATION_MODEL_OPTIONS: Array<{\n id: VerificationModelMode;\n label: string;\n}> = [\n { id: \"same\", label: \"Use same model\" },\n { id: \"different\", label: \"Use different model for verification\" },\n];\n\nconst DEFAULT_SECTIONS: readonly SpecSectionId[] = [\"model\", \"prompt\"];\nconst VERIFICATION_MODEL_SECTIONS: readonly SpecSectionId[] = [\n \"model\",\n \"prompt\",\n \"environment\",\n];\nconst VERIFICATION_INHERIT_SECTIONS: readonly SpecSectionId[] = [\n \"prompt\",\n \"environment\",\n];\nconst COLLAPSED_VERIFICATION_SECTIONS: readonly SpecSectionId[] = [\n \"environment\",\n];\n\nexport function FixtureFrontmatterDialog({\n open,\n markdown,\n onChange,\n onClose,\n options,\n}: FixtureFrontmatterDialogProps) {\n const parsed = useMemo(() => parseFixtureFrontmatter(markdown), [markdown]);\n const initialState = useMemo(\n () => (parsed.ok ? fixtureFrontmatterState(parsed.frontmatter) : EMPTY_STATE),\n [parsed],\n );\n const isVerification = options?.mode === \"verification\";\n const initialVerificationModelMode = useMemo<VerificationModelMode>(\n () => (hasRuntimeModelOverride(initialState.runtime) ? \"different\" : \"same\"),\n [initialState.runtime],\n );\n const [draft, setDraft] = useState<FixtureFrontmatterState>(initialState);\n const [rawDraft, setRawDraft] = useState(parsed.raw);\n const [verificationModelMode, setVerificationModelMode] =\n useState<VerificationModelMode>(initialVerificationModelMode);\n\n useEffect(() => {\n if (!open) return;\n setDraft(initialState);\n setRawDraft(parsed.raw);\n setVerificationModelMode(initialVerificationModelMode);\n }, [initialState, initialVerificationModelMode, open, parsed.raw]);\n\n const dirty = parsed.ok\n ? JSON.stringify(draft) !== JSON.stringify(initialState) ||\n (isVerification &&\n verificationModelMode !== initialVerificationModelMode)\n : rawDraft !== parsed.raw;\n\n const save = () => {\n const next = parsed.ok\n ? applyFixtureFrontmatterState(markdown, draft, {\n inheritModel: isVerification && verificationModelMode === \"same\",\n })\n : applyFixtureFrontmatterRaw(markdown, rawDraft);\n onChange(next);\n onClose();\n };\n\n const sections =\n isVerification && verificationModelMode === \"same\"\n ? VERIFICATION_INHERIT_SECTIONS\n : isVerification\n ? VERIFICATION_MODEL_SECTIONS\n : DEFAULT_SECTIONS;\n const verificationModelSelector = isVerification ? (\n <div className=\"pb-density-3\">\n <SegmentedControl\n aria-label=\"Verification model\"\n value={verificationModelMode}\n options={VERIFICATION_MODEL_OPTIONS}\n onChange={(mode) =>\n setVerificationModelMode(mode as VerificationModelMode)\n }\n size=\"lg\"\n wrap\n className=\"w-full\"\n />\n </div>\n ) : undefined;\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n confirmClose={dirty}\n title=\"Fixture frontmatter\"\n size=\"2xl\"\n className=\"h-[92vh]\"\n footer={\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-xs text-muted-foreground\">\n {parsed.ok ? \"ai / env\" : \"YAML source\"}\n </span>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onClose}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={save}>\n <Icon icon={UiCheck} className=\"size-4\" />\n Save frontmatter\n </Button>\n </div>\n </div>\n }\n >\n {parsed.ok ? (\n <div className=\"min-h-0\">\n <SpecRuntimeEditor\n value={draft.runtime}\n onChange={(runtime) => setDraft((current) => ({ ...current, runtime }))}\n models={options?.models}\n families={options?.families}\n tools={options?.tools}\n permissionCatalog={options?.permissionCatalog}\n secretSelector={options?.secretSelector}\n cliOptions={options?.cliOptions}\n sections={sections}\n showHeader={false}\n {...(verificationModelSelector\n ? { beforeSections: verificationModelSelector }\n : {})}\n defaultCollapsedSections={\n isVerification ? COLLAPSED_VERIFICATION_SECTIONS : undefined\n }\n />\n </div>\n ) : (\n <div className=\"grid gap-3\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"status\" status=\"error\" size=\"xs\" clickToCopy={false}>\n YAML error\n </Badge>\n <span className=\"text-xs text-muted-foreground\">{parsed.error}</span>\n </div>\n <label className=\"grid gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1.5\">\n <Icon icon={UiFileCode} className=\"size-4\" />\n Frontmatter source\n </span>\n <textarea\n aria-label=\"Frontmatter source\"\n value={rawDraft}\n onChange={(event) => setRawDraft(event.currentTarget.value)}\n spellCheck={false}\n className=\"min-h-80 w-full resize-y rounded-md border border-input bg-background px-3 py-2 font-mono text-xs leading-5 text-foreground shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </label>\n </div>\n )}\n </Modal>\n );\n}\n\nfunction hasRuntimeModelOverride(value: FixtureFrontmatterState[\"runtime\"]) {\n return Boolean(\n value.model ||\n value.backend ||\n value.id ||\n value.effort ||\n value.temperature != null ||\n value.noCache ||\n value.budget,\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FixtureFrontmatterDialog.js","sources":["../../../src/data/FixtureEditor/FixtureFrontmatterDialog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { UiCheck, UiFileCode } from \"../../icons\";\nimport { Badge } from \"../Badge\";\nimport { Icon } from \"../Icon\";\nimport { SpecRuntimeEditor } from \"../ai/SpecRuntimeEditor\";\nimport type { SpecSectionId } from \"../ai/SpecRuntimeEditor/types\";\nimport type {\n FixtureEditorSize,\n FixtureFrontmatterEditorOptions,\n} from \"./types\";\nimport {\n applyFixtureFrontmatterRaw,\n applyFixtureFrontmatterState,\n fixtureFrontmatterState,\n parseFixtureFrontmatter,\n type FixtureFrontmatterState,\n} from \"./fixture-frontmatter\";\n\nexport type FixtureFrontmatterDialogProps = {\n open: boolean;\n markdown: string;\n onChange: (markdown: string) => void;\n onClose: () => void;\n size: FixtureEditorSize;\n options?: FixtureFrontmatterEditorOptions | undefined;\n};\n\nconst EMPTY_STATE: FixtureFrontmatterState = {\n runtime: {},\n aiExtras: {},\n};\n\ntype VerificationModelMode = \"same\" | \"different\";\n\nconst VERIFICATION_MODEL_OPTIONS: Array<{\n id: VerificationModelMode;\n label: string;\n}> = [\n { id: \"same\", label: \"Use same model\" },\n { id: \"different\", label: \"Use different model for verification\" },\n];\n\nconst DEFAULT_SECTIONS: readonly SpecSectionId[] = [\"model\", \"prompt\"];\nconst VERIFICATION_MODEL_SECTIONS: readonly SpecSectionId[] = [\n \"model\",\n \"prompt\",\n \"environment\",\n];\nconst VERIFICATION_INHERIT_SECTIONS: readonly SpecSectionId[] = [\n \"prompt\",\n \"environment\",\n];\nconst COLLAPSED_VERIFICATION_SECTIONS: readonly SpecSectionId[] = [\n \"environment\",\n];\n\nexport function FixtureFrontmatterDialog({\n open,\n markdown,\n onChange,\n onClose,\n options,\n}: FixtureFrontmatterDialogProps) {\n const parsed = useMemo(() => parseFixtureFrontmatter(markdown), [markdown]);\n const initialState = useMemo(\n () => (parsed.ok ? fixtureFrontmatterState(parsed.frontmatter) : EMPTY_STATE),\n [parsed],\n );\n const isVerification = options?.mode === \"verification\";\n const initialVerificationModelMode = useMemo<VerificationModelMode>(\n () => (hasRuntimeModelOverride(initialState.runtime) ? \"different\" : \"same\"),\n [initialState.runtime],\n );\n const [draft, setDraft] = useState<FixtureFrontmatterState>(initialState);\n const [rawDraft, setRawDraft] = useState(parsed.raw);\n const [verificationModelMode, setVerificationModelMode] =\n useState<VerificationModelMode>(initialVerificationModelMode);\n\n useEffect(() => {\n if (!open) return;\n setDraft(initialState);\n setRawDraft(parsed.raw);\n setVerificationModelMode(initialVerificationModelMode);\n }, [initialState, initialVerificationModelMode, open, parsed.raw]);\n\n const dirty = parsed.ok\n ? JSON.stringify(draft) !== JSON.stringify(initialState) ||\n (isVerification &&\n verificationModelMode !== initialVerificationModelMode)\n : rawDraft !== parsed.raw;\n\n const save = () => {\n const next = parsed.ok\n ? applyFixtureFrontmatterState(markdown, draft, {\n inheritModel: isVerification && verificationModelMode === \"same\",\n })\n : applyFixtureFrontmatterRaw(markdown, rawDraft);\n onChange(next);\n onClose();\n };\n\n const sections =\n isVerification && verificationModelMode === \"same\"\n ? VERIFICATION_INHERIT_SECTIONS\n : isVerification\n ? VERIFICATION_MODEL_SECTIONS\n : DEFAULT_SECTIONS;\n const verificationModelSelector = isVerification ? (\n <div className=\"pb-density-3\">\n <SegmentedControl\n aria-label=\"Verification model\"\n value={verificationModelMode}\n options={VERIFICATION_MODEL_OPTIONS}\n onChange={(mode) =>\n setVerificationModelMode(mode as VerificationModelMode)\n }\n size=\"lg\"\n wrap\n className=\"w-full\"\n />\n </div>\n ) : undefined;\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n confirmClose={dirty}\n title=\"Fixture frontmatter\"\n size=\"2xl\"\n className=\"h-[92vh]\"\n footer={\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-xs text-muted-foreground\">\n {parsed.ok ? \"ai / env\" : \"YAML source\"}\n </span>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onClose}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={save}>\n <Icon icon={UiCheck} className=\"size-4\" />\n Save frontmatter\n </Button>\n </div>\n </div>\n }\n >\n {parsed.ok ? (\n <div className=\"min-h-0\">\n <SpecRuntimeEditor\n value={draft.runtime}\n onChange={(runtime) => setDraft((current) => ({ ...current, runtime }))}\n models={options?.models}\n families={options?.families}\n tools={options?.tools}\n permissionCatalog={options?.permissionCatalog}\n secretSelector={options?.secretSelector}\n cliOptions={options?.cliOptions}\n sections={sections}\n showHeader={false}\n {...(verificationModelSelector\n ? { beforeSections: verificationModelSelector }\n : {})}\n defaultCollapsedSections={\n isVerification ? COLLAPSED_VERIFICATION_SECTIONS : undefined\n }\n />\n </div>\n ) : (\n <div className=\"grid gap-3\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"status\" status=\"error\" size=\"xs\" clickToCopy={false}>\n YAML error\n </Badge>\n <span className=\"text-xs text-muted-foreground\">{parsed.error}</span>\n </div>\n <label className=\"grid gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1.5\">\n <Icon icon={UiFileCode} className=\"size-4\" />\n Frontmatter source\n </span>\n <textarea\n aria-label=\"Frontmatter source\"\n value={rawDraft}\n onChange={(event) => setRawDraft(event.currentTarget.value)}\n spellCheck={false}\n className=\"min-h-80 w-full resize-y rounded-md border border-input bg-background px-3 py-2 font-mono text-xs leading-5 text-foreground shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </label>\n </div>\n )}\n </Modal>\n );\n}\n\nfunction hasRuntimeModelOverride(value: FixtureFrontmatterState[\"runtime\"]) {\n return Boolean(\n value.model ||\n value.mode ||\n value.id ||\n value.effort ||\n value.temperature != null ||\n value.noCache ||\n value.budget,\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -3,23 +3,21 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const yaml = require("yaml");
|
|
4
4
|
const SpecRuntimeEditor_model = require("../ai/SpecRuntimeEditor.model.cjs");
|
|
5
5
|
const AI_RUNTIME_KEYS = /* @__PURE__ */ new Set([
|
|
6
|
-
"
|
|
6
|
+
"mode",
|
|
7
7
|
"budget",
|
|
8
8
|
"effort",
|
|
9
9
|
"id",
|
|
10
10
|
"model",
|
|
11
|
-
"mode",
|
|
12
11
|
"noCache",
|
|
13
12
|
"prompt",
|
|
14
13
|
"temperature"
|
|
15
14
|
]);
|
|
16
15
|
const AI_MODEL_KEYS = /* @__PURE__ */ new Set([
|
|
17
|
-
"
|
|
16
|
+
"mode",
|
|
18
17
|
"budget",
|
|
19
18
|
"effort",
|
|
20
19
|
"id",
|
|
21
20
|
"model",
|
|
22
|
-
"mode",
|
|
23
21
|
"noCache",
|
|
24
22
|
"temperature"
|
|
25
23
|
]);
|
|
@@ -107,10 +105,8 @@ function aiToRuntime(ai) {
|
|
|
107
105
|
const runtime = {};
|
|
108
106
|
const model = stringValue(ai.model);
|
|
109
107
|
if (model) runtime.model = model;
|
|
110
|
-
const
|
|
111
|
-
if (
|
|
112
|
-
const mode = stringValue(ai.mode);
|
|
113
|
-
if (mode) runtime.mode = mode;
|
|
108
|
+
const specMode = stringValue(ai.mode);
|
|
109
|
+
if (specMode) runtime.mode = specMode;
|
|
114
110
|
const id = stringValue(ai.id);
|
|
115
111
|
if (id) runtime.id = id;
|
|
116
112
|
const effort = stringValue(ai.effort);
|
|
@@ -223,7 +219,8 @@ ${body}`;
|
|
|
223
219
|
}
|
|
224
220
|
function splitMarkdownFrontmatter(markdown) {
|
|
225
221
|
const lines = splitLinesWithEndings(markdown);
|
|
226
|
-
if (stripLineEnding(lines[0] ?? "") !== "---")
|
|
222
|
+
if (stripLineEnding(lines[0] ?? "") !== "---")
|
|
223
|
+
return { hasFrontmatter: false };
|
|
227
224
|
for (let index = 1; index < lines.length; index += 1) {
|
|
228
225
|
const line = stripLineEnding(lines[index] ?? "");
|
|
229
226
|
if (line === "---" || line === "...") {
|
|
@@ -258,7 +255,8 @@ function parseYamlRecord(yaml$1) {
|
|
|
258
255
|
if (firstError) return { ok: false, error: firstError.message };
|
|
259
256
|
const value = doc.toJSON();
|
|
260
257
|
if (value == null) return { ok: true, value: {} };
|
|
261
|
-
if (!isRecord(value))
|
|
258
|
+
if (!isRecord(value))
|
|
259
|
+
return { ok: false, error: "Frontmatter root must be an object" };
|
|
262
260
|
return { ok: true, value };
|
|
263
261
|
}
|
|
264
262
|
function omitControlledAIKeys(ai) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixture-frontmatter.cjs","sources":["../../../src/data/FixtureEditor/fixture-frontmatter.ts"],"sourcesContent":["import { parseDocument, stringify } from \"yaml\";\nimport {\n compactAISpecRuntime,\n type AISpecRuntimeEnvVar,\n type AISpecRuntimeValue,\n} from \"../ai/SpecRuntimeEditor.model\";\n\nexport type FixtureAIExtras = {\n maxConcurrent?: number;\n cacheTTL?: string;\n};\n\nexport type FixtureFrontmatterState = {\n runtime: AISpecRuntimeValue;\n aiExtras: FixtureAIExtras;\n};\n\nexport type FixtureFrontmatterApplyOptions = {\n /** Omit model/runtime knobs so a verification fixture inherits its parent runtime. */\n inheritModel?: boolean | undefined;\n};\n\nexport type FixtureFrontmatterParseResult =\n | {\n ok: true;\n hasFrontmatter: boolean;\n frontmatter: Record<string, unknown>;\n raw: string;\n body: string;\n }\n | {\n ok: false;\n hasFrontmatter: true;\n error: string;\n raw: string;\n body: string;\n };\n\nconst AI_RUNTIME_KEYS = new Set([\n \"backend\",\n \"budget\",\n \"effort\",\n \"id\",\n \"model\",\n \"mode\",\n \"noCache\",\n \"prompt\",\n \"temperature\",\n]);\n\nconst AI_MODEL_KEYS = new Set([\n \"backend\",\n \"budget\",\n \"effort\",\n \"id\",\n \"model\",\n \"mode\",\n \"noCache\",\n \"temperature\",\n]);\n\nconst AI_EXTRA_KEYS = new Set([\"maxConcurrent\", \"cacheTTL\"]);\n\nexport function parseFixtureFrontmatter(\n markdown: string,\n): FixtureFrontmatterParseResult {\n const split = splitMarkdownFrontmatter(markdown);\n if (!split.hasFrontmatter) {\n return {\n ok: true,\n hasFrontmatter: false,\n frontmatter: {},\n raw: \"\",\n body: markdown,\n };\n }\n if (!split.closed) {\n return {\n ok: false,\n hasFrontmatter: true,\n error: \"Frontmatter closing delimiter not found\",\n raw: split.raw,\n body: split.body,\n };\n }\n\n const parsed = parseYamlRecord(split.raw);\n if (!parsed.ok) {\n return {\n ok: false,\n hasFrontmatter: true,\n error: parsed.error,\n raw: split.raw,\n body: split.body,\n };\n }\n\n return {\n ok: true,\n hasFrontmatter: true,\n frontmatter: parsed.value,\n raw: split.raw,\n body: split.body,\n };\n}\n\nexport function fixtureFrontmatterState(\n frontmatter: Record<string, unknown>,\n): FixtureFrontmatterState {\n const ai = recordValue(frontmatter.ai);\n const runtime = aiToRuntime(ai);\n const envVars = envToRuntimeEnvVars(frontmatter.env);\n if (envVars.length > 0) {\n runtime.setup = { ...runtime.setup, envVars };\n }\n const aiExtras = aiToExtras(ai);\n return { runtime, aiExtras };\n}\n\nexport function applyFixtureFrontmatterState(\n markdown: string,\n state: FixtureFrontmatterState,\n options: FixtureFrontmatterApplyOptions = {},\n): string {\n const parsed = parseFixtureFrontmatter(markdown);\n const body = parsed.body;\n const existing = parsed.ok ? parsed.frontmatter : {};\n const frontmatter = frontmatterFromState(existing, state, options);\n return serializeFixtureFrontmatter(frontmatter, body);\n}\n\nexport function applyFixtureFrontmatterRaw(\n markdown: string,\n raw: string,\n): string {\n const split = splitMarkdownFrontmatter(markdown);\n const body = split.hasFrontmatter ? split.body : markdown;\n if (raw.trim() === \"\") return body;\n const normalizedRaw = raw.endsWith(\"\\n\") ? raw : `${raw}\\n`;\n return `---\\n${normalizedRaw}---\\n${body}`;\n}\n\nexport function frontmatterFromState(\n existing: Record<string, unknown>,\n state: FixtureFrontmatterState,\n options: FixtureFrontmatterApplyOptions = {},\n): Record<string, unknown> {\n const next = omitKeys(existing, [\"ai\", \"env\"]);\n const currentAI = recordValue(existing.ai);\n const ai = {\n ...omitControlledAIKeys(currentAI),\n ...runtimeToAI(state.runtime, options),\n ...compactAIExtras(state.aiExtras),\n };\n const env = runtimeEnvVarsToEnv(state.runtime.setup?.envVars);\n\n if (hasKeys(ai)) next.ai = ai;\n if (hasKeys(env)) next.env = env;\n return next;\n}\n\nfunction aiToRuntime(ai: Record<string, unknown>): AISpecRuntimeValue {\n const runtime: AISpecRuntimeValue = {};\n const model = stringValue(ai.model);\n if (model) runtime.model = model;\n const backend = stringValue(ai.backend);\n if (backend) runtime.backend = backend;\n const mode = stringValue(ai.mode);\n if (mode) runtime.mode = mode;\n const id = stringValue(ai.id);\n if (id) runtime.id = id;\n const effort = stringValue(ai.effort);\n if (effort) runtime.effort = effort;\n const temperature = numberValue(ai.temperature);\n if (temperature != null) runtime.temperature = temperature;\n if (ai.noCache === true) runtime.noCache = true;\n\n const budget = recordValue(ai.budget);\n const maxTokens = numberValue(ai.maxTokens) ?? numberValue(budget.maxTokens);\n const cost = numberValue(budget.cost);\n const maxTurns = numberValue(budget.maxTurns);\n const timeout = stringValue(budget.timeout);\n if (maxTokens != null || cost != null || maxTurns != null || timeout) {\n runtime.budget = {\n ...(cost != null ? { cost } : {}),\n ...(maxTokens != null ? { maxTokens } : {}),\n ...(maxTurns != null ? { maxTurns } : {}),\n ...(timeout ? { timeout } : {}),\n };\n }\n\n const prompt = promptToRuntimePrompt(ai.prompt);\n if (prompt) runtime.prompt = prompt;\n\n return runtime;\n}\n\nfunction runtimeToAI(\n runtime: AISpecRuntimeValue,\n options: FixtureFrontmatterApplyOptions = {},\n): Record<string, unknown> {\n const compact = compactAISpecRuntime(runtime);\n const ai: Record<string, unknown> = {};\n for (const key of AI_RUNTIME_KEYS) {\n if (options.inheritModel && AI_MODEL_KEYS.has(key)) continue;\n const value = (compact as Record<string, unknown>)[key];\n if (value != null && (key !== \"budget\" || hasKeys(recordValue(value)))) {\n ai[key] = value;\n }\n }\n const maxTokens = compact.budget?.maxTokens;\n if (maxTokens != null && !options.inheritModel) {\n delete ai.budget;\n ai.maxTokens = maxTokens;\n }\n return ai;\n}\n\nfunction promptToRuntimePrompt(\n value: unknown,\n): AISpecRuntimeValue[\"prompt\"] | undefined {\n if (typeof value === \"string\") {\n const user = stringValue(value);\n return user ? { user } : undefined;\n }\n const prompt = recordValue(value);\n const user = stringValue(prompt.user);\n const system = stringValue(prompt.system);\n const appendSystem = stringValue(prompt.appendSystem);\n const source = stringValue(prompt.source);\n const metadata = recordStringMap(prompt.metadata);\n const out = {\n ...(user ? { user } : {}),\n ...(system ? { system } : {}),\n ...(appendSystem ? { appendSystem } : {}),\n ...(source ? { source } : {}),\n ...(metadata ? { metadata } : {}),\n };\n return hasKeys(out) ? out : undefined;\n}\n\nfunction aiToExtras(ai: Record<string, unknown>): FixtureAIExtras {\n const maxConcurrent = numberValue(ai.maxConcurrent);\n const cacheTTL = stringValue(ai.cacheTTL);\n return {\n ...(maxConcurrent != null ? { maxConcurrent } : {}),\n ...(cacheTTL ? { cacheTTL } : {}),\n };\n}\n\nfunction compactAIExtras(extras: FixtureAIExtras): Record<string, unknown> {\n return {\n ...(numberValue(extras.maxConcurrent) != null\n ? { maxConcurrent: numberValue(extras.maxConcurrent) }\n : {}),\n ...(stringValue(extras.cacheTTL) ? { cacheTTL: stringValue(extras.cacheTTL) } : {}),\n };\n}\n\nfunction envToRuntimeEnvVars(value: unknown): AISpecRuntimeEnvVar[] {\n if (!isRecord(value)) return [];\n const envVars: AISpecRuntimeEnvVar[] = [];\n for (const [name, envValue] of Object.entries(value)) {\n const key = name.trim();\n if (!key || typeof envValue !== \"string\") continue;\n envVars.push({ name: key, value: envValue });\n }\n return envVars;\n}\n\nfunction runtimeEnvVarsToEnv(\n value: AISpecRuntimeEnvVar[] | undefined,\n): Record<string, unknown> {\n const env: Record<string, unknown> = {};\n for (const item of value ?? []) {\n const name = stringValue(item.name);\n if (!name) continue;\n const literal = typeof item.value === \"string\" ? item.value : undefined;\n const valueFrom =\n typeof item.valueFrom === \"string\" ? item.valueFrom : undefined;\n if (literal != null) env[name] = literal;\n else if (valueFrom) env[name] = valueFrom;\n }\n return env;\n}\n\nfunction serializeFixtureFrontmatter(\n frontmatter: Record<string, unknown>,\n body: string,\n): string {\n if (!hasKeys(frontmatter)) return body;\n const yaml = stringify(frontmatter, {\n lineWidth: 0,\n collectionStyle: \"block\",\n });\n const normalizedYaml = yaml.endsWith(\"\\n\") ? yaml : `${yaml}\\n`;\n return `---\\n${normalizedYaml}---\\n${body}`;\n}\n\nfunction splitMarkdownFrontmatter(markdown: string):\n | { hasFrontmatter: false }\n | { hasFrontmatter: true; closed: boolean; raw: string; body: string } {\n const lines = splitLinesWithEndings(markdown);\n if (stripLineEnding(lines[0] ?? \"\") !== \"---\") return { hasFrontmatter: false };\n\n for (let index = 1; index < lines.length; index += 1) {\n const line = stripLineEnding(lines[index] ?? \"\");\n if (line === \"---\" || line === \"...\") {\n return {\n hasFrontmatter: true,\n closed: true,\n raw: lines.slice(1, index).join(\"\"),\n body: lines.slice(index + 1).join(\"\"),\n };\n }\n }\n\n return {\n hasFrontmatter: true,\n closed: false,\n raw: lines.slice(1).join(\"\"),\n body: \"\",\n };\n}\n\nfunction splitLinesWithEndings(text: string): string[] {\n if (text === \"\") return [];\n const lines = text.match(/[^\\n]*(?:\\n|$)/g) ?? [];\n if (lines.at(-1) === \"\") lines.pop();\n return lines;\n}\n\nfunction stripLineEnding(line: string): string {\n return line.replace(/\\r?\\n$/, \"\").trim();\n}\n\nfunction parseYamlRecord(\n yaml: string,\n): { ok: true; value: Record<string, unknown> } | { ok: false; error: string } {\n if (yaml.trim() === \"\") return { ok: true, value: {} };\n const doc = parseDocument(yaml, { prettyErrors: false });\n const firstError = doc.errors[0];\n if (firstError) return { ok: false, error: firstError.message };\n const value = doc.toJSON();\n if (value == null) return { ok: true, value: {} };\n if (!isRecord(value)) return { ok: false, error: \"Frontmatter root must be an object\" };\n return { ok: true, value };\n}\n\nfunction omitControlledAIKeys(ai: Record<string, unknown>): Record<string, unknown> {\n const omitted = new Set([...AI_RUNTIME_KEYS, ...AI_EXTRA_KEYS, \"maxTokens\"]);\n return omitKeys(ai, [...omitted]);\n}\n\nfunction omitKeys(\n value: Record<string, unknown>,\n keys: readonly string[],\n): Record<string, unknown> {\n const omitted = new Set(keys);\n return Object.fromEntries(\n Object.entries(value).filter(([key]) => !omitted.has(key)),\n );\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n\nfunction recordStringMap(value: unknown): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [rawKey, rawValue] of Object.entries(value)) {\n const key = rawKey.trim();\n if (!key || typeof rawValue !== \"string\") continue;\n out[key] = rawValue;\n }\n return hasKeys(out) ? out : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction hasKeys(value: Record<string, unknown>): boolean {\n return Object.keys(value).length > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value != null && !Array.isArray(value);\n}\n"],"names":["compactAISpecRuntime","user","yaml","stringify","parseDocument"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fixture-frontmatter.cjs","sources":["../../../src/data/FixtureEditor/fixture-frontmatter.ts"],"sourcesContent":["import { parseDocument, stringify } from \"yaml\";\nimport {\n compactAISpecRuntime,\n type AISpecRuntimeEnvVar,\n type AISpecRuntimeValue,\n} from \"../ai/SpecRuntimeEditor.model\";\n\nexport type FixtureAIExtras = {\n maxConcurrent?: number;\n cacheTTL?: string;\n};\n\nexport type FixtureFrontmatterState = {\n runtime: AISpecRuntimeValue;\n aiExtras: FixtureAIExtras;\n};\n\nexport type FixtureFrontmatterApplyOptions = {\n /** Omit model/runtime knobs so a verification fixture inherits its parent runtime. */\n inheritModel?: boolean | undefined;\n};\n\nexport type FixtureFrontmatterParseResult =\n | {\n ok: true;\n hasFrontmatter: boolean;\n frontmatter: Record<string, unknown>;\n raw: string;\n body: string;\n }\n | {\n ok: false;\n hasFrontmatter: true;\n error: string;\n raw: string;\n body: string;\n };\n\nconst AI_RUNTIME_KEYS = new Set([\n \"mode\",\n \"budget\",\n \"effort\",\n \"id\",\n \"model\",\n \"noCache\",\n \"prompt\",\n \"temperature\",\n]);\n\nconst AI_MODEL_KEYS = new Set([\n \"mode\",\n \"budget\",\n \"effort\",\n \"id\",\n \"model\",\n \"noCache\",\n \"temperature\",\n]);\n\nconst AI_EXTRA_KEYS = new Set([\"maxConcurrent\", \"cacheTTL\"]);\n\nexport function parseFixtureFrontmatter(\n markdown: string,\n): FixtureFrontmatterParseResult {\n const split = splitMarkdownFrontmatter(markdown);\n if (!split.hasFrontmatter) {\n return {\n ok: true,\n hasFrontmatter: false,\n frontmatter: {},\n raw: \"\",\n body: markdown,\n };\n }\n if (!split.closed) {\n return {\n ok: false,\n hasFrontmatter: true,\n error: \"Frontmatter closing delimiter not found\",\n raw: split.raw,\n body: split.body,\n };\n }\n\n const parsed = parseYamlRecord(split.raw);\n if (!parsed.ok) {\n return {\n ok: false,\n hasFrontmatter: true,\n error: parsed.error,\n raw: split.raw,\n body: split.body,\n };\n }\n\n return {\n ok: true,\n hasFrontmatter: true,\n frontmatter: parsed.value,\n raw: split.raw,\n body: split.body,\n };\n}\n\nexport function fixtureFrontmatterState(\n frontmatter: Record<string, unknown>,\n): FixtureFrontmatterState {\n const ai = recordValue(frontmatter.ai);\n const runtime = aiToRuntime(ai);\n const envVars = envToRuntimeEnvVars(frontmatter.env);\n if (envVars.length > 0) {\n runtime.setup = { ...runtime.setup, envVars };\n }\n const aiExtras = aiToExtras(ai);\n return { runtime, aiExtras };\n}\n\nexport function applyFixtureFrontmatterState(\n markdown: string,\n state: FixtureFrontmatterState,\n options: FixtureFrontmatterApplyOptions = {},\n): string {\n const parsed = parseFixtureFrontmatter(markdown);\n const body = parsed.body;\n const existing = parsed.ok ? parsed.frontmatter : {};\n const frontmatter = frontmatterFromState(existing, state, options);\n return serializeFixtureFrontmatter(frontmatter, body);\n}\n\nexport function applyFixtureFrontmatterRaw(\n markdown: string,\n raw: string,\n): string {\n const split = splitMarkdownFrontmatter(markdown);\n const body = split.hasFrontmatter ? split.body : markdown;\n if (raw.trim() === \"\") return body;\n const normalizedRaw = raw.endsWith(\"\\n\") ? raw : `${raw}\\n`;\n return `---\\n${normalizedRaw}---\\n${body}`;\n}\n\nexport function frontmatterFromState(\n existing: Record<string, unknown>,\n state: FixtureFrontmatterState,\n options: FixtureFrontmatterApplyOptions = {},\n): Record<string, unknown> {\n const next = omitKeys(existing, [\"ai\", \"env\"]);\n const currentAI = recordValue(existing.ai);\n const ai = {\n ...omitControlledAIKeys(currentAI),\n ...runtimeToAI(state.runtime, options),\n ...compactAIExtras(state.aiExtras),\n };\n const env = runtimeEnvVarsToEnv(state.runtime.setup?.envVars);\n\n if (hasKeys(ai)) next.ai = ai;\n if (hasKeys(env)) next.env = env;\n return next;\n}\n\nfunction aiToRuntime(ai: Record<string, unknown>): AISpecRuntimeValue {\n const runtime: AISpecRuntimeValue = {};\n const model = stringValue(ai.model);\n if (model) runtime.model = model;\n const specMode = stringValue(ai.mode);\n if (specMode) runtime.mode = specMode;\n const id = stringValue(ai.id);\n if (id) runtime.id = id;\n const effort = stringValue(ai.effort);\n if (effort) runtime.effort = effort;\n const temperature = numberValue(ai.temperature);\n if (temperature != null) runtime.temperature = temperature;\n if (ai.noCache === true) runtime.noCache = true;\n\n const budget = recordValue(ai.budget);\n const maxTokens = numberValue(ai.maxTokens) ?? numberValue(budget.maxTokens);\n const cost = numberValue(budget.cost);\n const maxTurns = numberValue(budget.maxTurns);\n const timeout = stringValue(budget.timeout);\n if (maxTokens != null || cost != null || maxTurns != null || timeout) {\n runtime.budget = {\n ...(cost != null ? { cost } : {}),\n ...(maxTokens != null ? { maxTokens } : {}),\n ...(maxTurns != null ? { maxTurns } : {}),\n ...(timeout ? { timeout } : {}),\n };\n }\n\n const prompt = promptToRuntimePrompt(ai.prompt);\n if (prompt) runtime.prompt = prompt;\n\n return runtime;\n}\n\nfunction runtimeToAI(\n runtime: AISpecRuntimeValue,\n options: FixtureFrontmatterApplyOptions = {},\n): Record<string, unknown> {\n const compact = compactAISpecRuntime(runtime);\n const ai: Record<string, unknown> = {};\n for (const key of AI_RUNTIME_KEYS) {\n if (options.inheritModel && AI_MODEL_KEYS.has(key)) continue;\n const value = (compact as Record<string, unknown>)[key];\n if (value != null && (key !== \"budget\" || hasKeys(recordValue(value)))) {\n ai[key] = value;\n }\n }\n const maxTokens = compact.budget?.maxTokens;\n if (maxTokens != null && !options.inheritModel) {\n delete ai.budget;\n ai.maxTokens = maxTokens;\n }\n return ai;\n}\n\nfunction promptToRuntimePrompt(\n value: unknown,\n): AISpecRuntimeValue[\"prompt\"] | undefined {\n if (typeof value === \"string\") {\n const user = stringValue(value);\n return user ? { user } : undefined;\n }\n const prompt = recordValue(value);\n const user = stringValue(prompt.user);\n const system = stringValue(prompt.system);\n const appendSystem = stringValue(prompt.appendSystem);\n const source = stringValue(prompt.source);\n const metadata = recordStringMap(prompt.metadata);\n const out = {\n ...(user ? { user } : {}),\n ...(system ? { system } : {}),\n ...(appendSystem ? { appendSystem } : {}),\n ...(source ? { source } : {}),\n ...(metadata ? { metadata } : {}),\n };\n return hasKeys(out) ? out : undefined;\n}\n\nfunction aiToExtras(ai: Record<string, unknown>): FixtureAIExtras {\n const maxConcurrent = numberValue(ai.maxConcurrent);\n const cacheTTL = stringValue(ai.cacheTTL);\n return {\n ...(maxConcurrent != null ? { maxConcurrent } : {}),\n ...(cacheTTL ? { cacheTTL } : {}),\n };\n}\n\nfunction compactAIExtras(extras: FixtureAIExtras): Record<string, unknown> {\n return {\n ...(numberValue(extras.maxConcurrent) != null\n ? { maxConcurrent: numberValue(extras.maxConcurrent) }\n : {}),\n ...(stringValue(extras.cacheTTL)\n ? { cacheTTL: stringValue(extras.cacheTTL) }\n : {}),\n };\n}\n\nfunction envToRuntimeEnvVars(value: unknown): AISpecRuntimeEnvVar[] {\n if (!isRecord(value)) return [];\n const envVars: AISpecRuntimeEnvVar[] = [];\n for (const [name, envValue] of Object.entries(value)) {\n const key = name.trim();\n if (!key || typeof envValue !== \"string\") continue;\n envVars.push({ name: key, value: envValue });\n }\n return envVars;\n}\n\nfunction runtimeEnvVarsToEnv(\n value: AISpecRuntimeEnvVar[] | undefined,\n): Record<string, unknown> {\n const env: Record<string, unknown> = {};\n for (const item of value ?? []) {\n const name = stringValue(item.name);\n if (!name) continue;\n const literal = typeof item.value === \"string\" ? item.value : undefined;\n const valueFrom =\n typeof item.valueFrom === \"string\" ? item.valueFrom : undefined;\n if (literal != null) env[name] = literal;\n else if (valueFrom) env[name] = valueFrom;\n }\n return env;\n}\n\nfunction serializeFixtureFrontmatter(\n frontmatter: Record<string, unknown>,\n body: string,\n): string {\n if (!hasKeys(frontmatter)) return body;\n const yaml = stringify(frontmatter, {\n lineWidth: 0,\n collectionStyle: \"block\",\n });\n const normalizedYaml = yaml.endsWith(\"\\n\") ? yaml : `${yaml}\\n`;\n return `---\\n${normalizedYaml}---\\n${body}`;\n}\n\nfunction splitMarkdownFrontmatter(\n markdown: string,\n):\n | { hasFrontmatter: false }\n | { hasFrontmatter: true; closed: boolean; raw: string; body: string } {\n const lines = splitLinesWithEndings(markdown);\n if (stripLineEnding(lines[0] ?? \"\") !== \"---\")\n return { hasFrontmatter: false };\n\n for (let index = 1; index < lines.length; index += 1) {\n const line = stripLineEnding(lines[index] ?? \"\");\n if (line === \"---\" || line === \"...\") {\n return {\n hasFrontmatter: true,\n closed: true,\n raw: lines.slice(1, index).join(\"\"),\n body: lines.slice(index + 1).join(\"\"),\n };\n }\n }\n\n return {\n hasFrontmatter: true,\n closed: false,\n raw: lines.slice(1).join(\"\"),\n body: \"\",\n };\n}\n\nfunction splitLinesWithEndings(text: string): string[] {\n if (text === \"\") return [];\n const lines = text.match(/[^\\n]*(?:\\n|$)/g) ?? [];\n if (lines.at(-1) === \"\") lines.pop();\n return lines;\n}\n\nfunction stripLineEnding(line: string): string {\n return line.replace(/\\r?\\n$/, \"\").trim();\n}\n\nfunction parseYamlRecord(\n yaml: string,\n): { ok: true; value: Record<string, unknown> } | { ok: false; error: string } {\n if (yaml.trim() === \"\") return { ok: true, value: {} };\n const doc = parseDocument(yaml, { prettyErrors: false });\n const firstError = doc.errors[0];\n if (firstError) return { ok: false, error: firstError.message };\n const value = doc.toJSON();\n if (value == null) return { ok: true, value: {} };\n if (!isRecord(value))\n return { ok: false, error: \"Frontmatter root must be an object\" };\n return { ok: true, value };\n}\n\nfunction omitControlledAIKeys(\n ai: Record<string, unknown>,\n): Record<string, unknown> {\n const omitted = new Set([...AI_RUNTIME_KEYS, ...AI_EXTRA_KEYS, \"maxTokens\"]);\n return omitKeys(ai, [...omitted]);\n}\n\nfunction omitKeys(\n value: Record<string, unknown>,\n keys: readonly string[],\n): Record<string, unknown> {\n const omitted = new Set(keys);\n return Object.fromEntries(\n Object.entries(value).filter(([key]) => !omitted.has(key)),\n );\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n\nfunction recordStringMap(value: unknown): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [rawKey, rawValue] of Object.entries(value)) {\n const key = rawKey.trim();\n if (!key || typeof rawValue !== \"string\") continue;\n out[key] = rawValue;\n }\n return hasKeys(out) ? out : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction hasKeys(value: Record<string, unknown>): boolean {\n return Object.keys(value).length > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value != null && !Array.isArray(value);\n}\n"],"names":["compactAISpecRuntime","user","yaml","stringify","parseDocument"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixture-frontmatter.d.ts","sourceRoot":"","sources":["../../../src/data/FixtureEditor/fixture-frontmatter.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,MAAM,eAAe,GAAG;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,QAAQ,EAAE,eAAe,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,sFAAsF;IACtF,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,6BAA6B,GACrC;IACE,EAAE,EAAE,IAAI,CAAC;IACT,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,cAAc,EAAE,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;
|
|
1
|
+
{"version":3,"file":"fixture-frontmatter.d.ts","sourceRoot":"","sources":["../../../src/data/FixtureEditor/fixture-frontmatter.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,MAAM,eAAe,GAAG;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,QAAQ,EAAE,eAAe,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,sFAAsF;IACtF,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,6BAA6B,GACrC;IACE,EAAE,EAAE,IAAI,CAAC;IACT,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,cAAc,EAAE,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAyBN,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,GACf,6BAA6B,CAuC/B;AAED,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,uBAAuB,CASzB;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,uBAAuB,EAC9B,OAAO,GAAE,8BAAmC,GAC3C,MAAM,CAMR;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,MAAM,CAMR;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,KAAK,EAAE,uBAAuB,EAC9B,OAAO,GAAE,8BAAmC,GAC3C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAazB"}
|
|
@@ -1,23 +1,21 @@
|
|
|
1
1
|
import { stringify, parseDocument } from "yaml";
|
|
2
2
|
import { compactAISpecRuntime } from "../ai/SpecRuntimeEditor.model.js";
|
|
3
3
|
const AI_RUNTIME_KEYS = /* @__PURE__ */ new Set([
|
|
4
|
-
"
|
|
4
|
+
"mode",
|
|
5
5
|
"budget",
|
|
6
6
|
"effort",
|
|
7
7
|
"id",
|
|
8
8
|
"model",
|
|
9
|
-
"mode",
|
|
10
9
|
"noCache",
|
|
11
10
|
"prompt",
|
|
12
11
|
"temperature"
|
|
13
12
|
]);
|
|
14
13
|
const AI_MODEL_KEYS = /* @__PURE__ */ new Set([
|
|
15
|
-
"
|
|
14
|
+
"mode",
|
|
16
15
|
"budget",
|
|
17
16
|
"effort",
|
|
18
17
|
"id",
|
|
19
18
|
"model",
|
|
20
|
-
"mode",
|
|
21
19
|
"noCache",
|
|
22
20
|
"temperature"
|
|
23
21
|
]);
|
|
@@ -105,10 +103,8 @@ function aiToRuntime(ai) {
|
|
|
105
103
|
const runtime = {};
|
|
106
104
|
const model = stringValue(ai.model);
|
|
107
105
|
if (model) runtime.model = model;
|
|
108
|
-
const
|
|
109
|
-
if (
|
|
110
|
-
const mode = stringValue(ai.mode);
|
|
111
|
-
if (mode) runtime.mode = mode;
|
|
106
|
+
const specMode = stringValue(ai.mode);
|
|
107
|
+
if (specMode) runtime.mode = specMode;
|
|
112
108
|
const id = stringValue(ai.id);
|
|
113
109
|
if (id) runtime.id = id;
|
|
114
110
|
const effort = stringValue(ai.effort);
|
|
@@ -221,7 +217,8 @@ ${body}`;
|
|
|
221
217
|
}
|
|
222
218
|
function splitMarkdownFrontmatter(markdown) {
|
|
223
219
|
const lines = splitLinesWithEndings(markdown);
|
|
224
|
-
if (stripLineEnding(lines[0] ?? "") !== "---")
|
|
220
|
+
if (stripLineEnding(lines[0] ?? "") !== "---")
|
|
221
|
+
return { hasFrontmatter: false };
|
|
225
222
|
for (let index = 1; index < lines.length; index += 1) {
|
|
226
223
|
const line = stripLineEnding(lines[index] ?? "");
|
|
227
224
|
if (line === "---" || line === "...") {
|
|
@@ -256,7 +253,8 @@ function parseYamlRecord(yaml) {
|
|
|
256
253
|
if (firstError) return { ok: false, error: firstError.message };
|
|
257
254
|
const value = doc.toJSON();
|
|
258
255
|
if (value == null) return { ok: true, value: {} };
|
|
259
|
-
if (!isRecord(value))
|
|
256
|
+
if (!isRecord(value))
|
|
257
|
+
return { ok: false, error: "Frontmatter root must be an object" };
|
|
260
258
|
return { ok: true, value };
|
|
261
259
|
}
|
|
262
260
|
function omitControlledAIKeys(ai) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixture-frontmatter.js","sources":["../../../src/data/FixtureEditor/fixture-frontmatter.ts"],"sourcesContent":["import { parseDocument, stringify } from \"yaml\";\nimport {\n compactAISpecRuntime,\n type AISpecRuntimeEnvVar,\n type AISpecRuntimeValue,\n} from \"../ai/SpecRuntimeEditor.model\";\n\nexport type FixtureAIExtras = {\n maxConcurrent?: number;\n cacheTTL?: string;\n};\n\nexport type FixtureFrontmatterState = {\n runtime: AISpecRuntimeValue;\n aiExtras: FixtureAIExtras;\n};\n\nexport type FixtureFrontmatterApplyOptions = {\n /** Omit model/runtime knobs so a verification fixture inherits its parent runtime. */\n inheritModel?: boolean | undefined;\n};\n\nexport type FixtureFrontmatterParseResult =\n | {\n ok: true;\n hasFrontmatter: boolean;\n frontmatter: Record<string, unknown>;\n raw: string;\n body: string;\n }\n | {\n ok: false;\n hasFrontmatter: true;\n error: string;\n raw: string;\n body: string;\n };\n\nconst AI_RUNTIME_KEYS = new Set([\n \"backend\",\n \"budget\",\n \"effort\",\n \"id\",\n \"model\",\n \"mode\",\n \"noCache\",\n \"prompt\",\n \"temperature\",\n]);\n\nconst AI_MODEL_KEYS = new Set([\n \"backend\",\n \"budget\",\n \"effort\",\n \"id\",\n \"model\",\n \"mode\",\n \"noCache\",\n \"temperature\",\n]);\n\nconst AI_EXTRA_KEYS = new Set([\"maxConcurrent\", \"cacheTTL\"]);\n\nexport function parseFixtureFrontmatter(\n markdown: string,\n): FixtureFrontmatterParseResult {\n const split = splitMarkdownFrontmatter(markdown);\n if (!split.hasFrontmatter) {\n return {\n ok: true,\n hasFrontmatter: false,\n frontmatter: {},\n raw: \"\",\n body: markdown,\n };\n }\n if (!split.closed) {\n return {\n ok: false,\n hasFrontmatter: true,\n error: \"Frontmatter closing delimiter not found\",\n raw: split.raw,\n body: split.body,\n };\n }\n\n const parsed = parseYamlRecord(split.raw);\n if (!parsed.ok) {\n return {\n ok: false,\n hasFrontmatter: true,\n error: parsed.error,\n raw: split.raw,\n body: split.body,\n };\n }\n\n return {\n ok: true,\n hasFrontmatter: true,\n frontmatter: parsed.value,\n raw: split.raw,\n body: split.body,\n };\n}\n\nexport function fixtureFrontmatterState(\n frontmatter: Record<string, unknown>,\n): FixtureFrontmatterState {\n const ai = recordValue(frontmatter.ai);\n const runtime = aiToRuntime(ai);\n const envVars = envToRuntimeEnvVars(frontmatter.env);\n if (envVars.length > 0) {\n runtime.setup = { ...runtime.setup, envVars };\n }\n const aiExtras = aiToExtras(ai);\n return { runtime, aiExtras };\n}\n\nexport function applyFixtureFrontmatterState(\n markdown: string,\n state: FixtureFrontmatterState,\n options: FixtureFrontmatterApplyOptions = {},\n): string {\n const parsed = parseFixtureFrontmatter(markdown);\n const body = parsed.body;\n const existing = parsed.ok ? parsed.frontmatter : {};\n const frontmatter = frontmatterFromState(existing, state, options);\n return serializeFixtureFrontmatter(frontmatter, body);\n}\n\nexport function applyFixtureFrontmatterRaw(\n markdown: string,\n raw: string,\n): string {\n const split = splitMarkdownFrontmatter(markdown);\n const body = split.hasFrontmatter ? split.body : markdown;\n if (raw.trim() === \"\") return body;\n const normalizedRaw = raw.endsWith(\"\\n\") ? raw : `${raw}\\n`;\n return `---\\n${normalizedRaw}---\\n${body}`;\n}\n\nexport function frontmatterFromState(\n existing: Record<string, unknown>,\n state: FixtureFrontmatterState,\n options: FixtureFrontmatterApplyOptions = {},\n): Record<string, unknown> {\n const next = omitKeys(existing, [\"ai\", \"env\"]);\n const currentAI = recordValue(existing.ai);\n const ai = {\n ...omitControlledAIKeys(currentAI),\n ...runtimeToAI(state.runtime, options),\n ...compactAIExtras(state.aiExtras),\n };\n const env = runtimeEnvVarsToEnv(state.runtime.setup?.envVars);\n\n if (hasKeys(ai)) next.ai = ai;\n if (hasKeys(env)) next.env = env;\n return next;\n}\n\nfunction aiToRuntime(ai: Record<string, unknown>): AISpecRuntimeValue {\n const runtime: AISpecRuntimeValue = {};\n const model = stringValue(ai.model);\n if (model) runtime.model = model;\n const backend = stringValue(ai.backend);\n if (backend) runtime.backend = backend;\n const mode = stringValue(ai.mode);\n if (mode) runtime.mode = mode;\n const id = stringValue(ai.id);\n if (id) runtime.id = id;\n const effort = stringValue(ai.effort);\n if (effort) runtime.effort = effort;\n const temperature = numberValue(ai.temperature);\n if (temperature != null) runtime.temperature = temperature;\n if (ai.noCache === true) runtime.noCache = true;\n\n const budget = recordValue(ai.budget);\n const maxTokens = numberValue(ai.maxTokens) ?? numberValue(budget.maxTokens);\n const cost = numberValue(budget.cost);\n const maxTurns = numberValue(budget.maxTurns);\n const timeout = stringValue(budget.timeout);\n if (maxTokens != null || cost != null || maxTurns != null || timeout) {\n runtime.budget = {\n ...(cost != null ? { cost } : {}),\n ...(maxTokens != null ? { maxTokens } : {}),\n ...(maxTurns != null ? { maxTurns } : {}),\n ...(timeout ? { timeout } : {}),\n };\n }\n\n const prompt = promptToRuntimePrompt(ai.prompt);\n if (prompt) runtime.prompt = prompt;\n\n return runtime;\n}\n\nfunction runtimeToAI(\n runtime: AISpecRuntimeValue,\n options: FixtureFrontmatterApplyOptions = {},\n): Record<string, unknown> {\n const compact = compactAISpecRuntime(runtime);\n const ai: Record<string, unknown> = {};\n for (const key of AI_RUNTIME_KEYS) {\n if (options.inheritModel && AI_MODEL_KEYS.has(key)) continue;\n const value = (compact as Record<string, unknown>)[key];\n if (value != null && (key !== \"budget\" || hasKeys(recordValue(value)))) {\n ai[key] = value;\n }\n }\n const maxTokens = compact.budget?.maxTokens;\n if (maxTokens != null && !options.inheritModel) {\n delete ai.budget;\n ai.maxTokens = maxTokens;\n }\n return ai;\n}\n\nfunction promptToRuntimePrompt(\n value: unknown,\n): AISpecRuntimeValue[\"prompt\"] | undefined {\n if (typeof value === \"string\") {\n const user = stringValue(value);\n return user ? { user } : undefined;\n }\n const prompt = recordValue(value);\n const user = stringValue(prompt.user);\n const system = stringValue(prompt.system);\n const appendSystem = stringValue(prompt.appendSystem);\n const source = stringValue(prompt.source);\n const metadata = recordStringMap(prompt.metadata);\n const out = {\n ...(user ? { user } : {}),\n ...(system ? { system } : {}),\n ...(appendSystem ? { appendSystem } : {}),\n ...(source ? { source } : {}),\n ...(metadata ? { metadata } : {}),\n };\n return hasKeys(out) ? out : undefined;\n}\n\nfunction aiToExtras(ai: Record<string, unknown>): FixtureAIExtras {\n const maxConcurrent = numberValue(ai.maxConcurrent);\n const cacheTTL = stringValue(ai.cacheTTL);\n return {\n ...(maxConcurrent != null ? { maxConcurrent } : {}),\n ...(cacheTTL ? { cacheTTL } : {}),\n };\n}\n\nfunction compactAIExtras(extras: FixtureAIExtras): Record<string, unknown> {\n return {\n ...(numberValue(extras.maxConcurrent) != null\n ? { maxConcurrent: numberValue(extras.maxConcurrent) }\n : {}),\n ...(stringValue(extras.cacheTTL) ? { cacheTTL: stringValue(extras.cacheTTL) } : {}),\n };\n}\n\nfunction envToRuntimeEnvVars(value: unknown): AISpecRuntimeEnvVar[] {\n if (!isRecord(value)) return [];\n const envVars: AISpecRuntimeEnvVar[] = [];\n for (const [name, envValue] of Object.entries(value)) {\n const key = name.trim();\n if (!key || typeof envValue !== \"string\") continue;\n envVars.push({ name: key, value: envValue });\n }\n return envVars;\n}\n\nfunction runtimeEnvVarsToEnv(\n value: AISpecRuntimeEnvVar[] | undefined,\n): Record<string, unknown> {\n const env: Record<string, unknown> = {};\n for (const item of value ?? []) {\n const name = stringValue(item.name);\n if (!name) continue;\n const literal = typeof item.value === \"string\" ? item.value : undefined;\n const valueFrom =\n typeof item.valueFrom === \"string\" ? item.valueFrom : undefined;\n if (literal != null) env[name] = literal;\n else if (valueFrom) env[name] = valueFrom;\n }\n return env;\n}\n\nfunction serializeFixtureFrontmatter(\n frontmatter: Record<string, unknown>,\n body: string,\n): string {\n if (!hasKeys(frontmatter)) return body;\n const yaml = stringify(frontmatter, {\n lineWidth: 0,\n collectionStyle: \"block\",\n });\n const normalizedYaml = yaml.endsWith(\"\\n\") ? yaml : `${yaml}\\n`;\n return `---\\n${normalizedYaml}---\\n${body}`;\n}\n\nfunction splitMarkdownFrontmatter(markdown: string):\n | { hasFrontmatter: false }\n | { hasFrontmatter: true; closed: boolean; raw: string; body: string } {\n const lines = splitLinesWithEndings(markdown);\n if (stripLineEnding(lines[0] ?? \"\") !== \"---\") return { hasFrontmatter: false };\n\n for (let index = 1; index < lines.length; index += 1) {\n const line = stripLineEnding(lines[index] ?? \"\");\n if (line === \"---\" || line === \"...\") {\n return {\n hasFrontmatter: true,\n closed: true,\n raw: lines.slice(1, index).join(\"\"),\n body: lines.slice(index + 1).join(\"\"),\n };\n }\n }\n\n return {\n hasFrontmatter: true,\n closed: false,\n raw: lines.slice(1).join(\"\"),\n body: \"\",\n };\n}\n\nfunction splitLinesWithEndings(text: string): string[] {\n if (text === \"\") return [];\n const lines = text.match(/[^\\n]*(?:\\n|$)/g) ?? [];\n if (lines.at(-1) === \"\") lines.pop();\n return lines;\n}\n\nfunction stripLineEnding(line: string): string {\n return line.replace(/\\r?\\n$/, \"\").trim();\n}\n\nfunction parseYamlRecord(\n yaml: string,\n): { ok: true; value: Record<string, unknown> } | { ok: false; error: string } {\n if (yaml.trim() === \"\") return { ok: true, value: {} };\n const doc = parseDocument(yaml, { prettyErrors: false });\n const firstError = doc.errors[0];\n if (firstError) return { ok: false, error: firstError.message };\n const value = doc.toJSON();\n if (value == null) return { ok: true, value: {} };\n if (!isRecord(value)) return { ok: false, error: \"Frontmatter root must be an object\" };\n return { ok: true, value };\n}\n\nfunction omitControlledAIKeys(ai: Record<string, unknown>): Record<string, unknown> {\n const omitted = new Set([...AI_RUNTIME_KEYS, ...AI_EXTRA_KEYS, \"maxTokens\"]);\n return omitKeys(ai, [...omitted]);\n}\n\nfunction omitKeys(\n value: Record<string, unknown>,\n keys: readonly string[],\n): Record<string, unknown> {\n const omitted = new Set(keys);\n return Object.fromEntries(\n Object.entries(value).filter(([key]) => !omitted.has(key)),\n );\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n\nfunction recordStringMap(value: unknown): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [rawKey, rawValue] of Object.entries(value)) {\n const key = rawKey.trim();\n if (!key || typeof rawValue !== \"string\") continue;\n out[key] = rawValue;\n }\n return hasKeys(out) ? out : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction hasKeys(value: Record<string, unknown>): boolean {\n return Object.keys(value).length > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value != null && !Array.isArray(value);\n}\n"],"names":["user"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fixture-frontmatter.js","sources":["../../../src/data/FixtureEditor/fixture-frontmatter.ts"],"sourcesContent":["import { parseDocument, stringify } from \"yaml\";\nimport {\n compactAISpecRuntime,\n type AISpecRuntimeEnvVar,\n type AISpecRuntimeValue,\n} from \"../ai/SpecRuntimeEditor.model\";\n\nexport type FixtureAIExtras = {\n maxConcurrent?: number;\n cacheTTL?: string;\n};\n\nexport type FixtureFrontmatterState = {\n runtime: AISpecRuntimeValue;\n aiExtras: FixtureAIExtras;\n};\n\nexport type FixtureFrontmatterApplyOptions = {\n /** Omit model/runtime knobs so a verification fixture inherits its parent runtime. */\n inheritModel?: boolean | undefined;\n};\n\nexport type FixtureFrontmatterParseResult =\n | {\n ok: true;\n hasFrontmatter: boolean;\n frontmatter: Record<string, unknown>;\n raw: string;\n body: string;\n }\n | {\n ok: false;\n hasFrontmatter: true;\n error: string;\n raw: string;\n body: string;\n };\n\nconst AI_RUNTIME_KEYS = new Set([\n \"mode\",\n \"budget\",\n \"effort\",\n \"id\",\n \"model\",\n \"noCache\",\n \"prompt\",\n \"temperature\",\n]);\n\nconst AI_MODEL_KEYS = new Set([\n \"mode\",\n \"budget\",\n \"effort\",\n \"id\",\n \"model\",\n \"noCache\",\n \"temperature\",\n]);\n\nconst AI_EXTRA_KEYS = new Set([\"maxConcurrent\", \"cacheTTL\"]);\n\nexport function parseFixtureFrontmatter(\n markdown: string,\n): FixtureFrontmatterParseResult {\n const split = splitMarkdownFrontmatter(markdown);\n if (!split.hasFrontmatter) {\n return {\n ok: true,\n hasFrontmatter: false,\n frontmatter: {},\n raw: \"\",\n body: markdown,\n };\n }\n if (!split.closed) {\n return {\n ok: false,\n hasFrontmatter: true,\n error: \"Frontmatter closing delimiter not found\",\n raw: split.raw,\n body: split.body,\n };\n }\n\n const parsed = parseYamlRecord(split.raw);\n if (!parsed.ok) {\n return {\n ok: false,\n hasFrontmatter: true,\n error: parsed.error,\n raw: split.raw,\n body: split.body,\n };\n }\n\n return {\n ok: true,\n hasFrontmatter: true,\n frontmatter: parsed.value,\n raw: split.raw,\n body: split.body,\n };\n}\n\nexport function fixtureFrontmatterState(\n frontmatter: Record<string, unknown>,\n): FixtureFrontmatterState {\n const ai = recordValue(frontmatter.ai);\n const runtime = aiToRuntime(ai);\n const envVars = envToRuntimeEnvVars(frontmatter.env);\n if (envVars.length > 0) {\n runtime.setup = { ...runtime.setup, envVars };\n }\n const aiExtras = aiToExtras(ai);\n return { runtime, aiExtras };\n}\n\nexport function applyFixtureFrontmatterState(\n markdown: string,\n state: FixtureFrontmatterState,\n options: FixtureFrontmatterApplyOptions = {},\n): string {\n const parsed = parseFixtureFrontmatter(markdown);\n const body = parsed.body;\n const existing = parsed.ok ? parsed.frontmatter : {};\n const frontmatter = frontmatterFromState(existing, state, options);\n return serializeFixtureFrontmatter(frontmatter, body);\n}\n\nexport function applyFixtureFrontmatterRaw(\n markdown: string,\n raw: string,\n): string {\n const split = splitMarkdownFrontmatter(markdown);\n const body = split.hasFrontmatter ? split.body : markdown;\n if (raw.trim() === \"\") return body;\n const normalizedRaw = raw.endsWith(\"\\n\") ? raw : `${raw}\\n`;\n return `---\\n${normalizedRaw}---\\n${body}`;\n}\n\nexport function frontmatterFromState(\n existing: Record<string, unknown>,\n state: FixtureFrontmatterState,\n options: FixtureFrontmatterApplyOptions = {},\n): Record<string, unknown> {\n const next = omitKeys(existing, [\"ai\", \"env\"]);\n const currentAI = recordValue(existing.ai);\n const ai = {\n ...omitControlledAIKeys(currentAI),\n ...runtimeToAI(state.runtime, options),\n ...compactAIExtras(state.aiExtras),\n };\n const env = runtimeEnvVarsToEnv(state.runtime.setup?.envVars);\n\n if (hasKeys(ai)) next.ai = ai;\n if (hasKeys(env)) next.env = env;\n return next;\n}\n\nfunction aiToRuntime(ai: Record<string, unknown>): AISpecRuntimeValue {\n const runtime: AISpecRuntimeValue = {};\n const model = stringValue(ai.model);\n if (model) runtime.model = model;\n const specMode = stringValue(ai.mode);\n if (specMode) runtime.mode = specMode;\n const id = stringValue(ai.id);\n if (id) runtime.id = id;\n const effort = stringValue(ai.effort);\n if (effort) runtime.effort = effort;\n const temperature = numberValue(ai.temperature);\n if (temperature != null) runtime.temperature = temperature;\n if (ai.noCache === true) runtime.noCache = true;\n\n const budget = recordValue(ai.budget);\n const maxTokens = numberValue(ai.maxTokens) ?? numberValue(budget.maxTokens);\n const cost = numberValue(budget.cost);\n const maxTurns = numberValue(budget.maxTurns);\n const timeout = stringValue(budget.timeout);\n if (maxTokens != null || cost != null || maxTurns != null || timeout) {\n runtime.budget = {\n ...(cost != null ? { cost } : {}),\n ...(maxTokens != null ? { maxTokens } : {}),\n ...(maxTurns != null ? { maxTurns } : {}),\n ...(timeout ? { timeout } : {}),\n };\n }\n\n const prompt = promptToRuntimePrompt(ai.prompt);\n if (prompt) runtime.prompt = prompt;\n\n return runtime;\n}\n\nfunction runtimeToAI(\n runtime: AISpecRuntimeValue,\n options: FixtureFrontmatterApplyOptions = {},\n): Record<string, unknown> {\n const compact = compactAISpecRuntime(runtime);\n const ai: Record<string, unknown> = {};\n for (const key of AI_RUNTIME_KEYS) {\n if (options.inheritModel && AI_MODEL_KEYS.has(key)) continue;\n const value = (compact as Record<string, unknown>)[key];\n if (value != null && (key !== \"budget\" || hasKeys(recordValue(value)))) {\n ai[key] = value;\n }\n }\n const maxTokens = compact.budget?.maxTokens;\n if (maxTokens != null && !options.inheritModel) {\n delete ai.budget;\n ai.maxTokens = maxTokens;\n }\n return ai;\n}\n\nfunction promptToRuntimePrompt(\n value: unknown,\n): AISpecRuntimeValue[\"prompt\"] | undefined {\n if (typeof value === \"string\") {\n const user = stringValue(value);\n return user ? { user } : undefined;\n }\n const prompt = recordValue(value);\n const user = stringValue(prompt.user);\n const system = stringValue(prompt.system);\n const appendSystem = stringValue(prompt.appendSystem);\n const source = stringValue(prompt.source);\n const metadata = recordStringMap(prompt.metadata);\n const out = {\n ...(user ? { user } : {}),\n ...(system ? { system } : {}),\n ...(appendSystem ? { appendSystem } : {}),\n ...(source ? { source } : {}),\n ...(metadata ? { metadata } : {}),\n };\n return hasKeys(out) ? out : undefined;\n}\n\nfunction aiToExtras(ai: Record<string, unknown>): FixtureAIExtras {\n const maxConcurrent = numberValue(ai.maxConcurrent);\n const cacheTTL = stringValue(ai.cacheTTL);\n return {\n ...(maxConcurrent != null ? { maxConcurrent } : {}),\n ...(cacheTTL ? { cacheTTL } : {}),\n };\n}\n\nfunction compactAIExtras(extras: FixtureAIExtras): Record<string, unknown> {\n return {\n ...(numberValue(extras.maxConcurrent) != null\n ? { maxConcurrent: numberValue(extras.maxConcurrent) }\n : {}),\n ...(stringValue(extras.cacheTTL)\n ? { cacheTTL: stringValue(extras.cacheTTL) }\n : {}),\n };\n}\n\nfunction envToRuntimeEnvVars(value: unknown): AISpecRuntimeEnvVar[] {\n if (!isRecord(value)) return [];\n const envVars: AISpecRuntimeEnvVar[] = [];\n for (const [name, envValue] of Object.entries(value)) {\n const key = name.trim();\n if (!key || typeof envValue !== \"string\") continue;\n envVars.push({ name: key, value: envValue });\n }\n return envVars;\n}\n\nfunction runtimeEnvVarsToEnv(\n value: AISpecRuntimeEnvVar[] | undefined,\n): Record<string, unknown> {\n const env: Record<string, unknown> = {};\n for (const item of value ?? []) {\n const name = stringValue(item.name);\n if (!name) continue;\n const literal = typeof item.value === \"string\" ? item.value : undefined;\n const valueFrom =\n typeof item.valueFrom === \"string\" ? item.valueFrom : undefined;\n if (literal != null) env[name] = literal;\n else if (valueFrom) env[name] = valueFrom;\n }\n return env;\n}\n\nfunction serializeFixtureFrontmatter(\n frontmatter: Record<string, unknown>,\n body: string,\n): string {\n if (!hasKeys(frontmatter)) return body;\n const yaml = stringify(frontmatter, {\n lineWidth: 0,\n collectionStyle: \"block\",\n });\n const normalizedYaml = yaml.endsWith(\"\\n\") ? yaml : `${yaml}\\n`;\n return `---\\n${normalizedYaml}---\\n${body}`;\n}\n\nfunction splitMarkdownFrontmatter(\n markdown: string,\n):\n | { hasFrontmatter: false }\n | { hasFrontmatter: true; closed: boolean; raw: string; body: string } {\n const lines = splitLinesWithEndings(markdown);\n if (stripLineEnding(lines[0] ?? \"\") !== \"---\")\n return { hasFrontmatter: false };\n\n for (let index = 1; index < lines.length; index += 1) {\n const line = stripLineEnding(lines[index] ?? \"\");\n if (line === \"---\" || line === \"...\") {\n return {\n hasFrontmatter: true,\n closed: true,\n raw: lines.slice(1, index).join(\"\"),\n body: lines.slice(index + 1).join(\"\"),\n };\n }\n }\n\n return {\n hasFrontmatter: true,\n closed: false,\n raw: lines.slice(1).join(\"\"),\n body: \"\",\n };\n}\n\nfunction splitLinesWithEndings(text: string): string[] {\n if (text === \"\") return [];\n const lines = text.match(/[^\\n]*(?:\\n|$)/g) ?? [];\n if (lines.at(-1) === \"\") lines.pop();\n return lines;\n}\n\nfunction stripLineEnding(line: string): string {\n return line.replace(/\\r?\\n$/, \"\").trim();\n}\n\nfunction parseYamlRecord(\n yaml: string,\n): { ok: true; value: Record<string, unknown> } | { ok: false; error: string } {\n if (yaml.trim() === \"\") return { ok: true, value: {} };\n const doc = parseDocument(yaml, { prettyErrors: false });\n const firstError = doc.errors[0];\n if (firstError) return { ok: false, error: firstError.message };\n const value = doc.toJSON();\n if (value == null) return { ok: true, value: {} };\n if (!isRecord(value))\n return { ok: false, error: \"Frontmatter root must be an object\" };\n return { ok: true, value };\n}\n\nfunction omitControlledAIKeys(\n ai: Record<string, unknown>,\n): Record<string, unknown> {\n const omitted = new Set([...AI_RUNTIME_KEYS, ...AI_EXTRA_KEYS, \"maxTokens\"]);\n return omitKeys(ai, [...omitted]);\n}\n\nfunction omitKeys(\n value: Record<string, unknown>,\n keys: readonly string[],\n): Record<string, unknown> {\n const omitted = new Set(keys);\n return Object.fromEntries(\n Object.entries(value).filter(([key]) => !omitted.has(key)),\n );\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n\nfunction recordStringMap(value: unknown): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [rawKey, rawValue] of Object.entries(value)) {\n const key = rawKey.trim();\n if (!key || typeof rawValue !== \"string\") continue;\n out[key] = rawValue;\n }\n return hasKeys(out) ? out : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction hasKeys(value: Record<string, unknown>): boolean {\n return Object.keys(value).length > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value != null && !Array.isArray(value);\n}\n"],"names":["user"],"mappings":"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"}
|