@kwirthmagnify/kwirth-plugin-pinocchio 0.2.0

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.
Files changed (3) hide show
  1. package/back.js +12523 -0
  2. package/front.js +1480 -0
  3. package/package.json +8 -0
package/front.js ADDED
@@ -0,0 +1,1480 @@
1
+ "use strict";
2
+ (() => {
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __commonJS = (cb, mod) => function __require() {
10
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+
29
+ // kwirth-globals:react
30
+ var require_react = __commonJS({
31
+ "kwirth-globals:react"(exports, module) {
32
+ var _m = window.__kwirth__.React;
33
+ var _d = _m && _m.__esModule ? _m.default : _m;
34
+ module.exports = Object.assign({}, typeof _m === "object" && _m !== null ? _m : {}, { default: _d, __esModule: true });
35
+ }
36
+ });
37
+
38
+ // kwirth-globals:@mui/icons-material
39
+ var require_icons_material = __commonJS({
40
+ "kwirth-globals:@mui/icons-material"(exports, module) {
41
+ var _m = window.__kwirth__.MUI.icons;
42
+ var _d = _m && _m.__esModule ? _m.default : _m;
43
+ module.exports = Object.assign({}, typeof _m === "object" && _m !== null ? _m : {}, { default: _d, __esModule: true });
44
+ }
45
+ });
46
+
47
+ // kwirth-globals:@kwirthmagnify/kwirth-common
48
+ var require_kwirth_common = __commonJS({
49
+ "kwirth-globals:@kwirthmagnify/kwirth-common"(exports, module) {
50
+ var _m = window.__kwirth__.kwirthCommon;
51
+ var _d = _m && _m.__esModule ? _m.default : _m;
52
+ module.exports = Object.assign({}, typeof _m === "object" && _m !== null ? _m : {}, { default: _d, __esModule: true });
53
+ }
54
+ });
55
+
56
+ // kwirth-globals:@mui/material
57
+ var require_material = __commonJS({
58
+ "kwirth-globals:@mui/material"(exports, module) {
59
+ var _m = window.__kwirth__.MUI.material;
60
+ var _d = _m && _m.__esModule ? _m.default : _m;
61
+ module.exports = Object.assign({}, typeof _m === "object" && _m !== null ? _m : {}, { default: _d, __esModule: true });
62
+ }
63
+ });
64
+
65
+ // kwirth-globals:@kwirthmagnify/kwirth-common-front
66
+ var require_kwirth_common_front = __commonJS({
67
+ "kwirth-globals:@kwirthmagnify/kwirth-common-front"(exports, module) {
68
+ var _m = window.__kwirth__.kwirthCommonFront;
69
+ var _d = _m && _m.__esModule ? _m.default : _m;
70
+ module.exports = Object.assign({}, typeof _m === "object" && _m !== null ? _m : {}, { default: _d, __esModule: true });
71
+ }
72
+ });
73
+
74
+ // ../../common-ai/dist/front.js
75
+ var require_front = __commonJS({
76
+ "../../common-ai/dist/front.js"(exports) {
77
+ "use strict";
78
+ var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) {
79
+ if (k2 === void 0) k2 = k;
80
+ var desc = Object.getOwnPropertyDescriptor(m, k);
81
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
82
+ desc = { enumerable: true, get: function() {
83
+ return m[k];
84
+ } };
85
+ }
86
+ Object.defineProperty(o, k2, desc);
87
+ }) : (function(o, m, k, k2) {
88
+ if (k2 === void 0) k2 = k;
89
+ o[k2] = m[k];
90
+ }));
91
+ var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? (function(o, v) {
92
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
93
+ }) : function(o, v) {
94
+ o["default"] = v;
95
+ });
96
+ var __importStar = exports && exports.__importStar || /* @__PURE__ */ (function() {
97
+ var ownKeys = function(o) {
98
+ ownKeys = Object.getOwnPropertyNames || function(o2) {
99
+ var ar = [];
100
+ for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k;
101
+ return ar;
102
+ };
103
+ return ownKeys(o);
104
+ };
105
+ return function(mod) {
106
+ if (mod && mod.__esModule) return mod;
107
+ var result = {};
108
+ if (mod != null) {
109
+ for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
110
+ }
111
+ __setModuleDefault(result, mod);
112
+ return result;
113
+ };
114
+ })();
115
+ Object.defineProperty(exports, "__esModule", { value: true });
116
+ exports.AiConfigProvider = exports.AiConfigLlm = exports.LlmSelector = void 0;
117
+ var react_1 = __importStar(require_react());
118
+ var material_1 = require_material();
119
+ var icons_material_1 = require_icons_material();
120
+ var LlmSelector = ({ llms, value, onChange, label = "LLM", size = "small", fullWidth = true }) => {
121
+ return react_1.default.createElement(
122
+ material_1.FormControl,
123
+ { size, fullWidth },
124
+ react_1.default.createElement(material_1.InputLabel, null, label),
125
+ react_1.default.createElement(material_1.Select, { label, value, onChange: (e) => onChange(e.target.value) }, llms.map((llm) => react_1.default.createElement(
126
+ material_1.MenuItem,
127
+ { key: llm.id, value: llm.id },
128
+ llm.id,
129
+ " (",
130
+ llm.provider,
131
+ "/",
132
+ llm.model,
133
+ ")"
134
+ )))
135
+ );
136
+ };
137
+ exports.LlmSelector = LlmSelector;
138
+ var AiConfigLlm2 = (props) => {
139
+ var _a;
140
+ const [llms, setLlms] = (0, react_1.useState)(JSON.parse(JSON.stringify(props.llms)));
141
+ const [selectedIndex, setSelectedIndex] = (0, react_1.useState)(null);
142
+ const [showPassword, setShowPassword] = (0, react_1.useState)(false);
143
+ const [id, setId] = (0, react_1.useState)("");
144
+ const [provider, setProvider] = (0, react_1.useState)("");
145
+ const [model, setModel] = (0, react_1.useState)("");
146
+ const [temperature, setTemperature] = (0, react_1.useState)(0);
147
+ const [useProviderKey, setUseProviderKey] = (0, react_1.useState)(true);
148
+ const [key, setKey] = (0, react_1.useState)("");
149
+ const [inputCostPerMillion, setInputCostPerMillion] = (0, react_1.useState)(0);
150
+ const [outputCostPerMillion, setOutputCostPerMillion] = (0, react_1.useState)(0);
151
+ const onLlmSelected = (index) => {
152
+ var _a2, _b;
153
+ const l = llms[index];
154
+ if (l) {
155
+ setId(l.id);
156
+ setProvider(l.provider);
157
+ setModel(l.model);
158
+ setTemperature(l.temperature);
159
+ setUseProviderKey(l.useProviderKey);
160
+ setKey(l.key);
161
+ setInputCostPerMillion((_a2 = l.inputCostPerMillion) !== null && _a2 !== void 0 ? _a2 : 0);
162
+ setOutputCostPerMillion((_b = l.outputCostPerMillion) !== null && _b !== void 0 ? _b : 0);
163
+ setSelectedIndex(index);
164
+ }
165
+ };
166
+ const onNew = () => {
167
+ setSelectedIndex(null);
168
+ setId("");
169
+ setProvider("");
170
+ setModel("");
171
+ setTemperature(0);
172
+ setUseProviderKey(false);
173
+ setKey("");
174
+ setInputCostPerMillion(0);
175
+ setOutputCostPerMillion(0);
176
+ };
177
+ const onAdd = () => {
178
+ const llm = { id, provider, model, temperature, useProviderKey, key, inputCostPerMillion: inputCostPerMillion === "" ? 0 : inputCostPerMillion, outputCostPerMillion: outputCostPerMillion === "" ? 0 : outputCostPerMillion };
179
+ const updated = [...llms];
180
+ if (selectedIndex !== null)
181
+ updated[selectedIndex] = llm;
182
+ else
183
+ updated.push(llm);
184
+ setLlms(updated);
185
+ onNew();
186
+ };
187
+ const onRemove = () => {
188
+ if (selectedIndex === null)
189
+ return;
190
+ setLlms(llms.filter((_, i) => i !== selectedIndex));
191
+ onNew();
192
+ };
193
+ return react_1.default.createElement(
194
+ material_1.Dialog,
195
+ { open: true, onClose: () => props.onClose(void 0), PaperProps: { sx: { width: "80vw", maxWidth: "800px", height: "78vh" } } },
196
+ react_1.default.createElement(material_1.DialogTitle, null, "AI \u2014 LLM config"),
197
+ react_1.default.createElement(
198
+ material_1.DialogContent,
199
+ { style: { display: "flex", height: "100%" } },
200
+ react_1.default.createElement(
201
+ material_1.Box,
202
+ { sx: { flex: 1, display: "flex", flexDirection: "column", boxSizing: "border-box", maxWidth: "40%" } },
203
+ react_1.default.createElement(
204
+ material_1.Box,
205
+ { sx: { flex: 1, overflowY: "auto", overflowX: "hidden" } },
206
+ react_1.default.createElement(material_1.List, { sx: { flexGrow: 1, mr: 2, width: "100%" } }, llms.map((llm, index) => react_1.default.createElement(
207
+ material_1.ListItemButton,
208
+ { key: index, selected: selectedIndex === index, onClick: () => onLlmSelected(index) },
209
+ react_1.default.createElement(
210
+ material_1.Stack,
211
+ { direction: "column" },
212
+ react_1.default.createElement(material_1.Typography, { sx: { fontWeight: selectedIndex === index ? "bold" : "normal" } }, llm.id),
213
+ react_1.default.createElement(material_1.Typography, { color: "darkgray", fontSize: 12 }, llm.provider)
214
+ )
215
+ )))
216
+ )
217
+ ),
218
+ react_1.default.createElement(
219
+ material_1.Box,
220
+ { sx: { flex: 1, display: "flex", alignItems: "start", padding: "16px" } },
221
+ react_1.default.createElement(
222
+ material_1.Stack,
223
+ { spacing: 2, style: { width: "100%" } },
224
+ react_1.default.createElement(
225
+ material_1.Stack,
226
+ { direction: "column", spacing: 1 },
227
+ react_1.default.createElement(material_1.TextField, { value: id, onChange: (e) => setId(e.target.value), placeholder: "Enter LLM id", label: "LLM ID", variant: "standard", fullWidth: true }),
228
+ react_1.default.createElement(
229
+ material_1.FormControl,
230
+ { variant: "standard", sx: { width: "100%" } },
231
+ react_1.default.createElement(material_1.InputLabel, null, "Provider"),
232
+ react_1.default.createElement(material_1.Select, { value: provider, onChange: (e) => {
233
+ setProvider(e.target.value);
234
+ setModel("");
235
+ }, variant: "standard", fullWidth: true }, props.providers.map((p) => react_1.default.createElement(material_1.MenuItem, { key: p.name, value: p.name, disabled: p.models.length === 0 }, p.name)))
236
+ ),
237
+ react_1.default.createElement(
238
+ material_1.FormControl,
239
+ { variant: "standard", sx: { width: "100%" } },
240
+ react_1.default.createElement(material_1.InputLabel, null, "Model"),
241
+ react_1.default.createElement(material_1.Select, { value: model, onChange: (e) => setModel(e.target.value), variant: "standard", fullWidth: true, displayEmpty: true }, (_a = props.providers.find((p) => p.name === provider)) === null || _a === void 0 ? void 0 : _a.models.map((m, i) => react_1.default.createElement(material_1.MenuItem, { key: i, value: m.id }, m.name)))
242
+ ),
243
+ react_1.default.createElement(material_1.TextField, { value: temperature, onChange: (e) => setTemperature(+e.target.value), label: "Model temperature", variant: "standard", type: "number", fullWidth: true }),
244
+ react_1.default.createElement(
245
+ material_1.Stack,
246
+ { direction: "row", spacing: 1 },
247
+ react_1.default.createElement(material_1.TextField, { value: inputCostPerMillion, onChange: (e) => setInputCostPerMillion(e.target.value === "" ? "" : +e.target.value), label: "Input cost / M tokens (\u20AC/$)", variant: "standard", type: "number", fullWidth: true, inputProps: { min: 0, step: 0.01 } }),
248
+ react_1.default.createElement(material_1.TextField, { value: outputCostPerMillion, onChange: (e) => setOutputCostPerMillion(e.target.value === "" ? "" : +e.target.value), label: "Output cost / M tokens (\u20AC/$)", variant: "standard", type: "number", fullWidth: true, inputProps: { min: 0, step: 0.01 } })
249
+ ),
250
+ react_1.default.createElement(
251
+ material_1.Stack,
252
+ { direction: "row", alignItems: "center" },
253
+ react_1.default.createElement(material_1.Typography, { flex: 1 }, "Use provider API Key (or enter a specific one)"),
254
+ react_1.default.createElement(material_1.Checkbox, { checked: useProviderKey, onChange: (e) => setUseProviderKey(e.target.checked) })
255
+ ),
256
+ react_1.default.createElement(material_1.TextField, { value: key, onChange: (e) => setKey(e.target.value), disabled: useProviderKey, label: "API Key", placeholder: "Enter API Key", variant: "standard", fullWidth: true, type: showPassword ? "text" : "password", InputProps: {
257
+ endAdornment: react_1.default.createElement(
258
+ material_1.InputAdornment,
259
+ { position: "end" },
260
+ react_1.default.createElement(material_1.IconButton, { onClick: () => setShowPassword(!showPassword), edge: "end" }, showPassword ? react_1.default.createElement(icons_material_1.VisibilityOff, null) : react_1.default.createElement(icons_material_1.Visibility, null))
261
+ )
262
+ } })
263
+ ),
264
+ react_1.default.createElement(
265
+ material_1.Stack,
266
+ { direction: "row", spacing: 1 },
267
+ react_1.default.createElement(material_1.Button, { variant: "outlined", size: "small", onClick: onNew }, "New"),
268
+ react_1.default.createElement(material_1.Typography, { flex: 1 }),
269
+ react_1.default.createElement(material_1.Button, { color: "error", onClick: onRemove, disabled: selectedIndex === null }, "Remove"),
270
+ react_1.default.createElement(material_1.Button, { variant: "contained", onClick: onAdd, disabled: !id || !model }, selectedIndex !== null ? "Update" : "Add")
271
+ )
272
+ )
273
+ )
274
+ ),
275
+ react_1.default.createElement(
276
+ material_1.DialogActions,
277
+ null,
278
+ react_1.default.createElement(material_1.Button, { onClick: () => props.onClose(llms), variant: "contained" }, "OK"),
279
+ react_1.default.createElement(material_1.Button, { onClick: () => props.onClose(void 0), color: "inherit" }, "Cancel")
280
+ )
281
+ );
282
+ };
283
+ exports.AiConfigLlm = AiConfigLlm2;
284
+ var AiConfigProvider2 = (props) => {
285
+ var _a;
286
+ const [providers, setProviders] = (0, react_1.useState)(JSON.parse(JSON.stringify(props.providers)));
287
+ const [selectedIndex, setSelectedIndex] = (0, react_1.useState)(null);
288
+ const [showPassword, setShowPassword] = (0, react_1.useState)(false);
289
+ const [providerName, setProviderName] = (0, react_1.useState)("");
290
+ const [providerKey, setProviderKey] = (0, react_1.useState)((_a = props.providersAvailable[0]) !== null && _a !== void 0 ? _a : "");
291
+ const onProviderSelected = (p, index) => {
292
+ setProviderName(p.name);
293
+ setProviderKey(p.key);
294
+ setSelectedIndex(index);
295
+ };
296
+ const onNew = () => {
297
+ setSelectedIndex(null);
298
+ setProviderName("");
299
+ setProviderKey("");
300
+ };
301
+ const onAdd = () => {
302
+ if (!providerName.trim())
303
+ return;
304
+ const updated = [...providers];
305
+ if (selectedIndex !== null)
306
+ updated[selectedIndex] = Object.assign(Object.assign({}, updated[selectedIndex]), { name: providerName, key: providerKey });
307
+ else
308
+ updated.push({ name: providerName, key: providerKey, models: [] });
309
+ setProviders(updated);
310
+ onNew();
311
+ };
312
+ const onRemove = () => {
313
+ if (selectedIndex === null)
314
+ return;
315
+ setProviders(providers.filter((_, i) => i !== selectedIndex));
316
+ onNew();
317
+ };
318
+ return react_1.default.createElement(
319
+ material_1.Dialog,
320
+ { open: true, onClose: () => props.onClose(void 0), PaperProps: { sx: { width: "80vw", maxWidth: "900px", height: "45vh" } } },
321
+ react_1.default.createElement(material_1.DialogTitle, null, "AI \u2014 Provider config"),
322
+ react_1.default.createElement(
323
+ material_1.DialogContent,
324
+ { style: { display: "flex", height: "100%" } },
325
+ react_1.default.createElement(
326
+ material_1.Box,
327
+ { sx: { flex: 1, display: "flex", flexDirection: "column", boxSizing: "border-box", maxWidth: "30%" } },
328
+ react_1.default.createElement(
329
+ material_1.Box,
330
+ { sx: { flex: 1, overflowY: "auto" } },
331
+ react_1.default.createElement(material_1.List, { sx: { mr: 1 } }, providers.map((p, index) => {
332
+ var _a2;
333
+ return react_1.default.createElement(
334
+ material_1.ListItemButton,
335
+ { key: index, selected: selectedIndex === index, onClick: () => onProviderSelected(p, index) },
336
+ react_1.default.createElement(
337
+ material_1.Stack,
338
+ { direction: "column" },
339
+ react_1.default.createElement(material_1.Typography, { sx: { fontWeight: selectedIndex === index ? "bold" : "normal" } }, p.name),
340
+ react_1.default.createElement(
341
+ material_1.Typography,
342
+ { color: "darkgray", fontSize: 11 },
343
+ ((_a2 = p.models) === null || _a2 === void 0 ? void 0 : _a2.length) || 0,
344
+ " models loaded"
345
+ )
346
+ )
347
+ );
348
+ }))
349
+ )
350
+ ),
351
+ react_1.default.createElement(
352
+ material_1.Box,
353
+ { sx: { flex: 1, display: "flex", alignItems: "start", padding: "24px" } },
354
+ react_1.default.createElement(
355
+ material_1.Stack,
356
+ { spacing: 3, style: { width: "100%" } },
357
+ react_1.default.createElement(
358
+ material_1.FormControl,
359
+ { variant: "standard", sx: { width: "100%" } },
360
+ react_1.default.createElement(material_1.InputLabel, null, "Provider"),
361
+ react_1.default.createElement(material_1.Select, { value: providerName, onChange: (e) => setProviderName(e.target.value), variant: "standard", fullWidth: true }, props.providersAvailable.map((name) => react_1.default.createElement(material_1.MenuItem, { key: name, value: name }, name)))
362
+ ),
363
+ react_1.default.createElement(material_1.TextField, { label: "API Key / Token", type: showPassword ? "text" : "password", variant: "standard", fullWidth: true, value: providerKey, onChange: (e) => setProviderKey(e.target.value), helperText: "This key can be afterwards linked to specific uses.", InputProps: {
364
+ endAdornment: react_1.default.createElement(
365
+ material_1.InputAdornment,
366
+ { position: "end" },
367
+ react_1.default.createElement(material_1.IconButton, { onClick: () => setShowPassword(!showPassword), edge: "end" }, showPassword ? react_1.default.createElement(icons_material_1.VisibilityOff, null) : react_1.default.createElement(icons_material_1.Visibility, null))
368
+ )
369
+ } }),
370
+ react_1.default.createElement(material_1.Box, { sx: { flexGrow: 1 } }),
371
+ react_1.default.createElement(
372
+ material_1.Stack,
373
+ { direction: "row", spacing: 1 },
374
+ react_1.default.createElement(material_1.Button, { variant: "outlined", onClick: onNew }, "New"),
375
+ react_1.default.createElement(material_1.Typography, { flex: 1 }),
376
+ react_1.default.createElement(material_1.Button, { variant: "text", color: "error", onClick: onRemove, disabled: selectedIndex === null }, "Remove"),
377
+ react_1.default.createElement(material_1.Button, { variant: "contained", onClick: onAdd, disabled: !providerName }, selectedIndex !== null ? "Update" : "Add")
378
+ )
379
+ )
380
+ )
381
+ ),
382
+ react_1.default.createElement(
383
+ material_1.DialogActions,
384
+ { sx: { p: 2 } },
385
+ react_1.default.createElement(material_1.Button, { onClick: () => props.onClose(providers), color: "primary", variant: "contained" }, "Save"),
386
+ react_1.default.createElement(material_1.Button, { onClick: () => props.onClose(void 0), color: "inherit" }, "Cancel")
387
+ )
388
+ );
389
+ };
390
+ exports.AiConfigProvider = AiConfigProvider2;
391
+ }
392
+ });
393
+
394
+ // src/common/PinocchioConfig.ts
395
+ var kindsAvailable = ["Pod", "Deployment", "DaemonSet", "StatefulSet", "ReplicaSet", "Job", "CronJob", "ReplicationController", "Service", "Ingress", "HTTPRoute"];
396
+ var PinocchioConfig = class {
397
+ constructor() {
398
+ this.triggers = [];
399
+ this.llms = [];
400
+ }
401
+ };
402
+ var PinocchioInstanceConfig = class {
403
+ };
404
+
405
+ // src/front/PinocchioSetup.tsx
406
+ var import_react = __toESM(require_react(), 1);
407
+ var import_icons_material = __toESM(require_icons_material(), 1);
408
+ var PinocchioIcon = /* @__PURE__ */ import_react.default.createElement(import_icons_material.AutoFixHigh, null);
409
+ var PinocchioSetup = (props) => {
410
+ return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null);
411
+ };
412
+
413
+ // src/front/PinocchioChannel.ts
414
+ var import_kwirth_common3 = __toESM(require_kwirth_common(), 1);
415
+
416
+ // src/front/PinocchioData.ts
417
+ var PinocchioData = class {
418
+ constructor() {
419
+ this.toolsAvailable = [];
420
+ this.providersAvailable = [];
421
+ this.providers = [];
422
+ this.config = {
423
+ triggers: [],
424
+ llms: []
425
+ };
426
+ this.content = [];
427
+ this.paused = false;
428
+ this.started = false;
429
+ }
430
+ };
431
+
432
+ // src/front/PinocchioTabContent.tsx
433
+ var import_react7 = __toESM(require_react(), 1);
434
+ var import_material6 = __toESM(require_material(), 1);
435
+ var import_icons_material6 = __toESM(require_icons_material(), 1);
436
+
437
+ // src/front/PinocchioConfigTrigger.tsx
438
+ var import_react3 = __toESM(require_react(), 1);
439
+ var import_material2 = __toESM(require_material(), 1);
440
+ var import_icons_material3 = __toESM(require_icons_material(), 1);
441
+
442
+ // src/front/utils.tsx
443
+ var import_react2 = __toESM(require_react(), 1);
444
+ var import_icons_material2 = __toESM(require_icons_material(), 1);
445
+ var import_material = __toESM(require_material(), 1);
446
+ function objectClone(obj) {
447
+ if (!obj) return void 0;
448
+ return JSON.parse(JSON.stringify(obj));
449
+ }
450
+ var MsgBoxOkWarning = (title, message, onClose, onResult) => MsgBoxShow(title, message, onClose, 1 /* Ok */, /* @__PURE__ */ import_react2.default.createElement(import_icons_material2.Warning, { fontSize: "large", color: "warning" }), onResult);
451
+ var MsgBoxYesNo = (title, message, onClose, onResult) => MsgBoxShow(title, message, onClose, 2 /* Yes */ + 8 /* No */, /* @__PURE__ */ import_react2.default.createElement(import_icons_material2.HelpOutline, { fontSize: "large", color: "primary" }), onResult);
452
+ var MsgBoxShow = (title, message, onClose, buttons, icon, onResult) => {
453
+ return /* @__PURE__ */ import_react2.default.createElement(import_material.Dialog, { open: true, onClose: () => {
454
+ onClose(/* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null));
455
+ if (onResult) onResult(32 /* Cancel */);
456
+ } }, /* @__PURE__ */ import_react2.default.createElement(import_material.DialogTitle, null, title), /* @__PURE__ */ import_react2.default.createElement(import_material.DialogContent, null, /* @__PURE__ */ import_react2.default.createElement(import_material.Stack, { sx: { mt: 2 }, direction: "row", alignItems: "center" }, icon, /* @__PURE__ */ import_react2.default.createElement(import_material.Box, { sx: { width: "12px" } }), typeof message === "string" ? /* @__PURE__ */ import_react2.default.createElement(import_material.Typography, { component: "div" }, /* @__PURE__ */ import_react2.default.createElement("div", { dangerouslySetInnerHTML: { __html: message } })) : message)), /* @__PURE__ */ import_react2.default.createElement(import_material.DialogActions, { sx: { p: "4px 4px" } }, buttons & 1 /* Ok */ ? /* @__PURE__ */ import_react2.default.createElement(import_material.Button, { onClick: () => {
457
+ onClose(/* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null));
458
+ if (onResult) onResult(1 /* Ok */);
459
+ } }, "ok") : /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null), buttons & 2 /* Yes */ ? /* @__PURE__ */ import_react2.default.createElement(import_material.Button, { onClick: () => {
460
+ onClose(/* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null));
461
+ if (onResult) onResult(2 /* Yes */);
462
+ } }, "yes") : /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null), buttons & 8 /* No */ ? /* @__PURE__ */ import_react2.default.createElement(import_material.Button, { onClick: () => {
463
+ onClose(/* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null));
464
+ if (onResult) onResult(8 /* No */);
465
+ } }, "no") : /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null), buttons & 32 /* Cancel */ ? /* @__PURE__ */ import_react2.default.createElement(import_material.Button, { onClick: () => {
466
+ onClose(/* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null));
467
+ if (onResult) onResult(32 /* Cancel */);
468
+ } }, "cancel") : /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null)));
469
+ };
470
+
471
+ // src/front/PinocchioConfigTrigger.tsx
472
+ var import_kwirth_common_front = __toESM(require_kwirth_common_front(), 1);
473
+ var PinocchioConfigTrigger = (props) => {
474
+ const [config, setConfig] = (0, import_react3.useState)(objectClone(props.pinocchioConfig));
475
+ const [selectedTriggerIndex, setSelectedTriggerIndex] = (0, import_react3.useState)(null);
476
+ const [newTriggerId, setNewTriggerId] = (0, import_react3.useState)("");
477
+ const [triggerId, setTriggerId] = (0, import_react3.useState)("");
478
+ const [triggerType, setTriggerType] = (0, import_react3.useState)("artifact");
479
+ const [triggerKind, setTriggerKind] = (0, import_react3.useState)("");
480
+ const [selectedVersionIndex, setSelectedVersionIndex] = (0, import_react3.useState)(null);
481
+ const [msgBox, setMsgBox] = (0, import_react3.useState)(/* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null));
482
+ const [versionId, setVersionId] = (0, import_react3.useState)("");
483
+ const [description, setDescription] = (0, import_react3.useState)("");
484
+ const [enabled, setEnabled] = (0, import_react3.useState)(true);
485
+ const [system, setSystem] = (0, import_react3.useState)("");
486
+ const [promptType, setPromptType] = (0, import_react3.useState)("jinja");
487
+ const [prompt, setPrompt] = (0, import_react3.useState)("");
488
+ const [action, setAction] = (0, import_react3.useState)("inform");
489
+ const [llm, setLlm] = (0, import_react3.useState)("");
490
+ const [steps, setSteps] = (0, import_react3.useState)(1);
491
+ const [tools, setTools] = (0, import_react3.useState)([]);
492
+ const [autoTools, setAutoTools] = (0, import_react3.useState)(false);
493
+ const [spaces, setSpaces] = (0, import_react3.useState)("");
494
+ (0, import_kwirth_common_front.useKeyboard)(() => props.onClose(void 0));
495
+ const selectedTrigger = selectedTriggerIndex !== null ? config.triggers[selectedTriggerIndex] : null;
496
+ const clearVersionEditor = () => {
497
+ setVersionId("");
498
+ setDescription("");
499
+ setEnabled(true);
500
+ setSystem("");
501
+ setPromptType("jinja");
502
+ setPrompt("");
503
+ setAction("inform");
504
+ setLlm("");
505
+ setSteps(1);
506
+ setTools([]);
507
+ setAutoTools(false);
508
+ setSpaces("");
509
+ };
510
+ const onTriggerSelect = (index) => {
511
+ setSelectedTriggerIndex(index);
512
+ setTriggerId(config.triggers[index].id);
513
+ setTriggerType(config.triggers[index].trigger);
514
+ setTriggerKind(config.triggers[index].kind ?? "");
515
+ setSelectedVersionIndex(null);
516
+ clearVersionEditor();
517
+ };
518
+ const onTriggerIdChange = (newId) => {
519
+ if (selectedTriggerIndex === null) return;
520
+ setTriggerId(newId);
521
+ const newTriggers = [...config.triggers ?? []];
522
+ newTriggers[selectedTriggerIndex] = { ...newTriggers[selectedTriggerIndex], id: newId };
523
+ setConfig((c) => ({ ...c, triggers: newTriggers }));
524
+ };
525
+ const onTriggerTypeChange = (newType) => {
526
+ if (selectedTriggerIndex === null) return;
527
+ setTriggerType(newType);
528
+ const newTriggers = [...config.triggers ?? []];
529
+ newTriggers[selectedTriggerIndex] = { ...newTriggers[selectedTriggerIndex], trigger: newType };
530
+ setConfig((c) => ({ ...c, triggers: newTriggers }));
531
+ };
532
+ const onTriggerKindChange = (newKind) => {
533
+ if (selectedTriggerIndex === null) return;
534
+ setTriggerKind(newKind);
535
+ const newTriggers = [...config.triggers ?? []];
536
+ newTriggers[selectedTriggerIndex] = { ...newTriggers[selectedTriggerIndex], kind: newKind };
537
+ setConfig((c) => ({ ...c, triggers: newTriggers }));
538
+ };
539
+ const onTriggerAdd = () => {
540
+ const id = newTriggerId.trim() || `trigger-${(config.triggers ?? []).length + 1}`;
541
+ const t = { id, trigger: "artifact", versions: [] };
542
+ const newTriggers = [...config.triggers ?? [], t];
543
+ setConfig({ ...config, triggers: newTriggers });
544
+ setSelectedTriggerIndex(newTriggers.length - 1);
545
+ setSelectedVersionIndex(null);
546
+ clearVersionEditor();
547
+ setNewTriggerId("");
548
+ };
549
+ const onVersionClone = () => {
550
+ if (selectedTriggerIndex === null || selectedVersionIndex === null) return;
551
+ const source = config.triggers[selectedTriggerIndex].versions[selectedVersionIndex];
552
+ const cloned = { ...objectClone(source), id: source.id + "-copy", enabled: false };
553
+ const newTriggers = [...config.triggers];
554
+ newTriggers[selectedTriggerIndex] = {
555
+ ...newTriggers[selectedTriggerIndex],
556
+ versions: [...newTriggers[selectedTriggerIndex].versions ?? [], cloned]
557
+ };
558
+ setConfig((c) => ({ ...c, triggers: newTriggers }));
559
+ };
560
+ const onTriggerDelete = () => {
561
+ if (selectedTriggerIndex === null) return;
562
+ const t = config.triggers[selectedTriggerIndex];
563
+ setMsgBox(MsgBoxYesNo("Delete trigger", `Delete trigger "${t.id}"?`, setMsgBox, (a) => {
564
+ if (a !== 2 /* Yes */) return;
565
+ const newTriggers = (config.triggers ?? []).filter((_, i) => i !== selectedTriggerIndex);
566
+ setConfig((c) => ({ ...c, triggers: newTriggers }));
567
+ setSelectedTriggerIndex(null);
568
+ setSelectedVersionIndex(null);
569
+ clearVersionEditor();
570
+ }));
571
+ };
572
+ const onVersionSelect = (v, index) => {
573
+ setSelectedVersionIndex(index);
574
+ setVersionId(v.id);
575
+ setDescription(v.description ?? "");
576
+ setEnabled(v.enabled);
577
+ setSystem(v.system);
578
+ setPromptType(v.promptType);
579
+ setPrompt(v.prompt);
580
+ setAction(v.action);
581
+ setLlm(v.llm);
582
+ setSteps(v.steps);
583
+ setTools(v.tools);
584
+ setAutoTools(v.autoTools ?? false);
585
+ setSpaces(v.spaces?.join(",") ?? "");
586
+ };
587
+ const onNewVersion = () => {
588
+ setSelectedVersionIndex(null);
589
+ clearVersionEditor();
590
+ };
591
+ const onVersionSave = () => {
592
+ if (selectedTriggerIndex === null) return;
593
+ const existingVersions = config.triggers[selectedTriggerIndex].versions ?? [];
594
+ const duplicate = existingVersions.some((v2, i) => v2.id === versionId.trim() && i !== selectedVersionIndex);
595
+ if (duplicate) {
596
+ setMsgBox(MsgBoxOkWarning("Duplicate version", `A version with id "${versionId.trim()}" already exists.`, setMsgBox));
597
+ return;
598
+ }
599
+ const v = { id: versionId.trim(), description, enabled, system, promptType, prompt, action, llm, steps, tools, autoTools, spaces: spaces.split(",").filter(Boolean) };
600
+ const newTriggers = [...config.triggers ?? []];
601
+ let versions = [...existingVersions];
602
+ if (enabled)
603
+ versions = versions.map((ver, i) => i === selectedVersionIndex ? ver : { ...ver, enabled: false });
604
+ if (selectedVersionIndex !== null)
605
+ versions[selectedVersionIndex] = v;
606
+ else
607
+ versions.push(v);
608
+ newTriggers[selectedTriggerIndex] = { ...newTriggers[selectedTriggerIndex], versions };
609
+ setConfig({ ...config, triggers: newTriggers });
610
+ onNewVersion();
611
+ };
612
+ const onVersionDelete = () => {
613
+ if (selectedTriggerIndex === null || selectedVersionIndex === null) return;
614
+ const v = config.triggers[selectedTriggerIndex].versions[selectedVersionIndex];
615
+ setMsgBox(MsgBoxYesNo("Delete version", `Delete version "${v.id}"?`, setMsgBox, (a) => {
616
+ if (a !== 2 /* Yes */) return;
617
+ const newTriggers = [...config.triggers ?? []];
618
+ const versions = (newTriggers[selectedTriggerIndex].versions ?? []).filter((_, i) => i !== selectedVersionIndex);
619
+ newTriggers[selectedTriggerIndex] = { ...newTriggers[selectedTriggerIndex], versions };
620
+ setConfig((c) => ({ ...c, triggers: newTriggers }));
621
+ onNewVersion();
622
+ }));
623
+ };
624
+ const onVersionToggle = (vIndex) => {
625
+ if (selectedTriggerIndex === null) return;
626
+ const newTriggers = [...config.triggers ?? []];
627
+ const versions = [...newTriggers[selectedTriggerIndex].versions ?? []];
628
+ const enabling = !versions[vIndex].enabled;
629
+ newTriggers[selectedTriggerIndex] = {
630
+ ...newTriggers[selectedTriggerIndex],
631
+ versions: versions.map((v, i) => ({ ...v, enabled: enabling ? i === vIndex : i === vIndex ? false : v.enabled }))
632
+ };
633
+ setConfig({ ...config, triggers: newTriggers });
634
+ };
635
+ const onChangeTools = (event) => {
636
+ setTools(event.target.value);
637
+ };
638
+ return /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement(import_material2.Dialog, { open: true, PaperProps: { sx: { width: "85vw", maxWidth: "1300px", height: "78vh" } } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.DialogTitle, null, "Trigger Config"), /* @__PURE__ */ import_react3.default.createElement(import_material2.DialogContent, { style: { display: "flex", height: "100%", overflow: "hidden", padding: "8px 16px" } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.Box, { sx: { flex: "0 0 220px", display: "flex", flexDirection: "column", boxSizing: "border-box", pr: 1 } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.Typography, { variant: "caption", color: "text.secondary", sx: { fontWeight: "bold", px: 0.5, pt: 0.5 } }, "Triggers"), /* @__PURE__ */ import_react3.default.createElement(import_material2.Stack, { direction: "row", spacing: 0.5, alignItems: "center", sx: { px: 0.5, pb: 0.5 } }, /* @__PURE__ */ import_react3.default.createElement(
639
+ import_material2.TextField,
640
+ {
641
+ size: "small",
642
+ value: newTriggerId,
643
+ onChange: (e) => setNewTriggerId(e.target.value),
644
+ placeholder: "Trigger id",
645
+ variant: "outlined",
646
+ fullWidth: true,
647
+ inputProps: { style: { fontSize: 12, padding: "4px 6px" } },
648
+ onKeyDown: (e) => {
649
+ if (e.key === "Enter") onTriggerAdd();
650
+ }
651
+ }
652
+ ), /* @__PURE__ */ import_react3.default.createElement(import_material2.IconButton, { size: "small", onClick: onTriggerAdd }, /* @__PURE__ */ import_react3.default.createElement(import_icons_material3.Add, { fontSize: "small" })), /* @__PURE__ */ import_react3.default.createElement(import_material2.IconButton, { size: "small", onClick: onTriggerDelete, disabled: selectedTriggerIndex === null, color: "error" }, /* @__PURE__ */ import_react3.default.createElement(import_icons_material3.Delete, { fontSize: "small" }))), /* @__PURE__ */ import_react3.default.createElement(import_material2.Box, { sx: { flex: "0 0 auto", maxHeight: "40%", overflowY: "auto", overflowX: "hidden" } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.List, { dense: true, sx: { py: 0 } }, (config.triggers ?? []).map((t, index) => /* @__PURE__ */ import_react3.default.createElement(import_material2.ListItemButton, { key: index, selected: selectedTriggerIndex === index, onClick: () => onTriggerSelect(index), dense: true }, /* @__PURE__ */ import_react3.default.createElement(import_material2.Stack, { direction: "column" }, /* @__PURE__ */ import_react3.default.createElement(import_material2.Typography, { variant: "body2", sx: { fontWeight: selectedTriggerIndex === index ? "bold" : "normal" } }, t.id), /* @__PURE__ */ import_react3.default.createElement(import_material2.Typography, { color: "textSecondary", fontSize: 10 }, t.trigger, t.kind ? ` \xB7 ${t.kind}` : "")))))), /* @__PURE__ */ import_react3.default.createElement(import_material2.Divider, { sx: { my: 0.5 } }), /* @__PURE__ */ import_react3.default.createElement(import_material2.Typography, { variant: "caption", color: "text.secondary", sx: { fontWeight: "bold", px: 0.5 } }, "Versions", selectedTrigger ? ` \u2014 ${selectedTrigger.id}` : ""), /* @__PURE__ */ import_react3.default.createElement(import_material2.Box, { sx: { flex: 1, overflowY: "auto", overflowX: "hidden" } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.List, { dense: true, sx: { py: 0 } }, (selectedTrigger?.versions ?? []).map((v, index) => /* @__PURE__ */ import_react3.default.createElement(import_material2.ListItemButton, { key: index, selected: selectedVersionIndex === index, onClick: () => onVersionSelect(v, index), dense: true, sx: { py: 0.5 } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.Switch, { size: "small", checked: v.enabled, onChange: () => onVersionToggle(index), onClick: (e) => e.stopPropagation(), sx: { mr: 0.5 } }), /* @__PURE__ */ import_react3.default.createElement(import_material2.Stack, { direction: "column" }, /* @__PURE__ */ import_react3.default.createElement(import_material2.Typography, { variant: "body2", sx: { fontWeight: selectedVersionIndex === index ? "bold" : "normal" } }, v.id), v.description && /* @__PURE__ */ import_react3.default.createElement(import_material2.Typography, { variant: "caption", color: "text.secondary", sx: { lineHeight: 1.2 } }, v.description))))))), /* @__PURE__ */ import_react3.default.createElement(import_material2.Box, { sx: { flex: 1, minWidth: 0, display: "flex", flexDirection: "column", padding: "8px 8px 8px 16px", minHeight: 0 } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.Stack, { spacing: 1, sx: { width: "100%", height: "100%", display: "flex", flexDirection: "column" } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.Stack, { direction: "row", spacing: 1 }, /* @__PURE__ */ import_react3.default.createElement(import_material2.TextField, { value: triggerId, onChange: (e) => onTriggerIdChange(e.target.value), placeholder: "Trigger id", label: "Trigger ID", variant: "standard", fullWidth: true, disabled: selectedTriggerIndex === null }), /* @__PURE__ */ import_react3.default.createElement(import_material2.FormControl, { variant: "standard", fullWidth: true, disabled: selectedTriggerIndex === null }, /* @__PURE__ */ import_react3.default.createElement(import_material2.InputLabel, null, "Trigger type"), /* @__PURE__ */ import_react3.default.createElement(import_material2.Select, { value: triggerType, onChange: (e) => onTriggerTypeChange(e.target.value), variant: "standard" }, /* @__PURE__ */ import_react3.default.createElement(import_material2.MenuItem, { value: "artifact" }, "artifact"), /* @__PURE__ */ import_react3.default.createElement(import_material2.MenuItem, { value: "business" }, "business"))), triggerType === "artifact" && /* @__PURE__ */ import_react3.default.createElement(import_material2.FormControl, { variant: "standard", fullWidth: true, disabled: selectedTriggerIndex === null }, /* @__PURE__ */ import_react3.default.createElement(import_material2.InputLabel, null, "Kind"), /* @__PURE__ */ import_react3.default.createElement(import_material2.Select, { value: triggerKind, onChange: (e) => onTriggerKindChange(e.target.value), variant: "standard" }, kindsAvailable.map((k) => /* @__PURE__ */ import_react3.default.createElement(import_material2.MenuItem, { key: k, value: k }, k)))), triggerType === "business" && /* @__PURE__ */ import_react3.default.createElement(import_material2.TextField, { value: spaces, onChange: (e) => setSpaces(e.target.value), placeholder: "space.type,...", label: "Spaces", variant: "standard", fullWidth: true, disabled: selectedTriggerIndex === null }), /* @__PURE__ */ import_react3.default.createElement(import_material2.TextField, { value: versionId, onChange: (e) => setVersionId(e.target.value), placeholder: "Version id", label: "Version ID", variant: "standard", fullWidth: true, disabled: selectedTriggerIndex === null })), /* @__PURE__ */ import_react3.default.createElement(import_material2.TextField, { value: description, onChange: (e) => setDescription(e.target.value), placeholder: "Short description", label: "Description", variant: "standard", fullWidth: true, disabled: selectedTriggerIndex === null }), /* @__PURE__ */ import_react3.default.createElement(import_material2.Stack, { direction: "row", alignItems: "flex-end", spacing: 1 }, /* @__PURE__ */ import_react3.default.createElement(import_material2.FormControl, { variant: "standard", sx: { minWidth: 100 } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.InputLabel, null, "Action"), /* @__PURE__ */ import_react3.default.createElement(import_material2.Select, { value: action, onChange: (e) => setAction(e.target.value), variant: "standard", disabled: selectedTriggerIndex === null }, ["inform", "cancel", "repair"].map((v) => /* @__PURE__ */ import_react3.default.createElement(import_material2.MenuItem, { key: v, value: v }, v)))), /* @__PURE__ */ import_react3.default.createElement(import_material2.FormControl, { variant: "standard", sx: { minWidth: 120 } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.InputLabel, null, "LLM"), /* @__PURE__ */ import_react3.default.createElement(import_material2.Select, { value: llm, onChange: (e) => setLlm(e.target.value), variant: "standard", disabled: selectedTriggerIndex === null }, config.llms.map((l) => /* @__PURE__ */ import_react3.default.createElement(import_material2.MenuItem, { key: l.id, value: l.id }, l.id)))), /* @__PURE__ */ import_react3.default.createElement(import_material2.TextField, { value: steps, onChange: (e) => setSteps(+e.target.value), variant: "standard", type: "number", sx: { width: 60 }, label: "Steps", disabled: selectedTriggerIndex === null }), /* @__PURE__ */ import_react3.default.createElement(
653
+ import_material2.FormControlLabel,
654
+ {
655
+ control: /* @__PURE__ */ import_react3.default.createElement(import_material2.Switch, { size: "small", checked: autoTools, onChange: (e) => setAutoTools(e.target.checked), disabled: selectedTriggerIndex === null }),
656
+ label: /* @__PURE__ */ import_react3.default.createElement(import_material2.Typography, { variant: "caption" }, "Auto"),
657
+ sx: { ml: 1, mr: 0, flexShrink: 0 }
658
+ }
659
+ ), /* @__PURE__ */ import_react3.default.createElement(import_material2.FormControl, { variant: "standard", sx: { flex: 1 } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.InputLabel, null, "Tools"), /* @__PURE__ */ import_react3.default.createElement(import_material2.Select, { onChange: onChangeTools, multiple: true, value: tools, renderValue: (sel) => autoTools ? `all (${props.toolsAvailable.length})` : sel.join(", "), variant: "standard", disabled: selectedTriggerIndex === null || autoTools }, props.toolsAvailable.map((tool) => /* @__PURE__ */ import_react3.default.createElement(import_material2.MenuItem, { key: tool, value: tool }, /* @__PURE__ */ import_react3.default.createElement(import_material2.Checkbox, { size: "small", checked: tools.includes(tool) }), /* @__PURE__ */ import_react3.default.createElement(import_material2.Typography, null, tool)))))), /* @__PURE__ */ import_react3.default.createElement(import_material2.Box, { sx: { flex: 1, display: "flex", flexDirection: "column", minHeight: 0, gap: "8px" } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.Box, { sx: { flex: 1, display: "flex", flexDirection: "column", minHeight: 0 } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.Typography, { variant: "caption", color: "text.secondary" }, "System"), /* @__PURE__ */ import_react3.default.createElement("textarea", { value: system, onChange: (e) => setSystem(e.target.value), style: { flex: 1, resize: "none", boxSizing: "border-box", padding: "6px", fontFamily: "monospace", fontSize: 12, minHeight: 0 }, placeholder: "System prompt", disabled: selectedTriggerIndex === null })), /* @__PURE__ */ import_react3.default.createElement(import_material2.Box, { sx: { flex: 1, display: "flex", flexDirection: "column", minHeight: 0 } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.Stack, { direction: "row", alignItems: "center", spacing: 1, sx: { mb: 0.5, flexShrink: 0 } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.Typography, { variant: "caption", color: "text.secondary" }, "Prompt"), /* @__PURE__ */ import_react3.default.createElement(import_material2.FormControl, { variant: "standard", sx: { minWidth: 100 } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.Select, { value: promptType, onChange: (e) => setPromptType(e.target.value), variant: "standard", disabled: selectedTriggerIndex === null, sx: { fontSize: 12 } }, /* @__PURE__ */ import_react3.default.createElement(import_material2.MenuItem, { value: "artifact" }, "artifact"), /* @__PURE__ */ import_react3.default.createElement(import_material2.MenuItem, { value: "jinja" }, "jinja")))), /* @__PURE__ */ import_react3.default.createElement("textarea", { value: prompt, onChange: (e) => setPrompt(e.target.value), style: { flex: 1, resize: "none", boxSizing: "border-box", padding: "6px", fontFamily: "monospace", fontSize: 12, minHeight: 0 }, placeholder: "Prompt", disabled: selectedTriggerIndex === null || promptType === "artifact" }))), /* @__PURE__ */ import_react3.default.createElement(import_material2.Stack, { direction: "row", spacing: 1 }, /* @__PURE__ */ import_react3.default.createElement(import_material2.Button, { variant: "outlined", onClick: onNewVersion, disabled: selectedTriggerIndex === null }, "New"), /* @__PURE__ */ import_react3.default.createElement(import_material2.Button, { variant: "outlined", startIcon: /* @__PURE__ */ import_react3.default.createElement(import_icons_material3.ContentCopy, { fontSize: "small" }), onClick: onVersionClone, disabled: selectedVersionIndex === null }, "Clone"), /* @__PURE__ */ import_react3.default.createElement(import_material2.Typography, { flex: 1 }), /* @__PURE__ */ import_react3.default.createElement(import_material2.Button, { variant: "text", color: "error", onClick: onVersionDelete, disabled: selectedVersionIndex === null }, "Remove"), /* @__PURE__ */ import_react3.default.createElement(import_material2.Button, { variant: "contained", onClick: onVersionSave, disabled: selectedTriggerIndex === null || !versionId.trim() }, selectedVersionIndex !== null ? "Update" : "Add"))))), /* @__PURE__ */ import_react3.default.createElement(import_material2.DialogActions, null, /* @__PURE__ */ import_react3.default.createElement(import_material2.Button, { onClick: () => props.onClose(config) }, "OK"), /* @__PURE__ */ import_react3.default.createElement(import_material2.Button, { onClick: () => props.onClose(void 0) }, "Cancel"))), msgBox);
660
+ };
661
+
662
+ // src/front/PinocchioTabContent.tsx
663
+ var import_kwirth_common2 = __toESM(require_kwirth_common(), 1);
664
+ var import_front = __toESM(require_front(), 1);
665
+ var import_react8 = __toESM(require_react(), 1);
666
+
667
+ // src/front/MenuConfig.tsx
668
+ var import_react4 = __toESM(require_react(), 1);
669
+ var import_material3 = __toESM(require_material(), 1);
670
+ var import_icons_material4 = __toESM(require_icons_material(), 1);
671
+ var MenuConfig = (props) => {
672
+ return /* @__PURE__ */ import_react4.default.createElement(import_material3.Menu, { anchorEl: props.anchorParent, open: true, onClose: props.onClose }, /* @__PURE__ */ import_react4.default.createElement(import_material3.MenuList, { dense: true, sx: { width: "200px" } }, /* @__PURE__ */ import_react4.default.createElement(import_material3.MenuItem, { onClick: () => props.onAction("provider") }, /* @__PURE__ */ import_react4.default.createElement(import_material3.ListItemIcon, null, /* @__PURE__ */ import_react4.default.createElement(import_icons_material4.Hub, { fontSize: "small" })), /* @__PURE__ */ import_react4.default.createElement(import_material3.ListItemText, null, "Provider")), /* @__PURE__ */ import_react4.default.createElement(import_material3.MenuItem, { onClick: () => props.onAction("llm"), disabled: props.providers.length === 0 }, /* @__PURE__ */ import_react4.default.createElement(import_material3.ListItemIcon, null, /* @__PURE__ */ import_react4.default.createElement(import_icons_material4.Memory, { fontSize: "small" })), /* @__PURE__ */ import_react4.default.createElement(import_material3.ListItemText, null, "LLM")), /* @__PURE__ */ import_react4.default.createElement(import_material3.MenuItem, { onClick: () => props.onAction("trigger"), disabled: props.pinocchioConfig.llms.length === 0 }, /* @__PURE__ */ import_react4.default.createElement(import_material3.ListItemIcon, null, /* @__PURE__ */ import_react4.default.createElement(import_icons_material4.Bolt, { fontSize: "small" })), /* @__PURE__ */ import_react4.default.createElement(import_material3.ListItemText, null, "Trigger")), /* @__PURE__ */ import_react4.default.createElement(import_material3.MenuItem, { onClick: () => props.onAction("importexport") }, /* @__PURE__ */ import_react4.default.createElement(import_material3.ListItemIcon, null, /* @__PURE__ */ import_react4.default.createElement(import_icons_material4.ImportExport, { fontSize: "small" })), /* @__PURE__ */ import_react4.default.createElement(import_material3.ListItemText, null, "Import / Export"))));
673
+ };
674
+
675
+ // src/front/PinocchioImportExport.tsx
676
+ var import_react5 = __toESM(require_react(), 1);
677
+ var import_material4 = __toESM(require_material(), 1);
678
+ var import_kwirth_common_front2 = __toESM(require_kwirth_common_front(), 1);
679
+ var CheckSection = ({ label, items, selected, onChange, existsLabel }) => {
680
+ const allChecked = items.length > 0 && items.every((k) => selected.has(k));
681
+ const someChecked = items.some((k) => selected.has(k));
682
+ const toggleAll = () => onChange(allChecked ? /* @__PURE__ */ new Set() : new Set(items));
683
+ const toggleOne = (key) => {
684
+ const next = new Set(selected);
685
+ if (next.has(key)) next.delete(key);
686
+ else next.add(key);
687
+ onChange(next);
688
+ };
689
+ return /* @__PURE__ */ import_react5.default.createElement(import_material4.Box, { sx: { mb: 1 } }, /* @__PURE__ */ import_react5.default.createElement(import_material4.Stack, { direction: "row", alignItems: "center" }, /* @__PURE__ */ import_react5.default.createElement(import_material4.Checkbox, { size: "small", checked: allChecked, indeterminate: someChecked && !allChecked, onChange: toggleAll, disabled: items.length === 0 }), /* @__PURE__ */ import_react5.default.createElement(import_material4.Typography, { variant: "subtitle2", sx: { fontWeight: "bold" } }, label)), /* @__PURE__ */ import_react5.default.createElement(import_material4.Box, { sx: { pl: 3 } }, items.length === 0 ? /* @__PURE__ */ import_react5.default.createElement(import_material4.Typography, { variant: "body2", color: "text.secondary", sx: { ml: 1 } }, "\u2014 none \u2014") : items.map((key) => /* @__PURE__ */ import_react5.default.createElement(import_material4.Stack, { key, direction: "row", alignItems: "center" }, /* @__PURE__ */ import_react5.default.createElement(import_material4.Checkbox, { size: "small", checked: selected.has(key), onChange: () => toggleOne(key) }), /* @__PURE__ */ import_react5.default.createElement(import_material4.Typography, { variant: "body2" }, key), existsLabel?.(key) && /* @__PURE__ */ import_react5.default.createElement(import_material4.Typography, { variant: "caption", color: "warning.main", sx: { ml: 1 } }, "(overwrites existing)")))));
690
+ };
691
+ var PinocchioImportExport = (props) => {
692
+ (0, import_kwirth_common_front2.useKeyboard)(() => props.onClose());
693
+ const [tab, setTab] = (0, import_react5.useState)(0);
694
+ const fileInputRef = (0, import_react5.useRef)(null);
695
+ const [exportProviders, setExportProviders] = (0, import_react5.useState)(new Set(props.providers.map((p) => p.name)));
696
+ const [exportLlms, setExportLlms] = (0, import_react5.useState)(new Set(props.config.llms.map((l) => l.id)));
697
+ const [exportTriggers, setExportTriggers] = (0, import_react5.useState)(new Set(props.config.triggers.map((t) => t.id)));
698
+ const [importFile, setImportFile] = (0, import_react5.useState)(null);
699
+ const [importProviders, setImportProviders] = (0, import_react5.useState)(/* @__PURE__ */ new Set());
700
+ const [importLlms, setImportLlms] = (0, import_react5.useState)(/* @__PURE__ */ new Set());
701
+ const [importTriggers, setImportTriggers] = (0, import_react5.useState)(/* @__PURE__ */ new Set());
702
+ const [importError, setImportError] = (0, import_react5.useState)("");
703
+ const handleDownload = () => {
704
+ const data = {
705
+ version: "1",
706
+ providers: props.providers.filter((p) => exportProviders.has(p.name)),
707
+ llms: props.config.llms.filter((l) => exportLlms.has(l.id)),
708
+ triggers: props.config.triggers.filter((t) => exportTriggers.has(t.id))
709
+ };
710
+ const blob = new Blob([JSON.stringify(data, null, 2)], { type: "application/json" });
711
+ const url = URL.createObjectURL(blob);
712
+ const a = document.createElement("a");
713
+ a.href = url;
714
+ a.download = `pinocchio-config-${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)}.json`;
715
+ a.click();
716
+ URL.revokeObjectURL(url);
717
+ };
718
+ const handleFileChange = (e) => {
719
+ const file = e.target.files?.[0];
720
+ if (!file) return;
721
+ const reader = new FileReader();
722
+ reader.onload = (ev) => {
723
+ try {
724
+ const parsed = JSON.parse(ev.target?.result);
725
+ if (parsed.version !== "1") throw new Error("Unsupported version");
726
+ setImportFile(parsed);
727
+ setImportProviders(new Set((parsed.providers ?? []).map((p) => p.name)));
728
+ setImportLlms(new Set((parsed.llms ?? []).map((l) => l.id)));
729
+ setImportTriggers(new Set((parsed.triggers ?? []).map((t) => t.id)));
730
+ setImportError("");
731
+ } catch {
732
+ setImportError("Invalid or unsupported file");
733
+ setImportFile(null);
734
+ }
735
+ };
736
+ reader.readAsText(file);
737
+ e.target.value = "";
738
+ };
739
+ const handleImport = () => {
740
+ if (!importFile) return;
741
+ const mergeById = (current, incoming, key) => {
742
+ const result = [...current];
743
+ for (const item of incoming) {
744
+ const idx = result.findIndex((x) => x[key] === item[key]);
745
+ if (idx >= 0) result[idx] = item;
746
+ else result.push(item);
747
+ }
748
+ return result;
749
+ };
750
+ const newProviders = mergeById(props.providers, (importFile.providers ?? []).filter((p) => importProviders.has(p.name)), "name");
751
+ const newLlms = mergeById(props.config.llms, (importFile.llms ?? []).filter((l) => importLlms.has(l.id)), "id");
752
+ const newTriggers = mergeById(props.config.triggers, (importFile.triggers ?? []).filter((t) => importTriggers.has(t.id)), "id");
753
+ props.onClose(newProviders, { ...props.config, llms: newLlms, triggers: newTriggers });
754
+ };
755
+ const totalExport = exportProviders.size + exportLlms.size + exportTriggers.size;
756
+ const totalImport = importProviders.size + importLlms.size + importTriggers.size;
757
+ return /* @__PURE__ */ import_react5.default.createElement(import_material4.Dialog, { open: true, PaperProps: { sx: { width: "60vw", maxWidth: "680px", height: "58vh" } } }, /* @__PURE__ */ import_react5.default.createElement(import_material4.DialogTitle, null, "Import / Export"), /* @__PURE__ */ import_react5.default.createElement(import_material4.DialogContent, { sx: { display: "flex", flexDirection: "column", p: 0 } }, /* @__PURE__ */ import_react5.default.createElement(import_material4.Tabs, { value: tab, onChange: (_, v) => setTab(v), sx: { borderBottom: 1, borderColor: "divider", px: 2 } }, /* @__PURE__ */ import_react5.default.createElement(import_material4.Tab, { label: "Export" }), /* @__PURE__ */ import_react5.default.createElement(import_material4.Tab, { label: "Import" })), /* @__PURE__ */ import_react5.default.createElement(import_material4.Box, { sx: { flex: 1, overflowY: "auto", p: 2 } }, tab === 0 && /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, /* @__PURE__ */ import_react5.default.createElement(CheckSection, { label: "Providers", items: props.providers.map((p) => p.name), selected: exportProviders, onChange: setExportProviders }), /* @__PURE__ */ import_react5.default.createElement(import_material4.Divider, { sx: { my: 1 } }), /* @__PURE__ */ import_react5.default.createElement(CheckSection, { label: "LLMs", items: props.config.llms.map((l) => l.id), selected: exportLlms, onChange: setExportLlms }), /* @__PURE__ */ import_react5.default.createElement(import_material4.Divider, { sx: { my: 1 } }), /* @__PURE__ */ import_react5.default.createElement(CheckSection, { label: "Triggers", items: props.config.triggers.map((t) => t.id), selected: exportTriggers, onChange: setExportTriggers }), /* @__PURE__ */ import_react5.default.createElement(import_material4.Box, { sx: { mt: 2 } }, /* @__PURE__ */ import_react5.default.createElement(import_material4.Button, { variant: "contained", size: "small", onClick: handleDownload, disabled: totalExport === 0 }, "Download JSON"))), tab === 1 && /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, /* @__PURE__ */ import_react5.default.createElement(import_material4.Stack, { direction: "row", alignItems: "center", spacing: 2, sx: { mb: 2 } }, /* @__PURE__ */ import_react5.default.createElement("input", { ref: fileInputRef, type: "file", accept: ".json", style: { display: "none" }, onChange: handleFileChange }), /* @__PURE__ */ import_react5.default.createElement(import_material4.Button, { variant: "outlined", size: "small", onClick: () => fileInputRef.current?.click() }, "Upload JSON file\u2026"), importError && /* @__PURE__ */ import_react5.default.createElement(import_material4.Typography, { color: "error", variant: "body2" }, importError)), importFile && /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, /* @__PURE__ */ import_react5.default.createElement(CheckSection, { label: "Providers", items: (importFile.providers ?? []).map((p) => p.name), selected: importProviders, onChange: setImportProviders, existsLabel: (key) => props.providers.some((p) => p.name === key) }), /* @__PURE__ */ import_react5.default.createElement(import_material4.Divider, { sx: { my: 1 } }), /* @__PURE__ */ import_react5.default.createElement(CheckSection, { label: "LLMs", items: (importFile.llms ?? []).map((l) => l.id), selected: importLlms, onChange: setImportLlms, existsLabel: (key) => props.config.llms.some((l) => l.id === key) }), /* @__PURE__ */ import_react5.default.createElement(import_material4.Divider, { sx: { my: 1 } }), /* @__PURE__ */ import_react5.default.createElement(CheckSection, { label: "Triggers", items: (importFile.triggers ?? []).map((t) => t.id), selected: importTriggers, onChange: setImportTriggers, existsLabel: (key) => props.config.triggers.some((t) => t.id === key) }), /* @__PURE__ */ import_react5.default.createElement(import_material4.Box, { sx: { mt: 2 } }, /* @__PURE__ */ import_react5.default.createElement(import_material4.Button, { variant: "contained", size: "small", onClick: handleImport, disabled: totalImport === 0 }, "Import selected")))))), /* @__PURE__ */ import_react5.default.createElement(import_material4.DialogActions, null, /* @__PURE__ */ import_react5.default.createElement(import_material4.Button, { onClick: () => props.onClose() }, "Close")));
758
+ };
759
+
760
+ // src/front/PinocchioPlayground.tsx
761
+ var import_react6 = __toESM(require_react(), 1);
762
+ var import_material5 = __toESM(require_material(), 1);
763
+ var import_icons_material5 = __toESM(require_icons_material(), 1);
764
+ var import_kwirth_common = __toESM(require_kwirth_common(), 1);
765
+ var import_kwirth_common_front3 = __toESM(require_kwirth_common_front(), 1);
766
+ var PinocchioPlayground = (props) => {
767
+ const initialLengthRef = (0, import_react6.useRef)(props.content.length);
768
+ const saved = props.pinocchioConfig.playground;
769
+ const [tab, setTab] = (0, import_react6.useState)(0);
770
+ const [llm, setLlm] = (0, import_react6.useState)(saved?.llm ?? "");
771
+ const [steps, setSteps] = (0, import_react6.useState)(saved?.steps ?? 5);
772
+ const [tools, setTools] = (0, import_react6.useState)(saved?.tools ?? []);
773
+ const [autoTools, setAutoTools] = (0, import_react6.useState)(saved?.autoTools ?? false);
774
+ const [toolFilter, setToolFilter] = (0, import_react6.useState)("");
775
+ const [promptType, setPromptType] = (0, import_react6.useState)(saved?.promptType ?? "jinja");
776
+ const [system, setSystem] = (0, import_react6.useState)(saved?.system ?? "");
777
+ const [prompt, setPrompt] = (0, import_react6.useState)(saved?.prompt ?? "");
778
+ const [eventData, setEventData] = (0, import_react6.useState)(saved?.eventData ?? "");
779
+ const [triggerType, setTriggerType] = (0, import_react6.useState)(saved?.triggerType ?? "business");
780
+ const [artifactKind, setArtifactKind] = (0, import_react6.useState)(saved?.artifactKind ?? "");
781
+ const [eventSpace, setEventSpace] = (0, import_react6.useState)(saved?.eventSpace ?? "launch");
782
+ const [eventType, setEventType] = (0, import_react6.useState)(saved?.eventType ?? "immediate");
783
+ const [systemHistory, setSystemHistory] = (0, import_react6.useState)(saved?.systemHistory ?? []);
784
+ const [promptHistory, setPromptHistory] = (0, import_react6.useState)(saved?.promptHistory ?? []);
785
+ const [artifactHistory, setArtifactHistory] = (0, import_react6.useState)(saved?.artifactHistory ?? []);
786
+ const [businessHistory, setBusinessHistory] = (0, import_react6.useState)(saved?.businessHistory ?? []);
787
+ const [spaceTypeHistory, setSpaceTypeHistory] = (0, import_react6.useState)(saved?.spaceTypeHistory ?? []);
788
+ const [historyAnchor, setHistoryAnchor] = (0, import_react6.useState)(null);
789
+ const [historyType, setHistoryType] = (0, import_react6.useState)("system");
790
+ const [configApplied, setConfigApplied] = (0, import_react6.useState)(false);
791
+ const [firing, setFiring] = (0, import_react6.useState)(false);
792
+ const [importedFromTriggerId, setImportedFromTriggerId] = (0, import_react6.useState)("");
793
+ const [showImportDialog, setShowImportDialog] = (0, import_react6.useState)(false);
794
+ const [pendingImportTriggerId, setPendingImportTriggerId] = (0, import_react6.useState)("");
795
+ const [pendingImportVersionId, setPendingImportVersionId] = (0, import_react6.useState)("");
796
+ const [showExportDialog, setShowExportDialog] = (0, import_react6.useState)(false);
797
+ const [exportMode, setExportMode] = (0, import_react6.useState)("new");
798
+ const [exportId, setExportId] = (0, import_react6.useState)("");
799
+ const [exportTargetTriggerId, setExportTargetTriggerId] = (0, import_react6.useState)("");
800
+ const [exportVersionId, setExportVersionId] = (0, import_react6.useState)("");
801
+ (0, import_kwirth_common_front3.useKeyboard)();
802
+ const newContent = props.content.slice(initialLengthRef.current);
803
+ const pushToHistory = (arr, value) => {
804
+ if (!value.trim()) return arr;
805
+ const filtered = arr.filter((v) => v !== value);
806
+ return [value, ...filtered].slice(0, 25);
807
+ };
808
+ const pushToSpaceTypeHistory = (arr, space, type) => {
809
+ if (!space.trim() && !type.trim()) return arr;
810
+ const filtered = arr.filter((v) => v.space !== space || v.type !== type);
811
+ return [{ space, type }, ...filtered].slice(0, 25);
812
+ };
813
+ const saveAndClose = (newTrigger) => {
814
+ const newSystemHistory = pushToHistory(systemHistory, system);
815
+ const newPromptHistory = pushToHistory(promptHistory, prompt);
816
+ const newArtifactHistory = triggerType === "artifact" ? pushToHistory(artifactHistory, eventData) : artifactHistory;
817
+ const newBusinessHistory = triggerType === "business" ? pushToHistory(businessHistory, eventData) : businessHistory;
818
+ const newSpaceTypeHistory = triggerType === "business" ? pushToSpaceTypeHistory(spaceTypeHistory, eventSpace, eventType) : spaceTypeHistory;
819
+ setSystemHistory(newSystemHistory);
820
+ setPromptHistory(newPromptHistory);
821
+ setArtifactHistory(newArtifactHistory);
822
+ setBusinessHistory(newBusinessHistory);
823
+ setSpaceTypeHistory(newSpaceTypeHistory);
824
+ props.onStateChange({ llm, steps, tools, autoTools, promptType, system, prompt, eventData, triggerType, artifactKind, eventSpace, eventType, systemHistory: newSystemHistory, promptHistory: newPromptHistory, artifactHistory: newArtifactHistory, businessHistory: newBusinessHistory, spaceTypeHistory: newSpaceTypeHistory });
825
+ props.onClose(newTrigger);
826
+ };
827
+ const openHistory = (e, type) => {
828
+ setHistoryType(type);
829
+ setHistoryAnchor(e.currentTarget);
830
+ };
831
+ const selectHistory = (value) => {
832
+ if (historyType === "system") setSystem(value);
833
+ else if (historyType === "prompt") {
834
+ setPrompt(value);
835
+ markDirty();
836
+ } else setEventData(value);
837
+ setHistoryAnchor(null);
838
+ };
839
+ const selectSpaceTypeHistory = (entry) => {
840
+ setEventSpace(entry.space);
841
+ setEventType(entry.type);
842
+ setHistoryAnchor(null);
843
+ };
844
+ const removeFromHistory = (index) => {
845
+ if (historyType === "system") setSystemHistory((h) => h.filter((_, i) => i !== index));
846
+ else if (historyType === "prompt") setPromptHistory((h) => h.filter((_, i) => i !== index));
847
+ else if (historyType === "artifact") setArtifactHistory((h) => h.filter((_, i) => i !== index));
848
+ else if (historyType === "business") setBusinessHistory((h) => h.filter((_, i) => i !== index));
849
+ else if (historyType === "spacetype") setSpaceTypeHistory((h) => h.filter((_, i) => i !== index));
850
+ };
851
+ const currentHistory = historyType === "system" ? systemHistory : historyType === "prompt" ? promptHistory : historyType === "artifact" ? artifactHistory : businessHistory;
852
+ const markDirty = () => setConfigApplied(false);
853
+ const onImportTriggerChange = (triggerId) => {
854
+ setPendingImportTriggerId(triggerId);
855
+ const t = props.pinocchioConfig.triggers.find((tr) => tr.id === triggerId);
856
+ const defaultVersion = t?.versions.find((v) => v.enabled) ?? t?.versions[0];
857
+ setPendingImportVersionId(defaultVersion?.id ?? "");
858
+ };
859
+ const confirmImportTrigger = () => {
860
+ const t = props.pinocchioConfig.triggers.find((tr) => tr.id === pendingImportTriggerId);
861
+ if (t) {
862
+ if (t.trigger === "artifact" || t.trigger === "business") setTriggerType(t.trigger);
863
+ if (t.trigger === "artifact") setArtifactKind(t.kind ?? "");
864
+ const v = t.versions.find((v2) => v2.id === pendingImportVersionId) ?? t.versions[0];
865
+ if (v) {
866
+ setLlm(v.llm);
867
+ setSteps(v.steps);
868
+ setTools(v.tools);
869
+ setAutoTools(v.autoTools ?? false);
870
+ setSystem(v.system);
871
+ setPrompt(v.prompt);
872
+ setPromptType(v.promptType);
873
+ markDirty();
874
+ }
875
+ setImportedFromTriggerId(pendingImportTriggerId);
876
+ }
877
+ setShowImportDialog(false);
878
+ setPendingImportTriggerId("");
879
+ setPendingImportVersionId("");
880
+ };
881
+ const openExportDialog = () => {
882
+ const hasSource = !!importedFromTriggerId;
883
+ setExportMode(hasSource ? "version" : "new");
884
+ setExportTargetTriggerId(importedFromTriggerId);
885
+ setExportId("");
886
+ setExportVersionId("");
887
+ setShowExportDialog(true);
888
+ };
889
+ const handleExportConfirm = () => {
890
+ if (exportMode === "new") {
891
+ const trigger = {
892
+ id: exportId.trim(),
893
+ trigger: triggerType,
894
+ versions: [{
895
+ id: "v1",
896
+ enabled: true,
897
+ llm,
898
+ steps,
899
+ tools,
900
+ autoTools,
901
+ system,
902
+ prompt,
903
+ promptType,
904
+ action: "inform",
905
+ spaces: ["launch.immediate"]
906
+ }]
907
+ };
908
+ setShowExportDialog(false);
909
+ saveAndClose(trigger);
910
+ } else {
911
+ const existing = props.pinocchioConfig.triggers.find((t) => t.id === exportTargetTriggerId);
912
+ if (!existing) return;
913
+ const updated = {
914
+ ...existing,
915
+ versions: [...existing.versions, {
916
+ id: exportVersionId.trim(),
917
+ enabled: false,
918
+ llm,
919
+ steps,
920
+ tools,
921
+ autoTools,
922
+ system,
923
+ prompt,
924
+ promptType,
925
+ action: "inform",
926
+ spaces: ["launch.immediate"]
927
+ }]
928
+ };
929
+ setShowExportDialog(false);
930
+ saveAndClose(updated);
931
+ }
932
+ };
933
+ const handleApply = () => {
934
+ const version = {
935
+ id: "playground",
936
+ enabled: true,
937
+ llm,
938
+ steps,
939
+ tools: autoTools ? props.toolsAvailable.map((t) => t.name) : tools,
940
+ autoTools,
941
+ system,
942
+ prompt,
943
+ promptType,
944
+ action: "inform",
945
+ spaces: ["launch.immediate"]
946
+ };
947
+ const msg = {
948
+ channel: "pinocchio",
949
+ msgtype: "pinocchiomessage",
950
+ id: "1",
951
+ accessKey: props.accessString,
952
+ instance: props.instanceId,
953
+ command: "playgroundset" /* PLAYGROUNDSET */,
954
+ action: import_kwirth_common.EInstanceMessageAction.COMMAND,
955
+ flow: import_kwirth_common.EInstanceMessageFlow.REQUEST,
956
+ type: import_kwirth_common.EInstanceMessageType.DATA,
957
+ data: version
958
+ };
959
+ props.webSocket.send(JSON.stringify(msg));
960
+ setConfigApplied(true);
961
+ };
962
+ const handleFire = async () => {
963
+ setFiring(true);
964
+ try {
965
+ await fetch(`${props.clusterUrl}/business`, {
966
+ method: "POST",
967
+ headers: {
968
+ "Content-Type": "application/json",
969
+ "Authorization": `Bearer ${props.accessString}`
970
+ },
971
+ body: JSON.stringify({
972
+ space: triggerType === "artifact" ? "launch" : eventSpace,
973
+ type: triggerType === "artifact" ? "immediate" : eventType,
974
+ data: eventData,
975
+ triggerType,
976
+ kind: artifactKind
977
+ })
978
+ });
979
+ } finally {
980
+ setFiring(false);
981
+ }
982
+ };
983
+ const onChangeTools = (e) => {
984
+ setTools(e.target.value);
985
+ markDirty();
986
+ };
987
+ const renderItem = (item, index) => {
988
+ if ("findings" in item) return null;
989
+ const msg = item;
990
+ return /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { key: index, variant: "body2", sx: { fontFamily: "monospace", whiteSpace: "pre-wrap", mb: 0.5 } }, /* @__PURE__ */ import_react6.default.createElement("span", { style: { color: "gray" } }, new Date(msg.timestamp).toLocaleTimeString(), " "), msg.text);
991
+ };
992
+ return /* @__PURE__ */ import_react6.default.createElement(import_material5.Dialog, { open: true, PaperProps: { sx: { width: "90vw", maxWidth: "1300px", height: "85vh" } } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.DialogTitle, { sx: { pb: 0 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Stack, { direction: "row", alignItems: "center", spacing: 1 }, /* @__PURE__ */ import_react6.default.createElement(import_icons_material5.ScienceOutlined, null), /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "h6" }, "Playground")), /* @__PURE__ */ import_react6.default.createElement(import_material5.Tabs, { value: tab, onChange: (_, v) => setTab(v), sx: { mt: 1 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Tab, { label: "LLM" }), /* @__PURE__ */ import_react6.default.createElement(import_material5.Tab, { label: "Call" }), /* @__PURE__ */ import_react6.default.createElement(import_material5.Tab, { label: `IN (${newContent.filter((item) => !("findings" in item || "report" in item) && item.role !== "llm").length})` }), /* @__PURE__ */ import_react6.default.createElement(import_material5.Tab, { label: `OUT (${newContent.filter((item) => "findings" in item || "report" in item || item.role === "llm").length})` }))), /* @__PURE__ */ import_react6.default.createElement(import_material5.DialogContent, { sx: { display: "flex", flexDirection: "column", pt: 2, overflow: "hidden" } }, tab === 0 && /* @__PURE__ */ import_react6.default.createElement(import_material5.Stack, { spacing: 2, sx: { height: "100%", display: "flex", flexDirection: "column", overflow: "hidden", px: 2, pt: 1 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Stack, { direction: "row", spacing: 2, alignItems: "flex-end", sx: { flex: "0 0 auto" } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.FormControl, { variant: "standard", sx: { minWidth: 160 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.InputLabel, null, "LLM"), /* @__PURE__ */ import_react6.default.createElement(import_material5.Select, { value: llm, onChange: (e) => {
993
+ setLlm(e.target.value);
994
+ markDirty();
995
+ } }, props.pinocchioConfig.llms.map((l) => /* @__PURE__ */ import_react6.default.createElement(import_material5.MenuItem, { key: l.id, value: l.id }, l.id)))), /* @__PURE__ */ import_react6.default.createElement(import_material5.TextField, { label: "Max steps", type: "number", variant: "standard", value: steps, onChange: (e) => {
996
+ setSteps(Math.max(1, +e.target.value));
997
+ markDirty();
998
+ }, sx: { width: 80 } }), /* @__PURE__ */ import_react6.default.createElement(import_material5.Box, { sx: { flex: 1 } }), /* @__PURE__ */ import_react6.default.createElement(import_material5.ToggleButtonGroup, { value: triggerType, exclusive: true, size: "small", onChange: (_, v) => {
999
+ if (v) setTriggerType(v);
1000
+ } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.ToggleButton, { value: "business" }, "Business"), /* @__PURE__ */ import_react6.default.createElement(import_material5.ToggleButton, { value: "artifact" }, "Artifact")), /* @__PURE__ */ import_react6.default.createElement(import_material5.Box, { sx: { width: 310, flexShrink: 0, display: "flex", alignItems: "flex-end", gap: 1 } }, triggerType === "artifact" ? /* @__PURE__ */ import_react6.default.createElement(import_material5.FormControl, { variant: "standard", fullWidth: true }, /* @__PURE__ */ import_react6.default.createElement(import_material5.InputLabel, { shrink: true }, "Artifact Kind"), /* @__PURE__ */ import_react6.default.createElement(import_material5.Select, { value: artifactKind, onChange: (e) => setArtifactKind(e.target.value) }, kindsAvailable.map((k) => /* @__PURE__ */ import_react6.default.createElement(import_material5.MenuItem, { key: k, value: k }, k)))) : /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, null, /* @__PURE__ */ import_react6.default.createElement(import_material5.TextField, { label: "Space", variant: "standard", size: "small", value: eventSpace, onChange: (e) => setEventSpace(e.target.value), sx: { width: 120 } }), /* @__PURE__ */ import_react6.default.createElement(import_material5.TextField, { label: "Type", variant: "standard", size: "small", value: eventType, onChange: (e) => setEventType(e.target.value), sx: { width: 120 } }), /* @__PURE__ */ import_react6.default.createElement(import_material5.IconButton, { size: "small", onClick: (e) => openHistory(e, "spacetype"), disabled: spaceTypeHistory.length === 0 }, /* @__PURE__ */ import_react6.default.createElement(import_icons_material5.HistoryOutlined, { sx: { fontSize: 14 } })))), /* @__PURE__ */ import_react6.default.createElement(import_material5.Button, { size: "small", startIcon: /* @__PURE__ */ import_react6.default.createElement(import_icons_material5.Upload, null), onClick: () => setShowImportDialog(true) }, "Import from trigger")), /* @__PURE__ */ import_react6.default.createElement(import_material5.Box, { sx: { flex: 1, display: "flex", flexDirection: "column", overflow: "hidden" } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Stack, { direction: "row", alignItems: "center", spacing: 0.5 }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "caption", color: "text.secondary" }, triggerType === "artifact" ? "Artifact JSON" : "Event JSON"), /* @__PURE__ */ import_react6.default.createElement(import_material5.IconButton, { size: "small", onClick: (e) => openHistory(e, triggerType), disabled: (triggerType === "artifact" ? artifactHistory : businessHistory).length === 0 }, /* @__PURE__ */ import_react6.default.createElement(import_icons_material5.HistoryOutlined, { sx: { fontSize: 14 } }))), /* @__PURE__ */ import_react6.default.createElement(
1001
+ "textarea",
1002
+ {
1003
+ value: eventData,
1004
+ onChange: (e) => setEventData(e.target.value),
1005
+ style: { flex: 1, resize: "none", boxSizing: "border-box", fontFamily: "monospace", fontSize: 13 },
1006
+ placeholder: "Enter the artifact or JSON payload\u2026"
1007
+ }
1008
+ ))), tab === 1 && /* @__PURE__ */ import_react6.default.createElement(import_material5.Stack, { spacing: 1, sx: { height: "100%", display: "flex", flexDirection: "column", overflow: "hidden", px: 2, pt: 1 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Stack, { direction: "row", alignItems: "flex-end", spacing: 1, sx: { flex: "0 0 auto" } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.FormControl, { variant: "standard", sx: { minWidth: 140 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.InputLabel, null, "Prompt type"), /* @__PURE__ */ import_react6.default.createElement(import_material5.Select, { value: promptType, onChange: (e) => {
1009
+ setPromptType(e.target.value);
1010
+ markDirty();
1011
+ } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.MenuItem, { value: "jinja" }, "jinja"), /* @__PURE__ */ import_react6.default.createElement(import_material5.MenuItem, { value: "artifact" }, "artifact"))), /* @__PURE__ */ import_react6.default.createElement(
1012
+ import_material5.FormControlLabel,
1013
+ {
1014
+ control: /* @__PURE__ */ import_react6.default.createElement(import_material5.Switch, { size: "small", checked: autoTools, onChange: (e) => {
1015
+ setAutoTools(e.target.checked);
1016
+ markDirty();
1017
+ } }),
1018
+ label: /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "caption" }, "Auto"),
1019
+ sx: { mr: 0, flexShrink: 0 }
1020
+ }
1021
+ ), /* @__PURE__ */ import_react6.default.createElement(import_material5.FormControl, { variant: "standard", disabled: autoTools, sx: { flex: 1 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.InputLabel, null, "Tools"), /* @__PURE__ */ import_react6.default.createElement(import_material5.Select, { multiple: true, value: tools, onChange: onChangeTools, renderValue: (sel) => autoTools ? `all (${props.toolsAvailable.length})` : sel.join(", ") }, /* @__PURE__ */ import_react6.default.createElement(import_material5.MenuItem, { disableRipple: true, onClickCapture: (e) => e.stopPropagation(), sx: { p: 0.5 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.TextField, { size: "small", placeholder: "Filter\u2026", value: toolFilter, onChange: (e) => setToolFilter(e.target.value), onKeyDown: (e) => e.stopPropagation(), fullWidth: true, variant: "outlined" })), props.toolsAvailable.filter((t) => !toolFilter || t.name.includes(toolFilter) || t.description.toLowerCase().includes(toolFilter.toLowerCase())).map((tool) => /* @__PURE__ */ import_react6.default.createElement(import_material5.MenuItem, { key: tool.name, value: tool.name }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Checkbox, { size: "small", checked: tools.includes(tool.name) }), /* @__PURE__ */ import_react6.default.createElement(import_material5.Box, null, /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "body2" }, tool.name), /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "caption", color: "text.secondary" }, tool.description))))))), /* @__PURE__ */ import_react6.default.createElement(import_material5.Box, { sx: { flex: 1, display: "flex", flexDirection: "column", minHeight: 0, gap: "8px" } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Box, { sx: { flex: 1, display: "flex", flexDirection: "column", minHeight: 0 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Stack, { direction: "row", alignItems: "center", spacing: 0.5, sx: { flexShrink: 0 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "caption", color: "text.secondary" }, "System"), /* @__PURE__ */ import_react6.default.createElement(import_material5.IconButton, { size: "small", onClick: (e) => openHistory(e, "system"), disabled: systemHistory.length === 0 }, /* @__PURE__ */ import_react6.default.createElement(import_icons_material5.HistoryOutlined, { sx: { fontSize: 14 } }))), /* @__PURE__ */ import_react6.default.createElement("textarea", { value: system, onChange: (e) => {
1022
+ setSystem(e.target.value);
1023
+ markDirty();
1024
+ }, style: { flex: 1, resize: "none", boxSizing: "border-box", fontFamily: "monospace", fontSize: 13, minHeight: 0 }, placeholder: "Enter system prompt\u2026" })), /* @__PURE__ */ import_react6.default.createElement(import_material5.Box, { sx: { flex: 1, display: "flex", flexDirection: "column", minHeight: 0 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Stack, { direction: "row", alignItems: "center", spacing: 0.5, sx: { flexShrink: 0 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "caption", color: "text.secondary" }, "Prompt"), /* @__PURE__ */ import_react6.default.createElement(import_material5.IconButton, { size: "small", onClick: (e) => openHistory(e, "prompt"), disabled: promptHistory.length === 0 }, /* @__PURE__ */ import_react6.default.createElement(import_icons_material5.HistoryOutlined, { sx: { fontSize: 14 } }))), /* @__PURE__ */ import_react6.default.createElement("textarea", { value: prompt, onChange: (e) => {
1025
+ setPrompt(e.target.value);
1026
+ markDirty();
1027
+ }, disabled: promptType === "artifact", style: { flex: 1, resize: "none", boxSizing: "border-box", fontFamily: "monospace", fontSize: 13, minHeight: 0 }, placeholder: "Enter the prompt template\u2026" }))), /* @__PURE__ */ import_react6.default.createElement(import_material5.Stack, { direction: "row", spacing: 1, sx: { flex: "0 0 auto", pt: 1 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Button, { size: "small", startIcon: /* @__PURE__ */ import_react6.default.createElement(import_icons_material5.FileDownload, null), onClick: openExportDialog }, "Export"), /* @__PURE__ */ import_react6.default.createElement(import_material5.Box, { sx: { flex: 1 } }), /* @__PURE__ */ import_react6.default.createElement(import_material5.Tooltip, { title: "Upload LLM, steps, tools and system to backend" }, /* @__PURE__ */ import_react6.default.createElement("span", null, /* @__PURE__ */ import_react6.default.createElement(import_material5.Button, { variant: configApplied ? "text" : "outlined", startIcon: configApplied ? /* @__PURE__ */ import_react6.default.createElement(import_icons_material5.CheckCircleOutline, { color: "success" }) : /* @__PURE__ */ import_react6.default.createElement(import_icons_material5.Upload, null), onClick: handleApply, disabled: !llm, color: configApplied ? "success" : "primary" }, configApplied ? "Config applied" : "Apply Config"))), /* @__PURE__ */ import_react6.default.createElement(import_material5.Tooltip, { title: !configApplied ? "Apply config first" : `Send ${triggerType} event to the backend` }, /* @__PURE__ */ import_react6.default.createElement("span", null, /* @__PURE__ */ import_react6.default.createElement(import_material5.Button, { variant: "contained", startIcon: /* @__PURE__ */ import_react6.default.createElement(import_icons_material5.Bolt, null), onClick: handleFire, disabled: !configApplied || firing }, firing ? "Firing\u2026" : "Fire"))))), tab === 2 && /* @__PURE__ */ import_react6.default.createElement(import_material5.Box, { sx: { flex: 1, overflowY: "auto", bgcolor: "action.hover", borderRadius: 1, p: 1, mx: 2, mt: 1 } }, newContent.filter((item) => !("findings" in item || "report" in item) && item.role !== "llm").length === 0 ? /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "body2", color: "text.disabled" }, "No input yet \u2014 fire an event first.") : newContent.filter((item) => !("findings" in item || "report" in item) && item.role !== "llm").map((item, i) => renderItem(item, i))), tab === 3 && /* @__PURE__ */ import_react6.default.createElement(import_material5.Box, { sx: { flex: 1, overflowY: "auto", bgcolor: "action.hover", borderRadius: 1, p: 1, mx: 2, mt: 1 } }, newContent.filter((item) => "findings" in item || "report" in item || item.role === "llm").length === 0 ? /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "body2", color: "text.disabled" }, "No results yet \u2014 apply config then fire.") : newContent.filter((item) => "findings" in item || "report" in item || item.role === "llm").map((item, i) => {
1028
+ if (item.role === "llm") {
1029
+ const msg = item;
1030
+ return /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { key: i, variant: "body2", sx: { fontFamily: "monospace", whiteSpace: "pre-wrap", mb: 0.5 } }, /* @__PURE__ */ import_react6.default.createElement("span", { style: { color: "gray" } }, new Date(msg.timestamp).toLocaleTimeString(), " "), msg.text);
1031
+ }
1032
+ const a = item;
1033
+ return /* @__PURE__ */ import_react6.default.createElement(import_material5.Box, { key: i, sx: { mb: 1, pb: 1, borderBottom: 1, borderColor: "divider" } }, a.text && /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "caption", color: "text.secondary" }, new Date(a.timestamp).toLocaleTimeString(), " ", a.text), (a.findings ?? []).map((f, fi) => /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { key: fi, variant: "body2", sx: { fontFamily: "monospace", fontSize: 12 } }, /* @__PURE__ */ import_react6.default.createElement("b", null, "[", f.level, "]"), " ", f.description)), a.report && /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "body2", color: "text.secondary", sx: { fontStyle: "italic", fontSize: 12 } }, "Report available"));
1034
+ }))), /* @__PURE__ */ import_react6.default.createElement(import_material5.DialogActions, null, /* @__PURE__ */ import_react6.default.createElement(import_material5.Box, { sx: { display: "flex", gap: 1 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Button, { variant: "contained", onClick: () => saveAndClose() }, "Save"), /* @__PURE__ */ import_react6.default.createElement(import_material5.Button, { onClick: () => props.onClose() }, "Cancel"))), /* @__PURE__ */ import_react6.default.createElement(import_material5.Menu, { anchorEl: historyAnchor, open: Boolean(historyAnchor), onClose: () => setHistoryAnchor(null), PaperProps: { sx: { maxHeight: 300, overflowY: "auto" } } }, historyType === "spacetype" ? spaceTypeHistory.map((entry, i) => /* @__PURE__ */ import_react6.default.createElement(import_material5.MenuItem, { key: i, onClick: () => selectSpaceTypeHistory(entry), sx: { display: "flex", gap: 1 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "body2", sx: { fontFamily: "monospace", fontSize: 12, flex: 1 } }, entry.space, " \xB7 ", entry.type), /* @__PURE__ */ import_react6.default.createElement(import_material5.IconButton, { size: "small", onClick: (e) => {
1035
+ e.stopPropagation();
1036
+ removeFromHistory(i);
1037
+ } }, /* @__PURE__ */ import_react6.default.createElement(import_icons_material5.DeleteOutlined, { sx: { fontSize: 14 } })))) : currentHistory.map((entry, i) => /* @__PURE__ */ import_react6.default.createElement(import_material5.MenuItem, { key: i, onClick: () => selectHistory(entry), sx: { maxWidth: 500, display: "flex", gap: 1 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "body2", noWrap: true, sx: { fontFamily: "monospace", fontSize: 12, flex: 1 } }, entry.length > 80 ? entry.slice(0, 80) + "\u2026" : entry), /* @__PURE__ */ import_react6.default.createElement(import_material5.IconButton, { size: "small", onClick: (e) => {
1038
+ e.stopPropagation();
1039
+ removeFromHistory(i);
1040
+ } }, /* @__PURE__ */ import_react6.default.createElement(import_icons_material5.DeleteOutlined, { sx: { fontSize: 14 } }))))), /* @__PURE__ */ import_react6.default.createElement(import_material5.Dialog, { open: showExportDialog, onClose: () => setShowExportDialog(false), PaperProps: { sx: { width: 420, height: 340 } } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.DialogTitle, null, "Export playground"), /* @__PURE__ */ import_react6.default.createElement(import_material5.DialogContent, { sx: { display: "flex", flexDirection: "column", gap: 3, pt: 1, px: 3, overflow: "hidden" } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.ToggleButtonGroup, { value: exportMode, exclusive: true, size: "small", onChange: (_, v) => {
1041
+ if (v) setExportMode(v);
1042
+ } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.ToggleButton, { value: "new" }, "New trigger"), /* @__PURE__ */ import_react6.default.createElement(import_material5.ToggleButton, { value: "version", disabled: props.pinocchioConfig.triggers.length === 0 }, "Add version")), /* @__PURE__ */ import_react6.default.createElement(import_material5.Box, { sx: { visibility: exportMode === "new" ? "visible" : "hidden", position: exportMode === "new" ? "static" : "absolute" } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.TextField, { label: "Trigger ID", variant: "standard", value: exportId, onChange: (e) => setExportId(e.target.value), fullWidth: true })), /* @__PURE__ */ import_react6.default.createElement(import_material5.Box, { sx: { visibility: exportMode === "version" ? "visible" : "hidden", position: exportMode === "version" ? "static" : "absolute", display: "flex", flexDirection: "column", gap: 2 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.FormControl, { variant: "standard", fullWidth: true }, /* @__PURE__ */ import_react6.default.createElement(import_material5.InputLabel, null, "Trigger"), /* @__PURE__ */ import_react6.default.createElement(import_material5.Select, { value: exportTargetTriggerId, onChange: (e) => {
1043
+ setExportTargetTriggerId(e.target.value);
1044
+ setExportVersionId("");
1045
+ } }, props.pinocchioConfig.triggers.map((t) => /* @__PURE__ */ import_react6.default.createElement(import_material5.MenuItem, { key: t.id, value: t.id }, t.id)))), (() => {
1046
+ const versionExists = !!exportVersionId.trim() && !!props.pinocchioConfig.triggers.find((t) => t.id === exportTargetTriggerId)?.versions.some((v) => v.id === exportVersionId.trim());
1047
+ return /* @__PURE__ */ import_react6.default.createElement(
1048
+ import_material5.TextField,
1049
+ {
1050
+ label: "Version ID",
1051
+ variant: "standard",
1052
+ value: exportVersionId,
1053
+ onChange: (e) => setExportVersionId(e.target.value),
1054
+ fullWidth: true,
1055
+ error: versionExists,
1056
+ helperText: versionExists ? "This version ID already exists in the selected trigger" : " "
1057
+ }
1058
+ );
1059
+ })())), /* @__PURE__ */ import_react6.default.createElement(import_material5.DialogActions, { sx: { px: 3, pb: 2 } }, (() => {
1060
+ const versionExists = exportMode === "version" && !!exportVersionId.trim() && !!props.pinocchioConfig.triggers.find((t) => t.id === exportTargetTriggerId)?.versions.some((v) => v.id === exportVersionId.trim());
1061
+ const disabled = exportMode === "new" ? !exportId.trim() : !exportTargetTriggerId || !exportVersionId.trim() || versionExists;
1062
+ return /* @__PURE__ */ import_react6.default.createElement(import_material5.Button, { variant: "contained", onClick: handleExportConfirm, disabled }, "Export");
1063
+ })(), /* @__PURE__ */ import_react6.default.createElement(import_material5.Button, { onClick: () => setShowExportDialog(false) }, "Cancel"))), /* @__PURE__ */ import_react6.default.createElement(import_material5.Dialog, { open: showImportDialog, onClose: () => {
1064
+ setShowImportDialog(false);
1065
+ setPendingImportTriggerId("");
1066
+ setPendingImportVersionId("");
1067
+ }, PaperProps: { sx: { width: 400, height: 340 } } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.DialogTitle, null, "Import from trigger"), /* @__PURE__ */ import_react6.default.createElement(import_material5.DialogContent, { sx: { display: "flex", flexDirection: "column", gap: 2, pt: 1, px: 3, overflow: "hidden" } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { variant: "body2", color: "warning.main" }, "This will overwrite the current playground configuration (LLM, steps, tools, system and prompt)."), /* @__PURE__ */ import_react6.default.createElement(import_material5.FormControl, { variant: "standard", fullWidth: true }, /* @__PURE__ */ import_react6.default.createElement(import_material5.InputLabel, { shrink: true }, "Trigger"), /* @__PURE__ */ import_react6.default.createElement(import_material5.Select, { value: pendingImportTriggerId, onChange: (e) => onImportTriggerChange(e.target.value), displayEmpty: true }, /* @__PURE__ */ import_react6.default.createElement(import_material5.MenuItem, { value: "" }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Typography, { color: "gray" }, /* @__PURE__ */ import_react6.default.createElement("em", null, "\u2014 select a trigger \u2014"))), props.pinocchioConfig.triggers.map((t) => /* @__PURE__ */ import_react6.default.createElement(import_material5.MenuItem, { key: t.id, value: t.id }, t.id)))), /* @__PURE__ */ import_react6.default.createElement(import_material5.FormControl, { variant: "standard", fullWidth: true, disabled: !pendingImportTriggerId }, /* @__PURE__ */ import_react6.default.createElement(import_material5.InputLabel, { shrink: true }, "Version"), /* @__PURE__ */ import_react6.default.createElement(import_material5.Select, { value: pendingImportVersionId, onChange: (e) => setPendingImportVersionId(e.target.value) }, (props.pinocchioConfig.triggers.find((t) => t.id === pendingImportTriggerId)?.versions ?? []).map((v) => /* @__PURE__ */ import_react6.default.createElement(import_material5.MenuItem, { key: v.id, value: v.id }, v.id, v.enabled ? " \u2713" : ""))))), /* @__PURE__ */ import_react6.default.createElement(import_material5.DialogActions, { sx: { px: 3, pb: 2 } }, /* @__PURE__ */ import_react6.default.createElement(import_material5.Button, { variant: "contained", onClick: confirmImportTrigger, disabled: !pendingImportTriggerId || !pendingImportVersionId }, "Import"), /* @__PURE__ */ import_react6.default.createElement(import_material5.Button, { onClick: () => {
1068
+ setShowImportDialog(false);
1069
+ setPendingImportTriggerId("");
1070
+ setPendingImportVersionId("");
1071
+ } }, "Cancel"))));
1072
+ };
1073
+
1074
+ // src/front/PinocchioTabContent.tsx
1075
+ var import_kwirth_common_front4 = __toESM(require_kwirth_common_front(), 1);
1076
+ var PinocchioTabContent = (props) => {
1077
+ let pinocchioData = props.channelObject.data;
1078
+ const pinocchioBoxRef = (0, import_react7.useRef)(null);
1079
+ const messagesEndRef = (0, import_react7.useRef)(null);
1080
+ const [isAtBottom, setIsAtBottom] = (0, import_react7.useState)(true);
1081
+ const [pinocchioBoxTop, setPinocchioBoxTop] = (0, import_react7.useState)(0);
1082
+ const [showPlayground, setShowPlayground] = (0, import_react7.useState)(false);
1083
+ const playgroundStartIndex = (0, import_react7.useRef)(null);
1084
+ const [showConfigTrigger, setShowConfigTrigger] = (0, import_react7.useState)(false);
1085
+ const [showConfigLlm, setShowConfigLlm] = (0, import_react7.useState)(false);
1086
+ const [showConfigProvider, setShowConfigProvider] = (0, import_react7.useState)(false);
1087
+ const [showImportExport, setShowImportExport] = (0, import_react7.useState)(false);
1088
+ const [anchorMenu, setAnchorMenu] = (0, import_react7.useState)(void 0);
1089
+ const [reportContent, setReportContent] = (0, import_react7.useState)(null);
1090
+ const [, forceUpdate] = (0, import_react7.useState)(0);
1091
+ const priorityOrder = {
1092
+ "critical": 0,
1093
+ "high": 1,
1094
+ "medium": 2,
1095
+ "low": 3
1096
+ };
1097
+ (0, import_react7.useEffect)(() => {
1098
+ if (pinocchioBoxRef.current) setPinocchioBoxTop(pinocchioBoxRef.current.getBoundingClientRect().top);
1099
+ });
1100
+ (0, import_react7.useEffect)(() => {
1101
+ if (isAtBottom && pinocchioBoxRef.current) {
1102
+ pinocchioBoxRef.current.scrollTo({
1103
+ top: pinocchioBoxRef.current.scrollHeight,
1104
+ behavior: "auto"
1105
+ });
1106
+ }
1107
+ }, [isAtBottom, pinocchioData.content.length]);
1108
+ (0, import_react7.useEffect)(() => {
1109
+ const timer = setTimeout(() => {
1110
+ if (messagesEndRef.current) {
1111
+ messagesEndRef.current.scrollIntoView({
1112
+ behavior: pinocchioData.content.length > 50 ? "auto" : "smooth",
1113
+ block: "end"
1114
+ });
1115
+ }
1116
+ }, 50);
1117
+ return () => clearTimeout(timer);
1118
+ }, [pinocchioData.content]);
1119
+ const color = (level) => {
1120
+ if (level === "low") return "gray";
1121
+ if (level === "medium") return "green";
1122
+ if (level === "high") return "orange";
1123
+ if (level === "critical") return "red";
1124
+ };
1125
+ const showContent = () => {
1126
+ if (!pinocchioData || !pinocchioData.content) return /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null);
1127
+ const visibleContent = (playgroundStartIndex.current !== null ? pinocchioData.content.slice(0, playgroundStartIndex.current) : pinocchioData.content).filter((item) => !item.playground);
1128
+ return /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, visibleContent.map((item, index) => {
1129
+ if (typeof item !== "string" && ("findings" in item || "report" in item)) {
1130
+ let analysis = item;
1131
+ return /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, { key: index }, analysis.text && /* @__PURE__ */ import_react8.default.createElement(import_material6.Stack, { direction: "row", alignItems: "center", sx: { mt: 2 } }, /* @__PURE__ */ import_react8.default.createElement(import_material6.Typography, { variant: "body1", sx: { flex: 1 } }, new Date(analysis.timestamp).toISOString(), " ", analysis.text), /* @__PURE__ */ import_react8.default.createElement(import_material6.Button, { size: "small", variant: "outlined", disabled: !analysis.report, onClick: () => setReportContent(analysis.report ?? null) }, "Report")), analysis.findings && [...analysis.findings].sort((a, b) => priorityOrder[a.level] - priorityOrder[b.level]).map((f, fIndex) => {
1132
+ let description = f.description;
1133
+ if (description.includes(" **") && description.includes("** ")) description = description.replace(" **", " <b><u>").replace("** ", "</u></b> ");
1134
+ return /* @__PURE__ */ import_react8.default.createElement(import_material6.Stack, { key: fIndex, direction: "row", alignItems: "center" }, /* @__PURE__ */ import_react8.default.createElement(import_material6.Box, { sx: { width: "70px" } }, /* @__PURE__ */ import_react8.default.createElement(import_material6.Typography, { variant: "body2", sx: { backgroundColor: color(f.level), display: "inline-block", p: 0.5, borderRadius: "4px" } }, f.level)), /* @__PURE__ */ import_react8.default.createElement(import_material6.Typography, { component: "div", variant: "body2" }, /* @__PURE__ */ import_react8.default.createElement("div", { dangerouslySetInnerHTML: { __html: description } })));
1135
+ }));
1136
+ } else {
1137
+ let message = item;
1138
+ return /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, { key: index }, /* @__PURE__ */ import_react8.default.createElement(import_material6.Typography, { variant: "body1", sx: { mt: 2 } }, new Date(message.timestamp).toISOString(), " ", message.text));
1139
+ }
1140
+ }), /* @__PURE__ */ import_react8.default.createElement("span", { ref: messagesEndRef, style: { float: "left", clear: "both" } }));
1141
+ };
1142
+ const pinocchioConfigClose = (config) => {
1143
+ if (config) {
1144
+ pinocchioData.config = config;
1145
+ let msg = {
1146
+ channel: "pinocchio",
1147
+ msgtype: "pinocchiomessage",
1148
+ id: "1",
1149
+ accessKey: props.channelObject.accessString,
1150
+ instance: props.channelObject.instanceId,
1151
+ command: "configset" /* CONFIGSET */,
1152
+ action: import_kwirth_common2.EInstanceMessageAction.COMMAND,
1153
+ flow: import_kwirth_common2.EInstanceMessageFlow.REQUEST,
1154
+ type: import_kwirth_common2.EInstanceMessageType.DATA,
1155
+ data: config
1156
+ };
1157
+ props.channelObject.webSocket?.send(JSON.stringify(msg));
1158
+ }
1159
+ setShowConfigTrigger(false);
1160
+ setShowConfigLlm(false);
1161
+ };
1162
+ const aiConfigLlmClose = (llms) => {
1163
+ if (llms) {
1164
+ const updated = { ...pinocchioData.config, llms };
1165
+ pinocchioData.config = updated;
1166
+ let msg = {
1167
+ channel: "pinocchio",
1168
+ msgtype: "pinocchiomessage",
1169
+ id: "1",
1170
+ accessKey: props.channelObject.accessString,
1171
+ instance: props.channelObject.instanceId,
1172
+ command: "configset" /* CONFIGSET */,
1173
+ action: import_kwirth_common2.EInstanceMessageAction.COMMAND,
1174
+ flow: import_kwirth_common2.EInstanceMessageFlow.REQUEST,
1175
+ type: import_kwirth_common2.EInstanceMessageType.DATA,
1176
+ data: updated
1177
+ };
1178
+ props.channelObject.webSocket?.send(JSON.stringify(msg));
1179
+ }
1180
+ setShowConfigLlm(false);
1181
+ };
1182
+ const pinocchioConfigProviderClose = (providers) => {
1183
+ if (providers) {
1184
+ pinocchioData.providers = providers;
1185
+ let msg = {
1186
+ channel: "pinocchio",
1187
+ msgtype: "pinocchiomessage",
1188
+ id: "1",
1189
+ accessKey: props.channelObject.accessString,
1190
+ instance: props.channelObject.instanceId,
1191
+ command: "providersset" /* PROVIDERSSET */,
1192
+ action: import_kwirth_common2.EInstanceMessageAction.COMMAND,
1193
+ flow: import_kwirth_common2.EInstanceMessageFlow.REQUEST,
1194
+ type: import_kwirth_common2.EInstanceMessageType.DATA,
1195
+ data: providers
1196
+ };
1197
+ props.channelObject.webSocket?.send(JSON.stringify(msg));
1198
+ }
1199
+ setShowConfigProvider(false);
1200
+ };
1201
+ const handleScroll = () => {
1202
+ if (pinocchioBoxRef.current) {
1203
+ const { scrollTop, scrollHeight, clientHeight } = pinocchioBoxRef.current;
1204
+ const distanceToBottom = scrollHeight - scrollTop - clientHeight;
1205
+ const atBottom = distanceToBottom < 25;
1206
+ setIsAtBottom(atBottom);
1207
+ }
1208
+ };
1209
+ const pinocchioPlaygroundStateChange = (state) => {
1210
+ const updatedConfig = { ...pinocchioData.config, playground: state };
1211
+ pinocchioData.config = updatedConfig;
1212
+ const msg = {
1213
+ channel: "pinocchio",
1214
+ msgtype: "pinocchiomessage",
1215
+ id: "1",
1216
+ accessKey: props.channelObject.accessString,
1217
+ instance: props.channelObject.instanceId,
1218
+ command: "configset" /* CONFIGSET */,
1219
+ action: import_kwirth_common2.EInstanceMessageAction.COMMAND,
1220
+ flow: import_kwirth_common2.EInstanceMessageFlow.REQUEST,
1221
+ type: import_kwirth_common2.EInstanceMessageType.DATA,
1222
+ data: updatedConfig
1223
+ };
1224
+ props.channelObject.webSocket?.send(JSON.stringify(msg));
1225
+ };
1226
+ const pinocchioPlaygroundClose = (newTrigger) => {
1227
+ if (playgroundStartIndex.current !== null) {
1228
+ pinocchioData.content = pinocchioData.content.slice(0, playgroundStartIndex.current);
1229
+ playgroundStartIndex.current = null;
1230
+ }
1231
+ setShowPlayground(false);
1232
+ if (!newTrigger) return;
1233
+ const updatedConfig = {
1234
+ ...pinocchioData.config,
1235
+ triggers: [...pinocchioData.config.triggers, newTrigger]
1236
+ };
1237
+ pinocchioData.config = updatedConfig;
1238
+ let msg = {
1239
+ channel: "pinocchio",
1240
+ msgtype: "pinocchiomessage",
1241
+ id: "1",
1242
+ accessKey: props.channelObject.accessString,
1243
+ instance: props.channelObject.instanceId,
1244
+ command: "configset" /* CONFIGSET */,
1245
+ action: import_kwirth_common2.EInstanceMessageAction.COMMAND,
1246
+ flow: import_kwirth_common2.EInstanceMessageFlow.REQUEST,
1247
+ type: import_kwirth_common2.EInstanceMessageType.DATA,
1248
+ data: updatedConfig
1249
+ };
1250
+ props.channelObject.webSocket?.send(JSON.stringify(msg));
1251
+ };
1252
+ const pinocchioImportExportClose = (providers, config) => {
1253
+ if (providers) {
1254
+ pinocchioData.providers = providers;
1255
+ let msg = {
1256
+ channel: "pinocchio",
1257
+ msgtype: "pinocchiomessage",
1258
+ id: "1",
1259
+ accessKey: props.channelObject.accessString,
1260
+ instance: props.channelObject.instanceId,
1261
+ command: "providersset" /* PROVIDERSSET */,
1262
+ action: import_kwirth_common2.EInstanceMessageAction.COMMAND,
1263
+ flow: import_kwirth_common2.EInstanceMessageFlow.REQUEST,
1264
+ type: import_kwirth_common2.EInstanceMessageType.DATA,
1265
+ data: providers
1266
+ };
1267
+ props.channelObject.webSocket?.send(JSON.stringify(msg));
1268
+ }
1269
+ if (config) {
1270
+ pinocchioData.config = config;
1271
+ let msg = {
1272
+ channel: "pinocchio",
1273
+ msgtype: "pinocchiomessage",
1274
+ id: "1",
1275
+ accessKey: props.channelObject.accessString,
1276
+ instance: props.channelObject.instanceId,
1277
+ command: "configset" /* CONFIGSET */,
1278
+ action: import_kwirth_common2.EInstanceMessageAction.COMMAND,
1279
+ flow: import_kwirth_common2.EInstanceMessageFlow.REQUEST,
1280
+ type: import_kwirth_common2.EInstanceMessageType.DATA,
1281
+ data: config
1282
+ };
1283
+ props.channelObject.webSocket?.send(JSON.stringify(msg));
1284
+ }
1285
+ setShowImportExport(false);
1286
+ };
1287
+ const onConfigAction = (a) => {
1288
+ setAnchorMenu(void 0);
1289
+ switch (a) {
1290
+ case "provider":
1291
+ setShowConfigProvider(true);
1292
+ break;
1293
+ case "llm":
1294
+ setShowConfigLlm(true);
1295
+ break;
1296
+ case "trigger":
1297
+ setShowConfigTrigger(true);
1298
+ break;
1299
+ case "importexport":
1300
+ setShowImportExport(true);
1301
+ break;
1302
+ }
1303
+ };
1304
+ return /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, pinocchioData.started && /* @__PURE__ */ import_react8.default.createElement(import_material6.Card, { sx: { display: "flex", flexDirection: "column", flex: 1, width: "98%", alignSelf: "center", marginTop: "8px", minHeight: 0 } }, /* @__PURE__ */ import_react8.default.createElement(import_material6.CardHeader, { title: /* @__PURE__ */ import_react8.default.createElement(import_material6.Stack, { direction: "row", alignItems: "center" }, /* @__PURE__ */ import_react8.default.createElement(import_material6.Typography, { marginRight: "32px" }, /* @__PURE__ */ import_react8.default.createElement("b", null, "Events:"), " ", pinocchioData.content.length), /* @__PURE__ */ import_react8.default.createElement(import_material6.Typography, { marginRight: "32px", flex: 1 }, /* @__PURE__ */ import_react8.default.createElement(import_icons_material6.Info, { fontSize: "small", sx: { marginBottom: "2px" } }), /* @__PURE__ */ import_react8.default.createElement("b", null, "\xA0Status:"), " ", pinocchioData.paused ? "paused" : pinocchioData.started ? "started" : "stopped"), /* @__PURE__ */ import_react8.default.createElement(import_material6.Button, { onClick: () => {
1305
+ pinocchioData.content = [{ timestamp: Date.now(), text: "Findings cleared" }];
1306
+ forceUpdate((n) => n + 1);
1307
+ } }, "Clear"), /* @__PURE__ */ import_react8.default.createElement(import_material6.Button, { onClick: () => {
1308
+ playgroundStartIndex.current = pinocchioData.content.length;
1309
+ setShowPlayground(true);
1310
+ } }, "Playground"), /* @__PURE__ */ import_react8.default.createElement(import_material6.Button, { onClick: (event) => {
1311
+ props.channelObject.webSocket?.send(JSON.stringify({ channel: "pinocchio", msgtype: "pinocchiomessage", id: "1", accessKey: props.channelObject.accessString, instance: props.channelObject.instanceId, command: "configget" /* CONFIGGET */, action: import_kwirth_common2.EInstanceMessageAction.COMMAND, flow: import_kwirth_common2.EInstanceMessageFlow.REQUEST, type: import_kwirth_common2.EInstanceMessageType.DATA }));
1312
+ setAnchorMenu(event.currentTarget);
1313
+ } }, "Config")) }), /* @__PURE__ */ import_react8.default.createElement(import_material6.CardContent, { sx: { flex: 1, display: "flex", flexDirection: "column", minHeight: 0, p: 0, "&:last-child": { pb: 0 } } }, /* @__PURE__ */ import_react8.default.createElement(import_material6.Box, { ref: pinocchioBoxRef, sx: { display: "flex", flexDirection: "column", width: "100%", overflowY: "auto", flexGrow: 1, height: `calc(100vh - ${pinocchioBoxTop}px - 16px)` }, onScroll: handleScroll }, /* @__PURE__ */ import_react8.default.createElement(import_material6.Box, { sx: { flex: 1, overflowY: "auto", ml: 1, mr: 1 } }, showContent())))), showConfigTrigger && /* @__PURE__ */ import_react8.default.createElement(PinocchioConfigTrigger, { pinocchioConfig: pinocchioData.config, toolsAvailable: pinocchioData.toolsAvailable.map((t) => t.name), onClose: pinocchioConfigClose }), showConfigLlm && /* @__PURE__ */ import_react8.default.createElement(import_front.AiConfigLlm, { llms: pinocchioData.config.llms, providers: pinocchioData.providers, onClose: aiConfigLlmClose }), showConfigProvider && /* @__PURE__ */ import_react8.default.createElement(import_front.AiConfigProvider, { providers: pinocchioData.providers, providersAvailable: pinocchioData.providersAvailable, onClose: pinocchioConfigProviderClose }), showPlayground && /* @__PURE__ */ import_react8.default.createElement(PinocchioPlayground, { pinocchioConfig: pinocchioData.config, toolsAvailable: pinocchioData.toolsAvailable, accessString: props.channelObject.accessString, instanceId: props.channelObject.instanceId, webSocket: props.channelObject.webSocket, clusterUrl: props.channelObject.clusterUrl, content: pinocchioData.content, onClose: pinocchioPlaygroundClose, onStateChange: pinocchioPlaygroundStateChange }), showImportExport && /* @__PURE__ */ import_react8.default.createElement(PinocchioImportExport, { providers: pinocchioData.providers, config: pinocchioData.config, onClose: pinocchioImportExportClose }), anchorMenu && /* @__PURE__ */ import_react8.default.createElement(MenuConfig, { anchorParent: anchorMenu, providers: pinocchioData.providers, pinocchioConfig: pinocchioData.config, onAction: onConfigAction, onClose: () => setAnchorMenu(void 0) }), reportContent !== null && /* @__PURE__ */ import_react8.default.createElement(import_material6.Dialog, { open: true, onClose: () => setReportContent(null), PaperProps: { sx: { width: "60vw", maxWidth: "900px", maxHeight: "70vh" } } }, /* @__PURE__ */ import_react8.default.createElement(import_material6.DialogTitle, null, "Report"), /* @__PURE__ */ import_react8.default.createElement(import_material6.DialogContent, { sx: { pt: 2, px: 3, pb: 1 } }, /* @__PURE__ */ import_react8.default.createElement(import_kwirth_common_front4.MarkdownViewer, { content: reportContent })), /* @__PURE__ */ import_react8.default.createElement(import_material6.DialogActions, null, /* @__PURE__ */ import_react8.default.createElement(import_material6.Button, { onClick: () => setReportContent(null) }, "Close"))));
1314
+ };
1315
+
1316
+ // src/front/PinocchioChannel.ts
1317
+ var PinocchioChannel = class {
1318
+ constructor() {
1319
+ this.channelId = "pinocchio";
1320
+ this.setupVisible = false;
1321
+ this.SetupDialog = PinocchioSetup;
1322
+ this.TabContent = PinocchioTabContent;
1323
+ this.requirements = {
1324
+ accessString: true,
1325
+ clusterUrl: true,
1326
+ clusterInfo: false,
1327
+ exit: false,
1328
+ frontChannels: false,
1329
+ metrics: false,
1330
+ notifier: true,
1331
+ notifications: false,
1332
+ setup: false,
1333
+ settings: false,
1334
+ palette: false,
1335
+ userSettings: false,
1336
+ webSocket: true
1337
+ };
1338
+ }
1339
+ getScope() {
1340
+ return import_kwirth_common3.EInstanceConfigScope.NONE;
1341
+ }
1342
+ getChannelIcon() {
1343
+ return PinocchioIcon;
1344
+ }
1345
+ getSetupVisibility() {
1346
+ return this.setupVisible;
1347
+ }
1348
+ setSetupVisibility(visibility) {
1349
+ this.setupVisible = visibility;
1350
+ }
1351
+ processChannelMessage(channelObject, wsEvent) {
1352
+ let msg = JSON.parse(wsEvent.data);
1353
+ let pinocchioData = channelObject.data;
1354
+ switch (msg.type) {
1355
+ case import_kwirth_common3.EInstanceMessageType.DATA:
1356
+ if (msg.analysis) pinocchioData.content.push(msg.analysis);
1357
+ else if (msg.config) pinocchioData.config = msg.config;
1358
+ else if (msg.providers) pinocchioData.providers = msg.providers;
1359
+ else if (msg.providersAvailable) pinocchioData.providersAvailable = msg.providersAvailable;
1360
+ else if (msg.toolsAvailable) pinocchioData.toolsAvailable = msg.toolsAvailable;
1361
+ else if (msg.message) pinocchioData.content.push(msg.message);
1362
+ return {
1363
+ action: import_kwirth_common3.EChannelRefreshAction.REFRESH
1364
+ };
1365
+ case import_kwirth_common3.EInstanceMessageType.SIGNAL:
1366
+ let signalMessage = JSON.parse(wsEvent.data);
1367
+ if (signalMessage.flow === import_kwirth_common3.EInstanceMessageFlow.RESPONSE && signalMessage.action === import_kwirth_common3.EInstanceMessageAction.START) {
1368
+ channelObject.instanceId = signalMessage.instance;
1369
+ let msgProvidersAvailable = {
1370
+ channel: "pinocchio",
1371
+ msgtype: "pinocchiomessage",
1372
+ action: import_kwirth_common3.EInstanceMessageAction.COMMAND,
1373
+ flow: import_kwirth_common3.EInstanceMessageFlow.REQUEST,
1374
+ type: import_kwirth_common3.EInstanceMessageType.DATA,
1375
+ command: "providersavailable" /* PROVIDERSAVAILABLE */,
1376
+ accessKey: channelObject.accessString,
1377
+ instance: signalMessage.instance,
1378
+ id: "1"
1379
+ };
1380
+ channelObject.webSocket?.send(JSON.stringify(msgProvidersAvailable));
1381
+ let msgToolsAvailable = {
1382
+ channel: "pinocchio",
1383
+ msgtype: "pinocchiomessage",
1384
+ action: import_kwirth_common3.EInstanceMessageAction.COMMAND,
1385
+ flow: import_kwirth_common3.EInstanceMessageFlow.REQUEST,
1386
+ type: import_kwirth_common3.EInstanceMessageType.DATA,
1387
+ command: "toolsavailable" /* TOOLSAVAILABLE */,
1388
+ accessKey: channelObject.accessString,
1389
+ instance: signalMessage.instance,
1390
+ id: "1"
1391
+ };
1392
+ channelObject.webSocket?.send(JSON.stringify(msgToolsAvailable));
1393
+ let msgProviders = {
1394
+ channel: "pinocchio",
1395
+ msgtype: "pinocchiomessage",
1396
+ action: import_kwirth_common3.EInstanceMessageAction.COMMAND,
1397
+ flow: import_kwirth_common3.EInstanceMessageFlow.REQUEST,
1398
+ type: import_kwirth_common3.EInstanceMessageType.DATA,
1399
+ command: "providersget" /* PROVIDERSGET */,
1400
+ accessKey: channelObject.accessString,
1401
+ instance: signalMessage.instance,
1402
+ id: "1"
1403
+ };
1404
+ channelObject.webSocket?.send(JSON.stringify(msgProviders));
1405
+ let msgConfig = {
1406
+ channel: "pinocchio",
1407
+ msgtype: "pinocchiomessage",
1408
+ action: import_kwirth_common3.EInstanceMessageAction.COMMAND,
1409
+ flow: import_kwirth_common3.EInstanceMessageFlow.REQUEST,
1410
+ type: import_kwirth_common3.EInstanceMessageType.DATA,
1411
+ command: "configget" /* CONFIGGET */,
1412
+ accessKey: channelObject.accessString,
1413
+ instance: signalMessage.instance,
1414
+ id: "1"
1415
+ };
1416
+ channelObject.webSocket?.send(JSON.stringify(msgConfig));
1417
+ } else {
1418
+ channelObject.notify?.(this.channelId, signalMessage.level, signalMessage.text || signalMessage.data);
1419
+ }
1420
+ return {
1421
+ action: import_kwirth_common3.EChannelRefreshAction.REFRESH
1422
+ };
1423
+ default:
1424
+ console.log(`Invalid message type ${msg.type}`);
1425
+ return {
1426
+ action: import_kwirth_common3.EChannelRefreshAction.NONE
1427
+ };
1428
+ }
1429
+ }
1430
+ async initChannel(channelObject) {
1431
+ channelObject.instanceConfig = new PinocchioInstanceConfig();
1432
+ channelObject.config = new PinocchioConfig();
1433
+ channelObject.data = new PinocchioData();
1434
+ let pinocchioObject = channelObject.data;
1435
+ pinocchioObject.content = [];
1436
+ return false;
1437
+ }
1438
+ prepareExternalChannel(_contentView, _selectedFiles, _container) {
1439
+ return {
1440
+ data: new PinocchioData(),
1441
+ config: new PinocchioConfig(),
1442
+ instanceConfig: new PinocchioInstanceConfig(),
1443
+ formConfig: {}
1444
+ };
1445
+ }
1446
+ startChannel(channelObject) {
1447
+ let pinocchioObject = channelObject.data;
1448
+ pinocchioObject.content.push({ timestamp: Date.now(), text: "Local start pinocchio channel" });
1449
+ pinocchioObject.paused = false;
1450
+ pinocchioObject.started = true;
1451
+ return true;
1452
+ }
1453
+ pauseChannel(channelObject) {
1454
+ let pinocchioObject = channelObject.data;
1455
+ pinocchioObject.paused = true;
1456
+ return true;
1457
+ }
1458
+ continueChannel(channelObject) {
1459
+ let pinocchioObject = channelObject.data;
1460
+ pinocchioObject.paused = false;
1461
+ return true;
1462
+ }
1463
+ stopChannel(channelObject) {
1464
+ let pinocchioObject = channelObject.data;
1465
+ pinocchioObject.paused = false;
1466
+ pinocchioObject.started = false;
1467
+ return true;
1468
+ }
1469
+ socketDisconnected(channelObject) {
1470
+ return false;
1471
+ }
1472
+ socketReconnect(channelObject) {
1473
+ return false;
1474
+ }
1475
+ };
1476
+
1477
+ // src/front/index.ts
1478
+ if (!window.__kwirth_plugins__) window.__kwirth_plugins__ = {};
1479
+ window.__kwirth_plugins__["pinocchio"] = PinocchioChannel;
1480
+ })();