@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
|
@@ -39,8 +39,8 @@ export type ContextMeterProps = {
|
|
|
39
39
|
providerSessionId?: string | undefined;
|
|
40
40
|
threadId?: string | undefined;
|
|
41
41
|
turnId?: string | undefined;
|
|
42
|
-
/**
|
|
43
|
-
|
|
42
|
+
/** Provider family that produced the terminal chat turn: anthropic, openai, … */
|
|
43
|
+
provider?: string | undefined;
|
|
44
44
|
/** Runtime mechanism used to execute the session, such as api or cmux. */
|
|
45
45
|
executionMode?: string | undefined;
|
|
46
46
|
/** Model id/label and its brand glyph. */
|
|
@@ -61,5 +61,5 @@ export type ContextMeterProps = {
|
|
|
61
61
|
* runtime and copyable identities, context-window breakdown, per-bucket token
|
|
62
62
|
* usage and the cost + budget detail. Domain-agnostic — callers feed plain
|
|
63
63
|
* values. */
|
|
64
|
-
export declare function ContextMeter({ mode, usedPercent, usedTokens, windowTokens, messageCount, sessionId, captainSessionId, providerSessionId, threadId, turnId,
|
|
64
|
+
export declare function ContextMeter({ mode, usedPercent, usedTokens, windowTokens, messageCount, sessionId, captainSessionId, providerSessionId, threadId, turnId, provider, executionMode, model, modelIcon: Glyph, modelIconClassName, effort, tokens, cost, budget, className, }: ContextMeterProps): import("react/jsx-runtime").JSX.Element;
|
|
65
65
|
//# sourceMappingURL=ContextMeter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMeter.d.ts","sourceRoot":"","sources":["../../../src/data/chat/ContextMeter.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAQ,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAQzD,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,OAAO,CAAC;AAE/C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B;4DACwD;IACxD,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,
|
|
1
|
+
{"version":3,"file":"ContextMeter.d.ts","sourceRoot":"","sources":["../../../src/data/chat/ContextMeter.tsx"],"names":[],"mappings":"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"}
|
|
@@ -81,7 +81,7 @@ function ContextMeter({
|
|
|
81
81
|
providerSessionId,
|
|
82
82
|
threadId,
|
|
83
83
|
turnId,
|
|
84
|
-
|
|
84
|
+
provider,
|
|
85
85
|
executionMode,
|
|
86
86
|
model,
|
|
87
87
|
modelIcon: Glyph,
|
|
@@ -286,7 +286,7 @@ function ContextMeter({
|
|
|
286
286
|
}
|
|
287
287
|
) : null
|
|
288
288
|
] }),
|
|
289
|
-
(identities.length > 0 ||
|
|
289
|
+
(identities.length > 0 || provider || executionMode) && /* @__PURE__ */ jsxs("div", { className: "space-y-1.5 border-b border-border pb-2", children: [
|
|
290
290
|
identities.map((identity) => {
|
|
291
291
|
const copyStatus = (copyResult == null ? void 0 : copyResult.identity) === identity.key && copyResult.value === identity.value ? copyResult.status : void 0;
|
|
292
292
|
return /* @__PURE__ */ jsxs(
|
|
@@ -323,7 +323,7 @@ function ContextMeter({
|
|
|
323
323
|
identity.key
|
|
324
324
|
);
|
|
325
325
|
}),
|
|
326
|
-
|
|
326
|
+
provider ? /* @__PURE__ */ jsx(Row, { label: "Provider", value: provider }) : null,
|
|
327
327
|
executionMode ? /* @__PURE__ */ jsx(Row, { label: "Mode", value: executionMode }) : null
|
|
328
328
|
] }),
|
|
329
329
|
/* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMeter.js","sources":["../../../src/data/chat/ContextMeter.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { compactTokens, formatCost } from \"../../lib/tokens\";\nimport { UiCheck, UiCopy } from \"../../icons\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport { HoverCard } from \"../../overlay/HoverCard\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"./effort-icons\";\n\nexport type ContextMeterMode = \"bar\" | \"gauge\";\n\nexport type ContextMeterTokens = {\n input?: number | undefined;\n output?: number | undefined;\n reasoning?: number | undefined;\n cacheRead?: number | undefined;\n cacheWrite?: number | undefined;\n total?: number | undefined;\n};\n\nexport type ContextMeterCost = {\n input?: number | undefined;\n output?: number | undefined;\n reasoning?: number | undefined;\n cacheRead?: number | undefined;\n cacheWrite?: number | undefined;\n total?: number | undefined;\n};\n\nexport type ContextMeterBudget = {\n used?: number | undefined;\n total?: number | undefined;\n remaining?: number | undefined;\n};\n\nexport type ContextMeterProps = {\n /** Trigger shape: a compact `bar` (session header) or a circular `gauge`\n * (chat toolbar). Both open the same hover popover. */\n mode?: ContextMeterMode;\n /** Share of the context window used, 0–100 — drives the fill and tone. */\n usedPercent: number;\n /** Context-window tokens shown in the popover. */\n usedTokens?: number | undefined;\n windowTokens?: number | undefined;\n /** Message count shown in the popover (chat). */\n messageCount?: number | undefined;\n /** Session identifier exposed as a click-to-copy value in the popover. */\n sessionId?: string | undefined;\n /** Terminal chat identities, kept distinct from the generic session id. */\n captainSessionId?: string | undefined;\n providerSessionId?: string | undefined;\n threadId?: string | undefined;\n turnId?: string | undefined;\n /** Resolved backend that produced the terminal chat turn. */\n backend?: string | undefined;\n /** Runtime mechanism used to execute the session, such as api or cmux. */\n executionMode?: string | undefined;\n /** Model id/label and its brand glyph. */\n model?: string | undefined;\n modelIcon?: StaticIconComponent | undefined;\n modelIconClassName?: string | undefined;\n /** Reasoning effort shown with its semantic glyph and color in the hover card. */\n effort?: string | undefined;\n /** Per-bucket token counts for the popover breakdown. */\n tokens?: ContextMeterTokens | undefined;\n /** Per-bucket costs (USD) for the popover breakdown. */\n cost?: ContextMeterCost | undefined;\n budget?: ContextMeterBudget | undefined;\n className?: string | undefined;\n};\n\nconst COPY_STATUS_RESET_MS = 2000;\nconst GAUGE_RADIUS = 15;\nconst GAUGE_CIRCUMFERENCE = 2 * Math.PI * GAUGE_RADIUS;\n\nfunction barTone(pct: number): string {\n return pct > 80\n ? \"bg-red-600 [[data-theme=dark]_&]:bg-red-400\"\n : pct > 50\n ? \"bg-amber-700 [[data-theme=dark]_&]:bg-amber-400\"\n : \"bg-emerald-600 [[data-theme=dark]_&]:bg-emerald-400\";\n}\n\nfunction ringTone(pct: number): string {\n return pct > 80\n ? \"text-red-600 [[data-theme=dark]_&]:text-red-400\"\n : pct > 50\n ? \"text-amber-700 [[data-theme=dark]_&]:text-amber-400\"\n : \"text-emerald-600 [[data-theme=dark]_&]:text-emerald-400\";\n}\n\nfunction textTone(pct: number): string {\n return pct > 80\n ? \"text-red-700 [[data-theme=dark]_&]:text-red-400\"\n : pct > 50\n ? \"text-amber-700 [[data-theme=dark]_&]:text-amber-400\"\n : \"text-emerald-700 [[data-theme=dark]_&]:text-emerald-400\";\n}\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex justify-between gap-4\">\n <span className=\"text-muted-foreground\">{label}</span>\n <span className=\"font-medium tabular-nums\">{value}</span>\n </div>\n );\n}\n\nfunction anyPositive(...values: (number | undefined)[]): boolean {\n return values.some((v) => v != null && v > 0);\n}\n\ntype BucketRow = {\n label: string;\n tokens?: number | undefined;\n cost?: number | undefined;\n};\n\ntype CopyableIdentity = {\n key: string;\n label: string;\n value: string;\n};\n\n/** One row per token/cost bucket, kept only when it carries a token or cost\n * value. Cache stays split into read and write on both axes. */\nfunction bucketRows(\n tokens?: ContextMeterTokens,\n cost?: ContextMeterCost,\n): BucketRow[] {\n const rows: BucketRow[] = [\n { label: \"Input\", tokens: tokens?.input, cost: cost?.input },\n { label: \"Output\", tokens: tokens?.output, cost: cost?.output },\n { label: \"Reasoning\", tokens: tokens?.reasoning, cost: cost?.reasoning },\n { label: \"Cache read\", tokens: tokens?.cacheRead, cost: cost?.cacheRead },\n {\n label: \"Cache write\",\n tokens: tokens?.cacheWrite,\n cost: cost?.cacheWrite,\n },\n ];\n return rows.filter((row) => (row.tokens ?? 0) > 0 || (row.cost ?? 0) > 0);\n}\n\nfunction UsageTable({\n rows,\n totalTokens,\n totalCost,\n showTokens,\n showCost,\n}: {\n rows: BucketRow[];\n totalTokens: number;\n totalCost: number;\n showTokens: boolean;\n showCost: boolean;\n}) {\n const numCell = \"px-1 py-0.5 text-right tabular-nums\";\n return (\n <table className=\"w-full border-collapse\">\n <thead>\n <tr className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">\n <th className=\"px-1 py-0.5 text-left font-medium\" />\n {showTokens && (\n <th className=\"px-1 py-0.5 text-right font-medium\">Tokens</th>\n )}\n {showCost && (\n <th className=\"px-1 py-0.5 text-right font-medium\">Cost</th>\n )}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.label}>\n <td className=\"px-1 py-0.5 text-left text-muted-foreground\">\n {row.label}\n </td>\n {showTokens && (\n <td className={numCell}>\n {row.tokens ? (\n compactTokens(row.tokens)\n ) : (\n <span className=\"text-muted-foreground/50\">—</span>\n )}\n </td>\n )}\n {showCost && (\n <td className={numCell}>\n {row.cost ? (\n formatCost(row.cost)\n ) : (\n <span className=\"text-muted-foreground/50\">—</span>\n )}\n </td>\n )}\n </tr>\n ))}\n <tr className=\"border-t border-border font-medium\">\n <td className=\"px-1 py-0.5 text-left\">Total</td>\n {showTokens && (\n <td className={numCell}>{compactTokens(totalTokens)}</td>\n )}\n {showCost && <td className={numCell}>{formatCost(totalCost)}</td>}\n </tr>\n </tbody>\n </table>\n );\n}\n\n/** Unified context-window meter. Renders as a compact progress `bar` or a\n * circular `gauge`; hovering or focusing it opens a popover with the model, the\n * runtime and copyable identities, context-window breakdown, per-bucket token\n * usage and the cost + budget detail. Domain-agnostic — callers feed plain\n * values. */\nexport function ContextMeter({\n mode = \"bar\",\n usedPercent,\n usedTokens,\n windowTokens,\n messageCount,\n sessionId,\n captainSessionId,\n providerSessionId,\n threadId,\n turnId,\n backend,\n executionMode,\n model,\n modelIcon: Glyph,\n modelIconClassName,\n effort,\n tokens,\n cost,\n budget,\n className,\n}: ContextMeterProps) {\n const [copyResult, setCopyResult] = useState<\n {\n identity: string;\n value: string;\n status: \"copied\" | \"failed\";\n } | undefined\n >();\n const copyResetTimer = useRef<number | undefined>(undefined);\n useEffect(\n () => () => {\n if (copyResetTimer.current !== undefined) {\n window.clearTimeout(copyResetTimer.current);\n }\n },\n [],\n );\n const pct = Math.min(100, Math.max(0, Math.round(usedPercent)));\n const totalTokens = tokens?.total ?? 0;\n const totalCost = cost?.total ?? 0;\n const EffortGlyph = effort ? effortLevelIcon(effort) : undefined;\n const effortColor = effort ? effortLevelColor(effort) : undefined;\n const identities = [\n sessionId ? { key: \"session\", label: \"Session\", value: sessionId } : undefined,\n captainSessionId\n ? {\n key: \"captain-session\",\n label: \"Captain session\",\n value: captainSessionId,\n }\n : undefined,\n providerSessionId\n ? {\n key: \"provider-session\",\n label: \"Provider session\",\n value: providerSessionId,\n }\n : undefined,\n threadId ? { key: \"thread\", label: \"Thread\", value: threadId } : undefined,\n turnId ? { key: \"turn\", label: \"Turn\", value: turnId } : undefined,\n ].filter((identity): identity is CopyableIdentity => identity !== undefined);\n // The status is transient feedback for the click that produced it — without\n // this it would greet every later hover of the same identity.\n const copyIdentity = async (identity: CopyableIdentity) => {\n if (copyResetTimer.current !== undefined) {\n window.clearTimeout(copyResetTimer.current);\n }\n try {\n await navigator.clipboard.writeText(identity.value);\n setCopyResult({\n identity: identity.key,\n value: identity.value,\n status: \"copied\",\n });\n } catch {\n setCopyResult({\n identity: identity.key,\n value: identity.value,\n status: \"failed\",\n });\n }\n copyResetTimer.current = window.setTimeout(\n () => setCopyResult(undefined),\n COPY_STATUS_RESET_MS,\n );\n };\n\n const trigger =\n mode === \"gauge\" ? (\n <span\n className={cn(\n \"inline-flex items-center rounded-md px-2.5 py-1.5 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\",\n className,\n )}\n aria-label={`Context ${pct}% used`}\n >\n <span className=\"relative inline-flex size-9 shrink-0 items-center justify-center\">\n <svg\n data-context-gauge-ring\n aria-hidden=\"true\"\n width=\"36\"\n height=\"36\"\n viewBox=\"0 0 36 36\"\n className={cn(\"absolute inset-0\", ringTone(pct))}\n >\n <circle\n cx=\"18\"\n cy=\"18\"\n r={GAUGE_RADIUS}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n opacity=\"0.15\"\n />\n <circle\n cx=\"18\"\n cy=\"18\"\n r={GAUGE_RADIUS}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeDasharray={GAUGE_CIRCUMFERENCE}\n strokeDashoffset={(1 - pct / 100) * GAUGE_CIRCUMFERENCE}\n strokeLinecap=\"round\"\n transform=\"rotate(-90 18 18)\"\n />\n </svg>\n {Glyph ? (\n <Icon\n icon={Glyph}\n className={cn(\"relative size-5\", modelIconClassName)}\n />\n ) : (\n <span\n className={cn(\n \"relative text-[9px] font-semibold tabular-nums\",\n textTone(pct),\n )}\n >\n {pct}\n </span>\n )}\n </span>\n </span>\n ) : (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded border border-border px-1.5 py-0.5 text-[11px] text-muted-foreground\",\n className,\n )}\n aria-label={`Context ${pct}% used`}\n >\n <span className=\"shrink-0\">ctx</span>\n <span className=\"h-1.5 w-16 overflow-hidden rounded-full bg-muted\">\n <span\n className={cn(\n \"block h-full rounded-full transition-all\",\n barTone(pct),\n )}\n style={{ width: `${pct}%` }}\n />\n </span>\n <span\n className={cn(\"shrink-0 font-medium tabular-nums\", textTone(pct))}\n >\n {pct}%\n </span>\n </span>\n );\n\n return (\n <HoverCard\n trigger={trigger}\n placement=\"bottom\"\n delay={200}\n cardClassName=\"w-72 p-3\"\n >\n <div className=\"space-y-2.5 text-xs\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"font-semibold\">Context usage</span>\n <span className={cn(\"font-semibold tabular-nums\", textTone(pct))}>\n {pct}%\n </span>\n </div>\n\n {(model || effort) && (\n <div className=\"flex items-center justify-between gap-3 border-b border-border pb-2\">\n {model ? (\n <div className=\"flex min-w-0 items-center gap-2\">\n {Glyph && (\n <Icon\n icon={Glyph}\n className={cn(\"size-4 shrink-0\", modelIconClassName)}\n />\n )}\n <span className=\"truncate font-medium\" title={model}>\n {model}\n </span>\n </div>\n ) : null}\n {effort ? (\n <span\n className={cn(\n \"inline-flex shrink-0 items-center gap-1 font-medium\",\n effortColor,\n )}\n >\n {EffortGlyph ? <EffortGlyph className=\"size-3.5\" /> : null}\n {effortLevelLabel(effort)} effort\n </span>\n ) : null}\n </div>\n )}\n\n {(identities.length > 0 || backend || executionMode) && (\n <div className=\"space-y-1.5 border-b border-border pb-2\">\n {identities.map((identity) => {\n const copyStatus =\n copyResult?.identity === identity.key &&\n copyResult.value === identity.value\n ? copyResult.status\n : undefined;\n return (\n <div\n key={identity.key}\n className=\"flex items-center justify-between gap-4\"\n >\n <span className=\"text-muted-foreground\">\n {identity.label}\n </span>\n <button\n type=\"button\"\n aria-label={\n copyStatus === \"copied\"\n ? `${identity.label} ID copied`\n : copyStatus === \"failed\"\n ? `${identity.label} ID copy failed`\n : `Copy ${identity.label.toLowerCase()} ID`\n }\n title={identity.value}\n className={cn(\n \"flex min-w-0 max-w-48 items-center gap-1.5 font-medium hover:text-foreground\",\n copyStatus === \"failed\" && \"text-destructive\",\n )}\n onClick={() => void copyIdentity(identity)}\n >\n <span className=\"truncate font-mono\">\n {identity.value}\n </span>\n <Icon\n icon={copyStatus === \"copied\" ? UiCheck : UiCopy}\n className=\"size-3.5 shrink-0\"\n />\n </button>\n </div>\n );\n })}\n {backend ? <Row label=\"Backend\" value={backend} /> : null}\n {executionMode ? <Row label=\"Mode\" value={executionMode} /> : null}\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <div className=\"h-1.5 overflow-hidden rounded-full bg-muted\">\n <div\n className={cn(\"h-full rounded-full\", barTone(pct))}\n style={{ width: `${pct}%` }}\n />\n </div>\n {windowTokens ? (\n <>\n <Row\n label=\"Window\"\n value={`${compactTokens(usedTokens ?? 0)} / ${compactTokens(windowTokens)}`}\n />\n <Row label=\"Free\" value={`${100 - pct}%`} />\n </>\n ) : (\n <Row label=\"Used\" value={`${pct}%`} />\n )}\n {messageCount != null ? (\n <Row label=\"Messages\" value={String(messageCount)} />\n ) : null}\n </div>\n\n {(totalTokens > 0 || totalCost > 0 || budget) && (\n <div className=\"space-y-1.5 border-t border-border pt-2\">\n {(totalTokens > 0 || totalCost > 0) && (\n <UsageTable\n rows={bucketRows(tokens, cost)}\n totalTokens={totalTokens}\n totalCost={totalCost}\n showTokens={totalTokens > 0}\n showCost={totalCost > 0}\n />\n )}\n {budget?.total != null && budget.total > 0 ? (\n <Row\n label=\"Budget\"\n value={`${formatCost(budget.used ?? 0)} / ${formatCost(budget.total)}`}\n />\n ) : budget?.remaining != null ? (\n <Row label=\"Budget left\" value={formatCost(budget.remaining)} />\n ) : anyPositive(budget?.used) ? (\n <Row label=\"Budget\" value={formatCost(budget?.used ?? 0)} />\n ) : null}\n </div>\n )}\n </div>\n </HoverCard>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ContextMeter.js","sources":["../../../src/data/chat/ContextMeter.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { compactTokens, formatCost } from \"../../lib/tokens\";\nimport { UiCheck, UiCopy } from \"../../icons\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport { HoverCard } from \"../../overlay/HoverCard\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"./effort-icons\";\n\nexport type ContextMeterMode = \"bar\" | \"gauge\";\n\nexport type ContextMeterTokens = {\n input?: number | undefined;\n output?: number | undefined;\n reasoning?: number | undefined;\n cacheRead?: number | undefined;\n cacheWrite?: number | undefined;\n total?: number | undefined;\n};\n\nexport type ContextMeterCost = {\n input?: number | undefined;\n output?: number | undefined;\n reasoning?: number | undefined;\n cacheRead?: number | undefined;\n cacheWrite?: number | undefined;\n total?: number | undefined;\n};\n\nexport type ContextMeterBudget = {\n used?: number | undefined;\n total?: number | undefined;\n remaining?: number | undefined;\n};\n\nexport type ContextMeterProps = {\n /** Trigger shape: a compact `bar` (session header) or a circular `gauge`\n * (chat toolbar). Both open the same hover popover. */\n mode?: ContextMeterMode;\n /** Share of the context window used, 0–100 — drives the fill and tone. */\n usedPercent: number;\n /** Context-window tokens shown in the popover. */\n usedTokens?: number | undefined;\n windowTokens?: number | undefined;\n /** Message count shown in the popover (chat). */\n messageCount?: number | undefined;\n /** Session identifier exposed as a click-to-copy value in the popover. */\n sessionId?: string | undefined;\n /** Terminal chat identities, kept distinct from the generic session id. */\n captainSessionId?: string | undefined;\n providerSessionId?: string | undefined;\n threadId?: string | undefined;\n turnId?: string | undefined;\n /** Provider family that produced the terminal chat turn: anthropic, openai, … */\n provider?: string | undefined;\n /** Runtime mechanism used to execute the session, such as api or cmux. */\n executionMode?: string | undefined;\n /** Model id/label and its brand glyph. */\n model?: string | undefined;\n modelIcon?: StaticIconComponent | undefined;\n modelIconClassName?: string | undefined;\n /** Reasoning effort shown with its semantic glyph and color in the hover card. */\n effort?: string | undefined;\n /** Per-bucket token counts for the popover breakdown. */\n tokens?: ContextMeterTokens | undefined;\n /** Per-bucket costs (USD) for the popover breakdown. */\n cost?: ContextMeterCost | undefined;\n budget?: ContextMeterBudget | undefined;\n className?: string | undefined;\n};\n\nconst COPY_STATUS_RESET_MS = 2000;\nconst GAUGE_RADIUS = 15;\nconst GAUGE_CIRCUMFERENCE = 2 * Math.PI * GAUGE_RADIUS;\n\nfunction barTone(pct: number): string {\n return pct > 80\n ? \"bg-red-600 [[data-theme=dark]_&]:bg-red-400\"\n : pct > 50\n ? \"bg-amber-700 [[data-theme=dark]_&]:bg-amber-400\"\n : \"bg-emerald-600 [[data-theme=dark]_&]:bg-emerald-400\";\n}\n\nfunction ringTone(pct: number): string {\n return pct > 80\n ? \"text-red-600 [[data-theme=dark]_&]:text-red-400\"\n : pct > 50\n ? \"text-amber-700 [[data-theme=dark]_&]:text-amber-400\"\n : \"text-emerald-600 [[data-theme=dark]_&]:text-emerald-400\";\n}\n\nfunction textTone(pct: number): string {\n return pct > 80\n ? \"text-red-700 [[data-theme=dark]_&]:text-red-400\"\n : pct > 50\n ? \"text-amber-700 [[data-theme=dark]_&]:text-amber-400\"\n : \"text-emerald-700 [[data-theme=dark]_&]:text-emerald-400\";\n}\n\nfunction Row({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex justify-between gap-4\">\n <span className=\"text-muted-foreground\">{label}</span>\n <span className=\"font-medium tabular-nums\">{value}</span>\n </div>\n );\n}\n\nfunction anyPositive(...values: (number | undefined)[]): boolean {\n return values.some((v) => v != null && v > 0);\n}\n\ntype BucketRow = {\n label: string;\n tokens?: number | undefined;\n cost?: number | undefined;\n};\n\ntype CopyableIdentity = {\n key: string;\n label: string;\n value: string;\n};\n\n/** One row per token/cost bucket, kept only when it carries a token or cost\n * value. Cache stays split into read and write on both axes. */\nfunction bucketRows(\n tokens?: ContextMeterTokens,\n cost?: ContextMeterCost,\n): BucketRow[] {\n const rows: BucketRow[] = [\n { label: \"Input\", tokens: tokens?.input, cost: cost?.input },\n { label: \"Output\", tokens: tokens?.output, cost: cost?.output },\n { label: \"Reasoning\", tokens: tokens?.reasoning, cost: cost?.reasoning },\n { label: \"Cache read\", tokens: tokens?.cacheRead, cost: cost?.cacheRead },\n {\n label: \"Cache write\",\n tokens: tokens?.cacheWrite,\n cost: cost?.cacheWrite,\n },\n ];\n return rows.filter((row) => (row.tokens ?? 0) > 0 || (row.cost ?? 0) > 0);\n}\n\nfunction UsageTable({\n rows,\n totalTokens,\n totalCost,\n showTokens,\n showCost,\n}: {\n rows: BucketRow[];\n totalTokens: number;\n totalCost: number;\n showTokens: boolean;\n showCost: boolean;\n}) {\n const numCell = \"px-1 py-0.5 text-right tabular-nums\";\n return (\n <table className=\"w-full border-collapse\">\n <thead>\n <tr className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">\n <th className=\"px-1 py-0.5 text-left font-medium\" />\n {showTokens && (\n <th className=\"px-1 py-0.5 text-right font-medium\">Tokens</th>\n )}\n {showCost && (\n <th className=\"px-1 py-0.5 text-right font-medium\">Cost</th>\n )}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.label}>\n <td className=\"px-1 py-0.5 text-left text-muted-foreground\">\n {row.label}\n </td>\n {showTokens && (\n <td className={numCell}>\n {row.tokens ? (\n compactTokens(row.tokens)\n ) : (\n <span className=\"text-muted-foreground/50\">—</span>\n )}\n </td>\n )}\n {showCost && (\n <td className={numCell}>\n {row.cost ? (\n formatCost(row.cost)\n ) : (\n <span className=\"text-muted-foreground/50\">—</span>\n )}\n </td>\n )}\n </tr>\n ))}\n <tr className=\"border-t border-border font-medium\">\n <td className=\"px-1 py-0.5 text-left\">Total</td>\n {showTokens && (\n <td className={numCell}>{compactTokens(totalTokens)}</td>\n )}\n {showCost && <td className={numCell}>{formatCost(totalCost)}</td>}\n </tr>\n </tbody>\n </table>\n );\n}\n\n/** Unified context-window meter. Renders as a compact progress `bar` or a\n * circular `gauge`; hovering or focusing it opens a popover with the model, the\n * runtime and copyable identities, context-window breakdown, per-bucket token\n * usage and the cost + budget detail. Domain-agnostic — callers feed plain\n * values. */\nexport function ContextMeter({\n mode = \"bar\",\n usedPercent,\n usedTokens,\n windowTokens,\n messageCount,\n sessionId,\n captainSessionId,\n providerSessionId,\n threadId,\n turnId,\n provider,\n executionMode,\n model,\n modelIcon: Glyph,\n modelIconClassName,\n effort,\n tokens,\n cost,\n budget,\n className,\n}: ContextMeterProps) {\n const [copyResult, setCopyResult] = useState<\n {\n identity: string;\n value: string;\n status: \"copied\" | \"failed\";\n } | undefined\n >();\n const copyResetTimer = useRef<number | undefined>(undefined);\n useEffect(\n () => () => {\n if (copyResetTimer.current !== undefined) {\n window.clearTimeout(copyResetTimer.current);\n }\n },\n [],\n );\n const pct = Math.min(100, Math.max(0, Math.round(usedPercent)));\n const totalTokens = tokens?.total ?? 0;\n const totalCost = cost?.total ?? 0;\n const EffortGlyph = effort ? effortLevelIcon(effort) : undefined;\n const effortColor = effort ? effortLevelColor(effort) : undefined;\n const identities = [\n sessionId ? { key: \"session\", label: \"Session\", value: sessionId } : undefined,\n captainSessionId\n ? {\n key: \"captain-session\",\n label: \"Captain session\",\n value: captainSessionId,\n }\n : undefined,\n providerSessionId\n ? {\n key: \"provider-session\",\n label: \"Provider session\",\n value: providerSessionId,\n }\n : undefined,\n threadId ? { key: \"thread\", label: \"Thread\", value: threadId } : undefined,\n turnId ? { key: \"turn\", label: \"Turn\", value: turnId } : undefined,\n ].filter((identity): identity is CopyableIdentity => identity !== undefined);\n // The status is transient feedback for the click that produced it — without\n // this it would greet every later hover of the same identity.\n const copyIdentity = async (identity: CopyableIdentity) => {\n if (copyResetTimer.current !== undefined) {\n window.clearTimeout(copyResetTimer.current);\n }\n try {\n await navigator.clipboard.writeText(identity.value);\n setCopyResult({\n identity: identity.key,\n value: identity.value,\n status: \"copied\",\n });\n } catch {\n setCopyResult({\n identity: identity.key,\n value: identity.value,\n status: \"failed\",\n });\n }\n copyResetTimer.current = window.setTimeout(\n () => setCopyResult(undefined),\n COPY_STATUS_RESET_MS,\n );\n };\n\n const trigger =\n mode === \"gauge\" ? (\n <span\n className={cn(\n \"inline-flex items-center rounded-md px-2.5 py-1.5 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\",\n className,\n )}\n aria-label={`Context ${pct}% used`}\n >\n <span className=\"relative inline-flex size-9 shrink-0 items-center justify-center\">\n <svg\n data-context-gauge-ring\n aria-hidden=\"true\"\n width=\"36\"\n height=\"36\"\n viewBox=\"0 0 36 36\"\n className={cn(\"absolute inset-0\", ringTone(pct))}\n >\n <circle\n cx=\"18\"\n cy=\"18\"\n r={GAUGE_RADIUS}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n opacity=\"0.15\"\n />\n <circle\n cx=\"18\"\n cy=\"18\"\n r={GAUGE_RADIUS}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeDasharray={GAUGE_CIRCUMFERENCE}\n strokeDashoffset={(1 - pct / 100) * GAUGE_CIRCUMFERENCE}\n strokeLinecap=\"round\"\n transform=\"rotate(-90 18 18)\"\n />\n </svg>\n {Glyph ? (\n <Icon\n icon={Glyph}\n className={cn(\"relative size-5\", modelIconClassName)}\n />\n ) : (\n <span\n className={cn(\n \"relative text-[9px] font-semibold tabular-nums\",\n textTone(pct),\n )}\n >\n {pct}\n </span>\n )}\n </span>\n </span>\n ) : (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded border border-border px-1.5 py-0.5 text-[11px] text-muted-foreground\",\n className,\n )}\n aria-label={`Context ${pct}% used`}\n >\n <span className=\"shrink-0\">ctx</span>\n <span className=\"h-1.5 w-16 overflow-hidden rounded-full bg-muted\">\n <span\n className={cn(\n \"block h-full rounded-full transition-all\",\n barTone(pct),\n )}\n style={{ width: `${pct}%` }}\n />\n </span>\n <span\n className={cn(\"shrink-0 font-medium tabular-nums\", textTone(pct))}\n >\n {pct}%\n </span>\n </span>\n );\n\n return (\n <HoverCard\n trigger={trigger}\n placement=\"bottom\"\n delay={200}\n cardClassName=\"w-72 p-3\"\n >\n <div className=\"space-y-2.5 text-xs\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"font-semibold\">Context usage</span>\n <span className={cn(\"font-semibold tabular-nums\", textTone(pct))}>\n {pct}%\n </span>\n </div>\n\n {(model || effort) && (\n <div className=\"flex items-center justify-between gap-3 border-b border-border pb-2\">\n {model ? (\n <div className=\"flex min-w-0 items-center gap-2\">\n {Glyph && (\n <Icon\n icon={Glyph}\n className={cn(\"size-4 shrink-0\", modelIconClassName)}\n />\n )}\n <span className=\"truncate font-medium\" title={model}>\n {model}\n </span>\n </div>\n ) : null}\n {effort ? (\n <span\n className={cn(\n \"inline-flex shrink-0 items-center gap-1 font-medium\",\n effortColor,\n )}\n >\n {EffortGlyph ? <EffortGlyph className=\"size-3.5\" /> : null}\n {effortLevelLabel(effort)} effort\n </span>\n ) : null}\n </div>\n )}\n\n {(identities.length > 0 || provider || executionMode) && (\n <div className=\"space-y-1.5 border-b border-border pb-2\">\n {identities.map((identity) => {\n const copyStatus =\n copyResult?.identity === identity.key &&\n copyResult.value === identity.value\n ? copyResult.status\n : undefined;\n return (\n <div\n key={identity.key}\n className=\"flex items-center justify-between gap-4\"\n >\n <span className=\"text-muted-foreground\">\n {identity.label}\n </span>\n <button\n type=\"button\"\n aria-label={\n copyStatus === \"copied\"\n ? `${identity.label} ID copied`\n : copyStatus === \"failed\"\n ? `${identity.label} ID copy failed`\n : `Copy ${identity.label.toLowerCase()} ID`\n }\n title={identity.value}\n className={cn(\n \"flex min-w-0 max-w-48 items-center gap-1.5 font-medium hover:text-foreground\",\n copyStatus === \"failed\" && \"text-destructive\",\n )}\n onClick={() => void copyIdentity(identity)}\n >\n <span className=\"truncate font-mono\">\n {identity.value}\n </span>\n <Icon\n icon={copyStatus === \"copied\" ? UiCheck : UiCopy}\n className=\"size-3.5 shrink-0\"\n />\n </button>\n </div>\n );\n })}\n {provider ? <Row label=\"Provider\" value={provider} /> : null}\n {executionMode ? <Row label=\"Mode\" value={executionMode} /> : null}\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <div className=\"h-1.5 overflow-hidden rounded-full bg-muted\">\n <div\n className={cn(\"h-full rounded-full\", barTone(pct))}\n style={{ width: `${pct}%` }}\n />\n </div>\n {windowTokens ? (\n <>\n <Row\n label=\"Window\"\n value={`${compactTokens(usedTokens ?? 0)} / ${compactTokens(windowTokens)}`}\n />\n <Row label=\"Free\" value={`${100 - pct}%`} />\n </>\n ) : (\n <Row label=\"Used\" value={`${pct}%`} />\n )}\n {messageCount != null ? (\n <Row label=\"Messages\" value={String(messageCount)} />\n ) : null}\n </div>\n\n {(totalTokens > 0 || totalCost > 0 || budget) && (\n <div className=\"space-y-1.5 border-t border-border pt-2\">\n {(totalTokens > 0 || totalCost > 0) && (\n <UsageTable\n rows={bucketRows(tokens, cost)}\n totalTokens={totalTokens}\n totalCost={totalCost}\n showTokens={totalTokens > 0}\n showCost={totalCost > 0}\n />\n )}\n {budget?.total != null && budget.total > 0 ? (\n <Row\n label=\"Budget\"\n value={`${formatCost(budget.used ?? 0)} / ${formatCost(budget.total)}`}\n />\n ) : budget?.remaining != null ? (\n <Row label=\"Budget left\" value={formatCost(budget.remaining)} />\n ) : anyPositive(budget?.used) ? (\n <Row label=\"Budget\" value={formatCost(budget?.used ?? 0)} />\n ) : null}\n </div>\n )}\n </div>\n </HoverCard>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval.cjs","sources":["../../../src/data/chat/approval.ts"],"sourcesContent":["import type { UIMessage } from \"ai\";\nimport type { ChatModelRuntime } from \"./types\";\n\nexport type CaptainChatSession = {\n id: string;\n revision?: number;\n messages: UIMessage[];\n providerSessionId?: string;\n runtime?: ChatModelRuntime;\n forkedFrom?: string;\n};\n\nexport type ToolApprovalDecision = {\n sessionsApi: string;\n sessionId: string;\n approvalId: string;\n approved: boolean;\n reason?: string;\n};\n\ntype SessionFetch = (\n input: RequestInfo | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport async function getChatSession(\n sessionsApi: string,\n sessionId: string,\n fetcher: SessionFetch = fetch,\n): Promise<CaptainChatSession> {\n if (!sessionId.trim()) {\n throw new Error(\"A session id is required to load this chat.\");\n }\n const response = await fetcher(sessionEndpoint(sessionsApi, sessionId), {\n headers: { Accept: \"application/json\" },\n });\n if (!response.ok) {\n throw await responseError(\"Chat session request\", response);\n }\n return parseSession(await response.json());\n}\n\nexport async function forkChatSession(\n sessionsApi: string,\n sessionId: string,\n fetcher: SessionFetch = fetch,\n): Promise<CaptainChatSession> {\n if (!sessionId.trim()) {\n throw new Error(\"A session id is required to fork this chat.\");\n }\n const response = await fetcher(\n `${sessionEndpoint(sessionsApi, sessionId)}/fork`,\n {\n method: \"POST\",\n headers: { Accept: \"application/json\" },\n },\n );\n if (!response.ok) {\n throw await responseError(\"Fork chat session\", response);\n }\n return parseSession(await response.json());\n}\n\nexport async function postToolApproval(\n decision: ToolApprovalDecision,\n fetcher: SessionFetch = fetch,\n): Promise<CaptainChatSession> {\n if (!decision.sessionId.trim()) {\n throw new Error(\"A session id is required to resolve this tool approval.\");\n }\n const endpoint = `${sessionEndpoint(\n decision.sessionsApi,\n decision.sessionId,\n )}/approvals/${encodeURIComponent(decision.approvalId)}`;\n const response = await fetcher(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(\n decision.reason\n ? { approved: decision.approved, reason: decision.reason }\n : { approved: decision.approved },\n ),\n });\n if (!response.ok) {\n throw await responseError(\"Tool approval\", response);\n }\n return parseSession(await response.json());\n}\n\nfunction sessionEndpoint(sessionsApi: string, sessionId: string): string {\n return `${stripTrailingSlashes(sessionsApi)}/${encodeURIComponent(sessionId)}`;\n}\n\n// Linear scan instead of `.replace(/\\/+$/, \"\")`: the regex backtracks\n// polynomially on caller-supplied base URLs with many trailing slashes.\nfunction stripTrailingSlashes(value: string): string {\n let end = value.length;\n while (end > 0 && value[end - 1] === \"/\") end--;\n return value.slice(0, end);\n}\n\nfunction parseSession(value: unknown): CaptainChatSession {\n if (\n typeof value !== \"object\" ||\n value === null ||\n !(\"id\" in value) ||\n typeof value.id !== \"string\"\n ) {\n throw new Error(\"Captain chat session response is invalid.\");\n }\n const messages = \"messages\" in value ? value.messages : [];\n if (!Array.isArray(messages)) {\n throw new Error(\"Captain chat session response is invalid.\");\n }\n return { ...value, messages } as CaptainChatSession;\n}\n\nasync function responseError(\n label: string,\n response: Response,\n): Promise<Error> {\n const detail = (await response.text()).trim();\n return new Error(\n `${label} failed with status ${response.status}${\n detail ? `: ${detail}` : \".\"\n }`,\n );\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"approval.cjs","sources":["../../../src/data/chat/approval.ts"],"sourcesContent":["import type { UIMessage } from \"ai\";\nimport type { ChatModelRuntime, ChatUsageBreakdown } from \"./types\";\n\nexport type CaptainChatContext = {\n usedTokens?: number;\n windowTokens?: number;\n freePercent: number;\n};\n\nexport type CaptainChatCost = {\n model?: string;\n inputCost?: number;\n outputCost?: number;\n reasoningCost?: number;\n cacheReadCost?: number;\n cacheWriteCost?: number;\n providerCostUSD?: number;\n};\n\nexport type CaptainChatSession = {\n id: string;\n revision?: number;\n messages: UIMessage[];\n providerSessionId?: string;\n runtime?: ChatModelRuntime;\n forkedFrom?: string;\n context?: CaptainChatContext;\n usage?: ChatUsageBreakdown;\n cost?: CaptainChatCost;\n backend?: string;\n executionMode?: string;\n model?: string;\n};\n\nexport type ToolApprovalDecision = {\n sessionsApi: string;\n sessionId: string;\n approvalId: string;\n approved: boolean;\n reason?: string;\n};\n\ntype SessionFetch = (\n input: RequestInfo | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport async function getChatSession(\n sessionsApi: string,\n sessionId: string,\n fetcher: SessionFetch = fetch,\n): Promise<CaptainChatSession> {\n if (!sessionId.trim()) {\n throw new Error(\"A session id is required to load this chat.\");\n }\n const response = await fetcher(sessionEndpoint(sessionsApi, sessionId), {\n headers: { Accept: \"application/json\" },\n });\n if (!response.ok) {\n throw await responseError(\"Chat session request\", response);\n }\n return parseSession(await response.json());\n}\n\nexport async function forkChatSession(\n sessionsApi: string,\n sessionId: string,\n fetcher: SessionFetch = fetch,\n): Promise<CaptainChatSession> {\n if (!sessionId.trim()) {\n throw new Error(\"A session id is required to fork this chat.\");\n }\n const response = await fetcher(\n `${sessionEndpoint(sessionsApi, sessionId)}/fork`,\n {\n method: \"POST\",\n headers: { Accept: \"application/json\" },\n },\n );\n if (!response.ok) {\n throw await responseError(\"Fork chat session\", response);\n }\n return parseSession(await response.json());\n}\n\nexport async function postToolApproval(\n decision: ToolApprovalDecision,\n fetcher: SessionFetch = fetch,\n): Promise<CaptainChatSession> {\n if (!decision.sessionId.trim()) {\n throw new Error(\"A session id is required to resolve this tool approval.\");\n }\n const endpoint = `${sessionEndpoint(\n decision.sessionsApi,\n decision.sessionId,\n )}/approvals/${encodeURIComponent(decision.approvalId)}`;\n const response = await fetcher(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(\n decision.reason\n ? { approved: decision.approved, reason: decision.reason }\n : { approved: decision.approved },\n ),\n });\n if (!response.ok) {\n throw await responseError(\"Tool approval\", response);\n }\n return parseSession(await response.json());\n}\n\nfunction sessionEndpoint(sessionsApi: string, sessionId: string): string {\n return `${stripTrailingSlashes(sessionsApi)}/${encodeURIComponent(sessionId)}`;\n}\n\n// Linear scan instead of `.replace(/\\/+$/, \"\")`: the regex backtracks\n// polynomially on caller-supplied base URLs with many trailing slashes.\nfunction stripTrailingSlashes(value: string): string {\n let end = value.length;\n while (end > 0 && value[end - 1] === \"/\") end--;\n return value.slice(0, end);\n}\n\nfunction parseSession(value: unknown): CaptainChatSession {\n if (\n typeof value !== \"object\" ||\n value === null ||\n !(\"id\" in value) ||\n typeof value.id !== \"string\"\n ) {\n throw new Error(\"Captain chat session response is invalid.\");\n }\n const messages = \"messages\" in value ? value.messages : [];\n if (!Array.isArray(messages)) {\n throw new Error(\"Captain chat session response is invalid.\");\n }\n return { ...value, messages } as CaptainChatSession;\n}\n\nasync function responseError(\n label: string,\n response: Response,\n): Promise<Error> {\n const detail = (await response.text()).trim();\n return new Error(\n `${label} failed with status ${response.status}${\n detail ? `: ${detail}` : \".\"\n }`,\n );\n}\n"],"names":[],"mappings":";;AA+CA,eAAsB,eACpB,aACA,WACA,UAAwB,OACK;AAC7B,MAAI,CAAC,UAAU,QAAQ;AACrB,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,QAAM,WAAW,MAAM,QAAQ,gBAAgB,aAAa,SAAS,GAAG;AAAA,IACtE,SAAS,EAAE,QAAQ,mBAAA;AAAA,EAAmB,CACvC;AACD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,MAAM,cAAc,wBAAwB,QAAQ;AAAA,EAC5D;AACA,SAAO,aAAa,MAAM,SAAS,MAAM;AAC3C;AAEA,eAAsB,gBACpB,aACA,WACA,UAAwB,OACK;AAC7B,MAAI,CAAC,UAAU,QAAQ;AACrB,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,QAAM,WAAW,MAAM;AAAA,IACrB,GAAG,gBAAgB,aAAa,SAAS,CAAC;AAAA,IAC1C;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,EAAE,QAAQ,mBAAA;AAAA,IAAmB;AAAA,EACxC;AAEF,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,MAAM,cAAc,qBAAqB,QAAQ;AAAA,EACzD;AACA,SAAO,aAAa,MAAM,SAAS,MAAM;AAC3C;AAEA,eAAsB,iBACpB,UACA,UAAwB,OACK;AAC7B,MAAI,CAAC,SAAS,UAAU,QAAQ;AAC9B,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACA,QAAM,WAAW,GAAG;AAAA,IAClB,SAAS;AAAA,IACT,SAAS;AAAA,EAAA,CACV,cAAc,mBAAmB,SAAS,UAAU,CAAC;AACtD,QAAM,WAAW,MAAM,QAAQ,UAAU;AAAA,IACvC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,gBAAgB;AAAA,IAAA;AAAA,IAElB,MAAM,KAAK;AAAA,MACT,SAAS,SACL,EAAE,UAAU,SAAS,UAAU,QAAQ,SAAS,OAAA,IAChD,EAAE,UAAU,SAAS,SAAA;AAAA,IAAS;AAAA,EACpC,CACD;AACD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,MAAM,cAAc,iBAAiB,QAAQ;AAAA,EACrD;AACA,SAAO,aAAa,MAAM,SAAS,MAAM;AAC3C;AAEA,SAAS,gBAAgB,aAAqB,WAA2B;AACvE,SAAO,GAAG,qBAAqB,WAAW,CAAC,IAAI,mBAAmB,SAAS,CAAC;AAC9E;AAIA,SAAS,qBAAqB,OAAuB;AACnD,MAAI,MAAM,MAAM;AAChB,SAAO,MAAM,KAAK,MAAM,MAAM,CAAC,MAAM,IAAK;AAC1C,SAAO,MAAM,MAAM,GAAG,GAAG;AAC3B;AAEA,SAAS,aAAa,OAAoC;AACxD,MACE,OAAO,UAAU,YACjB,UAAU,QACV,EAAE,QAAQ,UACV,OAAO,MAAM,OAAO,UACpB;AACA,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACA,QAAM,WAAW,cAAc,QAAQ,MAAM,WAAW,CAAA;AACxD,MAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC5B,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACA,SAAO,EAAE,GAAG,OAAO,SAAA;AACrB;AAEA,eAAe,cACb,OACA,UACgB;AAChB,QAAM,UAAU,MAAM,SAAS,KAAA,GAAQ,KAAA;AACvC,SAAO,IAAI;AAAA,IACT,GAAG,KAAK,uBAAuB,SAAS,MAAM,GAC5C,SAAS,KAAK,MAAM,KAAK,GAC3B;AAAA,EAAA;AAEJ;;;;"}
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
import { UIMessage } from 'ai';
|
|
2
|
-
import { ChatModelRuntime } from './types';
|
|
2
|
+
import { ChatModelRuntime, ChatUsageBreakdown } from './types';
|
|
3
|
+
export type CaptainChatContext = {
|
|
4
|
+
usedTokens?: number;
|
|
5
|
+
windowTokens?: number;
|
|
6
|
+
freePercent: number;
|
|
7
|
+
};
|
|
8
|
+
export type CaptainChatCost = {
|
|
9
|
+
model?: string;
|
|
10
|
+
inputCost?: number;
|
|
11
|
+
outputCost?: number;
|
|
12
|
+
reasoningCost?: number;
|
|
13
|
+
cacheReadCost?: number;
|
|
14
|
+
cacheWriteCost?: number;
|
|
15
|
+
providerCostUSD?: number;
|
|
16
|
+
};
|
|
3
17
|
export type CaptainChatSession = {
|
|
4
18
|
id: string;
|
|
5
19
|
revision?: number;
|
|
@@ -7,6 +21,12 @@ export type CaptainChatSession = {
|
|
|
7
21
|
providerSessionId?: string;
|
|
8
22
|
runtime?: ChatModelRuntime;
|
|
9
23
|
forkedFrom?: string;
|
|
24
|
+
context?: CaptainChatContext;
|
|
25
|
+
usage?: ChatUsageBreakdown;
|
|
26
|
+
cost?: CaptainChatCost;
|
|
27
|
+
backend?: string;
|
|
28
|
+
executionMode?: string;
|
|
29
|
+
model?: string;
|
|
10
30
|
};
|
|
11
31
|
export type ToolApprovalDecision = {
|
|
12
32
|
sessionsApi: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../../../src/data/chat/approval.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../../../src/data/chat/approval.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAEpE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,YAAY,GAAG,CAClB,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,YAAoB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAW7B;AAED,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,YAAoB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAe7B;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,GAAE,YAAoB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAwB7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval.js","sources":["../../../src/data/chat/approval.ts"],"sourcesContent":["import type { UIMessage } from \"ai\";\nimport type { ChatModelRuntime } from \"./types\";\n\nexport type CaptainChatSession = {\n id: string;\n revision?: number;\n messages: UIMessage[];\n providerSessionId?: string;\n runtime?: ChatModelRuntime;\n forkedFrom?: string;\n};\n\nexport type ToolApprovalDecision = {\n sessionsApi: string;\n sessionId: string;\n approvalId: string;\n approved: boolean;\n reason?: string;\n};\n\ntype SessionFetch = (\n input: RequestInfo | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport async function getChatSession(\n sessionsApi: string,\n sessionId: string,\n fetcher: SessionFetch = fetch,\n): Promise<CaptainChatSession> {\n if (!sessionId.trim()) {\n throw new Error(\"A session id is required to load this chat.\");\n }\n const response = await fetcher(sessionEndpoint(sessionsApi, sessionId), {\n headers: { Accept: \"application/json\" },\n });\n if (!response.ok) {\n throw await responseError(\"Chat session request\", response);\n }\n return parseSession(await response.json());\n}\n\nexport async function forkChatSession(\n sessionsApi: string,\n sessionId: string,\n fetcher: SessionFetch = fetch,\n): Promise<CaptainChatSession> {\n if (!sessionId.trim()) {\n throw new Error(\"A session id is required to fork this chat.\");\n }\n const response = await fetcher(\n `${sessionEndpoint(sessionsApi, sessionId)}/fork`,\n {\n method: \"POST\",\n headers: { Accept: \"application/json\" },\n },\n );\n if (!response.ok) {\n throw await responseError(\"Fork chat session\", response);\n }\n return parseSession(await response.json());\n}\n\nexport async function postToolApproval(\n decision: ToolApprovalDecision,\n fetcher: SessionFetch = fetch,\n): Promise<CaptainChatSession> {\n if (!decision.sessionId.trim()) {\n throw new Error(\"A session id is required to resolve this tool approval.\");\n }\n const endpoint = `${sessionEndpoint(\n decision.sessionsApi,\n decision.sessionId,\n )}/approvals/${encodeURIComponent(decision.approvalId)}`;\n const response = await fetcher(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(\n decision.reason\n ? { approved: decision.approved, reason: decision.reason }\n : { approved: decision.approved },\n ),\n });\n if (!response.ok) {\n throw await responseError(\"Tool approval\", response);\n }\n return parseSession(await response.json());\n}\n\nfunction sessionEndpoint(sessionsApi: string, sessionId: string): string {\n return `${stripTrailingSlashes(sessionsApi)}/${encodeURIComponent(sessionId)}`;\n}\n\n// Linear scan instead of `.replace(/\\/+$/, \"\")`: the regex backtracks\n// polynomially on caller-supplied base URLs with many trailing slashes.\nfunction stripTrailingSlashes(value: string): string {\n let end = value.length;\n while (end > 0 && value[end - 1] === \"/\") end--;\n return value.slice(0, end);\n}\n\nfunction parseSession(value: unknown): CaptainChatSession {\n if (\n typeof value !== \"object\" ||\n value === null ||\n !(\"id\" in value) ||\n typeof value.id !== \"string\"\n ) {\n throw new Error(\"Captain chat session response is invalid.\");\n }\n const messages = \"messages\" in value ? value.messages : [];\n if (!Array.isArray(messages)) {\n throw new Error(\"Captain chat session response is invalid.\");\n }\n return { ...value, messages } as CaptainChatSession;\n}\n\nasync function responseError(\n label: string,\n response: Response,\n): Promise<Error> {\n const detail = (await response.text()).trim();\n return new Error(\n `${label} failed with status ${response.status}${\n detail ? `: ${detail}` : \".\"\n }`,\n );\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"approval.js","sources":["../../../src/data/chat/approval.ts"],"sourcesContent":["import type { UIMessage } from \"ai\";\nimport type { ChatModelRuntime, ChatUsageBreakdown } from \"./types\";\n\nexport type CaptainChatContext = {\n usedTokens?: number;\n windowTokens?: number;\n freePercent: number;\n};\n\nexport type CaptainChatCost = {\n model?: string;\n inputCost?: number;\n outputCost?: number;\n reasoningCost?: number;\n cacheReadCost?: number;\n cacheWriteCost?: number;\n providerCostUSD?: number;\n};\n\nexport type CaptainChatSession = {\n id: string;\n revision?: number;\n messages: UIMessage[];\n providerSessionId?: string;\n runtime?: ChatModelRuntime;\n forkedFrom?: string;\n context?: CaptainChatContext;\n usage?: ChatUsageBreakdown;\n cost?: CaptainChatCost;\n backend?: string;\n executionMode?: string;\n model?: string;\n};\n\nexport type ToolApprovalDecision = {\n sessionsApi: string;\n sessionId: string;\n approvalId: string;\n approved: boolean;\n reason?: string;\n};\n\ntype SessionFetch = (\n input: RequestInfo | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport async function getChatSession(\n sessionsApi: string,\n sessionId: string,\n fetcher: SessionFetch = fetch,\n): Promise<CaptainChatSession> {\n if (!sessionId.trim()) {\n throw new Error(\"A session id is required to load this chat.\");\n }\n const response = await fetcher(sessionEndpoint(sessionsApi, sessionId), {\n headers: { Accept: \"application/json\" },\n });\n if (!response.ok) {\n throw await responseError(\"Chat session request\", response);\n }\n return parseSession(await response.json());\n}\n\nexport async function forkChatSession(\n sessionsApi: string,\n sessionId: string,\n fetcher: SessionFetch = fetch,\n): Promise<CaptainChatSession> {\n if (!sessionId.trim()) {\n throw new Error(\"A session id is required to fork this chat.\");\n }\n const response = await fetcher(\n `${sessionEndpoint(sessionsApi, sessionId)}/fork`,\n {\n method: \"POST\",\n headers: { Accept: \"application/json\" },\n },\n );\n if (!response.ok) {\n throw await responseError(\"Fork chat session\", response);\n }\n return parseSession(await response.json());\n}\n\nexport async function postToolApproval(\n decision: ToolApprovalDecision,\n fetcher: SessionFetch = fetch,\n): Promise<CaptainChatSession> {\n if (!decision.sessionId.trim()) {\n throw new Error(\"A session id is required to resolve this tool approval.\");\n }\n const endpoint = `${sessionEndpoint(\n decision.sessionsApi,\n decision.sessionId,\n )}/approvals/${encodeURIComponent(decision.approvalId)}`;\n const response = await fetcher(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(\n decision.reason\n ? { approved: decision.approved, reason: decision.reason }\n : { approved: decision.approved },\n ),\n });\n if (!response.ok) {\n throw await responseError(\"Tool approval\", response);\n }\n return parseSession(await response.json());\n}\n\nfunction sessionEndpoint(sessionsApi: string, sessionId: string): string {\n return `${stripTrailingSlashes(sessionsApi)}/${encodeURIComponent(sessionId)}`;\n}\n\n// Linear scan instead of `.replace(/\\/+$/, \"\")`: the regex backtracks\n// polynomially on caller-supplied base URLs with many trailing slashes.\nfunction stripTrailingSlashes(value: string): string {\n let end = value.length;\n while (end > 0 && value[end - 1] === \"/\") end--;\n return value.slice(0, end);\n}\n\nfunction parseSession(value: unknown): CaptainChatSession {\n if (\n typeof value !== \"object\" ||\n value === null ||\n !(\"id\" in value) ||\n typeof value.id !== \"string\"\n ) {\n throw new Error(\"Captain chat session response is invalid.\");\n }\n const messages = \"messages\" in value ? value.messages : [];\n if (!Array.isArray(messages)) {\n throw new Error(\"Captain chat session response is invalid.\");\n }\n return { ...value, messages } as CaptainChatSession;\n}\n\nasync function responseError(\n label: string,\n response: Response,\n): Promise<Error> {\n const detail = (await response.text()).trim();\n return new Error(\n `${label} failed with status ${response.status}${\n detail ? `: ${detail}` : \".\"\n }`,\n );\n}\n"],"names":[],"mappings":"AA+CA,eAAsB,eACpB,aACA,WACA,UAAwB,OACK;AAC7B,MAAI,CAAC,UAAU,QAAQ;AACrB,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,QAAM,WAAW,MAAM,QAAQ,gBAAgB,aAAa,SAAS,GAAG;AAAA,IACtE,SAAS,EAAE,QAAQ,mBAAA;AAAA,EAAmB,CACvC;AACD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,MAAM,cAAc,wBAAwB,QAAQ;AAAA,EAC5D;AACA,SAAO,aAAa,MAAM,SAAS,MAAM;AAC3C;AAEA,eAAsB,gBACpB,aACA,WACA,UAAwB,OACK;AAC7B,MAAI,CAAC,UAAU,QAAQ;AACrB,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,QAAM,WAAW,MAAM;AAAA,IACrB,GAAG,gBAAgB,aAAa,SAAS,CAAC;AAAA,IAC1C;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,EAAE,QAAQ,mBAAA;AAAA,IAAmB;AAAA,EACxC;AAEF,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,MAAM,cAAc,qBAAqB,QAAQ;AAAA,EACzD;AACA,SAAO,aAAa,MAAM,SAAS,MAAM;AAC3C;AAEA,eAAsB,iBACpB,UACA,UAAwB,OACK;AAC7B,MAAI,CAAC,SAAS,UAAU,QAAQ;AAC9B,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACA,QAAM,WAAW,GAAG;AAAA,IAClB,SAAS;AAAA,IACT,SAAS;AAAA,EAAA,CACV,cAAc,mBAAmB,SAAS,UAAU,CAAC;AACtD,QAAM,WAAW,MAAM,QAAQ,UAAU;AAAA,IACvC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,gBAAgB;AAAA,IAAA;AAAA,IAElB,MAAM,KAAK;AAAA,MACT,SAAS,SACL,EAAE,UAAU,SAAS,UAAU,QAAQ,SAAS,OAAA,IAChD,EAAE,UAAU,SAAS,SAAA;AAAA,IAAS;AAAA,EACpC,CACD;AACD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,MAAM,cAAc,iBAAiB,QAAQ;AAAA,EACrD;AACA,SAAO,aAAa,MAAM,SAAS,MAAM;AAC3C;AAEA,SAAS,gBAAgB,aAAqB,WAA2B;AACvE,SAAO,GAAG,qBAAqB,WAAW,CAAC,IAAI,mBAAmB,SAAS,CAAC;AAC9E;AAIA,SAAS,qBAAqB,OAAuB;AACnD,MAAI,MAAM,MAAM;AAChB,SAAO,MAAM,KAAK,MAAM,MAAM,CAAC,MAAM,IAAK;AAC1C,SAAO,MAAM,MAAM,GAAG,GAAG;AAC3B;AAEA,SAAS,aAAa,OAAoC;AACxD,MACE,OAAO,UAAU,YACjB,UAAU,QACV,EAAE,QAAQ,UACV,OAAO,MAAM,OAAO,UACpB;AACA,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACA,QAAM,WAAW,cAAc,QAAQ,MAAM,WAAW,CAAA;AACxD,MAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC5B,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACA,SAAO,EAAE,GAAG,OAAO,SAAA;AACrB;AAEA,eAAe,cACb,OACA,UACgB;AAChB,QAAM,UAAU,MAAM,SAAS,KAAA,GAAQ,KAAA;AACvC,SAAO,IAAI;AAAA,IACT,GAAG,KAAK,uBAAuB,SAAS,MAAM,GAC5C,SAAS,KAAK,MAAM,KAAK,GAC3B;AAAA,EAAA;AAEJ;"}
|
|
@@ -33,10 +33,15 @@ function operationToTool(operation, resolved, surfacesByKey) {
|
|
|
33
33
|
return {
|
|
34
34
|
name: operation.operationId,
|
|
35
35
|
label: toolLabel(operation),
|
|
36
|
+
operationName: operation.operationId,
|
|
37
|
+
source: "clicky",
|
|
36
38
|
...group ? { group, preferenceKey: group } : (meta == null ? void 0 : meta.surface) ? { group: meta.surface } : {},
|
|
37
39
|
...defaultPermission ? { defaultPermission } : {},
|
|
38
40
|
...parent ? { parent } : {},
|
|
39
41
|
...(surface == null ? void 0 : surface.entity) ? { entity: surface.entity } : {},
|
|
42
|
+
...(meta == null ? void 0 : meta.verb) ? { verb: meta.verb } : {},
|
|
43
|
+
...(meta == null ? void 0 : meta.actionName) ? { action: meta.actionName } : {},
|
|
44
|
+
...(meta == null ? void 0 : meta.scope) ? { scope: meta.scope } : {},
|
|
40
45
|
...icon ? { icon } : {},
|
|
41
46
|
...description ? { description } : {},
|
|
42
47
|
...(resolved == null ? void 0 : resolved.method) ? { method: resolved.method.toUpperCase() } : {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clickyOperationsToTools.cjs","sources":["../../../src/data/chat/clickyOperationsToTools.ts"],"sourcesContent":["import type {\n ClickySurface,\n OpenAPIOperation,\n OpenAPIParameter,\n OpenAPISchema,\n ResolvedOperation,\n} from \"../../rpc/types\";\nimport type {\n ChatToolInputSchema,\n JSONSchemaProperty,\n ToolAnnotations,\n ToolMeta,\n} from \"./types\";\nimport { normalizeToolPolicy } from \"./types\";\n\n/** Converts a clicky RPC operation catalog into AI-tool metadata for display\n * and request scoping. Execution stays in the Go backend; this maps an\n * operation's `operationId` → tool name, a short `x-clicky` verb/action →\n * label, the `x-clicky` surface → group, `summary`/`description` → description,\n * and `parameters` + `requestBody` → a JSON-Schema input. Operations without an\n * `operationId` are skipped (a tool needs a stable name). */\nexport function clickyOperationsToTools(\n operations: ResolvedOperation[],\n surfaces?: ClickySurface[],\n): ToolMeta[] {\n const surfacesByKey = new Map<string, ClickySurface>();\n for (const surface of surfaces ?? []) {\n surfacesByKey.set(surface.key, surface);\n }\n const tools: ToolMeta[] = [];\n for (const resolved of operations) {\n const tool = operationToTool(resolved.operation, resolved, surfacesByKey);\n if (tool) {\n tools.push(tool);\n }\n }\n return tools;\n}\n\nexport function operationToTool(\n operation: OpenAPIOperation,\n resolved?: Pick<ResolvedOperation, \"path\" | \"method\">,\n surfacesByKey?: Map<string, ClickySurface>,\n): ToolMeta | null {\n if (!operation.operationId) {\n return null;\n }\n if (isCobraHelpOrCompletionOperation(operation, resolved)) {\n return null;\n }\n const meta = operation[\"x-clicky\"];\n const hints = meta?.toolHints;\n const group = operationToolGroup(operation);\n const surface = meta?.surface ? surfacesByKey?.get(meta.surface) : undefined;\n const parent = surface?.title || hints?.parent || surface?.entity;\n const icon = hints?.icon || surface?.icon;\n // Operation hints still carry the legacy on/off spellings, so this is a real\n // translation, not a pass-through.\n const defaultPermission = normalizeToolPolicy(hints?.defaultPermission);\n const description = operation.description ?? operation.summary;\n return {\n name: operation.operationId,\n label: toolLabel(operation),\n ...(group\n ? { group, preferenceKey: group }\n : meta?.surface\n ? { group: meta.surface }\n : {}),\n ...(defaultPermission ? { defaultPermission } : {}),\n ...(parent ? { parent } : {}),\n ...(surface?.entity ? { entity: surface.entity } : {}),\n ...(icon ? { icon } : {}),\n ...(description ? { description } : {}),\n ...(resolved?.method ? { method: resolved.method.toUpperCase() } : {}),\n ...(resolved?.path ? { path: resolved.path } : {}),\n strict: hints?.strict ?? true,\n annotations: toolAnnotations(operation, resolved, description),\n inputSchema: buildInputSchema(operation),\n };\n}\n\nfunction toolAnnotations(\n operation: OpenAPIOperation,\n resolved: Pick<ResolvedOperation, \"path\" | \"method\"> | undefined,\n description: string | undefined,\n): ToolAnnotations {\n const hints = operation[\"x-clicky\"]?.toolHints;\n const method = resolved?.method?.toUpperCase() ?? \"\";\n const annotations: ToolAnnotations = {};\n const title =\n hints?.title ??\n operation.summary ??\n operation[\"x-clicky\"]?.actionName ??\n description;\n if (title) annotations.title = title;\n if (hints?.readOnlyHint !== undefined) {\n annotations.readOnlyHint = hints.readOnlyHint;\n } else if (resolved?.method?.toUpperCase() === \"GET\") {\n annotations.readOnlyHint = true;\n }\n if (hints?.idempotentHint !== undefined) {\n annotations.idempotentHint = hints.idempotentHint;\n } else if (isIdempotentMethod(method)) {\n annotations.idempotentHint = true;\n }\n if (hints?.destructiveHint !== undefined) {\n annotations.destructiveHint = hints.destructiveHint;\n } else if (isDestructiveTool(operation, resolved)) {\n annotations.destructiveHint = true;\n }\n if (hints?.openWorldHint !== undefined) {\n annotations.openWorldHint = hints.openWorldHint;\n }\n return annotations;\n}\n\nfunction isIdempotentMethod(method: string): boolean {\n return (\n method === \"GET\" ||\n method === \"HEAD\" ||\n method === \"OPTIONS\" ||\n method === \"PUT\" ||\n method === \"DELETE\"\n );\n}\n\nfunction isDestructiveTool(\n operation: OpenAPIOperation,\n resolved: Pick<ResolvedOperation, \"path\" | \"method\"> | undefined,\n): boolean {\n const method = resolved?.method?.toUpperCase() ?? \"\";\n if (method === \"DELETE\") return true;\n if (method === \"GET\" || method === \"HEAD\" || method === \"OPTIONS\")\n return false;\n const text = `${resolved?.path ?? \"\"} ${operation.operationId ?? \"\"}`.toLowerCase();\n return /\\b(write|delete|remove|destroy|void|sync|create|update|patch|post)\\b/.test(\n text,\n );\n}\n\nfunction operationToolGroup(\n operation: OpenAPIOperation,\n): string | undefined {\n const meta = operation[\"x-clicky\"];\n if (meta?.toolHints?.group) return meta.toolHints.group;\n if (meta?.group) return meta.group;\n return undefined;\n}\n\nfunction isCobraHelpOrCompletionOperation(\n operation: OpenAPIOperation,\n resolved?: Pick<ResolvedOperation, \"path\" | \"method\">,\n): boolean {\n return (\n commandStartsWithCobraBuiltin(operation.operationId) ||\n commandStartsWithCobraBuiltin(operation[\"x-clicky\"]?.command) ||\n pathContainsCobraBuiltin(resolved?.path)\n );\n}\n\nfunction commandStartsWithCobraBuiltin(raw: string | undefined): boolean {\n if (!raw) return false;\n const normalized = raw\n .replace(/([a-z\\d])([A-Z])/g, \"$1 $2\")\n .replace(/[/_.-]+/g, \" \")\n .trim()\n .toLowerCase();\n const first = normalized.split(/\\s+/)[0];\n return first === \"completion\" || first === \"help\";\n}\n\nfunction pathContainsCobraBuiltin(path: string | undefined): boolean {\n if (!path) return false;\n const parts = path\n .split(\"/\")\n .filter(Boolean)\n .map((part) => part.toLowerCase());\n const commandParts =\n parts[0] === \"api\" && /^v\\d+$/.test(parts[1] ?? \"\")\n ? parts.slice(2)\n : parts;\n const first = commandParts[0];\n return first === \"completion\" || first === \"help\";\n}\n\n\n/** A concise popover label: the clicky action/verb (capitalized) when present,\n * else the operation summary, else a humanized operationId. Mirrors the intent\n * of rpc/clickyMetadata.ts `surfaceActionLabel`. */\nfunction toolLabel(operation: OpenAPIOperation): string {\n const meta = operation[\"x-clicky\"];\n const short = meta?.actionName?.trim() || meta?.verb?.trim();\n if (short && short !== \"action\") {\n return short.charAt(0).toUpperCase() + short.slice(1);\n }\n if (operation.summary) {\n return operation.summary;\n }\n return humanize(operation.operationId ?? \"\");\n}\n\nfunction humanize(operationId: string): string {\n const spaced = operationId\n .replace(/[_-]+/g, \" \")\n .replace(/([a-z\\d])([A-Z])/g, \"$1 $2\");\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction buildInputSchema(operation: OpenAPIOperation): ChatToolInputSchema {\n const properties: Record<string, JSONSchemaProperty> = {};\n const required: string[] = [];\n\n for (const param of operation.parameters ?? []) {\n properties[param.name] = parameterToProperty(param);\n if (param.required) {\n required.push(param.name);\n }\n }\n\n const body = requestBodySchema(operation);\n if (body?.properties) {\n for (const [name, schema] of Object.entries(body.properties)) {\n properties[name] = schemaToProperty(schema);\n }\n }\n\n return { type: \"object\", properties, required, additionalProperties: false };\n}\n\nfunction parameterToProperty(param: OpenAPIParameter): JSONSchemaProperty {\n const prop = schemaToProperty(param.schema);\n if (param.description && !prop.description) {\n prop.description = param.description;\n }\n return prop;\n}\n\nfunction schemaToProperty(\n schema: OpenAPISchema | undefined,\n): JSONSchemaProperty {\n if (!schema) {\n return { type: \"string\" };\n }\n const prop: JSONSchemaProperty = { type: jsonSchemaType(schema.type) };\n if (schema.description !== undefined) {\n prop.description = schema.description;\n }\n if (schema.enum !== undefined) {\n prop.enum = schema.enum;\n }\n if (schema.default !== undefined) {\n prop.default = schema.default;\n }\n return prop;\n}\n\nfunction jsonSchemaType(\n type: string | undefined,\n): NonNullable<JSONSchemaProperty[\"type\"]> {\n switch (type) {\n case \"object\":\n case \"array\":\n case \"string\":\n case \"integer\":\n case \"number\":\n case \"boolean\":\n case \"null\":\n return type;\n default:\n return \"string\";\n }\n}\n\nfunction requestBodySchema(\n operation: OpenAPIOperation,\n): OpenAPISchema | undefined {\n const content = operation.requestBody?.content;\n if (!content) {\n return undefined;\n }\n return (\n content[\"application/json\"]?.schema ?? Object.values(content)[0]?.schema\n );\n}\n"],"names":["normalizeToolPolicy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"clickyOperationsToTools.cjs","sources":["../../../src/data/chat/clickyOperationsToTools.ts"],"sourcesContent":["import type {\n ClickySurface,\n OpenAPIOperation,\n OpenAPIParameter,\n OpenAPISchema,\n ResolvedOperation,\n} from \"../../rpc/types\";\nimport type {\n ChatToolInputSchema,\n JSONSchemaProperty,\n ToolAnnotations,\n ToolMeta,\n} from \"./types\";\nimport { normalizeToolPolicy } from \"./types\";\n\n/** Converts a clicky RPC operation catalog into AI-tool metadata for display\n * and request scoping. Execution stays in the Go backend; this maps an\n * operation's `operationId` → tool name, a short `x-clicky` verb/action →\n * label, the `x-clicky` surface → group, `summary`/`description` → description,\n * and `parameters` + `requestBody` → a JSON-Schema input. Operations without an\n * `operationId` are skipped (a tool needs a stable name). */\nexport function clickyOperationsToTools(\n operations: ResolvedOperation[],\n surfaces?: ClickySurface[],\n): ToolMeta[] {\n const surfacesByKey = new Map<string, ClickySurface>();\n for (const surface of surfaces ?? []) {\n surfacesByKey.set(surface.key, surface);\n }\n const tools: ToolMeta[] = [];\n for (const resolved of operations) {\n const tool = operationToTool(resolved.operation, resolved, surfacesByKey);\n if (tool) {\n tools.push(tool);\n }\n }\n return tools;\n}\n\nexport function operationToTool(\n operation: OpenAPIOperation,\n resolved?: Pick<ResolvedOperation, \"path\" | \"method\">,\n surfacesByKey?: Map<string, ClickySurface>,\n): ToolMeta | null {\n if (!operation.operationId) {\n return null;\n }\n if (isCobraHelpOrCompletionOperation(operation, resolved)) {\n return null;\n }\n const meta = operation[\"x-clicky\"];\n const hints = meta?.toolHints;\n const group = operationToolGroup(operation);\n const surface = meta?.surface ? surfacesByKey?.get(meta.surface) : undefined;\n const parent = surface?.title || hints?.parent || surface?.entity;\n const icon = hints?.icon || surface?.icon;\n // Operation hints still carry the legacy on/off spellings, so this is a real\n // translation, not a pass-through.\n const defaultPermission = normalizeToolPolicy(hints?.defaultPermission);\n const description = operation.description ?? operation.summary;\n return {\n name: operation.operationId,\n label: toolLabel(operation),\n operationName: operation.operationId,\n source: \"clicky\",\n ...(group\n ? { group, preferenceKey: group }\n : meta?.surface\n ? { group: meta.surface }\n : {}),\n ...(defaultPermission ? { defaultPermission } : {}),\n ...(parent ? { parent } : {}),\n ...(surface?.entity ? { entity: surface.entity } : {}),\n ...(meta?.verb ? { verb: meta.verb } : {}),\n ...(meta?.actionName ? { action: meta.actionName } : {}),\n ...(meta?.scope ? { scope: meta.scope } : {}),\n ...(icon ? { icon } : {}),\n ...(description ? { description } : {}),\n ...(resolved?.method ? { method: resolved.method.toUpperCase() } : {}),\n ...(resolved?.path ? { path: resolved.path } : {}),\n strict: hints?.strict ?? true,\n annotations: toolAnnotations(operation, resolved, description),\n inputSchema: buildInputSchema(operation),\n };\n}\n\nfunction toolAnnotations(\n operation: OpenAPIOperation,\n resolved: Pick<ResolvedOperation, \"path\" | \"method\"> | undefined,\n description: string | undefined,\n): ToolAnnotations {\n const hints = operation[\"x-clicky\"]?.toolHints;\n const method = resolved?.method?.toUpperCase() ?? \"\";\n const annotations: ToolAnnotations = {};\n const title =\n hints?.title ??\n operation.summary ??\n operation[\"x-clicky\"]?.actionName ??\n description;\n if (title) annotations.title = title;\n if (hints?.readOnlyHint !== undefined) {\n annotations.readOnlyHint = hints.readOnlyHint;\n } else if (resolved?.method?.toUpperCase() === \"GET\") {\n annotations.readOnlyHint = true;\n }\n if (hints?.idempotentHint !== undefined) {\n annotations.idempotentHint = hints.idempotentHint;\n } else if (isIdempotentMethod(method)) {\n annotations.idempotentHint = true;\n }\n if (hints?.destructiveHint !== undefined) {\n annotations.destructiveHint = hints.destructiveHint;\n } else if (isDestructiveTool(operation, resolved)) {\n annotations.destructiveHint = true;\n }\n if (hints?.openWorldHint !== undefined) {\n annotations.openWorldHint = hints.openWorldHint;\n }\n return annotations;\n}\n\nfunction isIdempotentMethod(method: string): boolean {\n return (\n method === \"GET\" ||\n method === \"HEAD\" ||\n method === \"OPTIONS\" ||\n method === \"PUT\" ||\n method === \"DELETE\"\n );\n}\n\nfunction isDestructiveTool(\n operation: OpenAPIOperation,\n resolved: Pick<ResolvedOperation, \"path\" | \"method\"> | undefined,\n): boolean {\n const method = resolved?.method?.toUpperCase() ?? \"\";\n if (method === \"DELETE\") return true;\n if (method === \"GET\" || method === \"HEAD\" || method === \"OPTIONS\")\n return false;\n const text =\n `${resolved?.path ?? \"\"} ${operation.operationId ?? \"\"}`.toLowerCase();\n return /\\b(write|delete|remove|destroy|void|sync|create|update|patch|post)\\b/.test(\n text,\n );\n}\n\nfunction operationToolGroup(operation: OpenAPIOperation): string | undefined {\n const meta = operation[\"x-clicky\"];\n if (meta?.toolHints?.group) return meta.toolHints.group;\n if (meta?.group) return meta.group;\n return undefined;\n}\n\nfunction isCobraHelpOrCompletionOperation(\n operation: OpenAPIOperation,\n resolved?: Pick<ResolvedOperation, \"path\" | \"method\">,\n): boolean {\n return (\n commandStartsWithCobraBuiltin(operation.operationId) ||\n commandStartsWithCobraBuiltin(operation[\"x-clicky\"]?.command) ||\n pathContainsCobraBuiltin(resolved?.path)\n );\n}\n\nfunction commandStartsWithCobraBuiltin(raw: string | undefined): boolean {\n if (!raw) return false;\n const normalized = raw\n .replace(/([a-z\\d])([A-Z])/g, \"$1 $2\")\n .replace(/[/_.-]+/g, \" \")\n .trim()\n .toLowerCase();\n const first = normalized.split(/\\s+/)[0];\n return first === \"completion\" || first === \"help\";\n}\n\nfunction pathContainsCobraBuiltin(path: string | undefined): boolean {\n if (!path) return false;\n const parts = path\n .split(\"/\")\n .filter(Boolean)\n .map((part) => part.toLowerCase());\n const commandParts =\n parts[0] === \"api\" && /^v\\d+$/.test(parts[1] ?? \"\")\n ? parts.slice(2)\n : parts;\n const first = commandParts[0];\n return first === \"completion\" || first === \"help\";\n}\n\n/** A concise popover label: the clicky action/verb (capitalized) when present,\n * else the operation summary, else a humanized operationId. Mirrors the intent\n * of rpc/clickyMetadata.ts `surfaceActionLabel`. */\nfunction toolLabel(operation: OpenAPIOperation): string {\n const meta = operation[\"x-clicky\"];\n const short = meta?.actionName?.trim() || meta?.verb?.trim();\n if (short && short !== \"action\") {\n return short.charAt(0).toUpperCase() + short.slice(1);\n }\n if (operation.summary) {\n return operation.summary;\n }\n return humanize(operation.operationId ?? \"\");\n}\n\nfunction humanize(operationId: string): string {\n const spaced = operationId\n .replace(/[_-]+/g, \" \")\n .replace(/([a-z\\d])([A-Z])/g, \"$1 $2\");\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction buildInputSchema(operation: OpenAPIOperation): ChatToolInputSchema {\n const properties: Record<string, JSONSchemaProperty> = {};\n const required: string[] = [];\n\n for (const param of operation.parameters ?? []) {\n properties[param.name] = parameterToProperty(param);\n if (param.required) {\n required.push(param.name);\n }\n }\n\n const body = requestBodySchema(operation);\n if (body?.properties) {\n for (const [name, schema] of Object.entries(body.properties)) {\n properties[name] = schemaToProperty(schema);\n }\n }\n\n return { type: \"object\", properties, required, additionalProperties: false };\n}\n\nfunction parameterToProperty(param: OpenAPIParameter): JSONSchemaProperty {\n const prop = schemaToProperty(param.schema);\n if (param.description && !prop.description) {\n prop.description = param.description;\n }\n return prop;\n}\n\nfunction schemaToProperty(\n schema: OpenAPISchema | undefined,\n): JSONSchemaProperty {\n if (!schema) {\n return { type: \"string\" };\n }\n const prop: JSONSchemaProperty = { type: jsonSchemaType(schema.type) };\n if (schema.description !== undefined) {\n prop.description = schema.description;\n }\n if (schema.enum !== undefined) {\n prop.enum = schema.enum;\n }\n if (schema.default !== undefined) {\n prop.default = schema.default;\n }\n return prop;\n}\n\nfunction jsonSchemaType(\n type: string | undefined,\n): NonNullable<JSONSchemaProperty[\"type\"]> {\n switch (type) {\n case \"object\":\n case \"array\":\n case \"string\":\n case \"integer\":\n case \"number\":\n case \"boolean\":\n case \"null\":\n return type;\n default:\n return \"string\";\n }\n}\n\nfunction requestBodySchema(\n operation: OpenAPIOperation,\n): OpenAPISchema | undefined {\n const content = operation.requestBody?.content;\n if (!content) {\n return undefined;\n }\n return (\n content[\"application/json\"]?.schema ?? Object.values(content)[0]?.schema\n );\n}\n"],"names":["normalizeToolPolicy"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clickyOperationsToTools.d.ts","sourceRoot":"","sources":["../../../src/data/chat/clickyOperationsToTools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAGhB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAIV,QAAQ,EACT,MAAM,SAAS,CAAC;AAGjB;;;;;8DAK8D;AAC9D,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,iBAAiB,EAAE,EAC/B,QAAQ,CAAC,EAAE,aAAa,EAAE,GACzB,QAAQ,EAAE,CAaZ;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,gBAAgB,EAC3B,QAAQ,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,QAAQ,CAAC,EACrD,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GACzC,QAAQ,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"clickyOperationsToTools.d.ts","sourceRoot":"","sources":["../../../src/data/chat/clickyOperationsToTools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAGhB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAIV,QAAQ,EACT,MAAM,SAAS,CAAC;AAGjB;;;;;8DAK8D;AAC9D,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,iBAAiB,EAAE,EAC/B,QAAQ,CAAC,EAAE,aAAa,EAAE,GACzB,QAAQ,EAAE,CAaZ;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,gBAAgB,EAC3B,QAAQ,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,QAAQ,CAAC,EACrD,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GACzC,QAAQ,GAAG,IAAI,CAyCjB"}
|
|
@@ -31,10 +31,15 @@ function operationToTool(operation, resolved, surfacesByKey) {
|
|
|
31
31
|
return {
|
|
32
32
|
name: operation.operationId,
|
|
33
33
|
label: toolLabel(operation),
|
|
34
|
+
operationName: operation.operationId,
|
|
35
|
+
source: "clicky",
|
|
34
36
|
...group ? { group, preferenceKey: group } : (meta == null ? void 0 : meta.surface) ? { group: meta.surface } : {},
|
|
35
37
|
...defaultPermission ? { defaultPermission } : {},
|
|
36
38
|
...parent ? { parent } : {},
|
|
37
39
|
...(surface == null ? void 0 : surface.entity) ? { entity: surface.entity } : {},
|
|
40
|
+
...(meta == null ? void 0 : meta.verb) ? { verb: meta.verb } : {},
|
|
41
|
+
...(meta == null ? void 0 : meta.actionName) ? { action: meta.actionName } : {},
|
|
42
|
+
...(meta == null ? void 0 : meta.scope) ? { scope: meta.scope } : {},
|
|
38
43
|
...icon ? { icon } : {},
|
|
39
44
|
...description ? { description } : {},
|
|
40
45
|
...(resolved == null ? void 0 : resolved.method) ? { method: resolved.method.toUpperCase() } : {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clickyOperationsToTools.js","sources":["../../../src/data/chat/clickyOperationsToTools.ts"],"sourcesContent":["import type {\n ClickySurface,\n OpenAPIOperation,\n OpenAPIParameter,\n OpenAPISchema,\n ResolvedOperation,\n} from \"../../rpc/types\";\nimport type {\n ChatToolInputSchema,\n JSONSchemaProperty,\n ToolAnnotations,\n ToolMeta,\n} from \"./types\";\nimport { normalizeToolPolicy } from \"./types\";\n\n/** Converts a clicky RPC operation catalog into AI-tool metadata for display\n * and request scoping. Execution stays in the Go backend; this maps an\n * operation's `operationId` → tool name, a short `x-clicky` verb/action →\n * label, the `x-clicky` surface → group, `summary`/`description` → description,\n * and `parameters` + `requestBody` → a JSON-Schema input. Operations without an\n * `operationId` are skipped (a tool needs a stable name). */\nexport function clickyOperationsToTools(\n operations: ResolvedOperation[],\n surfaces?: ClickySurface[],\n): ToolMeta[] {\n const surfacesByKey = new Map<string, ClickySurface>();\n for (const surface of surfaces ?? []) {\n surfacesByKey.set(surface.key, surface);\n }\n const tools: ToolMeta[] = [];\n for (const resolved of operations) {\n const tool = operationToTool(resolved.operation, resolved, surfacesByKey);\n if (tool) {\n tools.push(tool);\n }\n }\n return tools;\n}\n\nexport function operationToTool(\n operation: OpenAPIOperation,\n resolved?: Pick<ResolvedOperation, \"path\" | \"method\">,\n surfacesByKey?: Map<string, ClickySurface>,\n): ToolMeta | null {\n if (!operation.operationId) {\n return null;\n }\n if (isCobraHelpOrCompletionOperation(operation, resolved)) {\n return null;\n }\n const meta = operation[\"x-clicky\"];\n const hints = meta?.toolHints;\n const group = operationToolGroup(operation);\n const surface = meta?.surface ? surfacesByKey?.get(meta.surface) : undefined;\n const parent = surface?.title || hints?.parent || surface?.entity;\n const icon = hints?.icon || surface?.icon;\n // Operation hints still carry the legacy on/off spellings, so this is a real\n // translation, not a pass-through.\n const defaultPermission = normalizeToolPolicy(hints?.defaultPermission);\n const description = operation.description ?? operation.summary;\n return {\n name: operation.operationId,\n label: toolLabel(operation),\n ...(group\n ? { group, preferenceKey: group }\n : meta?.surface\n ? { group: meta.surface }\n : {}),\n ...(defaultPermission ? { defaultPermission } : {}),\n ...(parent ? { parent } : {}),\n ...(surface?.entity ? { entity: surface.entity } : {}),\n ...(icon ? { icon } : {}),\n ...(description ? { description } : {}),\n ...(resolved?.method ? { method: resolved.method.toUpperCase() } : {}),\n ...(resolved?.path ? { path: resolved.path } : {}),\n strict: hints?.strict ?? true,\n annotations: toolAnnotations(operation, resolved, description),\n inputSchema: buildInputSchema(operation),\n };\n}\n\nfunction toolAnnotations(\n operation: OpenAPIOperation,\n resolved: Pick<ResolvedOperation, \"path\" | \"method\"> | undefined,\n description: string | undefined,\n): ToolAnnotations {\n const hints = operation[\"x-clicky\"]?.toolHints;\n const method = resolved?.method?.toUpperCase() ?? \"\";\n const annotations: ToolAnnotations = {};\n const title =\n hints?.title ??\n operation.summary ??\n operation[\"x-clicky\"]?.actionName ??\n description;\n if (title) annotations.title = title;\n if (hints?.readOnlyHint !== undefined) {\n annotations.readOnlyHint = hints.readOnlyHint;\n } else if (resolved?.method?.toUpperCase() === \"GET\") {\n annotations.readOnlyHint = true;\n }\n if (hints?.idempotentHint !== undefined) {\n annotations.idempotentHint = hints.idempotentHint;\n } else if (isIdempotentMethod(method)) {\n annotations.idempotentHint = true;\n }\n if (hints?.destructiveHint !== undefined) {\n annotations.destructiveHint = hints.destructiveHint;\n } else if (isDestructiveTool(operation, resolved)) {\n annotations.destructiveHint = true;\n }\n if (hints?.openWorldHint !== undefined) {\n annotations.openWorldHint = hints.openWorldHint;\n }\n return annotations;\n}\n\nfunction isIdempotentMethod(method: string): boolean {\n return (\n method === \"GET\" ||\n method === \"HEAD\" ||\n method === \"OPTIONS\" ||\n method === \"PUT\" ||\n method === \"DELETE\"\n );\n}\n\nfunction isDestructiveTool(\n operation: OpenAPIOperation,\n resolved: Pick<ResolvedOperation, \"path\" | \"method\"> | undefined,\n): boolean {\n const method = resolved?.method?.toUpperCase() ?? \"\";\n if (method === \"DELETE\") return true;\n if (method === \"GET\" || method === \"HEAD\" || method === \"OPTIONS\")\n return false;\n const text = `${resolved?.path ?? \"\"} ${operation.operationId ?? \"\"}`.toLowerCase();\n return /\\b(write|delete|remove|destroy|void|sync|create|update|patch|post)\\b/.test(\n text,\n );\n}\n\nfunction operationToolGroup(\n operation: OpenAPIOperation,\n): string | undefined {\n const meta = operation[\"x-clicky\"];\n if (meta?.toolHints?.group) return meta.toolHints.group;\n if (meta?.group) return meta.group;\n return undefined;\n}\n\nfunction isCobraHelpOrCompletionOperation(\n operation: OpenAPIOperation,\n resolved?: Pick<ResolvedOperation, \"path\" | \"method\">,\n): boolean {\n return (\n commandStartsWithCobraBuiltin(operation.operationId) ||\n commandStartsWithCobraBuiltin(operation[\"x-clicky\"]?.command) ||\n pathContainsCobraBuiltin(resolved?.path)\n );\n}\n\nfunction commandStartsWithCobraBuiltin(raw: string | undefined): boolean {\n if (!raw) return false;\n const normalized = raw\n .replace(/([a-z\\d])([A-Z])/g, \"$1 $2\")\n .replace(/[/_.-]+/g, \" \")\n .trim()\n .toLowerCase();\n const first = normalized.split(/\\s+/)[0];\n return first === \"completion\" || first === \"help\";\n}\n\nfunction pathContainsCobraBuiltin(path: string | undefined): boolean {\n if (!path) return false;\n const parts = path\n .split(\"/\")\n .filter(Boolean)\n .map((part) => part.toLowerCase());\n const commandParts =\n parts[0] === \"api\" && /^v\\d+$/.test(parts[1] ?? \"\")\n ? parts.slice(2)\n : parts;\n const first = commandParts[0];\n return first === \"completion\" || first === \"help\";\n}\n\n\n/** A concise popover label: the clicky action/verb (capitalized) when present,\n * else the operation summary, else a humanized operationId. Mirrors the intent\n * of rpc/clickyMetadata.ts `surfaceActionLabel`. */\nfunction toolLabel(operation: OpenAPIOperation): string {\n const meta = operation[\"x-clicky\"];\n const short = meta?.actionName?.trim() || meta?.verb?.trim();\n if (short && short !== \"action\") {\n return short.charAt(0).toUpperCase() + short.slice(1);\n }\n if (operation.summary) {\n return operation.summary;\n }\n return humanize(operation.operationId ?? \"\");\n}\n\nfunction humanize(operationId: string): string {\n const spaced = operationId\n .replace(/[_-]+/g, \" \")\n .replace(/([a-z\\d])([A-Z])/g, \"$1 $2\");\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction buildInputSchema(operation: OpenAPIOperation): ChatToolInputSchema {\n const properties: Record<string, JSONSchemaProperty> = {};\n const required: string[] = [];\n\n for (const param of operation.parameters ?? []) {\n properties[param.name] = parameterToProperty(param);\n if (param.required) {\n required.push(param.name);\n }\n }\n\n const body = requestBodySchema(operation);\n if (body?.properties) {\n for (const [name, schema] of Object.entries(body.properties)) {\n properties[name] = schemaToProperty(schema);\n }\n }\n\n return { type: \"object\", properties, required, additionalProperties: false };\n}\n\nfunction parameterToProperty(param: OpenAPIParameter): JSONSchemaProperty {\n const prop = schemaToProperty(param.schema);\n if (param.description && !prop.description) {\n prop.description = param.description;\n }\n return prop;\n}\n\nfunction schemaToProperty(\n schema: OpenAPISchema | undefined,\n): JSONSchemaProperty {\n if (!schema) {\n return { type: \"string\" };\n }\n const prop: JSONSchemaProperty = { type: jsonSchemaType(schema.type) };\n if (schema.description !== undefined) {\n prop.description = schema.description;\n }\n if (schema.enum !== undefined) {\n prop.enum = schema.enum;\n }\n if (schema.default !== undefined) {\n prop.default = schema.default;\n }\n return prop;\n}\n\nfunction jsonSchemaType(\n type: string | undefined,\n): NonNullable<JSONSchemaProperty[\"type\"]> {\n switch (type) {\n case \"object\":\n case \"array\":\n case \"string\":\n case \"integer\":\n case \"number\":\n case \"boolean\":\n case \"null\":\n return type;\n default:\n return \"string\";\n }\n}\n\nfunction requestBodySchema(\n operation: OpenAPIOperation,\n): OpenAPISchema | undefined {\n const content = operation.requestBody?.content;\n if (!content) {\n return undefined;\n }\n return (\n content[\"application/json\"]?.schema ?? Object.values(content)[0]?.schema\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"clickyOperationsToTools.js","sources":["../../../src/data/chat/clickyOperationsToTools.ts"],"sourcesContent":["import type {\n ClickySurface,\n OpenAPIOperation,\n OpenAPIParameter,\n OpenAPISchema,\n ResolvedOperation,\n} from \"../../rpc/types\";\nimport type {\n ChatToolInputSchema,\n JSONSchemaProperty,\n ToolAnnotations,\n ToolMeta,\n} from \"./types\";\nimport { normalizeToolPolicy } from \"./types\";\n\n/** Converts a clicky RPC operation catalog into AI-tool metadata for display\n * and request scoping. Execution stays in the Go backend; this maps an\n * operation's `operationId` → tool name, a short `x-clicky` verb/action →\n * label, the `x-clicky` surface → group, `summary`/`description` → description,\n * and `parameters` + `requestBody` → a JSON-Schema input. Operations without an\n * `operationId` are skipped (a tool needs a stable name). */\nexport function clickyOperationsToTools(\n operations: ResolvedOperation[],\n surfaces?: ClickySurface[],\n): ToolMeta[] {\n const surfacesByKey = new Map<string, ClickySurface>();\n for (const surface of surfaces ?? []) {\n surfacesByKey.set(surface.key, surface);\n }\n const tools: ToolMeta[] = [];\n for (const resolved of operations) {\n const tool = operationToTool(resolved.operation, resolved, surfacesByKey);\n if (tool) {\n tools.push(tool);\n }\n }\n return tools;\n}\n\nexport function operationToTool(\n operation: OpenAPIOperation,\n resolved?: Pick<ResolvedOperation, \"path\" | \"method\">,\n surfacesByKey?: Map<string, ClickySurface>,\n): ToolMeta | null {\n if (!operation.operationId) {\n return null;\n }\n if (isCobraHelpOrCompletionOperation(operation, resolved)) {\n return null;\n }\n const meta = operation[\"x-clicky\"];\n const hints = meta?.toolHints;\n const group = operationToolGroup(operation);\n const surface = meta?.surface ? surfacesByKey?.get(meta.surface) : undefined;\n const parent = surface?.title || hints?.parent || surface?.entity;\n const icon = hints?.icon || surface?.icon;\n // Operation hints still carry the legacy on/off spellings, so this is a real\n // translation, not a pass-through.\n const defaultPermission = normalizeToolPolicy(hints?.defaultPermission);\n const description = operation.description ?? operation.summary;\n return {\n name: operation.operationId,\n label: toolLabel(operation),\n operationName: operation.operationId,\n source: \"clicky\",\n ...(group\n ? { group, preferenceKey: group }\n : meta?.surface\n ? { group: meta.surface }\n : {}),\n ...(defaultPermission ? { defaultPermission } : {}),\n ...(parent ? { parent } : {}),\n ...(surface?.entity ? { entity: surface.entity } : {}),\n ...(meta?.verb ? { verb: meta.verb } : {}),\n ...(meta?.actionName ? { action: meta.actionName } : {}),\n ...(meta?.scope ? { scope: meta.scope } : {}),\n ...(icon ? { icon } : {}),\n ...(description ? { description } : {}),\n ...(resolved?.method ? { method: resolved.method.toUpperCase() } : {}),\n ...(resolved?.path ? { path: resolved.path } : {}),\n strict: hints?.strict ?? true,\n annotations: toolAnnotations(operation, resolved, description),\n inputSchema: buildInputSchema(operation),\n };\n}\n\nfunction toolAnnotations(\n operation: OpenAPIOperation,\n resolved: Pick<ResolvedOperation, \"path\" | \"method\"> | undefined,\n description: string | undefined,\n): ToolAnnotations {\n const hints = operation[\"x-clicky\"]?.toolHints;\n const method = resolved?.method?.toUpperCase() ?? \"\";\n const annotations: ToolAnnotations = {};\n const title =\n hints?.title ??\n operation.summary ??\n operation[\"x-clicky\"]?.actionName ??\n description;\n if (title) annotations.title = title;\n if (hints?.readOnlyHint !== undefined) {\n annotations.readOnlyHint = hints.readOnlyHint;\n } else if (resolved?.method?.toUpperCase() === \"GET\") {\n annotations.readOnlyHint = true;\n }\n if (hints?.idempotentHint !== undefined) {\n annotations.idempotentHint = hints.idempotentHint;\n } else if (isIdempotentMethod(method)) {\n annotations.idempotentHint = true;\n }\n if (hints?.destructiveHint !== undefined) {\n annotations.destructiveHint = hints.destructiveHint;\n } else if (isDestructiveTool(operation, resolved)) {\n annotations.destructiveHint = true;\n }\n if (hints?.openWorldHint !== undefined) {\n annotations.openWorldHint = hints.openWorldHint;\n }\n return annotations;\n}\n\nfunction isIdempotentMethod(method: string): boolean {\n return (\n method === \"GET\" ||\n method === \"HEAD\" ||\n method === \"OPTIONS\" ||\n method === \"PUT\" ||\n method === \"DELETE\"\n );\n}\n\nfunction isDestructiveTool(\n operation: OpenAPIOperation,\n resolved: Pick<ResolvedOperation, \"path\" | \"method\"> | undefined,\n): boolean {\n const method = resolved?.method?.toUpperCase() ?? \"\";\n if (method === \"DELETE\") return true;\n if (method === \"GET\" || method === \"HEAD\" || method === \"OPTIONS\")\n return false;\n const text =\n `${resolved?.path ?? \"\"} ${operation.operationId ?? \"\"}`.toLowerCase();\n return /\\b(write|delete|remove|destroy|void|sync|create|update|patch|post)\\b/.test(\n text,\n );\n}\n\nfunction operationToolGroup(operation: OpenAPIOperation): string | undefined {\n const meta = operation[\"x-clicky\"];\n if (meta?.toolHints?.group) return meta.toolHints.group;\n if (meta?.group) return meta.group;\n return undefined;\n}\n\nfunction isCobraHelpOrCompletionOperation(\n operation: OpenAPIOperation,\n resolved?: Pick<ResolvedOperation, \"path\" | \"method\">,\n): boolean {\n return (\n commandStartsWithCobraBuiltin(operation.operationId) ||\n commandStartsWithCobraBuiltin(operation[\"x-clicky\"]?.command) ||\n pathContainsCobraBuiltin(resolved?.path)\n );\n}\n\nfunction commandStartsWithCobraBuiltin(raw: string | undefined): boolean {\n if (!raw) return false;\n const normalized = raw\n .replace(/([a-z\\d])([A-Z])/g, \"$1 $2\")\n .replace(/[/_.-]+/g, \" \")\n .trim()\n .toLowerCase();\n const first = normalized.split(/\\s+/)[0];\n return first === \"completion\" || first === \"help\";\n}\n\nfunction pathContainsCobraBuiltin(path: string | undefined): boolean {\n if (!path) return false;\n const parts = path\n .split(\"/\")\n .filter(Boolean)\n .map((part) => part.toLowerCase());\n const commandParts =\n parts[0] === \"api\" && /^v\\d+$/.test(parts[1] ?? \"\")\n ? parts.slice(2)\n : parts;\n const first = commandParts[0];\n return first === \"completion\" || first === \"help\";\n}\n\n/** A concise popover label: the clicky action/verb (capitalized) when present,\n * else the operation summary, else a humanized operationId. Mirrors the intent\n * of rpc/clickyMetadata.ts `surfaceActionLabel`. */\nfunction toolLabel(operation: OpenAPIOperation): string {\n const meta = operation[\"x-clicky\"];\n const short = meta?.actionName?.trim() || meta?.verb?.trim();\n if (short && short !== \"action\") {\n return short.charAt(0).toUpperCase() + short.slice(1);\n }\n if (operation.summary) {\n return operation.summary;\n }\n return humanize(operation.operationId ?? \"\");\n}\n\nfunction humanize(operationId: string): string {\n const spaced = operationId\n .replace(/[_-]+/g, \" \")\n .replace(/([a-z\\d])([A-Z])/g, \"$1 $2\");\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction buildInputSchema(operation: OpenAPIOperation): ChatToolInputSchema {\n const properties: Record<string, JSONSchemaProperty> = {};\n const required: string[] = [];\n\n for (const param of operation.parameters ?? []) {\n properties[param.name] = parameterToProperty(param);\n if (param.required) {\n required.push(param.name);\n }\n }\n\n const body = requestBodySchema(operation);\n if (body?.properties) {\n for (const [name, schema] of Object.entries(body.properties)) {\n properties[name] = schemaToProperty(schema);\n }\n }\n\n return { type: \"object\", properties, required, additionalProperties: false };\n}\n\nfunction parameterToProperty(param: OpenAPIParameter): JSONSchemaProperty {\n const prop = schemaToProperty(param.schema);\n if (param.description && !prop.description) {\n prop.description = param.description;\n }\n return prop;\n}\n\nfunction schemaToProperty(\n schema: OpenAPISchema | undefined,\n): JSONSchemaProperty {\n if (!schema) {\n return { type: \"string\" };\n }\n const prop: JSONSchemaProperty = { type: jsonSchemaType(schema.type) };\n if (schema.description !== undefined) {\n prop.description = schema.description;\n }\n if (schema.enum !== undefined) {\n prop.enum = schema.enum;\n }\n if (schema.default !== undefined) {\n prop.default = schema.default;\n }\n return prop;\n}\n\nfunction jsonSchemaType(\n type: string | undefined,\n): NonNullable<JSONSchemaProperty[\"type\"]> {\n switch (type) {\n case \"object\":\n case \"array\":\n case \"string\":\n case \"integer\":\n case \"number\":\n case \"boolean\":\n case \"null\":\n return type;\n default:\n return \"string\";\n }\n}\n\nfunction requestBodySchema(\n operation: OpenAPIOperation,\n): OpenAPISchema | undefined {\n const content = operation.requestBody?.content;\n if (!content) {\n return undefined;\n }\n return (\n content[\"application/json\"]?.schema ?? Object.values(content)[0]?.schema\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.cjs","sources":["../../../src/data/chat/types.ts"],"sourcesContent":["import type {\n UIMessage,\n ToolUIPart,\n DynamicToolUIPart,\n ChatStatus,\n ReasoningUIPart,\n FileUIPart,\n} from \"ai\";\nimport type { ReactNode } from \"react\";\nimport type {\n JsonSchemaObject,\n JsonSchemaProperty as FormJsonSchemaProperty,\n} from \"../../components/json-schema-form-types\";\n\nexport type {\n UIMessage,\n ToolUIPart,\n DynamicToolUIPart,\n ChatStatus,\n ReasoningUIPart,\n FileUIPart,\n};\n\n/** A selectable chat model, as served by the backend's GET /api/chat/models.\n * `configured` is false for catalogued models whose provider has no API key. */\nexport interface ChatModelRuntime {\n model?: string;\n id?: string;\n backend?: string;\n mode?: string;\n temperature?: number;\n effort?: string;\n noCache?: boolean;\n fallbacks?: ChatModelRuntime[];\n}\n\nexport type RuntimeAvailabilityState =\n | \"available\"\n | \"disabled\"\n | \"missing_credentials\"\n | \"not_authenticated\"\n | \"missing_executable\"\n | \"missing_dependency\"\n | \"unsupported\"\n | \"unavailable\";\n\nexport interface RuntimeAvailability {\n state: RuntimeAvailabilityState;\n reason?: string;\n remediation?: string;\n}\n\nexport interface ChatModel {\n id: string;\n provider: string;\n label: string;\n /** Exact Captain Model wire value submitted when this display row is selected. */\n runtime?: ChatModelRuntime;\n reasoning: boolean;\n /** True when backend metadata is authoritative, including explicit unsupported values. */\n capabilitiesKnown?: boolean;\n /** Ordered reasoning-effort tiers accepted by this exact model. */\n supportedEfforts?: string[];\n /** Backend-recommended effort used when the current selection is invalid. */\n defaultEffort?: string;\n /** Whether the model honours the temperature sampling control. */\n temperature?: boolean;\n configured?: boolean;\n availability?: RuntimeAvailability;\n /**\n * The catalog's own declared default — the row a picker seeds with when the\n * caller names no model. At most one row carries it, and a catalog that\n * declares none (or whose default is unconfigured) falls back to the first\n * configured row.\n */\n default?: boolean;\n /** Concrete runtime backends that advertised this model. Empty/omitted means provider-wide. */\n backends?: string[];\n /** Max context tokens — the denominator for a usage gauge. */\n contextWindow?: number;\n /** MIME patterns accepted as model inputs, e.g. image/* or application/pdf. */\n inputMediaTypes?: string[];\n}\n\n/** Per-message metadata the backend rides on the SSE `finish` part\n * (`messageMetadata`), applied by the AI SDK to the assistant `UIMessage`. */\nexport interface ChatMessageMetadata {\n backend?: string;\n executionMode?: string;\n model?: string;\n captainSessionId?: string;\n providerSessionId?: string;\n threadId?: string;\n turnId?: string;\n success?: boolean;\n interrupted?: boolean;\n usage?: ChatUsageBreakdown;\n costBreakdown?: ChatCostBreakdown;\n /** This turn's cost in USD. */\n cost?: number;\n /** Cumulative thread cost in USD (when the turn is persisted to a thread). */\n threadCostUsd?: number;\n /** This turn's input-token count, ≈ current context-window occupancy. */\n contextTokens?: number;\n}\n\n/** A flattened usage snapshot a chat surfaces for a gauge: tokens used out of the\n * model's context window, plus cumulative cost. */\nexport interface ChatUsageSummary {\n usedTokens: number;\n maxTokens: number;\n cost?: number;\n usage?: ChatUsageBreakdown;\n costBreakdown?: ChatCostBreakdown;\n messageCount: number;\n backend?: string;\n executionMode?: string;\n model?: string;\n captainSessionId?: string;\n providerSessionId?: string;\n threadId?: string;\n turnId?: string;\n success?: boolean;\n interrupted?: boolean;\n /** @deprecated Use `model`; retained for compatibility with existing consumers. */\n modelLabel?: string;\n}\n\nexport interface ChatBudgetConfig {\n /** Per-thread/request cost cap in USD. */\n cost?: number;\n /** Max output tokens for one model call. */\n maxTokens?: number;\n}\n\nexport interface ChatUsageBreakdown {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n totalTokens?: number;\n}\n\nexport interface ChatCostBreakdown {\n model?: string;\n inputUsd?: number;\n outputUsd?: number;\n reasoningUsd?: number;\n cacheReadUsd?: number;\n cacheWriteUsd?: number;\n totalUsd?: number;\n}\n\n/** A suggested prompt shown on the empty state. A bare string is both the label\n * and the submitted text; the object form separates them. */\nexport type Suggestion = string | { label: string; prompt: string };\n\n/** The label shown for a suggestion. */\nexport function suggestionLabel(s: Suggestion): string {\n return typeof s === \"string\" ? s : s.label;\n}\n\n/** The text submitted when a suggestion is clicked. */\nexport function suggestionPrompt(s: Suggestion): string {\n return typeof s === \"string\" ? s : s.prompt;\n}\n\n/** Returns true for an assistant reasoning (\"thinking\") part. */\nexport function isReasoningPart(part: {\n type: string;\n}): part is ReasoningUIPart {\n return part.type === \"reasoning\";\n}\n\n/** Returns true for a file/attachment part. */\nexport function isFilePart(part: { type: string }): part is FileUIPart {\n return part.type === \"file\";\n}\n\n/** A tool part as it appears in an assistant UIMessage — either a typed\n * `tool-<name>` part or the generic `dynamic-tool` part. clicky operations\n * surface as dynamic tools, so the chat UI renders both shapes. */\nexport type AnyToolPart = ToolUIPart | DynamicToolUIPart;\n\n/** Claude Agent SDK permission modes accepted by `permissionMode`. */\nexport const CLAUDE_PERMISSION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"bypassPermissions\",\n \"plan\",\n \"dontAsk\",\n \"auto\",\n] as const;\n\nexport type ClaudePermissionMode = (typeof CLAUDE_PERMISSION_MODES)[number];\n\nexport type ClaudePermissionModeOption = {\n value: ClaudePermissionMode;\n label: string;\n description: string;\n};\n\nexport const CLAUDE_PERMISSION_MODE_OPTIONS: ClaudePermissionModeOption[] = [\n {\n value: \"default\",\n label: \"Default\",\n description:\n \"Prompt for dangerous operations using standard Claude behavior.\",\n },\n {\n value: \"auto\",\n label: \"Auto\",\n description:\n \"Use Claude's classifier to approve or deny permission prompts.\",\n },\n {\n value: \"acceptEdits\",\n label: \"Accept edits\",\n description: \"Automatically accept file edit operations.\",\n },\n {\n value: \"dontAsk\",\n label: \"Don't ask\",\n description: \"Do not prompt; deny actions that are not pre-approved.\",\n },\n {\n value: \"plan\",\n label: \"Plan\",\n description: \"Planning mode with no tool execution.\",\n },\n {\n value: \"bypassPermissions\",\n label: \"Bypass\",\n description:\n \"Bypass permission checks when explicitly allowed by the host.\",\n },\n];\n\n/** Tool metadata shared by the chat shell. It both configures the\n * tool-preferences popover (`name`/`label`/`group`) and carries the schema\n * derived from a clicky RPC operation (`description`/`inputSchema`). The Go\n * backend owns execution; the client uses this only for display and to scope\n * which tools a request may call (passed in the transport `body`). */\n/** Authority for one tool, in Captain's tool vocabulary. The legacy `on`/`off`\n * spellings are still accepted on the way in (see `normalizeToolPolicyValue`)\n * and mean `allow`/`deny`; they are never produced here. The UI still *labels*\n * these On and Off — see `POLICY_LABEL`. */\nexport type ToolPolicy = \"allow\" | \"ask\" | \"deny\" | \"auto\";\n\n/** Canonicalizes a tool policy from the wire, accepting the legacy `on`/`off`\n * spellings the backend still emits from older catalogs and MCP `_meta`.\n *\n * `on` means allow rather than auto: the catalog encoding has no separate allow\n * list, so `on` was always its way of saying auto-run. Keeping private copies of\n * this rule per call site is how the UI and the server drifted apart, so this is\n * the only one. */\nexport function normalizeToolPolicy(value: unknown): ToolPolicy | undefined {\n if (typeof value !== \"string\") return undefined;\n switch (value.trim().toLowerCase()) {\n case \"allow\":\n case \"on\":\n case \"enabled\":\n return \"allow\";\n case \"ask\":\n return \"ask\";\n case \"deny\":\n case \"off\":\n case \"disabled\":\n return \"deny\";\n case \"auto\":\n return \"auto\";\n default:\n return undefined;\n }\n}\n\nexport interface ToolAnnotations {\n title?: string;\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n idempotentHint?: boolean;\n openWorldHint?: boolean;\n [key: string]: unknown;\n}\n\nexport interface ToolMeta {\n /** Stable tool name sent to the model (the operation id). */\n name: string;\n /** Human-readable label shown in the tool-preferences popover. */\n label: string;\n /** Bucket heading in the popover — the clicky surface for RPC operations. */\n group?: string;\n /** Display title of the tool's parent surface/entity (e.g. \"Xero Accounts\").\n * Used to nest tools under their entity within a group, and as the\n * disambiguating prefix in flat lists so sibling verbs (\"List\", \"Get\") stay\n * distinguishable. Resolved from the operation's `x-clicky.surface`. */\n parent?: string;\n /** Raw entity name of the tool's surface (e.g. \"accounts\"), when known. */\n entity?: string;\n /** Preference key sent to the backend. Defaults to `name`; group-backed\n * clicky tools set this to the backend tool group. */\n preferenceKey?: string;\n /** Initial backend-owned permission when the chat window first sees this tool. */\n defaultPermission?: ToolPolicy;\n /** Opaque icon name emitted by the backend, resolved by the host UI. */\n icon?: string;\n /** Description shown in tool pickers / tool-call headers. */\n description?: string;\n /** Short usage hints shown in the tool browser. */\n hints?: string[];\n source?: \"clicky\" | \"custom\" | \"mcp\" | string;\n server?: string;\n method?: string;\n path?: string;\n operationName?: string;\n /** The entity verb (list/get/create/update/delete, or a custom action), the\n * custom action's name, and whether the operation addresses a collection or a\n * single entity. Carried so a permission rule resolves the same way here as\n * it does on the server; empty for a tool that projects no clicky operation.\n * @see resolveToolPolicy */\n verb?: string;\n action?: string;\n scope?: string;\n title?: string;\n /** Whether the runtime should treat the tool input schema as strict/closed. */\n strict?: boolean;\n /** Runtime tool annotations/hints, e.g. MCP/Genkit well-known hints. */\n annotations?: ToolAnnotations;\n /** JSON-Schema for the tool's input, assembled from an operation's\n * parameters + request body. Omitted for hand-authored tools. */\n inputSchema?: ChatToolInputSchema;\n outputSchema?: ChatToolInputSchema;\n}\n\nexport type ChatToolInputSchema = JsonSchemaObject;\nexport type JsonSchemaProperty = FormJsonSchemaProperty;\nexport type JSONSchemaProperty = FormJsonSchemaProperty;\n\n/** Returns true for a `dynamic-tool` part (clicky operations surface this way). */\nexport function isDynamicToolPart(part: {\n type: string;\n}): part is DynamicToolUIPart {\n return part.type === \"dynamic-tool\";\n}\n\n/** Returns true for a typed `tool-<name>` part. */\nexport function isTypedToolPart(part: { type: string }): part is ToolUIPart {\n return part.type.startsWith(\"tool-\");\n}\n\n/** The display name of a tool part: the explicit `toolName` for dynamic tools,\n * otherwise the suffix after `tool-`. */\nexport function toolPartName(part: AnyToolPart): string {\n if (isDynamicToolPart(part)) {\n return part.toolName;\n }\n return part.type.slice(\"tool-\".length);\n}\n\nexport interface ToolResultRenderArgs {\n part: AnyToolPart;\n toolName: string;\n output: unknown;\n}\n\nexport type ToolResultRenderer = (args: ToolResultRenderArgs) => ReactNode;\n"],"names":[],"mappings":";;AA+JO,SAAS,gBAAgB,GAAuB;AACrD,SAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACvC;AAGO,SAAS,iBAAiB,GAAuB;AACtD,SAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACvC;AAGO,SAAS,gBAAgB,MAEJ;AAC1B,SAAO,KAAK,SAAS;AACvB;AAGO,SAAS,WAAW,MAA4C;AACrE,SAAO,KAAK,SAAS;AACvB;AAQO,MAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUO,MAAM,iCAA+D;AAAA,EAC1E;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aACE;AAAA,EAAA;AAAA,EAEJ;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aACE;AAAA,EAAA;AAAA,EAEJ;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAAA,EAEf;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAAA,EAEf;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAAA,EAEf;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aACE;AAAA,EAAA;AAEN;AAoBO,SAAS,oBAAoB,OAAwC;AAC1E,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,UAAQ,MAAM,KAAA,EAAO,YAAA,GAAY;AAAA,IAC/B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAiEO,SAAS,kBAAkB,MAEJ;AAC5B,SAAO,KAAK,SAAS;AACvB;AAGO,SAAS,gBAAgB,MAA4C;AAC1E,SAAO,KAAK,KAAK,WAAW,OAAO;AACrC;AAIO,SAAS,aAAa,MAA2B;AACtD,MAAI,kBAAkB,IAAI,GAAG;AAC3B,WAAO,KAAK;AAAA,EACd;AACA,SAAO,KAAK,KAAK,MAAM,QAAQ,MAAM;AACvC;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"types.cjs","sources":["../../../src/data/chat/types.ts"],"sourcesContent":["import type {\n UIMessage,\n ToolUIPart,\n DynamicToolUIPart,\n ChatStatus,\n ReasoningUIPart,\n FileUIPart,\n} from \"ai\";\nimport type { ReactNode } from \"react\";\nimport type {\n JsonSchemaObject,\n JsonSchemaProperty as FormJsonSchemaProperty,\n} from \"../../components/json-schema-form-types\";\n\nexport type {\n UIMessage,\n ToolUIPart,\n DynamicToolUIPart,\n ChatStatus,\n ReasoningUIPart,\n FileUIPart,\n};\n\n/** A selectable chat model, as served by the backend's GET /api/chat/models.\n * `configured` is false for catalogued models whose provider has no API key. */\nexport interface ChatModelRuntime {\n model?: string;\n id?: string;\n /** The canonical `spec.mode`: api | agent | cli | cmux. */\n mode?: string;\n temperature?: number;\n effort?: string;\n noCache?: boolean;\n fallbacks?: ChatModelRuntime[];\n}\n\nexport type RuntimeAvailabilityState =\n | \"available\"\n | \"disabled\"\n | \"missing_credentials\"\n | \"not_authenticated\"\n | \"missing_executable\"\n | \"missing_dependency\"\n | \"unsupported\"\n | \"unavailable\";\n\nexport interface RuntimeAvailability {\n state: RuntimeAvailabilityState;\n reason?: string;\n remediation?: string;\n}\n\nexport interface ChatModel {\n id: string;\n provider: string;\n label: string;\n /** Exact Captain Model wire value submitted when this display row is selected. */\n runtime?: ChatModelRuntime;\n reasoning: boolean;\n /** True when backend metadata is authoritative, including explicit unsupported values. */\n capabilitiesKnown?: boolean;\n /** Ordered reasoning-effort tiers accepted by this exact model. */\n supportedEfforts?: string[];\n /** Backend-recommended effort used when the current selection is invalid. */\n defaultEffort?: string;\n /** Whether the model honours the temperature sampling control. */\n temperature?: boolean;\n configured?: boolean;\n availability?: RuntimeAvailability;\n /**\n * The catalog's own declared default — the row a picker seeds with when the\n * caller names no model. At most one row carries it, and a catalog that\n * declares none (or whose default is unconfigured) falls back to the first\n * configured row.\n */\n default?: boolean;\n /** Max context tokens — the denominator for a usage gauge. */\n contextWindow?: number;\n /** MIME patterns accepted as model inputs, e.g. image/* or application/pdf. */\n inputMediaTypes?: string[];\n}\n\n/** Per-message metadata the backend rides on the SSE `finish` part\n * (`messageMetadata`), applied by the AI SDK to the assistant `UIMessage`. */\nexport interface ChatMessageMetadata {\n /** The provider family that served the turn: anthropic | openai | google | deepseek. */\n provider?: string;\n /** The mechanism it ran on: api | agent | cli | cmux. */\n mode?: string;\n executionMode?: string;\n model?: string;\n captainSessionId?: string;\n providerSessionId?: string;\n threadId?: string;\n turnId?: string;\n success?: boolean;\n interrupted?: boolean;\n usage?: ChatUsageBreakdown;\n costBreakdown?: ChatCostBreakdown;\n /** This turn's cost in USD. */\n cost?: number;\n /** Cumulative thread cost in USD (when the turn is persisted to a thread). */\n threadCostUsd?: number;\n /** This turn's input-token count, ≈ current context-window occupancy. */\n contextTokens?: number;\n}\n\n/** A flattened usage snapshot a chat surfaces for a gauge: tokens used out of the\n * model's context window, plus cumulative cost. */\nexport interface ChatUsageSummary {\n usedTokens: number;\n maxTokens: number;\n cost?: number;\n usage?: ChatUsageBreakdown;\n costBreakdown?: ChatCostBreakdown;\n messageCount: number;\n provider?: string;\n mode?: string;\n executionMode?: string;\n model?: string;\n captainSessionId?: string;\n providerSessionId?: string;\n threadId?: string;\n turnId?: string;\n success?: boolean;\n interrupted?: boolean;\n /** @deprecated Use `model`; retained for compatibility with existing consumers. */\n modelLabel?: string;\n}\n\nexport interface ChatBudgetConfig {\n /** Per-thread/request cost cap in USD. */\n cost?: number;\n /** Max output tokens for one model call. */\n maxTokens?: number;\n}\n\nexport interface ChatUsageBreakdown {\n inputTokens?: number;\n outputTokens?: number;\n reasoningTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n totalTokens?: number;\n}\n\nexport interface ChatCostBreakdown {\n model?: string;\n inputUsd?: number;\n outputUsd?: number;\n reasoningUsd?: number;\n cacheReadUsd?: number;\n cacheWriteUsd?: number;\n totalUsd?: number;\n}\n\n/** A suggested prompt shown on the empty state. A bare string is both the label\n * and the submitted text; the object form separates them. */\nexport type Suggestion = string | { label: string; prompt: string };\n\n/** The label shown for a suggestion. */\nexport function suggestionLabel(s: Suggestion): string {\n return typeof s === \"string\" ? s : s.label;\n}\n\n/** The text submitted when a suggestion is clicked. */\nexport function suggestionPrompt(s: Suggestion): string {\n return typeof s === \"string\" ? s : s.prompt;\n}\n\n/** Returns true for an assistant reasoning (\"thinking\") part. */\nexport function isReasoningPart(part: {\n type: string;\n}): part is ReasoningUIPart {\n return part.type === \"reasoning\";\n}\n\n/** Returns true for a file/attachment part. */\nexport function isFilePart(part: { type: string }): part is FileUIPart {\n return part.type === \"file\";\n}\n\n/** A tool part as it appears in an assistant UIMessage — either a typed\n * `tool-<name>` part or the generic `dynamic-tool` part. clicky operations\n * surface as dynamic tools, so the chat UI renders both shapes. */\nexport type AnyToolPart = ToolUIPart | DynamicToolUIPart;\n\n/** Claude Agent SDK permission modes accepted by `permissionMode`. */\nexport const CLAUDE_PERMISSION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"bypassPermissions\",\n \"plan\",\n \"dontAsk\",\n \"auto\",\n] as const;\n\nexport type ClaudePermissionMode = (typeof CLAUDE_PERMISSION_MODES)[number];\n\nexport type ClaudePermissionModeOption = {\n value: ClaudePermissionMode;\n label: string;\n description: string;\n};\n\nexport const CLAUDE_PERMISSION_MODE_OPTIONS: ClaudePermissionModeOption[] = [\n {\n value: \"default\",\n label: \"Default\",\n description:\n \"Prompt for dangerous operations using standard Claude behavior.\",\n },\n {\n value: \"auto\",\n label: \"Auto\",\n description:\n \"Use Claude's classifier to approve or deny permission prompts.\",\n },\n {\n value: \"acceptEdits\",\n label: \"Accept edits\",\n description: \"Automatically accept file edit operations.\",\n },\n {\n value: \"dontAsk\",\n label: \"Don't ask\",\n description: \"Do not prompt; deny actions that are not pre-approved.\",\n },\n {\n value: \"plan\",\n label: \"Plan\",\n description: \"Planning mode with no tool execution.\",\n },\n {\n value: \"bypassPermissions\",\n label: \"Bypass\",\n description:\n \"Bypass permission checks when explicitly allowed by the host.\",\n },\n];\n\n/** Tool metadata shared by the chat shell. It both configures the\n * tool-preferences popover (`name`/`label`/`group`) and carries the schema\n * derived from a clicky RPC operation (`description`/`inputSchema`). The Go\n * backend owns execution; the client uses this only for display and to scope\n * which tools a request may call (passed in the transport `body`). */\n/** Authority for one tool, in Captain's tool vocabulary. The legacy `on`/`off`\n * spellings are still accepted on the way in (see `normalizeToolPolicyValue`)\n * and mean `allow`/`deny`; they are never produced here. The UI still *labels*\n * these On and Off — see `POLICY_LABEL`. */\nexport type ToolPolicy = \"allow\" | \"ask\" | \"deny\" | \"auto\";\n\n/** Canonicalizes a tool policy from the wire, accepting the legacy `on`/`off`\n * spellings the backend still emits from older catalogs and MCP `_meta`.\n *\n * `on` means allow rather than auto: the catalog encoding has no separate allow\n * list, so `on` was always its way of saying auto-run. Keeping private copies of\n * this rule per call site is how the UI and the server drifted apart, so this is\n * the only one. */\nexport function normalizeToolPolicy(value: unknown): ToolPolicy | undefined {\n if (typeof value !== \"string\") return undefined;\n switch (value.trim().toLowerCase()) {\n case \"allow\":\n case \"on\":\n case \"enabled\":\n return \"allow\";\n case \"ask\":\n return \"ask\";\n case \"deny\":\n case \"off\":\n case \"disabled\":\n return \"deny\";\n case \"auto\":\n return \"auto\";\n default:\n return undefined;\n }\n}\n\nexport interface ToolAnnotations {\n title?: string;\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n idempotentHint?: boolean;\n openWorldHint?: boolean;\n [key: string]: unknown;\n}\n\nexport interface ToolMeta {\n /** Stable tool name sent to the model (the operation id). */\n name: string;\n /** Human-readable label shown in the tool-preferences popover. */\n label: string;\n /** Bucket heading in the popover — the clicky surface for RPC operations. */\n group?: string;\n /** Display title of the tool's parent surface/entity (e.g. \"Xero Accounts\").\n * Used to nest tools under their entity within a group, and as the\n * disambiguating prefix in flat lists so sibling verbs (\"List\", \"Get\") stay\n * distinguishable. Resolved from the operation's `x-clicky.surface`. */\n parent?: string;\n /** Raw entity name of the tool's surface (e.g. \"accounts\"), when known. */\n entity?: string;\n /** Preference key sent to the backend. Defaults to `name`; group-backed\n * clicky tools set this to the backend tool group. */\n preferenceKey?: string;\n /** Initial backend-owned permission when the chat window first sees this tool. */\n defaultPermission?: ToolPolicy;\n /** Opaque icon name emitted by the backend, resolved by the host UI. */\n icon?: string;\n /** Description shown in tool pickers / tool-call headers. */\n description?: string;\n /** Short usage hints shown in the tool browser. */\n hints?: string[];\n source?: \"clicky\" | \"custom\" | \"mcp\" | string;\n server?: string;\n method?: string;\n path?: string;\n operationName?: string;\n /** The entity verb (list/get/create/update/delete, or a custom action), the\n * custom action's name, and whether the operation addresses a collection or a\n * single entity. Carried so a permission rule resolves the same way here as\n * it does on the server; empty for a tool that projects no clicky operation.\n * @see resolveToolPolicy */\n verb?: string;\n action?: string;\n scope?: string;\n title?: string;\n /** Whether the runtime should treat the tool input schema as strict/closed. */\n strict?: boolean;\n /** Runtime tool annotations/hints, e.g. MCP/Genkit well-known hints. */\n annotations?: ToolAnnotations;\n /** JSON-Schema for the tool's input, assembled from an operation's\n * parameters + request body. Omitted for hand-authored tools. */\n inputSchema?: ChatToolInputSchema;\n outputSchema?: ChatToolInputSchema;\n}\n\nexport type ChatToolInputSchema = JsonSchemaObject;\nexport type JsonSchemaProperty = FormJsonSchemaProperty;\nexport type JSONSchemaProperty = FormJsonSchemaProperty;\n\n/** Returns true for a `dynamic-tool` part (clicky operations surface this way). */\nexport function isDynamicToolPart(part: {\n type: string;\n}): part is DynamicToolUIPart {\n return part.type === \"dynamic-tool\";\n}\n\n/** Returns true for a typed `tool-<name>` part. */\nexport function isTypedToolPart(part: { type: string }): part is ToolUIPart {\n return part.type.startsWith(\"tool-\");\n}\n\n/** The display name of a tool part: the explicit `toolName` for dynamic tools,\n * otherwise the suffix after `tool-`. */\nexport function toolPartName(part: AnyToolPart): string {\n if (isDynamicToolPart(part)) {\n return part.toolName;\n }\n return part.type.slice(\"tool-\".length);\n}\n\nexport interface ToolResultRenderArgs {\n part: AnyToolPart;\n toolName: string;\n output: unknown;\n}\n\nexport type ToolResultRenderer = (args: ToolResultRenderArgs) => ReactNode;\n"],"names":[],"mappings":";;AAiKO,SAAS,gBAAgB,GAAuB;AACrD,SAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACvC;AAGO,SAAS,iBAAiB,GAAuB;AACtD,SAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACvC;AAGO,SAAS,gBAAgB,MAEJ;AAC1B,SAAO,KAAK,SAAS;AACvB;AAGO,SAAS,WAAW,MAA4C;AACrE,SAAO,KAAK,SAAS;AACvB;AAQO,MAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUO,MAAM,iCAA+D;AAAA,EAC1E;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aACE;AAAA,EAAA;AAAA,EAEJ;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aACE;AAAA,EAAA;AAAA,EAEJ;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAAA,EAEf;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAAA,EAEf;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAAA,EAEf;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aACE;AAAA,EAAA;AAEN;AAoBO,SAAS,oBAAoB,OAAwC;AAC1E,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,UAAQ,MAAM,KAAA,EAAO,YAAA,GAAY;AAAA,IAC/B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAiEO,SAAS,kBAAkB,MAEJ;AAC5B,SAAO,KAAK,SAAS;AACvB;AAGO,SAAS,gBAAgB,MAA4C;AAC1E,SAAO,KAAK,KAAK,WAAW,OAAO;AACrC;AAIO,SAAS,aAAa,MAA2B;AACtD,MAAI,kBAAkB,IAAI,GAAG;AAC3B,WAAO,KAAK;AAAA,EACd;AACA,SAAO,KAAK,KAAK,MAAM,QAAQ,MAAM;AACvC;;;;;;;;;;;"}
|