@shwfed/config 2.7.5 → 2.7.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/mcp.mjs +73 -21
  2. package/dist/module.json +1 -1
  3. package/dist/preview/assets/badge-B0tiCpa_.js +1 -0
  4. package/dist/preview/assets/config-BG9TRQcv.js +1 -0
  5. package/dist/preview/assets/{config-ulTPyAGw.js → config-Bfb2sH6S.js} +1 -1
  6. package/dist/preview/assets/config-C-XJ-8Rs.js +1 -0
  7. package/dist/preview/assets/{config-ISM4vT-S.js → config-CGvnv-5x.js} +1 -1
  8. package/dist/preview/assets/config-DDPihojt.js +1 -0
  9. package/dist/preview/assets/config-Dafqx9xC.js +1 -0
  10. package/dist/preview/assets/{config-DBviu6U0.js → config-DqMRy1WL.js} +1 -1
  11. package/dist/preview/assets/{config-CtPQb6dK.js → config-GCvXe12z.js} +1 -1
  12. package/dist/preview/assets/{config-CYixJlBY.js → config-jDPbLgBr.js} +1 -1
  13. package/dist/preview/assets/definition.vue_vue_type_script_setup_true_lang-DBXfCj4Q.js +1 -0
  14. package/dist/preview/assets/{index-CqWUukUH.css → index-B0PL01fm.css} +1 -1
  15. package/dist/preview/assets/index-CHzOsSTW.js +680 -0
  16. package/dist/preview/assets/index-CSfKAdi7.js +1 -0
  17. package/dist/preview/assets/{index-D6fhWrrp.js → index-D7jDE3kp.js} +1 -1
  18. package/dist/preview/assets/item-DV-Garrg.js +1 -0
  19. package/dist/preview/assets/runtime-BovPWken.js +1 -0
  20. package/dist/preview/assets/runtime-BxBBFFHA.js +1 -0
  21. package/dist/preview/assets/{runtime-B7NcvR9y.js → runtime-CwmJ9MLQ.js} +1 -1
  22. package/dist/preview/assets/runtime-Cyjx6haa.js +1 -0
  23. package/dist/preview/assets/runtime-D-LBi56N.js +1 -0
  24. package/dist/preview/assets/{runtime-BqlrYWt_.js → runtime-DA77AmOP.js} +1 -1
  25. package/dist/preview/assets/{runtime-jVzpCkuu.js → runtime-DHTqFEQI.js} +1 -1
  26. package/dist/preview/assets/runtime-DKtlQWwc.js +1 -0
  27. package/dist/preview/assets/runtime-UmLaEUGf.js +1 -0
  28. package/dist/preview/index.html +2 -2
  29. package/dist/runtime/components/actions/buttons/2026-04-21/com.shwfed.actions.button.navigation/runtime.vue +16 -2
  30. package/dist/runtime/components/config/blocks/2026-05-17/com.shwfed.block.chart.xy/runtime.vue +2 -2
  31. package/dist/runtime/components/config/blocks/2026-06-01/com.shwfed.block.animated.number/item.vue +2 -2
  32. package/dist/runtime/components/config/blocks/2026-06-01/com.shwfed.block.animated.number/schema.js +2 -2
  33. package/dist/runtime/components/config/blocks/2026-06-02/com.shwfed.block.card/badge.vue +3 -2
  34. package/dist/runtime/components/config/blocks/2026-06-02/com.shwfed.block.card/schema.js +2 -2
  35. package/dist/runtime/components/config/config.vue +9 -1
  36. package/dist/runtime/components/config/index.vue +11 -1
  37. package/dist/runtime/components/config/schema.d.ts +25 -0
  38. package/dist/runtime/components/config/schema.js +8 -0
  39. package/dist/runtime/components/form/fields/2026-05-13/com.shwfed.form.field.combobox.single.remote/runtime.vue +6 -5
  40. package/dist/runtime/components/form/fields/2026-05-13/com.shwfed.form.field.combobox.single.remote/schema.js +2 -2
  41. package/dist/runtime/components/form/fields/2026-05-23/com.shwfed.form.field.tree.multi/runtime.vue +3 -4
  42. package/dist/runtime/components/form/fields/2026-05-26/com.shwfed.form.field.tree.combobox.multi/runtime.vue +3 -4
  43. package/dist/runtime/components/form/fields/2026-05-26/com.shwfed.form.field.tree.combobox.single/runtime.vue +3 -4
  44. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.multi/runtime.vue +6 -5
  45. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.multi/schema.js +2 -2
  46. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.single/runtime.vue +6 -5
  47. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.single/schema.js +2 -2
  48. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.multi/runtime.vue +3 -4
  49. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.single/runtime.vue +3 -4
  50. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.multi/runtime.vue +3 -4
  51. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.single/runtime.vue +3 -4
  52. package/dist/runtime/components/form/schema.js +2 -2
  53. package/dist/runtime/components/form/utils/initial.d.ts +5 -4
  54. package/dist/runtime/components/form/utils/initial.js +2 -2
  55. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/config.d.vue.ts +2 -2
  56. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/config.vue.d.ts +2 -2
  57. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/runtime.vue +7 -6
  58. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/schema.js +2 -2
  59. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/config.d.vue.ts +2 -2
  60. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/config.vue.d.ts +2 -2
  61. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/config.d.vue.ts +2 -2
  62. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/config.vue.d.ts +2 -2
  63. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/runtime.vue +7 -6
  64. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/schema.js +2 -2
  65. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/config.d.vue.ts +2 -2
  66. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/config.vue.d.ts +2 -2
  67. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi/runtime.vue +7 -6
  68. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi/schema.js +2 -2
  69. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/config.d.vue.ts +2 -2
  70. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/config.vue.d.ts +2 -2
  71. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/runtime.vue +7 -6
  72. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/schema.js +2 -2
  73. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single/runtime.vue +7 -6
  74. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single/schema.js +2 -2
  75. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/config.d.vue.ts +2 -2
  76. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/config.vue.d.ts +2 -2
  77. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/runtime.vue +7 -6
  78. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/schema.js +2 -2
  79. package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-multi/runtime.vue +3 -4
  80. package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-multi/schema.js +2 -2
  81. package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-single/runtime.vue +3 -4
  82. package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-single/schema.js +2 -2
  83. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/config.d.vue.ts +2 -2
  84. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/config.vue.d.ts +2 -2
  85. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/runtime.vue +7 -6
  86. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/schema.js +2 -2
  87. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/config.d.vue.ts +2 -2
  88. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/config.vue.d.ts +2 -2
  89. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/runtime.vue +7 -6
  90. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/schema.js +2 -2
  91. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/runtime.vue +3 -4
  92. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/schema.js +2 -2
  93. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/runtime.vue +3 -4
  94. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/schema.js +2 -2
  95. package/dist/runtime/components/table/index.vue +3 -4
  96. package/dist/runtime/components/table/schema.js +3 -3
  97. package/dist/runtime/share/event-bus.d.ts +23 -4
  98. package/dist/runtime/share/expression.d.ts +13 -0
  99. package/dist/runtime/share/expression.js +1 -0
  100. package/dist/runtime/share/request.d.ts +29 -0
  101. package/dist/runtime/share/request.js +11 -0
  102. package/dist/runtime/vendor/cel-js/CLAUDE.md +2 -2
  103. package/dist/runtime/vendor/cel-js/PROMPT.md +35 -3
  104. package/dist/runtime/vendor/cel-js/lib/functions.js +2 -2
  105. package/dist/runtime/vendor/cel-js/lib/optional.js +52 -1
  106. package/package.json +1 -1
  107. package/dist/preview/assets/badge-DamXUB_x.js +0 -1
  108. package/dist/preview/assets/config-CXgHZFVu.js +0 -1
  109. package/dist/preview/assets/config-Dtj6xvFB.js +0 -1
  110. package/dist/preview/assets/config-DyKtOYYU.js +0 -1
  111. package/dist/preview/assets/config-v7KXfP3A.js +0 -1
  112. package/dist/preview/assets/definition.vue_vue_type_script_setup_true_lang-C-3KP_in.js +0 -1
  113. package/dist/preview/assets/index-CzxZSeNm.js +0 -680
  114. package/dist/preview/assets/index-DUSkLHHf.js +0 -1
  115. package/dist/preview/assets/item-BAj_4_7-.js +0 -1
  116. package/dist/preview/assets/runtime-CiWg_Jub.js +0 -1
  117. package/dist/preview/assets/runtime-CpMT9U1z.js +0 -1
  118. package/dist/preview/assets/runtime-CswN1gKf.js +0 -1
  119. package/dist/preview/assets/runtime-DOK5OTJn.js +0 -1
  120. package/dist/preview/assets/runtime-DldmFxn1.js +0 -1
  121. package/dist/preview/assets/runtime-WZBVKYom.js +0 -1
@@ -1,5 +1,5 @@
1
1
  import { Effect, Schema } from "effect";
2
- import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
2
+ import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
3
3
  import { Locale } from "../../../../../share/locale.js";
4
4
  import { Triggers } from "../../../../../share/event-bus.js";
5
5
  import {
@@ -51,7 +51,7 @@ export function remoteOptionsSchema(configure) {
51
51
  configure(env);
52
52
  registerRowVariablesIfAbsent(env);
53
53
  },
54
- resultType: "HttpRequest"
54
+ resultType: HttpRequestResult
55
55
  });
56
56
  const CelOptions = Expression({
57
57
  configure: (env) => {
@@ -1,12 +1,13 @@
1
1
  <script setup>
2
2
  import { Icon } from "@iconify/vue";
3
- import { Effect } from "effect";
3
+ import { Effect, Option } from "effect";
4
4
  import { watchDebounced } from "@vueuse/core";
5
5
  import { computed, nextTick, ref, watch } from "vue";
6
6
  import { useI18n } from "vue-i18n";
7
7
  import { cel as _rawCel } from "../../../../../utils/cel";
8
8
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
9
9
  import { getLocalizedText } from "../../../../../share/locale";
10
+ import { asRequest, fetchJsonOption } from "../../../../../share/request";
10
11
  import {
11
12
  Command,
12
13
  CommandEmpty,
@@ -102,10 +103,10 @@ const requestSignature = computed(() => {
102
103
  const expr = props.column.options.request;
103
104
  if (!expr) return null;
104
105
  try {
105
- const builder = Effect.runSync(
106
+ const req = asRequest(Effect.runSync(
106
107
  $cel(expr, { row: row.value, index: rowIndex.value })
107
- );
108
- return JSON.stringify(builder.describe());
108
+ ));
109
+ return Option.isSome(req) ? JSON.stringify(req.value.describe()) : null;
109
110
  } catch {
110
111
  return null;
111
112
  }
@@ -120,8 +121,8 @@ async function fetchOptions() {
120
121
  const expr = props.column.options.request;
121
122
  remoteLoading.value = true;
122
123
  const program = Effect.gen(function* () {
123
- const builder = yield* $cel(expr, { row: row.value, index: rowIndex.value });
124
- return yield* builder.json();
124
+ const json = yield* fetchJsonOption(yield* $cel(expr, { row: row.value, index: rowIndex.value }));
125
+ return Option.getOrNull(json);
125
126
  });
126
127
  try {
127
128
  const result = await Effect.runPromise(Effect.provide(program, sharedFetchLayer));
@@ -1,7 +1,7 @@
1
1
  import { Effect, Schema } from "effect";
2
2
  import { getProperty } from "dot-prop";
3
3
  import { Locale } from "../../../../../share/locale.js";
4
- import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
4
+ import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
5
5
  import {
6
6
  CelRowAccess,
7
7
  derivedRowField,
@@ -52,7 +52,7 @@ export function remoteOptionsSchema(configure) {
52
52
  configure(env);
53
53
  registerRowVariablesIfAbsent(env);
54
54
  },
55
- resultType: "HttpRequest"
55
+ resultType: HttpRequestResult
56
56
  });
57
57
  const CelOptions = Expression({
58
58
  configure: (env) => {
@@ -79,9 +79,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
79
79
  };
80
80
  }[];
81
81
  };
82
- readonly successMessage?: string | undefined;
83
82
  readonly accessor: string;
84
83
  readonly sortKey?: string | undefined;
84
+ readonly successMessage?: string | undefined;
85
85
  }) => any;
86
86
  }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
87
87
  "onUpdate:modelValue"?: ((value: {
@@ -160,9 +160,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
160
160
  };
161
161
  }[];
162
162
  };
163
- readonly successMessage?: string | undefined;
164
163
  readonly accessor: string;
165
164
  readonly sortKey?: string | undefined;
165
+ readonly successMessage?: string | undefined;
166
166
  }) => any) | undefined;
167
167
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
168
168
  declare const _default: typeof __VLS_export;
@@ -79,9 +79,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
79
79
  };
80
80
  }[];
81
81
  };
82
- readonly successMessage?: string | undefined;
83
82
  readonly accessor: string;
84
83
  readonly sortKey?: string | undefined;
84
+ readonly successMessage?: string | undefined;
85
85
  }) => any;
86
86
  }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
87
87
  "onUpdate:modelValue"?: ((value: {
@@ -160,9 +160,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
160
160
  };
161
161
  }[];
162
162
  };
163
- readonly successMessage?: string | undefined;
164
163
  readonly accessor: string;
165
164
  readonly sortKey?: string | undefined;
165
+ readonly successMessage?: string | undefined;
166
166
  }) => any) | undefined;
167
167
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
168
168
  declare const _default: typeof __VLS_export;
@@ -1,11 +1,12 @@
1
1
  <script setup>
2
2
  import { Icon } from "@iconify/vue";
3
- import { Effect } from "effect";
3
+ import { Effect, Option } from "effect";
4
4
  import { Fetch } from "fx-fetch";
5
5
  import { watchDebounced } from "@vueuse/core";
6
6
  import { toast } from "vue-sonner";
7
7
  import { computed, nextTick, ref, watch } from "vue";
8
8
  import { useI18n } from "vue-i18n";
9
+ import { asRequest, fetchJsonOption } from "../../../../../share/request";
9
10
  import { cel as _rawCel } from "../../../../../utils/cel";
10
11
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
11
12
  import { getLocalizedText } from "../../../../../share/locale";
@@ -103,10 +104,10 @@ const requestSignature = computed(() => {
103
104
  const expr = props.column.options.request;
104
105
  if (!expr) return null;
105
106
  try {
106
- const builder = Effect.runSync(
107
+ const req = asRequest(Effect.runSync(
107
108
  $cel(expr, { row: row.value, index: rowIndex.value })
108
- );
109
- return JSON.stringify(builder.describe());
109
+ ));
110
+ return Option.isSome(req) ? JSON.stringify(req.value.describe()) : null;
110
111
  } catch {
111
112
  return null;
112
113
  }
@@ -121,8 +122,8 @@ async function fetchOptions() {
121
122
  const expr = props.column.options.request;
122
123
  remoteLoading.value = true;
123
124
  const program = Effect.gen(function* () {
124
- const builder = yield* $cel(expr, { row: row.value, index: rowIndex.value });
125
- return yield* builder.json();
125
+ const json = yield* fetchJsonOption(yield* $cel(expr, { row: row.value, index: rowIndex.value }));
126
+ return Option.getOrNull(json);
126
127
  });
127
128
  try {
128
129
  const result = await Effect.runPromise(Effect.provide(program, sharedFetchLayer));
@@ -1,5 +1,5 @@
1
1
  import { Effect, Schema } from "effect";
2
- import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
2
+ import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
3
3
  import { Locale } from "../../../../../share/locale.js";
4
4
  import { Triggers } from "../../../../../share/event-bus.js";
5
5
  import {
@@ -51,7 +51,7 @@ export function remoteOptionsSchema(configure) {
51
51
  configure(env);
52
52
  registerRowVariablesIfAbsent(env);
53
53
  },
54
- resultType: "HttpRequest"
54
+ resultType: HttpRequestResult
55
55
  });
56
56
  const CelOptions = Expression({
57
57
  configure: (env) => {
@@ -6,6 +6,7 @@ import { useI18n } from "vue-i18n";
6
6
  import { cel as _rawCel } from "../../../../../utils/cel";
7
7
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
8
8
  import { getLocalizedText } from "../../../../../share/locale";
9
+ import { fetchJsonOption } from "../../../../../share/request";
9
10
  import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from "../../../../ui/input-group";
10
11
  import { Markdown } from "../../../../ui/markdown";
11
12
  import { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from "../../../../ui/popover";
@@ -143,12 +144,10 @@ async function fetchTree() {
143
144
  const effect = Effect.gen(function* () {
144
145
  let jsonOpt = Option.none();
145
146
  if (dataSource.request) {
146
- const builder = yield* $cel(dataSource.request, {
147
+ jsonOpt = yield* fetchJsonOption(yield* $cel(dataSource.request, {
147
148
  row: row.value,
148
149
  index: rowIndex.value
149
- });
150
- const response = yield* builder.json();
151
- jsonOpt = Option.some(response);
150
+ }));
152
151
  }
153
152
  const dataRaw = yield* $cel(dataSource.data, {
154
153
  row: row.value,
@@ -1,7 +1,7 @@
1
1
  import { Schema } from "effect";
2
2
  import { getProperty } from "dot-prop";
3
3
  import { Locale } from "../../../../../share/locale.js";
4
- import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
4
+ import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
5
5
  import {
6
6
  CelRowAccess,
7
7
  derivedRowField,
@@ -36,7 +36,7 @@ export function schema(configure) {
36
36
  };
37
37
  const CelDataSourceRequest = Expression({
38
38
  configure: dataSourceConfigure,
39
- resultType: "HttpRequest"
39
+ resultType: HttpRequestResult
40
40
  });
41
41
  const CelDataSourceData = Expression({
42
42
  configure: (env) => {
@@ -6,6 +6,7 @@ import { useI18n } from "vue-i18n";
6
6
  import { cel as _rawCel } from "../../../../../utils/cel";
7
7
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
8
8
  import { getLocalizedText } from "../../../../../share/locale";
9
+ import { fetchJsonOption } from "../../../../../share/request";
9
10
  import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from "../../../../ui/input-group";
10
11
  import { Markdown } from "../../../../ui/markdown";
11
12
  import { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from "../../../../ui/popover";
@@ -146,12 +147,10 @@ async function fetchTree() {
146
147
  const effect = Effect.gen(function* () {
147
148
  let jsonOpt = Option.none();
148
149
  if (dataSource.request) {
149
- const builder = yield* $cel(dataSource.request, {
150
+ jsonOpt = yield* fetchJsonOption(yield* $cel(dataSource.request, {
150
151
  row: row.value,
151
152
  index: rowIndex.value
152
- });
153
- const response = yield* builder.json();
154
- jsonOpt = Option.some(response);
153
+ }));
155
154
  }
156
155
  const dataRaw = yield* $cel(dataSource.data, {
157
156
  row: row.value,
@@ -1,7 +1,7 @@
1
1
  import { Schema } from "effect";
2
2
  import { getProperty } from "dot-prop";
3
3
  import { Locale } from "../../../../../share/locale.js";
4
- import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
4
+ import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
5
5
  import {
6
6
  CelRowAccess,
7
7
  derivedRowField,
@@ -36,7 +36,7 @@ export function schema(configure) {
36
36
  };
37
37
  const CelDataSourceRequest = Expression({
38
38
  configure: dataSourceConfigure,
39
- resultType: "HttpRequest"
39
+ resultType: HttpRequestResult
40
40
  });
41
41
  const CelDataSourceData = Expression({
42
42
  configure: (env) => {
@@ -87,8 +87,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
87
87
  readonly target: string;
88
88
  readonly operation: string;
89
89
  }[] | undefined;
90
- readonly successMessage?: string | undefined;
91
90
  readonly accessor: string;
91
+ readonly successMessage?: string | undefined;
92
92
  };
93
93
  }) => any;
94
94
  }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
@@ -176,8 +176,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
176
176
  readonly target: string;
177
177
  readonly operation: string;
178
178
  }[] | undefined;
179
- readonly successMessage?: string | undefined;
180
179
  readonly accessor: string;
180
+ readonly successMessage?: string | undefined;
181
181
  };
182
182
  }) => any) | undefined;
183
183
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -87,8 +87,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
87
87
  readonly target: string;
88
88
  readonly operation: string;
89
89
  }[] | undefined;
90
- readonly successMessage?: string | undefined;
91
90
  readonly accessor: string;
91
+ readonly successMessage?: string | undefined;
92
92
  };
93
93
  }) => any;
94
94
  }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
@@ -176,8 +176,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
176
176
  readonly target: string;
177
177
  readonly operation: string;
178
178
  }[] | undefined;
179
- readonly successMessage?: string | undefined;
180
179
  readonly accessor: string;
180
+ readonly successMessage?: string | undefined;
181
181
  };
182
182
  }) => any) | undefined;
183
183
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -1,11 +1,12 @@
1
1
  <script setup>
2
2
  import { Icon } from "@iconify/vue";
3
- import { Effect } from "effect";
3
+ import { Effect, Option } from "effect";
4
4
  import { Fetch } from "fx-fetch";
5
5
  import { watchDebounced } from "@vueuse/core";
6
6
  import { toast } from "vue-sonner";
7
7
  import { computed, ref } from "vue";
8
8
  import { useI18n } from "vue-i18n";
9
+ import { asRequest, fetchJsonOption } from "../../../../../share/request";
9
10
  import { cel as _rawCel } from "../../../../../utils/cel";
10
11
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
11
12
  import { getLocalizedText } from "../../../../../share/locale";
@@ -108,10 +109,10 @@ const requestSignature = computed(() => {
108
109
  const expr = props.column.options.request;
109
110
  if (!expr) return null;
110
111
  try {
111
- const builder = Effect.runSync(
112
+ const req = asRequest(Effect.runSync(
112
113
  $cel(expr, { row: row.value, index: rowIndex.value })
113
- );
114
- return JSON.stringify(builder.describe());
114
+ ));
115
+ return Option.isSome(req) ? JSON.stringify(req.value.describe()) : null;
115
116
  } catch {
116
117
  return null;
117
118
  }
@@ -126,8 +127,8 @@ async function fetchOptions() {
126
127
  const expr = props.column.options.request;
127
128
  remoteLoading.value = true;
128
129
  const program = Effect.gen(function* () {
129
- const builder = yield* $cel(expr, { row: row.value, index: rowIndex.value });
130
- return yield* builder.json();
130
+ const json = yield* fetchJsonOption(yield* $cel(expr, { row: row.value, index: rowIndex.value }));
131
+ return Option.getOrNull(json);
131
132
  });
132
133
  try {
133
134
  const result = await Effect.runPromise(Effect.provide(program, sharedFetchLayer));
@@ -1,6 +1,6 @@
1
1
  import { Effect, Schema } from "effect";
2
2
  import { getProperty } from "dot-prop";
3
- import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
3
+ import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
4
4
  import { Locale } from "../../../../../share/locale.js";
5
5
  import { Triggers } from "../../../../../share/event-bus.js";
6
6
  import {
@@ -58,7 +58,7 @@ export function remoteOptionsSchema(configure) {
58
58
  configure(env);
59
59
  registerRowVariablesIfAbsent(env);
60
60
  },
61
- resultType: "HttpRequest"
61
+ resultType: HttpRequestResult
62
62
  });
63
63
  const CelOptions = Expression({
64
64
  configure: (env) => {
@@ -87,8 +87,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
87
87
  readonly target: string;
88
88
  readonly operation: string;
89
89
  }[] | undefined;
90
- readonly successMessage?: string | undefined;
91
90
  readonly accessor: string;
91
+ readonly successMessage?: string | undefined;
92
92
  };
93
93
  }) => any;
94
94
  }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
@@ -176,8 +176,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
176
176
  readonly target: string;
177
177
  readonly operation: string;
178
178
  }[] | undefined;
179
- readonly successMessage?: string | undefined;
180
179
  readonly accessor: string;
180
+ readonly successMessage?: string | undefined;
181
181
  };
182
182
  }) => any) | undefined;
183
183
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -87,8 +87,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
87
87
  readonly target: string;
88
88
  readonly operation: string;
89
89
  }[] | undefined;
90
- readonly successMessage?: string | undefined;
91
90
  readonly accessor: string;
91
+ readonly successMessage?: string | undefined;
92
92
  };
93
93
  }) => any;
94
94
  }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
@@ -176,8 +176,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
176
176
  readonly target: string;
177
177
  readonly operation: string;
178
178
  }[] | undefined;
179
- readonly successMessage?: string | undefined;
180
179
  readonly accessor: string;
180
+ readonly successMessage?: string | undefined;
181
181
  };
182
182
  }) => any) | undefined;
183
183
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -1,11 +1,12 @@
1
1
  <script setup>
2
2
  import { Icon } from "@iconify/vue";
3
- import { Effect } from "effect";
3
+ import { Effect, Option } from "effect";
4
4
  import { Fetch } from "fx-fetch";
5
5
  import { watchDebounced } from "@vueuse/core";
6
6
  import { toast } from "vue-sonner";
7
7
  import { computed, nextTick, ref, watch } from "vue";
8
8
  import { useI18n } from "vue-i18n";
9
+ import { asRequest, fetchJsonOption } from "../../../../../share/request";
9
10
  import { cel as _rawCel } from "../../../../../utils/cel";
10
11
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
11
12
  import { getLocalizedText } from "../../../../../share/locale";
@@ -108,10 +109,10 @@ const requestSignature = computed(() => {
108
109
  const expr = props.column.options.request;
109
110
  if (!expr) return null;
110
111
  try {
111
- const builder = Effect.runSync(
112
+ const req = asRequest(Effect.runSync(
112
113
  $cel(expr, { row: row.value, index: rowIndex.value })
113
- );
114
- return JSON.stringify(builder.describe());
114
+ ));
115
+ return Option.isSome(req) ? JSON.stringify(req.value.describe()) : null;
115
116
  } catch {
116
117
  return null;
117
118
  }
@@ -126,8 +127,8 @@ async function fetchOptions() {
126
127
  const expr = props.column.options.request;
127
128
  remoteLoading.value = true;
128
129
  const program = Effect.gen(function* () {
129
- const builder = yield* $cel(expr, { row: row.value, index: rowIndex.value });
130
- return yield* builder.json();
130
+ const json = yield* fetchJsonOption(yield* $cel(expr, { row: row.value, index: rowIndex.value }));
131
+ return Option.getOrNull(json);
131
132
  });
132
133
  try {
133
134
  const result = await Effect.runPromise(Effect.provide(program, sharedFetchLayer));
@@ -1,6 +1,6 @@
1
1
  import { Effect, Schema } from "effect";
2
2
  import { getProperty } from "dot-prop";
3
- import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
3
+ import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
4
4
  import { Locale } from "../../../../../share/locale.js";
5
5
  import { Triggers } from "../../../../../share/event-bus.js";
6
6
  import {
@@ -58,7 +58,7 @@ export function remoteOptionsSchema(configure) {
58
58
  configure(env);
59
59
  registerRowVariablesIfAbsent(env);
60
60
  },
61
- resultType: "HttpRequest"
61
+ resultType: HttpRequestResult
62
62
  });
63
63
  const CelOptions = Expression({
64
64
  configure: (env) => {
@@ -6,6 +6,7 @@ import { useI18n } from "vue-i18n";
6
6
  import { cel as _rawCel } from "../../../../../utils/cel";
7
7
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
8
8
  import { getLocalizedText } from "../../../../../share/locale";
9
+ import { fetchJsonOption } from "../../../../../share/request";
9
10
  import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from "../../../../ui/input-group";
10
11
  import { Markdown } from "../../../../ui/markdown";
11
12
  import { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from "../../../../ui/popover";
@@ -156,12 +157,10 @@ async function fetchTree() {
156
157
  const effect = Effect.gen(function* () {
157
158
  let jsonOpt = Option.none();
158
159
  if (dataSource.request) {
159
- const builder = yield* $cel(dataSource.request, {
160
+ jsonOpt = yield* fetchJsonOption(yield* $cel(dataSource.request, {
160
161
  row: row.value,
161
162
  index: rowIndex.value
162
- });
163
- const response = yield* builder.json();
164
- jsonOpt = Option.some(response);
163
+ }));
165
164
  }
166
165
  const dataRaw = yield* $cel(dataSource.data, {
167
166
  row: row.value,
@@ -1,7 +1,7 @@
1
1
  import { Effect, Schema } from "effect";
2
2
  import { getProperty } from "dot-prop";
3
3
  import { Locale } from "../../../../../share/locale.js";
4
- import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
4
+ import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
5
5
  import {
6
6
  CelRowAccess,
7
7
  derivedRowField,
@@ -37,7 +37,7 @@ export function schema(configure) {
37
37
  };
38
38
  const CelDataSourceRequest = Expression({
39
39
  configure: dataSourceConfigure,
40
- resultType: "HttpRequest"
40
+ resultType: HttpRequestResult
41
41
  });
42
42
  const CelDataSourceData = Expression({
43
43
  configure: (env) => {
@@ -6,6 +6,7 @@ import { useI18n } from "vue-i18n";
6
6
  import { cel as _rawCel } from "../../../../../utils/cel";
7
7
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
8
8
  import { getLocalizedText } from "../../../../../share/locale";
9
+ import { fetchJsonOption } from "../../../../../share/request";
9
10
  import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from "../../../../ui/input-group";
10
11
  import { Markdown } from "../../../../ui/markdown";
11
12
  import { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from "../../../../ui/popover";
@@ -159,12 +160,10 @@ async function fetchTree() {
159
160
  const effect = Effect.gen(function* () {
160
161
  let jsonOpt = Option.none();
161
162
  if (dataSource.request) {
162
- const builder = yield* $cel(dataSource.request, {
163
+ jsonOpt = yield* fetchJsonOption(yield* $cel(dataSource.request, {
163
164
  row: row.value,
164
165
  index: rowIndex.value
165
- });
166
- const response = yield* builder.json();
167
- jsonOpt = Option.some(response);
166
+ }));
168
167
  }
169
168
  const dataRaw = yield* $cel(dataSource.data, {
170
169
  row: row.value,
@@ -1,7 +1,7 @@
1
1
  import { Effect, Schema } from "effect";
2
2
  import { getProperty } from "dot-prop";
3
3
  import { Locale } from "../../../../../share/locale.js";
4
- import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
4
+ import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
5
5
  import {
6
6
  CelRowAccess,
7
7
  derivedRowField,
@@ -37,7 +37,7 @@ export function schema(configure) {
37
37
  };
38
38
  const CelDataSourceRequest = Expression({
39
39
  configure: dataSourceConfigure,
40
- resultType: "HttpRequest"
40
+ resultType: HttpRequestResult
41
41
  });
42
42
  const CelDataSourceData = Expression({
43
43
  configure: (env) => {
@@ -14,6 +14,7 @@ import { Effect, Fiber, Option } from "effect";
14
14
  import { Fetch } from "fx-fetch";
15
15
  import { Pagination } from "reka-ui/namespaced";
16
16
  import { computed, h, onMounted, ref, toRaw, watch } from "vue";
17
+ import { fetchJsonOption } from "../../share/request";
17
18
  import { useI18n } from "vue-i18n";
18
19
  import { celBindings, provideCELContext, injectCELContext } from "../../utils/cel-context";
19
20
  import TableRowProvider from "./row-provider.vue";
@@ -336,12 +337,10 @@ async function fetchDataSource() {
336
337
  const effect = Effect.gen(function* () {
337
338
  let jsonOpt = Option.none();
338
339
  if (dataSource.request) {
339
- const builder = yield* $cel(
340
+ jsonOpt = yield* fetchJsonOption(yield* $cel(
340
341
  dataSource.request,
341
342
  mergeCelContext({ pageIndex, pageSize })
342
- );
343
- const response = yield* builder.json();
344
- jsonOpt = Option.some(response);
343
+ ));
345
344
  }
346
345
  const nextRowsRaw = yield* $cel(
347
346
  dataSource.data,
@@ -1,5 +1,5 @@
1
1
  import { Schema } from "effect";
2
- import { Expression } from "../../share/expression.js";
2
+ import { Expression, HttpRequestResult } from "../../share/expression.js";
3
3
  import { Locale } from "../../share/locale.js";
4
4
  import { md } from "../../share/markdown.js";
5
5
  import { ActionSchemaFields } from "../actions/schema.js";
@@ -186,7 +186,7 @@ export function DataSource(configure, extras) {
186
186
  configure(env);
187
187
  extras?.request?.(env);
188
188
  },
189
- resultType: "HttpRequest"
189
+ resultType: HttpRequestResult
190
190
  });
191
191
  const CelRows = Expression({
192
192
  configure: (env) => {
@@ -218,7 +218,7 @@ export function tableDataSource(configure) {
218
218
  configure(env);
219
219
  registerDataSourceRequestVars(env);
220
220
  },
221
- resultType: "HttpRequest"
221
+ resultType: HttpRequestResult
222
222
  });
223
223
  const CelRows = Expression({
224
224
  configure: (env) => {
@@ -41,10 +41,29 @@ export type EventChannel = Readonly<{
41
41
  }>;
42
42
  /**
43
43
  * Operation id → handler, for one operation-exposing instance. Handlers
44
- * return an Effect so the bus can run them serially and in order. They are
45
- * infallible by contract: an operation that can fail must swallow/log
46
- * internally (mirrors the table's fetch-error contract) so a serial trigger
47
- * chain never aborts halfway because one trigger quietly failed.
44
+ * return an Effect so the bus can run them serially and in order.
45
+ *
46
+ * The `void` error channel pins handlers as infallible *failures* — a handler
47
+ * that hits a recoverable hiccup must swallow/log it internally (mirrors the
48
+ * table's fetch-error contract) rather than surface it, since the bus has no
49
+ * error channel to carry it.
50
+ *
51
+ * A handler MAY still *halt* the chain — the "guard" shape: stop everything
52
+ * queued after it. `dispatchTriggers` runs the list with `Effect.forEach`,
53
+ * which short-circuits the moment one request's effect aborts, so triggers
54
+ * after the guard never dispatch. The page's `close` op is the canonical case
55
+ * (it halts unconditionally — nothing should run after a close). It halts with
56
+ * `Effect.die`, not `Effect.fail`: a defect aborts the chain without widening
57
+ * the `void` error channel here (and `ActionEffect`'s `catchTags` union over in
58
+ * `actions/components/group.vue`). The defect propagates to that runner's
59
+ * `runPromise`, whose outer try/catch absorbs it silently — `catchTags` only
60
+ * intercepts typed failures, so no toast.
61
+ *
62
+ * Pre-submit form validation is the same guard shape but doesn't run over this
63
+ * bus yet — it injects the separate `share/form-validate` seam. The intended
64
+ * end state folds it in as a fallible `validate` operation here, at which point
65
+ * the error channel widens to carry a typed validation failure (see the note in
66
+ * `form-validate.ts`).
48
67
  */
49
68
  export type OperationHandlers = Readonly<Record<string, () => Effect.Effect<void>>>;
50
69
  export declare const EVENT_CHANNEL_KEY: InjectionKey<EventChannel>;