@flanksource/clicky-ui 0.3.16 → 0.3.17
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/data/DataTable.cjs +30 -10
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +2 -0
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +30 -10
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/ServerTimingBadge.cjs +64 -0
- package/dist/data/ServerTimingBadge.cjs.map +1 -0
- package/dist/data/ServerTimingBadge.d.ts +9 -0
- package/dist/data/ServerTimingBadge.d.ts.map +1 -0
- package/dist/data/ServerTimingBadge.js +64 -0
- package/dist/data/ServerTimingBadge.js.map +1 -0
- package/dist/data/ai/ChatWindow.cjs +9 -1
- 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 +9 -1
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.thread-status.cjs +14 -0
- package/dist/data/ai/ChatWindow.thread-status.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.thread-status.d.ts +5 -0
- package/dist/data/ai/ChatWindow.thread-status.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.thread-status.js +14 -0
- package/dist/data/ai/ChatWindow.thread-status.js.map +1 -0
- package/dist/data/ai/ChatWindow.thread.cjs +68 -0
- package/dist/data/ai/ChatWindow.thread.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.thread.d.ts +16 -0
- package/dist/data/ai/ChatWindow.thread.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.thread.js +68 -0
- package/dist/data/ai/ChatWindow.thread.js.map +1 -0
- package/dist/data/ai/PromptRunEditor/index.cjs +100 -88
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +5 -9
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +103 -91
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/model.cjs +47 -0
- package/dist/data/ai/PromptRunEditor/model.cjs.map +1 -0
- package/dist/data/ai/PromptRunEditor/model.d.ts +17 -0
- package/dist/data/ai/PromptRunEditor/model.d.ts.map +1 -0
- package/dist/data/ai/PromptRunEditor/model.js +47 -0
- package/dist/data/ai/PromptRunEditor/model.js.map +1 -0
- package/dist/data/ai/RuntimeBar.cjs +104 -32
- package/dist/data/ai/RuntimeBar.cjs.map +1 -1
- package/dist/data/ai/RuntimeBar.d.ts +4 -11
- package/dist/data/ai/RuntimeBar.d.ts.map +1 -1
- package/dist/data/ai/RuntimeBar.js +107 -35
- package/dist/data/ai/RuntimeBar.js.map +1 -1
- package/dist/data/ai/RuntimeBar.model.cjs +14 -0
- package/dist/data/ai/RuntimeBar.model.cjs.map +1 -0
- package/dist/data/ai/RuntimeBar.model.d.ts +10 -0
- package/dist/data/ai/RuntimeBar.model.d.ts.map +1 -0
- package/dist/data/ai/RuntimeBar.model.js +14 -0
- package/dist/data/ai/RuntimeBar.model.js.map +1 -0
- package/dist/data/ai/RuntimeBarCombo.cjs +359 -0
- package/dist/data/ai/RuntimeBarCombo.cjs.map +1 -0
- package/dist/data/ai/RuntimeBarCombo.d.ts +22 -0
- package/dist/data/ai/RuntimeBarCombo.d.ts.map +1 -0
- package/dist/data/ai/RuntimeBarCombo.js +359 -0
- package/dist/data/ai/RuntimeBarCombo.js.map +1 -0
- package/dist/data/ai/SessionViewer.header.cjs +17 -9
- package/dist/data/ai/SessionViewer.header.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.header.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.header.js +17 -9
- package/dist/data/ai/SessionViewer.header.js.map +1 -1
- package/dist/data/ai/SessionViewer.model.cjs +2 -0
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +4 -0
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js +2 -0
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +1 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/fields.js +1 -1
- package/dist/data/ai/ThreadPicker.cjs.map +1 -1
- package/dist/data/ai/ThreadPicker.d.ts +2 -0
- package/dist/data/ai/ThreadPicker.d.ts.map +1 -1
- package/dist/data/ai/ThreadPicker.js.map +1 -1
- package/dist/data/ai/index.d.ts +1 -0
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/model-capabilities.cjs +12 -1
- package/dist/data/ai/model-capabilities.cjs.map +1 -1
- package/dist/data/ai/model-capabilities.d.ts +2 -6
- package/dist/data/ai/model-capabilities.d.ts.map +1 -1
- package/dist/data/ai/model-capabilities.js +12 -1
- package/dist/data/ai/model-capabilities.js.map +1 -1
- package/dist/data/ai/runtime-mode.cjs +10 -1
- package/dist/data/ai/runtime-mode.cjs.map +1 -1
- package/dist/data/ai/runtime-mode.d.ts +1 -0
- package/dist/data/ai/runtime-mode.d.ts.map +1 -1
- package/dist/data/ai/runtime-mode.js +11 -2
- package/dist/data/ai/runtime-mode.js.map +1 -1
- package/dist/data/chat/Chat.cjs +90 -21
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +4 -1
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +90 -21
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ContextMeter.cjs +144 -73
- package/dist/data/chat/ContextMeter.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.d.ts +8 -3
- package/dist/data/chat/ContextMeter.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.js +144 -73
- package/dist/data/chat/ContextMeter.js.map +1 -1
- package/dist/data/chat/approval.cjs +21 -0
- package/dist/data/chat/approval.cjs.map +1 -0
- package/dist/data/chat/approval.d.ts +11 -0
- package/dist/data/chat/approval.d.ts.map +1 -0
- package/dist/data/chat/approval.js +21 -0
- package/dist/data/chat/approval.js.map +1 -0
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +12 -0
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/server-timing.cjs +120 -0
- package/dist/data/server-timing.cjs.map +1 -0
- package/dist/data/server-timing.d.ts +11 -0
- package/dist/data/server-timing.d.ts.map +1 -0
- package/dist/data/server-timing.js +120 -0
- package/dist/data/server-timing.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +7 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +2 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +7 -0
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +7 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.cjs +1 -1
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.js +1 -1
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/overlay/HoverCard.cjs.map +1 -1
- package/dist/overlay/HoverCard.d.ts +2 -2
- package/dist/overlay/HoverCard.d.ts.map +1 -1
- package/dist/overlay/HoverCard.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +28 -51
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +1 -6
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +29 -52
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationResultView.cjs +42 -0
- package/dist/rpc/OperationResultView.cjs.map +1 -1
- package/dist/rpc/OperationResultView.d.ts +2 -1
- package/dist/rpc/OperationResultView.d.ts.map +1 -1
- package/dist/rpc/OperationResultView.js +42 -0
- package/dist/rpc/OperationResultView.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -0
- package/dist/tailwind-preset.cjs.map +1 -1
- package/dist/tailwind-preset.d.ts.map +1 -1
- package/dist/tailwind-preset.js +4 -0
- package/dist/tailwind-preset.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const react = require("react");
|
|
4
|
+
function useChatThreadSetup({
|
|
5
|
+
threadId,
|
|
6
|
+
api,
|
|
7
|
+
source,
|
|
8
|
+
onCreated
|
|
9
|
+
}) {
|
|
10
|
+
const [attempt, setAttempt] = react.useState(0);
|
|
11
|
+
const [error, setError] = react.useState();
|
|
12
|
+
const request = react.useRef(null);
|
|
13
|
+
const onCreatedRef = react.useRef(onCreated);
|
|
14
|
+
onCreatedRef.current = onCreated;
|
|
15
|
+
const canCreate = Boolean((source == null ? void 0 : source.create) || !source && api);
|
|
16
|
+
react.useEffect(() => {
|
|
17
|
+
if (threadId || !canCreate) {
|
|
18
|
+
request.current = null;
|
|
19
|
+
setError(void 0);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (!request.current) {
|
|
23
|
+
request.current = (source == null ? void 0 : source.create) ? source.create() : createHTTPThread(api);
|
|
24
|
+
}
|
|
25
|
+
let active = true;
|
|
26
|
+
request.current.then((thread) => {
|
|
27
|
+
var _a;
|
|
28
|
+
if (!active) return;
|
|
29
|
+
const id = (_a = thread.id) == null ? void 0 : _a.trim();
|
|
30
|
+
if (!id) {
|
|
31
|
+
throw new Error("Created chat thread has no id.");
|
|
32
|
+
}
|
|
33
|
+
onCreatedRef.current(id);
|
|
34
|
+
}).catch((cause) => {
|
|
35
|
+
if (!active) return;
|
|
36
|
+
setError(cause instanceof Error ? cause.message : String(cause));
|
|
37
|
+
});
|
|
38
|
+
return () => {
|
|
39
|
+
active = false;
|
|
40
|
+
};
|
|
41
|
+
}, [api, attempt, canCreate, source, threadId]);
|
|
42
|
+
const retry = react.useCallback(() => {
|
|
43
|
+
request.current = null;
|
|
44
|
+
setError(void 0);
|
|
45
|
+
setAttempt((value) => value + 1);
|
|
46
|
+
}, []);
|
|
47
|
+
return {
|
|
48
|
+
blocked: !threadId && canCreate,
|
|
49
|
+
pending: !threadId && canCreate && !error,
|
|
50
|
+
...error ? { error } : {},
|
|
51
|
+
retry
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async function createHTTPThread(api) {
|
|
55
|
+
const response = await fetch(api, {
|
|
56
|
+
method: "POST",
|
|
57
|
+
headers: { "Content-Type": "application/json" },
|
|
58
|
+
body: JSON.stringify({ title: "New conversation" })
|
|
59
|
+
});
|
|
60
|
+
if (!response.ok) {
|
|
61
|
+
throw new Error(
|
|
62
|
+
`Creating a chat thread failed with status ${response.status}.`
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
return response.json();
|
|
66
|
+
}
|
|
67
|
+
exports.useChatThreadSetup = useChatThreadSetup;
|
|
68
|
+
//# sourceMappingURL=ChatWindow.thread.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatWindow.thread.cjs","sources":["../../../src/data/ai/ChatWindow.thread.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { ThreadSource, ThreadSummary } from \"./ThreadPicker\";\n\nexport type ChatThreadSetup = {\n blocked: boolean;\n pending: boolean;\n error?: string;\n retry: () => void;\n};\n\ntype ChatThreadSetupOptions = {\n threadId: string | null;\n api: string | null;\n source: ThreadSource | undefined;\n onCreated: (threadId: string) => void;\n};\n\nexport function useChatThreadSetup({\n threadId,\n api,\n source,\n onCreated,\n}: ChatThreadSetupOptions): ChatThreadSetup {\n const [attempt, setAttempt] = useState(0);\n const [error, setError] = useState<string>();\n const request = useRef<Promise<ThreadSummary> | null>(null);\n const onCreatedRef = useRef(onCreated);\n onCreatedRef.current = onCreated;\n const canCreate = Boolean(source?.create || (!source && api));\n\n useEffect(() => {\n if (threadId || !canCreate) {\n request.current = null;\n setError(undefined);\n return;\n }\n if (!request.current) {\n request.current = source?.create\n ? source.create()\n : createHTTPThread(api as string);\n }\n let active = true;\n request.current\n .then((thread) => {\n if (!active) return;\n const id = thread.id?.trim();\n if (!id) {\n throw new Error(\"Created chat thread has no id.\");\n }\n onCreatedRef.current(id);\n })\n .catch((cause) => {\n if (!active) return;\n setError(cause instanceof Error ? cause.message : String(cause));\n });\n return () => {\n active = false;\n };\n }, [api, attempt, canCreate, source, threadId]);\n\n const retry = useCallback(() => {\n request.current = null;\n setError(undefined);\n setAttempt((value) => value + 1);\n }, []);\n return {\n blocked: !threadId && canCreate,\n pending: !threadId && canCreate && !error,\n ...(error ? { error } : {}),\n retry,\n };\n}\n\nasync function createHTTPThread(api: string): Promise<ThreadSummary> {\n const response = await fetch(api, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ title: \"New conversation\" }),\n });\n if (!response.ok) {\n throw new Error(\n `Creating a chat thread failed with status ${response.status}.`,\n );\n }\n return response.json() as Promise<ThreadSummary>;\n}\n"],"names":["useState","useRef","useEffect","useCallback"],"mappings":";;;AAiBO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4C;AAC1C,QAAM,CAAC,SAAS,UAAU,IAAIA,MAAAA,SAAS,CAAC;AACxC,QAAM,CAAC,OAAO,QAAQ,IAAIA,eAAA;AAC1B,QAAM,UAAUC,MAAAA,OAAsC,IAAI;AAC1D,QAAM,eAAeA,MAAAA,OAAO,SAAS;AACrC,eAAa,UAAU;AACvB,QAAM,YAAY,SAAQ,iCAAQ,WAAW,CAAC,UAAU,GAAI;AAE5DC,QAAAA,UAAU,MAAM;AACd,QAAI,YAAY,CAAC,WAAW;AAC1B,cAAQ,UAAU;AAClB,eAAS,MAAS;AAClB;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,SAAS;AACpB,cAAQ,WAAU,iCAAQ,UACtB,OAAO,OAAA,IACP,iBAAiB,GAAa;AAAA,IACpC;AACA,QAAI,SAAS;AACb,YAAQ,QACL,KAAK,CAAC,WAAW;;AAChB,UAAI,CAAC,OAAQ;AACb,YAAM,MAAK,YAAO,OAAP,mBAAW;AACtB,UAAI,CAAC,IAAI;AACP,cAAM,IAAI,MAAM,gCAAgC;AAAA,MAClD;AACA,mBAAa,QAAQ,EAAE;AAAA,IACzB,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,UAAI,CAAC,OAAQ;AACb,eAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACjE,CAAC;AACH,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,KAAK,SAAS,WAAW,QAAQ,QAAQ,CAAC;AAE9C,QAAM,QAAQC,MAAAA,YAAY,MAAM;AAC9B,YAAQ,UAAU;AAClB,aAAS,MAAS;AAClB,eAAW,CAAC,UAAU,QAAQ,CAAC;AAAA,EACjC,GAAG,CAAA,CAAE;AACL,SAAO;AAAA,IACL,SAAS,CAAC,YAAY;AAAA,IACtB,SAAS,CAAC,YAAY,aAAa,CAAC;AAAA,IACpC,GAAI,QAAQ,EAAE,MAAA,IAAU,CAAA;AAAA,IACxB;AAAA,EAAA;AAEJ;AAEA,eAAe,iBAAiB,KAAqC;AACnE,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,IAC3B,MAAM,KAAK,UAAU,EAAE,OAAO,oBAAoB;AAAA,EAAA,CACnD;AACD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,6CAA6C,SAAS,MAAM;AAAA,IAAA;AAAA,EAEhE;AACA,SAAO,SAAS,KAAA;AAClB;;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ThreadSource } from './ThreadPicker';
|
|
2
|
+
export type ChatThreadSetup = {
|
|
3
|
+
blocked: boolean;
|
|
4
|
+
pending: boolean;
|
|
5
|
+
error?: string;
|
|
6
|
+
retry: () => void;
|
|
7
|
+
};
|
|
8
|
+
type ChatThreadSetupOptions = {
|
|
9
|
+
threadId: string | null;
|
|
10
|
+
api: string | null;
|
|
11
|
+
source: ThreadSource | undefined;
|
|
12
|
+
onCreated: (threadId: string) => void;
|
|
13
|
+
};
|
|
14
|
+
export declare function useChatThreadSetup({ threadId, api, source, onCreated, }: ChatThreadSetupOptions): ChatThreadSetup;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=ChatWindow.thread.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatWindow.thread.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatWindow.thread.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,gBAAgB,CAAC;AAElE,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC;IACjC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,GAAG,EACH,MAAM,EACN,SAAS,GACV,EAAE,sBAAsB,GAAG,eAAe,CAiD1C"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { useState, useRef, useEffect, useCallback } from "react";
|
|
2
|
+
function useChatThreadSetup({
|
|
3
|
+
threadId,
|
|
4
|
+
api,
|
|
5
|
+
source,
|
|
6
|
+
onCreated
|
|
7
|
+
}) {
|
|
8
|
+
const [attempt, setAttempt] = useState(0);
|
|
9
|
+
const [error, setError] = useState();
|
|
10
|
+
const request = useRef(null);
|
|
11
|
+
const onCreatedRef = useRef(onCreated);
|
|
12
|
+
onCreatedRef.current = onCreated;
|
|
13
|
+
const canCreate = Boolean((source == null ? void 0 : source.create) || !source && api);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
if (threadId || !canCreate) {
|
|
16
|
+
request.current = null;
|
|
17
|
+
setError(void 0);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (!request.current) {
|
|
21
|
+
request.current = (source == null ? void 0 : source.create) ? source.create() : createHTTPThread(api);
|
|
22
|
+
}
|
|
23
|
+
let active = true;
|
|
24
|
+
request.current.then((thread) => {
|
|
25
|
+
var _a;
|
|
26
|
+
if (!active) return;
|
|
27
|
+
const id = (_a = thread.id) == null ? void 0 : _a.trim();
|
|
28
|
+
if (!id) {
|
|
29
|
+
throw new Error("Created chat thread has no id.");
|
|
30
|
+
}
|
|
31
|
+
onCreatedRef.current(id);
|
|
32
|
+
}).catch((cause) => {
|
|
33
|
+
if (!active) return;
|
|
34
|
+
setError(cause instanceof Error ? cause.message : String(cause));
|
|
35
|
+
});
|
|
36
|
+
return () => {
|
|
37
|
+
active = false;
|
|
38
|
+
};
|
|
39
|
+
}, [api, attempt, canCreate, source, threadId]);
|
|
40
|
+
const retry = useCallback(() => {
|
|
41
|
+
request.current = null;
|
|
42
|
+
setError(void 0);
|
|
43
|
+
setAttempt((value) => value + 1);
|
|
44
|
+
}, []);
|
|
45
|
+
return {
|
|
46
|
+
blocked: !threadId && canCreate,
|
|
47
|
+
pending: !threadId && canCreate && !error,
|
|
48
|
+
...error ? { error } : {},
|
|
49
|
+
retry
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
async function createHTTPThread(api) {
|
|
53
|
+
const response = await fetch(api, {
|
|
54
|
+
method: "POST",
|
|
55
|
+
headers: { "Content-Type": "application/json" },
|
|
56
|
+
body: JSON.stringify({ title: "New conversation" })
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
throw new Error(
|
|
60
|
+
`Creating a chat thread failed with status ${response.status}.`
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
return response.json();
|
|
64
|
+
}
|
|
65
|
+
export {
|
|
66
|
+
useChatThreadSetup
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=ChatWindow.thread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatWindow.thread.js","sources":["../../../src/data/ai/ChatWindow.thread.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { ThreadSource, ThreadSummary } from \"./ThreadPicker\";\n\nexport type ChatThreadSetup = {\n blocked: boolean;\n pending: boolean;\n error?: string;\n retry: () => void;\n};\n\ntype ChatThreadSetupOptions = {\n threadId: string | null;\n api: string | null;\n source: ThreadSource | undefined;\n onCreated: (threadId: string) => void;\n};\n\nexport function useChatThreadSetup({\n threadId,\n api,\n source,\n onCreated,\n}: ChatThreadSetupOptions): ChatThreadSetup {\n const [attempt, setAttempt] = useState(0);\n const [error, setError] = useState<string>();\n const request = useRef<Promise<ThreadSummary> | null>(null);\n const onCreatedRef = useRef(onCreated);\n onCreatedRef.current = onCreated;\n const canCreate = Boolean(source?.create || (!source && api));\n\n useEffect(() => {\n if (threadId || !canCreate) {\n request.current = null;\n setError(undefined);\n return;\n }\n if (!request.current) {\n request.current = source?.create\n ? source.create()\n : createHTTPThread(api as string);\n }\n let active = true;\n request.current\n .then((thread) => {\n if (!active) return;\n const id = thread.id?.trim();\n if (!id) {\n throw new Error(\"Created chat thread has no id.\");\n }\n onCreatedRef.current(id);\n })\n .catch((cause) => {\n if (!active) return;\n setError(cause instanceof Error ? cause.message : String(cause));\n });\n return () => {\n active = false;\n };\n }, [api, attempt, canCreate, source, threadId]);\n\n const retry = useCallback(() => {\n request.current = null;\n setError(undefined);\n setAttempt((value) => value + 1);\n }, []);\n return {\n blocked: !threadId && canCreate,\n pending: !threadId && canCreate && !error,\n ...(error ? { error } : {}),\n retry,\n };\n}\n\nasync function createHTTPThread(api: string): Promise<ThreadSummary> {\n const response = await fetch(api, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ title: \"New conversation\" }),\n });\n if (!response.ok) {\n throw new Error(\n `Creating a chat thread failed with status ${response.status}.`,\n );\n }\n return response.json() as Promise<ThreadSummary>;\n}\n"],"names":[],"mappings":";AAiBO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4C;AAC1C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,CAAC;AACxC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAA;AAC1B,QAAM,UAAU,OAAsC,IAAI;AAC1D,QAAM,eAAe,OAAO,SAAS;AACrC,eAAa,UAAU;AACvB,QAAM,YAAY,SAAQ,iCAAQ,WAAW,CAAC,UAAU,GAAI;AAE5D,YAAU,MAAM;AACd,QAAI,YAAY,CAAC,WAAW;AAC1B,cAAQ,UAAU;AAClB,eAAS,MAAS;AAClB;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,SAAS;AACpB,cAAQ,WAAU,iCAAQ,UACtB,OAAO,OAAA,IACP,iBAAiB,GAAa;AAAA,IACpC;AACA,QAAI,SAAS;AACb,YAAQ,QACL,KAAK,CAAC,WAAW;;AAChB,UAAI,CAAC,OAAQ;AACb,YAAM,MAAK,YAAO,OAAP,mBAAW;AACtB,UAAI,CAAC,IAAI;AACP,cAAM,IAAI,MAAM,gCAAgC;AAAA,MAClD;AACA,mBAAa,QAAQ,EAAE;AAAA,IACzB,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,UAAI,CAAC,OAAQ;AACb,eAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACjE,CAAC;AACH,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,KAAK,SAAS,WAAW,QAAQ,QAAQ,CAAC;AAE9C,QAAM,QAAQ,YAAY,MAAM;AAC9B,YAAQ,UAAU;AAClB,aAAS,MAAS;AAClB,eAAW,CAAC,UAAU,QAAQ,CAAC;AAAA,EACjC,GAAG,CAAA,CAAE;AACL,SAAO;AAAA,IACL,SAAS,CAAC,YAAY;AAAA,IACtB,SAAS,CAAC,YAAY,aAAa,CAAC;AAAA,IACpC,GAAI,QAAQ,EAAE,MAAA,IAAU,CAAA;AAAA,IACxB;AAAA,EAAA;AAEJ;AAEA,eAAe,iBAAiB,KAAqC;AACnE,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,IAC3B,MAAM,KAAK,UAAU,EAAE,OAAO,oBAAoB;AAAA,EAAA,CACnD;AACD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,6CAA6C,SAAS,MAAM;AAAA,IAAA;AAAA,EAEhE;AACA,SAAO,SAAS,KAAA;AAClB;"}
|
|
@@ -7,16 +7,16 @@ const JsonSchemaForm = require("../../../components/JsonSchemaForm.cjs");
|
|
|
7
7
|
const utils = require("../../../lib/utils.cjs");
|
|
8
8
|
const Modal = require("../../../overlay/Modal.cjs");
|
|
9
9
|
const Icon = require("../../Icon.cjs");
|
|
10
|
-
const ModelSelector = require("../../chat/ModelSelector.cjs");
|
|
11
10
|
const effortIcons = require("../../chat/effort-icons.cjs");
|
|
12
11
|
const Attachment = require("../../chat/Attachment.cjs");
|
|
13
12
|
const attachmentUpload = require("../../chat/attachment-upload.cjs");
|
|
14
|
-
const
|
|
15
|
-
const RuntimeModePicker = require("../RuntimeModePicker.cjs");
|
|
13
|
+
const RuntimeBar = require("../RuntimeBar.cjs");
|
|
16
14
|
const runtimeMode = require("../runtime-mode.cjs");
|
|
17
15
|
const index = require("../SpecRuntimeEditor/index.cjs");
|
|
18
|
-
const fields = require("../SpecRuntimeEditor/fields.cjs");
|
|
19
16
|
const update = require("../SpecRuntimeEditor/update.cjs");
|
|
17
|
+
const model = require("./model.cjs");
|
|
18
|
+
const UiTrash = require("../../../icons/components/UiTrash.cjs");
|
|
19
|
+
const UiAdd = require("../../../icons/components/UiAdd.cjs");
|
|
20
20
|
const UiGearSix = require("../../../icons/components/UiGearSix.cjs");
|
|
21
21
|
function PromptRunEditor({
|
|
22
22
|
value,
|
|
@@ -28,10 +28,7 @@ function PromptRunEditor({
|
|
|
28
28
|
secretSelector,
|
|
29
29
|
cliOptions,
|
|
30
30
|
reasoningEfforts = effortIcons.DEFAULT_REASONING_EFFORTS,
|
|
31
|
-
runtimeControls,
|
|
32
31
|
variablesSchema,
|
|
33
|
-
variables,
|
|
34
|
-
onVariablesChange,
|
|
35
32
|
onVariablesValidityChange,
|
|
36
33
|
promptEditor,
|
|
37
34
|
promptLabel = "User prompt",
|
|
@@ -49,17 +46,16 @@ function PromptRunEditor({
|
|
|
49
46
|
}) {
|
|
50
47
|
var _a, _b;
|
|
51
48
|
const [specOpen, setSpecOpen] = react.useState(false);
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const showEffort = modelEfforts.length > 0;
|
|
49
|
+
const spec = value.spec ?? {};
|
|
50
|
+
const rows = model.runtimeRows(value);
|
|
51
|
+
const selectedModel = models.find(
|
|
52
|
+
(model2) => model2.id === spec.id || model2.id === spec.model
|
|
53
|
+
);
|
|
58
54
|
const resolvedAttachmentUpload = react.useMemo(
|
|
59
55
|
() => attachmentUpload$1 ?? attachmentUpload.createAttachmentUploadAdapter(),
|
|
60
56
|
[attachmentUpload$1]
|
|
61
57
|
);
|
|
62
|
-
const attachmentFiles = (((_a =
|
|
58
|
+
const attachmentFiles = (((_a = spec.prompt) == null ? void 0 : _a.attachments) ?? []).map(
|
|
63
59
|
(attachment) => ({
|
|
64
60
|
type: "file",
|
|
65
61
|
url: attachment.id ? `/api/attachments/${attachment.id}` : attachment.url ?? "",
|
|
@@ -73,76 +69,87 @@ function PromptRunEditor({
|
|
|
73
69
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils.cn("grid gap-density-4", className), children: [
|
|
74
70
|
header,
|
|
75
71
|
/* @__PURE__ */ jsxRuntime.jsxs(Block, { title: "Runtime", children: [
|
|
76
|
-
|
|
77
|
-
/* @__PURE__ */ jsxRuntime.
|
|
78
|
-
|
|
72
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-density-2", children: [
|
|
73
|
+
rows.map((runtime, index2) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
74
|
+
"div",
|
|
79
75
|
{
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
76
|
+
role: "group",
|
|
77
|
+
"aria-label": `Runtime ${index2 + 1}`,
|
|
78
|
+
className: "flex min-w-0 items-center gap-density-2",
|
|
79
|
+
children: [
|
|
80
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
81
|
+
RuntimeBar.RuntimeBar,
|
|
82
|
+
{
|
|
83
|
+
value: runtime,
|
|
84
|
+
onChange: (next) => onChange(
|
|
85
|
+
model.withRuntimeRows(
|
|
86
|
+
value,
|
|
87
|
+
rows.map(
|
|
88
|
+
(item, itemIndex) => itemIndex === index2 ? next : item
|
|
89
|
+
)
|
|
90
|
+
)
|
|
91
|
+
),
|
|
92
|
+
models,
|
|
93
|
+
families,
|
|
94
|
+
reasoningEfforts,
|
|
95
|
+
ariaLabel: `Runtime ${index2 + 1} controls`
|
|
96
|
+
}
|
|
97
|
+
),
|
|
98
|
+
rows.length > 1 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
99
|
+
button.Button,
|
|
100
|
+
{
|
|
101
|
+
size: "sm",
|
|
102
|
+
variant: "ghost",
|
|
103
|
+
"aria-label": `Remove runtime ${index2 + 1}`,
|
|
104
|
+
onClick: () => onChange(
|
|
105
|
+
model.withRuntimeRows(
|
|
106
|
+
value,
|
|
107
|
+
rows.filter((_, itemIndex) => itemIndex !== index2)
|
|
108
|
+
)
|
|
109
|
+
),
|
|
110
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiTrash.UiTrash, className: "size-4" })
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
]
|
|
114
|
+
},
|
|
115
|
+
index2
|
|
116
|
+
)),
|
|
117
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-density-2", children: [
|
|
118
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
119
|
+
button.Button,
|
|
124
120
|
{
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
121
|
+
size: "sm",
|
|
122
|
+
variant: "outline",
|
|
123
|
+
"aria-label": "Add runtime",
|
|
124
|
+
onClick: () => {
|
|
125
|
+
var _a2;
|
|
126
|
+
return onChange(
|
|
127
|
+
model.withRuntimeRows(value, [
|
|
128
|
+
...rows,
|
|
129
|
+
((_a2 = rows[0]) == null ? void 0 : _a2.backend) ? { backend: rows[0].backend } : {}
|
|
130
|
+
])
|
|
131
|
+
);
|
|
132
|
+
},
|
|
133
|
+
children: [
|
|
134
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiAdd.UiAdd, className: "size-4" }),
|
|
135
|
+
"Add runtime"
|
|
136
|
+
]
|
|
130
137
|
}
|
|
131
|
-
)
|
|
138
|
+
),
|
|
139
|
+
/* @__PURE__ */ jsxRuntime.jsxs(button.Button, { size: "sm", variant: "outline", onClick: () => setSpecOpen(true), children: [
|
|
140
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiGearSix.UiGearSix, className: "size-4" }),
|
|
141
|
+
editSpecLabel
|
|
142
|
+
] })
|
|
132
143
|
] })
|
|
133
144
|
] }),
|
|
134
|
-
children
|
|
135
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsxs(button.Button, { size: "sm", variant: "outline", onClick: () => setSpecOpen(true), children: [
|
|
136
|
-
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiGearSix.UiGearSix, className: "size-4" }),
|
|
137
|
-
editSpecLabel
|
|
138
|
-
] }) })
|
|
145
|
+
children
|
|
139
146
|
] }),
|
|
140
|
-
|
|
147
|
+
/* @__PURE__ */ jsxRuntime.jsx(Block, { title: "Variables", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
141
148
|
VariablesField,
|
|
142
149
|
{
|
|
143
150
|
...variablesSchema ? { schema: variablesSchema } : {},
|
|
144
|
-
value: variables ?? {},
|
|
145
|
-
onChange:
|
|
151
|
+
value: value.variables ?? {},
|
|
152
|
+
onChange: (variables) => onChange({ ...value, variables }),
|
|
146
153
|
...onVariablesValidityChange ? { onValidityChange: onVariablesValidityChange } : {}
|
|
147
154
|
}
|
|
148
155
|
) }),
|
|
@@ -150,8 +157,11 @@ function PromptRunEditor({
|
|
|
150
157
|
promptEditor ?? /* @__PURE__ */ jsxRuntime.jsx(
|
|
151
158
|
"textarea",
|
|
152
159
|
{
|
|
153
|
-
value: ((_b =
|
|
154
|
-
onChange: (event) => onChange(
|
|
160
|
+
value: ((_b = spec.prompt) == null ? void 0 : _b.user) ?? "",
|
|
161
|
+
onChange: (event) => onChange({
|
|
162
|
+
...value,
|
|
163
|
+
spec: update.withPrompt(spec, { user: event.target.value })
|
|
164
|
+
}),
|
|
155
165
|
spellCheck: false,
|
|
156
166
|
placeholder: promptPlaceholder,
|
|
157
167
|
"aria-label": promptLabel,
|
|
@@ -165,13 +175,14 @@ function PromptRunEditor({
|
|
|
165
175
|
files: attachmentFiles,
|
|
166
176
|
onRemove: (index2) => {
|
|
167
177
|
var _a2;
|
|
168
|
-
return onChange(
|
|
169
|
-
|
|
170
|
-
|
|
178
|
+
return onChange({
|
|
179
|
+
...value,
|
|
180
|
+
spec: update.withPrompt(spec, {
|
|
181
|
+
attachments: (((_a2 = spec.prompt) == null ? void 0 : _a2.attachments) ?? []).filter(
|
|
171
182
|
(_, itemIndex) => itemIndex !== index2
|
|
172
183
|
)
|
|
173
184
|
})
|
|
174
|
-
);
|
|
185
|
+
});
|
|
175
186
|
}
|
|
176
187
|
}
|
|
177
188
|
),
|
|
@@ -182,10 +193,11 @@ function PromptRunEditor({
|
|
|
182
193
|
upload: resolvedAttachmentUpload,
|
|
183
194
|
onAdd: (parts) => {
|
|
184
195
|
var _a2;
|
|
185
|
-
return onChange(
|
|
186
|
-
|
|
196
|
+
return onChange({
|
|
197
|
+
...value,
|
|
198
|
+
spec: update.withPrompt(spec, {
|
|
187
199
|
attachments: [
|
|
188
|
-
...((_a2 =
|
|
200
|
+
...((_a2 = spec.prompt) == null ? void 0 : _a2.attachments) ?? [],
|
|
189
201
|
...parts.map((part) => {
|
|
190
202
|
const uploaded = part;
|
|
191
203
|
return {
|
|
@@ -197,7 +209,7 @@ function PromptRunEditor({
|
|
|
197
209
|
})
|
|
198
210
|
]
|
|
199
211
|
})
|
|
200
|
-
);
|
|
212
|
+
});
|
|
201
213
|
},
|
|
202
214
|
...(selectedModel == null ? void 0 : selectedModel.inputMediaTypes) ? { acceptedMediaTypes: selectedModel.inputMediaTypes } : {},
|
|
203
215
|
...attachmentLimits ? { limits: attachmentLimits } : {}
|
|
@@ -218,8 +230,8 @@ function PromptRunEditor({
|
|
|
218
230
|
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
219
231
|
index.SpecRuntimeEditor,
|
|
220
232
|
{
|
|
221
|
-
value,
|
|
222
|
-
onChange,
|
|
233
|
+
value: spec,
|
|
234
|
+
onChange: (next) => onChange({ ...value, spec: next }),
|
|
223
235
|
models,
|
|
224
236
|
families,
|
|
225
237
|
tools,
|
|
@@ -230,7 +242,7 @@ function PromptRunEditor({
|
|
|
230
242
|
onSave: () => setSpecOpen(false),
|
|
231
243
|
onCancel: () => setSpecOpen(false),
|
|
232
244
|
saveLabel: "Done",
|
|
233
|
-
footerStatus: runtimeMode.labelForBackend(
|
|
245
|
+
footerStatus: runtimeMode.labelForBackend(spec.backend, families)
|
|
234
246
|
}
|
|
235
247
|
)
|
|
236
248
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/data/ai/PromptRunEditor/index.tsx"],"sourcesContent":["import { useId, useMemo, useState, type ReactNode } from \"react\";\nimport { Button } from \"../../../components/button\";\nimport { JsonSchemaForm } from \"../../../components/JsonSchemaForm\";\nimport type { JsonSchemaObject } from \"../../../components/json-schema-form-types\";\nimport { UiGearSix } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport { Modal } from \"../../../overlay/Modal\";\nimport { Icon } from \"../../Icon\";\nimport { EffortSelector, ModelSelector } from \"../../chat/ModelSelector\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../../chat/effort-icons\";\nimport {\n AttachmentButton,\n AttachmentList,\n} from \"../../chat/Attachment\";\nimport {\n createAttachmentUploadAdapter,\n type AttachmentFilePart,\n type AttachmentLimits,\n type AttachmentUploadAdapter,\n} from \"../../chat/attachment-upload\";\nimport type { ChatModel, ToolMeta } from \"../../chat/types\";\nimport type { FileUIPart } from \"../../chat/types\";\nimport {\n effortOptionsForModel,\n reconcileModelCapabilities,\n} from \"../model-capabilities\";\nimport { RuntimeModePicker } from \"../RuntimeModePicker\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n familyById,\n labelForBackend,\n modelsForFamily,\n selectionForBackend,\n} from \"../runtime-mode\";\nimport { SpecRuntimeEditor } from \"../SpecRuntimeEditor\";\nimport type { SpecRuntimeCLIOptions } from \"../SpecRuntimeEditor/CLIArgsSection\";\nimport { SpecField, SpecInput } from \"../SpecRuntimeEditor/fields\";\nimport type {\n SpecRuntimeSecretSelectorConfig,\n SpecSectionId,\n} from \"../SpecRuntimeEditor/types\";\nimport {\n withOptionalRoot,\n withPrompt,\n withRoot,\n} from \"../SpecRuntimeEditor/update\";\nimport type {\n AISpecRuntimePermissionCatalog,\n AISpecRuntimeValue,\n} from \"../SpecRuntimeEditor.model\";\n\nexport type PromptRunEditorProps = {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n tools?: ToolMeta[] | undefined;\n permissionCatalog?: AISpecRuntimePermissionCatalog | undefined;\n secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;\n cliOptions?: SpecRuntimeCLIOptions | undefined;\n reasoningEfforts?: string[] | undefined;\n /** Host-provided replacement for the inline Runtime controls. */\n runtimeControls?: ReactNode | undefined;\n\n /** Schema-driven variables form; omit to render a raw-JSON editor. */\n variablesSchema?: JsonSchemaObject | undefined;\n variables?: Record<string, unknown> | undefined;\n /** The variables block only renders when this is supplied. */\n onVariablesChange?: ((next: Record<string, unknown>) => void) | undefined;\n /** Fires false while raw-JSON variables fail to parse; always true with a schema. */\n onVariablesValidityChange?: ((valid: boolean) => void) | undefined;\n\n /** Host-supplied editor for the `prompt.user` override; defaults to a textarea. */\n promptEditor?: ReactNode | undefined;\n promptLabel?: string | undefined;\n promptPlaceholder?: string | undefined;\n enableAttachments?: boolean | undefined;\n attachmentUpload?: AttachmentUploadAdapter | undefined;\n attachmentLimits?: AttachmentLimits | undefined;\n\n /** Extra fields injected inside the Runtime block, below Model/Effort. */\n children?: ReactNode | undefined;\n header?: ReactNode | undefined;\n footer?: ReactNode | undefined;\n className?: string | undefined;\n\n editSpecLabel?: string | undefined;\n specModalTitle?: string | undefined;\n /** Restrict which SpecRuntimeEditor sections the \"Edit spec\" modal shows. */\n specSections?: readonly SpecSectionId[] | undefined;\n};\n\n// The inline \"prompt + variables + runtime\" composer shared by captain's prompt\n// workbench and gavel's todo run dialog. It edits one AISpecRuntimeValue live\n// (runtime knobs + the prompt.user override) and takes variables as separate\n// props; the \"Edit spec\" button expands the same value into the full editor.\n// Hosts should mount it with a `key` per prompt/todo so internal draft state\n// (raw-JSON text, modal open) resets on selection change.\nexport function PromptRunEditor({\n value,\n onChange,\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n tools = [],\n permissionCatalog,\n secretSelector,\n cliOptions,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n runtimeControls,\n variablesSchema,\n variables,\n onVariablesChange,\n onVariablesValidityChange,\n promptEditor,\n promptLabel = \"User prompt\",\n promptPlaceholder = \"Override the rendered user prompt\",\n enableAttachments = false,\n attachmentUpload,\n attachmentLimits,\n children,\n header,\n footer,\n className,\n editSpecLabel = \"Edit spec\",\n specModalTitle = \"Runtime spec\",\n specSections,\n}: PromptRunEditorProps) {\n const [specOpen, setSpecOpen] = useState(false);\n const selection = selectionForBackend(families, value.backend);\n const family = familyById(families, selection.family);\n const familyModels = modelsForFamily(models, family, value.backend);\n const selectedModel = models.find((m) => m.id === value.model);\n // Hide effort for a model that does not reason; default to showing it when the\n // selection is unknown (a family alias or a not-yet-loaded catalog).\n const modelEfforts = effortOptionsForModel(selectedModel, reasoningEfforts);\n const showEffort = modelEfforts.length > 0;\n const resolvedAttachmentUpload = useMemo(\n () => attachmentUpload ?? createAttachmentUploadAdapter(),\n [attachmentUpload],\n );\n const attachmentFiles: FileUIPart[] = (value.prompt?.attachments ?? []).map(\n (attachment) => ({\n type: \"file\",\n url: attachment.id\n ? `/api/attachments/${attachment.id}`\n : (attachment.url ?? \"\"),\n mediaType: attachment.mediaType ?? \"application/octet-stream\",\n ...(attachment.id ? { attachmentId: attachment.id } : {}),\n ...(attachment.size != null ? { size: attachment.size } : {}),\n ...(attachment.filename ? { filename: attachment.filename } : {}),\n ...(!attachment.filename && attachment.path\n ? { filename: attachment.path }\n : {}),\n }),\n ) as FileUIPart[];\n\n return (\n <div className={cn(\"grid gap-density-4\", className)}>\n {header}\n\n <Block title=\"Runtime\">\n {runtimeControls ?? (\n <>\n <RuntimeModePicker\n value={value}\n onChange={onChange}\n families={families}\n models={models}\n />\n <div className=\"grid gap-density-2 sm:grid-cols-2\">\n <SpecField label=\"Model\">\n <div className=\"flex min-w-0 items-center gap-density-2\">\n {familyModels.length > 0 ? (\n <ModelSelector\n models={familyModels}\n value={value.model}\n onChange={(model) =>\n onChange(\n reconcileModelCapabilities(\n value,\n models.find((item) => item.id === model),\n reasoningEfforts,\n ),\n )\n }\n size=\"md\"\n className=\"w-full\"\n />\n ) : (\n <SpecInput\n value={value.model}\n onChange={(model) => onChange(withRoot(value, { model }))}\n placeholder=\"frontmatter/default\"\n mono\n />\n )}\n {value.model && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() =>\n onChange(withOptionalRoot(value, \"model\", undefined))\n }\n >\n Default\n </Button>\n )}\n </div>\n </SpecField>\n {showEffort && (\n <SpecField label=\"Effort\">\n <EffortSelector\n efforts={modelEfforts}\n value={value.effort ?? \"\"}\n onChange={(effort) => onChange(withRoot(value, { effort }))}\n size=\"md\"\n className=\"w-full\"\n />\n </SpecField>\n )}\n </div>\n </>\n )}\n {children}\n <div>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setSpecOpen(true)}>\n <Icon icon={UiGearSix} className=\"size-4\" />\n {editSpecLabel}\n </Button>\n </div>\n </Block>\n\n {onVariablesChange && (\n <Block title=\"Variables\">\n <VariablesField\n {...(variablesSchema ? { schema: variablesSchema } : {})}\n value={variables ?? {}}\n onChange={onVariablesChange}\n {...(onVariablesValidityChange\n ? { onValidityChange: onVariablesValidityChange }\n : {})}\n />\n </Block>\n )}\n\n <Block title={promptLabel}>\n {promptEditor ?? (\n <textarea\n value={value.prompt?.user ?? \"\"}\n onChange={(event) =>\n onChange(withPrompt(value, { user: event.target.value }))\n }\n spellCheck={false}\n placeholder={promptPlaceholder}\n aria-label={promptLabel}\n className=\"min-h-[7rem] w-full resize-y rounded-md border border-border bg-background px-density-2 py-density-1 text-sm outline-none focus:ring-2 focus:ring-ring\"\n />\n )}\n {enableAttachments && (\n <div className=\"space-y-density-2\">\n <AttachmentList\n files={attachmentFiles}\n onRemove={(index) =>\n onChange(\n withPrompt(value, {\n attachments: (value.prompt?.attachments ?? []).filter(\n (_, itemIndex) => itemIndex !== index,\n ),\n }),\n )\n }\n />\n <AttachmentButton\n files={attachmentFiles}\n upload={resolvedAttachmentUpload}\n onAdd={(parts) =>\n onChange(\n withPrompt(value, {\n attachments: [\n ...(value.prompt?.attachments ?? []),\n ...parts.map((part) => {\n const uploaded = part as AttachmentFilePart;\n return {\n id: uploaded.attachmentId,\n mediaType: uploaded.mediaType,\n size: uploaded.size,\n ...(uploaded.filename\n ? { filename: uploaded.filename }\n : {}),\n };\n }),\n ],\n }),\n )\n }\n {...(selectedModel?.inputMediaTypes\n ? { acceptedMediaTypes: selectedModel.inputMediaTypes }\n : {})}\n {...(attachmentLimits ? { limits: attachmentLimits } : {})}\n />\n </div>\n )}\n </Block>\n\n {footer}\n\n <Modal\n open={specOpen}\n onClose={() => setSpecOpen(false)}\n title={specModalTitle}\n size=\"full\"\n closeOnEsc\n className=\"h-[95vh]\"\n >\n <SpecRuntimeEditor\n value={value}\n onChange={onChange}\n models={models}\n families={families}\n tools={tools}\n {...(permissionCatalog ? { permissionCatalog } : {})}\n {...(secretSelector ? { secretSelector } : {})}\n {...(cliOptions ? { cliOptions } : {})}\n {...(specSections ? { sections: specSections } : {})}\n onSave={() => setSpecOpen(false)}\n onCancel={() => setSpecOpen(false)}\n saveLabel=\"Done\"\n footerStatus={labelForBackend(value.backend, families)}\n />\n </Modal>\n </div>\n );\n}\n\nfunction Block({ title, children }: { title: string; children: ReactNode }) {\n return (\n <section className=\"space-y-density-2\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {title}\n </div>\n {children}\n </section>\n );\n}\n\n// Variables are edited via the prompt's declared schema when present, otherwise\n// as a raw JSON object; the raw text is held locally and only committed to the\n// host when it parses to an object.\nfunction VariablesField({\n schema,\n value,\n onChange,\n onValidityChange,\n}: {\n schema?: JsonSchemaObject | undefined;\n value: Record<string, unknown>;\n onChange: (next: Record<string, unknown>) => void;\n onValidityChange?: ((valid: boolean) => void) | undefined;\n}) {\n const idPrefix = useId();\n const [rawText, setRawText] = useState(() => stringifyVariables(value));\n const [rawError, setRawError] = useState<string | null>(null);\n\n if (schema) {\n return (\n <JsonSchemaForm\n idPrefix={`prompt-vars-${idPrefix}`}\n schema={schema}\n value={value}\n onChange={(next) => onChange(next as Record<string, unknown>)}\n size=\"sm\"\n />\n );\n }\n\n const commit = (text: string) => {\n setRawText(text);\n if (!text.trim()) {\n setRawError(null);\n onValidityChange?.(true);\n onChange({});\n return;\n }\n try {\n const parsed = JSON.parse(text);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n setRawError(null);\n onValidityChange?.(true);\n onChange(parsed as Record<string, unknown>);\n } else {\n setRawError(\"Expected a JSON object\");\n onValidityChange?.(false);\n }\n } catch (error) {\n setRawError(error instanceof Error ? error.message : \"Invalid JSON\");\n onValidityChange?.(false);\n }\n };\n\n return (\n <div className=\"space-y-1\">\n <textarea\n value={rawText}\n onChange={(event) => commit(event.target.value)}\n spellCheck={false}\n placeholder=\"{}\"\n aria-label=\"Variables JSON\"\n className=\"h-28 w-full resize-y rounded-md border border-border bg-background px-density-2 py-density-1 font-mono text-xs outline-none focus:ring-2 focus:ring-ring\"\n />\n {rawError && <div className=\"text-xs text-destructive\">{rawError}</div>}\n </div>\n );\n}\n\nfunction stringifyVariables(value: Record<string, unknown>) {\n if (!value || Object.keys(value).length === 0) return \"{}\";\n return JSON.stringify(value, null, 2);\n}\n"],"names":["SPEC_RUNTIME_FAMILIES","DEFAULT_REASONING_EFFORTS","attachmentUpload","useState","selectionForBackend","familyById","modelsForFamily","effortOptionsForModel","useMemo","createAttachmentUploadAdapter","cn","jsxs","Fragment","jsx","RuntimeModePicker","SpecField","ModelSelector","reconcileModelCapabilities","SpecInput","withRoot","Button","withOptionalRoot","EffortSelector","Icon","UiGearSix","withPrompt","AttachmentList","index","_a","AttachmentButton","Modal","SpecRuntimeEditor","labelForBackend","useId","JsonSchemaForm"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/data/ai/PromptRunEditor/index.tsx"],"sourcesContent":["import { useId, useMemo, useState, type ReactNode } from \"react\";\nimport { Button } from \"../../../components/button\";\nimport { JsonSchemaForm } from \"../../../components/JsonSchemaForm\";\nimport type { JsonSchemaObject } from \"../../../components/json-schema-form-types\";\nimport { UiAdd, UiGearSix, UiTrash } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport { Modal } from \"../../../overlay/Modal\";\nimport { Icon } from \"../../Icon\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../../chat/effort-icons\";\nimport {\n AttachmentButton,\n AttachmentList,\n} from \"../../chat/Attachment\";\nimport {\n createAttachmentUploadAdapter,\n type AttachmentFilePart,\n type AttachmentLimits,\n type AttachmentUploadAdapter,\n} from \"../../chat/attachment-upload\";\nimport type { ChatModel, ToolMeta } from \"../../chat/types\";\nimport type { FileUIPart } from \"../../chat/types\";\nimport { RuntimeBar } from \"../RuntimeBar\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n labelForBackend,\n} from \"../runtime-mode\";\nimport { SpecRuntimeEditor } from \"../SpecRuntimeEditor\";\nimport type { SpecRuntimeCLIOptions } from \"../SpecRuntimeEditor/CLIArgsSection\";\nimport type {\n SpecRuntimeSecretSelectorConfig,\n SpecSectionId,\n} from \"../SpecRuntimeEditor/types\";\nimport { withPrompt } from \"../SpecRuntimeEditor/update\";\nimport type { AISpecRuntimePermissionCatalog } from \"../SpecRuntimeEditor.model\";\nimport {\n runtimeRows,\n withRuntimeRows,\n type AIPromptRunValue,\n} from \"./model\";\n\nexport type PromptRunEditorProps = {\n value: AIPromptRunValue;\n onChange: (value: AIPromptRunValue) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n tools?: ToolMeta[] | undefined;\n permissionCatalog?: AISpecRuntimePermissionCatalog | undefined;\n secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;\n cliOptions?: SpecRuntimeCLIOptions | undefined;\n reasoningEfforts?: string[] | undefined;\n\n /** Schema-driven variables form; omit to render a raw-JSON editor. */\n variablesSchema?: JsonSchemaObject | undefined;\n /** Fires false while raw-JSON variables fail to parse; always true with a schema. */\n onVariablesValidityChange?: ((valid: boolean) => void) | undefined;\n\n /** Host-supplied editor for the `prompt.user` override; defaults to a textarea. */\n promptEditor?: ReactNode | undefined;\n promptLabel?: string | undefined;\n promptPlaceholder?: string | undefined;\n enableAttachments?: boolean | undefined;\n attachmentUpload?: AttachmentUploadAdapter | undefined;\n attachmentLimits?: AttachmentLimits | undefined;\n\n /** Extra fields injected inside the Runtime block, below Model/Effort. */\n children?: ReactNode | undefined;\n header?: ReactNode | undefined;\n footer?: ReactNode | undefined;\n className?: string | undefined;\n\n editSpecLabel?: string | undefined;\n specModalTitle?: string | undefined;\n /** Restrict which SpecRuntimeEditor sections the \"Edit spec\" modal shows. */\n specSections?: readonly SpecSectionId[] | undefined;\n};\n\n// The inline \"prompt + variables + runtime\" composer shared by captain's prompt\n// workbench and gavel's todo run dialog. It edits Captain's complete prompt-run\n// request without making hosts project that contract into editor-specific state.\n// Hosts should mount it with a `key` per prompt/todo so internal draft state\n// (raw-JSON text, modal open) resets on selection change.\nexport function PromptRunEditor({\n value,\n onChange,\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n tools = [],\n permissionCatalog,\n secretSelector,\n cliOptions,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n variablesSchema,\n onVariablesValidityChange,\n promptEditor,\n promptLabel = \"User prompt\",\n promptPlaceholder = \"Override the rendered user prompt\",\n enableAttachments = false,\n attachmentUpload,\n attachmentLimits,\n children,\n header,\n footer,\n className,\n editSpecLabel = \"Edit spec\",\n specModalTitle = \"Runtime spec\",\n specSections,\n}: PromptRunEditorProps) {\n const [specOpen, setSpecOpen] = useState(false);\n const spec = value.spec ?? {};\n const rows = runtimeRows(value);\n const selectedModel = models.find(\n (model) => model.id === spec.id || model.id === spec.model,\n );\n const resolvedAttachmentUpload = useMemo(\n () => attachmentUpload ?? createAttachmentUploadAdapter(),\n [attachmentUpload],\n );\n const attachmentFiles: FileUIPart[] = (spec.prompt?.attachments ?? []).map(\n (attachment) => ({\n type: \"file\",\n url: attachment.id\n ? `/api/attachments/${attachment.id}`\n : (attachment.url ?? \"\"),\n mediaType: attachment.mediaType ?? \"application/octet-stream\",\n ...(attachment.id ? { attachmentId: attachment.id } : {}),\n ...(attachment.size != null ? { size: attachment.size } : {}),\n ...(attachment.filename ? { filename: attachment.filename } : {}),\n ...(!attachment.filename && attachment.path\n ? { filename: attachment.path }\n : {}),\n }),\n ) as FileUIPart[];\n\n return (\n <div className={cn(\"grid gap-density-4\", className)}>\n {header}\n\n <Block title=\"Runtime\">\n <div className=\"grid gap-density-2\">\n {rows.map((runtime, index) => (\n <div\n key={index}\n role=\"group\"\n aria-label={`Runtime ${index + 1}`}\n className=\"flex min-w-0 items-center gap-density-2\"\n >\n <RuntimeBar\n value={runtime}\n onChange={(next) =>\n onChange(\n withRuntimeRows(\n value,\n rows.map((item, itemIndex) =>\n itemIndex === index ? next : item,\n ),\n ),\n )\n }\n models={models}\n families={families}\n reasoningEfforts={reasoningEfforts}\n ariaLabel={`Runtime ${index + 1} controls`}\n />\n {rows.length > 1 && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Remove runtime ${index + 1}`}\n onClick={() =>\n onChange(\n withRuntimeRows(\n value,\n rows.filter((_, itemIndex) => itemIndex !== index),\n ),\n )\n }\n >\n <Icon icon={UiTrash} className=\"size-4\" />\n </Button>\n )}\n </div>\n ))}\n <div className=\"flex flex-wrap items-center gap-density-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n aria-label=\"Add runtime\"\n onClick={() =>\n onChange(\n withRuntimeRows(value, [\n ...rows,\n rows[0]?.backend ? { backend: rows[0].backend } : {},\n ]),\n )\n }\n >\n <Icon icon={UiAdd} className=\"size-4\" />\n Add runtime\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setSpecOpen(true)}>\n <Icon icon={UiGearSix} className=\"size-4\" />\n {editSpecLabel}\n </Button>\n </div>\n </div>\n {children}\n </Block>\n\n <Block title=\"Variables\">\n <VariablesField\n {...(variablesSchema ? { schema: variablesSchema } : {})}\n value={value.variables ?? {}}\n onChange={(variables) => onChange({ ...value, variables })}\n {...(onVariablesValidityChange\n ? { onValidityChange: onVariablesValidityChange }\n : {})}\n />\n </Block>\n\n <Block title={promptLabel}>\n {promptEditor ?? (\n <textarea\n value={spec.prompt?.user ?? \"\"}\n onChange={(event) =>\n onChange({\n ...value,\n spec: withPrompt(spec, { user: event.target.value }),\n })\n }\n spellCheck={false}\n placeholder={promptPlaceholder}\n aria-label={promptLabel}\n className=\"min-h-[7rem] w-full resize-y rounded-md border border-border bg-background px-density-2 py-density-1 text-sm outline-none focus:ring-2 focus:ring-ring\"\n />\n )}\n {enableAttachments && (\n <div className=\"space-y-density-2\">\n <AttachmentList\n files={attachmentFiles}\n onRemove={(index) =>\n onChange({\n ...value,\n spec: withPrompt(spec, {\n attachments: (spec.prompt?.attachments ?? []).filter(\n (_, itemIndex) => itemIndex !== index,\n ),\n }),\n })\n }\n />\n <AttachmentButton\n files={attachmentFiles}\n upload={resolvedAttachmentUpload}\n onAdd={(parts) =>\n onChange({\n ...value,\n spec: withPrompt(spec, {\n attachments: [\n ...(spec.prompt?.attachments ?? []),\n ...parts.map((part) => {\n const uploaded = part as AttachmentFilePart;\n return {\n id: uploaded.attachmentId,\n mediaType: uploaded.mediaType,\n size: uploaded.size,\n ...(uploaded.filename\n ? { filename: uploaded.filename }\n : {}),\n };\n }),\n ],\n }),\n })\n }\n {...(selectedModel?.inputMediaTypes\n ? { acceptedMediaTypes: selectedModel.inputMediaTypes }\n : {})}\n {...(attachmentLimits ? { limits: attachmentLimits } : {})}\n />\n </div>\n )}\n </Block>\n\n {footer}\n\n <Modal\n open={specOpen}\n onClose={() => setSpecOpen(false)}\n title={specModalTitle}\n size=\"full\"\n closeOnEsc\n className=\"h-[95vh]\"\n >\n <SpecRuntimeEditor\n value={spec}\n onChange={(next) => onChange({ ...value, spec: next })}\n models={models}\n families={families}\n tools={tools}\n {...(permissionCatalog ? { permissionCatalog } : {})}\n {...(secretSelector ? { secretSelector } : {})}\n {...(cliOptions ? { cliOptions } : {})}\n {...(specSections ? { sections: specSections } : {})}\n onSave={() => setSpecOpen(false)}\n onCancel={() => setSpecOpen(false)}\n saveLabel=\"Done\"\n footerStatus={labelForBackend(spec.backend, families)}\n />\n </Modal>\n </div>\n );\n}\n\nfunction Block({ title, children }: { title: string; children: ReactNode }) {\n return (\n <section className=\"space-y-density-2\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {title}\n </div>\n {children}\n </section>\n );\n}\n\n// Variables are edited via the prompt's declared schema when present, otherwise\n// as a raw JSON object; the raw text is held locally and only committed to the\n// host when it parses to an object.\nfunction VariablesField({\n schema,\n value,\n onChange,\n onValidityChange,\n}: {\n schema?: JsonSchemaObject | undefined;\n value: Record<string, unknown>;\n onChange: (next: Record<string, unknown>) => void;\n onValidityChange?: ((valid: boolean) => void) | undefined;\n}) {\n const idPrefix = useId();\n const [rawText, setRawText] = useState(() => stringifyVariables(value));\n const [rawError, setRawError] = useState<string | null>(null);\n\n if (schema) {\n return (\n <JsonSchemaForm\n idPrefix={`prompt-vars-${idPrefix}`}\n schema={schema}\n value={value}\n onChange={(next) => onChange(next as Record<string, unknown>)}\n size=\"sm\"\n />\n );\n }\n\n const commit = (text: string) => {\n setRawText(text);\n if (!text.trim()) {\n setRawError(null);\n onValidityChange?.(true);\n onChange({});\n return;\n }\n try {\n const parsed = JSON.parse(text);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n setRawError(null);\n onValidityChange?.(true);\n onChange(parsed as Record<string, unknown>);\n } else {\n setRawError(\"Expected a JSON object\");\n onValidityChange?.(false);\n }\n } catch (error) {\n setRawError(error instanceof Error ? error.message : \"Invalid JSON\");\n onValidityChange?.(false);\n }\n };\n\n return (\n <div className=\"space-y-1\">\n <textarea\n value={rawText}\n onChange={(event) => commit(event.target.value)}\n spellCheck={false}\n placeholder=\"{}\"\n aria-label=\"Variables JSON\"\n className=\"h-28 w-full resize-y rounded-md border border-border bg-background px-density-2 py-density-1 font-mono text-xs outline-none focus:ring-2 focus:ring-ring\"\n />\n {rawError && <div className=\"text-xs text-destructive\">{rawError}</div>}\n </div>\n );\n}\n\nfunction stringifyVariables(value: Record<string, unknown>) {\n if (!value || Object.keys(value).length === 0) return \"{}\";\n return JSON.stringify(value, null, 2);\n}\n"],"names":["SPEC_RUNTIME_FAMILIES","DEFAULT_REASONING_EFFORTS","attachmentUpload","useState","runtimeRows","model","useMemo","createAttachmentUploadAdapter","cn","jsxs","index","jsx","RuntimeBar","withRuntimeRows","Button","Icon","UiTrash","_a","UiAdd","UiGearSix","withPrompt","AttachmentList","AttachmentButton","Modal","SpecRuntimeEditor","labelForBackend","useId","JsonSchemaForm"],"mappings":"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"}
|
|
@@ -5,10 +5,11 @@ import { ChatModel, ToolMeta } from '../../chat/types';
|
|
|
5
5
|
import { SpecRuntimeFamily } from '../runtime-mode';
|
|
6
6
|
import { SpecRuntimeCLIOptions } from '../SpecRuntimeEditor/CLIArgsSection';
|
|
7
7
|
import { SpecRuntimeSecretSelectorConfig, SpecSectionId } from '../SpecRuntimeEditor/types';
|
|
8
|
-
import { AISpecRuntimePermissionCatalog
|
|
8
|
+
import { AISpecRuntimePermissionCatalog } from '../SpecRuntimeEditor.model';
|
|
9
|
+
import { AIPromptRunValue } from './model';
|
|
9
10
|
export type PromptRunEditorProps = {
|
|
10
|
-
value:
|
|
11
|
-
onChange: (value:
|
|
11
|
+
value: AIPromptRunValue;
|
|
12
|
+
onChange: (value: AIPromptRunValue) => void;
|
|
12
13
|
models?: ChatModel[] | undefined;
|
|
13
14
|
families?: SpecRuntimeFamily[] | undefined;
|
|
14
15
|
tools?: ToolMeta[] | undefined;
|
|
@@ -16,13 +17,8 @@ export type PromptRunEditorProps = {
|
|
|
16
17
|
secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;
|
|
17
18
|
cliOptions?: SpecRuntimeCLIOptions | undefined;
|
|
18
19
|
reasoningEfforts?: string[] | undefined;
|
|
19
|
-
/** Host-provided replacement for the inline Runtime controls. */
|
|
20
|
-
runtimeControls?: ReactNode | undefined;
|
|
21
20
|
/** Schema-driven variables form; omit to render a raw-JSON editor. */
|
|
22
21
|
variablesSchema?: JsonSchemaObject | undefined;
|
|
23
|
-
variables?: Record<string, unknown> | undefined;
|
|
24
|
-
/** The variables block only renders when this is supplied. */
|
|
25
|
-
onVariablesChange?: ((next: Record<string, unknown>) => void) | undefined;
|
|
26
22
|
/** Fires false while raw-JSON variables fail to parse; always true with a schema. */
|
|
27
23
|
onVariablesValidityChange?: ((valid: boolean) => void) | undefined;
|
|
28
24
|
/** Host-supplied editor for the `prompt.user` override; defaults to a textarea. */
|
|
@@ -42,5 +38,5 @@ export type PromptRunEditorProps = {
|
|
|
42
38
|
/** Restrict which SpecRuntimeEditor sections the "Edit spec" modal shows. */
|
|
43
39
|
specSections?: readonly SpecSectionId[] | undefined;
|
|
44
40
|
};
|
|
45
|
-
export declare function PromptRunEditor({ value, onChange, models, families, tools, permissionCatalog, secretSelector, cliOptions, reasoningEfforts,
|
|
41
|
+
export declare function PromptRunEditor({ value, onChange, models, families, tools, permissionCatalog, secretSelector, cliOptions, reasoningEfforts, variablesSchema, onVariablesValidityChange, promptEditor, promptLabel, promptPlaceholder, enableAttachments, attachmentUpload, attachmentLimits, children, header, footer, className, editSpecLabel, specModalTitle, specSections, }: PromptRunEditorProps): import("react/jsx-runtime").JSX.Element;
|
|
46
42
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/PromptRunEditor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/PromptRunEditor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAUnF,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC7B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5D,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,KAAK,EACV,+BAA+B,EAC/B,aAAa,EACd,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5C,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3C,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IAC/B,iBAAiB,CAAC,EAAE,8BAA8B,GAAG,SAAS,CAAC;IAC/D,cAAc,CAAC,EAAE,+BAA+B,GAAG,SAAS,CAAC;IAC7D,UAAU,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC/C,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAExC,sEAAsE;IACtE,eAAe,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC/C,qFAAqF;IACrF,yBAAyB,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAEnE,mFAAmF;IACnF,YAAY,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,gBAAgB,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;IACvD,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAEhD,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IACjC,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC/B,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE/B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,6EAA6E;IAC7E,YAAY,CAAC,EAAE,SAAS,aAAa,EAAE,GAAG,SAAS,CAAC;CACrD,CAAC;AAOF,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,MAAW,EACX,QAAgC,EAChC,KAAU,EACV,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,gBAA4C,EAC5C,eAAe,EACf,yBAAyB,EACzB,YAAY,EACZ,WAA2B,EAC3B,iBAAuD,EACvD,iBAAyB,EACzB,gBAAgB,EAChB,gBAAgB,EAChB,QAAQ,EACR,MAAM,EACN,MAAM,EACN,SAAS,EACT,aAA2B,EAC3B,cAA+B,EAC/B,YAAY,GACb,EAAE,oBAAoB,2CA6MtB"}
|