nodejs-store 2.6.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/schema.js CHANGED
@@ -41,9 +41,26 @@ function register(defn) {
41
41
  const computes = {};
42
42
  for (const [key, val] of Object.entries(defn.computes || {})) {
43
43
  const fnRef = val.fnRef || key;
44
- if (val.fn) core.setFn(fnRef, val.fn);
44
+ if (val.fn) {
45
+ const userFn = val.fn;
46
+ // FFI 边界契约:JS `undefined` 无法表示为 JSON 值(core 回调桥 SyncFnBridge
47
+ // 对 fn 返回值做 serde 序列化,undefined 即 InvalidArg);归一为 null——
48
+ // 与 py 侧 lambda 返回 None → null 同语义,非错误兜底
49
+ core.setFn(fnRef, (item, ctx) => {
50
+ const r = userFn(item, ctx);
51
+ return r === undefined ? null : r;
52
+ });
53
+ }
45
54
  if (val.asyncFn) _asyncFns[fnRef] = val.asyncFn;
46
- computes[key] = { fnRef };
55
+ // 镜像保留声明元数据(对齐 py_store.schema.register):agg 形态与 read 白名单
56
+ // 供 AI 摘要(ask.describeForAi)等消费者读取;可执行物(fn/asyncFn)不入镜像
57
+ // (执行判决唯一在 core 规划 + Host 尾处理)
58
+ const meta = {};
59
+ for (const k of ['type', 'depends', 'agg', 'read']) {
60
+ if (k in val) meta[k] = val[k];
61
+ }
62
+ meta.fnRef = fnRef;
63
+ computes[key] = meta;
47
64
  }
48
65
 
49
66
  _schemas[defn.name] = {
@@ -110,6 +127,21 @@ function setRequireContext(needCtx = true) {
110
127
  core.setRequireContext(Boolean(needCtx));
111
128
  }
112
129
 
130
+ /** 豁免角色清单(命中者在一切判决环节直接放行)。默认空——无豁免(清单化语义) */
131
+ function setExemptRoles(roles) {
132
+ core.setExemptRoles(roles);
133
+ }
134
+
135
+ /** 拒写角色清单(命中者一切写路径拒绝,读不受影响)。默认空——无拒写 */
136
+ function setDenyWriteRoles(roles) {
137
+ core.setDenyWriteRoles(roles);
138
+ }
139
+
140
+ /** schema 白名单缺失/为空时的默认姿态:'open'(默认,放行)| 'closed'(全拒) */
141
+ function setUnconfiguredPolicy(policy) {
142
+ core.setUnconfiguredPolicy(policy);
143
+ }
144
+
113
145
  /** 「上下文强制」开关当前值(对齐 py_store.schema.require_context) */
114
146
  function requireContext() {
115
147
  return core.requireContext();
@@ -143,6 +175,9 @@ module.exports = {
143
175
  list,
144
176
  setRequireContext,
145
177
  requireContext,
178
+ setExemptRoles,
179
+ setDenyWriteRoles,
180
+ setUnconfiguredPolicy,
146
181
  setProfile,
147
182
  getProfile,
148
183
  getAsyncFn,