@w6w/embed 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/editors.mjs CHANGED
@@ -518,19 +518,19 @@ function Qe(a) {
518
518
  const c = d.kind === "action" ? d : void 0, C = (c == null ? void 0 : c.uses.app) ?? "", D = (c == null ? void 0 : c.uses.action) ?? "", E = vn(d), B = En(C), [M, L] = N(null);
519
519
  ce(() => {
520
520
  let l = !1;
521
- return import("@w6w/ui/flow").then((w) => {
522
- l || L({ isTriggerApp: w.isTriggerApp, asFieldDefs: w.asFieldDefs });
521
+ return import("@w6w/ui/flow").then((b) => {
522
+ l || L({ isTriggerApp: b.isTriggerApp, asFieldDefs: b.asFieldDefs });
523
523
  }), () => {
524
524
  l = !0;
525
525
  };
526
526
  }, []);
527
- const A = Cn(C, C !== ""), Y = Sn(C, C !== ""), P = O(
528
- () => (A.data ?? []).find((l) => l.key === D),
529
- [A.data, D]
530
- ), G = ["function", "workflow"].filter(t), ae = `Choose ${n.charAt(0).toLowerCase()}${n.slice(1)}`, W = hn(t("function")), X = an(void 0, t("workflow")), k = mn(t("endpoint")), p = Ke(E, r === "function" && E !== ""), R = on(E, r === "workflow" && E !== ""), z = Te(E, r === "endpoint" && E !== ""), Z = O(() => {
531
- var l, w, v;
527
+ const j = Cn(C, C !== ""), Y = Sn(C, C !== ""), P = O(
528
+ () => (j.data ?? []).find((l) => l.key === D),
529
+ [j.data, D]
530
+ ), G = ["function", "workflow"].filter(t), ae = `Choose ${n.charAt(0).toLowerCase()}${n.slice(1)}`, W = hn(t("function")), X = an(void 0, t("workflow")), w = mn(t("endpoint")), p = Ke(E, r === "function" && E !== ""), R = on(E, r === "workflow" && E !== ""), z = Te(E, r === "endpoint" && E !== ""), Z = O(() => {
531
+ var l, b, v;
532
532
  return r === "action" ? me((P == null ? void 0 : P.params) ?? []) : r === "function" ? me(((l = p.data) == null ? void 0 : l.inputs) ?? []) : r === "workflow" ? M ? gn(
533
- (w = R.data) == null ? void 0 : w.workflow,
533
+ (b = R.data) == null ? void 0 : b.workflow,
534
534
  M
535
535
  ) : [] : r === "endpoint" ? me(((v = z.data) == null ? void 0 : v.endpoint.input) ?? []) : [];
536
536
  }, [
@@ -554,15 +554,15 @@ function Qe(a) {
554
554
  return;
555
555
  }
556
556
  if (l.uses.app.startsWith("@w6w/")) return;
557
- const w = d.kind === "action" ? d.with ?? {} : {}, v = l.with ?? {}, j = {};
557
+ const b = d.kind === "action" ? d.with ?? {} : {}, v = l.with ?? {}, J = {};
558
558
  for (const T of Object.keys(v))
559
- j[T] = T in w ? w[T] : v[T];
560
- y({ kind: "action", uses: l.uses, with: j }), g(!1);
559
+ J[T] = T in b ? b[T] : v[T];
560
+ y({ kind: "action", uses: l.uses, with: J }), g(!1);
561
561
  }
562
- function H(l, w) {
562
+ function H(l, b) {
563
563
  if (d.kind !== "action") return;
564
564
  const v = { ...d.with ?? {} };
565
- w === "" || w === void 0 ? delete v[l] : v[l] = w, y({ ...d, with: v });
565
+ b === "" || b === void 0 ? delete v[l] : v[l] = b, y({ ...d, with: v });
566
566
  }
567
567
  function q(l) {
568
568
  y(
@@ -575,26 +575,26 @@ function Qe(a) {
575
575
  );
576
576
  }
577
577
  const ie = O(() => {
578
- var l, w;
578
+ var l, b;
579
579
  if (E) {
580
580
  if (r === "function") {
581
- const v = (l = W.data) == null ? void 0 : l.find((j) => j.id === E);
581
+ const v = (l = W.data) == null ? void 0 : l.find((J) => J.id === E);
582
582
  return v ? v.displayName || v.key : void 0;
583
583
  }
584
584
  if (r === "workflow") {
585
- const v = (w = X.data) == null ? void 0 : w.find((j) => j.id === E);
585
+ const v = (b = X.data) == null ? void 0 : b.find((J) => J.id === E);
586
586
  return v ? v.displayName || v.name : void 0;
587
587
  }
588
588
  }
589
589
  }, [r, E, W.data, X.data]), ne = O(() => {
590
- const l = (P == null ? void 0 : P.params) ?? [], w = (c == null ? void 0 : c.with) ?? {};
590
+ const l = (P == null ? void 0 : P.params) ?? [], b = (c == null ? void 0 : c.with) ?? {};
591
591
  return l.filter((v) => {
592
592
  if (v.showIf) {
593
- const { field: T, equals: h, in: I, notIn: U, truthy: re } = v.showIf, te = w[T];
593
+ const { field: T, equals: h, in: I, notIn: U, truthy: re } = v.showIf, te = b[T];
594
594
  if (h !== void 0 && te !== h || I !== void 0 && !I.includes(te) || U != null && U.includes(te) || re !== void 0 && !!te !== re) return !1;
595
595
  }
596
- const j = v.key in w && w[v.key] !== "" && w[v.key] !== void 0;
597
- return v.required || j;
596
+ const J = v.key in b && b[v.key] !== "" && b[v.key] !== void 0;
597
+ return v.required || J;
598
598
  });
599
599
  }, [P, c == null ? void 0 : c.with]);
600
600
  return /* @__PURE__ */ o("div", { className: "card", children: [
@@ -633,7 +633,7 @@ function Qe(a) {
633
633
  F && " Leave every cell blank to pass the inbound payload through as the action's params."
634
634
  ] }),
635
635
  ne.length === 0 ? /* @__PURE__ */ e("p", { className: "muted small", children: "This action declares no params." }) : /* @__PURE__ */ e("ul", { className: "list", children: ne.map((l) => {
636
- var w;
636
+ var b;
637
637
  return /* @__PURE__ */ o("li", { style: { alignItems: "center", gap: 8 }, children: [
638
638
  /* @__PURE__ */ o("span", { className: "list-main", children: [
639
639
  /* @__PURE__ */ e("code", { children: l.key }),
@@ -642,7 +642,7 @@ function Qe(a) {
642
642
  /* @__PURE__ */ e("div", { style: { flex: 1 }, children: /* @__PURE__ */ e(
643
643
  Ge,
644
644
  {
645
- value: (w = c == null ? void 0 : c.with) == null ? void 0 : w[l.key],
645
+ value: (b = c == null ? void 0 : c.with) == null ? void 0 : b[l.key],
646
646
  onChange: (v) => H(l.key, v),
647
647
  placeholder: `inputs.${l.key}`,
648
648
  "aria-label": `Mapping for ${l.key}`
@@ -694,7 +694,7 @@ function Qe(a) {
694
694
  /* @__PURE__ */ e("span", { children: "Endpoint" }),
695
695
  /* @__PURE__ */ o("select", { value: E, onChange: (l) => ee(l.target.value), children: [
696
696
  /* @__PURE__ */ e("option", { value: "", children: "— pick an endpoint —" }),
697
- (V = k.data) == null ? void 0 : V.map((l) => /* @__PURE__ */ o("option", { value: l.id, children: [
697
+ (V = w.data) == null ? void 0 : V.map((l) => /* @__PURE__ */ o("option", { value: l.id, children: [
698
698
  l.displayName || l.key,
699
699
  " (",
700
700
  l.id,
@@ -745,16 +745,16 @@ function Jn(a) {
745
745
  var ge;
746
746
  const { id: s, onNavigate: i, slots: f } = a, u = Re("endpoint"), n = Te(s).data, [m, F] = N([]), S = le(m);
747
747
  S.current = m;
748
- const g = le(!1), d = le(!1), [r, t] = N("id"), [y, c] = N(null), [C, D] = N(!1), [E, B] = N(!1), [M, L] = N(!1), [A, Y] = N(""), [P, G] = N({ id: s, key: "" }), [ae, W] = N(null), X = de((b) => {
749
- const $ = se(b), J = we({
748
+ const g = le(!1), d = le(!1), [r, t] = N("id"), [y, c] = N(null), [C, D] = N(!1), [E, B] = N(!1), [M, L] = N(!1), [j, Y] = N(""), [P, G] = N({ id: s, key: "" }), [ae, W] = N(null), X = de((k) => {
749
+ const $ = se(k), A = we({
750
750
  target: $.target,
751
751
  rows: $.input ?? [],
752
752
  fields: S.current
753
753
  });
754
- return J.length > 0 ? `The target needs: ${J.join(", ")}` : null;
755
- }, []), k = ln({ id: s, saveGuard: X }), p = O(
756
- () => k.definition ? se(k.definition) : null,
757
- [k.definition]
754
+ return A.length > 0 ? `The target needs: ${A.join(", ")}` : null;
755
+ }, []), w = ln({ id: s, saveGuard: X }), p = O(
756
+ () => w.definition ? se(w.definition) : null,
757
+ [w.definition]
758
758
  ), R = (p == null ? void 0 : p.input) ?? [], z = ((ge = p == null ? void 0 : p.exposure) == null ? void 0 : ge.security) ?? {
759
759
  auth: "platform"
760
760
  }, Z = Me(n == null ? void 0 : n.invokeUrls), x = Bn(n == null ? void 0 : n.invokeUrls, y);
@@ -766,30 +766,30 @@ function Jn(a) {
766
766
  invokeUrl: x ? x.url : n == null ? void 0 : n.invokeUrl,
767
767
  invokeUrlByKey: x ? x.urlByKey : n == null ? void 0 : n.invokeUrlByKey,
768
768
  urlForm: r,
769
- inputs: m.map((b) => b.key),
770
- policy: k.policy,
771
- onPolicyChange: k.onPolicyChange
769
+ inputs: m.map((k) => k.key),
770
+ policy: w.policy,
771
+ onPolicyChange: w.onPolicyChange
772
772
  });
773
- const { setDefinition: H } = k, q = de(
774
- (b) => {
773
+ const { setDefinition: H } = w, q = de(
774
+ (k) => {
775
775
  B(!1), H(($) => ({
776
776
  ...se($),
777
- ...b
777
+ ...k
778
778
  }));
779
779
  },
780
780
  [H]
781
- ), ee = (b) => {
781
+ ), ee = (k) => {
782
782
  B(!1), H(($) => {
783
783
  var ke;
784
- const J = se($), Ue = {
785
- ...((ke = J.exposure) == null ? void 0 : ke.security) ?? { auth: "platform" },
786
- ...b
784
+ const A = se($), Ue = {
785
+ ...((ke = A.exposure) == null ? void 0 : ke.security) ?? { auth: "platform" },
786
+ ...k
787
787
  };
788
- return { ...J, exposure: { ...J.exposure, security: Ue } };
788
+ return { ...A, exposure: { ...A.exposure, security: Ue } };
789
789
  });
790
790
  };
791
- function ie(b) {
792
- g.current = !0, q({ target: b });
791
+ function ie(k) {
792
+ g.current = !0, q({ target: k });
793
793
  }
794
794
  ce(() => {
795
795
  if (g.current) {
@@ -801,7 +801,7 @@ function Jn(a) {
801
801
  }
802
802
  }, [m]);
803
803
  const ne = O(
804
- () => ({ inputs: R.map((b) => b.key).filter(Boolean) }),
804
+ () => ({ inputs: R.map((k) => k.key).filter(Boolean) }),
805
805
  [R]
806
806
  ), Q = O(
807
807
  () => Oe(R, m),
@@ -819,33 +819,33 @@ function Jn(a) {
819
819
  p.target.kind === "action" ? "these required params mapped under Input mapping" : "these required keys declared under Input",
820
820
  ": ",
821
821
  /* @__PURE__ */ e("strong", { children: _.join(", ") })
822
- ] }) : null, w = !!((p == null ? void 0 : p.key.trim()) ?? "") && _.length === 0 && k.canSave;
822
+ ] }) : null, b = !!((p == null ? void 0 : p.key.trim()) ?? "") && _.length === 0 && w.canSave;
823
823
  async function v() {
824
824
  if (!p) return;
825
- const b = await k.commit(be(p));
826
- B(b.status === "saved");
825
+ const k = await w.commit(be(p));
826
+ B(k.status === "saved" || k.status === "clean");
827
827
  }
828
- function j() {
828
+ function J() {
829
829
  if (!p) return;
830
- const b = be(p);
831
- Y(JSON.stringify(b, null, 2)), G({ id: String(b.id), key: String(b.key) }), W(null), L(!0);
830
+ const k = be(p);
831
+ Y(JSON.stringify(k, null, 2)), G({ id: String(k.id), key: String(k.key) }), W(null), L(!0);
832
832
  }
833
833
  async function T() {
834
- const b = ue(A, P), $ = b.parsed;
835
- if (!$ || b.blockedReason) return;
836
- const J = await k.commit($);
837
- J.status === "saved" || J.status === "clean" ? (W(null), L(!1), B(J.status === "saved")) : J.status === "failed" ? W(oe(J.error)) : W(J.reason);
834
+ const k = ue(j, P), $ = k.parsed;
835
+ if (!$ || k.blockedReason) return;
836
+ const A = await w.commit($);
837
+ A.status === "saved" || A.status === "clean" ? (W(null), L(!1), B(A.status === "saved" || A.status === "clean")) : A.status === "failed" ? W(oe(A.error)) : W(A.reason);
838
838
  }
839
- const h = k.loadError, I = h instanceof he && h.status === 404;
839
+ const h = w.loadError, I = h instanceof he && h.status === 404;
840
840
  if (!p) {
841
841
  if (h !== null && !I)
842
842
  return /* @__PURE__ */ e("div", { className: "error", role: "alert", children: oe(h) });
843
843
  if (!I) return /* @__PURE__ */ e("p", { className: "muted", children: "Loading…" });
844
844
  }
845
- const U = p && (p.displayName || p.key) || u.editor.newTitle, re = k.error !== null && !k.stale ? oe(k.error) : null, te = k.stale || k.changedElsewhere ? /* @__PURE__ */ o("div", { className: "error", role: "alert", "data-testid": "endpoint-stale", children: [
846
- k.stale ? oe(k.error) : "This endpoint was changed elsewhere. Reload to see the new version (your edits will be discarded).",
845
+ const U = p && (p.displayName || p.key) || u.editor.newTitle, re = w.error !== null && !w.stale ? oe(w.error) : null, te = w.stale || w.changedElsewhere ? /* @__PURE__ */ o("div", { className: "error", role: "alert", "data-testid": "endpoint-stale", children: [
846
+ w.stale ? oe(w.error) : "This endpoint was changed elsewhere. Reload to see the new version (your edits will be discarded).",
847
847
  " ",
848
- /* @__PURE__ */ e("button", { type: "button", className: "btn ghost", onClick: () => void k.reload(), children: "Reload" })
848
+ /* @__PURE__ */ e("button", { type: "button", className: "btn ghost", onClick: () => void w.reload(), children: "Reload" })
849
849
  ] }) : null;
850
850
  return /* @__PURE__ */ e(Pe, { value: ne, children: /* @__PURE__ */ e(
851
851
  We,
@@ -853,8 +853,8 @@ function Jn(a) {
853
853
  kind: "endpoint",
854
854
  title: U,
855
855
  incomplete: !1,
856
- canSave: w,
857
- isSaving: k.saving,
856
+ canSave: b,
857
+ isSaving: w.saving,
858
858
  onSave: () => void v(),
859
859
  error: I ? oe(h) : re,
860
860
  notFound: I,
@@ -862,7 +862,7 @@ function Jn(a) {
862
862
  slots: f,
863
863
  headerActions: /* @__PURE__ */ o(K, { children: [
864
864
  /* @__PURE__ */ e(Ee, { kind: "endpoint", id: s }),
865
- /* @__PURE__ */ e(Ie, { onClick: j })
865
+ /* @__PURE__ */ e(Ie, { onClick: J })
866
866
  ] }),
867
867
  banners: /* @__PURE__ */ o(K, { children: [
868
868
  te,
@@ -913,8 +913,8 @@ function Jn(a) {
913
913
  description: "The declared inbound contract. Reuses core Param fields. Leave empty to pass the raw request payload through to the target unchanged.",
914
914
  emptyMeansPassthrough: !0,
915
915
  rows: R,
916
- onChange: (b) => {
917
- d.current = !0, q({ input: b });
916
+ onChange: (k) => {
917
+ d.current = !0, q({ input: k });
918
918
  },
919
919
  uncoveredKeys: Q
920
920
  }
@@ -936,7 +936,7 @@ function Jn(a) {
936
936
  passthroughHint: !0,
937
937
  value: p.target,
938
938
  onChange: ie,
939
- onResolved: (b) => F(b.fields)
939
+ onResolved: (k) => F(k.fields)
940
940
  }
941
941
  ),
942
942
  /* @__PURE__ */ e(Kn, { security: z, onPatch: ee }),
@@ -959,9 +959,9 @@ function Jn(a) {
959
959
  {
960
960
  type: "button",
961
961
  className: "btn",
962
- disabled: !w,
962
+ disabled: !b,
963
963
  onClick: () => void v(),
964
- children: k.saving ? "Saving…" : "Save"
964
+ children: w.saving ? "Saving…" : "Save"
965
965
  }
966
966
  )
967
967
  ]
@@ -976,10 +976,10 @@ function Jn(a) {
976
976
  description: p.description ?? ""
977
977
  },
978
978
  onClose: () => D(!1),
979
- onSaved: (b) => {
979
+ onSaved: (k) => {
980
980
  q({
981
- displayName: b.displayName,
982
- description: b.description
981
+ displayName: k.displayName,
982
+ description: k.description
983
983
  }), D(!1);
984
984
  }
985
985
  }
@@ -991,11 +991,11 @@ function Jn(a) {
991
991
  onClose: () => L(!1),
992
992
  title: `JSON — ${U}`,
993
993
  mode: "disconnected",
994
- value: A,
994
+ value: j,
995
995
  onChange: Y,
996
- guard: (b) => ue(b, P).blockedReason,
996
+ guard: (k) => ue(k, P).blockedReason,
997
997
  onSave: () => void T(),
998
- saving: k.saving,
998
+ saving: w.saving,
999
999
  error: ae,
1000
1000
  editorLabel: "Endpoint definition JSON"
1001
1001
  }
@@ -1043,19 +1043,19 @@ function Mn(a) {
1043
1043
  policy: i.policy,
1044
1044
  onPolicyChange: i.onPolicyChange
1045
1045
  });
1046
- const L = (h) => i.setDefinition((I) => ({ ...I, ...h })), [A, Y] = N([]), P = le(!1), G = le(!1);
1046
+ const L = (h) => i.setDefinition((I) => ({ ...I, ...h })), [j, Y] = N([]), P = le(!1), G = le(!1);
1047
1047
  ce(() => {
1048
1048
  if (P.current) {
1049
1049
  if (!je({ rows: m, touched: G.current })) {
1050
1050
  P.current = !1;
1051
1051
  return;
1052
1052
  }
1053
- A.length !== 0 && (L({ inputs: Je(m, A) }), P.current = !1);
1053
+ j.length !== 0 && (L({ inputs: Je(m, j) }), P.current = !1);
1054
1054
  }
1055
- }, [A]);
1055
+ }, [j]);
1056
1056
  const ae = O(
1057
- () => Oe(m, A),
1058
- [m, A]
1057
+ () => Oe(m, j),
1058
+ [m, j]
1059
1059
  ), W = O(
1060
1060
  () => ({ inputs: m.map((h) => h.key).filter(Boolean) }),
1061
1061
  [m]
@@ -1066,10 +1066,10 @@ function Mn(a) {
1066
1066
  const I = bn(h);
1067
1067
  L({ impl: (U = n == null ? void 0 : n.impl) != null && U.outputMap ? { ...I, outputMap: n.impl.outputMap } : I });
1068
1068
  }
1069
- const k = O(
1070
- () => kn({ impl: n == null ? void 0 : n.impl, fields: A }),
1071
- [n == null ? void 0 : n.impl, A]
1072
- ), p = !!M && k.length === 0 && i.canSave;
1069
+ const w = O(
1070
+ () => kn({ impl: n == null ? void 0 : n.impl, fields: j }),
1071
+ [n == null ? void 0 : n.impl, j]
1072
+ ), p = !!M && w.length === 0 && i.canSave;
1073
1073
  function R() {
1074
1074
  return {
1075
1075
  ...n,
@@ -1101,12 +1101,12 @@ function Mn(a) {
1101
1101
  } finally {
1102
1102
  B(!1);
1103
1103
  }
1104
- }, [i.reload]), w = i.stale ? null : i.error ?? g, v = y ?? (w === null ? null : fe(w)), j = (n == null ? void 0 : n.displayName) || (n == null ? void 0 : n.key) || "New function";
1104
+ }, [i.reload]), b = i.stale ? null : i.error ?? g, v = y ?? (b === null ? null : fe(b)), J = (n == null ? void 0 : n.displayName) || (n == null ? void 0 : n.key) || "New function";
1105
1105
  return i.loading || n === null && g === null ? /* @__PURE__ */ e("p", { className: "muted", children: "Loading…" }) : /* @__PURE__ */ e("div", { style: { flex: 1, minWidth: 0, overflow: "auto" }, children: /* @__PURE__ */ e(Pe, { value: W, children: /* @__PURE__ */ e(
1106
1106
  We,
1107
1107
  {
1108
1108
  kind: "function",
1109
- title: j,
1109
+ title: J,
1110
1110
  incomplete: n !== null && !S,
1111
1111
  canSave: p,
1112
1112
  isSaving: i.saving,
@@ -1128,15 +1128,15 @@ function Mn(a) {
1128
1128
  /* @__PURE__ */ e("p", { children: "This function was changed elsewhere. Reloading replaces your unsaved edits with the saved copy." }),
1129
1129
  /* @__PURE__ */ e("button", { type: "button", className: "btn ghost", disabled: E, onClick: l, children: E ? "Reloading…" : "Reload from server" })
1130
1130
  ] }),
1131
- k.length > 0 && /* @__PURE__ */ o("p", { className: "error small", "data-testid": "save-blocked", children: [
1131
+ w.length > 0 && /* @__PURE__ */ o("p", { className: "error small", "data-testid": "save-blocked", children: [
1132
1132
  "Can’t save yet — map ",
1133
- k.length > 1 ? "these" : "this",
1133
+ w.length > 1 ? "these" : "this",
1134
1134
  " required action",
1135
1135
  " ",
1136
- k.length > 1 ? "params" : "param",
1136
+ w.length > 1 ? "params" : "param",
1137
1137
  " under Input mapping above:",
1138
1138
  " ",
1139
- /* @__PURE__ */ e("strong", { children: k.join(", ") })
1139
+ /* @__PURE__ */ e("strong", { children: w.join(", ") })
1140
1140
  ] }),
1141
1141
  C && /* @__PURE__ */ e("span", { className: "ok", children: "Saved." })
1142
1142
  ] }),
@@ -1214,7 +1214,7 @@ function Mn(a) {
1214
1214
  {
1215
1215
  open: Z,
1216
1216
  onClose: () => x(!1),
1217
- title: `JSON — ${j}`,
1217
+ title: `JSON — ${J}`,
1218
1218
  mode: "disconnected",
1219
1219
  value: H,
1220
1220
  onChange: q,
@@ -1 +1 @@
1
- {"version":3,"file":"editors.mjs","sources":["../src/editors/doc-format.ts","../src/editors/DocumentEditor.tsx","../src/lib/endpoint-editor.ts","../src/editor/CallableEditorFrame.tsx","../src/editor/EndpointCards.tsx","../src/editor/InputListEditor.tsx","../src/editor/TargetSelector.tsx","../src/editor/EndpointEditor.tsx","../src/editor/FunctionEditor.tsx"],"sourcesContent":["/**\n * T1.2.1: which `CodeBlock`/editor grammar a document's persisted `format`\n * maps to. A named `switch` over every `DocFormat` arm — mirrors\n * `rail-settings.ts`'s total-function idiom (`:36-102`): no `default:`, so a\n * sixth `DocFormat` value added later fails to compile here instead of\n * silently falling through to some default grammar. Split out into its own\n * `.ts` module (never `.tsx`) so `node --test` (`test:unit`'s glob is\n * `src/lib/__tests__/*.test.ts`) can pin the map directly, the same reason\n * `rail-settings.ts`/`alias-rail.ts` exist as standalone modules.\n *\n * All five `CodeLanguage` arms used below are already members of\n * `CodeBlock`'s exported union (`packages/ui/src/CodeBlock.tsx:52-68`) — no\n * new Prism grammar registration is needed.\n */\nimport type { DocFormat } from \"@w6w/sdk\";\nimport type { CodeLanguage } from \"@w6w/ui\";\n\nexport function codeLanguageForDocFormat(format: DocFormat): CodeLanguage {\n switch (format) {\n case \"yaml\":\n return \"yaml\";\n case \"json\":\n return \"json\";\n case \"markdown\":\n return \"markdown\";\n case \"html\":\n return \"markup\";\n case \"text\":\n return \"plaintext\";\n }\n}\n","/**\n * `<DocumentEditor documentId>` — one document: its key, its content (read-only, highlighted) and,\n * for a private document, Edit and Delete. No repository sync and no \"synced from\" markers; a host\n * adds those around it.\n */\nimport { CodeBlock, Copyable, DeleteButton, EditButton } from \"@w6w/ui\";\nimport type { ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { CallFromCodeButton } from \"../chrome/CallFromCodeButton.tsx\";\nimport { ConfirmModal } from \"../chrome/ConfirmModal.tsx\";\nimport { DocumentFormModal } from \"../forms/DocumentFormModal.tsx\";\nimport { useEditorProject } from \"../project-context.ts\";\nimport { useDeleteDocumentMutation, useDocumentQuery } from \"../repos/documents.ts\";\nimport { codeLanguageForDocFormat } from \"./doc-format.ts\";\n\nexport interface DocumentEditorSlots {\n /** Replaces the default heading (the key as an `<h3>`). `null`: none. */\n header?: ReactNode;\n /** Replaces the default action row (Call from code, Edit, Delete). `null`: none. */\n actions?: ReactNode;\n /** Replaces the not-found body. `null`: nothing. */\n empty?: ReactNode;\n}\n\nexport interface DocumentEditorProps {\n documentId: string;\n /** Omitted: the provider's project. `null` or `\"\"`: none; nothing is read and writes refuse. */\n project?: string | null;\n /** Called once, AFTER the delete succeeded. */\n onDeleted?: () => void;\n /** Given, the not-found body offers a \"Back to documents\" control that calls it. */\n onBack?: () => void;\n slots?: DocumentEditorSlots;\n}\n\nexport function DocumentEditor({\n documentId,\n project,\n onDeleted,\n onBack,\n slots,\n}: DocumentEditorProps) {\n const p = useEditorProject(project);\n const docQuery = useDocumentQuery(documentId, p ?? undefined, p != null);\n const deleteMut = useDeleteDocumentMutation();\n const [editing, setEditing] = useState(false);\n const [deletePending, setDeletePending] = useState(false);\n\n // isPending, not isLoading: the query is disabled while the project is unresolved, so\n // `isLoading` (pending AND fetching) would be false there and \"not found\" would flash.\n if (docQuery.isPending) {\n return (\n <div className=\"w6w-embed-root\">\n <p className=\"muted\">Loading…</p>\n </div>\n );\n }\n const doc = docQuery.data;\n if (!doc) {\n const empty =\n slots?.empty === undefined ? (\n <>\n <h3>Document not found</h3>\n {onBack && (\n <button type=\"button\" className=\"btn ghost\" onClick={onBack}>\n Back to documents\n </button>\n )}\n </>\n ) : (\n slots.empty\n );\n return <div className=\"w6w-embed-root\">{empty}</div>;\n }\n\n const header = slots?.header === undefined ? <h3>{doc.key}</h3> : slots.header;\n const actions =\n slots?.actions === undefined ? (\n <div className=\"card\">\n <div style={{ display: \"flex\", gap: \"var(--w6w-sp-1-5)\" }}>\n <CallFromCodeButton resource={{ kind: \"document\", key: doc.key }} />\n {!doc.shared && (\n <>\n <EditButton\n label=\"Edit\"\n onClick={() => setEditing(true)}\n data-testid=\"document-editor-edit\"\n />\n <DeleteButton\n label=\"Delete\"\n onClick={() => setDeletePending(true)}\n disabled={deleteMut.isPending}\n data-testid=\"document-editor-delete\"\n />\n </>\n )}\n </div>\n </div>\n ) : (\n slots.actions\n );\n\n return (\n <div className=\"w6w-embed-root w6w-doc-editor\">\n {header}\n {actions}\n\n <div className=\"card\">\n <h3>Key</h3>\n <Copyable value={doc.key} readOnly>\n {/* `.w6w-copyable`'s flex rule targets `> input, > textarea, > pre`, never `> code`, so\n a bare `<code>` keeps flexbox's min-content floor and can push the copy button out\n of a narrow box unless told to shrink. */}\n <code\n style={{\n overflowWrap: \"anywhere\",\n display: \"block\",\n minWidth: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n flex: 1,\n }}\n >\n {doc.key}\n </code>\n </Copyable>\n </div>\n\n <div className=\"card\">\n <h3>Content</h3>\n <p className=\"muted small\">\n Format <code>{doc.format}</code>. Stored verbatim — this is a read-only view, not a\n rendered preview.\n </p>\n <CodeBlock\n code={doc.content}\n language={codeLanguageForDocFormat(doc.format)}\n showLineNumbers\n />\n </div>\n\n {editing && (\n <DocumentFormModal\n initial={doc}\n project={p}\n onClose={() => setEditing(false)}\n onSaved={() => setEditing(false)}\n />\n )}\n\n {deletePending && (\n <ConfirmModal\n title=\"Delete document\"\n message={`Delete the document \"${doc.key}\"? This cannot be undone.`}\n confirmLabel=\"Delete\"\n onConfirm={() => {\n setDeletePending(false);\n if (p == null) return;\n deleteMut.mutate({ id: doc.id, project: p }, { onSuccess: () => onDeleted?.() });\n }}\n onClose={() => setDeletePending(false)}\n />\n )}\n </div>\n );\n}\n","/**\n * The pure half of `<EndpointEditor>` — loadable by `node --test` (no React, no `@w6w/ui`).\n *\n * - {@link BLANK_TARGET} / {@link normalizeEndpoint}: the hydration boundary. A server definition\n * with no `target` (a draft, HITL-8) must still leave `target` defined, because every read in\n * the editor does `target.kind` unguarded.\n * - {@link buildEndpointSaveBody}: the ONE body a Save posts. An unbound target and an untouched\n * empty Input are absent from the wire, never `null`/`[]`.\n * - {@link urlOptions} / {@link selectedUrlEntry} / {@link urlCardEntry}: which of the\n * server-rendered invoke URLs the card shows. Every string is the server's, verbatim.\n */\nimport type { EndpointDef, EndpointOwnTarget, InvokeUrlOption } from \"../repos/endpoints.ts\";\nimport { inputsForSave } from \"./input-seeding.ts\";\nimport { targetIsBound } from \"./target-fields.ts\";\n\n/** A blank `action` target — what an absent `target` hydrates to. */\nexport const BLANK_TARGET: EndpointOwnTarget = {\n kind: \"action\",\n uses: { app: \"\", action: \"\", connection: null },\n};\n\n/** `target` falls back to {@link BLANK_TARGET} and `input` to `[]`, only when absent. */\nexport function normalizeEndpoint(e: EndpointDef): EndpointDef {\n return { input: [], ...e, target: e.target ?? BLANK_TARGET };\n}\n\n/**\n * The exact body a Save posts. Unbound target ⇒ no `target` key; empty Input ⇒ no `input` key\n * (a documented pass-through mode server-side — saving `[]` would persist a spurious list). The\n * key is trimmed. Everything else, secrets included, passes through unchanged.\n */\nexport function buildEndpointSaveBody(draft: EndpointDef): Record<string, unknown> {\n const { target, input, ...rest } = normalizeEndpoint(draft);\n const body: Record<string, unknown> = {\n ...rest,\n key: String(draft.key ?? \"\").trim(),\n };\n if (targetIsBound(target)) body.target = target;\n const inputs = inputsForSave(input ?? [], { emptyMeansPassthrough: true });\n if (inputs !== undefined) body.input = inputs;\n return body;\n}\n\n/** Which of the two server-rendered forms of the URL is on screen. */\nexport type UrlForm = \"id\" | \"key\";\n\n/** The domain picker's options: only when there IS a second option (≤ 1 ⇒ `undefined`). */\nexport function urlOptions(\n invokeUrls: InvokeUrlOption[] | null | undefined,\n): InvokeUrlOption[] | undefined {\n return invokeUrls && invokeUrls.length > 1 ? invokeUrls : undefined;\n}\n\n/** The entry the card shows: the session pick (by domain NAME), else `default`, else the first. */\nexport function selectedUrlEntry(\n invokeUrls: InvokeUrlOption[] | null | undefined,\n pickedDomain: string | null,\n): InvokeUrlOption | null {\n const options = urlOptions(invokeUrls);\n if (!options) return null;\n return (\n options.find((u) => u.domain === pickedDomain) ?? options.find((u) => u.default) ?? options[0]\n );\n}\n\n/** What the URL card renders: the selected domain's entry, else the flat envelope fields. */\nexport function urlCardEntry(\n selected: InvokeUrlOption | null,\n invokeUrl: string | undefined,\n invokeUrlByKey: string | undefined,\n): { url: string; urlByKey?: string; resolves: boolean } {\n return (\n selected ?? {\n url: invokeUrl ?? \"\",\n urlByKey: invokeUrlByKey,\n resolves: true,\n }\n );\n}\n","import type { ReactNode } from \"react\";\nimport { ExecutionProfileHeader } from \"../chrome/ExecutionProfileHeader.tsx\";\nimport { descriptorFor } from \"../lib/callable-descriptors.ts\";\nimport type { CallableKind } from \"../lib/callable-kind.ts\";\nimport type { CallableEditorNavigation, CallableEditorSlots } from \"./types.ts\";\n\nexport interface CallableEditorFrameProps {\n /** Which kind's copy (back/save labels, not-found heading) the frame shows. */\n kind: CallableKind;\n /** The heading's text — the kind computes it from its own draft, because only it knows what\n * \"empty\" means for its definition. */\n title: string;\n /** Renders the `incomplete` badge beside the heading. */\n incomplete: boolean;\n canSave: boolean;\n isSaving: boolean;\n onSave: () => void;\n error: string | null;\n /** A 404 from the hydration GET: render the not-found card, never a blank editable form. */\n notFound: boolean;\n /** Where the host should take the user; back asks for `{ type: \"list\" }`. */\n onNavigate: (to: CallableEditorNavigation) => void;\n slots?: CallableEditorSlots;\n /** Statements BETWEEN the error banner and the body — the save-gate explanation, \"Saved.\". */\n banners?: ReactNode;\n /** Rendered as the FIRST child of the header action row, before Save (e.g. a JSON toggle). */\n headerActions?: ReactNode;\n children: ReactNode;\n}\n\n/**\n * The shared editor frame of the Function and Endpoint editors: back control, heading with the\n * `incomplete` badge, Save, the error banner and the body (or the not-found card). Router-free —\n * it asks the host to navigate through `onNavigate` and sets no document title. It publishes\n * nothing to the rail workspace either: each editor body does that itself (`useWorkspace`).\n */\nexport function CallableEditorFrame(props: CallableEditorFrameProps) {\n const descriptor = descriptorFor(props.kind);\n const slots = props.slots;\n const backLabel = slots?.backLabel ?? descriptor.editor.backLabel;\n const goBack = () => props.onNavigate({ type: \"list\" });\n\n if (props.notFound) {\n return (\n <div>\n <button type=\"button\" className=\"btn ghost\" onClick={goBack}>\n {backLabel}\n </button>\n <div className=\"card\">\n <h3>{descriptor.editor.notFoundTitle}</h3>\n <p className=\"error\">{props.error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"exec-profile-editor\">\n {slots?.header ?? (\n <ExecutionProfileHeader\n onBack={goBack}\n backLabel={backLabel}\n title={{ editable: false, value: props.title }}\n titleAdornment={\n props.incomplete && <span className=\"badge status-failed\">incomplete</span>\n }\n actions={\n <>\n {props.headerActions}\n <button\n type=\"button\"\n className=\"btn\"\n disabled={!props.canSave}\n onClick={props.onSave}\n >\n {props.isSaving ? \"Saving…\" : descriptor.editor.saveLabel}\n </button>\n {slots?.headerActions}\n </>\n }\n />\n )}\n\n <div className=\"exec-profile-body\">\n {props.error && <div className=\"error\">{props.error}</div>}\n {props.banners}\n {props.children}\n </div>\n </div>\n );\n}\n","import { useQueryClient } from \"@tanstack/react-query\";\nimport { ApiError } from \"@w6w/sdk\";\nimport { Copyable } from \"@w6w/ui\";\nimport { useState } from \"react\";\nimport { coerceInput } from \"../lib/coerce-input.ts\";\nimport type { UrlForm } from \"../lib/endpoint-editor.ts\";\nimport { historyKeys } from \"../lib/history-query.ts\";\nimport {\n type EndpointAuthMode,\n type EndpointInput,\n type EndpointSecurity,\n type InvokeUrlOption,\n SECRET_MASK,\n useInvokeEndpointMutation,\n} from \"../repos/endpoints.ts\";\n\n/** The auth modes offered, in the order an operator is likely to want them. */\nconst AUTH_MODES: Array<{\n value: EndpointAuthMode;\n label: string;\n hint: string;\n}> = [\n {\n value: \"platform\",\n label: \"Platform auth (default)\",\n hint: \"A w6w token or a partner OIDC token, exactly like the rest of the API. The call runs as the caller.\",\n },\n {\n value: \"none\",\n label: \"None — public\",\n hint: \"Anyone with the URL can invoke this. The call runs as this Endpoint's owner.\",\n },\n {\n value: \"basic\",\n label: \"Basic auth\",\n hint: \"HTTP Basic with the username and password below.\",\n },\n {\n value: \"header\",\n label: \"Header auth\",\n hint: \"The named header must carry the value below.\",\n },\n {\n value: \"jwt\",\n label: \"JWT (HMAC)\",\n hint: \"A Bearer JWT, verified HS256 against the shared secret below.\",\n },\n];\n\n/**\n * The Endpoint's callable URL — its own card, directly beneath Identity.\n *\n * **Every URL here comes from the SERVER, verbatim** (the `[\"endpoint\", id]` envelope's\n * `invokeUrl`, `invokeUrlByKey` and `invokeUrls[]`): this component picks between strings and\n * renders one. It holds no hostname, no path grammar and no account slug. `entry.urlByKey` is\n * absent until the server renders it; then the card is one URL line and one Copy button, no\n * id/key toggle. `domainOptions` renders the domain `<select>` only when there is a second option\n * (`lib/endpoint-editor.ts`'s `urlOptions` does that collapse).\n */\nexport function UrlCard(props: {\n entry: { url: string; urlByKey?: string; resolves: boolean };\n domainOptions?: InvokeUrlOption[];\n urlDomain: string | null;\n onUrlDomain: (domain: string) => void;\n urlForm: UrlForm;\n onUrlForm: (form: UrlForm) => void;\n}) {\n const { entry, domainOptions, urlDomain, onUrlDomain, urlForm, onUrlForm } = props;\n const hasByKey = entry.urlByKey !== undefined && entry.urlByKey !== \"\";\n const shown = urlForm === \"key\" && entry.urlByKey ? entry.urlByKey : entry.url;\n\n return (\n <div className=\"card\">\n <h3>URL</h3>\n {domainOptions && (\n <label className=\"field\">\n <span>Domain</span>\n <select\n data-testid=\"url-domain\"\n value={urlDomain ?? domainOptions[0]?.domain}\n onChange={(e) => onUrlDomain(e.target.value)}\n >\n {domainOptions.map((u) => (\n <option key={u.domain} value={u.domain}>\n {u.domain +\n (u.default ? \" · default\" : \"\") +\n (u.resolves ? \"\" : \" · not routable yet\")}\n </option>\n ))}\n </select>\n </label>\n )}\n {hasByKey && (\n <fieldset className=\"seg\" aria-label=\"URL form\">\n {(\n [\n [\"id\", \"By id\", \"The stable, host-issued address. Never changes.\"],\n [\"key\", \"By key\", \"The readable address, built from the account and this key.\"],\n ] as const\n ).map(([form, label, title]) => (\n <button\n key={form}\n type=\"button\"\n className={`seg-btn${urlForm === form ? \" active\" : \"\"}`}\n aria-pressed={urlForm === form}\n data-testid={`url-form-${form}`}\n title={title}\n onClick={() => onUrlForm(form)}\n >\n {label}\n </button>\n ))}\n </fieldset>\n )}\n <div className=\"row\" style={{ alignItems: \"center\", gap: \"var(--w6w-sp-2)\" }}>\n <Copyable value={shown} readOnly>\n <code style={{ overflowWrap: \"anywhere\" }}>\n <strong>POST</strong> <span data-testid=\"invoke-url\">{shown || \"…\"}</span>\n </code>\n </Copyable>\n </div>\n {!entry.resolves && (\n <p className=\"muted small\" data-testid=\"url-unroutable\">\n Not routable yet — this domain has no DNS or TLS behind it, so a call to this address will\n not answer.\n </p>\n )}\n <p className=\"muted small\" style={{ marginTop: \"var(--w6w-sp-2)\" }}>\n Send the declared input as a JSON body.\n </p>\n </div>\n );\n}\n\n/**\n * Who may call the URL above.\n *\n * Every mode except `platform` runs the target as the Endpoint's owner (there is no platform\n * identity on such a request), which is what the warning below says before an operator switches off\n * platform auth. Secrets are write-only: the server returns a mask for a configured secret, and\n * saving the mask back keeps the stored value.\n */\nexport function SecurityCard(props: {\n security: EndpointSecurity;\n onPatch: (next: Partial<EndpointSecurity>) => void;\n}) {\n const { security, onPatch } = props;\n const mode = security.auth;\n\n return (\n <div className=\"card\">\n <h3>Security</h3>\n\n <label className=\"field\">\n <span>Who may call it</span>\n <select\n value={mode}\n onChange={(e) => onPatch({ auth: e.target.value as EndpointAuthMode })}\n >\n {AUTH_MODES.map((m) => (\n <option key={m.value} value={m.value}>\n {m.label}\n </option>\n ))}\n </select>\n <span className=\"hint\">{AUTH_MODES.find((m) => m.value === mode)?.hint}</span>\n </label>\n\n {mode !== \"platform\" && (\n <p className=\"muted small\">\n <strong>Runs as this Endpoint's owner.</strong> A caller authenticated by the policy above\n carries no w6w identity, so the target runs with the connections and data of whoever owns\n this Endpoint.\n </p>\n )}\n\n {mode === \"basic\" && (\n <>\n <label className=\"field\">\n <span>Username</span>\n <input\n type=\"text\"\n value={security.basicUser ?? \"\"}\n onChange={(e) => onPatch({ basicUser: e.target.value })}\n />\n </label>\n <SecretField\n label=\"Password\"\n value={security.basicPassword}\n onChange={(v) => onPatch({ basicPassword: v })}\n />\n </>\n )}\n\n {mode === \"header\" && (\n <>\n <label className=\"field\">\n <span>Header name</span>\n <input\n type=\"text\"\n placeholder=\"X-API-Key\"\n value={security.headerName ?? \"\"}\n onChange={(e) => onPatch({ headerName: e.target.value })}\n />\n </label>\n <SecretField\n label=\"Header value\"\n value={security.headerValue}\n onChange={(v) => onPatch({ headerValue: v })}\n />\n </>\n )}\n\n {mode === \"jwt\" && (\n <SecretField\n label=\"JWT secret (HS256)\"\n value={security.jwtSecret}\n onChange={(v) => onPatch({ jwtSecret: v })}\n />\n )}\n </div>\n );\n}\n\n/**\n * A write-only secret input. A stored secret comes back as {@link SECRET_MASK}; the input renders\n * EMPTY (the mask is never a DOM value) with the \"stored — type to replace\" hint, and the buffer\n * keeps the mask until the operator types, so a save that never touches it preserves what is stored.\n */\nexport function SecretField(props: {\n label: string;\n value: string | undefined;\n onChange: (v: string) => void;\n}) {\n const stored = props.value === SECRET_MASK;\n return (\n <label className=\"field\">\n <span>{props.label}</span>\n <input\n type=\"password\"\n value={stored ? \"\" : (props.value ?? \"\")}\n placeholder={stored ? \"•••••••• (stored — type to replace)\" : \"\"}\n onChange={(e) => props.onChange(e.target.value)}\n />\n {stored && <span className=\"hint\">A secret is stored — type to replace it.</span>}\n </label>\n );\n}\n\n/**\n * Test-invoke panel: one field per declared input, POSTed to /endpoints/:id/invoke. The server\n * invokes the STORED definition, so unsaved edits are not what runs. The result is the\n * `kind`-tagged envelope: an Action or Function target answers with an inline `output`; a Workflow\n * target answers with a `runId` to poll.\n */\nexport function EndpointTestInvoke(props: {\n id: string;\n inputs: EndpointInput[];\n}) {\n const { id, inputs } = props;\n const [values, setValues] = useState<Record<string, string>>({});\n const [output, setOutput] = useState<unknown>(undefined);\n const [error, setError] = useState<string | null>(null);\n const qc = useQueryClient();\n const invokeMut = useInvokeEndpointMutation();\n\n const invoke = () => {\n const payload: Record<string, unknown> = {};\n for (const inp of inputs) {\n const coerced = coerceInput(inp.type, values[inp.key] ?? \"\");\n if (coerced !== undefined) payload[inp.key] = coerced;\n }\n invokeMut.mutate(\n { id, input: payload },\n {\n onSuccess: (out) => {\n setError(null);\n setOutput(out);\n },\n onError: (e) => {\n setOutput(undefined);\n setError(e instanceof ApiError ? e.message : (e as Error).message);\n },\n onSettled: () => qc.invalidateQueries({ queryKey: historyKeys.root }),\n },\n );\n };\n\n return (\n <div className=\"card\">\n <h3>Test invoke</h3>\n <p className=\"muted small\">\n Dispatches the saved Endpoint to its target. Save any edits first. An Action or Function\n target returns a value; a Workflow target returns a run id to poll.\n </p>\n {inputs.length === 0 && (\n <p className=\"muted small\">No declared inputs — the payload is passed through.</p>\n )}\n {inputs.map((inp) => {\n const fieldId = `ep-invoke-${id}-${inp.key || inp.label}`;\n return (\n <div className=\"field\" key={inp.key || inp.label}>\n <label htmlFor={fieldId}>\n {inp.label || inp.key}\n {inp.required && \" *\"}\n </label>\n {inp.type === \"boolean\" ? (\n <select\n id={fieldId}\n value={values[inp.key] ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, [inp.key]: e.target.value }))}\n >\n <option value=\"\">—</option>\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : (\n <input\n id={fieldId}\n type={inp.type === \"number\" ? \"number\" : \"text\"}\n value={values[inp.key] ?? \"\"}\n placeholder={inp.type === \"json\" ? \"{ }\" : (inp.hint ?? \"\")}\n onChange={(e) => setValues((v) => ({ ...v, [inp.key]: e.target.value }))}\n />\n )}\n </div>\n );\n })}\n <div className=\"row\">\n <button type=\"button\" className=\"btn\" disabled={invokeMut.isPending} onClick={invoke}>\n {invokeMut.isPending ? \"Invoking…\" : \"Invoke\"}\n </button>\n </div>\n {error && <div className=\"result error\">{error}</div>}\n {output !== undefined && (\n <pre className=\"result\" style={{ overflow: \"auto\" }}>\n {JSON.stringify(output, null, 2)}\n </pre>\n )}\n </div>\n );\n}\n","import { IconButton } from \"@w6w/ui\";\nimport type { ReactNode } from \"react\";\nimport { INPUT_TYPES, type InputRow } from \"../lib/input-seeding.ts\";\n\n/**\n * One input-row card, shared by the Functions \"Inputs\" editor and the\n * Endpoints \"Input\" editor (T3.2.1) — the two were byte-identical from\n * `<li key={i}>` through `</li>` on the merged branch, apart from the map\n * source variable (`draft.inputs` vs the `inputs` local alias for\n * `draft.input ?? []`). Controlled: the page owns `rows` as its `draft`'s\n * single source of truth and passes the next array back through `onChange`\n * on every add/update/remove — this component never holds its own copy.\n *\n * `emptyMeansPassthrough` carries the one real divergence between the two\n * forms: an Endpoint's declared `input` list absent/empty is a documented\n * pass-through mode, a Function's empty `inputs` just means \"no arguments\" —\n * so the empty-state copy (and nothing else) differs per page.\n */\nexport interface InputListEditorProps {\n rows: InputRow[];\n onChange: (next: InputRow[]) => void;\n /** The card's `<h3>` — \"Inputs\" (Functions) or \"Input\" (Endpoints). */\n title: string;\n /** The card's descriptive copy, caller-owned so wording stays per-surface. */\n description: ReactNode;\n /** Endpoints: `true` (the empty-state copy talks about pass-through). Functions: `false`. */\n emptyMeansPassthrough: boolean;\n /** Required target-field keys the current rows don't cover (HITL-1's post-touch flag). */\n uncoveredKeys?: string[];\n}\n\nexport function InputListEditor(props: InputListEditorProps) {\n const { rows, onChange, title, description, emptyMeansPassthrough, uncoveredKeys } = props;\n\n function addInput() {\n onChange([...rows, { key: \"\", label: \"\", type: \"string\" }]);\n }\n function updateInput(i: number, next: Partial<InputRow>) {\n onChange(rows.map((inp, idx) => (idx === i ? { ...inp, ...next } : inp)));\n }\n function removeInput(i: number) {\n onChange(rows.filter((_, idx) => idx !== i));\n }\n\n return (\n <div className=\"card\">\n <div className=\"row\" style={{ justifyContent: \"space-between\", alignItems: \"center\" }}>\n <h3>{title}</h3>\n <button type=\"button\" className=\"btn ghost\" onClick={addInput}>\n + Add input\n </button>\n </div>\n <p className=\"muted small\">{description}</p>\n {rows.length === 0 && (\n <p className=\"muted small\">\n {emptyMeansPassthrough ? \"No inputs — payload is passed through.\" : \"No inputs yet.\"}\n </p>\n )}\n <ul className=\"list\" data-testid=\"input-list\">\n {rows.map((inp, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: rows are positional and reorderable\n <li key={i} style={{ alignItems: \"center\", gap: 8 }}>\n <input\n type=\"text\"\n value={inp.key}\n placeholder=\"key\"\n aria-label=\"Input key\"\n onChange={(e) => updateInput(i, { key: e.target.value })}\n />\n <input\n type=\"text\"\n value={inp.label}\n placeholder=\"Label\"\n aria-label=\"Input label\"\n onChange={(e) => updateInput(i, { label: e.target.value })}\n />\n <select\n value={inp.type}\n aria-label=\"Input type\"\n onChange={(e) => updateInput(i, { type: e.target.value })}\n >\n {INPUT_TYPES.map((t) => (\n <option key={t} value={t}>\n {t}\n </option>\n ))}\n </select>\n <label className=\"row\" style={{ gap: 4, alignItems: \"center\" }}>\n <input\n type=\"checkbox\"\n checked={inp.required ?? false}\n onChange={(e) => updateInput(i, { required: e.target.checked })}\n />\n <span className=\"muted small\">required</span>\n </label>\n <IconButton\n danger\n icon=\"close\"\n label={`Remove input ${inp.key || i + 1}`}\n onClick={() => removeInput(i)}\n />\n </li>\n ))}\n </ul>\n {uncoveredKeys && uncoveredKeys.length > 0 && (\n <p className=\"muted small\" data-testid=\"input-uncovered\">\n Missing required field{uncoveredKeys.length > 1 ? \"s\" : \"\"} for the current target:{\" \"}\n {uncoveredKeys.join(\", \")}\n </p>\n )}\n </div>\n );\n}\n","import {\n type ActionParam,\n AppIcon,\n type BuiltStep,\n type ExprValue,\n ExpressionInput,\n type SecretValue,\n StepBuilderModal,\n} from \"@w6w/ui\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport {\n type TargetField,\n type WorkflowFieldCtx,\n type WorkflowLike,\n fieldsFromWorkflow,\n paramsToFields,\n targetRef as targetRefOf,\n} from \"../lib/target-fields.ts\";\nimport { CALL_APP } from \"../rail/ErrorHandlingTool.tsx\";\nimport { useAppActionsQuery } from \"../repos/apps.ts\";\nimport { useConnectionsForAppQuery } from \"../repos/connections.ts\";\nimport { useEndpointQuery, useEndpointsQuery } from \"../repos/endpoints.ts\";\nimport type { EndpointTarget } from \"../repos/endpoints.ts\";\nimport { useFunctionQuery, useFunctionsQuery } from \"../repos/functions.ts\";\nimport { useWorkflowQuery, useWorkflowsQuery } from \"../repos/workflows.ts\";\nimport type { TargetKind, TargetSelectorProps, TargetValue } from \"./TargetSelector.types.ts\";\nimport { useEditorApp } from \"./editor-apps.ts\";\n\nconst KIND_ORDER: readonly TargetKind[] = [\"action\", \"function\", \"workflow\", \"endpoint\"];\nconst KIND_LABEL: Record<TargetKind, string> = {\n action: \"Action (synchronous)\",\n function: \"Function (synchronous)\",\n workflow: \"Workflow (asynchronous)\",\n endpoint: \"Endpoint (dispatches to another Endpoint)\",\n};\n\n/**\n * One `target` picker for both the Functions editor's Implementation card and\n * the Endpoints editor's Target card (rfcs/endpoint.md:339-347,\n * rfcs/function.md:61-62). `allowedKinds` is the type-level RFC guard (A1,\n * see `TargetSelector.types.ts`) — Functions passes `[\"action\"]`, which makes\n * `{kind:\"function\"}`/`{kind:\"workflow\"}` unconstructable at that call site\n * and renders no kind control at all (A2); Endpoints passes all three.\n *\n * Owns every fetch its three arms need (apps/actions/connections for `action`;\n * the functions/workflows lists plus the picked one's own detail for the\n * other two — A8, gated `useQuery`s, mirroring the pages' existing\n * `actionsQuery` gating) and reuses `StepBuilderModal` verbatim for the\n * `action` arm (A3) — this is the one remaining `<StepBuilderModal` call\n * site; no second app/action picker.\n *\n * Resolves the picked target to a normalized `TargetField[]` (A5) and reports\n * it via `onResolved` on every change, so a page's own `useEffect` can seed\n * its input list from the same fields the mapping table below renders from\n * (A7) — by the time that table can render, `inputs.*` already resolves.\n *\n * **Takes no `exprOptions`.** The ƒx rail its mapping rows and its picker modal\n * offer is INHERITED — the app shell contributes the project's vars/secrets/\n * documents, the page contributes its `inputs` — so every expression editor\n * reachable from this card sees the same sources wherever it is opened. It used\n * to take the scope as a prop and wrap only the picker modal in a provider,\n * which is precisely how the mapping rows' `ƒx` toggles ended up offering an\n * empty rail while the \"Change\" button offered the full one.\n */\nexport function TargetSelector<K extends TargetKind>(props: TargetSelectorProps<K>) {\n const { allowedKinds, value, onChange, onResolved, title, description, passthroughHint } = props;\n const [pickerOpen, setPickerOpen] = useState(false);\n\n // Internally this operates on the full wire union — at runtime `value`\n // genuinely IS one of the three arms regardless of what `K` the caller\n // narrowed to; only the outward-facing generic signature is what enforces\n // A1's guard at the call site (TargetSelector.types.ts).\n const target = value as EndpointTarget;\n const kind = target.kind;\n const allowsKind = (k: TargetKind) => (allowedKinds as readonly TargetKind[]).includes(k);\n\n function emit(next: EndpointTarget) {\n onChange(next as unknown as TargetValue<K>);\n }\n\n const actionTarget = target.kind === \"action\" ? target : undefined;\n const app = actionTarget?.uses.app ?? \"\";\n const actionKey = actionTarget?.uses.action ?? \"\";\n const ref = targetRefOf(target);\n\n // This card already knows the EXACT bound app id, so resolving it never needs the whole\n // catalog: the host API's bounded `listAppsByIds` (`useEditorApp`). An empty id means\n // \"nothing selected yet\" and issues no request.\n const selectedAppSummary = useEditorApp(app);\n\n // `isTriggerApp`/`asFieldDefs` come from a LAZY `@w6w/ui/flow` import (the editor tree carries no\n // static flow import — `WorkflowEditor`'s `flowHelpers` idiom). The workflow arm's fields wait\n // for it exactly as they wait for the workflow detail query.\n const [flowHelpers, setFlowHelpers] = useState<WorkflowFieldCtx | null>(null);\n useEffect(() => {\n let canceled = false;\n import(\"@w6w/ui/flow\").then((m) => {\n if (canceled) return;\n setFlowHelpers({ isTriggerApp: m.isTriggerApp, asFieldDefs: m.asFieldDefs });\n });\n return () => {\n canceled = true;\n };\n }, []);\n const actionsQuery = useAppActionsQuery(app, app !== \"\");\n const connectionsQuery = useConnectionsForAppQuery(app, app !== \"\");\n const selectedAction = useMemo(\n () => (actionsQuery.data ?? []).find((a) => a.key === actionKey),\n [actionsQuery.data, actionKey],\n );\n\n /** Which callable tabs the picker offers — exactly this card's own\n * `allowedKinds`, so a call site that cannot accept a Workflow never sees\n * its tab. `endpoint` has no tab at all (F-2.0: \"no endpoints\"). */\n const callableFamilies = ([\"function\", \"workflow\"] as const).filter(allowsKind);\n\n /** The picker modal's heading, derived from this card's own so it always\n * names what the author is choosing — \"Choose implementation\" on the\n * Functions page, \"Choose target\" on Endpoints, \"Choose reroute target\"\n * from the rail. Never the old hard-coded \"Choose an action\", which stopped\n * being true the moment the Functions/Workflows tabs appeared here. */\n const pickerTitle = `Choose ${title.charAt(0).toLowerCase()}${title.slice(1)}`;\n\n const functionsQuery = useFunctionsQuery(allowsKind(\"function\"));\n const workflowsQuery = useWorkflowsQuery(undefined, allowsKind(\"workflow\"));\n const endpointsQuery = useEndpointsQuery(allowsKind(\"endpoint\"));\n const functionDetailQuery = useFunctionQuery(ref, kind === \"function\" && ref !== \"\");\n const workflowDetailQuery = useWorkflowQuery(ref, kind === \"workflow\" && ref !== \"\");\n const endpointDetailQuery = useEndpointQuery(ref, kind === \"endpoint\" && ref !== \"\");\n\n // A5: one normalized field list across four genuinely different sources.\n const fields = useMemo<TargetField[]>(() => {\n if (kind === \"action\") return paramsToFields(selectedAction?.params ?? []);\n if (kind === \"function\") return paramsToFields(functionDetailQuery.data?.inputs ?? []);\n if (kind === \"workflow\") {\n if (!flowHelpers) return [];\n return fieldsFromWorkflow(\n workflowDetailQuery.data?.workflow as WorkflowLike | undefined,\n flowHelpers,\n );\n }\n if (kind === \"endpoint\") {\n return paramsToFields(endpointDetailQuery.data?.endpoint.input ?? []);\n }\n return [];\n }, [\n kind,\n selectedAction,\n functionDetailQuery.data,\n workflowDetailQuery.data,\n endpointDetailQuery.data,\n flowHelpers,\n ]);\n\n useEffect(() => {\n onResolved?.({ meta: { kind, ref: kind === \"action\" ? app : ref }, kind: kind as K, fields });\n }, [kind, app, ref, fields, onResolved]);\n\n /**\n * The modal's `onAdd`. Handles BOTH shapes the picker can emit, because the\n * picker now offers all three of F-2.0's homepage tabs here\n * (`Connected apps | Functions | Workflows`), not just the app one:\n *\n * - an app action → `{ uses: {app, action, connection}, with }`\n * - a callable → `{ uses: {app: \"@w6w/call\", action: \"call\"},\n * with: {targetKind, targetId, …} }`\n *\n * Anything else `@w6w/*` is a graph-only internal node and is ignored — the\n * modal is opened `appsOnly`, so those tabs are not even rendered; the guard\n * stays as a belt-and-braces refusal.\n */\n function pickTarget(built: BuiltStep) {\n // The callable arm, FIRST: `@w6w/call` also matches the `@w6w/` prefix the\n // internal-node guard below rejects, so ordering is load-bearing.\n if (built.uses.app === CALL_APP) {\n const w = (built.with ?? {}) as { targetKind?: unknown; targetId?: unknown };\n const family = w.targetKind === \"workflow\" ? \"workflow\" : \"function\";\n const id = typeof w.targetId === \"string\" ? w.targetId : \"\";\n // A pick with no id cannot be emitted — it would blank a bound target.\n if (!id) return;\n emit(\n family === \"workflow\"\n ? { kind: \"workflow\", workflow: id }\n : { kind: \"function\", function: id },\n );\n setPickerOpen(false);\n return;\n }\n if (built.uses.app.startsWith(\"@w6w/\")) return; // apps only; ignore internal nodes\n // Pin 6: preserve compatible mappings. The modal returns `built.with` as\n // the NEWLY picked action's params (every key it declares, seeded blank).\n // Carry forward every existing `with` cell whose key the new action still\n // declares, and drop the cells it does not - never a wholesale overwrite.\n const existingWith = target.kind === \"action\" ? (target.with ?? {}) : {};\n const newWith = built.with ?? {};\n const preservedWith: Record<string, unknown> = {};\n for (const key of Object.keys(newWith)) {\n preservedWith[key] = key in existingWith ? existingWith[key] : newWith[key];\n }\n emit({ kind: \"action\", uses: built.uses, with: preservedWith });\n setPickerOpen(false);\n }\n\n function updateWith(paramKey: string, value: unknown) {\n if (target.kind !== \"action\") return;\n const nextWith = { ...(target.with ?? {}) };\n if (value === \"\" || value === undefined) delete nextWith[paramKey];\n else nextWith[paramKey] = value;\n emit({ ...target, with: nextWith });\n }\n\n function handleKindChange(next: TargetKind) {\n emit(\n next === \"action\"\n ? { kind: \"action\", uses: { app: \"\", action: \"\", connection: null } }\n : next === \"function\"\n ? { kind: \"function\", function: \"\" }\n : next === \"workflow\"\n ? { kind: \"workflow\", workflow: \"\" }\n : { kind: \"endpoint\", endpoint: \"\" },\n );\n }\n\n function handleRefChange(next: string) {\n emit(\n kind === \"function\"\n ? { kind: \"function\", function: next }\n : kind === \"workflow\"\n ? { kind: \"workflow\", workflow: next }\n : { kind: \"endpoint\", endpoint: next },\n );\n }\n\n /** Display name for the currently-bound callable, from whichever list owns\n * it. Falls back to the raw id in the JSX while the list is still loading. */\n const pickedCallableLabel = useMemo(() => {\n if (!ref) return undefined;\n if (kind === \"function\") {\n const fn = functionsQuery.data?.find((f) => f.id === ref);\n return fn ? fn.displayName || fn.key : undefined;\n }\n if (kind === \"workflow\") {\n const wf = workflowsQuery.data?.find((w) => w.id === ref);\n return wf ? wf.displayName || wf.name : undefined;\n }\n return undefined;\n }, [kind, ref, functionsQuery.data, workflowsQuery.data]);\n\n // Filter parameters based on showIf conditions and whether they have values\n const actionParams = useMemo(() => {\n const params = (selectedAction?.params ?? []) as ActionParam[];\n const currentWith = actionTarget?.with ?? {};\n\n return params.filter((p) => {\n // First, check showIf conditions - hide if condition not met\n if (p.showIf) {\n const { field, equals, in: inArray, notIn, truthy } = p.showIf;\n const fieldValue = currentWith[field];\n\n // Evaluate the showIf predicate\n if (equals !== undefined && fieldValue !== equals) return false;\n if (inArray !== undefined && !inArray.includes(fieldValue as string | number | boolean)) {\n return false;\n }\n if (notIn?.includes(fieldValue as string | number | boolean)) {\n return false;\n }\n if (truthy !== undefined && Boolean(fieldValue) !== truthy) return false;\n }\n\n // Then, show only: required fields OR fields that have been mapped\n const hasValue =\n p.key in currentWith && currentWith[p.key] !== \"\" && currentWith[p.key] !== undefined;\n return p.required || hasValue;\n });\n }, [selectedAction, actionTarget?.with]);\n\n return (\n <div className=\"card\">\n <h3>{title}</h3>\n <p className=\"muted small\">{description}</p>\n\n {allowedKinds.length > 1 && (\n <label className=\"field\">\n <span>Kind</span>\n <select value={kind} onChange={(e) => handleKindChange(e.target.value as TargetKind)}>\n {KIND_ORDER.filter(allowsKind).map((k) => (\n <option key={k} value={k}>\n {KIND_LABEL[k]}\n </option>\n ))}\n </select>\n </label>\n )}\n\n {kind === \"action\" && (\n <>\n {app && actionKey ? (\n <div className=\"row\" style={{ alignItems: \"center\", gap: 8 }}>\n <AppIcon\n src={selectedAppSummary?.iconSvg}\n srcDark={selectedAppSummary?.iconSvgDark}\n brandColor={selectedAppSummary?.brandColor}\n name={app}\n />\n <span className=\"list-main\">\n <strong>{selectedAction?.title ?? actionKey}</strong>{\" \"}\n <code className=\"muted\">{app}</code>\n <span className=\"muted small block\">\n {actionTarget?.uses.connection\n ? `via ${\n connectionsQuery.data?.find((c) => c.id === actionTarget.uses.connection)\n ?.displayName ?? actionTarget.uses.connection\n }`\n : \"no connection\"}\n </span>\n </span>\n <button type=\"button\" className=\"btn ghost\" onClick={() => setPickerOpen(true)}>\n Change\n </button>\n </div>\n ) : (\n <button type=\"button\" className=\"btn\" onClick={() => setPickerOpen(true)}>\n + Choose an action\n </button>\n )}\n\n {actionKey && (\n <div style={{ marginTop: 12 }}>\n <h4>Input mapping</h4>\n <p className=\"muted small\">\n Map each action param from the inputs above. Reference an input with{\" \"}\n <code>inputs.&lt;key&gt;</code>; anything else is a literal.\n {passthroughHint &&\n \" Leave every cell blank to pass the inbound payload through as the action's params.\"}\n </p>\n {actionParams.length === 0 ? (\n <p className=\"muted small\">This action declares no params.</p>\n ) : (\n <ul className=\"list\">\n {actionParams.map((p) => (\n <li key={p.key} style={{ alignItems: \"center\", gap: 8 }}>\n <span className=\"list-main\">\n <code>{p.key}</code>\n {p.required && <span className=\"muted small\"> · required</span>}\n </span>\n <div style={{ flex: 1 }}>\n <ExpressionInput\n value={\n actionTarget?.with?.[p.key] as\n | string\n | ExprValue\n | SecretValue\n | undefined\n }\n onChange={(next) => updateWith(p.key, next)}\n placeholder={`inputs.${p.key}`}\n aria-label={`Mapping for ${p.key}`}\n />\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </>\n )}\n\n {/* Functions/Workflows go through the SAME modal the action arm uses —\n F-2.0's \"same flow as we do today for selecting action\", and the\n answer to its own `should we implement this everywhere … yes`. These\n two arms were bare `<select>`s, which is why the picker's Functions\n and Workflows tabs were unreachable from this card. */}\n {(kind === \"function\" || kind === \"workflow\") && (\n <div className=\"row\" style={{ alignItems: \"center\", gap: 8 }}>\n {ref ? (\n <>\n <span className=\"list-main\">\n <strong>{pickedCallableLabel ?? ref}</strong> <code className=\"muted\">{ref}</code>\n <span className=\"muted small block\">\n {kind === \"function\" ? \"Function (synchronous)\" : \"Workflow (asynchronous)\"}\n </span>\n </span>\n <button type=\"button\" className=\"btn ghost\" onClick={() => setPickerOpen(true)}>\n Change\n </button>\n </>\n ) : (\n <button type=\"button\" className=\"btn\" onClick={() => setPickerOpen(true)}>\n + Choose a {kind}\n </button>\n )}\n </div>\n )}\n\n {pickerOpen && (\n /* No provider here. The scope this modal needs is INHERITED from\n the page (which contributes its `inputs`) over the app shell\n (vars/secrets/documents) — the same scope the mapping rows below\n see, which is the entire point: reaching the expression editor\n through \"Change\" and reaching it through a row's `ƒx` toggle must\n offer the identical rail. Wrapping only this modal is what made\n them disagree.\n\n ONE modal for the whole card, not one per arm: it now offers every\n kind this card allows, so which arm is showing decides only which\n tab it OPENS on, never whether it renders. */\n <StepBuilderModal\n appsOnly\n callables={callableFamilies}\n initialTab={kind === \"function\" || kind === \"workflow\" ? `${kind}s` : \"connected\"}\n title={pickerTitle}\n onClose={() => setPickerOpen(false)}\n onAdd={pickTarget}\n initialApp={actionTarget && app ? selectedAppSummary : undefined}\n initialAction={actionTarget ? actionKey : undefined}\n initialConnection={actionTarget?.uses.connection ?? undefined}\n initialWith={actionTarget?.with}\n />\n )}\n\n {kind === \"endpoint\" && (\n <label className=\"field\">\n <span>Endpoint</span>\n <select value={ref} onChange={(e) => handleRefChange(e.target.value)}>\n <option value=\"\">— pick an endpoint —</option>\n {endpointsQuery.data?.map((ep) => (\n <option key={ep.id} value={ep.id}>\n {ep.displayName || ep.key} ({ep.id})\n </option>\n ))}\n </select>\n </label>\n )}\n </div>\n );\n}\n","import { ApiError } from \"@w6w/sdk\";\nimport { type ExpressionOptions, ExpressionOptionsProvider, IconButton } from \"@w6w/ui\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { HistoryButton } from \"../chrome/HistoryButton.tsx\";\nimport { JsonToggle, JsonToggleButton } from \"../chrome/JsonToggle.tsx\";\nimport { useWorkspace } from \"../chrome/workspace.tsx\";\nimport { useEndpointDraft } from \"../draft/index.ts\";\nimport { EndpointIdentityModal } from \"../forms/CreateEndpointModal.tsx\";\nimport { descriptorFor } from \"../lib/callable-descriptors.ts\";\nimport {\n type UrlForm,\n buildEndpointSaveBody,\n normalizeEndpoint,\n selectedUrlEntry,\n urlCardEntry,\n urlOptions,\n} from \"../lib/endpoint-editor.ts\";\nimport { uncoveredForEndpoint } from \"../lib/input-coverage.ts\";\nimport { mergeSeed, shouldSeed, uncoveredRequiredKeys } from \"../lib/input-seeding.ts\";\nimport { evaluateEdit } from \"../lib/rail-settings.ts\";\nimport type { TargetField } from \"../lib/target-fields.ts\";\nimport { useEditorProject } from \"../project-context.ts\";\nimport type { RailNavigation } from \"../rail/rail-env.tsx\";\nimport {\n type EndpointDef,\n type EndpointOwnTarget,\n type EndpointSecurity,\n useEndpointQuery,\n} from \"../repos/endpoints.ts\";\nimport { CallableEditorFrame } from \"./CallableEditorFrame.tsx\";\nimport { EditorShell } from \"./EditorShell.tsx\";\nimport { EndpointTestInvoke, SecurityCard, UrlCard } from \"./EndpointCards.tsx\";\nimport { InputListEditor } from \"./InputListEditor.tsx\";\nimport { TargetSelector } from \"./TargetSelector.tsx\";\nimport type { CallableEditorNavigation, EndpointEditorProps } from \"./types.ts\";\n\nconst NOOP = () => {};\n\nfunction messageOf(e: unknown): string {\n return e instanceof ApiError || e instanceof Error ? e.message : String(e);\n}\n\n/**\n * `<EndpointEditor endpointId>` — Studio's endpoint editor body (Identity, URL, Input, Target,\n * Security, Test invoke, History, JSON toggle) as a published component. The outermost element is\n * `.w6w-embed-root`; nothing goes through a portal.\n *\n * ## One cache, one draft\n *\n * Every field is the buffer of `useEndpointDraft` (seeded from, and refreshed by, the ONE\n * `[\"endpoint\", id]` query), and every write — the header Save, the bottom Save and the JSON\n * toggle's Save — is that draft's `commit`, so each issues one POST carrying the stored\n * `updatedAt` (`If-Unmodified-Since`). A 409 `endpoint_stale` is shown inline with a Reload and is\n * never retried. The invoke URLs are read from the same query's envelope, never copied into state,\n * so a rail save or an external change shows without a remount.\n *\n * A Save with nothing changed since the last read sends no request (the draft is clean).\n *\n * ## Rail\n *\n * `rail` omitted: the editor owns a rail. `rail={false}` inside a `<CallableWorkspace>` for the\n * SAME endpoint id publishes into it; with `rail={false}` the rail saves use the WORKSPACE's\n * `project`, not the `project` prop here. A workspace for a different id is silently overridden\n * while this editor is mounted.\n */\nexport function EndpointEditor(props: EndpointEditorProps): ReactNode {\n const { endpointId, onNavigate = NOOP, slots, tools } = props;\n const project = useEditorProject(props.project);\n const railNavigate = useCallback(\n (to: RailNavigation) => (onNavigate as (to: RailNavigation) => void)(to),\n [onNavigate],\n );\n return (\n <div\n className=\"w6w-embed-root\"\n style={{ display: \"flex\", width: \"100%\", height: \"100%\", minHeight: 0 }}\n >\n <EditorShell\n project={project}\n onNavigate={railNavigate}\n rail={props.rail}\n tools={tools}\n storageKey={project === null ? null : `w6w.rail.embed.${project}`}\n >\n <div style={{ flex: 1, minWidth: 0, overflow: \"auto\" }}>\n <EndpointBody\n key={endpointId}\n id={endpointId}\n onNavigate={onNavigate as (to: CallableEditorNavigation) => void}\n slots={slots}\n />\n </div>\n </EditorShell>\n </div>\n );\n}\n\nfunction EndpointBody(props: {\n id: string;\n onNavigate: (to: CallableEditorNavigation) => void;\n slots: EndpointEditorProps[\"slots\"];\n}) {\n const { id, onNavigate, slots } = props;\n const descriptor = descriptorFor(\"endpoint\");\n\n // The envelope the invoke URLs come from — the draft reads the same entry (one GET).\n const envelope = useEndpointQuery(id).data;\n\n const [resolvedFields, setResolvedFields] = useState<TargetField[]>([]);\n const resolvedRef = useRef(resolvedFields);\n resolvedRef.current = resolvedFields;\n const pendingPickRef = useRef(false);\n const touchedRef = useRef(false);\n const [urlForm, setUrlForm] = useState<UrlForm>(\"id\");\n const [urlDomain, setUrlDomain] = useState<string | null>(null);\n const [showIdentity, setShowIdentity] = useState(false);\n const [saved, setSaved] = useState(false);\n const [showJson, setShowJson] = useState(false);\n const [json, setJson] = useState(\"\");\n const [jsonStored, setJsonStored] = useState({ id, key: \"\" });\n const [jsonError, setJsonError] = useState<string | null>(null);\n\n // The save gate also guards every non-button save path (hide, unmount, registry flush).\n const saveGuard = useCallback((def: Record<string, unknown>) => {\n const e = normalizeEndpoint(def as unknown as EndpointDef);\n const unfed = uncoveredForEndpoint({\n target: e.target,\n rows: e.input ?? [],\n fields: resolvedRef.current,\n });\n return unfed.length > 0 ? `The target needs: ${unfed.join(\", \")}` : null;\n }, []);\n const draft = useEndpointDraft({ id, saveGuard });\n\n const view = useMemo(\n () => (draft.definition ? normalizeEndpoint(draft.definition as unknown as EndpointDef) : null),\n [draft.definition],\n );\n const inputs = view?.input ?? [];\n const security: EndpointSecurity = view?.exposure?.security ?? {\n auth: \"platform\",\n };\n\n const options = urlOptions(envelope?.invokeUrls);\n const selected = selectedUrlEntry(envelope?.invokeUrls, urlDomain);\n\n useWorkspace({\n kind: \"endpoint\",\n id,\n label: view?.displayName || undefined,\n key: view?.key.trim() || undefined,\n invokeUrl: selected ? selected.url : envelope?.invokeUrl,\n invokeUrlByKey: selected ? selected.urlByKey : envelope?.invokeUrlByKey,\n urlForm,\n inputs: resolvedFields.map((f) => f.key),\n policy: draft.policy,\n onPolicyChange: draft.onPolicyChange,\n });\n\n const { setDefinition } = draft;\n const patch = useCallback(\n (next: Partial<EndpointDef>) => {\n setSaved(false);\n setDefinition((d) => ({\n ...normalizeEndpoint(d as unknown as EndpointDef),\n ...next,\n }));\n },\n [setDefinition],\n );\n const patchSecurity = (next: Partial<EndpointSecurity>) => {\n setSaved(false);\n setDefinition((d) => {\n const e = normalizeEndpoint(d as unknown as EndpointDef);\n const merged = {\n ...(e.exposure?.security ?? { auth: \"platform\" }),\n ...next,\n };\n return { ...e, exposure: { ...e.exposure, security: merged } };\n });\n };\n\n function onTargetChange(next: EndpointOwnTarget) {\n pendingPickRef.current = true;\n patch({ target: next });\n }\n\n // Seeds the Input list from a freshly picked target — never on hydration (`pendingPickRef` is set\n // only by a genuine in-session pick), never over a touched or non-empty list.\n // biome-ignore lint/correctness/useExhaustiveDependencies: keyed on resolvedFields only — inputs/patch are read for their current value, not to retrigger the seed on every edit.\n useEffect(() => {\n if (!pendingPickRef.current) return;\n if (!shouldSeed({ rows: inputs, touched: touchedRef.current })) {\n pendingPickRef.current = false;\n return;\n }\n if (resolvedFields.length === 0) return;\n patch({ input: mergeSeed(inputs, resolvedFields) });\n pendingPickRef.current = false;\n }, [resolvedFields]);\n\n const pageExprScope = useMemo<ExpressionOptions>(\n () => ({ inputs: inputs.map((inp) => inp.key).filter(Boolean) }),\n [inputs],\n );\n const uncoveredKeys = useMemo(\n () => uncoveredRequiredKeys(inputs, resolvedFields),\n [inputs, resolvedFields],\n );\n const unfedKeys = useMemo(\n () =>\n view\n ? uncoveredForEndpoint({\n target: view.target,\n rows: inputs,\n fields: resolvedFields,\n })\n : [],\n [view, inputs, resolvedFields],\n );\n\n // Rendered beside BOTH Save buttons: a greyed button with its explanation off-screen is the\n // mysterious kind.\n const saveBlockedNote =\n view && unfedKeys.length > 0 ? (\n <p className=\"error small\" data-testid=\"save-blocked\">\n Can’t save yet — the target needs{\" \"}\n {view.target.kind === \"action\"\n ? \"these required params mapped under Input mapping\"\n : \"these required keys declared under Input\"}\n : <strong>{unfedKeys.join(\", \")}</strong>\n </p>\n ) : null;\n\n const key = view?.key.trim() ?? \"\";\n const canSave = Boolean(key) && unfedKeys.length === 0 && draft.canSave;\n\n async function onSave() {\n if (!view) return;\n const out = await draft.commit(buildEndpointSaveBody(view) as Record<string, unknown>);\n setSaved(out.status === \"saved\");\n }\n\n function openJson() {\n if (!view) return;\n const body = buildEndpointSaveBody(view);\n setJson(JSON.stringify(body, null, 2));\n setJsonStored({ id: String(body.id), key: String(body.key) });\n setJsonError(null);\n setShowJson(true);\n }\n\n async function onJsonSave() {\n const evalResult = evaluateEdit(json, jsonStored);\n const parsed = evalResult.parsed;\n if (!parsed || evalResult.blockedReason) return;\n const out = await draft.commit(parsed as Record<string, unknown>);\n if (out.status === \"saved\" || out.status === \"clean\") {\n setJsonError(null);\n setShowJson(false);\n setSaved(out.status === \"saved\");\n } else if (out.status === \"failed\") setJsonError(messageOf(out.error));\n else setJsonError(out.reason);\n }\n\n const loadErr = draft.loadError;\n const notFound = loadErr instanceof ApiError && loadErr.status === 404;\n if (!view) {\n if (loadErr !== null && !notFound) {\n return (\n <div className=\"error\" role=\"alert\">\n {messageOf(loadErr)}\n </div>\n );\n }\n if (!notFound) return <p className=\"muted\">Loading…</p>;\n }\n\n const title = view\n ? view.displayName || view.key || descriptor.editor.newTitle\n : descriptor.editor.newTitle;\n const stateError = draft.error !== null && !draft.stale ? messageOf(draft.error) : null;\n const staleBanner =\n draft.stale || draft.changedElsewhere ? (\n <div className=\"error\" role=\"alert\" data-testid=\"endpoint-stale\">\n {draft.stale\n ? messageOf(draft.error)\n : \"This endpoint was changed elsewhere. Reload to see the new version (your edits will be discarded).\"}{\" \"}\n <button type=\"button\" className=\"btn ghost\" onClick={() => void draft.reload()}>\n Reload\n </button>\n </div>\n ) : null;\n\n return (\n <ExpressionOptionsProvider value={pageExprScope}>\n <CallableEditorFrame\n kind=\"endpoint\"\n title={title}\n incomplete={false}\n canSave={canSave}\n isSaving={draft.saving}\n onSave={() => void onSave()}\n error={notFound ? messageOf(loadErr) : stateError}\n notFound={notFound}\n onNavigate={onNavigate}\n slots={slots}\n headerActions={\n <>\n <HistoryButton kind=\"endpoint\" id={id} />\n <JsonToggleButton onClick={openJson} />\n </>\n }\n banners={\n <>\n {staleBanner}\n {saveBlockedNote}\n {saved && <span className=\"ok\">Saved.</span>}\n </>\n }\n >\n {view && (\n <>\n <div className=\"card\">\n <div className=\"section-head\">\n <h3>Identity</h3>\n <IconButton\n icon=\"edit-2\"\n label=\"Edit name, key, and description\"\n onClick={() => setShowIdentity(true)}\n />\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Display name</span>\n <span>{view.displayName || \"—\"}</span>\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Key</span>\n <code className=\"muted\">{view.key || \"—\"}</code>\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Description</span>\n <span>{view.description || \"—\"}</span>\n </div>\n </div>\n\n <UrlCard\n entry={urlCardEntry(selected, envelope?.invokeUrl, envelope?.invokeUrlByKey)}\n domainOptions={options}\n urlDomain={selected?.domain ?? null}\n onUrlDomain={setUrlDomain}\n urlForm={urlForm}\n onUrlForm={setUrlForm}\n />\n\n <InputListEditor\n title=\"Input\"\n description=\"The declared inbound contract. Reuses core Param fields. Leave empty to pass the raw request payload through to the target unchanged.\"\n emptyMeansPassthrough={true}\n rows={inputs}\n onChange={(next) => {\n touchedRef.current = true;\n patch({ input: next });\n }}\n uncoveredKeys={uncoveredKeys}\n />\n\n <TargetSelector\n allowedKinds={[\"action\", \"function\", \"workflow\"] as const}\n title=\"Target\"\n description={\n <>\n The single thing this Endpoint dispatches to. An <strong>Action</strong> target\n runs one app action directly and a <strong>Function</strong> target resolves\n synchronously to a value; a <strong>Workflow</strong> target enqueues an\n asynchronous run. Switching the target here preserves the key and the input\n contract below, so callers never break.\n </>\n }\n passthroughHint\n value={view.target}\n onChange={onTargetChange}\n onResolved={(t) => setResolvedFields(t.fields)}\n />\n\n <SecurityCard security={security} onPatch={patchSecurity} />\n\n <EndpointTestInvoke id={id} inputs={inputs} />\n\n <div\n className=\"row\"\n style={{\n justifyContent: \"flex-end\",\n alignItems: \"center\",\n gap: \"var(--w6w-sp-3)\",\n marginTop: \"var(--w6w-sp-4)\",\n }}\n >\n {saveBlockedNote}\n {saved && <span className=\"ok\">Saved.</span>}\n <button\n type=\"button\"\n className=\"btn\"\n disabled={!canSave}\n onClick={() => void onSave()}\n >\n {draft.saving ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n\n {showIdentity && (\n <EndpointIdentityModal\n initial={{\n key: view.key,\n displayName: view.displayName ?? \"\",\n description: view.description ?? \"\",\n }}\n onClose={() => setShowIdentity(false)}\n onSaved={(next) => {\n patch({\n displayName: next.displayName,\n description: next.description,\n });\n setShowIdentity(false);\n }}\n />\n )}\n\n <JsonToggle\n open={showJson}\n onClose={() => setShowJson(false)}\n title={`JSON — ${title}`}\n mode=\"disconnected\"\n value={json}\n onChange={setJson}\n guard={(t) => evaluateEdit(t, jsonStored).blockedReason}\n onSave={() => void onJsonSave()}\n saving={draft.saving}\n error={jsonError}\n editorLabel=\"Endpoint definition JSON\"\n />\n </>\n )}\n </CallableEditorFrame>\n </ExpressionOptionsProvider>\n );\n}\n","import { useQueryClient } from \"@tanstack/react-query\";\nimport { ApiError } from \"@w6w/sdk\";\nimport { type ExpressionOptions, ExpressionOptionsProvider, IconButton } from \"@w6w/ui\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { HistoryButton } from \"../chrome/HistoryButton.tsx\";\nimport { JsonToggle, JsonToggleButton } from \"../chrome/JsonToggle.tsx\";\nimport { useWorkspace } from \"../chrome/workspace.tsx\";\nimport { type CallableDraft, useFunctionDraft } from \"../draft/index.ts\";\nimport { FunctionIdentityModal } from \"../forms/CreateFunctionModal.tsx\";\nimport { coerceInput } from \"../lib/coerce-input.ts\";\nimport { historyKeys } from \"../lib/history-query.ts\";\nimport { uncoveredForFunction } from \"../lib/input-coverage.ts\";\nimport {\n inputsForSave,\n mergeSeed,\n shouldSeed,\n uncoveredRequiredKeys,\n} from \"../lib/input-seeding.ts\";\nimport { type EditStored, evaluateEdit } from \"../lib/rail-settings.ts\";\nimport { slugify } from \"../lib/slug.ts\";\nimport { type TargetField, implToTarget, targetToImpl } from \"../lib/target-fields.ts\";\nimport { useEditorProject } from \"../project-context.ts\";\nimport {\n type FunctionDef,\n type FunctionInput,\n type FunctionInvokeResult,\n useFunctionQuery,\n useInvokeFunctionMutation,\n} from \"../repos/functions.ts\";\nimport { CallableEditorFrame } from \"./CallableEditorFrame.tsx\";\nimport { EditorShell } from \"./EditorShell.tsx\";\nimport { InputListEditor } from \"./InputListEditor.tsx\";\nimport { TargetSelector } from \"./TargetSelector.tsx\";\nimport type { CallableEditorNavigation, FunctionEditorProps } from \"./types.ts\";\n\nconst NOOP = (): void => {};\n\nconst errMsg = (e: unknown): string => (e instanceof Error ? e.message : String(e));\n\n/**\n * The managed Function editor: Interface, Inputs, Implementation, Test invoke, History and a JSON\n * toggle, on `EditorShell`. The outermost element is `.w6w-embed-root`; nothing goes through a\n * portal.\n *\n * Every read and write goes through `useFunctionDraft` (one cache entry, `[\"function\", id]`; one\n * stale-write token). Save, the JSON toggle's Save and the rail's Error handling (`onPolicyChange`)\n * all persist through the draft, so each carries `If-Unmodified-Since`; a 409 shows inline with a\n * reload control and is never retried. `project` is not a save precondition (a Function is\n * account-scoped): it scopes the expression rail and the rail's storage key only.\n *\n * `rail` defaults to `true`: the editor renders its own right rail. `rail={false}` renders none and\n * publishes the Function (key, inputs, policy, `onPolicyChange`) into an enclosing\n * `<CallableWorkspace kind=\"function\" id>` for the SAME id; an editor whose id differs from its\n * workspace's overrides it and the host's rail renders empty. With `rail={false}` inside a\n * workspace, the rail's saves use that workspace's `project`, not this editor's `project` prop.\n * Aliases are not part of this editor; a host adds its own through `tools`.\n */\nexport function FunctionEditor(props: FunctionEditorProps): ReactNode {\n const { functionId, onNavigate = NOOP, slots, tools } = props;\n const project = useEditorProject(props.project);\n return (\n <div\n className=\"w6w-embed-root\"\n style={{ display: \"flex\", width: \"100%\", height: \"100%\", minHeight: 0 }}\n >\n <EditorShell\n project={project}\n onNavigate={onNavigate}\n rail={props.rail}\n tools={tools}\n storageKey={project === null ? null : `w6w.rail.embed.${project}`}\n >\n <FunctionDraftHost functionId={functionId} onNavigate={onNavigate} slots={slots} />\n </EditorShell>\n </div>\n );\n}\n\n/** Holds the draft ABOVE the per-id session, so a switch of `functionId` re-targets one hook (the\n * draft resets its own stale/error/changed-elsewhere/saving) while local UI state remounts. */\nfunction FunctionDraftHost(props: {\n functionId: string;\n onNavigate: (to: CallableEditorNavigation) => void;\n slots: FunctionEditorProps[\"slots\"];\n}): ReactNode {\n const draft = useFunctionDraft({ id: props.functionId });\n return <FunctionSession key={props.functionId} {...props} draft={draft} />;\n}\n\nfunction FunctionSession(props: {\n functionId: string;\n draft: CallableDraft;\n onNavigate: (to: CallableEditorNavigation) => void;\n slots: FunctionEditorProps[\"slots\"];\n}): ReactNode {\n const { functionId: id, draft, onNavigate, slots } = props;\n const def = draft.definition as FunctionDef | null;\n const inputs: FunctionDef[\"inputs\"] = def?.inputs ?? [];\n\n // `valid` is server-computed (never re-derived here); it rides the SAME cache entry the draft\n // reads, so this adds no request.\n const fnQuery = useFunctionQuery(id);\n const valid = (fnQuery.data as { valid?: boolean } | undefined)?.valid === true;\n\n const loadError = draft.loadError;\n const notFound = loadError instanceof ApiError && loadError.status === 404;\n\n const [showIdentity, setShowIdentity] = useState(false);\n const [notice, setNotice] = useState<string | null>(null);\n const [saved, setSaved] = useState(false);\n const [reloading, setReloading] = useState(false);\n\n const key = (def?.key ?? \"\").trim() || slugify(def?.displayName ?? \"\");\n\n // The resource this editor publishes into the rail (Studio's `workspace` memo, minus `alias`).\n useWorkspace({\n kind: \"function\",\n id,\n label: def?.displayName || undefined,\n key: key || undefined,\n inputs: inputs\n .filter((i) => Boolean(i.key))\n .map((i) => ({ key: i.key, required: i.required === true })),\n policy: draft.policy,\n onPolicyChange: draft.onPolicyChange,\n });\n\n const patch = (next: Partial<FunctionDef>) =>\n draft.setDefinition((d) => ({ ...d, ...next }) as Record<string, unknown>);\n\n // A pick's resolved fields seed an EMPTY, untouched Inputs list once (see `input-seeding.ts`).\n const [resolvedFields, setResolvedFields] = useState<TargetField[]>([]);\n const pendingPickRef = useRef(false);\n const touchedRef = useRef(false);\n // biome-ignore lint/correctness/useExhaustiveDependencies: keyed on resolvedFields only — inputs/patch are read for their current value, not to retrigger the seed on every edit.\n useEffect(() => {\n if (!pendingPickRef.current) return;\n if (!shouldSeed({ rows: inputs, touched: touchedRef.current })) {\n pendingPickRef.current = false;\n return;\n }\n if (resolvedFields.length === 0) return;\n patch({ inputs: mergeSeed(inputs, resolvedFields) });\n pendingPickRef.current = false;\n }, [resolvedFields]);\n\n const uncoveredKeys = useMemo(\n () => uncoveredRequiredKeys(inputs, resolvedFields),\n [inputs, resolvedFields],\n );\n const pageExprScope = useMemo<ExpressionOptions>(\n () => ({ inputs: inputs.map((inp) => inp.key).filter(Boolean) }),\n [inputs],\n );\n\n function onImplChange(next: Parameters<typeof targetToImpl>[0]) {\n pendingPickRef.current = true;\n const impl = targetToImpl(next);\n patch({ impl: def?.impl?.outputMap ? { ...impl, outputMap: def.impl.outputMap } : impl });\n }\n\n // A Function has no pass-through mode: every required param of the bound action must be mapped.\n // With no action chosen the field list is empty and the rule is vacuous (a deliberately\n // incomplete Function stays saveable; `incomplete` is its signal).\n const unfedKeys = useMemo(\n () => uncoveredForFunction({ impl: def?.impl, fields: resolvedFields }),\n [def?.impl, resolvedFields],\n );\n const canSave = Boolean(key) && unfedKeys.length === 0 && draft.canSave;\n\n // The exact body a Save sends — the ONE builder, so the JSON toggle's seed cannot drift from it.\n function buildSaveBody(): Record<string, unknown> {\n return {\n ...(def as FunctionDef),\n key,\n inputs: inputsForSave(inputs, { emptyMeansPassthrough: false }),\n };\n }\n\n async function onSave() {\n setNotice(null);\n setSaved(false);\n const out = await draft.commit(buildSaveBody());\n if (out.status === \"saved\" || out.status === \"clean\") setSaved(true);\n else if (out.status === \"blocked\") setNotice(out.reason);\n }\n\n const [showJson, setShowJson] = useState(false);\n const [json, setJson] = useState(\"\");\n const [jsonStored, setJsonStored] = useState<EditStored>({ id, key: \"\" });\n const [jsonError, setJsonError] = useState<string | null>(null);\n\n function openJson() {\n const body = buildSaveBody();\n setJson(JSON.stringify(body, null, 2));\n setJsonStored({ id: String(body.id), key: String(body.key) });\n setJsonError(null);\n setShowJson(true);\n }\n\n async function onJsonSave() {\n const evaluated = evaluateEdit(json, jsonStored);\n if (!evaluated.parsed || evaluated.blockedReason) return;\n setSaved(false);\n const out = await draft.commit(evaluated.parsed as Record<string, unknown>);\n if (out.status === \"saved\" || out.status === \"clean\") {\n setJsonError(null);\n setShowJson(false);\n setSaved(true);\n } else if (out.status === \"blocked\") setJsonError(out.reason);\n else if (out.status === \"failed\") setJsonError(errMsg(out.error));\n }\n\n const reload = useCallback(async () => {\n setReloading(true);\n try {\n await draft.reload();\n setNotice(null);\n setSaved(false);\n } finally {\n setReloading(false);\n }\n }, [draft.reload]);\n\n const failure = draft.stale ? null : (draft.error ?? loadError);\n const bannerError = notice ?? (failure === null ? null : errMsg(failure));\n\n const title = def?.displayName || def?.key || \"New function\";\n\n if (draft.loading || (def === null && loadError === null)) {\n return <p className=\"muted\">Loading…</p>;\n }\n\n return (\n <div style={{ flex: 1, minWidth: 0, overflow: \"auto\" }}>\n <ExpressionOptionsProvider value={pageExprScope}>\n <CallableEditorFrame\n kind=\"function\"\n title={title}\n incomplete={def !== null && !valid}\n canSave={canSave}\n isSaving={draft.saving}\n onSave={() => void onSave()}\n error={bannerError}\n notFound={notFound}\n onNavigate={onNavigate}\n slots={slots}\n headerActions={\n def && (\n <>\n <HistoryButton kind=\"function\" id={id} />\n <JsonToggleButton onClick={openJson} />\n </>\n )\n }\n banners={\n <>\n {draft.stale && (\n <div className=\"error\" role=\"alert\" data-testid=\"save-stale\">\n <p>\n This function changed on the server after you opened it. Your save was refused,\n so their work is intact.\n </p>\n <button type=\"button\" className=\"btn\" disabled={reloading} onClick={reload}>\n {reloading ? \"Reloading…\" : \"Reload from server\"}\n </button>\n </div>\n )}\n {draft.changedElsewhere && !draft.stale && (\n <div className=\"muted small\" data-testid=\"changed-elsewhere\">\n <p>\n This function was changed elsewhere. Reloading replaces your unsaved edits with\n the saved copy.\n </p>\n <button type=\"button\" className=\"btn ghost\" disabled={reloading} onClick={reload}>\n {reloading ? \"Reloading…\" : \"Reload from server\"}\n </button>\n </div>\n )}\n {unfedKeys.length > 0 && (\n <p className=\"error small\" data-testid=\"save-blocked\">\n Can’t save yet — map {unfedKeys.length > 1 ? \"these\" : \"this\"} required action{\" \"}\n {unfedKeys.length > 1 ? \"params\" : \"param\"} under Input mapping above:{\" \"}\n <strong>{unfedKeys.join(\", \")}</strong>\n </p>\n )}\n {saved && <span className=\"ok\">Saved.</span>}\n </>\n }\n >\n {def && (\n <>\n <div className=\"card\">\n <div className=\"section-head\">\n <h3>Interface</h3>\n <IconButton\n icon=\"edit-2\"\n label=\"Edit name, key, and description\"\n onClick={() => setShowIdentity(true)}\n />\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Display name</span>\n <span>{def.displayName || \"—\"}</span>\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Key</span>\n <code className=\"muted\">{def.key || \"—\"}</code>\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Description</span>\n <span>{def.description || \"—\"}</span>\n </div>\n </div>\n\n <InputListEditor\n title=\"Inputs\"\n description=\"The canonical, vendor-stable interface a caller binds to. Reuses core Param fields.\"\n emptyMeansPassthrough={false}\n rows={inputs}\n onChange={(next) => {\n touchedRef.current = true;\n patch({ inputs: next });\n }}\n uncoveredKeys={uncoveredKeys}\n />\n\n <TargetSelector\n allowedKinds={[\"action\", \"function\", \"workflow\"] as const}\n title=\"Implementation\"\n description={\n <>\n Bind the interface to one concrete app action, another Function, or a Workflow.\n Switching the provider here (a \"re-bind\") rewrites only <code>impl</code>'s\n target fields - the interface above, and every caller, is untouched.\n </>\n }\n value={implToTarget(def.impl)}\n onChange={onImplChange}\n onResolved={(t) => setResolvedFields(t.fields)}\n />\n\n <TestInvoke id={id} inputs={inputs} disabled={!valid} invalid={!valid} />\n\n {showIdentity && (\n <FunctionIdentityModal\n initial={{\n key: def.key,\n displayName: def.displayName ?? \"\",\n description: def.description ?? \"\",\n }}\n onClose={() => setShowIdentity(false)}\n onSaved={(next) => {\n patch({ displayName: next.displayName, description: next.description });\n setShowIdentity(false);\n }}\n />\n )}\n\n <JsonToggle\n open={showJson}\n onClose={() => setShowJson(false)}\n title={`JSON — ${title}`}\n mode=\"disconnected\"\n value={json}\n onChange={setJson}\n guard={(t) => evaluateEdit(t, jsonStored).blockedReason}\n onSave={() => void onJsonSave()}\n saving={draft.saving}\n error={jsonError}\n editorLabel=\"Function definition JSON\"\n />\n </>\n )}\n </CallableEditorFrame>\n </ExpressionOptionsProvider>\n </div>\n );\n}\n\n/** Test-invoke panel: one field per canonical input, run through `invokeFunction`. The server\n * invokes the STORED definition, so Save first. */\nfunction TestInvoke(props: {\n id: string;\n inputs: FunctionInput[];\n disabled: boolean;\n invalid: boolean;\n}): ReactNode {\n const { id, inputs } = props;\n const [values, setValues] = useState<Record<string, string>>({});\n const [result, setResult] = useState<FunctionInvokeResult | undefined>(undefined);\n const [error, setError] = useState<string | null>(null);\n const qc = useQueryClient();\n const invoke = useInvokeFunctionMutation();\n\n async function run() {\n const payload: Record<string, unknown> = {};\n for (const inp of inputs) {\n const coerced = coerceInput(inp.type, values[inp.key] ?? \"\");\n if (coerced !== undefined) payload[inp.key] = coerced;\n }\n try {\n const out = await invoke.mutateAsync({ id, inputs: payload });\n setError(null);\n setResult(out);\n } catch (e) {\n setResult(undefined);\n setError(errMsg(e));\n } finally {\n void qc.invalidateQueries({ queryKey: historyKeys.root });\n }\n }\n\n return (\n <div className=\"card\">\n <h3>Test invoke</h3>\n <p className=\"muted small\">\n Runs the saved Function through its bound action. Save any edits first.\n </p>\n {props.invalid && (\n <p className=\"muted small\">\n Pick an app and action to test this function — it has no implementation bound yet.\n </p>\n )}\n {inputs.length === 0 && (\n <p className=\"muted small\">Add inputs above to supply test values.</p>\n )}\n {inputs.map((inp) => {\n const fieldId = `fn-invoke-${inp.key || inp.label}`;\n return (\n <div className=\"field\" key={inp.key || inp.label}>\n <label htmlFor={fieldId}>\n {inp.label || inp.key}\n {inp.required && \" *\"}\n </label>\n {inp.type === \"boolean\" ? (\n <select\n id={fieldId}\n value={values[inp.key] ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, [inp.key]: e.target.value }))}\n >\n <option value=\"\">—</option>\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : (\n <input\n id={fieldId}\n type={inp.type === \"number\" ? \"number\" : \"text\"}\n value={values[inp.key] ?? \"\"}\n placeholder={inp.type === \"json\" ? \"{ }\" : (inp.hint ?? \"\")}\n onChange={(e) => setValues((v) => ({ ...v, [inp.key]: e.target.value }))}\n />\n )}\n </div>\n );\n })}\n <div className=\"row\">\n <button\n type=\"button\"\n className=\"btn\"\n disabled={props.disabled || invoke.isPending}\n onClick={() => void run()}\n >\n {invoke.isPending ? \"Invoking…\" : \"Invoke\"}\n </button>\n </div>\n {error && <div className=\"result error\">{error}</div>}\n {result !== undefined && (\n <>\n {result.invocationId && (\n <p className=\"muted small\">\n {result.status ?? \"done\"}\n {result.durationMs !== undefined ? ` · ${result.durationMs} ms` : \"\"}\n {\" · \"}\n <code>{result.invocationId}</code>\n </p>\n )}\n <pre className=\"result\" style={{ overflow: \"auto\" }}>\n {JSON.stringify(result.output, null, 2)}\n </pre>\n </>\n )}\n </div>\n );\n}\n"],"names":["codeLanguageForDocFormat","format","DocumentEditor","documentId","project","onDeleted","onBack","slots","p","useEditorProject","docQuery","useDocumentQuery","deleteMut","useDeleteDocumentMutation","editing","setEditing","useState","deletePending","setDeletePending","jsx","doc","empty","jsxs","Fragment","header","actions","CallFromCodeButton","EditButton","DeleteButton","Copyable","CodeBlock","DocumentFormModal","ConfirmModal","BLANK_TARGET","normalizeEndpoint","e","buildEndpointSaveBody","draft","target","input","rest","body","targetIsBound","inputs","inputsForSave","urlOptions","invokeUrls","selectedUrlEntry","pickedDomain","options","u","urlCardEntry","selected","invokeUrl","invokeUrlByKey","CallableEditorFrame","props","descriptor","descriptorFor","backLabel","goBack","ExecutionProfileHeader","AUTH_MODES","UrlCard","entry","domainOptions","urlDomain","onUrlDomain","urlForm","onUrlForm","hasByKey","shown","_a","form","label","title","SecurityCard","security","onPatch","mode","m","SecretField","v","stored","SECRET_MASK","EndpointTestInvoke","id","values","setValues","output","setOutput","error","setError","qc","useQueryClient","invokeMut","useInvokeEndpointMutation","invoke","payload","inp","coerced","coerceInput","out","ApiError","historyKeys","fieldId","InputListEditor","rows","onChange","description","emptyMeansPassthrough","uncoveredKeys","addInput","updateInput","i","next","idx","removeInput","_","INPUT_TYPES","IconButton","KIND_ORDER","KIND_LABEL","TargetSelector","allowedKinds","value","onResolved","passthroughHint","pickerOpen","setPickerOpen","kind","allowsKind","k","emit","actionTarget","app","actionKey","ref","targetRefOf","selectedAppSummary","useEditorApp","flowHelpers","setFlowHelpers","useEffect","canceled","actionsQuery","useAppActionsQuery","connectionsQuery","useConnectionsForAppQuery","selectedAction","useMemo","a","callableFamilies","pickerTitle","functionsQuery","useFunctionsQuery","workflowsQuery","useWorkflowsQuery","endpointsQuery","useEndpointsQuery","functionDetailQuery","useFunctionQuery","workflowDetailQuery","useWorkflowQuery","endpointDetailQuery","useEndpointQuery","fields","paramsToFields","fieldsFromWorkflow","_b","_c","pickTarget","built","CALL_APP","w","family","existingWith","newWith","preservedWith","key","updateWith","paramKey","nextWith","handleKindChange","handleRefChange","pickedCallableLabel","fn","f","wf","actionParams","params","currentWith","field","equals","inArray","notIn","truthy","fieldValue","hasValue","AppIcon","c","ExpressionInput","StepBuilderModal","ep","NOOP","messageOf","EndpointEditor","endpointId","onNavigate","tools","railNavigate","useCallback","to","EditorShell","EndpointBody","envelope","resolvedFields","setResolvedFields","resolvedRef","useRef","pendingPickRef","touchedRef","setUrlForm","setUrlDomain","showIdentity","setShowIdentity","saved","setSaved","showJson","setShowJson","json","setJson","jsonStored","setJsonStored","jsonError","setJsonError","saveGuard","def","unfed","uncoveredForEndpoint","useEndpointDraft","view","useWorkspace","setDefinition","patch","d","patchSecurity","merged","onTargetChange","shouldSeed","mergeSeed","pageExprScope","uncoveredRequiredKeys","unfedKeys","saveBlockedNote","canSave","onSave","openJson","onJsonSave","evalResult","evaluateEdit","parsed","loadErr","notFound","stateError","staleBanner","ExpressionOptionsProvider","HistoryButton","JsonToggleButton","t","EndpointIdentityModal","JsonToggle","errMsg","FunctionEditor","functionId","FunctionDraftHost","useFunctionDraft","FunctionSession","valid","loadError","notice","setNotice","reloading","setReloading","slugify","onImplChange","impl","targetToImpl","uncoveredForFunction","buildSaveBody","evaluated","reload","failure","bannerError","implToTarget","TestInvoke","FunctionIdentityModal","result","setResult","useInvokeFunctionMutation","run"],"mappings":"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"}
1
+ {"version":3,"file":"editors.mjs","sources":["../src/editors/doc-format.ts","../src/editors/DocumentEditor.tsx","../src/lib/endpoint-editor.ts","../src/editor/CallableEditorFrame.tsx","../src/editor/EndpointCards.tsx","../src/editor/InputListEditor.tsx","../src/editor/TargetSelector.tsx","../src/editor/EndpointEditor.tsx","../src/editor/FunctionEditor.tsx"],"sourcesContent":["/**\n * T1.2.1: which `CodeBlock`/editor grammar a document's persisted `format`\n * maps to. A named `switch` over every `DocFormat` arm — mirrors\n * `rail-settings.ts`'s total-function idiom (`:36-102`): no `default:`, so a\n * sixth `DocFormat` value added later fails to compile here instead of\n * silently falling through to some default grammar. Split out into its own\n * `.ts` module (never `.tsx`) so `node --test` (`test:unit`'s glob is\n * `src/lib/__tests__/*.test.ts`) can pin the map directly, the same reason\n * `rail-settings.ts`/`alias-rail.ts` exist as standalone modules.\n *\n * All five `CodeLanguage` arms used below are already members of\n * `CodeBlock`'s exported union (`packages/ui/src/CodeBlock.tsx:52-68`) — no\n * new Prism grammar registration is needed.\n */\nimport type { DocFormat } from \"@w6w/sdk\";\nimport type { CodeLanguage } from \"@w6w/ui\";\n\nexport function codeLanguageForDocFormat(format: DocFormat): CodeLanguage {\n switch (format) {\n case \"yaml\":\n return \"yaml\";\n case \"json\":\n return \"json\";\n case \"markdown\":\n return \"markdown\";\n case \"html\":\n return \"markup\";\n case \"text\":\n return \"plaintext\";\n }\n}\n","/**\n * `<DocumentEditor documentId>` — one document: its key, its content (read-only, highlighted) and,\n * for a private document, Edit and Delete. No repository sync and no \"synced from\" markers; a host\n * adds those around it.\n */\nimport { CodeBlock, Copyable, DeleteButton, EditButton } from \"@w6w/ui\";\nimport type { ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { CallFromCodeButton } from \"../chrome/CallFromCodeButton.tsx\";\nimport { ConfirmModal } from \"../chrome/ConfirmModal.tsx\";\nimport { DocumentFormModal } from \"../forms/DocumentFormModal.tsx\";\nimport { useEditorProject } from \"../project-context.ts\";\nimport { useDeleteDocumentMutation, useDocumentQuery } from \"../repos/documents.ts\";\nimport { codeLanguageForDocFormat } from \"./doc-format.ts\";\n\nexport interface DocumentEditorSlots {\n /** Replaces the default heading (the key as an `<h3>`). `null`: none. */\n header?: ReactNode;\n /** Replaces the default action row (Call from code, Edit, Delete). `null`: none. */\n actions?: ReactNode;\n /** Replaces the not-found body. `null`: nothing. */\n empty?: ReactNode;\n}\n\nexport interface DocumentEditorProps {\n documentId: string;\n /** Omitted: the provider's project. `null` or `\"\"`: none; nothing is read and writes refuse. */\n project?: string | null;\n /** Called once, AFTER the delete succeeded. */\n onDeleted?: () => void;\n /** Given, the not-found body offers a \"Back to documents\" control that calls it. */\n onBack?: () => void;\n slots?: DocumentEditorSlots;\n}\n\nexport function DocumentEditor({\n documentId,\n project,\n onDeleted,\n onBack,\n slots,\n}: DocumentEditorProps) {\n const p = useEditorProject(project);\n const docQuery = useDocumentQuery(documentId, p ?? undefined, p != null);\n const deleteMut = useDeleteDocumentMutation();\n const [editing, setEditing] = useState(false);\n const [deletePending, setDeletePending] = useState(false);\n\n // isPending, not isLoading: the query is disabled while the project is unresolved, so\n // `isLoading` (pending AND fetching) would be false there and \"not found\" would flash.\n if (docQuery.isPending) {\n return (\n <div className=\"w6w-embed-root\">\n <p className=\"muted\">Loading…</p>\n </div>\n );\n }\n const doc = docQuery.data;\n if (!doc) {\n const empty =\n slots?.empty === undefined ? (\n <>\n <h3>Document not found</h3>\n {onBack && (\n <button type=\"button\" className=\"btn ghost\" onClick={onBack}>\n Back to documents\n </button>\n )}\n </>\n ) : (\n slots.empty\n );\n return <div className=\"w6w-embed-root\">{empty}</div>;\n }\n\n const header = slots?.header === undefined ? <h3>{doc.key}</h3> : slots.header;\n const actions =\n slots?.actions === undefined ? (\n <div className=\"card\">\n <div style={{ display: \"flex\", gap: \"var(--w6w-sp-1-5)\" }}>\n <CallFromCodeButton resource={{ kind: \"document\", key: doc.key }} />\n {!doc.shared && (\n <>\n <EditButton\n label=\"Edit\"\n onClick={() => setEditing(true)}\n data-testid=\"document-editor-edit\"\n />\n <DeleteButton\n label=\"Delete\"\n onClick={() => setDeletePending(true)}\n disabled={deleteMut.isPending}\n data-testid=\"document-editor-delete\"\n />\n </>\n )}\n </div>\n </div>\n ) : (\n slots.actions\n );\n\n return (\n <div className=\"w6w-embed-root w6w-doc-editor\">\n {header}\n {actions}\n\n <div className=\"card\">\n <h3>Key</h3>\n <Copyable value={doc.key} readOnly>\n {/* `.w6w-copyable`'s flex rule targets `> input, > textarea, > pre`, never `> code`, so\n a bare `<code>` keeps flexbox's min-content floor and can push the copy button out\n of a narrow box unless told to shrink. */}\n <code\n style={{\n overflowWrap: \"anywhere\",\n display: \"block\",\n minWidth: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n flex: 1,\n }}\n >\n {doc.key}\n </code>\n </Copyable>\n </div>\n\n <div className=\"card\">\n <h3>Content</h3>\n <p className=\"muted small\">\n Format <code>{doc.format}</code>. Stored verbatim — this is a read-only view, not a\n rendered preview.\n </p>\n <CodeBlock\n code={doc.content}\n language={codeLanguageForDocFormat(doc.format)}\n showLineNumbers\n />\n </div>\n\n {editing && (\n <DocumentFormModal\n initial={doc}\n project={p}\n onClose={() => setEditing(false)}\n onSaved={() => setEditing(false)}\n />\n )}\n\n {deletePending && (\n <ConfirmModal\n title=\"Delete document\"\n message={`Delete the document \"${doc.key}\"? This cannot be undone.`}\n confirmLabel=\"Delete\"\n onConfirm={() => {\n setDeletePending(false);\n if (p == null) return;\n deleteMut.mutate({ id: doc.id, project: p }, { onSuccess: () => onDeleted?.() });\n }}\n onClose={() => setDeletePending(false)}\n />\n )}\n </div>\n );\n}\n","/**\n * The pure half of `<EndpointEditor>` — loadable by `node --test` (no React, no `@w6w/ui`).\n *\n * - {@link BLANK_TARGET} / {@link normalizeEndpoint}: the hydration boundary. A server definition\n * with no `target` (a draft, HITL-8) must still leave `target` defined, because every read in\n * the editor does `target.kind` unguarded.\n * - {@link buildEndpointSaveBody}: the ONE body a Save posts. An unbound target and an untouched\n * empty Input are absent from the wire, never `null`/`[]`.\n * - {@link urlOptions} / {@link selectedUrlEntry} / {@link urlCardEntry}: which of the\n * server-rendered invoke URLs the card shows. Every string is the server's, verbatim.\n */\nimport type { EndpointDef, EndpointOwnTarget, InvokeUrlOption } from \"../repos/endpoints.ts\";\nimport { inputsForSave } from \"./input-seeding.ts\";\nimport { targetIsBound } from \"./target-fields.ts\";\n\n/** A blank `action` target — what an absent `target` hydrates to. */\nexport const BLANK_TARGET: EndpointOwnTarget = {\n kind: \"action\",\n uses: { app: \"\", action: \"\", connection: null },\n};\n\n/** `target` falls back to {@link BLANK_TARGET} and `input` to `[]`, only when absent. */\nexport function normalizeEndpoint(e: EndpointDef): EndpointDef {\n return { input: [], ...e, target: e.target ?? BLANK_TARGET };\n}\n\n/**\n * The exact body a Save posts. Unbound target ⇒ no `target` key; empty Input ⇒ no `input` key\n * (a documented pass-through mode server-side — saving `[]` would persist a spurious list). The\n * key is trimmed. Everything else, secrets included, passes through unchanged.\n */\nexport function buildEndpointSaveBody(draft: EndpointDef): Record<string, unknown> {\n const { target, input, ...rest } = normalizeEndpoint(draft);\n const body: Record<string, unknown> = {\n ...rest,\n key: String(draft.key ?? \"\").trim(),\n };\n if (targetIsBound(target)) body.target = target;\n const inputs = inputsForSave(input ?? [], { emptyMeansPassthrough: true });\n if (inputs !== undefined) body.input = inputs;\n return body;\n}\n\n/** Which of the two server-rendered forms of the URL is on screen. */\nexport type UrlForm = \"id\" | \"key\";\n\n/** The domain picker's options: only when there IS a second option (≤ 1 ⇒ `undefined`). */\nexport function urlOptions(\n invokeUrls: InvokeUrlOption[] | null | undefined,\n): InvokeUrlOption[] | undefined {\n return invokeUrls && invokeUrls.length > 1 ? invokeUrls : undefined;\n}\n\n/** The entry the card shows: the session pick (by domain NAME), else `default`, else the first. */\nexport function selectedUrlEntry(\n invokeUrls: InvokeUrlOption[] | null | undefined,\n pickedDomain: string | null,\n): InvokeUrlOption | null {\n const options = urlOptions(invokeUrls);\n if (!options) return null;\n return (\n options.find((u) => u.domain === pickedDomain) ?? options.find((u) => u.default) ?? options[0]\n );\n}\n\n/** What the URL card renders: the selected domain's entry, else the flat envelope fields. */\nexport function urlCardEntry(\n selected: InvokeUrlOption | null,\n invokeUrl: string | undefined,\n invokeUrlByKey: string | undefined,\n): { url: string; urlByKey?: string; resolves: boolean } {\n return (\n selected ?? {\n url: invokeUrl ?? \"\",\n urlByKey: invokeUrlByKey,\n resolves: true,\n }\n );\n}\n","import type { ReactNode } from \"react\";\nimport { ExecutionProfileHeader } from \"../chrome/ExecutionProfileHeader.tsx\";\nimport { descriptorFor } from \"../lib/callable-descriptors.ts\";\nimport type { CallableKind } from \"../lib/callable-kind.ts\";\nimport type { CallableEditorNavigation, CallableEditorSlots } from \"./types.ts\";\n\nexport interface CallableEditorFrameProps {\n /** Which kind's copy (back/save labels, not-found heading) the frame shows. */\n kind: CallableKind;\n /** The heading's text — the kind computes it from its own draft, because only it knows what\n * \"empty\" means for its definition. */\n title: string;\n /** Renders the `incomplete` badge beside the heading. */\n incomplete: boolean;\n canSave: boolean;\n isSaving: boolean;\n onSave: () => void;\n error: string | null;\n /** A 404 from the hydration GET: render the not-found card, never a blank editable form. */\n notFound: boolean;\n /** Where the host should take the user; back asks for `{ type: \"list\" }`. */\n onNavigate: (to: CallableEditorNavigation) => void;\n slots?: CallableEditorSlots;\n /** Statements BETWEEN the error banner and the body — the save-gate explanation, \"Saved.\". */\n banners?: ReactNode;\n /** Rendered as the FIRST child of the header action row, before Save (e.g. a JSON toggle). */\n headerActions?: ReactNode;\n children: ReactNode;\n}\n\n/**\n * The shared editor frame of the Function and Endpoint editors: back control, heading with the\n * `incomplete` badge, Save, the error banner and the body (or the not-found card). Router-free —\n * it asks the host to navigate through `onNavigate` and sets no document title. It publishes\n * nothing to the rail workspace either: each editor body does that itself (`useWorkspace`).\n */\nexport function CallableEditorFrame(props: CallableEditorFrameProps) {\n const descriptor = descriptorFor(props.kind);\n const slots = props.slots;\n const backLabel = slots?.backLabel ?? descriptor.editor.backLabel;\n const goBack = () => props.onNavigate({ type: \"list\" });\n\n if (props.notFound) {\n return (\n <div>\n <button type=\"button\" className=\"btn ghost\" onClick={goBack}>\n {backLabel}\n </button>\n <div className=\"card\">\n <h3>{descriptor.editor.notFoundTitle}</h3>\n <p className=\"error\">{props.error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"exec-profile-editor\">\n {slots?.header ?? (\n <ExecutionProfileHeader\n onBack={goBack}\n backLabel={backLabel}\n title={{ editable: false, value: props.title }}\n titleAdornment={\n props.incomplete && <span className=\"badge status-failed\">incomplete</span>\n }\n actions={\n <>\n {props.headerActions}\n <button\n type=\"button\"\n className=\"btn\"\n disabled={!props.canSave}\n onClick={props.onSave}\n >\n {props.isSaving ? \"Saving…\" : descriptor.editor.saveLabel}\n </button>\n {slots?.headerActions}\n </>\n }\n />\n )}\n\n <div className=\"exec-profile-body\">\n {props.error && <div className=\"error\">{props.error}</div>}\n {props.banners}\n {props.children}\n </div>\n </div>\n );\n}\n","import { useQueryClient } from \"@tanstack/react-query\";\nimport { ApiError } from \"@w6w/sdk\";\nimport { Copyable } from \"@w6w/ui\";\nimport { useState } from \"react\";\nimport { coerceInput } from \"../lib/coerce-input.ts\";\nimport type { UrlForm } from \"../lib/endpoint-editor.ts\";\nimport { historyKeys } from \"../lib/history-query.ts\";\nimport {\n type EndpointAuthMode,\n type EndpointInput,\n type EndpointSecurity,\n type InvokeUrlOption,\n SECRET_MASK,\n useInvokeEndpointMutation,\n} from \"../repos/endpoints.ts\";\n\n/** The auth modes offered, in the order an operator is likely to want them. */\nconst AUTH_MODES: Array<{\n value: EndpointAuthMode;\n label: string;\n hint: string;\n}> = [\n {\n value: \"platform\",\n label: \"Platform auth (default)\",\n hint: \"A w6w token or a partner OIDC token, exactly like the rest of the API. The call runs as the caller.\",\n },\n {\n value: \"none\",\n label: \"None — public\",\n hint: \"Anyone with the URL can invoke this. The call runs as this Endpoint's owner.\",\n },\n {\n value: \"basic\",\n label: \"Basic auth\",\n hint: \"HTTP Basic with the username and password below.\",\n },\n {\n value: \"header\",\n label: \"Header auth\",\n hint: \"The named header must carry the value below.\",\n },\n {\n value: \"jwt\",\n label: \"JWT (HMAC)\",\n hint: \"A Bearer JWT, verified HS256 against the shared secret below.\",\n },\n];\n\n/**\n * The Endpoint's callable URL — its own card, directly beneath Identity.\n *\n * **Every URL here comes from the SERVER, verbatim** (the `[\"endpoint\", id]` envelope's\n * `invokeUrl`, `invokeUrlByKey` and `invokeUrls[]`): this component picks between strings and\n * renders one. It holds no hostname, no path grammar and no account slug. `entry.urlByKey` is\n * absent until the server renders it; then the card is one URL line and one Copy button, no\n * id/key toggle. `domainOptions` renders the domain `<select>` only when there is a second option\n * (`lib/endpoint-editor.ts`'s `urlOptions` does that collapse).\n */\nexport function UrlCard(props: {\n entry: { url: string; urlByKey?: string; resolves: boolean };\n domainOptions?: InvokeUrlOption[];\n urlDomain: string | null;\n onUrlDomain: (domain: string) => void;\n urlForm: UrlForm;\n onUrlForm: (form: UrlForm) => void;\n}) {\n const { entry, domainOptions, urlDomain, onUrlDomain, urlForm, onUrlForm } = props;\n const hasByKey = entry.urlByKey !== undefined && entry.urlByKey !== \"\";\n const shown = urlForm === \"key\" && entry.urlByKey ? entry.urlByKey : entry.url;\n\n return (\n <div className=\"card\">\n <h3>URL</h3>\n {domainOptions && (\n <label className=\"field\">\n <span>Domain</span>\n <select\n data-testid=\"url-domain\"\n value={urlDomain ?? domainOptions[0]?.domain}\n onChange={(e) => onUrlDomain(e.target.value)}\n >\n {domainOptions.map((u) => (\n <option key={u.domain} value={u.domain}>\n {u.domain +\n (u.default ? \" · default\" : \"\") +\n (u.resolves ? \"\" : \" · not routable yet\")}\n </option>\n ))}\n </select>\n </label>\n )}\n {hasByKey && (\n <fieldset className=\"seg\" aria-label=\"URL form\">\n {(\n [\n [\"id\", \"By id\", \"The stable, host-issued address. Never changes.\"],\n [\"key\", \"By key\", \"The readable address, built from the account and this key.\"],\n ] as const\n ).map(([form, label, title]) => (\n <button\n key={form}\n type=\"button\"\n className={`seg-btn${urlForm === form ? \" active\" : \"\"}`}\n aria-pressed={urlForm === form}\n data-testid={`url-form-${form}`}\n title={title}\n onClick={() => onUrlForm(form)}\n >\n {label}\n </button>\n ))}\n </fieldset>\n )}\n <div className=\"row\" style={{ alignItems: \"center\", gap: \"var(--w6w-sp-2)\" }}>\n <Copyable value={shown} readOnly>\n <code style={{ overflowWrap: \"anywhere\" }}>\n <strong>POST</strong> <span data-testid=\"invoke-url\">{shown || \"…\"}</span>\n </code>\n </Copyable>\n </div>\n {!entry.resolves && (\n <p className=\"muted small\" data-testid=\"url-unroutable\">\n Not routable yet — this domain has no DNS or TLS behind it, so a call to this address will\n not answer.\n </p>\n )}\n <p className=\"muted small\" style={{ marginTop: \"var(--w6w-sp-2)\" }}>\n Send the declared input as a JSON body.\n </p>\n </div>\n );\n}\n\n/**\n * Who may call the URL above.\n *\n * Every mode except `platform` runs the target as the Endpoint's owner (there is no platform\n * identity on such a request), which is what the warning below says before an operator switches off\n * platform auth. Secrets are write-only: the server returns a mask for a configured secret, and\n * saving the mask back keeps the stored value.\n */\nexport function SecurityCard(props: {\n security: EndpointSecurity;\n onPatch: (next: Partial<EndpointSecurity>) => void;\n}) {\n const { security, onPatch } = props;\n const mode = security.auth;\n\n return (\n <div className=\"card\">\n <h3>Security</h3>\n\n <label className=\"field\">\n <span>Who may call it</span>\n <select\n value={mode}\n onChange={(e) => onPatch({ auth: e.target.value as EndpointAuthMode })}\n >\n {AUTH_MODES.map((m) => (\n <option key={m.value} value={m.value}>\n {m.label}\n </option>\n ))}\n </select>\n <span className=\"hint\">{AUTH_MODES.find((m) => m.value === mode)?.hint}</span>\n </label>\n\n {mode !== \"platform\" && (\n <p className=\"muted small\">\n <strong>Runs as this Endpoint's owner.</strong> A caller authenticated by the policy above\n carries no w6w identity, so the target runs with the connections and data of whoever owns\n this Endpoint.\n </p>\n )}\n\n {mode === \"basic\" && (\n <>\n <label className=\"field\">\n <span>Username</span>\n <input\n type=\"text\"\n value={security.basicUser ?? \"\"}\n onChange={(e) => onPatch({ basicUser: e.target.value })}\n />\n </label>\n <SecretField\n label=\"Password\"\n value={security.basicPassword}\n onChange={(v) => onPatch({ basicPassword: v })}\n />\n </>\n )}\n\n {mode === \"header\" && (\n <>\n <label className=\"field\">\n <span>Header name</span>\n <input\n type=\"text\"\n placeholder=\"X-API-Key\"\n value={security.headerName ?? \"\"}\n onChange={(e) => onPatch({ headerName: e.target.value })}\n />\n </label>\n <SecretField\n label=\"Header value\"\n value={security.headerValue}\n onChange={(v) => onPatch({ headerValue: v })}\n />\n </>\n )}\n\n {mode === \"jwt\" && (\n <SecretField\n label=\"JWT secret (HS256)\"\n value={security.jwtSecret}\n onChange={(v) => onPatch({ jwtSecret: v })}\n />\n )}\n </div>\n );\n}\n\n/**\n * A write-only secret input. A stored secret comes back as {@link SECRET_MASK}; the input renders\n * EMPTY (the mask is never a DOM value) with the \"stored — type to replace\" hint, and the buffer\n * keeps the mask until the operator types, so a save that never touches it preserves what is stored.\n */\nexport function SecretField(props: {\n label: string;\n value: string | undefined;\n onChange: (v: string) => void;\n}) {\n const stored = props.value === SECRET_MASK;\n return (\n <label className=\"field\">\n <span>{props.label}</span>\n <input\n type=\"password\"\n value={stored ? \"\" : (props.value ?? \"\")}\n placeholder={stored ? \"•••••••• (stored — type to replace)\" : \"\"}\n onChange={(e) => props.onChange(e.target.value)}\n />\n {stored && <span className=\"hint\">A secret is stored — type to replace it.</span>}\n </label>\n );\n}\n\n/**\n * Test-invoke panel: one field per declared input, POSTed to /endpoints/:id/invoke. The server\n * invokes the STORED definition, so unsaved edits are not what runs. The result is the\n * `kind`-tagged envelope: an Action or Function target answers with an inline `output`; a Workflow\n * target answers with a `runId` to poll.\n */\nexport function EndpointTestInvoke(props: {\n id: string;\n inputs: EndpointInput[];\n}) {\n const { id, inputs } = props;\n const [values, setValues] = useState<Record<string, string>>({});\n const [output, setOutput] = useState<unknown>(undefined);\n const [error, setError] = useState<string | null>(null);\n const qc = useQueryClient();\n const invokeMut = useInvokeEndpointMutation();\n\n const invoke = () => {\n const payload: Record<string, unknown> = {};\n for (const inp of inputs) {\n const coerced = coerceInput(inp.type, values[inp.key] ?? \"\");\n if (coerced !== undefined) payload[inp.key] = coerced;\n }\n invokeMut.mutate(\n { id, input: payload },\n {\n onSuccess: (out) => {\n setError(null);\n setOutput(out);\n },\n onError: (e) => {\n setOutput(undefined);\n setError(e instanceof ApiError ? e.message : (e as Error).message);\n },\n onSettled: () => qc.invalidateQueries({ queryKey: historyKeys.root }),\n },\n );\n };\n\n return (\n <div className=\"card\">\n <h3>Test invoke</h3>\n <p className=\"muted small\">\n Dispatches the saved Endpoint to its target. Save any edits first. An Action or Function\n target returns a value; a Workflow target returns a run id to poll.\n </p>\n {inputs.length === 0 && (\n <p className=\"muted small\">No declared inputs — the payload is passed through.</p>\n )}\n {inputs.map((inp) => {\n const fieldId = `ep-invoke-${id}-${inp.key || inp.label}`;\n return (\n <div className=\"field\" key={inp.key || inp.label}>\n <label htmlFor={fieldId}>\n {inp.label || inp.key}\n {inp.required && \" *\"}\n </label>\n {inp.type === \"boolean\" ? (\n <select\n id={fieldId}\n value={values[inp.key] ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, [inp.key]: e.target.value }))}\n >\n <option value=\"\">—</option>\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : (\n <input\n id={fieldId}\n type={inp.type === \"number\" ? \"number\" : \"text\"}\n value={values[inp.key] ?? \"\"}\n placeholder={inp.type === \"json\" ? \"{ }\" : (inp.hint ?? \"\")}\n onChange={(e) => setValues((v) => ({ ...v, [inp.key]: e.target.value }))}\n />\n )}\n </div>\n );\n })}\n <div className=\"row\">\n <button type=\"button\" className=\"btn\" disabled={invokeMut.isPending} onClick={invoke}>\n {invokeMut.isPending ? \"Invoking…\" : \"Invoke\"}\n </button>\n </div>\n {error && <div className=\"result error\">{error}</div>}\n {output !== undefined && (\n <pre className=\"result\" style={{ overflow: \"auto\" }}>\n {JSON.stringify(output, null, 2)}\n </pre>\n )}\n </div>\n );\n}\n","import { IconButton } from \"@w6w/ui\";\nimport type { ReactNode } from \"react\";\nimport { INPUT_TYPES, type InputRow } from \"../lib/input-seeding.ts\";\n\n/**\n * One input-row card, shared by the Functions \"Inputs\" editor and the\n * Endpoints \"Input\" editor (T3.2.1) — the two were byte-identical from\n * `<li key={i}>` through `</li>` on the merged branch, apart from the map\n * source variable (`draft.inputs` vs the `inputs` local alias for\n * `draft.input ?? []`). Controlled: the page owns `rows` as its `draft`'s\n * single source of truth and passes the next array back through `onChange`\n * on every add/update/remove — this component never holds its own copy.\n *\n * `emptyMeansPassthrough` carries the one real divergence between the two\n * forms: an Endpoint's declared `input` list absent/empty is a documented\n * pass-through mode, a Function's empty `inputs` just means \"no arguments\" —\n * so the empty-state copy (and nothing else) differs per page.\n */\nexport interface InputListEditorProps {\n rows: InputRow[];\n onChange: (next: InputRow[]) => void;\n /** The card's `<h3>` — \"Inputs\" (Functions) or \"Input\" (Endpoints). */\n title: string;\n /** The card's descriptive copy, caller-owned so wording stays per-surface. */\n description: ReactNode;\n /** Endpoints: `true` (the empty-state copy talks about pass-through). Functions: `false`. */\n emptyMeansPassthrough: boolean;\n /** Required target-field keys the current rows don't cover (HITL-1's post-touch flag). */\n uncoveredKeys?: string[];\n}\n\nexport function InputListEditor(props: InputListEditorProps) {\n const { rows, onChange, title, description, emptyMeansPassthrough, uncoveredKeys } = props;\n\n function addInput() {\n onChange([...rows, { key: \"\", label: \"\", type: \"string\" }]);\n }\n function updateInput(i: number, next: Partial<InputRow>) {\n onChange(rows.map((inp, idx) => (idx === i ? { ...inp, ...next } : inp)));\n }\n function removeInput(i: number) {\n onChange(rows.filter((_, idx) => idx !== i));\n }\n\n return (\n <div className=\"card\">\n <div className=\"row\" style={{ justifyContent: \"space-between\", alignItems: \"center\" }}>\n <h3>{title}</h3>\n <button type=\"button\" className=\"btn ghost\" onClick={addInput}>\n + Add input\n </button>\n </div>\n <p className=\"muted small\">{description}</p>\n {rows.length === 0 && (\n <p className=\"muted small\">\n {emptyMeansPassthrough ? \"No inputs — payload is passed through.\" : \"No inputs yet.\"}\n </p>\n )}\n <ul className=\"list\" data-testid=\"input-list\">\n {rows.map((inp, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: rows are positional and reorderable\n <li key={i} style={{ alignItems: \"center\", gap: 8 }}>\n <input\n type=\"text\"\n value={inp.key}\n placeholder=\"key\"\n aria-label=\"Input key\"\n onChange={(e) => updateInput(i, { key: e.target.value })}\n />\n <input\n type=\"text\"\n value={inp.label}\n placeholder=\"Label\"\n aria-label=\"Input label\"\n onChange={(e) => updateInput(i, { label: e.target.value })}\n />\n <select\n value={inp.type}\n aria-label=\"Input type\"\n onChange={(e) => updateInput(i, { type: e.target.value })}\n >\n {INPUT_TYPES.map((t) => (\n <option key={t} value={t}>\n {t}\n </option>\n ))}\n </select>\n <label className=\"row\" style={{ gap: 4, alignItems: \"center\" }}>\n <input\n type=\"checkbox\"\n checked={inp.required ?? false}\n onChange={(e) => updateInput(i, { required: e.target.checked })}\n />\n <span className=\"muted small\">required</span>\n </label>\n <IconButton\n danger\n icon=\"close\"\n label={`Remove input ${inp.key || i + 1}`}\n onClick={() => removeInput(i)}\n />\n </li>\n ))}\n </ul>\n {uncoveredKeys && uncoveredKeys.length > 0 && (\n <p className=\"muted small\" data-testid=\"input-uncovered\">\n Missing required field{uncoveredKeys.length > 1 ? \"s\" : \"\"} for the current target:{\" \"}\n {uncoveredKeys.join(\", \")}\n </p>\n )}\n </div>\n );\n}\n","import {\n type ActionParam,\n AppIcon,\n type BuiltStep,\n type ExprValue,\n ExpressionInput,\n type SecretValue,\n StepBuilderModal,\n} from \"@w6w/ui\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport {\n type TargetField,\n type WorkflowFieldCtx,\n type WorkflowLike,\n fieldsFromWorkflow,\n paramsToFields,\n targetRef as targetRefOf,\n} from \"../lib/target-fields.ts\";\nimport { CALL_APP } from \"../rail/ErrorHandlingTool.tsx\";\nimport { useAppActionsQuery } from \"../repos/apps.ts\";\nimport { useConnectionsForAppQuery } from \"../repos/connections.ts\";\nimport { useEndpointQuery, useEndpointsQuery } from \"../repos/endpoints.ts\";\nimport type { EndpointTarget } from \"../repos/endpoints.ts\";\nimport { useFunctionQuery, useFunctionsQuery } from \"../repos/functions.ts\";\nimport { useWorkflowQuery, useWorkflowsQuery } from \"../repos/workflows.ts\";\nimport type { TargetKind, TargetSelectorProps, TargetValue } from \"./TargetSelector.types.ts\";\nimport { useEditorApp } from \"./editor-apps.ts\";\n\nconst KIND_ORDER: readonly TargetKind[] = [\"action\", \"function\", \"workflow\", \"endpoint\"];\nconst KIND_LABEL: Record<TargetKind, string> = {\n action: \"Action (synchronous)\",\n function: \"Function (synchronous)\",\n workflow: \"Workflow (asynchronous)\",\n endpoint: \"Endpoint (dispatches to another Endpoint)\",\n};\n\n/**\n * One `target` picker for both the Functions editor's Implementation card and\n * the Endpoints editor's Target card (rfcs/endpoint.md:339-347,\n * rfcs/function.md:61-62). `allowedKinds` is the type-level RFC guard (A1,\n * see `TargetSelector.types.ts`) — Functions passes `[\"action\"]`, which makes\n * `{kind:\"function\"}`/`{kind:\"workflow\"}` unconstructable at that call site\n * and renders no kind control at all (A2); Endpoints passes all three.\n *\n * Owns every fetch its three arms need (apps/actions/connections for `action`;\n * the functions/workflows lists plus the picked one's own detail for the\n * other two — A8, gated `useQuery`s, mirroring the pages' existing\n * `actionsQuery` gating) and reuses `StepBuilderModal` verbatim for the\n * `action` arm (A3) — this is the one remaining `<StepBuilderModal` call\n * site; no second app/action picker.\n *\n * Resolves the picked target to a normalized `TargetField[]` (A5) and reports\n * it via `onResolved` on every change, so a page's own `useEffect` can seed\n * its input list from the same fields the mapping table below renders from\n * (A7) — by the time that table can render, `inputs.*` already resolves.\n *\n * **Takes no `exprOptions`.** The ƒx rail its mapping rows and its picker modal\n * offer is INHERITED — the app shell contributes the project's vars/secrets/\n * documents, the page contributes its `inputs` — so every expression editor\n * reachable from this card sees the same sources wherever it is opened. It used\n * to take the scope as a prop and wrap only the picker modal in a provider,\n * which is precisely how the mapping rows' `ƒx` toggles ended up offering an\n * empty rail while the \"Change\" button offered the full one.\n */\nexport function TargetSelector<K extends TargetKind>(props: TargetSelectorProps<K>) {\n const { allowedKinds, value, onChange, onResolved, title, description, passthroughHint } = props;\n const [pickerOpen, setPickerOpen] = useState(false);\n\n // Internally this operates on the full wire union — at runtime `value`\n // genuinely IS one of the three arms regardless of what `K` the caller\n // narrowed to; only the outward-facing generic signature is what enforces\n // A1's guard at the call site (TargetSelector.types.ts).\n const target = value as EndpointTarget;\n const kind = target.kind;\n const allowsKind = (k: TargetKind) => (allowedKinds as readonly TargetKind[]).includes(k);\n\n function emit(next: EndpointTarget) {\n onChange(next as unknown as TargetValue<K>);\n }\n\n const actionTarget = target.kind === \"action\" ? target : undefined;\n const app = actionTarget?.uses.app ?? \"\";\n const actionKey = actionTarget?.uses.action ?? \"\";\n const ref = targetRefOf(target);\n\n // This card already knows the EXACT bound app id, so resolving it never needs the whole\n // catalog: the host API's bounded `listAppsByIds` (`useEditorApp`). An empty id means\n // \"nothing selected yet\" and issues no request.\n const selectedAppSummary = useEditorApp(app);\n\n // `isTriggerApp`/`asFieldDefs` come from a LAZY `@w6w/ui/flow` import (the editor tree carries no\n // static flow import — `WorkflowEditor`'s `flowHelpers` idiom). The workflow arm's fields wait\n // for it exactly as they wait for the workflow detail query.\n const [flowHelpers, setFlowHelpers] = useState<WorkflowFieldCtx | null>(null);\n useEffect(() => {\n let canceled = false;\n import(\"@w6w/ui/flow\").then((m) => {\n if (canceled) return;\n setFlowHelpers({ isTriggerApp: m.isTriggerApp, asFieldDefs: m.asFieldDefs });\n });\n return () => {\n canceled = true;\n };\n }, []);\n const actionsQuery = useAppActionsQuery(app, app !== \"\");\n const connectionsQuery = useConnectionsForAppQuery(app, app !== \"\");\n const selectedAction = useMemo(\n () => (actionsQuery.data ?? []).find((a) => a.key === actionKey),\n [actionsQuery.data, actionKey],\n );\n\n /** Which callable tabs the picker offers — exactly this card's own\n * `allowedKinds`, so a call site that cannot accept a Workflow never sees\n * its tab. `endpoint` has no tab at all (F-2.0: \"no endpoints\"). */\n const callableFamilies = ([\"function\", \"workflow\"] as const).filter(allowsKind);\n\n /** The picker modal's heading, derived from this card's own so it always\n * names what the author is choosing — \"Choose implementation\" on the\n * Functions page, \"Choose target\" on Endpoints, \"Choose reroute target\"\n * from the rail. Never the old hard-coded \"Choose an action\", which stopped\n * being true the moment the Functions/Workflows tabs appeared here. */\n const pickerTitle = `Choose ${title.charAt(0).toLowerCase()}${title.slice(1)}`;\n\n const functionsQuery = useFunctionsQuery(allowsKind(\"function\"));\n const workflowsQuery = useWorkflowsQuery(undefined, allowsKind(\"workflow\"));\n const endpointsQuery = useEndpointsQuery(allowsKind(\"endpoint\"));\n const functionDetailQuery = useFunctionQuery(ref, kind === \"function\" && ref !== \"\");\n const workflowDetailQuery = useWorkflowQuery(ref, kind === \"workflow\" && ref !== \"\");\n const endpointDetailQuery = useEndpointQuery(ref, kind === \"endpoint\" && ref !== \"\");\n\n // A5: one normalized field list across four genuinely different sources.\n const fields = useMemo<TargetField[]>(() => {\n if (kind === \"action\") return paramsToFields(selectedAction?.params ?? []);\n if (kind === \"function\") return paramsToFields(functionDetailQuery.data?.inputs ?? []);\n if (kind === \"workflow\") {\n if (!flowHelpers) return [];\n return fieldsFromWorkflow(\n workflowDetailQuery.data?.workflow as WorkflowLike | undefined,\n flowHelpers,\n );\n }\n if (kind === \"endpoint\") {\n return paramsToFields(endpointDetailQuery.data?.endpoint.input ?? []);\n }\n return [];\n }, [\n kind,\n selectedAction,\n functionDetailQuery.data,\n workflowDetailQuery.data,\n endpointDetailQuery.data,\n flowHelpers,\n ]);\n\n useEffect(() => {\n onResolved?.({ meta: { kind, ref: kind === \"action\" ? app : ref }, kind: kind as K, fields });\n }, [kind, app, ref, fields, onResolved]);\n\n /**\n * The modal's `onAdd`. Handles BOTH shapes the picker can emit, because the\n * picker now offers all three of F-2.0's homepage tabs here\n * (`Connected apps | Functions | Workflows`), not just the app one:\n *\n * - an app action → `{ uses: {app, action, connection}, with }`\n * - a callable → `{ uses: {app: \"@w6w/call\", action: \"call\"},\n * with: {targetKind, targetId, …} }`\n *\n * Anything else `@w6w/*` is a graph-only internal node and is ignored — the\n * modal is opened `appsOnly`, so those tabs are not even rendered; the guard\n * stays as a belt-and-braces refusal.\n */\n function pickTarget(built: BuiltStep) {\n // The callable arm, FIRST: `@w6w/call` also matches the `@w6w/` prefix the\n // internal-node guard below rejects, so ordering is load-bearing.\n if (built.uses.app === CALL_APP) {\n const w = (built.with ?? {}) as { targetKind?: unknown; targetId?: unknown };\n const family = w.targetKind === \"workflow\" ? \"workflow\" : \"function\";\n const id = typeof w.targetId === \"string\" ? w.targetId : \"\";\n // A pick with no id cannot be emitted — it would blank a bound target.\n if (!id) return;\n emit(\n family === \"workflow\"\n ? { kind: \"workflow\", workflow: id }\n : { kind: \"function\", function: id },\n );\n setPickerOpen(false);\n return;\n }\n if (built.uses.app.startsWith(\"@w6w/\")) return; // apps only; ignore internal nodes\n // Pin 6: preserve compatible mappings. The modal returns `built.with` as\n // the NEWLY picked action's params (every key it declares, seeded blank).\n // Carry forward every existing `with` cell whose key the new action still\n // declares, and drop the cells it does not - never a wholesale overwrite.\n const existingWith = target.kind === \"action\" ? (target.with ?? {}) : {};\n const newWith = built.with ?? {};\n const preservedWith: Record<string, unknown> = {};\n for (const key of Object.keys(newWith)) {\n preservedWith[key] = key in existingWith ? existingWith[key] : newWith[key];\n }\n emit({ kind: \"action\", uses: built.uses, with: preservedWith });\n setPickerOpen(false);\n }\n\n function updateWith(paramKey: string, value: unknown) {\n if (target.kind !== \"action\") return;\n const nextWith = { ...(target.with ?? {}) };\n if (value === \"\" || value === undefined) delete nextWith[paramKey];\n else nextWith[paramKey] = value;\n emit({ ...target, with: nextWith });\n }\n\n function handleKindChange(next: TargetKind) {\n emit(\n next === \"action\"\n ? { kind: \"action\", uses: { app: \"\", action: \"\", connection: null } }\n : next === \"function\"\n ? { kind: \"function\", function: \"\" }\n : next === \"workflow\"\n ? { kind: \"workflow\", workflow: \"\" }\n : { kind: \"endpoint\", endpoint: \"\" },\n );\n }\n\n function handleRefChange(next: string) {\n emit(\n kind === \"function\"\n ? { kind: \"function\", function: next }\n : kind === \"workflow\"\n ? { kind: \"workflow\", workflow: next }\n : { kind: \"endpoint\", endpoint: next },\n );\n }\n\n /** Display name for the currently-bound callable, from whichever list owns\n * it. Falls back to the raw id in the JSX while the list is still loading. */\n const pickedCallableLabel = useMemo(() => {\n if (!ref) return undefined;\n if (kind === \"function\") {\n const fn = functionsQuery.data?.find((f) => f.id === ref);\n return fn ? fn.displayName || fn.key : undefined;\n }\n if (kind === \"workflow\") {\n const wf = workflowsQuery.data?.find((w) => w.id === ref);\n return wf ? wf.displayName || wf.name : undefined;\n }\n return undefined;\n }, [kind, ref, functionsQuery.data, workflowsQuery.data]);\n\n // Filter parameters based on showIf conditions and whether they have values\n const actionParams = useMemo(() => {\n const params = (selectedAction?.params ?? []) as ActionParam[];\n const currentWith = actionTarget?.with ?? {};\n\n return params.filter((p) => {\n // First, check showIf conditions - hide if condition not met\n if (p.showIf) {\n const { field, equals, in: inArray, notIn, truthy } = p.showIf;\n const fieldValue = currentWith[field];\n\n // Evaluate the showIf predicate\n if (equals !== undefined && fieldValue !== equals) return false;\n if (inArray !== undefined && !inArray.includes(fieldValue as string | number | boolean)) {\n return false;\n }\n if (notIn?.includes(fieldValue as string | number | boolean)) {\n return false;\n }\n if (truthy !== undefined && Boolean(fieldValue) !== truthy) return false;\n }\n\n // Then, show only: required fields OR fields that have been mapped\n const hasValue =\n p.key in currentWith && currentWith[p.key] !== \"\" && currentWith[p.key] !== undefined;\n return p.required || hasValue;\n });\n }, [selectedAction, actionTarget?.with]);\n\n return (\n <div className=\"card\">\n <h3>{title}</h3>\n <p className=\"muted small\">{description}</p>\n\n {allowedKinds.length > 1 && (\n <label className=\"field\">\n <span>Kind</span>\n <select value={kind} onChange={(e) => handleKindChange(e.target.value as TargetKind)}>\n {KIND_ORDER.filter(allowsKind).map((k) => (\n <option key={k} value={k}>\n {KIND_LABEL[k]}\n </option>\n ))}\n </select>\n </label>\n )}\n\n {kind === \"action\" && (\n <>\n {app && actionKey ? (\n <div className=\"row\" style={{ alignItems: \"center\", gap: 8 }}>\n <AppIcon\n src={selectedAppSummary?.iconSvg}\n srcDark={selectedAppSummary?.iconSvgDark}\n brandColor={selectedAppSummary?.brandColor}\n name={app}\n />\n <span className=\"list-main\">\n <strong>{selectedAction?.title ?? actionKey}</strong>{\" \"}\n <code className=\"muted\">{app}</code>\n <span className=\"muted small block\">\n {actionTarget?.uses.connection\n ? `via ${\n connectionsQuery.data?.find((c) => c.id === actionTarget.uses.connection)\n ?.displayName ?? actionTarget.uses.connection\n }`\n : \"no connection\"}\n </span>\n </span>\n <button type=\"button\" className=\"btn ghost\" onClick={() => setPickerOpen(true)}>\n Change\n </button>\n </div>\n ) : (\n <button type=\"button\" className=\"btn\" onClick={() => setPickerOpen(true)}>\n + Choose an action\n </button>\n )}\n\n {actionKey && (\n <div style={{ marginTop: 12 }}>\n <h4>Input mapping</h4>\n <p className=\"muted small\">\n Map each action param from the inputs above. Reference an input with{\" \"}\n <code>inputs.&lt;key&gt;</code>; anything else is a literal.\n {passthroughHint &&\n \" Leave every cell blank to pass the inbound payload through as the action's params.\"}\n </p>\n {actionParams.length === 0 ? (\n <p className=\"muted small\">This action declares no params.</p>\n ) : (\n <ul className=\"list\">\n {actionParams.map((p) => (\n <li key={p.key} style={{ alignItems: \"center\", gap: 8 }}>\n <span className=\"list-main\">\n <code>{p.key}</code>\n {p.required && <span className=\"muted small\"> · required</span>}\n </span>\n <div style={{ flex: 1 }}>\n <ExpressionInput\n value={\n actionTarget?.with?.[p.key] as\n | string\n | ExprValue\n | SecretValue\n | undefined\n }\n onChange={(next) => updateWith(p.key, next)}\n placeholder={`inputs.${p.key}`}\n aria-label={`Mapping for ${p.key}`}\n />\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </>\n )}\n\n {/* Functions/Workflows go through the SAME modal the action arm uses —\n F-2.0's \"same flow as we do today for selecting action\", and the\n answer to its own `should we implement this everywhere … yes`. These\n two arms were bare `<select>`s, which is why the picker's Functions\n and Workflows tabs were unreachable from this card. */}\n {(kind === \"function\" || kind === \"workflow\") && (\n <div className=\"row\" style={{ alignItems: \"center\", gap: 8 }}>\n {ref ? (\n <>\n <span className=\"list-main\">\n <strong>{pickedCallableLabel ?? ref}</strong> <code className=\"muted\">{ref}</code>\n <span className=\"muted small block\">\n {kind === \"function\" ? \"Function (synchronous)\" : \"Workflow (asynchronous)\"}\n </span>\n </span>\n <button type=\"button\" className=\"btn ghost\" onClick={() => setPickerOpen(true)}>\n Change\n </button>\n </>\n ) : (\n <button type=\"button\" className=\"btn\" onClick={() => setPickerOpen(true)}>\n + Choose a {kind}\n </button>\n )}\n </div>\n )}\n\n {pickerOpen && (\n /* No provider here. The scope this modal needs is INHERITED from\n the page (which contributes its `inputs`) over the app shell\n (vars/secrets/documents) — the same scope the mapping rows below\n see, which is the entire point: reaching the expression editor\n through \"Change\" and reaching it through a row's `ƒx` toggle must\n offer the identical rail. Wrapping only this modal is what made\n them disagree.\n\n ONE modal for the whole card, not one per arm: it now offers every\n kind this card allows, so which arm is showing decides only which\n tab it OPENS on, never whether it renders. */\n <StepBuilderModal\n appsOnly\n callables={callableFamilies}\n initialTab={kind === \"function\" || kind === \"workflow\" ? `${kind}s` : \"connected\"}\n title={pickerTitle}\n onClose={() => setPickerOpen(false)}\n onAdd={pickTarget}\n initialApp={actionTarget && app ? selectedAppSummary : undefined}\n initialAction={actionTarget ? actionKey : undefined}\n initialConnection={actionTarget?.uses.connection ?? undefined}\n initialWith={actionTarget?.with}\n />\n )}\n\n {kind === \"endpoint\" && (\n <label className=\"field\">\n <span>Endpoint</span>\n <select value={ref} onChange={(e) => handleRefChange(e.target.value)}>\n <option value=\"\">— pick an endpoint —</option>\n {endpointsQuery.data?.map((ep) => (\n <option key={ep.id} value={ep.id}>\n {ep.displayName || ep.key} ({ep.id})\n </option>\n ))}\n </select>\n </label>\n )}\n </div>\n );\n}\n","import { ApiError } from \"@w6w/sdk\";\nimport { type ExpressionOptions, ExpressionOptionsProvider, IconButton } from \"@w6w/ui\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { HistoryButton } from \"../chrome/HistoryButton.tsx\";\nimport { JsonToggle, JsonToggleButton } from \"../chrome/JsonToggle.tsx\";\nimport { useWorkspace } from \"../chrome/workspace.tsx\";\nimport { useEndpointDraft } from \"../draft/index.ts\";\nimport { EndpointIdentityModal } from \"../forms/CreateEndpointModal.tsx\";\nimport { descriptorFor } from \"../lib/callable-descriptors.ts\";\nimport {\n type UrlForm,\n buildEndpointSaveBody,\n normalizeEndpoint,\n selectedUrlEntry,\n urlCardEntry,\n urlOptions,\n} from \"../lib/endpoint-editor.ts\";\nimport { uncoveredForEndpoint } from \"../lib/input-coverage.ts\";\nimport { mergeSeed, shouldSeed, uncoveredRequiredKeys } from \"../lib/input-seeding.ts\";\nimport { evaluateEdit } from \"../lib/rail-settings.ts\";\nimport type { TargetField } from \"../lib/target-fields.ts\";\nimport { useEditorProject } from \"../project-context.ts\";\nimport type { RailNavigation } from \"../rail/rail-env.tsx\";\nimport {\n type EndpointDef,\n type EndpointOwnTarget,\n type EndpointSecurity,\n useEndpointQuery,\n} from \"../repos/endpoints.ts\";\nimport { CallableEditorFrame } from \"./CallableEditorFrame.tsx\";\nimport { EditorShell } from \"./EditorShell.tsx\";\nimport { EndpointTestInvoke, SecurityCard, UrlCard } from \"./EndpointCards.tsx\";\nimport { InputListEditor } from \"./InputListEditor.tsx\";\nimport { TargetSelector } from \"./TargetSelector.tsx\";\nimport type { CallableEditorNavigation, EndpointEditorProps } from \"./types.ts\";\n\nconst NOOP = () => {};\n\nfunction messageOf(e: unknown): string {\n return e instanceof ApiError || e instanceof Error ? e.message : String(e);\n}\n\n/**\n * `<EndpointEditor endpointId>` — Studio's endpoint editor body (Identity, URL, Input, Target,\n * Security, Test invoke, History, JSON toggle) as a published component. The outermost element is\n * `.w6w-embed-root`; nothing goes through a portal.\n *\n * ## One cache, one draft\n *\n * Every field is the buffer of `useEndpointDraft` (seeded from, and refreshed by, the ONE\n * `[\"endpoint\", id]` query), and every write — the header Save, the bottom Save and the JSON\n * toggle's Save — is that draft's `commit`, so each issues one POST carrying the stored\n * `updatedAt` (`If-Unmodified-Since`). A 409 `endpoint_stale` is shown inline with a Reload and is\n * never retried. The invoke URLs are read from the same query's envelope, never copied into state,\n * so a rail save or an external change shows without a remount.\n *\n * A Save with nothing changed since the last read sends no request (the draft is clean).\n *\n * ## Rail\n *\n * `rail` omitted: the editor owns a rail. `rail={false}` inside a `<CallableWorkspace>` for the\n * SAME endpoint id publishes into it; with `rail={false}` the rail saves use the WORKSPACE's\n * `project`, not the `project` prop here. A workspace for a different id is silently overridden\n * while this editor is mounted.\n */\nexport function EndpointEditor(props: EndpointEditorProps): ReactNode {\n const { endpointId, onNavigate = NOOP, slots, tools } = props;\n const project = useEditorProject(props.project);\n const railNavigate = useCallback(\n (to: RailNavigation) => (onNavigate as (to: RailNavigation) => void)(to),\n [onNavigate],\n );\n return (\n <div\n className=\"w6w-embed-root\"\n style={{ display: \"flex\", width: \"100%\", height: \"100%\", minHeight: 0 }}\n >\n <EditorShell\n project={project}\n onNavigate={railNavigate}\n rail={props.rail}\n tools={tools}\n storageKey={project === null ? null : `w6w.rail.embed.${project}`}\n >\n <div style={{ flex: 1, minWidth: 0, overflow: \"auto\" }}>\n <EndpointBody\n key={endpointId}\n id={endpointId}\n onNavigate={onNavigate as (to: CallableEditorNavigation) => void}\n slots={slots}\n />\n </div>\n </EditorShell>\n </div>\n );\n}\n\nfunction EndpointBody(props: {\n id: string;\n onNavigate: (to: CallableEditorNavigation) => void;\n slots: EndpointEditorProps[\"slots\"];\n}) {\n const { id, onNavigate, slots } = props;\n const descriptor = descriptorFor(\"endpoint\");\n\n // The envelope the invoke URLs come from — the draft reads the same entry (one GET).\n const envelope = useEndpointQuery(id).data;\n\n const [resolvedFields, setResolvedFields] = useState<TargetField[]>([]);\n const resolvedRef = useRef(resolvedFields);\n resolvedRef.current = resolvedFields;\n const pendingPickRef = useRef(false);\n const touchedRef = useRef(false);\n const [urlForm, setUrlForm] = useState<UrlForm>(\"id\");\n const [urlDomain, setUrlDomain] = useState<string | null>(null);\n const [showIdentity, setShowIdentity] = useState(false);\n const [saved, setSaved] = useState(false);\n const [showJson, setShowJson] = useState(false);\n const [json, setJson] = useState(\"\");\n const [jsonStored, setJsonStored] = useState({ id, key: \"\" });\n const [jsonError, setJsonError] = useState<string | null>(null);\n\n // The save gate also guards every non-button save path (hide, unmount, registry flush).\n const saveGuard = useCallback((def: Record<string, unknown>) => {\n const e = normalizeEndpoint(def as unknown as EndpointDef);\n const unfed = uncoveredForEndpoint({\n target: e.target,\n rows: e.input ?? [],\n fields: resolvedRef.current,\n });\n return unfed.length > 0 ? `The target needs: ${unfed.join(\", \")}` : null;\n }, []);\n const draft = useEndpointDraft({ id, saveGuard });\n\n const view = useMemo(\n () => (draft.definition ? normalizeEndpoint(draft.definition as unknown as EndpointDef) : null),\n [draft.definition],\n );\n const inputs = view?.input ?? [];\n const security: EndpointSecurity = view?.exposure?.security ?? {\n auth: \"platform\",\n };\n\n const options = urlOptions(envelope?.invokeUrls);\n const selected = selectedUrlEntry(envelope?.invokeUrls, urlDomain);\n\n useWorkspace({\n kind: \"endpoint\",\n id,\n label: view?.displayName || undefined,\n key: view?.key.trim() || undefined,\n invokeUrl: selected ? selected.url : envelope?.invokeUrl,\n invokeUrlByKey: selected ? selected.urlByKey : envelope?.invokeUrlByKey,\n urlForm,\n inputs: resolvedFields.map((f) => f.key),\n policy: draft.policy,\n onPolicyChange: draft.onPolicyChange,\n });\n\n const { setDefinition } = draft;\n const patch = useCallback(\n (next: Partial<EndpointDef>) => {\n setSaved(false);\n setDefinition((d) => ({\n ...normalizeEndpoint(d as unknown as EndpointDef),\n ...next,\n }));\n },\n [setDefinition],\n );\n const patchSecurity = (next: Partial<EndpointSecurity>) => {\n setSaved(false);\n setDefinition((d) => {\n const e = normalizeEndpoint(d as unknown as EndpointDef);\n const merged = {\n ...(e.exposure?.security ?? { auth: \"platform\" }),\n ...next,\n };\n return { ...e, exposure: { ...e.exposure, security: merged } };\n });\n };\n\n function onTargetChange(next: EndpointOwnTarget) {\n pendingPickRef.current = true;\n patch({ target: next });\n }\n\n // Seeds the Input list from a freshly picked target — never on hydration (`pendingPickRef` is set\n // only by a genuine in-session pick), never over a touched or non-empty list.\n // biome-ignore lint/correctness/useExhaustiveDependencies: keyed on resolvedFields only — inputs/patch are read for their current value, not to retrigger the seed on every edit.\n useEffect(() => {\n if (!pendingPickRef.current) return;\n if (!shouldSeed({ rows: inputs, touched: touchedRef.current })) {\n pendingPickRef.current = false;\n return;\n }\n if (resolvedFields.length === 0) return;\n patch({ input: mergeSeed(inputs, resolvedFields) });\n pendingPickRef.current = false;\n }, [resolvedFields]);\n\n const pageExprScope = useMemo<ExpressionOptions>(\n () => ({ inputs: inputs.map((inp) => inp.key).filter(Boolean) }),\n [inputs],\n );\n const uncoveredKeys = useMemo(\n () => uncoveredRequiredKeys(inputs, resolvedFields),\n [inputs, resolvedFields],\n );\n const unfedKeys = useMemo(\n () =>\n view\n ? uncoveredForEndpoint({\n target: view.target,\n rows: inputs,\n fields: resolvedFields,\n })\n : [],\n [view, inputs, resolvedFields],\n );\n\n // Rendered beside BOTH Save buttons: a greyed button with its explanation off-screen is the\n // mysterious kind.\n const saveBlockedNote =\n view && unfedKeys.length > 0 ? (\n <p className=\"error small\" data-testid=\"save-blocked\">\n Can’t save yet — the target needs{\" \"}\n {view.target.kind === \"action\"\n ? \"these required params mapped under Input mapping\"\n : \"these required keys declared under Input\"}\n : <strong>{unfedKeys.join(\", \")}</strong>\n </p>\n ) : null;\n\n const key = view?.key.trim() ?? \"\";\n const canSave = Boolean(key) && unfedKeys.length === 0 && draft.canSave;\n\n async function onSave() {\n if (!view) return;\n const out = await draft.commit(buildEndpointSaveBody(view) as Record<string, unknown>);\n // A clean buffer writes nothing but still confirms, as FunctionEditor does (D-B5-1).\n setSaved(out.status === \"saved\" || out.status === \"clean\");\n }\n\n function openJson() {\n if (!view) return;\n const body = buildEndpointSaveBody(view);\n setJson(JSON.stringify(body, null, 2));\n setJsonStored({ id: String(body.id), key: String(body.key) });\n setJsonError(null);\n setShowJson(true);\n }\n\n async function onJsonSave() {\n const evalResult = evaluateEdit(json, jsonStored);\n const parsed = evalResult.parsed;\n if (!parsed || evalResult.blockedReason) return;\n const out = await draft.commit(parsed as Record<string, unknown>);\n if (out.status === \"saved\" || out.status === \"clean\") {\n setJsonError(null);\n setShowJson(false);\n // A clean buffer writes nothing but still confirms, as FunctionEditor does (D-B5-1).\n setSaved(out.status === \"saved\" || out.status === \"clean\");\n } else if (out.status === \"failed\") setJsonError(messageOf(out.error));\n else setJsonError(out.reason);\n }\n\n const loadErr = draft.loadError;\n const notFound = loadErr instanceof ApiError && loadErr.status === 404;\n if (!view) {\n if (loadErr !== null && !notFound) {\n return (\n <div className=\"error\" role=\"alert\">\n {messageOf(loadErr)}\n </div>\n );\n }\n if (!notFound) return <p className=\"muted\">Loading…</p>;\n }\n\n const title = view\n ? view.displayName || view.key || descriptor.editor.newTitle\n : descriptor.editor.newTitle;\n const stateError = draft.error !== null && !draft.stale ? messageOf(draft.error) : null;\n const staleBanner =\n draft.stale || draft.changedElsewhere ? (\n <div className=\"error\" role=\"alert\" data-testid=\"endpoint-stale\">\n {draft.stale\n ? messageOf(draft.error)\n : \"This endpoint was changed elsewhere. Reload to see the new version (your edits will be discarded).\"}{\" \"}\n <button type=\"button\" className=\"btn ghost\" onClick={() => void draft.reload()}>\n Reload\n </button>\n </div>\n ) : null;\n\n return (\n <ExpressionOptionsProvider value={pageExprScope}>\n <CallableEditorFrame\n kind=\"endpoint\"\n title={title}\n incomplete={false}\n canSave={canSave}\n isSaving={draft.saving}\n onSave={() => void onSave()}\n error={notFound ? messageOf(loadErr) : stateError}\n notFound={notFound}\n onNavigate={onNavigate}\n slots={slots}\n headerActions={\n <>\n <HistoryButton kind=\"endpoint\" id={id} />\n <JsonToggleButton onClick={openJson} />\n </>\n }\n banners={\n <>\n {staleBanner}\n {saveBlockedNote}\n {saved && <span className=\"ok\">Saved.</span>}\n </>\n }\n >\n {view && (\n <>\n <div className=\"card\">\n <div className=\"section-head\">\n <h3>Identity</h3>\n <IconButton\n icon=\"edit-2\"\n label=\"Edit name, key, and description\"\n onClick={() => setShowIdentity(true)}\n />\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Display name</span>\n <span>{view.displayName || \"—\"}</span>\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Key</span>\n <code className=\"muted\">{view.key || \"—\"}</code>\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Description</span>\n <span>{view.description || \"—\"}</span>\n </div>\n </div>\n\n <UrlCard\n entry={urlCardEntry(selected, envelope?.invokeUrl, envelope?.invokeUrlByKey)}\n domainOptions={options}\n urlDomain={selected?.domain ?? null}\n onUrlDomain={setUrlDomain}\n urlForm={urlForm}\n onUrlForm={setUrlForm}\n />\n\n <InputListEditor\n title=\"Input\"\n description=\"The declared inbound contract. Reuses core Param fields. Leave empty to pass the raw request payload through to the target unchanged.\"\n emptyMeansPassthrough={true}\n rows={inputs}\n onChange={(next) => {\n touchedRef.current = true;\n patch({ input: next });\n }}\n uncoveredKeys={uncoveredKeys}\n />\n\n <TargetSelector\n allowedKinds={[\"action\", \"function\", \"workflow\"] as const}\n title=\"Target\"\n description={\n <>\n The single thing this Endpoint dispatches to. An <strong>Action</strong> target\n runs one app action directly and a <strong>Function</strong> target resolves\n synchronously to a value; a <strong>Workflow</strong> target enqueues an\n asynchronous run. Switching the target here preserves the key and the input\n contract below, so callers never break.\n </>\n }\n passthroughHint\n value={view.target}\n onChange={onTargetChange}\n onResolved={(t) => setResolvedFields(t.fields)}\n />\n\n <SecurityCard security={security} onPatch={patchSecurity} />\n\n <EndpointTestInvoke id={id} inputs={inputs} />\n\n <div\n className=\"row\"\n style={{\n justifyContent: \"flex-end\",\n alignItems: \"center\",\n gap: \"var(--w6w-sp-3)\",\n marginTop: \"var(--w6w-sp-4)\",\n }}\n >\n {saveBlockedNote}\n {saved && <span className=\"ok\">Saved.</span>}\n <button\n type=\"button\"\n className=\"btn\"\n disabled={!canSave}\n onClick={() => void onSave()}\n >\n {draft.saving ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n\n {showIdentity && (\n <EndpointIdentityModal\n initial={{\n key: view.key,\n displayName: view.displayName ?? \"\",\n description: view.description ?? \"\",\n }}\n onClose={() => setShowIdentity(false)}\n onSaved={(next) => {\n patch({\n displayName: next.displayName,\n description: next.description,\n });\n setShowIdentity(false);\n }}\n />\n )}\n\n <JsonToggle\n open={showJson}\n onClose={() => setShowJson(false)}\n title={`JSON — ${title}`}\n mode=\"disconnected\"\n value={json}\n onChange={setJson}\n guard={(t) => evaluateEdit(t, jsonStored).blockedReason}\n onSave={() => void onJsonSave()}\n saving={draft.saving}\n error={jsonError}\n editorLabel=\"Endpoint definition JSON\"\n />\n </>\n )}\n </CallableEditorFrame>\n </ExpressionOptionsProvider>\n );\n}\n","import { useQueryClient } from \"@tanstack/react-query\";\nimport { ApiError } from \"@w6w/sdk\";\nimport { type ExpressionOptions, ExpressionOptionsProvider, IconButton } from \"@w6w/ui\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { HistoryButton } from \"../chrome/HistoryButton.tsx\";\nimport { JsonToggle, JsonToggleButton } from \"../chrome/JsonToggle.tsx\";\nimport { useWorkspace } from \"../chrome/workspace.tsx\";\nimport { type CallableDraft, useFunctionDraft } from \"../draft/index.ts\";\nimport { FunctionIdentityModal } from \"../forms/CreateFunctionModal.tsx\";\nimport { coerceInput } from \"../lib/coerce-input.ts\";\nimport { historyKeys } from \"../lib/history-query.ts\";\nimport { uncoveredForFunction } from \"../lib/input-coverage.ts\";\nimport {\n inputsForSave,\n mergeSeed,\n shouldSeed,\n uncoveredRequiredKeys,\n} from \"../lib/input-seeding.ts\";\nimport { type EditStored, evaluateEdit } from \"../lib/rail-settings.ts\";\nimport { slugify } from \"../lib/slug.ts\";\nimport { type TargetField, implToTarget, targetToImpl } from \"../lib/target-fields.ts\";\nimport { useEditorProject } from \"../project-context.ts\";\nimport {\n type FunctionDef,\n type FunctionInput,\n type FunctionInvokeResult,\n useFunctionQuery,\n useInvokeFunctionMutation,\n} from \"../repos/functions.ts\";\nimport { CallableEditorFrame } from \"./CallableEditorFrame.tsx\";\nimport { EditorShell } from \"./EditorShell.tsx\";\nimport { InputListEditor } from \"./InputListEditor.tsx\";\nimport { TargetSelector } from \"./TargetSelector.tsx\";\nimport type { CallableEditorNavigation, FunctionEditorProps } from \"./types.ts\";\n\nconst NOOP = (): void => {};\n\nconst errMsg = (e: unknown): string => (e instanceof Error ? e.message : String(e));\n\n/**\n * The managed Function editor: Interface, Inputs, Implementation, Test invoke, History and a JSON\n * toggle, on `EditorShell`. The outermost element is `.w6w-embed-root`; nothing goes through a\n * portal.\n *\n * Every read and write goes through `useFunctionDraft` (one cache entry, `[\"function\", id]`; one\n * stale-write token). Save, the JSON toggle's Save and the rail's Error handling (`onPolicyChange`)\n * all persist through the draft, so each carries `If-Unmodified-Since`; a 409 shows inline with a\n * reload control and is never retried. `project` is not a save precondition (a Function is\n * account-scoped): it scopes the expression rail and the rail's storage key only.\n *\n * `rail` defaults to `true`: the editor renders its own right rail. `rail={false}` renders none and\n * publishes the Function (key, inputs, policy, `onPolicyChange`) into an enclosing\n * `<CallableWorkspace kind=\"function\" id>` for the SAME id; an editor whose id differs from its\n * workspace's overrides it and the host's rail renders empty. With `rail={false}` inside a\n * workspace, the rail's saves use that workspace's `project`, not this editor's `project` prop.\n * Aliases are not part of this editor; a host adds its own through `tools`.\n */\nexport function FunctionEditor(props: FunctionEditorProps): ReactNode {\n const { functionId, onNavigate = NOOP, slots, tools } = props;\n const project = useEditorProject(props.project);\n return (\n <div\n className=\"w6w-embed-root\"\n style={{ display: \"flex\", width: \"100%\", height: \"100%\", minHeight: 0 }}\n >\n <EditorShell\n project={project}\n onNavigate={onNavigate}\n rail={props.rail}\n tools={tools}\n storageKey={project === null ? null : `w6w.rail.embed.${project}`}\n >\n <FunctionDraftHost functionId={functionId} onNavigate={onNavigate} slots={slots} />\n </EditorShell>\n </div>\n );\n}\n\n/** Holds the draft ABOVE the per-id session, so a switch of `functionId` re-targets one hook (the\n * draft resets its own stale/error/changed-elsewhere/saving) while local UI state remounts. */\nfunction FunctionDraftHost(props: {\n functionId: string;\n onNavigate: (to: CallableEditorNavigation) => void;\n slots: FunctionEditorProps[\"slots\"];\n}): ReactNode {\n const draft = useFunctionDraft({ id: props.functionId });\n return <FunctionSession key={props.functionId} {...props} draft={draft} />;\n}\n\nfunction FunctionSession(props: {\n functionId: string;\n draft: CallableDraft;\n onNavigate: (to: CallableEditorNavigation) => void;\n slots: FunctionEditorProps[\"slots\"];\n}): ReactNode {\n const { functionId: id, draft, onNavigate, slots } = props;\n const def = draft.definition as FunctionDef | null;\n const inputs: FunctionDef[\"inputs\"] = def?.inputs ?? [];\n\n // `valid` is server-computed (never re-derived here); it rides the SAME cache entry the draft\n // reads, so this adds no request.\n const fnQuery = useFunctionQuery(id);\n const valid = (fnQuery.data as { valid?: boolean } | undefined)?.valid === true;\n\n const loadError = draft.loadError;\n const notFound = loadError instanceof ApiError && loadError.status === 404;\n\n const [showIdentity, setShowIdentity] = useState(false);\n const [notice, setNotice] = useState<string | null>(null);\n const [saved, setSaved] = useState(false);\n const [reloading, setReloading] = useState(false);\n\n const key = (def?.key ?? \"\").trim() || slugify(def?.displayName ?? \"\");\n\n // The resource this editor publishes into the rail (Studio's `workspace` memo, minus `alias`).\n useWorkspace({\n kind: \"function\",\n id,\n label: def?.displayName || undefined,\n key: key || undefined,\n inputs: inputs\n .filter((i) => Boolean(i.key))\n .map((i) => ({ key: i.key, required: i.required === true })),\n policy: draft.policy,\n onPolicyChange: draft.onPolicyChange,\n });\n\n const patch = (next: Partial<FunctionDef>) =>\n draft.setDefinition((d) => ({ ...d, ...next }) as Record<string, unknown>);\n\n // A pick's resolved fields seed an EMPTY, untouched Inputs list once (see `input-seeding.ts`).\n const [resolvedFields, setResolvedFields] = useState<TargetField[]>([]);\n const pendingPickRef = useRef(false);\n const touchedRef = useRef(false);\n // biome-ignore lint/correctness/useExhaustiveDependencies: keyed on resolvedFields only — inputs/patch are read for their current value, not to retrigger the seed on every edit.\n useEffect(() => {\n if (!pendingPickRef.current) return;\n if (!shouldSeed({ rows: inputs, touched: touchedRef.current })) {\n pendingPickRef.current = false;\n return;\n }\n if (resolvedFields.length === 0) return;\n patch({ inputs: mergeSeed(inputs, resolvedFields) });\n pendingPickRef.current = false;\n }, [resolvedFields]);\n\n const uncoveredKeys = useMemo(\n () => uncoveredRequiredKeys(inputs, resolvedFields),\n [inputs, resolvedFields],\n );\n const pageExprScope = useMemo<ExpressionOptions>(\n () => ({ inputs: inputs.map((inp) => inp.key).filter(Boolean) }),\n [inputs],\n );\n\n function onImplChange(next: Parameters<typeof targetToImpl>[0]) {\n pendingPickRef.current = true;\n const impl = targetToImpl(next);\n patch({ impl: def?.impl?.outputMap ? { ...impl, outputMap: def.impl.outputMap } : impl });\n }\n\n // A Function has no pass-through mode: every required param of the bound action must be mapped.\n // With no action chosen the field list is empty and the rule is vacuous (a deliberately\n // incomplete Function stays saveable; `incomplete` is its signal).\n const unfedKeys = useMemo(\n () => uncoveredForFunction({ impl: def?.impl, fields: resolvedFields }),\n [def?.impl, resolvedFields],\n );\n const canSave = Boolean(key) && unfedKeys.length === 0 && draft.canSave;\n\n // The exact body a Save sends — the ONE builder, so the JSON toggle's seed cannot drift from it.\n function buildSaveBody(): Record<string, unknown> {\n return {\n ...(def as FunctionDef),\n key,\n inputs: inputsForSave(inputs, { emptyMeansPassthrough: false }),\n };\n }\n\n async function onSave() {\n setNotice(null);\n setSaved(false);\n const out = await draft.commit(buildSaveBody());\n if (out.status === \"saved\" || out.status === \"clean\") setSaved(true);\n else if (out.status === \"blocked\") setNotice(out.reason);\n }\n\n const [showJson, setShowJson] = useState(false);\n const [json, setJson] = useState(\"\");\n const [jsonStored, setJsonStored] = useState<EditStored>({ id, key: \"\" });\n const [jsonError, setJsonError] = useState<string | null>(null);\n\n function openJson() {\n const body = buildSaveBody();\n setJson(JSON.stringify(body, null, 2));\n setJsonStored({ id: String(body.id), key: String(body.key) });\n setJsonError(null);\n setShowJson(true);\n }\n\n async function onJsonSave() {\n const evaluated = evaluateEdit(json, jsonStored);\n if (!evaluated.parsed || evaluated.blockedReason) return;\n setSaved(false);\n const out = await draft.commit(evaluated.parsed as Record<string, unknown>);\n if (out.status === \"saved\" || out.status === \"clean\") {\n setJsonError(null);\n setShowJson(false);\n setSaved(true);\n } else if (out.status === \"blocked\") setJsonError(out.reason);\n else if (out.status === \"failed\") setJsonError(errMsg(out.error));\n }\n\n const reload = useCallback(async () => {\n setReloading(true);\n try {\n await draft.reload();\n setNotice(null);\n setSaved(false);\n } finally {\n setReloading(false);\n }\n }, [draft.reload]);\n\n const failure = draft.stale ? null : (draft.error ?? loadError);\n const bannerError = notice ?? (failure === null ? null : errMsg(failure));\n\n const title = def?.displayName || def?.key || \"New function\";\n\n if (draft.loading || (def === null && loadError === null)) {\n return <p className=\"muted\">Loading…</p>;\n }\n\n return (\n <div style={{ flex: 1, minWidth: 0, overflow: \"auto\" }}>\n <ExpressionOptionsProvider value={pageExprScope}>\n <CallableEditorFrame\n kind=\"function\"\n title={title}\n incomplete={def !== null && !valid}\n canSave={canSave}\n isSaving={draft.saving}\n onSave={() => void onSave()}\n error={bannerError}\n notFound={notFound}\n onNavigate={onNavigate}\n slots={slots}\n headerActions={\n def && (\n <>\n <HistoryButton kind=\"function\" id={id} />\n <JsonToggleButton onClick={openJson} />\n </>\n )\n }\n banners={\n <>\n {draft.stale && (\n <div className=\"error\" role=\"alert\" data-testid=\"save-stale\">\n <p>\n This function changed on the server after you opened it. Your save was refused,\n so their work is intact.\n </p>\n <button type=\"button\" className=\"btn\" disabled={reloading} onClick={reload}>\n {reloading ? \"Reloading…\" : \"Reload from server\"}\n </button>\n </div>\n )}\n {draft.changedElsewhere && !draft.stale && (\n <div className=\"muted small\" data-testid=\"changed-elsewhere\">\n <p>\n This function was changed elsewhere. Reloading replaces your unsaved edits with\n the saved copy.\n </p>\n <button type=\"button\" className=\"btn ghost\" disabled={reloading} onClick={reload}>\n {reloading ? \"Reloading…\" : \"Reload from server\"}\n </button>\n </div>\n )}\n {unfedKeys.length > 0 && (\n <p className=\"error small\" data-testid=\"save-blocked\">\n Can’t save yet — map {unfedKeys.length > 1 ? \"these\" : \"this\"} required action{\" \"}\n {unfedKeys.length > 1 ? \"params\" : \"param\"} under Input mapping above:{\" \"}\n <strong>{unfedKeys.join(\", \")}</strong>\n </p>\n )}\n {saved && <span className=\"ok\">Saved.</span>}\n </>\n }\n >\n {def && (\n <>\n <div className=\"card\">\n <div className=\"section-head\">\n <h3>Interface</h3>\n <IconButton\n icon=\"edit-2\"\n label=\"Edit name, key, and description\"\n onClick={() => setShowIdentity(true)}\n />\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Display name</span>\n <span>{def.displayName || \"—\"}</span>\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Key</span>\n <code className=\"muted\">{def.key || \"—\"}</code>\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Description</span>\n <span>{def.description || \"—\"}</span>\n </div>\n </div>\n\n <InputListEditor\n title=\"Inputs\"\n description=\"The canonical, vendor-stable interface a caller binds to. Reuses core Param fields.\"\n emptyMeansPassthrough={false}\n rows={inputs}\n onChange={(next) => {\n touchedRef.current = true;\n patch({ inputs: next });\n }}\n uncoveredKeys={uncoveredKeys}\n />\n\n <TargetSelector\n allowedKinds={[\"action\", \"function\", \"workflow\"] as const}\n title=\"Implementation\"\n description={\n <>\n Bind the interface to one concrete app action, another Function, or a Workflow.\n Switching the provider here (a \"re-bind\") rewrites only <code>impl</code>'s\n target fields - the interface above, and every caller, is untouched.\n </>\n }\n value={implToTarget(def.impl)}\n onChange={onImplChange}\n onResolved={(t) => setResolvedFields(t.fields)}\n />\n\n <TestInvoke id={id} inputs={inputs} disabled={!valid} invalid={!valid} />\n\n {showIdentity && (\n <FunctionIdentityModal\n initial={{\n key: def.key,\n displayName: def.displayName ?? \"\",\n description: def.description ?? \"\",\n }}\n onClose={() => setShowIdentity(false)}\n onSaved={(next) => {\n patch({ displayName: next.displayName, description: next.description });\n setShowIdentity(false);\n }}\n />\n )}\n\n <JsonToggle\n open={showJson}\n onClose={() => setShowJson(false)}\n title={`JSON — ${title}`}\n mode=\"disconnected\"\n value={json}\n onChange={setJson}\n guard={(t) => evaluateEdit(t, jsonStored).blockedReason}\n onSave={() => void onJsonSave()}\n saving={draft.saving}\n error={jsonError}\n editorLabel=\"Function definition JSON\"\n />\n </>\n )}\n </CallableEditorFrame>\n </ExpressionOptionsProvider>\n </div>\n );\n}\n\n/** Test-invoke panel: one field per canonical input, run through `invokeFunction`. The server\n * invokes the STORED definition, so Save first. */\nfunction TestInvoke(props: {\n id: string;\n inputs: FunctionInput[];\n disabled: boolean;\n invalid: boolean;\n}): ReactNode {\n const { id, inputs } = props;\n const [values, setValues] = useState<Record<string, string>>({});\n const [result, setResult] = useState<FunctionInvokeResult | undefined>(undefined);\n const [error, setError] = useState<string | null>(null);\n const qc = useQueryClient();\n const invoke = useInvokeFunctionMutation();\n\n async function run() {\n const payload: Record<string, unknown> = {};\n for (const inp of inputs) {\n const coerced = coerceInput(inp.type, values[inp.key] ?? \"\");\n if (coerced !== undefined) payload[inp.key] = coerced;\n }\n try {\n const out = await invoke.mutateAsync({ id, inputs: payload });\n setError(null);\n setResult(out);\n } catch (e) {\n setResult(undefined);\n setError(errMsg(e));\n } finally {\n void qc.invalidateQueries({ queryKey: historyKeys.root });\n }\n }\n\n return (\n <div className=\"card\">\n <h3>Test invoke</h3>\n <p className=\"muted small\">\n Runs the saved Function through its bound action. Save any edits first.\n </p>\n {props.invalid && (\n <p className=\"muted small\">\n Pick an app and action to test this function — it has no implementation bound yet.\n </p>\n )}\n {inputs.length === 0 && (\n <p className=\"muted small\">Add inputs above to supply test values.</p>\n )}\n {inputs.map((inp) => {\n const fieldId = `fn-invoke-${inp.key || inp.label}`;\n return (\n <div className=\"field\" key={inp.key || inp.label}>\n <label htmlFor={fieldId}>\n {inp.label || inp.key}\n {inp.required && \" *\"}\n </label>\n {inp.type === \"boolean\" ? (\n <select\n id={fieldId}\n value={values[inp.key] ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, [inp.key]: e.target.value }))}\n >\n <option value=\"\">—</option>\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : (\n <input\n id={fieldId}\n type={inp.type === \"number\" ? \"number\" : \"text\"}\n value={values[inp.key] ?? \"\"}\n placeholder={inp.type === \"json\" ? \"{ }\" : (inp.hint ?? \"\")}\n onChange={(e) => setValues((v) => ({ ...v, [inp.key]: e.target.value }))}\n />\n )}\n </div>\n );\n })}\n <div className=\"row\">\n <button\n type=\"button\"\n className=\"btn\"\n disabled={props.disabled || invoke.isPending}\n onClick={() => void run()}\n >\n {invoke.isPending ? \"Invoking…\" : \"Invoke\"}\n </button>\n </div>\n {error && <div className=\"result error\">{error}</div>}\n {result !== undefined && (\n <>\n {result.invocationId && (\n <p className=\"muted small\">\n {result.status ?? \"done\"}\n {result.durationMs !== undefined ? ` · ${result.durationMs} ms` : \"\"}\n {\" · \"}\n <code>{result.invocationId}</code>\n </p>\n )}\n <pre className=\"result\" style={{ overflow: \"auto\" }}>\n {JSON.stringify(result.output, null, 2)}\n </pre>\n </>\n )}\n </div>\n );\n}\n"],"names":["codeLanguageForDocFormat","format","DocumentEditor","documentId","project","onDeleted","onBack","slots","p","useEditorProject","docQuery","useDocumentQuery","deleteMut","useDeleteDocumentMutation","editing","setEditing","useState","deletePending","setDeletePending","jsx","doc","empty","jsxs","Fragment","header","actions","CallFromCodeButton","EditButton","DeleteButton","Copyable","CodeBlock","DocumentFormModal","ConfirmModal","BLANK_TARGET","normalizeEndpoint","e","buildEndpointSaveBody","draft","target","input","rest","body","targetIsBound","inputs","inputsForSave","urlOptions","invokeUrls","selectedUrlEntry","pickedDomain","options","u","urlCardEntry","selected","invokeUrl","invokeUrlByKey","CallableEditorFrame","props","descriptor","descriptorFor","backLabel","goBack","ExecutionProfileHeader","AUTH_MODES","UrlCard","entry","domainOptions","urlDomain","onUrlDomain","urlForm","onUrlForm","hasByKey","shown","_a","form","label","title","SecurityCard","security","onPatch","mode","m","SecretField","v","stored","SECRET_MASK","EndpointTestInvoke","id","values","setValues","output","setOutput","error","setError","qc","useQueryClient","invokeMut","useInvokeEndpointMutation","invoke","payload","inp","coerced","coerceInput","out","ApiError","historyKeys","fieldId","InputListEditor","rows","onChange","description","emptyMeansPassthrough","uncoveredKeys","addInput","updateInput","i","next","idx","removeInput","_","INPUT_TYPES","IconButton","KIND_ORDER","KIND_LABEL","TargetSelector","allowedKinds","value","onResolved","passthroughHint","pickerOpen","setPickerOpen","kind","allowsKind","k","emit","actionTarget","app","actionKey","ref","targetRefOf","selectedAppSummary","useEditorApp","flowHelpers","setFlowHelpers","useEffect","canceled","actionsQuery","useAppActionsQuery","connectionsQuery","useConnectionsForAppQuery","selectedAction","useMemo","a","callableFamilies","pickerTitle","functionsQuery","useFunctionsQuery","workflowsQuery","useWorkflowsQuery","endpointsQuery","useEndpointsQuery","functionDetailQuery","useFunctionQuery","workflowDetailQuery","useWorkflowQuery","endpointDetailQuery","useEndpointQuery","fields","paramsToFields","fieldsFromWorkflow","_b","_c","pickTarget","built","CALL_APP","w","family","existingWith","newWith","preservedWith","key","updateWith","paramKey","nextWith","handleKindChange","handleRefChange","pickedCallableLabel","fn","f","wf","actionParams","params","currentWith","field","equals","inArray","notIn","truthy","fieldValue","hasValue","AppIcon","c","ExpressionInput","StepBuilderModal","ep","NOOP","messageOf","EndpointEditor","endpointId","onNavigate","tools","railNavigate","useCallback","to","EditorShell","EndpointBody","envelope","resolvedFields","setResolvedFields","resolvedRef","useRef","pendingPickRef","touchedRef","setUrlForm","setUrlDomain","showIdentity","setShowIdentity","saved","setSaved","showJson","setShowJson","json","setJson","jsonStored","setJsonStored","jsonError","setJsonError","saveGuard","def","unfed","uncoveredForEndpoint","useEndpointDraft","view","useWorkspace","setDefinition","patch","d","patchSecurity","merged","onTargetChange","shouldSeed","mergeSeed","pageExprScope","uncoveredRequiredKeys","unfedKeys","saveBlockedNote","canSave","onSave","openJson","onJsonSave","evalResult","evaluateEdit","parsed","loadErr","notFound","stateError","staleBanner","ExpressionOptionsProvider","HistoryButton","JsonToggleButton","t","EndpointIdentityModal","JsonToggle","errMsg","FunctionEditor","functionId","FunctionDraftHost","useFunctionDraft","FunctionSession","valid","loadError","notice","setNotice","reloading","setReloading","slugify","onImplChange","impl","targetToImpl","uncoveredForFunction","buildSaveBody","evaluated","reload","failure","bannerError","implToTarget","TestInvoke","FunctionIdentityModal","result","setResult","useInvokeFunctionMutation","run"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@w6w/embed",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Embed w6w's managed editor and providers in a host React app.",
5
5
  "license": "FSL-1.1-ALv2",
6
6
  "repository": {