@loopstack/loopstack-studio 0.36.0 → 0.38.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 (30) hide show
  1. package/dist/features/documents/DocumentRenderer.js +46 -44
  2. package/dist/features/documents/renderers/DocumentMessageRenderer.js +23 -9
  3. package/dist/features/documents/renderers/LlmMessage.js +90 -50
  4. package/dist/features/documents/renderers/TerminalMessageRenderer.js +51 -0
  5. package/dist/features/documents/renderers/ansi.js +77 -0
  6. package/dist/features/file-explorer/components/FileExplorerPanel.js +66 -73
  7. package/dist/features/file-explorer/hooks/useFileExplorer.js +29 -25
  8. package/dist/features/file-explorer/providers/FileExplorerProvider.js +53 -53
  9. package/dist/features/git/components/WorkbenchGitPanel.js +36 -33
  10. package/dist/features/git/hooks/useGit.js +36 -33
  11. package/dist/features/run-view/RunView.js +1 -1
  12. package/dist/features/workbench/components/EnvironmentSelector.js +46 -0
  13. package/dist/features/workbench/components/WorkbenchPreviewPanel.js +1 -1
  14. package/dist/features/workbench/providers/WorkbenchLayoutProvider.js +64 -55
  15. package/dist/hooks/useEnvironments.js +25 -31
  16. package/dist/node_modules/es-toolkit/dist/_internal/globalThis.js +1 -1
  17. package/dist/node_modules/es-toolkit/dist/compat/object/clone.js +2 -2
  18. package/dist/node_modules/es-toolkit/dist/compat/object/cloneDeepWith.js +11 -11
  19. package/dist/node_modules/es-toolkit/dist/compat/object/mergeWith.js +8 -8
  20. package/dist/node_modules/es-toolkit/dist/compat/predicate/isEmpty.js +3 -3
  21. package/dist/node_modules/es-toolkit/dist/object/clone.js +2 -7
  22. package/dist/node_modules/es-toolkit/dist/object/cloneDeepWith.js +65 -65
  23. package/dist/packages/client/dist/queries/query-keys.js +5 -0
  24. package/dist/packages/client/dist/stream/invalidations.js +1 -0
  25. package/dist/packages/contracts/dist/events/client-message.schema.js +2 -1
  26. package/dist/packages/contracts/dist/events/index.js +1 -1
  27. package/dist/packages/contracts/dist/events/workspace-events.schema.js +2 -2
  28. package/dist/packages/contracts/dist/types/types/ui-message.type.js +15 -2
  29. package/package.json +4 -4
  30. /package/dist/features/run-view/{transcript.js → transcript-model.js} +0 -0
@@ -0,0 +1,46 @@
1
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../../../components/ui/select.js";
2
+ import { useWorkbenchLayout } from "../providers/WorkbenchLayoutProvider.js";
3
+ import { c } from "react/compiler-runtime";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ function EnvironmentSelector() {
6
+ let u = c(11), { environments: d, selectedSlotId: f, setSelectedSlotId: p } = useWorkbenchLayout(), m;
7
+ u[0] === d ? m = u[1] : (m = d ?? [], u[0] = d, u[1] = m);
8
+ let h = m;
9
+ if (h.length <= 1) return null;
10
+ let g;
11
+ u[2] === Symbol.for("react.memo_cache_sentinel") ? (g = /* @__PURE__ */ jsx(SelectTrigger, {
12
+ className: "h-7 text-xs",
13
+ children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "Select environment" })
14
+ }), u[2] = g) : g = u[2];
15
+ let _;
16
+ u[3] === h ? _ = u[4] : (_ = h.map(_temp), u[3] = h, u[4] = _);
17
+ let v;
18
+ u[5] === _ ? v = u[6] : (v = /* @__PURE__ */ jsx(SelectContent, { children: _ }), u[5] = _, u[6] = v);
19
+ let y;
20
+ return u[7] !== f || u[8] !== p || u[9] !== v ? (y = /* @__PURE__ */ jsx("div", {
21
+ className: "border-b px-3 py-2",
22
+ children: /* @__PURE__ */ jsxs(Select, {
23
+ value: f,
24
+ onValueChange: p,
25
+ children: [g, v]
26
+ })
27
+ }), u[7] = f, u[8] = p, u[9] = v, u[10] = y) : y = u[10], y;
28
+ }
29
+ function _temp(e) {
30
+ return /* @__PURE__ */ jsx(SelectItem, {
31
+ value: e.slotId,
32
+ className: "text-xs",
33
+ children: /* @__PURE__ */ jsxs("span", {
34
+ className: "flex items-center gap-2",
35
+ children: [
36
+ /* @__PURE__ */ jsx("span", { className: `h-1.5 w-1.5 rounded-full ${e.status === "running" ? "bg-green-500" : "bg-muted-foreground/40"}` }),
37
+ e.envName || e.slotId,
38
+ e.status !== "running" && /* @__PURE__ */ jsx("span", {
39
+ className: "text-muted-foreground",
40
+ children: "(stopped)"
41
+ })
42
+ ]
43
+ })
44
+ }, e.slotId);
45
+ }
46
+ export { EnvironmentSelector };
@@ -136,6 +136,6 @@ function _temp2(e) {
136
136
  }, e.slotId);
137
137
  }
138
138
  function _temp(e) {
139
- return !!e.connectionUrl && (!!e.workerId || e.local);
139
+ return !!e.connectionUrl && (!!e.workerId || e.local) && e.status === "running";
140
140
  }
141
141
  export { WorkbenchPreviewPanel };
@@ -1,73 +1,82 @@
1
1
  import { useWorkspaceEnvironments } from "../../../hooks/useEnvironments.js";
2
2
  import { useOptionalStudioPreferences } from "../../../providers/StudioPreferencesProvider.js";
3
3
  import { c } from "react/compiler-runtime";
4
- import { createContext, useCallback, useContext, useMemo, useState } from "react";
4
+ import { createContext, useCallback, useContext, useEffect, useMemo, useState } from "react";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  var WorkbenchLayoutContext = createContext(null);
7
- function WorkbenchLayoutProvider(s) {
8
- let l = c(35), { children: u, workspaceId: d, workflow: f, getPreviewUrl: p, getEnvironmentPreviewUrl: m } = s, h = useOptionalStudioPreferences(), { data: g } = useWorkspaceEnvironments(d), [_, v] = useState(null), y;
9
- l[0] === Symbol.for("react.memo_cache_sentinel") ? (y = {}, l[0] = y) : y = l[0];
10
- let [b, x] = useState(y), S = h ? h.preferences.activePanel : _, C = h ? h.preferences.panelSizes : b, [w, T] = useState(null), [E, D] = useState(""), O;
11
- l[1] === g ? O = l[2] : (O = g === void 0 || g.some(_temp), l[1] = g, l[2] = O);
12
- let k = O, A;
13
- l[3] === Symbol.for("react.memo_cache_sentinel") ? (A = {
7
+ function WorkbenchLayoutProvider(u) {
8
+ let d = c(39), { children: f, workspaceId: p, workflow: m, getPreviewUrl: h, getEnvironmentPreviewUrl: g } = u, _ = useOptionalStudioPreferences(), { data: v } = useWorkspaceEnvironments(p), [y, b] = useState(null), x;
9
+ d[0] === Symbol.for("react.memo_cache_sentinel") ? (x = {}, d[0] = x) : x = d[0];
10
+ let [S, C] = useState(x), w = _ ? _.preferences.activePanel : y, T = _ ? _.preferences.panelSizes : S, [E, D] = useState(null), [O, k] = useState(""), A, j;
11
+ d[1] !== v || d[2] !== O ? (A = () => {
12
+ if (!v?.length) return;
13
+ let e = v.find((e) => e.slotId === O);
14
+ e?.status !== "running" && k((v.find(_temp) ?? e ?? v[0]).slotId);
15
+ }, j = [v, O], d[1] = v, d[2] = O, d[3] = A, d[4] = j) : (A = d[3], j = d[4]), useEffect(A, j);
16
+ let M;
17
+ d[5] === v ? M = d[6] : (M = v === void 0 || v.some(_temp2), d[5] = v, d[6] = M);
18
+ let N = M, P;
19
+ d[7] === Symbol.for("react.memo_cache_sentinel") ? (P = {
14
20
  runs: "medium",
15
21
  preview: "medium",
16
22
  files: "medium",
17
23
  environment: "small"
18
- }, l[3] = A) : A = l[3];
19
- let j = A, M = S ? C[S] ?? j[S] ?? "small" : "small", N;
20
- l[4] === h ? N = l[5] : (N = (e) => {
21
- h ? h.setPreference("activePanel", e) : v(e);
22
- }, l[4] = h, l[5] = N);
23
- let P = N, F;
24
- l[6] !== S || l[7] !== P ? (F = (e) => {
25
- P(S === e ? null : e);
26
- }, l[6] = S, l[7] = P, l[8] = F) : F = l[8];
27
- let I = F, L;
28
- l[9] === P ? L = l[10] : (L = () => {
29
- P(null);
30
- }, l[9] = P, l[10] = L);
24
+ }, d[7] = P) : P = d[7];
25
+ let F = P, I = w ? T[w] ?? F[w] ?? "small" : "small", L;
26
+ d[8] === _ ? L = d[9] : (L = (e) => {
27
+ _ ? _.setPreference("activePanel", e) : b(e);
28
+ }, d[8] = _, d[9] = L);
31
29
  let R = L, z;
32
- l[11] !== S || l[12] !== C || l[13] !== h ? (z = (e) => {
33
- if (!S) return;
34
- let o = {
35
- ...C,
36
- [S]: e
37
- };
38
- h ? h.setPreference("panelSizes", o) : x(o);
39
- }, l[11] = S, l[12] = C, l[13] = h, l[14] = z) : z = l[14];
30
+ d[10] !== w || d[11] !== R ? (z = (e) => {
31
+ R(w === e ? null : e);
32
+ }, d[10] = w, d[11] = R, d[12] = z) : z = d[12];
40
33
  let B = z, V;
41
- l[15] === P ? V = l[16] : (V = (e) => {
42
- D(e), P("preview");
43
- }, l[15] = P, l[16] = V);
34
+ d[13] === R ? V = d[14] : (V = () => {
35
+ R(null);
36
+ }, d[13] = R, d[14] = V);
44
37
  let H = V, U;
45
- l[17] !== S || l[18] !== w || l[19] !== R || l[20] !== g || l[21] !== m || l[22] !== p || l[23] !== H || l[24] !== M || l[25] !== k || l[26] !== E || l[27] !== B || l[28] !== I || l[29] !== f || l[30] !== d ? (U = {
46
- workspaceId: d,
47
- workflow: f,
48
- previewPanelEnabled: k,
49
- getPreviewUrl: p,
50
- getEnvironmentPreviewUrl: m,
51
- environments: g,
52
- activePanel: S,
53
- panelSize: M,
54
- togglePanel: I,
55
- closePanel: R,
56
- setPanelSize: B,
57
- selectedSlotId: E,
58
- setSelectedSlotId: D,
59
- openPreviewWithEnvironment: H,
60
- activeSectionId: w,
61
- setActiveSectionId: T
62
- }, l[17] = S, l[18] = w, l[19] = R, l[20] = g, l[21] = m, l[22] = p, l[23] = H, l[24] = M, l[25] = k, l[26] = E, l[27] = B, l[28] = I, l[29] = f, l[30] = d, l[31] = U) : U = l[31];
38
+ d[15] !== w || d[16] !== T || d[17] !== _ ? (U = (e) => {
39
+ if (!w) return;
40
+ let l = {
41
+ ...T,
42
+ [w]: e
43
+ };
44
+ _ ? _.setPreference("panelSizes", l) : C(l);
45
+ }, d[15] = w, d[16] = T, d[17] = _, d[18] = U) : U = d[18];
63
46
  let W = U, G;
64
- return l[32] !== u || l[33] !== W ? (G = /* @__PURE__ */ jsx(WorkbenchLayoutContext.Provider, {
65
- value: W,
66
- children: u
67
- }), l[32] = u, l[33] = W, l[34] = G) : G = l[34], G;
47
+ d[19] === R ? G = d[20] : (G = (e) => {
48
+ k(e), R("preview");
49
+ }, d[19] = R, d[20] = G);
50
+ let K = G, q;
51
+ d[21] !== w || d[22] !== E || d[23] !== H || d[24] !== v || d[25] !== g || d[26] !== h || d[27] !== K || d[28] !== I || d[29] !== N || d[30] !== O || d[31] !== W || d[32] !== B || d[33] !== m || d[34] !== p ? (q = {
52
+ workspaceId: p,
53
+ workflow: m,
54
+ previewPanelEnabled: N,
55
+ getPreviewUrl: h,
56
+ getEnvironmentPreviewUrl: g,
57
+ environments: v,
58
+ activePanel: w,
59
+ panelSize: I,
60
+ togglePanel: B,
61
+ closePanel: H,
62
+ setPanelSize: W,
63
+ selectedSlotId: O,
64
+ setSelectedSlotId: k,
65
+ openPreviewWithEnvironment: K,
66
+ activeSectionId: E,
67
+ setActiveSectionId: D
68
+ }, d[21] = w, d[22] = E, d[23] = H, d[24] = v, d[25] = g, d[26] = h, d[27] = K, d[28] = I, d[29] = N, d[30] = O, d[31] = W, d[32] = B, d[33] = m, d[34] = p, d[35] = q) : q = d[35];
69
+ let J = q, Y;
70
+ return d[36] !== f || d[37] !== J ? (Y = /* @__PURE__ */ jsx(WorkbenchLayoutContext.Provider, {
71
+ value: J,
72
+ children: f
73
+ }), d[36] = f, d[37] = J, d[38] = Y) : Y = d[38], Y;
74
+ }
75
+ function _temp2(e) {
76
+ return !!e.connectionUrl && (!!e.workerId || e.local) && e.status === "running";
68
77
  }
69
78
  function _temp(e) {
70
- return !!e.connectionUrl && (!!e.workerId || e.local);
79
+ return e.status === "running";
71
80
  }
72
81
  function useWorkbenchLayout() {
73
82
  let e = useContext(WorkbenchLayoutContext);
@@ -1,43 +1,37 @@
1
1
  import { useLoopstackClient } from "../packages/react/dist/provider.js";
2
+ import { queryKeys } from "../packages/client/dist/queries/query-keys.js";
3
+ import "../packages/client/dist/index.js";
2
4
  import "../packages/react/dist/index.js";
3
5
  import { c } from "react/compiler-runtime";
4
6
  import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
5
7
  var environmentsPath = (e) => `/api/v1/workspaces/${e}/environments`;
6
- function useWorkspaceEnvironments(r) {
7
- let a = c(10), o = useLoopstackClient(), s;
8
- a[0] !== o.envKey || a[1] !== r ? (s = [
9
- "workspace-environments",
10
- o.envKey,
11
- r
12
- ], a[0] = o.envKey, a[1] = r, a[2] = s) : s = a[2];
13
- let l;
14
- a[3] !== o.http || a[4] !== r ? (l = () => o.http.get(environmentsPath(r)), a[3] = o.http, a[4] = r, a[5] = l) : l = a[5];
15
- let u = !!r, d;
16
- return a[6] !== s || a[7] !== l || a[8] !== u ? (d = {
17
- queryKey: s,
18
- queryFn: l,
19
- enabled: u
20
- }, a[6] = s, a[7] = l, a[8] = u, a[9] = d) : d = a[9], useQuery(d);
8
+ function useWorkspaceEnvironments(i) {
9
+ let o = c(10), s = useLoopstackClient(), l;
10
+ o[0] !== s.envKey || o[1] !== i ? (l = queryKeys.environments(s.envKey, i), o[0] = s.envKey, o[1] = i, o[2] = l) : l = o[2];
11
+ let u;
12
+ o[3] !== s.http || o[4] !== i ? (u = () => s.http.get(environmentsPath(i)), o[3] = s.http, o[4] = i, o[5] = u) : u = o[5];
13
+ let d = !!i, f;
14
+ return o[6] !== l || o[7] !== u || o[8] !== d ? (f = {
15
+ queryKey: l,
16
+ queryFn: u,
17
+ enabled: d
18
+ }, o[6] = l, o[7] = u, o[8] = d, o[9] = f) : f = o[9], useQuery(f);
21
19
  }
22
20
  function useReplaceEnvironments() {
23
- let i = c(8), o = useLoopstackClient(), s = useQueryClient(), l;
24
- i[0] === o ? l = i[1] : (l = (e) => o.http.put(environmentsPath(e.workspaceId), e.environments), i[0] = o, i[1] = l);
25
- let u;
26
- i[2] !== o || i[3] !== s ? (u = (e, n) => {
27
- s.invalidateQueries({ queryKey: [
28
- "workspace-environments",
29
- o.envKey,
30
- n.workspaceId
31
- ] });
32
- }, i[2] = o, i[3] = s, i[4] = u) : u = i[4];
21
+ let a = c(8), s = useLoopstackClient(), l = useQueryClient(), u;
22
+ a[0] === s ? u = a[1] : (u = (e) => s.http.put(environmentsPath(e.workspaceId), e.environments), a[0] = s, a[1] = u);
33
23
  let d;
34
- return i[5] !== l || i[6] !== u ? (d = {
35
- mutationFn: l,
36
- onSuccess: u
37
- }, i[5] = l, i[6] = u, i[7] = d) : d = i[7], useMutation(d);
24
+ a[2] !== s || a[3] !== l ? (d = (e, r) => {
25
+ l.invalidateQueries({ queryKey: queryKeys.environments(s.envKey, r.workspaceId) });
26
+ }, a[2] = s, a[3] = l, a[4] = d) : d = a[4];
27
+ let f;
28
+ return a[5] !== u || a[6] !== d ? (f = {
29
+ mutationFn: u,
30
+ onSuccess: d
31
+ }, a[5] = u, a[6] = d, a[7] = f) : f = a[7], useMutation(f);
38
32
  }
39
33
  function useResetEnvironment() {
40
- let i = c(2), a = useLoopstackClient(), o;
41
- return i[0] === a ? o = i[1] : (o = { mutationFn: (e) => a.http.post(`${environmentsPath(e.workspaceId)}/${e.slotId}/reset`) }, i[0] = a, i[1] = o), useMutation(o);
34
+ let n = c(2), a = useLoopstackClient(), o;
35
+ return n[0] === a ? o = n[1] : (o = { mutationFn: (e) => a.http.post(`${environmentsPath(e.workspaceId)}/${e.slotId}/reset`) }, n[0] = a, n[1] = o), useMutation(o);
42
36
  }
43
37
  export { useReplaceEnvironments, useResetEnvironment, useWorkspaceEnvironments };
@@ -1,4 +1,4 @@
1
1
  var globalThis_ = typeof globalThis == "object" && globalThis || typeof window == "object" && window || typeof self == "object" && self || typeof global == "object" && global || (function() {
2
2
  return this;
3
- })() || Function("return this")();
3
+ })();
4
4
  export { globalThis_ };
@@ -1,7 +1,7 @@
1
- import { isPrimitive } from "../../predicate/isPrimitive.js";
1
+ import { isArray } from "../predicate/isArray.js";
2
2
  import { getTag } from "../_internal/getTag.js";
3
3
  import { argumentsTag, arrayBufferTag, arrayTag, booleanTag, dataViewTag, dateTag, float32ArrayTag, float64ArrayTag, int16ArrayTag, int32ArrayTag, int8ArrayTag, mapTag, numberTag, objectTag, regexpTag, setTag, stringTag, symbolTag, uint16ArrayTag, uint32ArrayTag, uint8ArrayTag, uint8ClampedArrayTag } from "../_internal/tags.js";
4
- import { isArray } from "../predicate/isArray.js";
4
+ import { isPrimitive } from "../../predicate/isPrimitive.js";
5
5
  import { isTypedArray } from "../predicate/isTypedArray.js";
6
6
  function clone(D) {
7
7
  if (isPrimitive(D)) return D;
@@ -1,25 +1,25 @@
1
1
  import { getTag } from "../_internal/getTag.js";
2
- import { argumentsTag, booleanTag, numberTag, objectTag, stringTag } from "../_internal/tags.js";
2
+ import { argumentsTag, booleanTag, numberTag, stringTag } from "../_internal/tags.js";
3
3
  import { cloneDeepWith, copyProperties } from "../../object/cloneDeepWith.js";
4
- function cloneDeepWith$1(o, c) {
5
- return cloneDeepWith(o, (s, l, u, d) => {
6
- let f = c?.(s, l, u, d);
4
+ function cloneDeepWith$1(s, c) {
5
+ return cloneDeepWith(s, (o, l, u, d) => {
6
+ let f = c?.(o, l, u, d);
7
7
  if (f !== void 0) return f;
8
- if (typeof o == "object") {
9
- if (getTag(o) === "[object Object]" && typeof o.constructor != "function") {
8
+ if (typeof s == "object") {
9
+ if (getTag(s) === "[object Object]" && typeof s.constructor != "function") {
10
10
  let e = {};
11
- return d.set(o, e), copyProperties(e, o, u, d), e;
11
+ return d.set(s, e), copyProperties(e, s, u, d), e;
12
12
  }
13
- switch (Object.prototype.toString.call(o)) {
13
+ switch (Object.prototype.toString.call(s)) {
14
14
  case numberTag:
15
15
  case stringTag:
16
16
  case booleanTag: {
17
- let e = new o.constructor(o?.valueOf());
18
- return copyProperties(e, o), e;
17
+ let e = new s.constructor(s?.valueOf());
18
+ return copyProperties(e, s), e;
19
19
  }
20
20
  case argumentsTag: {
21
21
  let e = {};
22
- return copyProperties(e, o), e.length = o.length, e[Symbol.iterator] = o[Symbol.iterator], e;
22
+ return copyProperties(e, s), e.length = s.length, e[Symbol.iterator] = s[Symbol.iterator], e;
23
23
  }
24
24
  default: return;
25
25
  }
@@ -1,13 +1,13 @@
1
- import { isUnsafeProperty } from "../../_internal/isUnsafeProperty.js";
2
- import { isPrimitive } from "../../predicate/isPrimitive.js";
1
+ import { isPlainObject } from "../predicate/isPlainObject.js";
3
2
  import { getSymbols } from "../_internal/getSymbols.js";
4
3
  import { isBuffer } from "../../predicate/isBuffer.js";
4
+ import { isUnsafeProperty } from "../../_internal/isUnsafeProperty.js";
5
+ import { isPrimitive } from "../../predicate/isPrimitive.js";
5
6
  import { cloneDeep } from "./cloneDeep.js";
6
7
  import { isArguments } from "../predicate/isArguments.js";
7
8
  import { isObjectLike } from "../predicate/isObjectLike.js";
8
9
  import { isArrayLikeObject } from "../predicate/isArrayLikeObject.js";
9
10
  import { isTypedArray } from "../predicate/isTypedArray.js";
10
- import { isPlainObject } from "../predicate/isPlainObject.js";
11
11
  import { clone } from "../../object/clone.js";
12
12
  function mergeWith(e, ...s) {
13
13
  let c = s.slice(0, -1), l = s[s.length - 1], u = e;
@@ -26,9 +26,9 @@ function mergeWithDeep(f, p, m, h) {
26
26
  }
27
27
  let g = [...Object.keys(p), ...getSymbols(p)];
28
28
  for (let s = 0; s < g.length; s++) {
29
- let c = g[s];
30
- if (isUnsafeProperty(c)) continue;
31
- let d = p[c], _ = f[c];
29
+ let u = g[s];
30
+ if (isUnsafeProperty(u)) continue;
31
+ let d = p[u], _ = f[u];
32
32
  if (isArguments(d) && (d = { ...d }), isArguments(_) && (_ = { ..._ }), isBuffer(d) && (d = cloneDeep(d)), Array.isArray(d)) if (Array.isArray(_)) {
33
33
  let e = [], s = Reflect.ownKeys(_);
34
34
  for (let c = 0; c < s.length; c++) {
@@ -41,8 +41,8 @@ function mergeWithDeep(f, p, m, h) {
41
41
  for (let s = 0; s < _.length; s++) e[s] = _[s];
42
42
  _ = e;
43
43
  } else _ = [];
44
- let v = m(_, d, c, f, p, h);
45
- v === void 0 ? Array.isArray(d) || isObjectLike(_) && isObjectLike(d) && (isPlainObject(_) || isPlainObject(d) || isTypedArray(_) || isTypedArray(d)) ? f[c] = mergeWithDeep(_, d, m, h) : _ == null && isPlainObject(d) ? f[c] = mergeWithDeep({}, d, m, h) : _ == null && isTypedArray(d) ? f[c] = cloneDeep(d) : (_ === void 0 || d !== void 0) && (f[c] = d) : f[c] = v;
44
+ let v = m(_, d, u, f, p, h);
45
+ v === void 0 ? Array.isArray(d) || isObjectLike(_) && isObjectLike(d) && (isPlainObject(_) || isPlainObject(d) || isTypedArray(_) || isTypedArray(d)) ? f[u] = mergeWithDeep(_, d, m, h) : _ == null && isPlainObject(d) ? f[u] = mergeWithDeep({}, d, m, h) : _ == null && isTypedArray(d) ? f[u] = cloneDeep(d) : (_ === void 0 || d !== void 0) && (f[u] = d) : f[u] = v;
46
46
  }
47
47
  return f;
48
48
  }
@@ -1,12 +1,12 @@
1
- import { isArrayLike } from "./isArrayLike.js";
2
1
  import { isBuffer } from "../../predicate/isBuffer.js";
2
+ import { isArrayLike } from "./isArrayLike.js";
3
3
  import { isArguments } from "./isArguments.js";
4
- import { isPrototype } from "../_internal/isPrototype.js";
5
4
  import { isTypedArray } from "./isTypedArray.js";
5
+ import { isPrototype } from "../_internal/isPrototype.js";
6
6
  function isEmpty(a) {
7
7
  if (a == null) return !0;
8
8
  if (isArrayLike(a)) return typeof a.splice != "function" && typeof a != "string" && !isBuffer(a) && !isTypedArray(a) && !isArguments(a) ? !1 : a.length === 0;
9
- if (typeof a == "object") {
9
+ if (typeof a == "object" || typeof a == "function") {
10
10
  if (a instanceof Map || a instanceof Set) return a.size === 0;
11
11
  let e = Object.keys(a);
12
12
  return isPrototype(a) ? e.filter((e) => e !== "constructor").length === 0 : e.length === 0;
@@ -16,14 +16,9 @@ function clone(n) {
16
16
  let e;
17
17
  return e = n instanceof AggregateError ? new i(n.errors, n.message, { cause: n.cause }) : new i(n.message, { cause: n.cause }), e.stack = n.stack, Object.assign(e, n), e;
18
18
  }
19
- if (typeof File < "u" && n instanceof File) return new i([n], n.name, {
19
+ return typeof File < "u" && n instanceof File ? new i([n], n.name, {
20
20
  type: n.type,
21
21
  lastModified: n.lastModified
22
- });
23
- if (typeof n == "object") {
24
- let e = Object.create(r);
25
- return Object.assign(e, n);
26
- }
27
- return n;
22
+ }) : typeof n == "object" ? Object.assign(Object.create(r), n) : n;
28
23
  }
29
24
  export { clone };
@@ -1,91 +1,91 @@
1
- import { isPrimitive } from "../predicate/isPrimitive.js";
2
1
  import { getSymbols } from "../compat/_internal/getSymbols.js";
3
2
  import { getTag } from "../compat/_internal/getTag.js";
4
3
  import { argumentsTag, arrayBufferTag, arrayTag, booleanTag, dataViewTag, dateTag, float32ArrayTag, float64ArrayTag, int16ArrayTag, int32ArrayTag, int8ArrayTag, mapTag, numberTag, objectTag, regexpTag, setTag, stringTag, symbolTag, uint16ArrayTag, uint32ArrayTag, uint8ArrayTag, uint8ClampedArrayTag } from "../compat/_internal/tags.js";
5
4
  import { isBuffer } from "../predicate/isBuffer.js";
5
+ import { isPrimitive } from "../predicate/isPrimitive.js";
6
6
  import { isTypedArray } from "../predicate/isTypedArray.js";
7
- function cloneDeepWith(t, C) {
8
- return cloneDeepWithImpl(t, void 0, t, /* @__PURE__ */ new Map(), C);
7
+ function cloneDeepWith(e, C) {
8
+ return cloneDeepWithImpl(e, void 0, e, /* @__PURE__ */ new Map(), C);
9
9
  }
10
- function cloneDeepWithImpl(C, w, T, E = /* @__PURE__ */ new Map(), D = void 0) {
11
- let O = D?.(C, w, T, E);
12
- if (O !== void 0) return O;
13
- if (isPrimitive(C)) return C;
14
- if (E.has(C)) return E.get(C);
15
- if (Array.isArray(C)) {
16
- let t = Array(C.length);
17
- E.set(C, t);
18
- for (let w = 0; w < C.length; w++) t[w] = cloneDeepWithImpl(C[w], w, T, E, D);
19
- return Object.hasOwn(C, "index") && (t.index = C.index), Object.hasOwn(C, "input") && (t.input = C.input), t;
10
+ function cloneDeepWithImpl(e, C, w, T = /* @__PURE__ */ new Map(), E = void 0) {
11
+ let D = E?.(e, C, w, T);
12
+ if (D !== void 0) return D;
13
+ if (isPrimitive(e)) return e;
14
+ if (T.has(e)) return T.get(e);
15
+ if (Array.isArray(e)) {
16
+ let C = Array(e.length);
17
+ T.set(e, C);
18
+ for (let D = 0; D < e.length; D++) C[D] = cloneDeepWithImpl(e[D], D, w, T, E);
19
+ return Object.hasOwn(e, "index") && (C.index = e.index), Object.hasOwn(e, "input") && (C.input = e.input), C;
20
20
  }
21
- if (C instanceof Date) return new Date(C.getTime());
22
- if (C instanceof RegExp) {
23
- let t = new RegExp(C.source, C.flags);
24
- return t.lastIndex = C.lastIndex, t;
21
+ if (e instanceof Date) return new Date(e.getTime());
22
+ if (e instanceof RegExp) {
23
+ let C = new RegExp(e.source, e.flags);
24
+ return C.lastIndex = e.lastIndex, C;
25
25
  }
26
- if (C instanceof Map) {
27
- let t = /* @__PURE__ */ new Map();
28
- E.set(C, t);
29
- for (let [w, O] of C) t.set(w, cloneDeepWithImpl(O, w, T, E, D));
30
- return t;
26
+ if (e instanceof Map) {
27
+ let C = /* @__PURE__ */ new Map();
28
+ T.set(e, C);
29
+ for (let [D, O] of e) C.set(D, cloneDeepWithImpl(O, D, w, T, E));
30
+ return C;
31
31
  }
32
- if (C instanceof Set) {
33
- let t = /* @__PURE__ */ new Set();
34
- E.set(C, t);
35
- for (let w of C) t.add(cloneDeepWithImpl(w, void 0, T, E, D));
36
- return t;
32
+ if (e instanceof Set) {
33
+ let C = /* @__PURE__ */ new Set();
34
+ T.set(e, C);
35
+ for (let D of e) C.add(cloneDeepWithImpl(D, void 0, w, T, E));
36
+ return C;
37
37
  }
38
- if (isBuffer(C)) return C.subarray();
39
- if (isTypedArray(C)) {
40
- let t = new (Object.getPrototypeOf(C)).constructor(C.length);
41
- E.set(C, t);
42
- for (let w = 0; w < C.length; w++) t[w] = cloneDeepWithImpl(C[w], w, T, E, D);
43
- return t;
38
+ if (isBuffer(e)) return e.subarray();
39
+ if (isTypedArray(e)) {
40
+ let C = new (Object.getPrototypeOf(e)).constructor(e.length);
41
+ T.set(e, C);
42
+ for (let D = 0; D < e.length; D++) C[D] = cloneDeepWithImpl(e[D], D, w, T, E);
43
+ return C;
44
44
  }
45
- if (C instanceof ArrayBuffer || typeof SharedArrayBuffer < "u" && C instanceof SharedArrayBuffer) return C.slice(0);
46
- if (C instanceof DataView) {
47
- let t = new DataView(C.buffer.slice(0), C.byteOffset, C.byteLength);
48
- return E.set(C, t), copyProperties(t, C, T, E, D), t;
45
+ if (e instanceof ArrayBuffer || typeof SharedArrayBuffer < "u" && e instanceof SharedArrayBuffer) return e.slice(0);
46
+ if (e instanceof DataView) {
47
+ let C = new DataView(e.buffer.slice(0), e.byteOffset, e.byteLength);
48
+ return T.set(e, C), copyProperties(C, e, w, T, E), C;
49
49
  }
50
- if (typeof File < "u" && C instanceof File) {
51
- let t = new File([C], C.name, { type: C.type });
52
- return E.set(C, t), copyProperties(t, C, T, E, D), t;
50
+ if (typeof File < "u" && e instanceof File) {
51
+ let C = new File([e], e.name, { type: e.type });
52
+ return T.set(e, C), copyProperties(C, e, w, T, E), C;
53
53
  }
54
- if (typeof Blob < "u" && C instanceof Blob) {
55
- let t = new Blob([C], { type: C.type });
56
- return E.set(C, t), copyProperties(t, C, T, E, D), t;
54
+ if (typeof Blob < "u" && e instanceof Blob) {
55
+ let C = new Blob([e], { type: e.type });
56
+ return T.set(e, C), copyProperties(C, e, w, T, E), C;
57
57
  }
58
- if (C instanceof Error) {
59
- let t = structuredClone(C);
60
- return E.set(C, t), t.message = C.message, t.name = C.name, t.stack = C.stack, t.cause = C.cause, t.constructor = C.constructor, copyProperties(t, C, T, E, D), t;
58
+ if (e instanceof Error) {
59
+ let C = structuredClone(e);
60
+ return T.set(e, C), C.message = e.message, C.name = e.name, C.stack = e.stack, C.cause = e.cause, C.constructor = e.constructor, copyProperties(C, e, w, T, E), C;
61
61
  }
62
- if (C instanceof Boolean) {
63
- let t = new Boolean(C.valueOf());
64
- return E.set(C, t), copyProperties(t, C, T, E, D), t;
62
+ if (e instanceof Boolean) {
63
+ let C = new Boolean(e.valueOf());
64
+ return T.set(e, C), copyProperties(C, e, w, T, E), C;
65
65
  }
66
- if (C instanceof Number) {
67
- let t = new Number(C.valueOf());
68
- return E.set(C, t), copyProperties(t, C, T, E, D), t;
66
+ if (e instanceof Number) {
67
+ let C = new Number(e.valueOf());
68
+ return T.set(e, C), copyProperties(C, e, w, T, E), C;
69
69
  }
70
- if (C instanceof String) {
71
- let t = new String(C.valueOf());
72
- return E.set(C, t), copyProperties(t, C, T, E, D), t;
70
+ if (e instanceof String) {
71
+ let C = new String(e.valueOf());
72
+ return T.set(e, C), copyProperties(C, e, w, T, E), C;
73
73
  }
74
- if (typeof C == "object" && isCloneableObject(C)) {
75
- let t = Object.create(Object.getPrototypeOf(C));
76
- return E.set(C, t), copyProperties(t, C, T, E, D), t;
74
+ if (typeof e == "object" && isCloneableObject(e)) {
75
+ let C = Object.create(Object.getPrototypeOf(e));
76
+ return T.set(e, C), copyProperties(C, e, w, T, E), C;
77
77
  }
78
- return C;
78
+ return e;
79
79
  }
80
- function copyProperties(t, w, T = t, E, D) {
80
+ function copyProperties(C, w, T = C, E, D) {
81
81
  let O = [...Object.keys(w), ...getSymbols(w)];
82
- for (let C = 0; C < O.length; C++) {
83
- let k = O[C], A = Object.getOwnPropertyDescriptor(t, k);
84
- (A == null || A.writable) && (t[k] = cloneDeepWithImpl(w[k], k, T, E, D));
82
+ for (let e = 0; e < O.length; e++) {
83
+ let k = O[e], A = Object.getOwnPropertyDescriptor(C, k);
84
+ (A == null || A.writable) && (C[k] = cloneDeepWithImpl(w[k], k, T, E, D));
85
85
  }
86
86
  }
87
- function isCloneableObject(t) {
88
- switch (getTag(t)) {
87
+ function isCloneableObject(e) {
88
+ switch (getTag(e)) {
89
89
  case argumentsTag:
90
90
  case arrayTag:
91
91
  case arrayBufferTag:
@@ -75,6 +75,11 @@ const queryKeys = {
75
75
  e,
76
76
  t
77
77
  ],
78
+ environments: (e, t) => [
79
+ "workspace-environments",
80
+ e,
81
+ t
82
+ ],
78
83
  gitStatus: (e, t) => [
79
84
  "gitStatus",
80
85
  e,
@@ -16,6 +16,7 @@ function resolveInvalidations(t, n) {
16
16
  case "document.created": return [queryKeys.documents(n, t.workflowId)];
17
17
  case "secret.upserted":
18
18
  case "secret.deleted": return [queryKeys.secrets(n, t.workspaceId)];
19
+ case "environment.updated": return [queryKeys.environments(n, t.workspaceId)];
19
20
  case "git.updated": return [
20
21
  queryKeys.gitStatus(n, t.workspaceId),
21
22
  queryKeys.gitLog(n, t.workspaceId),
@@ -1,5 +1,5 @@
1
1
  import { DocumentCreatedEventSchema, WorkflowCreatedEventSchema, WorkflowUpdatedEventSchema } from "./workflow-events.schema.js";
2
- import { GitUpdatedEventSchema, SecretDeletedEventSchema, SecretUpsertedEventSchema } from "./workspace-events.schema.js";
2
+ import { EnvironmentUpdatedEventSchema, GitUpdatedEventSchema, SecretDeletedEventSchema, SecretUpsertedEventSchema } from "./workspace-events.schema.js";
3
3
  import { LlmResponseDoneEventSchema, LlmResponseErrorEventSchema, LlmResponseStartEventSchema, LlmResponseTextDeltaEventSchema, LlmResponseThinkingDeltaEventSchema, LlmResponseToolCallEventSchema } from "./llm-events.schema.js";
4
4
  import { StreamResetEventSchema } from "./stream-events.schema.js";
5
5
  import { z } from "zod";
@@ -10,6 +10,7 @@ const ClientMessageSchema = z.discriminatedUnion("type", [
10
10
  SecretUpsertedEventSchema,
11
11
  SecretDeletedEventSchema,
12
12
  GitUpdatedEventSchema,
13
+ EnvironmentUpdatedEventSchema,
13
14
  LlmResponseStartEventSchema,
14
15
  LlmResponseTextDeltaEventSchema,
15
16
  LlmResponseThinkingDeltaEventSchema,
@@ -1,6 +1,6 @@
1
1
  import { ClientMessageBaseSchema } from "./client-message-base.schema.js";
2
2
  import { DocumentCreatedEventSchema, WorkflowCreatedEventSchema, WorkflowUpdatedEventSchema } from "./workflow-events.schema.js";
3
- import { GitUpdatedEventSchema, SecretDeletedEventSchema, SecretUpsertedEventSchema } from "./workspace-events.schema.js";
3
+ import { EnvironmentUpdatedEventSchema, GitUpdatedEventSchema, SecretDeletedEventSchema, SecretUpsertedEventSchema } from "./workspace-events.schema.js";
4
4
  import { LlmNormalizedMessageSchema, LlmResponseDoneEventSchema, LlmResponseErrorEventSchema, LlmResponseStartEventSchema, LlmResponseTextDeltaEventSchema, LlmResponseThinkingDeltaEventSchema, LlmResponseToolCallEventSchema } from "./llm-events.schema.js";
5
5
  import { StreamResetEventSchema } from "./stream-events.schema.js";
6
6
  import { ClientMessageSchema, isLlmResponseEvent } from "./client-message.schema.js";
@@ -1,5 +1,5 @@
1
1
  import { ClientMessageBaseSchema } from "./client-message-base.schema.js";
2
2
  import { z } from "zod";
3
3
  var WorkspaceEventBaseSchema = ClientMessageBaseSchema.extend({ workspaceId: z.string() });
4
- const SecretUpsertedEventSchema = WorkspaceEventBaseSchema.extend({ type: z.literal("secret.upserted") }), SecretDeletedEventSchema = WorkspaceEventBaseSchema.extend({ type: z.literal("secret.deleted") }), GitUpdatedEventSchema = WorkspaceEventBaseSchema.extend({ type: z.literal("git.updated") });
5
- export { GitUpdatedEventSchema, SecretDeletedEventSchema, SecretUpsertedEventSchema };
4
+ const SecretUpsertedEventSchema = WorkspaceEventBaseSchema.extend({ type: z.literal("secret.upserted") }), SecretDeletedEventSchema = WorkspaceEventBaseSchema.extend({ type: z.literal("secret.deleted") }), GitUpdatedEventSchema = WorkspaceEventBaseSchema.extend({ type: z.literal("git.updated") }), EnvironmentUpdatedEventSchema = WorkspaceEventBaseSchema.extend({ type: z.literal("environment.updated") });
5
+ export { EnvironmentUpdatedEventSchema, GitUpdatedEventSchema, SecretDeletedEventSchema, SecretUpsertedEventSchema };