@ai-matrx/content-ir-react 0.14.0 → 0.15.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/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { C as ComponentResolutionSource, a as ComponentResolution, b as ContentIrErrorReporter } from './component-resolution.types-DLO2w-0n.cjs';
2
2
  export { c as ComponentRole, d as ContentIrErrorReport, J as JsonObject, K as KindComponentRow, S as SystemComponentEntry, e as consoleErrorReporter } from './component-resolution.types-DLO2w-0n.cjs';
3
- import { C as ContentIrHost, K as KindRouteEnv, a as KindDefinitionSource } from './route-Bf-kciHw.cjs';
4
- export { b as ContentIrRenderSeams, D as DB_KIND_COMPONENT_KEY, c as DIRECTIVE_BLOCK_TYPE, d as DirectiveApplyResult, e as DirectiveApplyState, f as DirectiveAskRequest, g as DirectiveCopyProps, h as DirectiveHost, i as DirectiveHostProvider, j as DirectiveHostProviderProps, k as DirectiveOpenItemOptions, l as DirectiveRecordProps, m as DirectiveRecordRef, G as GENERIC_STRUCTURED_COMPONENT_KEY, n as GenericFallbackReason, I as IR_PROVISIONAL_KEY, o as IR_ROUTE_KEY, p as IrRenderBlock, q as IrRoutableBlock, r as IrRouteMarker, s as KindRouteBinding, t as KindRouteOptions, P as PartialRenderOptions, u as ProvisionalKindRender, S as StructuredValueRenderProps, v as SupersededKindRender, w as applyIrKindRoute, x as createKindRouteBinding, y as envelopeFromPartialKind, z as isPartialReadyKind, A as isProvisionalBlock, B as kindServerDataFromStoredValue, E as markKindPartialUnsafe, F as readIrRouteMarker, H as resetPartialUnsafeKinds, J as resetSourcelessDbRowReports, L as resolveAnnouncedKindLoading, M as resolveProvisionalKindRender, N as resolveSupersededKindRender, O as routeEnvOf, Q as useDirectiveHost } from './route-Bf-kciHw.cjs';
3
+ import { C as ContentIrHost, K as KindRouteEnv, a as KindDefinitionSource } from './route-BCtPhF7W.cjs';
4
+ export { b as ContentIrRenderSeams, D as DB_KIND_COMPONENT_KEY, c as DIRECTIVE_BLOCK_TYPE, d as DirectiveApplyResult, e as DirectiveApplyState, f as DirectiveAskRequest, g as DirectiveCopyProps, h as DirectiveHost, i as DirectiveHostProvider, j as DirectiveHostProviderProps, k as DirectiveOpenItemOptions, l as DirectiveRecordProps, m as DirectiveRecordRef, n as DirectiveScope, o as DirectiveScopeProvider, p as DirectiveShell, G as GENERIC_STRUCTURED_COMPONENT_KEY, q as GenericFallbackReason, I as IR_PROVISIONAL_KEY, r as IR_ROUTE_KEY, s as IrRenderBlock, t as IrRoutableBlock, u as IrRouteMarker, v as KindRouteBinding, w as KindRouteOptions, P as PartialRenderOptions, x as ProvisionalKindRender, S as StructuredValueRenderProps, y as SupersededKindRender, z as applyIrKindRoute, A as createKindRouteBinding, B as envelopeFromPartialKind, E as isPartialReadyKind, F as isProvisionalBlock, H as kindServerDataFromStoredValue, J as markKindPartialUnsafe, L as readIrRouteMarker, M as resetPartialUnsafeKinds, N as resetSourcelessDbRowReports, O as resolveAnnouncedKindLoading, Q as resolveProvisionalKindRender, R as resolveSupersededKindRender, T as routeEnvOf, U as useDirectiveHost, V as useDirectiveScope } from './route-BCtPhF7W.cjs';
5
5
  import * as react from 'react';
6
6
  import react__default, { ReactNode, ComponentType } from 'react';
7
7
  export { ComponentResolver, ComponentResolverOptions } from './resolver.cjs';
@@ -292,8 +292,15 @@ interface DirectiveRenderProps {
292
292
  * OFF rather than "writing…" forever. Omitted = it may still be arriving.
293
293
  */
294
294
  streaming?: boolean;
295
+ /**
296
+ * The conversation this directive renders in (a chat message). Applies and
297
+ * ledger reads key on it — the same namespace an agent proposal's Approve
298
+ * uses — so one action can never apply twice through two doors. Omit in a
299
+ * person's own content. Overrides any enclosing `DirectiveScopeProvider`.
300
+ */
301
+ conversationId?: string | null;
295
302
  }
296
- declare function DirectiveRender({ content, className, streaming }: DirectiveRenderProps): react.JSX.Element;
303
+ declare function DirectiveRender({ conversationId, ...props }: DirectiveRenderProps): react.JSX.Element;
297
304
 
298
305
  /**
299
306
  * WHAT A DIRECTIVE ITEM WILL DO TO AN EXISTING RECORD — for the card, the
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { C as ComponentResolutionSource, a as ComponentResolution, b as ContentIrErrorReporter } from './component-resolution.types-DLO2w-0n.js';
2
2
  export { c as ComponentRole, d as ContentIrErrorReport, J as JsonObject, K as KindComponentRow, S as SystemComponentEntry, e as consoleErrorReporter } from './component-resolution.types-DLO2w-0n.js';
3
- import { C as ContentIrHost, K as KindRouteEnv, a as KindDefinitionSource } from './route-ymqupVjr.js';
4
- export { b as ContentIrRenderSeams, D as DB_KIND_COMPONENT_KEY, c as DIRECTIVE_BLOCK_TYPE, d as DirectiveApplyResult, e as DirectiveApplyState, f as DirectiveAskRequest, g as DirectiveCopyProps, h as DirectiveHost, i as DirectiveHostProvider, j as DirectiveHostProviderProps, k as DirectiveOpenItemOptions, l as DirectiveRecordProps, m as DirectiveRecordRef, G as GENERIC_STRUCTURED_COMPONENT_KEY, n as GenericFallbackReason, I as IR_PROVISIONAL_KEY, o as IR_ROUTE_KEY, p as IrRenderBlock, q as IrRoutableBlock, r as IrRouteMarker, s as KindRouteBinding, t as KindRouteOptions, P as PartialRenderOptions, u as ProvisionalKindRender, S as StructuredValueRenderProps, v as SupersededKindRender, w as applyIrKindRoute, x as createKindRouteBinding, y as envelopeFromPartialKind, z as isPartialReadyKind, A as isProvisionalBlock, B as kindServerDataFromStoredValue, E as markKindPartialUnsafe, F as readIrRouteMarker, H as resetPartialUnsafeKinds, J as resetSourcelessDbRowReports, L as resolveAnnouncedKindLoading, M as resolveProvisionalKindRender, N as resolveSupersededKindRender, O as routeEnvOf, Q as useDirectiveHost } from './route-ymqupVjr.js';
3
+ import { C as ContentIrHost, K as KindRouteEnv, a as KindDefinitionSource } from './route-DDbgc-ID.js';
4
+ export { b as ContentIrRenderSeams, D as DB_KIND_COMPONENT_KEY, c as DIRECTIVE_BLOCK_TYPE, d as DirectiveApplyResult, e as DirectiveApplyState, f as DirectiveAskRequest, g as DirectiveCopyProps, h as DirectiveHost, i as DirectiveHostProvider, j as DirectiveHostProviderProps, k as DirectiveOpenItemOptions, l as DirectiveRecordProps, m as DirectiveRecordRef, n as DirectiveScope, o as DirectiveScopeProvider, p as DirectiveShell, G as GENERIC_STRUCTURED_COMPONENT_KEY, q as GenericFallbackReason, I as IR_PROVISIONAL_KEY, r as IR_ROUTE_KEY, s as IrRenderBlock, t as IrRoutableBlock, u as IrRouteMarker, v as KindRouteBinding, w as KindRouteOptions, P as PartialRenderOptions, x as ProvisionalKindRender, S as StructuredValueRenderProps, y as SupersededKindRender, z as applyIrKindRoute, A as createKindRouteBinding, B as envelopeFromPartialKind, E as isPartialReadyKind, F as isProvisionalBlock, H as kindServerDataFromStoredValue, J as markKindPartialUnsafe, L as readIrRouteMarker, M as resetPartialUnsafeKinds, N as resetSourcelessDbRowReports, O as resolveAnnouncedKindLoading, Q as resolveProvisionalKindRender, R as resolveSupersededKindRender, T as routeEnvOf, U as useDirectiveHost, V as useDirectiveScope } from './route-DDbgc-ID.js';
5
5
  import * as react from 'react';
6
6
  import react__default, { ReactNode, ComponentType } from 'react';
7
7
  export { ComponentResolver, ComponentResolverOptions } from './resolver.js';
@@ -292,8 +292,15 @@ interface DirectiveRenderProps {
292
292
  * OFF rather than "writing…" forever. Omitted = it may still be arriving.
293
293
  */
294
294
  streaming?: boolean;
295
+ /**
296
+ * The conversation this directive renders in (a chat message). Applies and
297
+ * ledger reads key on it — the same namespace an agent proposal's Approve
298
+ * uses — so one action can never apply twice through two doors. Omit in a
299
+ * person's own content. Overrides any enclosing `DirectiveScopeProvider`.
300
+ */
301
+ conversationId?: string | null;
295
302
  }
296
- declare function DirectiveRender({ content, className, streaming }: DirectiveRenderProps): react.JSX.Element;
303
+ declare function DirectiveRender({ conversationId, ...props }: DirectiveRenderProps): react.JSX.Element;
297
304
 
298
305
  /**
299
306
  * WHAT A DIRECTIVE ITEM WILL DO TO AN EXISTING RECORD — for the card, the
package/dist/index.js CHANGED
@@ -20,6 +20,16 @@ import { createContext as createContext2, useContext as useContext2, useMemo } f
20
20
  import { createContext, useContext } from "react";
21
21
  import { jsx } from "react/jsx-runtime";
22
22
  var DirectiveHostContext = createContext(null);
23
+ var DirectiveScopeContext = createContext({});
24
+ function DirectiveScopeProvider({
25
+ conversationId,
26
+ children
27
+ }) {
28
+ return /* @__PURE__ */ jsx(DirectiveScopeContext.Provider, { value: { conversationId: conversationId ?? null }, children });
29
+ }
30
+ function useDirectiveScope() {
31
+ return useContext(DirectiveScopeContext);
32
+ }
23
33
  function DirectiveHostProvider({ host, children }) {
24
34
  return /* @__PURE__ */ jsx(DirectiveHostContext.Provider, { value: host, children });
25
35
  }
@@ -867,6 +877,10 @@ var MaximizeIcon = (p) => /* @__PURE__ */ jsxs(Svg, { ...p, children: [
867
877
  /* @__PURE__ */ jsx3("line", { x1: "3", x2: "10", y1: "21", y2: "14" })
868
878
  ] });
869
879
  var LoaderIcon = (p) => /* @__PURE__ */ jsx3(Svg, { ...p, children: /* @__PURE__ */ jsx3("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" }) });
880
+ var RotateCcwIcon = (p) => /* @__PURE__ */ jsxs(Svg, { ...p, children: [
881
+ /* @__PURE__ */ jsx3("path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" }),
882
+ /* @__PURE__ */ jsx3("path", { d: "M3 3v5h5" })
883
+ ] });
870
884
  var CheckCircleIcon = (p) => /* @__PURE__ */ jsxs(Svg, { ...p, children: [
871
885
  /* @__PURE__ */ jsx3("circle", { cx: "12", cy: "12", r: "10" }),
872
886
  /* @__PURE__ */ jsx3("path", { d: "m9 12 2 2 4-4" })
@@ -902,6 +916,8 @@ function ApplyDirectiveButton({
902
916
  onApplied
903
917
  }) {
904
918
  const host = useDirectiveHost();
919
+ const scope = useDirectiveScope();
920
+ const conversationId = scope.conversationId || void 0;
905
921
  const items = directive.items;
906
922
  const readsLedger = !!host.applyState && !!host.confirm && directive.parsed.executes && items.length > 0;
907
923
  const [state, setState] = useState(
@@ -910,17 +926,19 @@ function ApplyDirectiveButton({
910
926
  const [elapsed, setElapsed] = useState(0);
911
927
  const startedAt = useRef(null);
912
928
  const nounText = nounLabel(directive.noun, host.nouns);
913
- const shellKey = readsLedger ? JSON.stringify([directive.slug, items]) : "";
929
+ const shellKey = readsLedger ? JSON.stringify([directive.slug, items, conversationId ?? null]) : "";
914
930
  const read = host.applyState;
915
931
  const report = host.reportError;
916
932
  useEffect(() => {
917
933
  if (!shellKey || !read) return;
918
- const [slug, shellItems] = JSON.parse(shellKey);
934
+ const [slug, shellItems, inConversation] = JSON.parse(shellKey);
935
+ const shell = { __kind: slug, items: shellItems };
936
+ if (inConversation) shell.conversationId = inConversation;
919
937
  let live = true;
920
938
  let polls = 0;
921
939
  let timer = null;
922
940
  const ask = () => {
923
- read({ __kind: slug, items: shellItems }).then((answer) => {
941
+ read(shell).then((answer) => {
924
942
  if (!live) return;
925
943
  if (answer.state === "applied") {
926
944
  setState(
@@ -966,8 +984,9 @@ function ApplyDirectiveButton({
966
984
  if (!directive.parsed.executes) return null;
967
985
  const confirm = host.confirm;
968
986
  if (!confirm) return null;
969
- async function handleApply() {
987
+ async function handleApply(again = false) {
970
988
  if (!confirm) return;
989
+ const before = state;
971
990
  if (host.ask) {
972
991
  setState({ status: "asking" });
973
992
  let ok = false;
@@ -975,7 +994,8 @@ function ApplyDirectiveButton({
975
994
  ok = await host.ask({
976
995
  directive,
977
996
  items,
978
- nounLabel: nounText
997
+ nounLabel: nounText,
998
+ ...again ? { again: true } : {}
979
999
  });
980
1000
  } catch (error) {
981
1001
  setState({
@@ -985,14 +1005,17 @@ function ApplyDirectiveButton({
985
1005
  return;
986
1006
  }
987
1007
  if (!ok) {
988
- setState({ status: "idle" });
1008
+ setState(again ? before : { status: "idle" });
989
1009
  return;
990
1010
  }
991
1011
  }
992
1012
  setElapsed(0);
993
1013
  setState({ status: "applying" });
994
1014
  try {
995
- const result = await confirm({ __kind: directive.slug, items });
1015
+ const shell = { __kind: directive.slug, items };
1016
+ if (conversationId) shell.conversationId = conversationId;
1017
+ if (again) shell.force = true;
1018
+ const result = await confirm(shell);
996
1019
  setState({
997
1020
  status: "applied",
998
1021
  applied: result.applied,
@@ -1016,20 +1039,35 @@ function ApplyDirectiveButton({
1016
1039
  return /* @__PURE__ */ jsxs2(
1017
1040
  "span",
1018
1041
  {
1019
- className: `inline-flex min-w-0 flex-wrap items-center gap-1 text-xs ${bad ? "text-destructive" : "text-primary"}`,
1042
+ className: `flex min-w-0 flex-wrap items-center gap-x-2 gap-y-0.5 text-xs ${bad ? "text-destructive" : "text-primary"}`,
1020
1043
  "data-apply-state": "applied",
1021
1044
  children: [
1022
- bad ? /* @__PURE__ */ jsx4(AlertIcon, { className: "h-3.5 w-3.5 shrink-0" }) : /* @__PURE__ */ jsx4(CheckCircleIcon, { className: "h-3.5 w-3.5 shrink-0" }),
1023
- /* @__PURE__ */ jsxs2("span", { children: [
1024
- state.message ?? `Applied ${state.applied}`,
1025
- bad && !state.message ? ` \xB7 ${state.failed} failed` : ""
1045
+ /* @__PURE__ */ jsxs2("span", { className: "inline-flex min-w-0 items-start gap-1", children: [
1046
+ bad ? /* @__PURE__ */ jsx4(AlertIcon, { className: "mt-px h-3.5 w-3.5 shrink-0" }) : /* @__PURE__ */ jsx4(CheckCircleIcon, { className: "mt-px h-3.5 w-3.5 shrink-0" }),
1047
+ /* @__PURE__ */ jsxs2("span", { className: "min-w-0", children: [
1048
+ state.message ?? `Applied ${state.applied}`,
1049
+ bad && !state.message ? ` \xB7 ${state.failed} failed` : ""
1050
+ ] })
1026
1051
  ] }),
1027
1052
  records.map((record) => /* @__PURE__ */ jsx4("span", { className: "inline-flex min-w-0 items-center", children: host.renderRecord?.({
1028
1053
  ...record,
1029
1054
  fallback: recordFallbackName(label2, record.id),
1030
1055
  context: "applied",
1031
1056
  trashed
1032
- }) }, `${record.noun}:${record.id}`))
1057
+ }) }, `${record.noun}:${record.id}`)),
1058
+ /* @__PURE__ */ jsxs2(
1059
+ "button",
1060
+ {
1061
+ type: "button",
1062
+ onClick: () => void handleApply(!bad),
1063
+ className: "inline-flex items-center gap-1 rounded px-1 py-0.5 text-muted-foreground hover:bg-accent hover:text-accent-foreground",
1064
+ "data-apply-action": bad ? "retry" : "run-again",
1065
+ children: [
1066
+ /* @__PURE__ */ jsx4(RotateCcwIcon, { className: "h-3 w-3" }),
1067
+ bad ? "Retry" : "Run again"
1068
+ ]
1069
+ }
1070
+ )
1033
1071
  ]
1034
1072
  }
1035
1073
  );
@@ -1321,7 +1359,11 @@ function isWholeJson(content) {
1321
1359
  return false;
1322
1360
  }
1323
1361
  }
1324
- function DirectiveRender({ content, className, streaming }) {
1362
+ function DirectiveRender({ conversationId, ...props }) {
1363
+ if (conversationId === void 0) return /* @__PURE__ */ jsx8(DirectiveRenderInner, { ...props });
1364
+ return /* @__PURE__ */ jsx8(DirectiveScopeProvider, { conversationId, children: /* @__PURE__ */ jsx8(DirectiveRenderInner, { ...props }) });
1365
+ }
1366
+ function DirectiveRenderInner({ content, className, streaming }) {
1325
1367
  const host = useDirectiveHost();
1326
1368
  const directive = tryDecodeDirectiveContent(content, (message) => {
1327
1369
  const line = `[kind-directives] ${message}`;
@@ -1785,6 +1827,7 @@ export {
1785
1827
  DirectiveHostProvider,
1786
1828
  DirectiveProvisionalCard,
1787
1829
  DirectiveRender,
1830
+ DirectiveScopeProvider,
1788
1831
  GENERIC_STRUCTURED_COMPONENT_KEY,
1789
1832
  GenericStructuredView,
1790
1833
  IR_PROVISIONAL_KEY,
@@ -1827,6 +1870,7 @@ export {
1827
1870
  useContentIrHostOrNull,
1828
1871
  useContentIrKindVersion,
1829
1872
  useDirectiveHost,
1873
+ useDirectiveScope,
1830
1874
  useKindRouteEnv
1831
1875
  };
1832
1876
  //# sourceMappingURL=index.js.map