@flanksource/clicky-ui 0.3.22 → 0.3.24
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/dist/components/CountryFlag.cjs +55 -0
- package/dist/components/CountryFlag.cjs.map +1 -0
- package/dist/components/CountryFlag.d.ts +8 -0
- package/dist/components/CountryFlag.d.ts.map +1 -0
- package/dist/components/CountryFlag.js +38 -0
- package/dist/components/CountryFlag.js.map +1 -0
- package/dist/components/CountryPicker.cjs +35 -0
- package/dist/components/CountryPicker.cjs.map +1 -0
- package/dist/components/CountryPicker.d.ts +4 -0
- package/dist/components/CountryPicker.d.ts.map +1 -0
- package/dist/components/CountryPicker.js +35 -0
- package/dist/components/CountryPicker.js.map +1 -0
- package/dist/components/SplitButton.cjs +3 -2
- package/dist/components/SplitButton.cjs.map +1 -1
- package/dist/components/SplitButton.d.ts +6 -1
- package/dist/components/SplitButton.d.ts.map +1 -1
- package/dist/components/SplitButton.js +3 -2
- package/dist/components/SplitButton.js.map +1 -1
- package/dist/components/country-options.cjs +34 -0
- package/dist/components/country-options.cjs.map +1 -0
- package/dist/components/country-options.d.ts +8 -0
- package/dist/components/country-options.d.ts.map +1 -0
- package/dist/components/country-options.js +34 -0
- package/dist/components/country-options.js.map +1 -0
- package/dist/components.cjs +11 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +4 -0
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +11 -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.d.ts.map +1 -1
- package/dist/data/Clicky.js +4 -1
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/CodeDiff.cjs +3 -18
- package/dist/data/CodeDiff.cjs.map +1 -1
- package/dist/data/CodeDiff.d.ts.map +1 -1
- package/dist/data/CodeDiff.js +3 -18
- package/dist/data/CodeDiff.js.map +1 -1
- package/dist/data/DataTable.cjs +182 -64
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +9 -1
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.grouping.cjs +26 -0
- package/dist/data/DataTable.grouping.cjs.map +1 -1
- package/dist/data/DataTable.grouping.d.ts +38 -0
- package/dist/data/DataTable.grouping.d.ts.map +1 -1
- package/dist/data/DataTable.grouping.js +26 -0
- package/dist/data/DataTable.grouping.js.map +1 -1
- package/dist/data/DataTable.js +183 -65
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/DataTableGroupingControls.cjs +84 -0
- package/dist/data/DataTableGroupingControls.cjs.map +1 -0
- package/dist/data/DataTableGroupingControls.d.ts +17 -0
- package/dist/data/DataTableGroupingControls.d.ts.map +1 -0
- package/dist/data/DataTableGroupingControls.js +84 -0
- package/dist/data/DataTableGroupingControls.js.map +1 -0
- package/dist/data/HighlightedTokens.cjs +21 -0
- package/dist/data/HighlightedTokens.cjs.map +1 -0
- package/dist/data/HighlightedTokens.d.ts +6 -0
- package/dist/data/HighlightedTokens.d.ts.map +1 -0
- package/dist/data/HighlightedTokens.js +21 -0
- package/dist/data/HighlightedTokens.js.map +1 -0
- package/dist/data/ai/AdvancedChatConfig.cjs +3 -0
- package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.d.ts +2 -1
- package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.js +3 -0
- package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +77 -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 +78 -5
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.cjs +19 -4
- package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.d.ts +2 -0
- package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.js +19 -4
- package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
- package/dist/data/ai/ChatWindow.test-utils.d.ts +2 -1
- package/dist/data/ai/ChatWindow.test-utils.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +8 -1
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts +2 -1
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +8 -1
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/chat/Chat.cjs +26 -3
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +9 -1
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +26 -3
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.cjs +2 -0
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.d.ts +2 -1
- package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.js +2 -0
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
- package/dist/data/chat/Message.cjs +36 -1
- package/dist/data/chat/Message.cjs.map +1 -1
- package/dist/data/chat/Message.d.ts +1 -1
- package/dist/data/chat/Message.d.ts.map +1 -1
- package/dist/data/chat/Message.js +37 -2
- package/dist/data/chat/Message.js.map +1 -1
- package/dist/data/chat/approval.cjs +17 -0
- package/dist/data/chat/approval.cjs.map +1 -1
- package/dist/data/chat/approval.d.ts +5 -0
- package/dist/data/chat/approval.d.ts.map +1 -1
- package/dist/data/chat/approval.js +17 -0
- package/dist/data/chat/approval.js.map +1 -1
- package/dist/data/chat/fork-seed.cjs +22 -0
- package/dist/data/chat/fork-seed.cjs.map +1 -0
- package/dist/data/chat/fork-seed.d.ts +8 -0
- package/dist/data/chat/fork-seed.d.ts.map +1 -0
- package/dist/data/chat/fork-seed.js +22 -0
- package/dist/data/chat/fork-seed.js.map +1 -0
- package/dist/data/code-highlight.cjs +0 -6
- package/dist/data/code-highlight.cjs.map +1 -1
- package/dist/data/code-highlight.d.ts +4 -3
- package/dist/data/code-highlight.d.ts.map +1 -1
- package/dist/data/code-highlight.js +1 -7
- package/dist/data/code-highlight.js.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +6 -2
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +8 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +6 -2
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.cjs +29 -5
- package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.js +29 -5
- package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.cjs +54 -24
- package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts +2 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.js +54 -24
- package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.utils.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts +3 -0
- package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.utils.js.map +1 -1
- package/dist/data/diagnostics/JvmStackTrace.cjs +14 -30
- package/dist/data/diagnostics/JvmStackTrace.cjs.map +1 -1
- package/dist/data/diagnostics/JvmStackTrace.d.ts +6 -9
- package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -1
- package/dist/data/diagnostics/JvmStackTrace.js +15 -31
- package/dist/data/diagnostics/JvmStackTrace.js.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.cjs +14 -144
- package/dist/data/diagnostics/RenderedStackTrace.cjs.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.d.ts +6 -6
- package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -1
- package/dist/data/diagnostics/RenderedStackTrace.js +15 -145
- package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -1
- package/dist/data/diagnostics/StackFrameRow.cjs +65 -0
- package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -0
- package/dist/data/diagnostics/StackFrameRow.d.ts +13 -0
- package/dist/data/diagnostics/StackFrameRow.d.ts.map +1 -0
- package/dist/data/diagnostics/StackFrameRow.js +65 -0
- package/dist/data/diagnostics/StackFrameRow.js.map +1 -0
- package/dist/data/diagnostics/ThreadCard.cjs +9 -2
- package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
- package/dist/data/diagnostics/ThreadCard.d.ts +3 -1
- package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
- package/dist/data/diagnostics/ThreadCard.js +9 -2
- package/dist/data/diagnostics/ThreadCard.js.map +1 -1
- package/dist/data/diagnostics/frame-heuristics.cjs +26 -0
- package/dist/data/diagnostics/frame-heuristics.cjs.map +1 -0
- package/dist/data/diagnostics/frame-heuristics.d.ts +5 -0
- package/dist/data/diagnostics/frame-heuristics.d.ts.map +1 -0
- package/dist/data/diagnostics/frame-heuristics.js +26 -0
- package/dist/data/diagnostics/frame-heuristics.js.map +1 -0
- package/dist/data/diagnostics/jvm-stacktrace.cjs +5 -7
- package/dist/data/diagnostics/jvm-stacktrace.cjs.map +1 -1
- package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -1
- package/dist/data/diagnostics/jvm-stacktrace.js +5 -7
- package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -1
- package/dist/data/diagnostics/stacktrace-parse.cjs +4 -9
- package/dist/data/diagnostics/stacktrace-parse.cjs.map +1 -1
- package/dist/data/diagnostics/stacktrace-parse.d.ts.map +1 -1
- package/dist/data/diagnostics/stacktrace-parse.js +4 -9
- package/dist/data/diagnostics/stacktrace-parse.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.cjs +3 -0
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts +3 -1
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.js +3 -0
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/runtime/RuntimeBarCombo.cjs +15 -1
- package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarCombo.d.ts +2 -1
- package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarCombo.js +15 -1
- package/dist/data/runtime/RuntimeBarCombo.js.map +1 -1
- package/dist/data/runtime/RuntimeBarSegments.cjs +7 -0
- package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarSegments.d.ts +2 -1
- package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarSegments.js +7 -0
- package/dist/data/runtime/RuntimeBarSegments.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +7 -1
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +4 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +8 -2
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +18 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/rpc/CommandForm.cjs +8 -18
- package/dist/rpc/CommandForm.cjs.map +1 -1
- package/dist/rpc/CommandForm.d.ts +8 -2
- package/dist/rpc/CommandForm.d.ts.map +1 -1
- package/dist/rpc/CommandForm.js +9 -19
- package/dist/rpc/CommandForm.js.map +1 -1
- package/dist/rpc/OperationActionDialog.cjs +3 -3
- package/dist/rpc/OperationActionDialog.cjs.map +1 -1
- package/dist/rpc/OperationActionDialog.js +3 -3
- package/dist/rpc/OperationActionDialog.js.map +1 -1
- package/dist/rpc/OperationCommandPage.cjs +7 -7
- package/dist/rpc/OperationCommandPage.cjs.map +1 -1
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
- package/dist/rpc/OperationCommandPage.js +7 -7
- package/dist/rpc/OperationCommandPage.js.map +1 -1
- package/dist/rpc/apiClient.cjs +17 -3
- package/dist/rpc/apiClient.cjs.map +1 -1
- package/dist/rpc/apiClient.d.ts +4 -4
- package/dist/rpc/apiClient.d.ts.map +1 -1
- package/dist/rpc/apiClient.js +17 -3
- package/dist/rpc/apiClient.js.map +1 -1
- package/dist/rpc/formMetadata.cjs +5 -9
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.d.ts +3 -3
- package/dist/rpc/formMetadata.d.ts.map +1 -1
- package/dist/rpc/formMetadata.js +5 -9
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -1
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +1 -0
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/rpc/useOperations.cjs.map +1 -1
- package/dist/rpc/useOperations.d.ts +4 -4
- package/dist/rpc/useOperations.d.ts.map +1 -1
- package/dist/rpc/useOperations.js.map +1 -1
- package/dist/rpc.d.ts +2 -2
- package/dist/rpc.d.ts.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatWindow.runtime.cjs","sources":["../../../src/data/ai/ChatWindow.runtime.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport type { ChatProps } from \"../chat/Chat\";\nimport {\n resolveChatRuntime,\n selectedChatModel,\n withRuntimeField,\n} from \"../chat/Chat.runtime\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { selectConfiguredChatModel } from \"./ChatWindow.models\";\n\nexport type ChatWindowRuntimeOptions = {\n chat?: Partial<ChatProps> | undefined;\n initialModel?: string | null | undefined;\n models: ChatModel[];\n storedRuntime?: ChatModelRuntime | undefined;\n};\n\nexport function useChatWindowRuntime({\n chat,\n initialModel,\n models,\n storedRuntime,\n}: ChatWindowRuntimeOptions) {\n const reasoningEfforts
|
|
1
|
+
{"version":3,"file":"ChatWindow.runtime.cjs","sources":["../../../src/data/ai/ChatWindow.runtime.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport type { ChatProps } from \"../chat/Chat\";\nimport {\n resolveChatRuntime,\n selectedChatModel,\n withRuntimeField,\n} from \"../chat/Chat.runtime\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { selectConfiguredChatModel } from \"./ChatWindow.models\";\n\nexport type ChatWindowRuntimeOptions = {\n chat?: Partial<ChatProps> | undefined;\n initialModel?: string | null | undefined;\n models: ChatModel[];\n storedRuntime?: ChatModelRuntime | undefined;\n};\n\nexport function useChatWindowRuntime({\n chat,\n initialModel,\n models,\n storedRuntime,\n}: ChatWindowRuntimeOptions) {\n const reasoningEfforts = chat?.reasoningEfforts ?? DEFAULT_REASONING_EFFORTS;\n const [runtime, setRuntime] = useState<ChatModelRuntime>(() =>\n resolveChatRuntime({\n models,\n current: chat?.runtime ?? chat?.defaultRuntime ?? storedRuntime,\n preferredModel:\n initialModel ??\n chat?.model ??\n (chat?.runtime || chat?.defaultRuntime || storedRuntime\n ? undefined\n : chat?.defaultModel),\n effort: chat?.reasoningEffort ?? chat?.defaultReasoningEffort,\n temperature: chat?.temperature,\n reasoningEfforts,\n }),\n );\n\n useEffect(() => {\n if (chat?.runtime) {\n setRuntime(chat.runtime);\n return;\n }\n setRuntime((current) => {\n const currentModel = selectedChatModel(models, current)?.id;\n const preferred =\n initialModel ??\n chat?.model ??\n currentModel ??\n current.id ??\n current.model ??\n chat?.defaultModel;\n const configured = models.length\n ? selectConfiguredChatModel(preferred, models)\n : preferred;\n return resolveChatRuntime({\n models,\n current,\n preferredModel: configured,\n effort: chat?.reasoningEffort,\n temperature: chat?.temperature,\n reasoningEfforts,\n });\n });\n }, [\n chat?.defaultModel,\n chat?.model,\n chat?.reasoningEffort,\n chat?.runtime,\n chat?.temperature,\n initialModel,\n models,\n reasoningEfforts,\n ]);\n\n const selectedModel = selectedChatModel(models, runtime);\n const model = selectedModel?.id ?? runtime.id ?? runtime.model;\n const reasoningEffort = runtime.effort ?? \"\";\n\n const handleRuntimeChange = useCallback(\n (next: ChatModelRuntime) => {\n setRuntime(next);\n chat?.onRuntimeChange?.(next);\n },\n [chat],\n );\n const handleModelChange = useCallback(\n (next: string) => {\n setRuntime((current) => {\n if (!next) {\n return withRuntimeField(\n withRuntimeField(current, \"id\", undefined),\n \"model\",\n undefined,\n );\n }\n const selected = models.find((candidate) => candidate.id === next);\n if (!selected) {\n return withRuntimeField(\n withRuntimeField(current, \"id\", undefined),\n \"model\",\n next,\n );\n }\n return resolveChatRuntime({\n models,\n current,\n preferredModel: selected.id,\n reasoningEfforts,\n });\n });\n chat?.onModelChange?.(next);\n },\n [chat, models, reasoningEfforts],\n );\n const handleReasoningEffortChange = useCallback(\n (next: string) => {\n setRuntime((current) => withRuntimeField(current, \"effort\", next));\n chat?.onReasoningEffortChange?.(next);\n },\n [chat],\n );\n const handleTemperatureChange = useCallback((next: number | undefined) => {\n setRuntime((current) => withRuntimeField(current, \"temperature\", next));\n }, []);\n const replaceRuntimeIdentity = useCallback((identity: ChatModelRuntime) => {\n setRuntime((current) => {\n const next: ChatModelRuntime = { ...current };\n delete next.id;\n delete next.mode;\n delete next.model;\n delete next.backend;\n if (identity.model) next.model = identity.model;\n if (identity.backend) next.backend = identity.backend;\n return next;\n });\n }, []);\n const replaceRuntime = useCallback((next: ChatModelRuntime) => {\n setRuntime(next);\n }, []);\n\n return {\n runtime,\n model,\n reasoningEffort,\n temperature: runtime.temperature,\n reasoningEfforts,\n handleRuntimeChange,\n handleModelChange,\n handleReasoningEffortChange,\n handleTemperatureChange,\n replaceRuntimeIdentity,\n replaceRuntime,\n };\n}\n"],"names":["DEFAULT_REASONING_EFFORTS","useState","resolveChatRuntime","useEffect","selectedChatModel","selectConfiguredChatModel","useCallback","withRuntimeField"],"mappings":"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"}
|
|
@@ -16,5 +16,7 @@ export declare function useChatWindowRuntime({ chat, initialModel, models, store
|
|
|
16
16
|
handleModelChange: (next: string) => void;
|
|
17
17
|
handleReasoningEffortChange: (next: string) => void;
|
|
18
18
|
handleTemperatureChange: (next: number | undefined) => void;
|
|
19
|
+
replaceRuntimeIdentity: (identity: ChatModelRuntime) => void;
|
|
20
|
+
replaceRuntime: (next: ChatModelRuntime) => void;
|
|
19
21
|
};
|
|
20
22
|
//# sourceMappingURL=ChatWindow.runtime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatWindow.runtime.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatWindow.runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAO9C,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjE,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAC9C,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,aAAa,GACd,EAAE,wBAAwB;;;;;;
|
|
1
|
+
{"version":3,"file":"ChatWindow.runtime.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatWindow.runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAO9C,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjE,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAC9C,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,aAAa,GACd,EAAE,wBAAwB;;;;;;gCA4DhB,gBAAgB;8BAOhB,MAAM;wCA6BN,MAAM;oCAMoC,MAAM,GAAG,SAAS;uCAGf,gBAAgB;2BAY5B,gBAAgB;EAiB3D"}
|
|
@@ -98,9 +98,22 @@ function useChatWindowRuntime({
|
|
|
98
98
|
[chat]
|
|
99
99
|
);
|
|
100
100
|
const handleTemperatureChange = useCallback((next) => {
|
|
101
|
-
setRuntime(
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
setRuntime((current) => withRuntimeField(current, "temperature", next));
|
|
102
|
+
}, []);
|
|
103
|
+
const replaceRuntimeIdentity = useCallback((identity) => {
|
|
104
|
+
setRuntime((current) => {
|
|
105
|
+
const next = { ...current };
|
|
106
|
+
delete next.id;
|
|
107
|
+
delete next.mode;
|
|
108
|
+
delete next.model;
|
|
109
|
+
delete next.backend;
|
|
110
|
+
if (identity.model) next.model = identity.model;
|
|
111
|
+
if (identity.backend) next.backend = identity.backend;
|
|
112
|
+
return next;
|
|
113
|
+
});
|
|
114
|
+
}, []);
|
|
115
|
+
const replaceRuntime = useCallback((next) => {
|
|
116
|
+
setRuntime(next);
|
|
104
117
|
}, []);
|
|
105
118
|
return {
|
|
106
119
|
runtime,
|
|
@@ -111,7 +124,9 @@ function useChatWindowRuntime({
|
|
|
111
124
|
handleRuntimeChange,
|
|
112
125
|
handleModelChange,
|
|
113
126
|
handleReasoningEffortChange,
|
|
114
|
-
handleTemperatureChange
|
|
127
|
+
handleTemperatureChange,
|
|
128
|
+
replaceRuntimeIdentity,
|
|
129
|
+
replaceRuntime
|
|
115
130
|
};
|
|
116
131
|
}
|
|
117
132
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatWindow.runtime.js","sources":["../../../src/data/ai/ChatWindow.runtime.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport type { ChatProps } from \"../chat/Chat\";\nimport {\n resolveChatRuntime,\n selectedChatModel,\n withRuntimeField,\n} from \"../chat/Chat.runtime\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { selectConfiguredChatModel } from \"./ChatWindow.models\";\n\nexport type ChatWindowRuntimeOptions = {\n chat?: Partial<ChatProps> | undefined;\n initialModel?: string | null | undefined;\n models: ChatModel[];\n storedRuntime?: ChatModelRuntime | undefined;\n};\n\nexport function useChatWindowRuntime({\n chat,\n initialModel,\n models,\n storedRuntime,\n}: ChatWindowRuntimeOptions) {\n const reasoningEfforts
|
|
1
|
+
{"version":3,"file":"ChatWindow.runtime.js","sources":["../../../src/data/ai/ChatWindow.runtime.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport type { ChatProps } from \"../chat/Chat\";\nimport {\n resolveChatRuntime,\n selectedChatModel,\n withRuntimeField,\n} from \"../chat/Chat.runtime\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { selectConfiguredChatModel } from \"./ChatWindow.models\";\n\nexport type ChatWindowRuntimeOptions = {\n chat?: Partial<ChatProps> | undefined;\n initialModel?: string | null | undefined;\n models: ChatModel[];\n storedRuntime?: ChatModelRuntime | undefined;\n};\n\nexport function useChatWindowRuntime({\n chat,\n initialModel,\n models,\n storedRuntime,\n}: ChatWindowRuntimeOptions) {\n const reasoningEfforts = chat?.reasoningEfforts ?? DEFAULT_REASONING_EFFORTS;\n const [runtime, setRuntime] = useState<ChatModelRuntime>(() =>\n resolveChatRuntime({\n models,\n current: chat?.runtime ?? chat?.defaultRuntime ?? storedRuntime,\n preferredModel:\n initialModel ??\n chat?.model ??\n (chat?.runtime || chat?.defaultRuntime || storedRuntime\n ? undefined\n : chat?.defaultModel),\n effort: chat?.reasoningEffort ?? chat?.defaultReasoningEffort,\n temperature: chat?.temperature,\n reasoningEfforts,\n }),\n );\n\n useEffect(() => {\n if (chat?.runtime) {\n setRuntime(chat.runtime);\n return;\n }\n setRuntime((current) => {\n const currentModel = selectedChatModel(models, current)?.id;\n const preferred =\n initialModel ??\n chat?.model ??\n currentModel ??\n current.id ??\n current.model ??\n chat?.defaultModel;\n const configured = models.length\n ? selectConfiguredChatModel(preferred, models)\n : preferred;\n return resolveChatRuntime({\n models,\n current,\n preferredModel: configured,\n effort: chat?.reasoningEffort,\n temperature: chat?.temperature,\n reasoningEfforts,\n });\n });\n }, [\n chat?.defaultModel,\n chat?.model,\n chat?.reasoningEffort,\n chat?.runtime,\n chat?.temperature,\n initialModel,\n models,\n reasoningEfforts,\n ]);\n\n const selectedModel = selectedChatModel(models, runtime);\n const model = selectedModel?.id ?? runtime.id ?? runtime.model;\n const reasoningEffort = runtime.effort ?? \"\";\n\n const handleRuntimeChange = useCallback(\n (next: ChatModelRuntime) => {\n setRuntime(next);\n chat?.onRuntimeChange?.(next);\n },\n [chat],\n );\n const handleModelChange = useCallback(\n (next: string) => {\n setRuntime((current) => {\n if (!next) {\n return withRuntimeField(\n withRuntimeField(current, \"id\", undefined),\n \"model\",\n undefined,\n );\n }\n const selected = models.find((candidate) => candidate.id === next);\n if (!selected) {\n return withRuntimeField(\n withRuntimeField(current, \"id\", undefined),\n \"model\",\n next,\n );\n }\n return resolveChatRuntime({\n models,\n current,\n preferredModel: selected.id,\n reasoningEfforts,\n });\n });\n chat?.onModelChange?.(next);\n },\n [chat, models, reasoningEfforts],\n );\n const handleReasoningEffortChange = useCallback(\n (next: string) => {\n setRuntime((current) => withRuntimeField(current, \"effort\", next));\n chat?.onReasoningEffortChange?.(next);\n },\n [chat],\n );\n const handleTemperatureChange = useCallback((next: number | undefined) => {\n setRuntime((current) => withRuntimeField(current, \"temperature\", next));\n }, []);\n const replaceRuntimeIdentity = useCallback((identity: ChatModelRuntime) => {\n setRuntime((current) => {\n const next: ChatModelRuntime = { ...current };\n delete next.id;\n delete next.mode;\n delete next.model;\n delete next.backend;\n if (identity.model) next.model = identity.model;\n if (identity.backend) next.backend = identity.backend;\n return next;\n });\n }, []);\n const replaceRuntime = useCallback((next: ChatModelRuntime) => {\n setRuntime(next);\n }, []);\n\n return {\n runtime,\n model,\n reasoningEffort,\n temperature: runtime.temperature,\n reasoningEfforts,\n handleRuntimeChange,\n handleModelChange,\n handleReasoningEffortChange,\n handleTemperatureChange,\n replaceRuntimeIdentity,\n replaceRuntime,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
2
|
import { ToolMeta } from './ToolPreferences';
|
|
3
3
|
export declare const CHAT_WINDOW_TEST_TOOLS: ToolMeta[];
|
|
4
|
-
export declare function OpenChatWindowOnMount({ children, initialPrompt, }: {
|
|
4
|
+
export declare function OpenChatWindowOnMount({ children, initialPrompt, threadId, }: {
|
|
5
5
|
children: ReactNode;
|
|
6
6
|
initialPrompt?: {
|
|
7
7
|
id: number;
|
|
8
8
|
text: string;
|
|
9
9
|
} | null;
|
|
10
|
+
threadId?: string | null;
|
|
10
11
|
}): ReactNode;
|
|
11
12
|
export declare function installMemoryStorage(): void;
|
|
12
13
|
//# sourceMappingURL=ChatWindow.test-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatWindow.test-utils.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatWindow.test-utils.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAElD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,eAAO,MAAM,sBAAsB,EAAE,QAAQ,EAG5C,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,aAAa,
|
|
1
|
+
{"version":3,"file":"ChatWindow.test-utils.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatWindow.test-utils.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAElD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,eAAO,MAAM,sBAAsB,EAAE,QAAQ,EAG5C,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,aAAa,EACb,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,aAAa,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACpD,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GAAG,SAAS,CASZ;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAoB3C"}
|
|
@@ -17,7 +17,12 @@ const UiSliders = require("../../icons/components/UiSliders.cjs");
|
|
|
17
17
|
const UiCode2 = require("../../icons/components/UiCode2.cjs");
|
|
18
18
|
const UiShield = require("../../icons/components/UiShield.cjs");
|
|
19
19
|
const UiCoins = require("../../icons/components/UiCoins.cjs");
|
|
20
|
-
const ADVANCED_TABS = [
|
|
20
|
+
const ADVANCED_TABS = [
|
|
21
|
+
"config",
|
|
22
|
+
"costs",
|
|
23
|
+
"permissions",
|
|
24
|
+
"browser"
|
|
25
|
+
];
|
|
21
26
|
const ADVANCED_TAB_ICONS = {
|
|
22
27
|
config: UiSliders.UiSliders,
|
|
23
28
|
costs: UiCoins.UiCoins,
|
|
@@ -35,6 +40,7 @@ function ToolPreferences({
|
|
|
35
40
|
onModelChange,
|
|
36
41
|
runtimeFamilies,
|
|
37
42
|
reasoningEfforts = effortIcons.DEFAULT_REASONING_EFFORTS,
|
|
43
|
+
runtimeLocked = false,
|
|
38
44
|
reasoningEffort,
|
|
39
45
|
onReasoningEffortChange,
|
|
40
46
|
permissionMode = "default",
|
|
@@ -150,6 +156,7 @@ function ToolPreferences({
|
|
|
150
156
|
onRuntimeChange: handleRuntimeChange,
|
|
151
157
|
runtimeFamilies,
|
|
152
158
|
reasoningEfforts,
|
|
159
|
+
runtimeLocked,
|
|
153
160
|
permissionMode,
|
|
154
161
|
onPermissionModeChange,
|
|
155
162
|
temperature,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolPreferences.cjs","sources":["../../../src/data/ai/ToolPreferences.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { UiCode2, UiCoins, UiShield, UiSliders } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { Icon } from \"../Icon\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatModelRuntime,\n ChatUsageSummary,\n ClaudePermissionMode,\n ToolAnnotations,\n ToolMeta,\n ToolMode,\n} from \"../chat/types\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\nimport { AdvancedChatConfig } from \"./AdvancedChatConfig\";\nimport { AdvancedCostsPanel } from \"./AdvancedCostsPanel\";\nimport { ToolSchemaBrowser } from \"./ToolSchemaBrowser\";\nimport {\n CompactToolList,\n CompactToolPreferencesList,\n type CompactToolPreferencesListProps,\n} from \"./ToolPreferencesList\";\nimport { groupedToolEntries, type ToolGroup } from \"./ToolPreferences.model\";\n\nexport type { ClaudePermissionMode, ToolAnnotations, ToolMeta, ToolMode };\nexport { CompactToolPreferencesList, type CompactToolPreferencesListProps };\n\nexport type ToolPreferencesProps = {\n tools: ToolMeta[];\n value: Record<string, ToolMode>;\n onChange: (prefs: Record<string, ToolMode>) => void;\n models?: ChatModel[] | undefined;\n runtime?: ChatModelRuntime | undefined;\n onRuntimeChange?: ((runtime: ChatModelRuntime) => void) | undefined;\n model?: string | undefined;\n onModelChange?: ((model: string) => void) | undefined;\n runtimeFamilies?: SpecRuntimeFamily[] | undefined;\n reasoningEfforts?: string[] | undefined;\n reasoningEffort?: string | undefined;\n onReasoningEffortChange?: ((effort: string) => void) | undefined;\n permissionMode?: ClaudePermissionMode | undefined;\n onPermissionModeChange?: ((mode: ClaudePermissionMode) => void) | undefined;\n temperature?: number | undefined;\n onTemperatureChange?: ((temperature: number | undefined) => void) | undefined;\n budget?: ChatBudgetConfig | undefined;\n onBudgetChange?: ((budget: ChatBudgetConfig) => void) | undefined;\n usage?: ChatUsageSummary | null | undefined;\n /** Base sessions endpoint for the Costs tab, e.g. `/api/chat/sessions`. */\n costsApi?: string | undefined;\n /** Thread whose costs the Costs tab reports. */\n threadId?: string | undefined;\n toolsLoading?: boolean | undefined;\n toolsError?: string | null | undefined;\n catalogLoading?: boolean | undefined;\n catalogError?: string | null | undefined;\n onCatalogRetry?: (() => void) | undefined;\n className?: string;\n};\n\ntype AdvancedTab = \"config\" | \"costs\" | \"permissions\" | \"browser\";\n\nconst ADVANCED_TABS: AdvancedTab[] = [\"config\", \"costs\", \"permissions\", \"browser\"];\n\nconst ADVANCED_TAB_ICONS: Record<AdvancedTab, typeof UiSliders> = {\n config: UiSliders,\n costs: UiCoins,\n permissions: UiShield,\n browser: UiCode2,\n};\n\nexport function ToolPreferences({\n tools,\n value,\n onChange,\n models = [],\n runtime,\n onRuntimeChange,\n model,\n onModelChange,\n runtimeFamilies,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n reasoningEffort,\n onReasoningEffortChange,\n permissionMode = \"default\",\n onPermissionModeChange,\n temperature,\n onTemperatureChange,\n budget,\n onBudgetChange,\n usage,\n costsApi,\n threadId,\n toolsLoading = false,\n toolsError = null,\n catalogLoading = false,\n catalogError = null,\n onCatalogRetry,\n className = \"\",\n}: ToolPreferencesProps) {\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [advancedTab, setAdvancedTab] = useState<AdvancedTab>(\"config\");\n const groups = useMemo(() => groupedToolEntries(tools), [tools]);\n const resolvedRuntime =\n runtime ??\n ({\n ...(model ? { model } : {}),\n ...(reasoningEffort ? { effort: reasoningEffort } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n } satisfies ChatModelRuntime);\n const handleRuntimeChange = (next: ChatModelRuntime) => {\n onRuntimeChange?.(next);\n if ((next.id ?? next.model ?? \"\") !== (model ?? \"\")) {\n onModelChange?.(next.id ?? next.model ?? \"\");\n }\n if ((next.effort ?? \"\") !== (reasoningEffort ?? \"\")) {\n onReasoningEffortChange?.(next.effort ?? \"\");\n }\n };\n\n return (\n <>\n <DropdownMenu\n align=\"right\"\n className={className}\n menuClassName=\"w-72 max-h-[70vh] overflow-y-auto p-1\"\n trigger={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Tool preferences\"\n data-testid=\"tool-preferences-btn\"\n >\n <Icon icon={UiSliders} className=\"size-4\" />\n </Button>\n }\n >\n {(closeMenu) => (\n <div>\n <div className=\"mb-1 px-1 text-xs font-semibold\">\n Tool Preferences\n </div>\n <CompactToolList\n groups={groups}\n value={value}\n onChange={onChange}\n emptyLabel=\"No tools available\"\n />\n <div className=\"mt-2 border-t border-border pt-2\">\n <button\n type=\"button\"\n className=\"w-full rounded px-2 py-1.5 text-left text-xs hover:bg-accent\"\n onClick={() => {\n closeMenu();\n setAdvancedOpen(true);\n }}\n >\n Advanced\n </button>\n </div>\n </div>\n )}\n </DropdownMenu>\n <Modal\n open={advancedOpen}\n onClose={() => setAdvancedOpen(false)}\n title=\"Advanced Chat Settings\"\n size=\"xl\"\n >\n <div className=\"flex h-[70vh] min-h-0 flex-col gap-3\">\n <div className=\"flex items-center gap-1 rounded border border-border bg-muted/30 p-1\">\n {ADVANCED_TABS.map((tab) => (\n <button\n key={tab}\n type=\"button\"\n className={cn(\n \"inline-flex h-8 items-center gap-1.5 rounded px-3 text-xs font-medium capitalize\",\n advancedTab === tab\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:bg-background/60\",\n )}\n onClick={() => setAdvancedTab(tab)}\n >\n <Icon icon={ADVANCED_TAB_ICONS[tab]} className=\"size-3.5\" />\n {tab}\n </button>\n ))}\n <div className=\"flex-1\" />\n {toolsLoading && (\n <span className=\"pr-2 text-[11px] text-muted-foreground\">\n Loading tools\n </span>\n )}\n {toolsError && (\n <span className=\"pr-2 text-[11px] text-destructive\">\n {toolsError}\n </span>\n )}\n </div>\n {advancedTab === \"config\" ? (\n <AdvancedChatConfig\n models={models}\n runtime={resolvedRuntime}\n onRuntimeChange={handleRuntimeChange}\n runtimeFamilies={runtimeFamilies}\n reasoningEfforts={reasoningEfforts}\n permissionMode={permissionMode}\n onPermissionModeChange={onPermissionModeChange}\n temperature={temperature}\n onTemperatureChange={onTemperatureChange}\n budget={budget}\n onBudgetChange={onBudgetChange}\n usage={usage}\n catalogLoading={catalogLoading}\n catalogError={catalogError}\n onCatalogRetry={onCatalogRetry}\n />\n ) : advancedTab === \"costs\" ? (\n <AdvancedCostsPanel costsApi={costsApi} threadId={threadId} />\n ) : advancedTab === \"permissions\" ? (\n <AdvancedPermissionsPanel\n groups={groups}\n value={value}\n onChange={onChange}\n />\n ) : (\n <ToolSchemaBrowser tools={tools} className=\"min-h-0 flex-1\" />\n )}\n </div>\n </Modal>\n </>\n );\n}\n\nfunction AdvancedPermissionsPanel({\n groups,\n value,\n onChange,\n}: {\n groups: ToolGroup[];\n value: Record<string, ToolMode>;\n onChange: (prefs: Record<string, ToolMode>) => void;\n}) {\n return (\n <div className=\"min-h-0 flex-1 overflow-y-auto rounded border border-border p-1\">\n <CompactToolList\n groups={groups}\n value={value}\n onChange={onChange}\n emptyLabel=\"No tools\"\n />\n </div>\n );\n}\n"],"names":["UiSliders","UiCoins","UiShield","UiCode2","DEFAULT_REASONING_EFFORTS","useState","useMemo","groupedToolEntries","jsxs","Fragment","jsx","DropdownMenu","Button","Icon","CompactToolList","Modal","cn","AdvancedChatConfig","AdvancedCostsPanel","ToolSchemaBrowser"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ToolPreferences.cjs","sources":["../../../src/data/ai/ToolPreferences.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { UiCode2, UiCoins, UiShield, UiSliders } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { Icon } from \"../Icon\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatModelRuntime,\n ChatUsageSummary,\n ClaudePermissionMode,\n ToolAnnotations,\n ToolMeta,\n ToolMode,\n} from \"../chat/types\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\nimport { AdvancedChatConfig } from \"./AdvancedChatConfig\";\nimport { AdvancedCostsPanel } from \"./AdvancedCostsPanel\";\nimport { ToolSchemaBrowser } from \"./ToolSchemaBrowser\";\nimport {\n CompactToolList,\n CompactToolPreferencesList,\n type CompactToolPreferencesListProps,\n} from \"./ToolPreferencesList\";\nimport { groupedToolEntries, type ToolGroup } from \"./ToolPreferences.model\";\n\nexport type { ClaudePermissionMode, ToolAnnotations, ToolMeta, ToolMode };\nexport { CompactToolPreferencesList, type CompactToolPreferencesListProps };\n\nexport type ToolPreferencesProps = {\n tools: ToolMeta[];\n value: Record<string, ToolMode>;\n onChange: (prefs: Record<string, ToolMode>) => void;\n models?: ChatModel[] | undefined;\n runtime?: ChatModelRuntime | undefined;\n onRuntimeChange?: ((runtime: ChatModelRuntime) => void) | undefined;\n model?: string | undefined;\n onModelChange?: ((model: string) => void) | undefined;\n runtimeFamilies?: SpecRuntimeFamily[] | undefined;\n reasoningEfforts?: string[] | undefined;\n runtimeLocked?: boolean | undefined;\n reasoningEffort?: string | undefined;\n onReasoningEffortChange?: ((effort: string) => void) | undefined;\n permissionMode?: ClaudePermissionMode | undefined;\n onPermissionModeChange?: ((mode: ClaudePermissionMode) => void) | undefined;\n temperature?: number | undefined;\n onTemperatureChange?: ((temperature: number | undefined) => void) | undefined;\n budget?: ChatBudgetConfig | undefined;\n onBudgetChange?: ((budget: ChatBudgetConfig) => void) | undefined;\n usage?: ChatUsageSummary | null | undefined;\n /** Base sessions endpoint for the Costs tab, e.g. `/api/chat/sessions`. */\n costsApi?: string | undefined;\n /** Thread whose costs the Costs tab reports. */\n threadId?: string | undefined;\n toolsLoading?: boolean | undefined;\n toolsError?: string | null | undefined;\n catalogLoading?: boolean | undefined;\n catalogError?: string | null | undefined;\n onCatalogRetry?: (() => void) | undefined;\n className?: string;\n};\n\ntype AdvancedTab = \"config\" | \"costs\" | \"permissions\" | \"browser\";\n\nconst ADVANCED_TABS: AdvancedTab[] = [\n \"config\",\n \"costs\",\n \"permissions\",\n \"browser\",\n];\n\nconst ADVANCED_TAB_ICONS: Record<AdvancedTab, typeof UiSliders> = {\n config: UiSliders,\n costs: UiCoins,\n permissions: UiShield,\n browser: UiCode2,\n};\n\nexport function ToolPreferences({\n tools,\n value,\n onChange,\n models = [],\n runtime,\n onRuntimeChange,\n model,\n onModelChange,\n runtimeFamilies,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n runtimeLocked = false,\n reasoningEffort,\n onReasoningEffortChange,\n permissionMode = \"default\",\n onPermissionModeChange,\n temperature,\n onTemperatureChange,\n budget,\n onBudgetChange,\n usage,\n costsApi,\n threadId,\n toolsLoading = false,\n toolsError = null,\n catalogLoading = false,\n catalogError = null,\n onCatalogRetry,\n className = \"\",\n}: ToolPreferencesProps) {\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [advancedTab, setAdvancedTab] = useState<AdvancedTab>(\"config\");\n const groups = useMemo(() => groupedToolEntries(tools), [tools]);\n const resolvedRuntime =\n runtime ??\n ({\n ...(model ? { model } : {}),\n ...(reasoningEffort ? { effort: reasoningEffort } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n } satisfies ChatModelRuntime);\n const handleRuntimeChange = (next: ChatModelRuntime) => {\n onRuntimeChange?.(next);\n if ((next.id ?? next.model ?? \"\") !== (model ?? \"\")) {\n onModelChange?.(next.id ?? next.model ?? \"\");\n }\n if ((next.effort ?? \"\") !== (reasoningEffort ?? \"\")) {\n onReasoningEffortChange?.(next.effort ?? \"\");\n }\n };\n\n return (\n <>\n <DropdownMenu\n align=\"right\"\n className={className}\n menuClassName=\"w-72 max-h-[70vh] overflow-y-auto p-1\"\n trigger={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Tool preferences\"\n data-testid=\"tool-preferences-btn\"\n >\n <Icon icon={UiSliders} className=\"size-4\" />\n </Button>\n }\n >\n {(closeMenu) => (\n <div>\n <div className=\"mb-1 px-1 text-xs font-semibold\">\n Tool Preferences\n </div>\n <CompactToolList\n groups={groups}\n value={value}\n onChange={onChange}\n emptyLabel=\"No tools available\"\n />\n <div className=\"mt-2 border-t border-border pt-2\">\n <button\n type=\"button\"\n className=\"w-full rounded px-2 py-1.5 text-left text-xs hover:bg-accent\"\n onClick={() => {\n closeMenu();\n setAdvancedOpen(true);\n }}\n >\n Advanced\n </button>\n </div>\n </div>\n )}\n </DropdownMenu>\n <Modal\n open={advancedOpen}\n onClose={() => setAdvancedOpen(false)}\n title=\"Advanced Chat Settings\"\n size=\"xl\"\n >\n <div className=\"flex h-[70vh] min-h-0 flex-col gap-3\">\n <div className=\"flex items-center gap-1 rounded border border-border bg-muted/30 p-1\">\n {ADVANCED_TABS.map((tab) => (\n <button\n key={tab}\n type=\"button\"\n className={cn(\n \"inline-flex h-8 items-center gap-1.5 rounded px-3 text-xs font-medium capitalize\",\n advancedTab === tab\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:bg-background/60\",\n )}\n onClick={() => setAdvancedTab(tab)}\n >\n <Icon icon={ADVANCED_TAB_ICONS[tab]} className=\"size-3.5\" />\n {tab}\n </button>\n ))}\n <div className=\"flex-1\" />\n {toolsLoading && (\n <span className=\"pr-2 text-[11px] text-muted-foreground\">\n Loading tools\n </span>\n )}\n {toolsError && (\n <span className=\"pr-2 text-[11px] text-destructive\">\n {toolsError}\n </span>\n )}\n </div>\n {advancedTab === \"config\" ? (\n <AdvancedChatConfig\n models={models}\n runtime={resolvedRuntime}\n onRuntimeChange={handleRuntimeChange}\n runtimeFamilies={runtimeFamilies}\n reasoningEfforts={reasoningEfforts}\n runtimeLocked={runtimeLocked}\n permissionMode={permissionMode}\n onPermissionModeChange={onPermissionModeChange}\n temperature={temperature}\n onTemperatureChange={onTemperatureChange}\n budget={budget}\n onBudgetChange={onBudgetChange}\n usage={usage}\n catalogLoading={catalogLoading}\n catalogError={catalogError}\n onCatalogRetry={onCatalogRetry}\n />\n ) : advancedTab === \"costs\" ? (\n <AdvancedCostsPanel costsApi={costsApi} threadId={threadId} />\n ) : advancedTab === \"permissions\" ? (\n <AdvancedPermissionsPanel\n groups={groups}\n value={value}\n onChange={onChange}\n />\n ) : (\n <ToolSchemaBrowser tools={tools} className=\"min-h-0 flex-1\" />\n )}\n </div>\n </Modal>\n </>\n );\n}\n\nfunction AdvancedPermissionsPanel({\n groups,\n value,\n onChange,\n}: {\n groups: ToolGroup[];\n value: Record<string, ToolMode>;\n onChange: (prefs: Record<string, ToolMode>) => void;\n}) {\n return (\n <div className=\"min-h-0 flex-1 overflow-y-auto rounded border border-border p-1\">\n <CompactToolList\n groups={groups}\n value={value}\n onChange={onChange}\n emptyLabel=\"No tools\"\n />\n </div>\n );\n}\n"],"names":["UiSliders","UiCoins","UiShield","UiCode2","DEFAULT_REASONING_EFFORTS","useState","useMemo","groupedToolEntries","jsxs","Fragment","jsx","DropdownMenu","Button","Icon","CompactToolList","Modal","cn","AdvancedChatConfig","AdvancedCostsPanel","ToolSchemaBrowser"],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ export type ToolPreferencesProps = {
|
|
|
14
14
|
onModelChange?: ((model: string) => void) | undefined;
|
|
15
15
|
runtimeFamilies?: SpecRuntimeFamily[] | undefined;
|
|
16
16
|
reasoningEfforts?: string[] | undefined;
|
|
17
|
+
runtimeLocked?: boolean | undefined;
|
|
17
18
|
reasoningEffort?: string | undefined;
|
|
18
19
|
onReasoningEffortChange?: ((effort: string) => void) | undefined;
|
|
19
20
|
permissionMode?: ClaudePermissionMode | undefined;
|
|
@@ -34,5 +35,5 @@ export type ToolPreferencesProps = {
|
|
|
34
35
|
onCatalogRetry?: (() => void) | undefined;
|
|
35
36
|
className?: string;
|
|
36
37
|
};
|
|
37
|
-
export declare function ToolPreferences({ tools, value, onChange, models, runtime, onRuntimeChange, model, onModelChange, runtimeFamilies, reasoningEfforts, reasoningEffort, onReasoningEffortChange, permissionMode, onPermissionModeChange, temperature, onTemperatureChange, budget, onBudgetChange, usage, costsApi, threadId, toolsLoading, toolsError, catalogLoading, catalogError, onCatalogRetry, className, }: ToolPreferencesProps): import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
export declare function ToolPreferences({ tools, value, onChange, models, runtime, onRuntimeChange, model, onModelChange, runtimeFamilies, reasoningEfforts, runtimeLocked, reasoningEffort, onReasoningEffortChange, permissionMode, onPermissionModeChange, temperature, onTemperatureChange, budget, onBudgetChange, usage, costsApi, threadId, toolsLoading, toolsError, catalogLoading, catalogError, onCatalogRetry, className, }: ToolPreferencesProps): import("react/jsx-runtime").JSX.Element;
|
|
38
39
|
//# sourceMappingURL=ToolPreferences.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolPreferences.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolPreferences.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,QAAQ,EACR,QAAQ,EACT,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAIjE,OAAO,EAEL,0BAA0B,EAC1B,KAAK,+BAA+B,EACrC,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,KAAK,+BAA+B,EAAE,CAAC;AAE5E,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC;IACpD,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACvC,eAAe,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACpE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACtD,eAAe,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAClD,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,uBAAuB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACjE,cAAc,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAClD,sBAAsB,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5E,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,mBAAmB,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9E,MAAM,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACtC,cAAc,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAClE,KAAK,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACvC,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,cAAc,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;
|
|
1
|
+
{"version":3,"file":"ToolPreferences.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolPreferences.tsx"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,12 @@ import { UiSliders } from "../../icons/components/UiSliders.js";
|
|
|
16
16
|
import { UiCode2 } from "../../icons/components/UiCode2.js";
|
|
17
17
|
import { UiShield } from "../../icons/components/UiShield.js";
|
|
18
18
|
import { UiCoins } from "../../icons/components/UiCoins.js";
|
|
19
|
-
const ADVANCED_TABS = [
|
|
19
|
+
const ADVANCED_TABS = [
|
|
20
|
+
"config",
|
|
21
|
+
"costs",
|
|
22
|
+
"permissions",
|
|
23
|
+
"browser"
|
|
24
|
+
];
|
|
20
25
|
const ADVANCED_TAB_ICONS = {
|
|
21
26
|
config: UiSliders,
|
|
22
27
|
costs: UiCoins,
|
|
@@ -34,6 +39,7 @@ function ToolPreferences({
|
|
|
34
39
|
onModelChange,
|
|
35
40
|
runtimeFamilies,
|
|
36
41
|
reasoningEfforts = DEFAULT_REASONING_EFFORTS,
|
|
42
|
+
runtimeLocked = false,
|
|
37
43
|
reasoningEffort,
|
|
38
44
|
onReasoningEffortChange,
|
|
39
45
|
permissionMode = "default",
|
|
@@ -149,6 +155,7 @@ function ToolPreferences({
|
|
|
149
155
|
onRuntimeChange: handleRuntimeChange,
|
|
150
156
|
runtimeFamilies,
|
|
151
157
|
reasoningEfforts,
|
|
158
|
+
runtimeLocked,
|
|
152
159
|
permissionMode,
|
|
153
160
|
onPermissionModeChange,
|
|
154
161
|
temperature,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolPreferences.js","sources":["../../../src/data/ai/ToolPreferences.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { UiCode2, UiCoins, UiShield, UiSliders } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { Icon } from \"../Icon\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatModelRuntime,\n ChatUsageSummary,\n ClaudePermissionMode,\n ToolAnnotations,\n ToolMeta,\n ToolMode,\n} from \"../chat/types\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\nimport { AdvancedChatConfig } from \"./AdvancedChatConfig\";\nimport { AdvancedCostsPanel } from \"./AdvancedCostsPanel\";\nimport { ToolSchemaBrowser } from \"./ToolSchemaBrowser\";\nimport {\n CompactToolList,\n CompactToolPreferencesList,\n type CompactToolPreferencesListProps,\n} from \"./ToolPreferencesList\";\nimport { groupedToolEntries, type ToolGroup } from \"./ToolPreferences.model\";\n\nexport type { ClaudePermissionMode, ToolAnnotations, ToolMeta, ToolMode };\nexport { CompactToolPreferencesList, type CompactToolPreferencesListProps };\n\nexport type ToolPreferencesProps = {\n tools: ToolMeta[];\n value: Record<string, ToolMode>;\n onChange: (prefs: Record<string, ToolMode>) => void;\n models?: ChatModel[] | undefined;\n runtime?: ChatModelRuntime | undefined;\n onRuntimeChange?: ((runtime: ChatModelRuntime) => void) | undefined;\n model?: string | undefined;\n onModelChange?: ((model: string) => void) | undefined;\n runtimeFamilies?: SpecRuntimeFamily[] | undefined;\n reasoningEfforts?: string[] | undefined;\n reasoningEffort?: string | undefined;\n onReasoningEffortChange?: ((effort: string) => void) | undefined;\n permissionMode?: ClaudePermissionMode | undefined;\n onPermissionModeChange?: ((mode: ClaudePermissionMode) => void) | undefined;\n temperature?: number | undefined;\n onTemperatureChange?: ((temperature: number | undefined) => void) | undefined;\n budget?: ChatBudgetConfig | undefined;\n onBudgetChange?: ((budget: ChatBudgetConfig) => void) | undefined;\n usage?: ChatUsageSummary | null | undefined;\n /** Base sessions endpoint for the Costs tab, e.g. `/api/chat/sessions`. */\n costsApi?: string | undefined;\n /** Thread whose costs the Costs tab reports. */\n threadId?: string | undefined;\n toolsLoading?: boolean | undefined;\n toolsError?: string | null | undefined;\n catalogLoading?: boolean | undefined;\n catalogError?: string | null | undefined;\n onCatalogRetry?: (() => void) | undefined;\n className?: string;\n};\n\ntype AdvancedTab = \"config\" | \"costs\" | \"permissions\" | \"browser\";\n\nconst ADVANCED_TABS: AdvancedTab[] = [\"config\", \"costs\", \"permissions\", \"browser\"];\n\nconst ADVANCED_TAB_ICONS: Record<AdvancedTab, typeof UiSliders> = {\n config: UiSliders,\n costs: UiCoins,\n permissions: UiShield,\n browser: UiCode2,\n};\n\nexport function ToolPreferences({\n tools,\n value,\n onChange,\n models = [],\n runtime,\n onRuntimeChange,\n model,\n onModelChange,\n runtimeFamilies,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n reasoningEffort,\n onReasoningEffortChange,\n permissionMode = \"default\",\n onPermissionModeChange,\n temperature,\n onTemperatureChange,\n budget,\n onBudgetChange,\n usage,\n costsApi,\n threadId,\n toolsLoading = false,\n toolsError = null,\n catalogLoading = false,\n catalogError = null,\n onCatalogRetry,\n className = \"\",\n}: ToolPreferencesProps) {\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [advancedTab, setAdvancedTab] = useState<AdvancedTab>(\"config\");\n const groups = useMemo(() => groupedToolEntries(tools), [tools]);\n const resolvedRuntime =\n runtime ??\n ({\n ...(model ? { model } : {}),\n ...(reasoningEffort ? { effort: reasoningEffort } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n } satisfies ChatModelRuntime);\n const handleRuntimeChange = (next: ChatModelRuntime) => {\n onRuntimeChange?.(next);\n if ((next.id ?? next.model ?? \"\") !== (model ?? \"\")) {\n onModelChange?.(next.id ?? next.model ?? \"\");\n }\n if ((next.effort ?? \"\") !== (reasoningEffort ?? \"\")) {\n onReasoningEffortChange?.(next.effort ?? \"\");\n }\n };\n\n return (\n <>\n <DropdownMenu\n align=\"right\"\n className={className}\n menuClassName=\"w-72 max-h-[70vh] overflow-y-auto p-1\"\n trigger={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Tool preferences\"\n data-testid=\"tool-preferences-btn\"\n >\n <Icon icon={UiSliders} className=\"size-4\" />\n </Button>\n }\n >\n {(closeMenu) => (\n <div>\n <div className=\"mb-1 px-1 text-xs font-semibold\">\n Tool Preferences\n </div>\n <CompactToolList\n groups={groups}\n value={value}\n onChange={onChange}\n emptyLabel=\"No tools available\"\n />\n <div className=\"mt-2 border-t border-border pt-2\">\n <button\n type=\"button\"\n className=\"w-full rounded px-2 py-1.5 text-left text-xs hover:bg-accent\"\n onClick={() => {\n closeMenu();\n setAdvancedOpen(true);\n }}\n >\n Advanced\n </button>\n </div>\n </div>\n )}\n </DropdownMenu>\n <Modal\n open={advancedOpen}\n onClose={() => setAdvancedOpen(false)}\n title=\"Advanced Chat Settings\"\n size=\"xl\"\n >\n <div className=\"flex h-[70vh] min-h-0 flex-col gap-3\">\n <div className=\"flex items-center gap-1 rounded border border-border bg-muted/30 p-1\">\n {ADVANCED_TABS.map((tab) => (\n <button\n key={tab}\n type=\"button\"\n className={cn(\n \"inline-flex h-8 items-center gap-1.5 rounded px-3 text-xs font-medium capitalize\",\n advancedTab === tab\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:bg-background/60\",\n )}\n onClick={() => setAdvancedTab(tab)}\n >\n <Icon icon={ADVANCED_TAB_ICONS[tab]} className=\"size-3.5\" />\n {tab}\n </button>\n ))}\n <div className=\"flex-1\" />\n {toolsLoading && (\n <span className=\"pr-2 text-[11px] text-muted-foreground\">\n Loading tools\n </span>\n )}\n {toolsError && (\n <span className=\"pr-2 text-[11px] text-destructive\">\n {toolsError}\n </span>\n )}\n </div>\n {advancedTab === \"config\" ? (\n <AdvancedChatConfig\n models={models}\n runtime={resolvedRuntime}\n onRuntimeChange={handleRuntimeChange}\n runtimeFamilies={runtimeFamilies}\n reasoningEfforts={reasoningEfforts}\n permissionMode={permissionMode}\n onPermissionModeChange={onPermissionModeChange}\n temperature={temperature}\n onTemperatureChange={onTemperatureChange}\n budget={budget}\n onBudgetChange={onBudgetChange}\n usage={usage}\n catalogLoading={catalogLoading}\n catalogError={catalogError}\n onCatalogRetry={onCatalogRetry}\n />\n ) : advancedTab === \"costs\" ? (\n <AdvancedCostsPanel costsApi={costsApi} threadId={threadId} />\n ) : advancedTab === \"permissions\" ? (\n <AdvancedPermissionsPanel\n groups={groups}\n value={value}\n onChange={onChange}\n />\n ) : (\n <ToolSchemaBrowser tools={tools} className=\"min-h-0 flex-1\" />\n )}\n </div>\n </Modal>\n </>\n );\n}\n\nfunction AdvancedPermissionsPanel({\n groups,\n value,\n onChange,\n}: {\n groups: ToolGroup[];\n value: Record<string, ToolMode>;\n onChange: (prefs: Record<string, ToolMode>) => void;\n}) {\n return (\n <div className=\"min-h-0 flex-1 overflow-y-auto rounded border border-border p-1\">\n <CompactToolList\n groups={groups}\n value={value}\n onChange={onChange}\n emptyLabel=\"No tools\"\n />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ToolPreferences.js","sources":["../../../src/data/ai/ToolPreferences.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { UiCode2, UiCoins, UiShield, UiSliders } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { Icon } from \"../Icon\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatModelRuntime,\n ChatUsageSummary,\n ClaudePermissionMode,\n ToolAnnotations,\n ToolMeta,\n ToolMode,\n} from \"../chat/types\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\nimport { AdvancedChatConfig } from \"./AdvancedChatConfig\";\nimport { AdvancedCostsPanel } from \"./AdvancedCostsPanel\";\nimport { ToolSchemaBrowser } from \"./ToolSchemaBrowser\";\nimport {\n CompactToolList,\n CompactToolPreferencesList,\n type CompactToolPreferencesListProps,\n} from \"./ToolPreferencesList\";\nimport { groupedToolEntries, type ToolGroup } from \"./ToolPreferences.model\";\n\nexport type { ClaudePermissionMode, ToolAnnotations, ToolMeta, ToolMode };\nexport { CompactToolPreferencesList, type CompactToolPreferencesListProps };\n\nexport type ToolPreferencesProps = {\n tools: ToolMeta[];\n value: Record<string, ToolMode>;\n onChange: (prefs: Record<string, ToolMode>) => void;\n models?: ChatModel[] | undefined;\n runtime?: ChatModelRuntime | undefined;\n onRuntimeChange?: ((runtime: ChatModelRuntime) => void) | undefined;\n model?: string | undefined;\n onModelChange?: ((model: string) => void) | undefined;\n runtimeFamilies?: SpecRuntimeFamily[] | undefined;\n reasoningEfforts?: string[] | undefined;\n runtimeLocked?: boolean | undefined;\n reasoningEffort?: string | undefined;\n onReasoningEffortChange?: ((effort: string) => void) | undefined;\n permissionMode?: ClaudePermissionMode | undefined;\n onPermissionModeChange?: ((mode: ClaudePermissionMode) => void) | undefined;\n temperature?: number | undefined;\n onTemperatureChange?: ((temperature: number | undefined) => void) | undefined;\n budget?: ChatBudgetConfig | undefined;\n onBudgetChange?: ((budget: ChatBudgetConfig) => void) | undefined;\n usage?: ChatUsageSummary | null | undefined;\n /** Base sessions endpoint for the Costs tab, e.g. `/api/chat/sessions`. */\n costsApi?: string | undefined;\n /** Thread whose costs the Costs tab reports. */\n threadId?: string | undefined;\n toolsLoading?: boolean | undefined;\n toolsError?: string | null | undefined;\n catalogLoading?: boolean | undefined;\n catalogError?: string | null | undefined;\n onCatalogRetry?: (() => void) | undefined;\n className?: string;\n};\n\ntype AdvancedTab = \"config\" | \"costs\" | \"permissions\" | \"browser\";\n\nconst ADVANCED_TABS: AdvancedTab[] = [\n \"config\",\n \"costs\",\n \"permissions\",\n \"browser\",\n];\n\nconst ADVANCED_TAB_ICONS: Record<AdvancedTab, typeof UiSliders> = {\n config: UiSliders,\n costs: UiCoins,\n permissions: UiShield,\n browser: UiCode2,\n};\n\nexport function ToolPreferences({\n tools,\n value,\n onChange,\n models = [],\n runtime,\n onRuntimeChange,\n model,\n onModelChange,\n runtimeFamilies,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n runtimeLocked = false,\n reasoningEffort,\n onReasoningEffortChange,\n permissionMode = \"default\",\n onPermissionModeChange,\n temperature,\n onTemperatureChange,\n budget,\n onBudgetChange,\n usage,\n costsApi,\n threadId,\n toolsLoading = false,\n toolsError = null,\n catalogLoading = false,\n catalogError = null,\n onCatalogRetry,\n className = \"\",\n}: ToolPreferencesProps) {\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [advancedTab, setAdvancedTab] = useState<AdvancedTab>(\"config\");\n const groups = useMemo(() => groupedToolEntries(tools), [tools]);\n const resolvedRuntime =\n runtime ??\n ({\n ...(model ? { model } : {}),\n ...(reasoningEffort ? { effort: reasoningEffort } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n } satisfies ChatModelRuntime);\n const handleRuntimeChange = (next: ChatModelRuntime) => {\n onRuntimeChange?.(next);\n if ((next.id ?? next.model ?? \"\") !== (model ?? \"\")) {\n onModelChange?.(next.id ?? next.model ?? \"\");\n }\n if ((next.effort ?? \"\") !== (reasoningEffort ?? \"\")) {\n onReasoningEffortChange?.(next.effort ?? \"\");\n }\n };\n\n return (\n <>\n <DropdownMenu\n align=\"right\"\n className={className}\n menuClassName=\"w-72 max-h-[70vh] overflow-y-auto p-1\"\n trigger={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Tool preferences\"\n data-testid=\"tool-preferences-btn\"\n >\n <Icon icon={UiSliders} className=\"size-4\" />\n </Button>\n }\n >\n {(closeMenu) => (\n <div>\n <div className=\"mb-1 px-1 text-xs font-semibold\">\n Tool Preferences\n </div>\n <CompactToolList\n groups={groups}\n value={value}\n onChange={onChange}\n emptyLabel=\"No tools available\"\n />\n <div className=\"mt-2 border-t border-border pt-2\">\n <button\n type=\"button\"\n className=\"w-full rounded px-2 py-1.5 text-left text-xs hover:bg-accent\"\n onClick={() => {\n closeMenu();\n setAdvancedOpen(true);\n }}\n >\n Advanced\n </button>\n </div>\n </div>\n )}\n </DropdownMenu>\n <Modal\n open={advancedOpen}\n onClose={() => setAdvancedOpen(false)}\n title=\"Advanced Chat Settings\"\n size=\"xl\"\n >\n <div className=\"flex h-[70vh] min-h-0 flex-col gap-3\">\n <div className=\"flex items-center gap-1 rounded border border-border bg-muted/30 p-1\">\n {ADVANCED_TABS.map((tab) => (\n <button\n key={tab}\n type=\"button\"\n className={cn(\n \"inline-flex h-8 items-center gap-1.5 rounded px-3 text-xs font-medium capitalize\",\n advancedTab === tab\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:bg-background/60\",\n )}\n onClick={() => setAdvancedTab(tab)}\n >\n <Icon icon={ADVANCED_TAB_ICONS[tab]} className=\"size-3.5\" />\n {tab}\n </button>\n ))}\n <div className=\"flex-1\" />\n {toolsLoading && (\n <span className=\"pr-2 text-[11px] text-muted-foreground\">\n Loading tools\n </span>\n )}\n {toolsError && (\n <span className=\"pr-2 text-[11px] text-destructive\">\n {toolsError}\n </span>\n )}\n </div>\n {advancedTab === \"config\" ? (\n <AdvancedChatConfig\n models={models}\n runtime={resolvedRuntime}\n onRuntimeChange={handleRuntimeChange}\n runtimeFamilies={runtimeFamilies}\n reasoningEfforts={reasoningEfforts}\n runtimeLocked={runtimeLocked}\n permissionMode={permissionMode}\n onPermissionModeChange={onPermissionModeChange}\n temperature={temperature}\n onTemperatureChange={onTemperatureChange}\n budget={budget}\n onBudgetChange={onBudgetChange}\n usage={usage}\n catalogLoading={catalogLoading}\n catalogError={catalogError}\n onCatalogRetry={onCatalogRetry}\n />\n ) : advancedTab === \"costs\" ? (\n <AdvancedCostsPanel costsApi={costsApi} threadId={threadId} />\n ) : advancedTab === \"permissions\" ? (\n <AdvancedPermissionsPanel\n groups={groups}\n value={value}\n onChange={onChange}\n />\n ) : (\n <ToolSchemaBrowser tools={tools} className=\"min-h-0 flex-1\" />\n )}\n </div>\n </Modal>\n </>\n );\n}\n\nfunction AdvancedPermissionsPanel({\n groups,\n value,\n onChange,\n}: {\n groups: ToolGroup[];\n value: Record<string, ToolMode>;\n onChange: (prefs: Record<string, ToolMode>) => void;\n}) {\n return (\n <div className=\"min-h-0 flex-1 overflow-y-auto rounded border border-border p-1\">\n <CompactToolList\n groups={groups}\n value={value}\n onChange={onChange}\n emptyLabel=\"No tools\"\n />\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAmEA,MAAM,gBAA+B;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,qBAA4D;AAAA,EAChE,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,aAAa;AAAA,EACb,SAAS;AACX;AAEO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,CAAA;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf;AAAA,EACA,YAAY;AACd,GAAyB;AACvB,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAsB,QAAQ;AACpE,QAAM,SAAS,QAAQ,MAAM,mBAAmB,KAAK,GAAG,CAAC,KAAK,CAAC;AAC/D,QAAM,kBACJ,WACC;AAAA,IACC,GAAI,QAAQ,EAAE,MAAA,IAAU,CAAA;AAAA,IACxB,GAAI,kBAAkB,EAAE,QAAQ,gBAAA,IAAoB,CAAA;AAAA,IACpD,GAAI,gBAAgB,SAAY,EAAE,gBAAgB,CAAA;AAAA,EAAC;AAEvD,QAAM,sBAAsB,CAAC,SAA2B;AACtD,uDAAkB;AAClB,SAAK,KAAK,MAAM,KAAK,SAAS,SAAS,SAAS,KAAK;AACnD,qDAAgB,KAAK,MAAM,KAAK,SAAS;AAAA,IAC3C;AACA,SAAK,KAAK,UAAU,SAAS,mBAAmB,KAAK;AACnD,yEAA0B,KAAK,UAAU;AAAA,IAC3C;AAAA,EACF;AAEA,SACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN;AAAA,QACA,eAAc;AAAA,QACd,SACE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,OAAM;AAAA,YACN,eAAY;AAAA,YAEZ,UAAA,oBAAC,MAAA,EAAK,MAAM,WAAW,WAAU,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,QAI7C,UAAA,CAAC,cACA,qBAAC,OAAA,EACC,UAAA;AAAA,UAAA,oBAAC,OAAA,EAAI,WAAU,mCAAkC,UAAA,oBAEjD;AAAA,UACA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAW;AAAA,YAAA;AAAA,UAAA;AAAA,UAEb,oBAAC,OAAA,EAAI,WAAU,oCACb,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MAAM;AACb,0BAAA;AACA,gCAAgB,IAAI;AAAA,cACtB;AAAA,cACD,UAAA;AAAA,YAAA;AAAA,UAAA,EAED,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,IAGJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAS,MAAM,gBAAgB,KAAK;AAAA,QACpC,OAAM;AAAA,QACN,MAAK;AAAA,QAEL,UAAA,qBAAC,OAAA,EAAI,WAAU,wCACb,UAAA;AAAA,UAAA,qBAAC,OAAA,EAAI,WAAU,wEACZ,UAAA;AAAA,YAAA,cAAc,IAAI,CAAC,QAClB;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WAAW;AAAA,kBACT;AAAA,kBACA,gBAAgB,MACZ,4CACA;AAAA,gBAAA;AAAA,gBAEN,SAAS,MAAM,eAAe,GAAG;AAAA,gBAEjC,UAAA;AAAA,kBAAA,oBAAC,QAAK,MAAM,mBAAmB,GAAG,GAAG,WAAU,YAAW;AAAA,kBACzD;AAAA,gBAAA;AAAA,cAAA;AAAA,cAXI;AAAA,YAAA,CAaR;AAAA,YACD,oBAAC,OAAA,EAAI,WAAU,SAAA,CAAS;AAAA,YACvB,gBACC,oBAAC,QAAA,EAAK,WAAU,0CAAyC,UAAA,iBAEzD;AAAA,YAED,cACC,oBAAC,QAAA,EAAK,WAAU,qCACb,UAAA,WAAA,CACH;AAAA,UAAA,GAEJ;AAAA,UACC,gBAAgB,WACf;AAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA,SAAS;AAAA,cACT,iBAAiB;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,UAAA,IAEA,gBAAgB,UAClB,oBAAC,sBAAmB,UAAoB,UAAoB,IAC1D,gBAAgB,gBAClB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,UAAA,IAGF,oBAAC,mBAAA,EAAkB,OAAc,WAAU,iBAAA,CAAiB;AAAA,QAAA,EAAA,CAEhE;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;AAEA,SAAS,yBAAyB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE,oBAAC,OAAA,EAAI,WAAU,mEACb,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAW;AAAA,IAAA;AAAA,EAAA,GAEf;AAEJ;"}
|
package/dist/data/chat/Chat.cjs
CHANGED
|
@@ -11,6 +11,7 @@ const Suggestion = require("./Suggestion.cjs");
|
|
|
11
11
|
const effortIcons = require("./effort-icons.cjs");
|
|
12
12
|
const models = require("./models.cjs");
|
|
13
13
|
const approval = require("./approval.cjs");
|
|
14
|
+
const forkSeed = require("./fork-seed.cjs");
|
|
14
15
|
const Chat_runtime = require("./Chat.runtime.cjs");
|
|
15
16
|
const attachmentUpload = require("./attachment-upload.cjs");
|
|
16
17
|
const registry = require("./tool-render/registry.cjs");
|
|
@@ -43,6 +44,9 @@ function Chat({
|
|
|
43
44
|
attachmentLimits,
|
|
44
45
|
threadId,
|
|
45
46
|
sessionsApi = null,
|
|
47
|
+
runtimeLocked = false,
|
|
48
|
+
onMessageCountChange,
|
|
49
|
+
onSessionHydrated,
|
|
46
50
|
renderToolResult,
|
|
47
51
|
tools,
|
|
48
52
|
toolRenderers,
|
|
@@ -73,6 +77,12 @@ function Chat({
|
|
|
73
77
|
);
|
|
74
78
|
const lastDefaultModel = react.useRef(defaultModel);
|
|
75
79
|
const sentInitialPromptId = react.useRef(null);
|
|
80
|
+
const activeThreadRef = react.useRef(threadId);
|
|
81
|
+
const onMessageCountChangeRef = react.useRef(onMessageCountChange);
|
|
82
|
+
const onSessionHydratedRef = react.useRef(onSessionHydrated);
|
|
83
|
+
activeThreadRef.current = threadId;
|
|
84
|
+
onMessageCountChangeRef.current = onMessageCountChange;
|
|
85
|
+
onSessionHydratedRef.current = onSessionHydrated;
|
|
76
86
|
const runtime = controlledRuntime ?? internalRuntime;
|
|
77
87
|
const toolRegistry = react.useMemo(
|
|
78
88
|
() => registry.toToolRenderRegistry(toolRenderers, tools ? { tools } : {}),
|
|
@@ -168,6 +178,7 @@ function Chat({
|
|
|
168
178
|
setApprovalError(void 0);
|
|
169
179
|
setMessagesRef.current([]);
|
|
170
180
|
void approval.getChatSession(sessionsApi, threadId).then((session) => {
|
|
181
|
+
var _a;
|
|
171
182
|
if (cancelled) return;
|
|
172
183
|
if (session.id !== threadId) {
|
|
173
184
|
throw new Error(
|
|
@@ -176,6 +187,7 @@ function Chat({
|
|
|
176
187
|
}
|
|
177
188
|
setMessagesRef.current(session.messages);
|
|
178
189
|
setHydratedSessionId(session.id);
|
|
190
|
+
(_a = onSessionHydratedRef.current) == null ? void 0 : _a.call(onSessionHydratedRef, session);
|
|
179
191
|
}).catch((cause) => {
|
|
180
192
|
if (cancelled) return;
|
|
181
193
|
setApprovalError(
|
|
@@ -186,6 +198,13 @@ function Chat({
|
|
|
186
198
|
cancelled = true;
|
|
187
199
|
};
|
|
188
200
|
}, [sessionsApi, threadId]);
|
|
201
|
+
react.useEffect(() => {
|
|
202
|
+
var _a;
|
|
203
|
+
(_a = onMessageCountChangeRef.current) == null ? void 0 : _a.call(
|
|
204
|
+
onMessageCountChangeRef,
|
|
205
|
+
messages.filter((message) => !forkSeed.isForkSeedMessage(message)).length
|
|
206
|
+
);
|
|
207
|
+
}, [messages]);
|
|
189
208
|
react.useEffect(() => {
|
|
190
209
|
if (!initialPrompt || status !== "ready") return;
|
|
191
210
|
if (sessionsApi && threadId && hydratedSessionId !== threadId) return;
|
|
@@ -232,6 +251,7 @@ function Chat({
|
|
|
232
251
|
}
|
|
233
252
|
};
|
|
234
253
|
const resolveToolApproval = async (id, approved, reason) => {
|
|
254
|
+
const approvalThreadId = threadId;
|
|
235
255
|
setApprovalError(void 0);
|
|
236
256
|
try {
|
|
237
257
|
if (!sessionsApi) {
|
|
@@ -241,18 +261,20 @@ function Chat({
|
|
|
241
261
|
}
|
|
242
262
|
const session = await approval.postToolApproval({
|
|
243
263
|
sessionsApi,
|
|
244
|
-
sessionId:
|
|
264
|
+
sessionId: approvalThreadId ?? "",
|
|
245
265
|
approvalId: id,
|
|
246
266
|
approved,
|
|
247
267
|
...reason ? { reason } : {}
|
|
248
268
|
});
|
|
249
|
-
if (
|
|
269
|
+
if (activeThreadRef.current !== approvalThreadId) return;
|
|
270
|
+
if (session.id !== approvalThreadId) {
|
|
250
271
|
throw new Error(
|
|
251
|
-
`Captain chat session response ID "${session.id}" does not match active session "${
|
|
272
|
+
`Captain chat session response ID "${session.id}" does not match active session "${approvalThreadId ?? ""}".`
|
|
252
273
|
);
|
|
253
274
|
}
|
|
254
275
|
setMessages(session.messages);
|
|
255
276
|
} catch (cause) {
|
|
277
|
+
if (activeThreadRef.current !== approvalThreadId) return;
|
|
256
278
|
setApprovalError(
|
|
257
279
|
cause instanceof Error ? cause : new Error(String(cause))
|
|
258
280
|
);
|
|
@@ -268,6 +290,7 @@ function Chat({
|
|
|
268
290
|
selectedModel,
|
|
269
291
|
usage,
|
|
270
292
|
threadId,
|
|
293
|
+
locked: runtimeLocked,
|
|
271
294
|
onRuntimeChange: handleRuntimeChange
|
|
272
295
|
}
|
|
273
296
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chat.cjs","sources":["../../../src/data/chat/Chat.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport, type ChatTransport, type UIMessage } from \"ai\";\nimport { cn } from \"../../lib/utils\";\nimport { Conversation } from \"./Conversation\";\nimport { PromptInput } from \"./PromptInput\";\nimport { Suggestions } from \"./Suggestion\";\nimport { DEFAULT_REASONING_EFFORTS } from \"./effort-icons\";\nimport { defaultChatModelId } from \"./models\";\nimport { getChatSession, postToolApproval } from \"./approval\";\nimport {\n hasStructuredRuntime,\n resolveChatRuntime,\n selectedChatModel,\n} from \"./Chat.runtime\";\nimport {\n createAttachmentUploadAdapter,\n type AttachmentLimits,\n type AttachmentUploadAdapter,\n} from \"./attachment-upload\";\nimport { toToolRenderRegistry } from \"./tool-render/registry\";\nimport { ToolRenderRegistryProvider } from \"./tool-render/context\";\nimport { ChatRuntimeToolbar } from \"./ChatRuntimeToolbar\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\nimport type {\n ToolRenderAdapter,\n ToolRenderRegistry,\n} from \"./tool-render/adapter\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatMessageMetadata,\n ChatModelRuntime,\n ChatUsageSummary,\n ClaudePermissionMode,\n Suggestion,\n ToolMeta,\n ToolResultRenderer,\n} from \"./types\";\nimport { usageSnapshotFromMetadata } from \"./usage-snapshot\";\n\n/** Assistant messages carry token usage + cost the backend rode on the finish\n * part's `messageMetadata`. */\ntype ChatUIMessage = UIMessage<ChatMessageMetadata>;\n\nexport type ChatProps = {\n /** Endpoint that speaks the AI SDK v6 UI Message Stream protocol.\n * Ignored when `transport` is supplied. Defaults to \"/api/chat\". */\n api?: string;\n /** Model menu. When omitted and `modelsApi` is set, it is fetched. */\n models?: ChatModel[];\n /** Endpoint returning the model menu (ModelInfo[]). Defaults to\n * \"/api/chat/models\". Set to null to disable fetching. */\n modelsApi?: string | null;\n /** Initially selected model id; otherwise the first configured model. */\n defaultModel?: string;\n /** Controlled selected model id. */\n model?: string;\n /** Initially selected structured runtime. */\n defaultRuntime?: ChatModelRuntime;\n /** Controlled structured runtime. */\n runtime?: ChatModelRuntime;\n /** Runtime families and their host availability. */\n runtimeFamilies?: SpecRuntimeFamily[];\n /** Reasoning-effort options for capable models. */\n reasoningEfforts?: string[];\n /** Initially selected reasoning effort (\"\" = none). */\n defaultReasoningEffort?: string;\n /** Controlled selected reasoning effort (\"\" = none). */\n reasoningEffort?: string;\n /** Sampling temperature forwarded to the backend when set. */\n temperature?: number;\n /** Per-request budget forwarded to the backend when set. */\n budget?: ChatBudgetConfig;\n /** Claude Agent SDK permission mode forwarded to the backend when set. */\n permissionMode?: ClaudePermissionMode;\n /** Notified when the user changes the model. */\n onModelChange?: (id: string) => void;\n /** Notified when the user changes any runtime field. */\n onRuntimeChange?: (runtime: ChatModelRuntime) => void;\n /** Notified when the user changes reasoning effort. */\n onReasoningEffortChange?: (effort: string) => void;\n /** Notified when the user changes Claude permission mode. */\n onPermissionModeChange?: (mode: ClaudePermissionMode) => void;\n /** Notified after each assistant turn with a usage snapshot (tokens used out\n * of the model's context window + cumulative cost), for a usage gauge. */\n onUsage?: (usage: ChatUsageSummary) => void;\n /** Suggested prompts shown on the empty state. */\n suggestions?: Suggestion[];\n /** Enables file/image attachments. */\n enableAttachments?: boolean;\n /** Upload endpoint used before an attachment is added to a chat message. */\n attachmentsApi?: string;\n /** Custom durable upload adapter; overrides attachmentsApi. */\n attachmentUpload?: AttachmentUploadAdapter;\n attachmentLimits?: AttachmentLimits;\n /** Captain thread id used as the AI SDK chat id and forwarded in the body. */\n threadId?: string;\n /** Canonical Captain session endpoint used to hydrate messages and resolve\n * approvals. The session and approval ids are appended to this URL. */\n sessionsApi?: string | null;\n /** Optional host renderer for recognized completed tool outputs. Takes\n * priority over `toolRenderers` on the output surface. */\n renderToolResult?: ToolResultRenderer;\n /** Tool catalog, used to resolve each call's input/output JSON Schema so\n * params and results render with real labels instead of raw JSON. */\n tools?: ToolMeta[];\n /** Domain tool renderers. Host adapters are matched before the built-in\n * heuristics, which stay as the floor. */\n toolRenderers?: ToolRenderAdapter[] | ToolRenderRegistry;\n /** Extra fields merged into every request body. */\n body?: Record<string, unknown>;\n /** Pre-built transport (e.g. a mock for stories/tests). */\n transport?: ChatTransport<UIMessage>;\n /** Initial messages to seed the conversation. */\n initialMessages?: UIMessage[];\n /** Prompt to send automatically once. A new `id` sends even when text repeats. */\n initialPrompt?: { id: number; text: string } | null;\n /** Called after `initialPrompt` has been handed to the chat transport. */\n onInitialPromptSent?: () => void;\n placeholder?: string;\n emptyState?: React.ReactNode;\n className?: string;\n};\n\n/** Self-contained AI chat over a v6-compatible `/api/chat`: a streaming\n * conversation with model/effort selectors, suggestions, attachments,\n * per-message copy/regenerate, and human-in-the-loop tool approvals. The\n * backend owns model selection and tool execution; the selected model,\n * effort, permission mode and thread id are forwarded in the request body. */\nexport function Chat({\n api = \"/api/chat\",\n models: modelsProp,\n modelsApi = \"/api/chat/models\",\n defaultModel,\n model: controlledModel,\n defaultRuntime,\n runtime: controlledRuntime,\n runtimeFamilies,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n defaultReasoningEffort,\n reasoningEffort: controlledEffort,\n temperature,\n budget,\n permissionMode,\n onModelChange,\n onRuntimeChange,\n onReasoningEffortChange,\n onUsage,\n suggestions,\n enableAttachments = false,\n attachmentsApi = \"/api/attachments\",\n attachmentUpload,\n attachmentLimits,\n threadId,\n sessionsApi = null,\n renderToolResult,\n tools,\n toolRenderers,\n body,\n transport,\n initialMessages,\n initialPrompt,\n onInitialPromptSent,\n placeholder,\n emptyState,\n className,\n}: ChatProps) {\n const [models, setModels] = useState<ChatModel[]>(modelsProp ?? []);\n const [internalRuntime, setInternalRuntime] = useState<ChatModelRuntime>(\n () =>\n controlledRuntime ??\n resolveChatRuntime({\n models: modelsProp ?? [],\n current: defaultRuntime,\n preferredModel:\n controlledModel ??\n (defaultRuntime\n ? undefined\n : (defaultModel ?? defaultChatModelId(modelsProp ?? []))),\n effort: controlledEffort ?? defaultReasoningEffort,\n temperature,\n reasoningEfforts,\n }),\n );\n const [usage, setUsage] = useState<ChatUsageSummary | null>(null);\n const [approvalError, setApprovalError] = useState<Error | undefined>();\n const [hydratedSessionId, setHydratedSessionId] = useState<string | null>(\n null,\n );\n const lastDefaultModel = useRef(defaultModel);\n const sentInitialPromptId = useRef<number | null>(null);\n const runtime = controlledRuntime ?? internalRuntime;\n\n // Provided once here; <ToolCall> reads it from context, so no tool-render\n // props thread through Conversation/Message.\n const toolRegistry = useMemo(\n () => toToolRenderRegistry(toolRenderers, tools ? { tools } : {}),\n [toolRenderers, tools],\n );\n\n useEffect(() => {\n if (!modelsProp) return;\n setModels(modelsProp);\n }, [modelsProp]);\n\n // Fetch the model menu unless one was supplied or fetching is disabled.\n useEffect(() => {\n if (modelsProp || !modelsApi) return;\n let cancelled = false;\n fetch(modelsApi)\n .then((r) =>\n r.ok ? r.json() : Promise.reject(new Error(`models ${r.status}`)),\n )\n .then((data: ChatModel[]) => {\n if (cancelled) return;\n setModels(data);\n })\n .catch((err) =>\n console.warn(\"clicky-ui: failed to load chat models\", err),\n );\n return () => {\n cancelled = true;\n };\n }, [modelsProp, modelsApi]);\n\n useEffect(() => {\n if (controlledRuntime !== undefined) return;\n const defaultChanged =\n Boolean(defaultModel) && defaultModel !== lastDefaultModel.current;\n lastDefaultModel.current = defaultModel;\n setInternalRuntime((current) =>\n resolveChatRuntime({\n models,\n current,\n preferredModel:\n controlledModel ??\n (defaultChanged\n ? defaultModel\n : (selectedChatModel(models, current)?.id ??\n defaultModel ??\n defaultChatModelId(models))),\n effort: controlledEffort,\n temperature,\n reasoningEfforts,\n }),\n );\n }, [\n controlledEffort,\n controlledModel,\n controlledRuntime,\n defaultModel,\n models,\n reasoningEfforts,\n temperature,\n ]);\n\n const selectedModel = selectedChatModel(models, runtime);\n const structuredRuntime = hasStructuredRuntime(runtime, selectedModel);\n const resolvedAttachmentUpload = useMemo(\n () =>\n attachmentUpload ??\n createAttachmentUploadAdapter({ endpoint: attachmentsApi }),\n [attachmentUpload, attachmentsApi],\n );\n\n // A function body keeps the transport stable while always sending the latest\n // model/effort/runtime selections.\n const bodyRef = useRef<Record<string, unknown>>({});\n bodyRef.current = {\n ...body,\n ...(structuredRuntime\n ? { runtime }\n : {\n ...(runtime.model ? { model: runtime.model } : {}),\n ...(runtime.effort ? { reasoningEffort: runtime.effort } : {}),\n ...(runtime.temperature !== undefined\n ? { temperature: runtime.temperature }\n : {}),\n }),\n ...(budget && (budget.cost !== undefined || budget.maxTokens !== undefined)\n ? { budget }\n : {}),\n ...(permissionMode ? { permissionMode } : {}),\n ...(threadId ? { threadId } : {}),\n };\n\n const resolvedTransport = useMemo<ChatTransport<UIMessage>>(\n () =>\n transport ??\n new DefaultChatTransport({ api, body: () => bodyRef.current }),\n [transport, api],\n );\n\n const {\n messages,\n setMessages,\n sendMessage,\n regenerate,\n status,\n error,\n clearError,\n stop,\n } = useChat<ChatUIMessage>({\n transport: resolvedTransport,\n ...(threadId ? { id: threadId } : {}),\n ...(initialMessages\n ? { messages: initialMessages as ChatUIMessage[] }\n : {}),\n });\n const setMessagesRef = useRef(setMessages);\n setMessagesRef.current = setMessages;\n\n useEffect(() => {\n if (!sessionsApi || !threadId) return;\n let cancelled = false;\n setHydratedSessionId(null);\n setApprovalError(undefined);\n setMessagesRef.current([]);\n void getChatSession(sessionsApi, threadId)\n .then((session) => {\n if (cancelled) return;\n if (session.id !== threadId) {\n throw new Error(\n `Captain chat session response ID \"${session.id}\" does not match requested session \"${threadId}\".`,\n );\n }\n setMessagesRef.current(session.messages as ChatUIMessage[]);\n setHydratedSessionId(session.id);\n })\n .catch((cause) => {\n if (cancelled) return;\n setApprovalError(\n cause instanceof Error ? cause : new Error(String(cause)),\n );\n });\n return () => {\n cancelled = true;\n };\n }, [sessionsApi, threadId]);\n\n useEffect(() => {\n if (!initialPrompt || status !== \"ready\") return;\n if (sessionsApi && threadId && hydratedSessionId !== threadId) return;\n if (sentInitialPromptId.current === initialPrompt.id) return;\n const text = initialPrompt.text.trim();\n if (!text) return;\n sentInitialPromptId.current = initialPrompt.id;\n void sendMessage({ text });\n onInitialPromptSent?.();\n }, [\n hydratedSessionId,\n initialPrompt,\n onInitialPromptSent,\n sendMessage,\n sessionsApi,\n status,\n threadId,\n ]);\n\n // Surface a usage snapshot after each settled assistant turn. The backend\n // rides usage/cost on the finish part's messageMetadata; we read it off the\n // last assistant message and resolve maxTokens from the selected model.\n const onUsageRef = useRef(onUsage);\n onUsageRef.current = onUsage;\n useEffect(() => {\n if (status !== \"ready\") return;\n const last = [...messages].reverse().find((m) => m.role === \"assistant\");\n const meta = last?.metadata;\n if (!meta) return;\n const snapshot = usageSnapshotFromMetadata(meta, {\n contextWindow: selectedModel?.contextWindow,\n modelLabel: selectedModel?.label,\n messageCount: messages.length,\n });\n setUsage(snapshot);\n onUsageRef.current?.(snapshot);\n }, [messages, status, selectedModel]);\n\n const handleRuntimeChange = (next: ChatModelRuntime) => {\n if (controlledRuntime === undefined) setInternalRuntime(next);\n onRuntimeChange?.(next);\n const nextModel = selectedChatModel(models, next);\n if (nextModel?.id !== selectedModel?.id) {\n onModelChange?.(nextModel?.id ?? next.id ?? next.model ?? \"\");\n }\n if ((next.effort ?? \"\") !== (runtime.effort ?? \"\")) {\n onReasoningEffortChange?.(next.effort ?? \"\");\n }\n };\n\n const resolveToolApproval = async (\n id: string,\n approved: boolean,\n reason?: string,\n ) => {\n setApprovalError(undefined);\n try {\n if (!sessionsApi) {\n throw new Error(\n \"A Captain sessions API is required to resolve tool approvals.\",\n );\n }\n const session = await postToolApproval({\n sessionsApi,\n sessionId: threadId ?? \"\",\n approvalId: id,\n approved,\n ...(reason ? { reason } : {}),\n });\n if (session.id !== threadId) {\n throw new Error(\n `Captain chat session response ID \"${session.id}\" does not match active session \"${threadId ?? \"\"}\".`,\n );\n }\n setMessages(session.messages as ChatUIMessage[]);\n } catch (cause) {\n setApprovalError(\n cause instanceof Error ? cause : new Error(String(cause)),\n );\n }\n };\n\n const toolbar = (\n <ChatRuntimeToolbar\n models={models}\n runtime={runtime}\n runtimeFamilies={runtimeFamilies}\n reasoningEfforts={reasoningEfforts}\n selectedModel={selectedModel}\n usage={usage}\n threadId={threadId}\n onRuntimeChange={handleRuntimeChange}\n />\n );\n\n const empty =\n messages.length === 0 && (emptyState || suggestions?.length) ? (\n <div className=\"flex flex-col items-center gap-4\">\n {emptyState}\n {suggestions && suggestions.length > 0 && (\n <Suggestions\n suggestions={suggestions}\n onSelect={(text) => void sendMessage({ text })}\n />\n )}\n </div>\n ) : undefined;\n\n return (\n <ToolRenderRegistryProvider value={toolRegistry}>\n <div className={cn(\"flex h-full flex-col\", className)}>\n <Conversation\n messages={messages}\n status={status}\n error={approvalError ?? error}\n onClearError={() => {\n setApprovalError(undefined);\n clearError();\n }}\n {...(threadId ? { sessionId: threadId } : {})}\n {...(selectedModel?.id\n ? { model: selectedModel.id }\n : runtime.model\n ? { model: runtime.model }\n : {})}\n emptyState={empty}\n onRegenerate={(messageId) => void regenerate({ messageId })}\n onApprove={(id, approved, reason) =>\n void resolveToolApproval(id, approved, reason)\n }\n {...(renderToolResult ? { renderToolResult } : {})}\n />\n <div className=\"p-4 pt-0\">\n <PromptInput\n status={status}\n onStop={() => void stop()}\n placeholder={placeholder}\n enableAttachments={enableAttachments}\n attachmentUpload={resolvedAttachmentUpload}\n {...(selectedModel?.inputMediaTypes\n ? { acceptedMediaTypes: selectedModel.inputMediaTypes }\n : {})}\n {...(attachmentLimits ? { attachmentLimits } : {})}\n toolbar={toolbar}\n onSubmit={(text, files) => void sendMessage({ text, files })}\n />\n </div>\n </div>\n </ToolRenderRegistryProvider>\n );\n}\n"],"names":["DEFAULT_REASONING_EFFORTS","attachmentUpload","models","useState","resolveChatRuntime","defaultChatModelId","useRef","useMemo","toToolRenderRegistry","useEffect","selectedChatModel","hasStructuredRuntime","createAttachmentUploadAdapter","DefaultChatTransport","useChat","getChatSession","usageSnapshotFromMetadata","postToolApproval","jsx","ChatRuntimeToolbar","jsxs","Suggestions","ToolRenderRegistryProvider","cn","Conversation","PromptInput"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Chat.cjs","sources":["../../../src/data/chat/Chat.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport, type ChatTransport, type UIMessage } from \"ai\";\nimport { cn } from \"../../lib/utils\";\nimport { Conversation } from \"./Conversation\";\nimport { PromptInput } from \"./PromptInput\";\nimport { Suggestions } from \"./Suggestion\";\nimport { DEFAULT_REASONING_EFFORTS } from \"./effort-icons\";\nimport { defaultChatModelId } from \"./models\";\nimport {\n getChatSession,\n postToolApproval,\n type CaptainChatSession,\n} from \"./approval\";\nimport { isForkSeedMessage } from \"./fork-seed\";\nimport {\n hasStructuredRuntime,\n resolveChatRuntime,\n selectedChatModel,\n} from \"./Chat.runtime\";\nimport {\n createAttachmentUploadAdapter,\n type AttachmentLimits,\n type AttachmentUploadAdapter,\n} from \"./attachment-upload\";\nimport { toToolRenderRegistry } from \"./tool-render/registry\";\nimport { ToolRenderRegistryProvider } from \"./tool-render/context\";\nimport { ChatRuntimeToolbar } from \"./ChatRuntimeToolbar\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\nimport type {\n ToolRenderAdapter,\n ToolRenderRegistry,\n} from \"./tool-render/adapter\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatMessageMetadata,\n ChatModelRuntime,\n ChatUsageSummary,\n ClaudePermissionMode,\n Suggestion,\n ToolMeta,\n ToolResultRenderer,\n} from \"./types\";\nimport { usageSnapshotFromMetadata } from \"./usage-snapshot\";\n\n/** Assistant messages carry token usage + cost the backend rode on the finish\n * part's `messageMetadata`. */\ntype ChatUIMessage = UIMessage<ChatMessageMetadata>;\n\nexport type ChatProps = {\n /** Endpoint that speaks the AI SDK v6 UI Message Stream protocol.\n * Ignored when `transport` is supplied. Defaults to \"/api/chat\". */\n api?: string;\n /** Model menu. When omitted and `modelsApi` is set, it is fetched. */\n models?: ChatModel[];\n /** Endpoint returning the model menu (ModelInfo[]). Defaults to\n * \"/api/chat/models\". Set to null to disable fetching. */\n modelsApi?: string | null;\n /** Initially selected model id; otherwise the first configured model. */\n defaultModel?: string;\n /** Controlled selected model id. */\n model?: string;\n /** Initially selected structured runtime. */\n defaultRuntime?: ChatModelRuntime;\n /** Controlled structured runtime. */\n runtime?: ChatModelRuntime;\n /** Runtime families and their host availability. */\n runtimeFamilies?: SpecRuntimeFamily[];\n /** Reasoning-effort options for capable models. */\n reasoningEfforts?: string[];\n /** Initially selected reasoning effort (\"\" = none). */\n defaultReasoningEffort?: string;\n /** Controlled selected reasoning effort (\"\" = none). */\n reasoningEffort?: string;\n /** Sampling temperature forwarded to the backend when set. */\n temperature?: number;\n /** Per-request budget forwarded to the backend when set. */\n budget?: ChatBudgetConfig;\n /** Claude Agent SDK permission mode forwarded to the backend when set. */\n permissionMode?: ClaudePermissionMode;\n /** Notified when the user changes the model. */\n onModelChange?: (id: string) => void;\n /** Notified when the user changes any runtime field. */\n onRuntimeChange?: (runtime: ChatModelRuntime) => void;\n /** Notified when the user changes reasoning effort. */\n onReasoningEffortChange?: (effort: string) => void;\n /** Notified when the user changes Claude permission mode. */\n onPermissionModeChange?: (mode: ClaudePermissionMode) => void;\n /** Notified after each assistant turn with a usage snapshot (tokens used out\n * of the model's context window + cumulative cost), for a usage gauge. */\n onUsage?: (usage: ChatUsageSummary) => void;\n /** Suggested prompts shown on the empty state. */\n suggestions?: Suggestion[];\n /** Enables file/image attachments. */\n enableAttachments?: boolean;\n /** Upload endpoint used before an attachment is added to a chat message. */\n attachmentsApi?: string;\n /** Custom durable upload adapter; overrides attachmentsApi. */\n attachmentUpload?: AttachmentUploadAdapter;\n attachmentLimits?: AttachmentLimits;\n /** Captain thread id used as the AI SDK chat id and forwarded in the body. */\n threadId?: string;\n /** Canonical Captain session endpoint used to hydrate messages and resolve\n * approvals. The session and approval ids are appended to this URL. */\n sessionsApi?: string | null;\n /** Prevents changing model/backend for an existing Captain session. Effort\n * and other per-turn generation settings remain editable. */\n runtimeLocked?: boolean;\n /** Reports the number of real (non-fork-seed) persisted/UI messages. */\n onMessageCountChange?: (count: number) => void;\n /** Reports the authoritative Captain session after detail hydration. */\n onSessionHydrated?: (session: CaptainChatSession) => void;\n /** Optional host renderer for recognized completed tool outputs. Takes\n * priority over `toolRenderers` on the output surface. */\n renderToolResult?: ToolResultRenderer;\n /** Tool catalog, used to resolve each call's input/output JSON Schema so\n * params and results render with real labels instead of raw JSON. */\n tools?: ToolMeta[];\n /** Domain tool renderers. Host adapters are matched before the built-in\n * heuristics, which stay as the floor. */\n toolRenderers?: ToolRenderAdapter[] | ToolRenderRegistry;\n /** Extra fields merged into every request body. */\n body?: Record<string, unknown>;\n /** Pre-built transport (e.g. a mock for stories/tests). */\n transport?: ChatTransport<UIMessage>;\n /** Initial messages to seed the conversation. */\n initialMessages?: UIMessage[];\n /** Prompt to send automatically once. A new `id` sends even when text repeats. */\n initialPrompt?: { id: number; text: string } | null;\n /** Called after `initialPrompt` has been handed to the chat transport. */\n onInitialPromptSent?: () => void;\n placeholder?: string;\n emptyState?: React.ReactNode;\n className?: string;\n};\n\n/** Self-contained AI chat over a v6-compatible `/api/chat`: a streaming\n * conversation with model/effort selectors, suggestions, attachments,\n * per-message copy/regenerate, and human-in-the-loop tool approvals. The\n * backend owns model selection and tool execution; the selected model,\n * effort, permission mode and thread id are forwarded in the request body. */\nexport function Chat({\n api = \"/api/chat\",\n models: modelsProp,\n modelsApi = \"/api/chat/models\",\n defaultModel,\n model: controlledModel,\n defaultRuntime,\n runtime: controlledRuntime,\n runtimeFamilies,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n defaultReasoningEffort,\n reasoningEffort: controlledEffort,\n temperature,\n budget,\n permissionMode,\n onModelChange,\n onRuntimeChange,\n onReasoningEffortChange,\n onUsage,\n suggestions,\n enableAttachments = false,\n attachmentsApi = \"/api/attachments\",\n attachmentUpload,\n attachmentLimits,\n threadId,\n sessionsApi = null,\n runtimeLocked = false,\n onMessageCountChange,\n onSessionHydrated,\n renderToolResult,\n tools,\n toolRenderers,\n body,\n transport,\n initialMessages,\n initialPrompt,\n onInitialPromptSent,\n placeholder,\n emptyState,\n className,\n}: ChatProps) {\n const [models, setModels] = useState<ChatModel[]>(modelsProp ?? []);\n const [internalRuntime, setInternalRuntime] = useState<ChatModelRuntime>(\n () =>\n controlledRuntime ??\n resolveChatRuntime({\n models: modelsProp ?? [],\n current: defaultRuntime,\n preferredModel:\n controlledModel ??\n (defaultRuntime\n ? undefined\n : (defaultModel ?? defaultChatModelId(modelsProp ?? []))),\n effort: controlledEffort ?? defaultReasoningEffort,\n temperature,\n reasoningEfforts,\n }),\n );\n const [usage, setUsage] = useState<ChatUsageSummary | null>(null);\n const [approvalError, setApprovalError] = useState<Error | undefined>();\n const [hydratedSessionId, setHydratedSessionId] = useState<string | null>(\n null,\n );\n const lastDefaultModel = useRef(defaultModel);\n const sentInitialPromptId = useRef<number | null>(null);\n const activeThreadRef = useRef(threadId);\n const onMessageCountChangeRef = useRef(onMessageCountChange);\n const onSessionHydratedRef = useRef(onSessionHydrated);\n activeThreadRef.current = threadId;\n onMessageCountChangeRef.current = onMessageCountChange;\n onSessionHydratedRef.current = onSessionHydrated;\n const runtime = controlledRuntime ?? internalRuntime;\n\n // Provided once here; <ToolCall> reads it from context, so no tool-render\n // props thread through Conversation/Message.\n const toolRegistry = useMemo(\n () => toToolRenderRegistry(toolRenderers, tools ? { tools } : {}),\n [toolRenderers, tools],\n );\n\n useEffect(() => {\n if (!modelsProp) return;\n setModels(modelsProp);\n }, [modelsProp]);\n\n // Fetch the model menu unless one was supplied or fetching is disabled.\n useEffect(() => {\n if (modelsProp || !modelsApi) return;\n let cancelled = false;\n fetch(modelsApi)\n .then((r) =>\n r.ok ? r.json() : Promise.reject(new Error(`models ${r.status}`)),\n )\n .then((data: ChatModel[]) => {\n if (cancelled) return;\n setModels(data);\n })\n .catch((err) =>\n console.warn(\"clicky-ui: failed to load chat models\", err),\n );\n return () => {\n cancelled = true;\n };\n }, [modelsProp, modelsApi]);\n\n useEffect(() => {\n if (controlledRuntime !== undefined) return;\n const defaultChanged =\n Boolean(defaultModel) && defaultModel !== lastDefaultModel.current;\n lastDefaultModel.current = defaultModel;\n setInternalRuntime((current) =>\n resolveChatRuntime({\n models,\n current,\n preferredModel:\n controlledModel ??\n (defaultChanged\n ? defaultModel\n : (selectedChatModel(models, current)?.id ??\n defaultModel ??\n defaultChatModelId(models))),\n effort: controlledEffort,\n temperature,\n reasoningEfforts,\n }),\n );\n }, [\n controlledEffort,\n controlledModel,\n controlledRuntime,\n defaultModel,\n models,\n reasoningEfforts,\n temperature,\n ]);\n\n const selectedModel = selectedChatModel(models, runtime);\n const structuredRuntime = hasStructuredRuntime(runtime, selectedModel);\n const resolvedAttachmentUpload = useMemo(\n () =>\n attachmentUpload ??\n createAttachmentUploadAdapter({ endpoint: attachmentsApi }),\n [attachmentUpload, attachmentsApi],\n );\n\n // A function body keeps the transport stable while always sending the latest\n // model/effort/runtime selections.\n const bodyRef = useRef<Record<string, unknown>>({});\n bodyRef.current = {\n ...body,\n ...(structuredRuntime\n ? { runtime }\n : {\n ...(runtime.model ? { model: runtime.model } : {}),\n ...(runtime.effort ? { reasoningEffort: runtime.effort } : {}),\n ...(runtime.temperature !== undefined\n ? { temperature: runtime.temperature }\n : {}),\n }),\n ...(budget && (budget.cost !== undefined || budget.maxTokens !== undefined)\n ? { budget }\n : {}),\n ...(permissionMode ? { permissionMode } : {}),\n ...(threadId ? { threadId } : {}),\n };\n\n const resolvedTransport = useMemo<ChatTransport<UIMessage>>(\n () =>\n transport ??\n new DefaultChatTransport({ api, body: () => bodyRef.current }),\n [transport, api],\n );\n\n const {\n messages,\n setMessages,\n sendMessage,\n regenerate,\n status,\n error,\n clearError,\n stop,\n } = useChat<ChatUIMessage>({\n transport: resolvedTransport,\n ...(threadId ? { id: threadId } : {}),\n ...(initialMessages\n ? { messages: initialMessages as ChatUIMessage[] }\n : {}),\n });\n const setMessagesRef = useRef(setMessages);\n setMessagesRef.current = setMessages;\n\n useEffect(() => {\n if (!sessionsApi || !threadId) return;\n let cancelled = false;\n setHydratedSessionId(null);\n setApprovalError(undefined);\n setMessagesRef.current([]);\n void getChatSession(sessionsApi, threadId)\n .then((session) => {\n if (cancelled) return;\n if (session.id !== threadId) {\n throw new Error(\n `Captain chat session response ID \"${session.id}\" does not match requested session \"${threadId}\".`,\n );\n }\n setMessagesRef.current(session.messages as ChatUIMessage[]);\n setHydratedSessionId(session.id);\n onSessionHydratedRef.current?.(session);\n })\n .catch((cause) => {\n if (cancelled) return;\n setApprovalError(\n cause instanceof Error ? cause : new Error(String(cause)),\n );\n });\n return () => {\n cancelled = true;\n };\n }, [sessionsApi, threadId]);\n\n useEffect(() => {\n onMessageCountChangeRef.current?.(\n messages.filter((message) => !isForkSeedMessage(message)).length,\n );\n }, [messages]);\n\n useEffect(() => {\n if (!initialPrompt || status !== \"ready\") return;\n if (sessionsApi && threadId && hydratedSessionId !== threadId) return;\n if (sentInitialPromptId.current === initialPrompt.id) return;\n const text = initialPrompt.text.trim();\n if (!text) return;\n sentInitialPromptId.current = initialPrompt.id;\n void sendMessage({ text });\n onInitialPromptSent?.();\n }, [\n hydratedSessionId,\n initialPrompt,\n onInitialPromptSent,\n sendMessage,\n sessionsApi,\n status,\n threadId,\n ]);\n\n // Surface a usage snapshot after each settled assistant turn. The backend\n // rides usage/cost on the finish part's messageMetadata; we read it off the\n // last assistant message and resolve maxTokens from the selected model.\n const onUsageRef = useRef(onUsage);\n onUsageRef.current = onUsage;\n useEffect(() => {\n if (status !== \"ready\") return;\n const last = [...messages].reverse().find((m) => m.role === \"assistant\");\n const meta = last?.metadata;\n if (!meta) return;\n const snapshot = usageSnapshotFromMetadata(meta, {\n contextWindow: selectedModel?.contextWindow,\n modelLabel: selectedModel?.label,\n messageCount: messages.length,\n });\n setUsage(snapshot);\n onUsageRef.current?.(snapshot);\n }, [messages, status, selectedModel]);\n\n const handleRuntimeChange = (next: ChatModelRuntime) => {\n if (controlledRuntime === undefined) setInternalRuntime(next);\n onRuntimeChange?.(next);\n const nextModel = selectedChatModel(models, next);\n if (nextModel?.id !== selectedModel?.id) {\n onModelChange?.(nextModel?.id ?? next.id ?? next.model ?? \"\");\n }\n if ((next.effort ?? \"\") !== (runtime.effort ?? \"\")) {\n onReasoningEffortChange?.(next.effort ?? \"\");\n }\n };\n\n const resolveToolApproval = async (\n id: string,\n approved: boolean,\n reason?: string,\n ) => {\n const approvalThreadId = threadId;\n setApprovalError(undefined);\n try {\n if (!sessionsApi) {\n throw new Error(\n \"A Captain sessions API is required to resolve tool approvals.\",\n );\n }\n const session = await postToolApproval({\n sessionsApi,\n sessionId: approvalThreadId ?? \"\",\n approvalId: id,\n approved,\n ...(reason ? { reason } : {}),\n });\n if (activeThreadRef.current !== approvalThreadId) return;\n if (session.id !== approvalThreadId) {\n throw new Error(\n `Captain chat session response ID \"${session.id}\" does not match active session \"${approvalThreadId ?? \"\"}\".`,\n );\n }\n setMessages(session.messages as ChatUIMessage[]);\n } catch (cause) {\n if (activeThreadRef.current !== approvalThreadId) return;\n setApprovalError(\n cause instanceof Error ? cause : new Error(String(cause)),\n );\n }\n };\n\n const toolbar = (\n <ChatRuntimeToolbar\n models={models}\n runtime={runtime}\n runtimeFamilies={runtimeFamilies}\n reasoningEfforts={reasoningEfforts}\n selectedModel={selectedModel}\n usage={usage}\n threadId={threadId}\n locked={runtimeLocked}\n onRuntimeChange={handleRuntimeChange}\n />\n );\n\n const empty =\n messages.length === 0 && (emptyState || suggestions?.length) ? (\n <div className=\"flex flex-col items-center gap-4\">\n {emptyState}\n {suggestions && suggestions.length > 0 && (\n <Suggestions\n suggestions={suggestions}\n onSelect={(text) => void sendMessage({ text })}\n />\n )}\n </div>\n ) : undefined;\n\n return (\n <ToolRenderRegistryProvider value={toolRegistry}>\n <div className={cn(\"flex h-full flex-col\", className)}>\n <Conversation\n messages={messages}\n status={status}\n error={approvalError ?? error}\n onClearError={() => {\n setApprovalError(undefined);\n clearError();\n }}\n {...(threadId ? { sessionId: threadId } : {})}\n {...(selectedModel?.id\n ? { model: selectedModel.id }\n : runtime.model\n ? { model: runtime.model }\n : {})}\n emptyState={empty}\n onRegenerate={(messageId) => void regenerate({ messageId })}\n onApprove={(id, approved, reason) =>\n void resolveToolApproval(id, approved, reason)\n }\n {...(renderToolResult ? { renderToolResult } : {})}\n />\n <div className=\"p-4 pt-0\">\n <PromptInput\n status={status}\n onStop={() => void stop()}\n placeholder={placeholder}\n enableAttachments={enableAttachments}\n attachmentUpload={resolvedAttachmentUpload}\n {...(selectedModel?.inputMediaTypes\n ? { acceptedMediaTypes: selectedModel.inputMediaTypes }\n : {})}\n {...(attachmentLimits ? { attachmentLimits } : {})}\n toolbar={toolbar}\n onSubmit={(text, files) => void sendMessage({ text, files })}\n />\n </div>\n </div>\n </ToolRenderRegistryProvider>\n );\n}\n"],"names":["DEFAULT_REASONING_EFFORTS","attachmentUpload","models","useState","resolveChatRuntime","defaultChatModelId","useRef","useMemo","toToolRenderRegistry","useEffect","selectedChatModel","hasStructuredRuntime","createAttachmentUploadAdapter","DefaultChatTransport","useChat","getChatSession","isForkSeedMessage","usageSnapshotFromMetadata","postToolApproval","jsx","ChatRuntimeToolbar","jsxs","Suggestions","ToolRenderRegistryProvider","cn","Conversation","PromptInput"],"mappings":"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"}
|