@sixb/core 0.1.17 → 0.1.18

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 (454) hide show
  1. package/dist/actions/index.js +22 -19
  2. package/dist/actions/index.js.map +1 -1
  3. package/dist/actions/read-facade.d.ts +1 -1
  4. package/dist/actions/validation.d.ts.map +1 -1
  5. package/dist/actions/worker.js +6 -2
  6. package/dist/actions/worker.js.map +3 -3
  7. package/dist/agents/adapters.d.ts +7 -0
  8. package/dist/agents/adapters.d.ts.map +1 -1
  9. package/dist/agents/authority.d.ts +7 -0
  10. package/dist/agents/authority.d.ts.map +1 -1
  11. package/dist/agents/context/entries.d.ts +10 -1
  12. package/dist/agents/context/entries.d.ts.map +1 -1
  13. package/dist/agents/context/index.d.ts +1 -1
  14. package/dist/agents/context/index.d.ts.map +1 -1
  15. package/dist/agents/context/index.js +4 -2
  16. package/dist/agents/context/index.js.map +1 -1
  17. package/dist/agents/context-compaction.d.ts.map +1 -1
  18. package/dist/agents/errors.d.ts +1 -1
  19. package/dist/agents/errors.d.ts.map +1 -1
  20. package/dist/agents/index.d.ts +6 -4
  21. package/dist/agents/index.d.ts.map +1 -1
  22. package/dist/agents/index.js +44 -37
  23. package/dist/agents/index.js.map +1 -1
  24. package/dist/agents/message.d.ts +8 -1
  25. package/dist/agents/message.d.ts.map +1 -1
  26. package/dist/agents/request.d.ts +19 -5
  27. package/dist/agents/request.d.ts.map +1 -1
  28. package/dist/agents/skills.d.ts +41 -0
  29. package/dist/agents/skills.d.ts.map +1 -0
  30. package/dist/agents/streams/index.js +1 -1
  31. package/dist/agents/streams/internal.js +1 -1
  32. package/dist/agents/types.d.ts +33 -4
  33. package/dist/agents/types.d.ts.map +1 -1
  34. package/dist/auth/index.js +9 -6
  35. package/dist/auth/index.js.map +1 -1
  36. package/dist/auth/runtime.d.ts.map +1 -1
  37. package/dist/auth/types.d.ts +6 -0
  38. package/dist/auth/types.d.ts.map +1 -1
  39. package/dist/authorization/index.js +5 -3
  40. package/dist/authorization/index.js.map +1 -1
  41. package/dist/authorization/resolve.d.ts +1 -1
  42. package/dist/authorization/resolve.d.ts.map +1 -1
  43. package/dist/authorization/types.d.ts +7 -0
  44. package/dist/authorization/types.d.ts.map +1 -1
  45. package/dist/blob-storage/browser.js +1 -1
  46. package/dist/blob-storage/execution.d.ts.map +1 -1
  47. package/dist/blob-storage/file-content.d.ts +18 -0
  48. package/dist/blob-storage/file-content.d.ts.map +1 -0
  49. package/dist/blob-storage/index.d.ts +1 -1
  50. package/dist/blob-storage/index.d.ts.map +1 -1
  51. package/dist/blob-storage/index.js +2 -2
  52. package/dist/blob-storage/internal.d.ts +2 -0
  53. package/dist/blob-storage/internal.d.ts.map +1 -1
  54. package/dist/blob-storage/internal.js +16 -4
  55. package/dist/blob-storage/internal.js.map +1 -1
  56. package/dist/blob-storage/media-type.d.ts +8 -0
  57. package/dist/blob-storage/media-type.d.ts.map +1 -0
  58. package/dist/blob-storage/types.d.ts +12 -1
  59. package/dist/blob-storage/types.d.ts.map +1 -1
  60. package/dist/blob-storage/validation.d.ts +6 -0
  61. package/dist/blob-storage/validation.d.ts.map +1 -1
  62. package/dist/bootstrap/agent-context.d.ts +33 -0
  63. package/dist/bootstrap/agent-context.d.ts.map +1 -0
  64. package/dist/bootstrap/discovery.d.ts +23 -3
  65. package/dist/bootstrap/discovery.d.ts.map +1 -1
  66. package/dist/bootstrap/index.d.ts +2 -1
  67. package/dist/bootstrap/index.d.ts.map +1 -1
  68. package/dist/bootstrap/index.js +284 -73
  69. package/dist/bootstrap/index.js.map +4 -3
  70. package/dist/bootstrap/ontology-type-manifest.d.ts.map +1 -1
  71. package/dist/{chunk-gf7yht60.js → chunk-1b1f2d5f.js} +23 -6
  72. package/dist/chunk-1b1f2d5f.js.map +12 -0
  73. package/dist/{chunk-9vx5e9g1.js → chunk-1sr8ryzk.js} +3 -3
  74. package/dist/chunk-1sr8ryzk.js.map +11 -0
  75. package/dist/{chunk-4gmng3vf.js → chunk-22v5bpz3.js} +1 -1
  76. package/dist/{chunk-s7ftxrdr.js → chunk-29yx306f.js} +20 -3
  77. package/dist/{chunk-s7ftxrdr.js.map → chunk-29yx306f.js.map} +3 -3
  78. package/dist/{chunk-4ra628t7.js → chunk-3zxk45er.js} +70 -6
  79. package/dist/{chunk-4ra628t7.js.map → chunk-3zxk45er.js.map} +5 -4
  80. package/dist/{chunk-2am3db31.js → chunk-48e3cn2d.js} +2 -2
  81. package/dist/{chunk-91kcnbf0.js → chunk-6gmfggss.js} +22 -9
  82. package/dist/chunk-6gmfggss.js.map +10 -0
  83. package/dist/{chunk-svabwqdq.js → chunk-6h5m9xjx.js} +43 -415
  84. package/dist/{chunk-svabwqdq.js.map → chunk-6h5m9xjx.js.map} +7 -11
  85. package/dist/{chunk-f1xh7a32.js → chunk-7hpdd6r9.js} +2 -2
  86. package/dist/{chunk-xyvy73tj.js → chunk-bs7sqkre.js} +8 -3
  87. package/dist/chunk-bs7sqkre.js.map +12 -0
  88. package/dist/{chunk-rb143ggb.js → chunk-bwjcehza.js} +1 -1
  89. package/dist/{chunk-t9shqx3w.js → chunk-d0eb5yy6.js} +143 -7
  90. package/dist/chunk-d0eb5yy6.js.map +14 -0
  91. package/dist/{chunk-vp3z1ckh.js → chunk-de4z2bj6.js} +5 -5
  92. package/dist/{chunk-3rrezgyc.js → chunk-dnmadg9k.js} +2 -2
  93. package/dist/chunk-enpsx8k5.js +127 -0
  94. package/dist/chunk-enpsx8k5.js.map +10 -0
  95. package/dist/{chunk-a7er86jd.js → chunk-ex496vct.js} +1 -1
  96. package/dist/{chunk-jnfxmr3f.js → chunk-f1zxad2t.js} +1 -1
  97. package/dist/{chunk-6wbm6ymz.js → chunk-fe52eczz.js} +271 -83
  98. package/dist/chunk-fe52eczz.js.map +49 -0
  99. package/dist/{chunk-10styjgk.js → chunk-fx93hd2n.js} +71 -29
  100. package/dist/chunk-fx93hd2n.js.map +20 -0
  101. package/dist/{chunk-9se093qz.js → chunk-gc4ntf7d.js} +4 -4
  102. package/dist/{chunk-9se093qz.js.map → chunk-gc4ntf7d.js.map} +1 -1
  103. package/dist/{chunk-98cw09sw.js → chunk-hkc3jct7.js} +4 -2
  104. package/dist/chunk-hkc3jct7.js.map +10 -0
  105. package/dist/{chunk-pja9jfz6.js → chunk-htr6wjmv.js} +115 -53
  106. package/dist/chunk-htr6wjmv.js.map +19 -0
  107. package/dist/{chunk-h3v76ams.js → chunk-jhm3zsa7.js} +25 -2
  108. package/dist/chunk-jhm3zsa7.js.map +12 -0
  109. package/dist/{chunk-52c5zb0z.js → chunk-k6hrnf35.js} +5 -5
  110. package/dist/chunk-k6hrnf35.js.map +10 -0
  111. package/dist/{chunk-c2rga5cx.js → chunk-mfs23znk.js} +1 -1
  112. package/dist/{chunk-7ecp4v7a.js → chunk-ny3xyvcn.js} +8 -2
  113. package/dist/{chunk-7ecp4v7a.js.map → chunk-ny3xyvcn.js.map} +3 -3
  114. package/dist/{chunk-fggq3d9k.js → chunk-p0dqwj3n.js} +5 -5
  115. package/dist/{chunk-cnb5kv05.js → chunk-p844e0rn.js} +23 -8
  116. package/dist/chunk-p844e0rn.js.map +19 -0
  117. package/dist/{chunk-dmn70ztd.js → chunk-pfp1txq2.js} +25 -6
  118. package/dist/chunk-pfp1txq2.js.map +11 -0
  119. package/dist/chunk-pqajwytd.js.map +2 -2
  120. package/dist/{chunk-5be2ath4.js → chunk-qkbx3tf6.js} +17 -128
  121. package/dist/{chunk-5be2ath4.js.map → chunk-qkbx3tf6.js.map} +6 -7
  122. package/dist/{chunk-sk0hcjsz.js → chunk-qkvz64nd.js} +2 -2
  123. package/dist/{chunk-w9yycd3t.js → chunk-qmnnhde6.js} +4 -8
  124. package/dist/{chunk-w9yycd3t.js.map → chunk-qmnnhde6.js.map} +3 -3
  125. package/dist/{chunk-5yd8cchh.js → chunk-qq90g05n.js} +8 -8
  126. package/dist/{chunk-5yd8cchh.js.map → chunk-qq90g05n.js.map} +1 -1
  127. package/dist/{chunk-tjjgy3z4.js → chunk-qxvp5epv.js} +66 -14
  128. package/dist/{chunk-tjjgy3z4.js.map → chunk-qxvp5epv.js.map} +9 -8
  129. package/dist/chunk-rdghfsss.js.map +2 -2
  130. package/dist/{chunk-rx7h5fdx.js → chunk-rt9p8m9t.js} +1 -1
  131. package/dist/{chunk-cd234ba4.js → chunk-rz53yb4v.js} +10 -5
  132. package/dist/chunk-rz53yb4v.js.map +14 -0
  133. package/dist/{chunk-xcy5ddha.js → chunk-s4jhg8a3.js} +351 -296
  134. package/dist/chunk-s4jhg8a3.js.map +15 -0
  135. package/dist/{chunk-69266efg.js → chunk-s54c868q.js} +12 -4
  136. package/dist/chunk-s54c868q.js.map +12 -0
  137. package/dist/{chunk-9g6jz9kk.js → chunk-tffvfy6s.js} +6 -5
  138. package/dist/{chunk-9g6jz9kk.js.map → chunk-tffvfy6s.js.map} +3 -3
  139. package/dist/{chunk-e67ynxcr.js → chunk-v6xpd60t.js} +3 -3
  140. package/dist/{chunk-jjrn5v0p.js → chunk-vgk3hknm.js} +1 -1
  141. package/dist/{chunk-5thzcb8g.js → chunk-vx2yp45y.js} +2 -2
  142. package/dist/{chunk-dam456ve.js → chunk-vz3gc1tm.js} +394 -31
  143. package/dist/{chunk-dam456ve.js.map → chunk-vz3gc1tm.js.map} +10 -7
  144. package/dist/chunk-xt1zt7gv.js +471 -0
  145. package/dist/chunk-xt1zt7gv.js.map +13 -0
  146. package/dist/{chunk-rpxz486p.js → chunk-y05543x6.js} +21 -5
  147. package/dist/{chunk-rpxz486p.js.map → chunk-y05543x6.js.map} +3 -3
  148. package/dist/{chunk-aq39q04r.js → chunk-y9jmd7e5.js} +4 -4
  149. package/dist/{chunk-aq39q04r.js.map → chunk-y9jmd7e5.js.map} +1 -1
  150. package/dist/{chunk-k4g51s47.js → chunk-yv9czyfr.js} +3 -3
  151. package/dist/{chunk-z5rnrmz1.js → chunk-yw9pyg66.js} +5 -3
  152. package/dist/chunk-yw9pyg66.js.map +11 -0
  153. package/dist/{chunk-vre348sb.js → chunk-za5yd58j.js} +2 -2
  154. package/dist/{chunk-23xs4qp9.js → chunk-zb77kjth.js} +3 -3
  155. package/dist/{chunk-33saed7g.js → chunk-zxawp1n2.js} +1 -1
  156. package/dist/datasets/builders.d.ts +12 -1
  157. package/dist/datasets/builders.d.ts.map +1 -1
  158. package/dist/datasets/execution.d.ts +27 -1
  159. package/dist/datasets/execution.d.ts.map +1 -1
  160. package/dist/datasets/index.d.ts +1 -1
  161. package/dist/datasets/index.d.ts.map +1 -1
  162. package/dist/datasets/types.d.ts +2 -0
  163. package/dist/datasets/types.d.ts.map +1 -1
  164. package/dist/datasets/write.d.ts +5 -0
  165. package/dist/datasets/write.d.ts.map +1 -1
  166. package/dist/datasets/write.js +10 -5
  167. package/dist/datasets/write.js.map +1 -1
  168. package/dist/edits/properties.d.ts.map +1 -1
  169. package/dist/events/execution.d.ts +2 -1
  170. package/dist/events/execution.d.ts.map +1 -1
  171. package/dist/events/types/objects.d.ts +5 -0
  172. package/dist/events/types/objects.d.ts.map +1 -1
  173. package/dist/execution/agent.d.ts +10 -0
  174. package/dist/execution/agent.d.ts.map +1 -1
  175. package/dist/execution/agent.js +39 -34
  176. package/dist/execution/agent.js.map +1 -1
  177. package/dist/execution/authorized-object-reader.d.ts +6 -1
  178. package/dist/execution/authorized-object-reader.d.ts.map +1 -1
  179. package/dist/execution/primitive.js +37 -34
  180. package/dist/execution/primitive.js.map +2 -2
  181. package/dist/execution/request.js +38 -35
  182. package/dist/execution/request.js.map +2 -2
  183. package/dist/http/api-routes.d.ts.map +1 -1
  184. package/dist/http/index.js +1 -1
  185. package/dist/index.d.ts +9 -8
  186. package/dist/index.d.ts.map +1 -1
  187. package/dist/index.js +57 -52
  188. package/dist/index.js.map +1 -1
  189. package/dist/lake-storage/index.js +8 -5
  190. package/dist/lake-storage/index.js.map +1 -1
  191. package/dist/materializer/index.js +19 -16
  192. package/dist/materializer/index.js.map +1 -1
  193. package/dist/models/catalog.d.ts +1 -1
  194. package/dist/models/catalog.d.ts.map +1 -1
  195. package/dist/models/execution/binding.d.ts +6 -0
  196. package/dist/models/execution/binding.d.ts.map +1 -1
  197. package/dist/models/execution/index.js +19 -16
  198. package/dist/models/execution/index.js.map +1 -1
  199. package/dist/models/execution/model-call-recorder.d.ts +4 -0
  200. package/dist/models/execution/model-call-recorder.d.ts.map +1 -1
  201. package/dist/models/execution.d.ts.map +1 -1
  202. package/dist/models/index.js +1 -1
  203. package/dist/models/language-model.d.ts +6 -0
  204. package/dist/models/language-model.d.ts.map +1 -1
  205. package/dist/objects/context/index.d.ts +1 -1
  206. package/dist/objects/context/index.d.ts.map +1 -1
  207. package/dist/objects/context/types.d.ts +6 -0
  208. package/dist/objects/context/types.d.ts.map +1 -1
  209. package/dist/objects/execution.d.ts +2 -1
  210. package/dist/objects/execution.d.ts.map +1 -1
  211. package/dist/objects/index.js +23 -19
  212. package/dist/objects/index.js.map +1 -1
  213. package/dist/objects/materializer-adapter.d.ts.map +1 -1
  214. package/dist/objects/object/upsert-batch.d.ts.map +1 -1
  215. package/dist/objects/object/upsert.d.ts.map +1 -1
  216. package/dist/objects/property-clearance.d.ts +41 -0
  217. package/dist/objects/property-clearance.d.ts.map +1 -0
  218. package/dist/objects/query/executor.d.ts +3 -0
  219. package/dist/objects/query/executor.d.ts.map +1 -1
  220. package/dist/objects/query/index.js +18 -15
  221. package/dist/objects/query/index.js.map +1 -1
  222. package/dist/objects/query/validate.d.ts +10 -1
  223. package/dist/objects/query/validate.d.ts.map +1 -1
  224. package/dist/objects/sdk/file-handle.d.ts +6 -0
  225. package/dist/objects/sdk/file-handle.d.ts.map +1 -0
  226. package/dist/objects/sdk/object-handle.d.ts +2 -2
  227. package/dist/objects/sdk/object-handle.d.ts.map +1 -1
  228. package/dist/objects/sdk/object-set.d.ts +2 -0
  229. package/dist/objects/sdk/object-set.d.ts.map +1 -1
  230. package/dist/ontology/builders.d.ts +12 -1
  231. package/dist/ontology/builders.d.ts.map +1 -1
  232. package/dist/ontology/docs-markdown.d.ts +35 -0
  233. package/dist/ontology/docs-markdown.d.ts.map +1 -0
  234. package/dist/ontology/docs.d.ts +50 -0
  235. package/dist/ontology/docs.d.ts.map +1 -0
  236. package/dist/ontology/index.js +7 -4
  237. package/dist/ontology/index.js.map +1 -1
  238. package/dist/ontology/inference/index.d.ts +19 -0
  239. package/dist/ontology/inference/index.d.ts.map +1 -1
  240. package/dist/ontology/internal.d.ts +3 -1
  241. package/dist/ontology/internal.d.ts.map +1 -1
  242. package/dist/ontology/internal.js +276 -3
  243. package/dist/ontology/internal.js.map +4 -3
  244. package/dist/ontology/tokens.d.ts +8 -1
  245. package/dist/ontology/tokens.d.ts.map +1 -1
  246. package/dist/ontology/types.d.ts +5 -0
  247. package/dist/ontology/types.d.ts.map +1 -1
  248. package/dist/ontology/validation/index.d.ts +1 -1
  249. package/dist/ontology/validation/index.d.ts.map +1 -1
  250. package/dist/ontology/validation/schema.d.ts +7 -0
  251. package/dist/ontology/validation/schema.d.ts.map +1 -1
  252. package/dist/pipelines/index.js +21 -18
  253. package/dist/pipelines/index.js.map +1 -1
  254. package/dist/projections/internal.js +19 -16
  255. package/dist/projections/internal.js.map +1 -1
  256. package/dist/runtime/create.d.ts +11 -2
  257. package/dist/runtime/create.d.ts.map +1 -1
  258. package/dist/runtime/definitions.d.ts +3 -1
  259. package/dist/runtime/definitions.d.ts.map +1 -1
  260. package/dist/runtime/host.d.ts +13 -2
  261. package/dist/runtime/host.d.ts.map +1 -1
  262. package/dist/runtime/index.d.ts +1 -1
  263. package/dist/runtime/index.d.ts.map +1 -1
  264. package/dist/runtime/internal.js +21 -18
  265. package/dist/runtime/internal.js.map +1 -1
  266. package/dist/runtime/locale.d.ts +9 -0
  267. package/dist/runtime/locale.d.ts.map +1 -0
  268. package/dist/runtime/resolve-definitions.d.ts +4 -2
  269. package/dist/runtime/resolve-definitions.d.ts.map +1 -1
  270. package/dist/runtime/types.d.ts +30 -3
  271. package/dist/runtime/types.d.ts.map +1 -1
  272. package/dist/sandboxes/index.js +7 -6
  273. package/dist/sandboxes/index.js.map +1 -1
  274. package/dist/scheduler/index.js +1 -1
  275. package/dist/scheduler/runtime.d.ts +3 -0
  276. package/dist/scheduler/runtime.d.ts.map +1 -1
  277. package/dist/security/builders.d.ts +11 -2
  278. package/dist/security/builders.d.ts.map +1 -1
  279. package/dist/security/index.d.ts +4 -4
  280. package/dist/security/index.d.ts.map +1 -1
  281. package/dist/security/markings.d.ts +19 -0
  282. package/dist/security/markings.d.ts.map +1 -0
  283. package/dist/security/redactions.d.ts +4 -0
  284. package/dist/security/redactions.d.ts.map +1 -0
  285. package/dist/security/registry.d.ts +7 -1
  286. package/dist/security/registry.d.ts.map +1 -1
  287. package/dist/security/types.d.ts +25 -0
  288. package/dist/security/types.d.ts.map +1 -1
  289. package/dist/security/validation.d.ts +4 -1
  290. package/dist/security/validation.d.ts.map +1 -1
  291. package/dist/shares/internal.js +18 -15
  292. package/dist/shares/internal.js.map +2 -2
  293. package/dist/storage/agents/provider.d.ts.map +1 -1
  294. package/dist/storage/agents/provider.js +5 -4
  295. package/dist/storage/agents/provider.js.map +1 -1
  296. package/dist/storage/agents/types.d.ts +15 -9
  297. package/dist/storage/agents/types.d.ts.map +1 -1
  298. package/dist/storage/file-upload-sessions/provider.js +10 -7
  299. package/dist/storage/file-upload-sessions/provider.js.map +1 -1
  300. package/dist/storage/index.d.ts +1 -0
  301. package/dist/storage/index.d.ts.map +1 -1
  302. package/dist/storage/index.js +18 -15
  303. package/dist/storage/index.js.map +1 -1
  304. package/dist/storage/internal.js +4 -3
  305. package/dist/storage/internal.js.map +1 -1
  306. package/dist/storage/objects/types.d.ts +7 -0
  307. package/dist/storage/objects/types.d.ts.map +1 -1
  308. package/dist/storage/workflow-runs/provider.js +10 -7
  309. package/dist/storage/workflow-runs/provider.js.map +1 -1
  310. package/dist/syncs/index.js +22 -19
  311. package/dist/syncs/index.js.map +1 -1
  312. package/dist/testing/index.js +55 -53
  313. package/dist/testing/index.js.map +2 -2
  314. package/dist/webhooks/internal.js +19 -16
  315. package/dist/webhooks/internal.js.map +2 -2
  316. package/dist/workflows/builders.d.ts.map +1 -1
  317. package/dist/workflows/index.js +41 -38
  318. package/dist/workflows/index.js.map +1 -1
  319. package/dist/workflows/request.d.ts.map +1 -1
  320. package/dist/workflows/types.d.ts +6 -3
  321. package/dist/workflows/types.d.ts.map +1 -1
  322. package/dist/workflows/validation.d.ts +2 -1
  323. package/dist/workflows/validation.d.ts.map +1 -1
  324. package/package.json +1 -1
  325. package/src/actions/read-facade.ts +2 -1
  326. package/src/actions/validation.ts +4 -1
  327. package/src/agents/adapters.ts +15 -0
  328. package/src/agents/authority.ts +15 -0
  329. package/src/agents/context/entries.ts +48 -4
  330. package/src/agents/context/index.ts +1 -0
  331. package/src/agents/context-compaction.ts +6 -0
  332. package/src/agents/errors.ts +3 -0
  333. package/src/agents/index.ts +13 -1
  334. package/src/agents/message.ts +9 -0
  335. package/src/agents/request.ts +178 -22
  336. package/src/agents/skills.ts +63 -0
  337. package/src/agents/types.ts +35 -5
  338. package/src/auth/runtime.ts +14 -0
  339. package/src/auth/types.ts +6 -0
  340. package/src/authorization/resolve.ts +6 -1
  341. package/src/authorization/types.ts +7 -0
  342. package/src/blob-storage/execution.ts +12 -0
  343. package/src/blob-storage/file-content.ts +106 -0
  344. package/src/blob-storage/index.ts +1 -0
  345. package/src/blob-storage/internal.ts +7 -0
  346. package/src/blob-storage/media-type.ts +29 -0
  347. package/src/blob-storage/types.ts +13 -1
  348. package/src/blob-storage/validation.ts +13 -0
  349. package/src/bootstrap/agent-context.ts +356 -0
  350. package/src/bootstrap/discovery.ts +100 -33
  351. package/src/bootstrap/index.ts +1 -1
  352. package/src/bootstrap/ontology-type-manifest.ts +3 -38
  353. package/src/datasets/builders.ts +17 -1
  354. package/src/datasets/execution.ts +110 -2
  355. package/src/datasets/index.ts +7 -1
  356. package/src/datasets/types.ts +2 -0
  357. package/src/datasets/write.ts +21 -2
  358. package/src/edits/properties.ts +3 -0
  359. package/src/events/execution.ts +15 -16
  360. package/src/events/types/objects.ts +5 -0
  361. package/src/execution/agent.ts +27 -0
  362. package/src/execution/authorization.ts +1 -0
  363. package/src/execution/authorized-object-reader.ts +96 -34
  364. package/src/execution/scopes.ts +2 -6
  365. package/src/http/api-routes.ts +4 -3
  366. package/src/index.ts +27 -2
  367. package/src/models/catalog.ts +26 -2
  368. package/src/models/execution/README.md +4 -3
  369. package/src/models/execution/binding.ts +6 -0
  370. package/src/models/execution/model-call-recorder.ts +10 -0
  371. package/src/models/execution/session.ts +2 -2
  372. package/src/models/execution.ts +6 -2
  373. package/src/models/language-model.ts +6 -0
  374. package/src/objects/context/index.ts +1 -0
  375. package/src/objects/context/types.ts +7 -0
  376. package/src/objects/execution.ts +4 -1
  377. package/src/objects/materializer-adapter.ts +3 -0
  378. package/src/objects/object/upsert-batch.ts +4 -1
  379. package/src/objects/object/upsert.ts +3 -1
  380. package/src/objects/property-clearance.ts +209 -0
  381. package/src/objects/query/executor.ts +43 -36
  382. package/src/objects/query/validate.ts +133 -14
  383. package/src/objects/sdk/file-handle.ts +77 -0
  384. package/src/objects/sdk/object-handle.ts +8 -4
  385. package/src/objects/sdk/object-set.ts +5 -2
  386. package/src/ontology/builders.ts +18 -2
  387. package/src/ontology/docs-markdown.ts +394 -0
  388. package/src/ontology/docs.ts +196 -0
  389. package/src/ontology/inference/index.ts +25 -0
  390. package/src/ontology/internal.ts +7 -0
  391. package/src/ontology/tokens.ts +13 -2
  392. package/src/ontology/types.ts +5 -0
  393. package/src/ontology/validation/index.ts +1 -0
  394. package/src/ontology/validation/schema.ts +26 -1
  395. package/src/runtime/create.ts +34 -4
  396. package/src/runtime/definitions.ts +3 -1
  397. package/src/runtime/host.ts +45 -1
  398. package/src/runtime/index.ts +3 -0
  399. package/src/runtime/locale.ts +26 -0
  400. package/src/runtime/resolve-definitions.ts +28 -1
  401. package/src/runtime/sixb.ts +1 -1
  402. package/src/runtime/types.ts +39 -3
  403. package/src/scheduler/runtime.ts +11 -2
  404. package/src/security/builders.ts +49 -5
  405. package/src/security/index.ts +6 -1
  406. package/src/security/markings.ts +313 -0
  407. package/src/security/redactions.ts +6 -0
  408. package/src/security/registry.ts +21 -1
  409. package/src/security/types.ts +26 -0
  410. package/src/security/validation.ts +59 -2
  411. package/src/storage/agents/provider.ts +11 -0
  412. package/src/storage/agents/types.ts +15 -7
  413. package/src/storage/index.ts +1 -0
  414. package/src/storage/objects/types.ts +7 -0
  415. package/src/workflows/builders.ts +24 -1
  416. package/src/workflows/request.ts +3 -0
  417. package/src/workflows/types.ts +6 -3
  418. package/src/workflows/validation.ts +32 -4
  419. package/dist/chunk-10styjgk.js.map +0 -20
  420. package/dist/chunk-52c5zb0z.js.map +0 -10
  421. package/dist/chunk-69266efg.js.map +0 -12
  422. package/dist/chunk-6wbm6ymz.js.map +0 -48
  423. package/dist/chunk-91kcnbf0.js.map +0 -10
  424. package/dist/chunk-98cw09sw.js.map +0 -10
  425. package/dist/chunk-9vx5e9g1.js.map +0 -11
  426. package/dist/chunk-cd234ba4.js.map +0 -14
  427. package/dist/chunk-cnb5kv05.js.map +0 -19
  428. package/dist/chunk-dmn70ztd.js.map +0 -11
  429. package/dist/chunk-gf7yht60.js.map +0 -12
  430. package/dist/chunk-h3v76ams.js.map +0 -11
  431. package/dist/chunk-pja9jfz6.js.map +0 -19
  432. package/dist/chunk-t9shqx3w.js.map +0 -12
  433. package/dist/chunk-xcy5ddha.js.map +0 -15
  434. package/dist/chunk-xyvy73tj.js.map +0 -12
  435. package/dist/chunk-z5rnrmz1.js.map +0 -11
  436. /package/dist/{chunk-4gmng3vf.js.map → chunk-22v5bpz3.js.map} +0 -0
  437. /package/dist/{chunk-2am3db31.js.map → chunk-48e3cn2d.js.map} +0 -0
  438. /package/dist/{chunk-f1xh7a32.js.map → chunk-7hpdd6r9.js.map} +0 -0
  439. /package/dist/{chunk-rb143ggb.js.map → chunk-bwjcehza.js.map} +0 -0
  440. /package/dist/{chunk-vp3z1ckh.js.map → chunk-de4z2bj6.js.map} +0 -0
  441. /package/dist/{chunk-3rrezgyc.js.map → chunk-dnmadg9k.js.map} +0 -0
  442. /package/dist/{chunk-a7er86jd.js.map → chunk-ex496vct.js.map} +0 -0
  443. /package/dist/{chunk-jnfxmr3f.js.map → chunk-f1zxad2t.js.map} +0 -0
  444. /package/dist/{chunk-c2rga5cx.js.map → chunk-mfs23znk.js.map} +0 -0
  445. /package/dist/{chunk-fggq3d9k.js.map → chunk-p0dqwj3n.js.map} +0 -0
  446. /package/dist/{chunk-sk0hcjsz.js.map → chunk-qkvz64nd.js.map} +0 -0
  447. /package/dist/{chunk-rx7h5fdx.js.map → chunk-rt9p8m9t.js.map} +0 -0
  448. /package/dist/{chunk-e67ynxcr.js.map → chunk-v6xpd60t.js.map} +0 -0
  449. /package/dist/{chunk-jjrn5v0p.js.map → chunk-vgk3hknm.js.map} +0 -0
  450. /package/dist/{chunk-5thzcb8g.js.map → chunk-vx2yp45y.js.map} +0 -0
  451. /package/dist/{chunk-k4g51s47.js.map → chunk-yv9czyfr.js.map} +0 -0
  452. /package/dist/{chunk-vre348sb.js.map → chunk-za5yd58j.js.map} +0 -0
  453. /package/dist/{chunk-23xs4qp9.js.map → chunk-zb77kjth.js.map} +0 -0
  454. /package/dist/{chunk-33saed7g.js.map → chunk-zxawp1n2.js.map} +0 -0
@@ -39,10 +39,13 @@ import { rerankObjectCandidates } from "./reranking-executor"
39
39
  import { findQueryReranking } from "./reranking-query"
40
40
  import { compareQueryScalarValues, queryScalarValuesEqual } from "./scalar-values"
41
41
  import {
42
+ type AdmittedObjectQuery,
43
+ type ObjectQuerySemanticAdmission,
42
44
  type ObjectQueryValidationIssue,
43
45
  resolveObjectQueryResultShape,
44
46
  type ValidatedObjectQuery,
45
47
  validateObjectQuery,
48
+ validateObjectQueryWithAdmission,
46
49
  } from "./validate"
47
50
 
48
51
  export interface QueryExecutorOptions
@@ -73,6 +76,8 @@ export interface QueryExecutorOptions
73
76
  authorization?: AuthorizationContext
74
77
  /** Registered execution capability for queries reached through a bound Sixb SDK. */
75
78
  runtimeAuthorization?: RuntimeAuthorization
79
+ /** Reader-specific admission applied after grants, such as marking clearances. */
80
+ admission?: ObjectQuerySemanticAdmission
76
81
  }
77
82
 
78
83
  export interface ExecuteObjectQueryInput {
@@ -138,15 +143,7 @@ export async function executeObjectQuery(
138
143
  input: ExecuteObjectQueryInput,
139
144
  options: QueryExecutorOptions
140
145
  ): Promise<ExecuteObjectQueryResult> {
141
- const normalized = normalizeObjectQuery(input.query)
142
- const validated = validateObjectQuery(normalized, {
143
- ontology: options.ontology,
144
- maxLimit: options.maxLimit,
145
- maxPageSize: options.maxPageSize,
146
- maxRefs: options.maxRefs,
147
- normalize: false,
148
- })
149
- assertQueryViewable(input.projectId, validated, options)
146
+ const validated = validateExecutableQuery(input, options)
150
147
  const capabilities = options.storage.queryCapabilities()
151
148
  const hasQueryObjects = typeof options.storage.queryObjects === "function"
152
149
  const hasCountObjects = typeof options.storage.countObjects === "function"
@@ -242,15 +239,7 @@ export async function countObjects(
242
239
  input: ExecuteObjectCountInput,
243
240
  options: QueryExecutorOptions
244
241
  ): Promise<ExecuteObjectCountResult> {
245
- const normalized = normalizeObjectQuery(input.query)
246
- const validated = validateObjectQuery(normalized, {
247
- ontology: options.ontology,
248
- maxLimit: options.maxLimit,
249
- maxPageSize: options.maxPageSize,
250
- maxRefs: options.maxRefs,
251
- normalize: false,
252
- })
253
- assertQueryViewable(input.projectId, validated, options)
242
+ const validated = validateExecutableQuery(input, options)
254
243
  const capabilities = options.storage.queryCapabilities()
255
244
  const hasQueryObjects = typeof options.storage.queryObjects === "function"
256
245
  const hasCountObjects = typeof options.storage.countObjects === "function"
@@ -303,15 +292,7 @@ export async function existsObjects(
303
292
  input: ExecuteObjectExistsInput,
304
293
  options: QueryExecutorOptions
305
294
  ): Promise<ExecuteObjectExistsResult> {
306
- const normalized = normalizeObjectQuery(input.query)
307
- const validated = validateObjectQuery(normalized, {
308
- ontology: options.ontology,
309
- maxLimit: options.maxLimit,
310
- maxPageSize: options.maxPageSize,
311
- maxRefs: options.maxRefs,
312
- normalize: false,
313
- })
314
- assertQueryViewable(input.projectId, validated, options)
295
+ const validated = validateExecutableQuery(input, options)
315
296
  const capabilities = options.storage.queryCapabilities()
316
297
  const hasQueryObjects = typeof options.storage.queryObjects === "function"
317
298
  const hasCountObjects = typeof options.storage.countObjects === "function"
@@ -364,16 +345,17 @@ export async function facetObjects(
364
345
  input: ExecuteObjectFacetsInput,
365
346
  options: QueryExecutorOptions
366
347
  ): Promise<ExecuteObjectFacetsResult> {
367
- const normalized = normalizeObjectQuery(input.query)
368
- const validated = validateObjectQuery(normalized, {
369
- ontology: options.ontology,
370
- maxLimit: options.maxLimit,
371
- maxPageSize: options.maxPageSize,
372
- maxRefs: options.maxRefs,
373
- normalize: false,
374
- })
375
- assertQueryViewable(input.projectId, validated, options)
348
+ const validated = validateExecutableQuery(input, options)
376
349
  const facets = validateObjectFacetRequests(input.facets, validated.result.objectTypeIds, options)
350
+ facets.forEach((facet, index) => {
351
+ const denial = options.admission?.property({
352
+ state: validated.admissionState,
353
+ propertyId: facet.propertyId,
354
+ use: "facet",
355
+ path: `$.facets[${index}].propertyId`,
356
+ })
357
+ if (denial) throw denial
358
+ })
377
359
  const aggregateQuery = stripOuterRowShape(validated.query)
378
360
  const capabilities = options.storage.queryCapabilities()
379
361
  const hasQueryObjects = typeof options.storage.queryObjects === "function"
@@ -430,6 +412,31 @@ export async function facetObjects(
430
412
  }
431
413
  }
432
414
 
415
+ /**
416
+ * Validate, authorize the touched types, then admit the query for the reader.
417
+ *
418
+ * Grants are checked first so a denial never describes properties of a type the caller cannot
419
+ * view. The admitted query is the one executed: an admission may narrow it, as markings narrow
420
+ * default text fields.
421
+ */
422
+ function validateExecutableQuery(
423
+ input: { readonly projectId: string; readonly query: ObjectQuery },
424
+ options: QueryExecutorOptions
425
+ ): AdmittedObjectQuery {
426
+ const validationOptions = {
427
+ ontology: options.ontology,
428
+ maxLimit: options.maxLimit,
429
+ maxPageSize: options.maxPageSize,
430
+ maxRefs: options.maxRefs,
431
+ normalize: false,
432
+ }
433
+ const normalized = normalizeObjectQuery(input.query)
434
+ const validated = validateObjectQuery(normalized, validationOptions)
435
+ assertQueryViewable(input.projectId, validated, options)
436
+ if (!options.admission) return { ...validated, admissionState: {} }
437
+ return validateObjectQueryWithAdmission(normalized, validationOptions, options.admission)
438
+ }
439
+
433
440
  // Authorization happens at planning time: a scoped query must hold a view
434
441
  // grant for every object type it touches, before any storage call runs.
435
442
  function assertQueryViewable(
@@ -42,7 +42,10 @@ export interface ObjectQueryValidationIssue {
42
42
  export interface ValidatedObjectQuery {
43
43
  query: ObjectQuery
44
44
  result: ObjectQueryResultShape
45
- /** Every object type the query touches, including intermediate traversal types. */
45
+ /**
46
+ * Every object type the query touches, including intermediate traversal types and the subtypes
47
+ * an outgoing link can reach.
48
+ */
46
49
  touchedObjectTypeIds: readonly string[]
47
50
  }
48
51
 
@@ -159,6 +162,67 @@ const NOOP_QUERY_ADMISSION: ObjectQuerySemanticAdmission = Object.freeze({
159
162
  input.states[0] ?? NOOP_ADMISSION_STATE,
160
163
  })
161
164
 
165
+ /**
166
+ * Admit a query only when both admissions admit it, each reducing its own state.
167
+ *
168
+ * The first denial wins, in order, so composing keeps each admission's messages unchanged.
169
+ */
170
+ export function composeObjectQueryAdmissions(
171
+ first: ObjectQuerySemanticAdmission,
172
+ second: ObjectQuerySemanticAdmission
173
+ ): ObjectQuerySemanticAdmission {
174
+ const parts = new WeakMap<
175
+ ObjectQueryAdmissionState,
176
+ readonly [ObjectQueryAdmissionState, ObjectQueryAdmissionState]
177
+ >()
178
+ const join = (
179
+ left: ObjectQueryAdmissionState,
180
+ right: ObjectQueryAdmissionState
181
+ ): ObjectQueryAdmissionState => {
182
+ const state = Object.freeze({})
183
+ parts.set(state, [left, right])
184
+ return state
185
+ }
186
+ const split = (state: ObjectQueryAdmissionState) => {
187
+ const pair = parts.get(state)
188
+ if (!pair) throw new Error("[Sixb] Composed query admission received a foreign state.")
189
+ return pair
190
+ }
191
+ const transition = (
192
+ left: ObjectQueryAdmissionTransition,
193
+ right: ObjectQueryAdmissionTransition
194
+ ): ObjectQueryAdmissionTransition => {
195
+ const denial = left.denial ?? right.denial
196
+ return { state: join(left.state, right.state), ...(denial ? { denial } : {}) }
197
+ }
198
+
199
+ const admission: ObjectQuerySemanticAdmission = {
200
+ empty: () => join(first.empty(), second.empty()),
201
+ source: (input) => transition(first.source(input), second.source(input)),
202
+ edge: (input) => {
203
+ const [left, right] = split(input.state)
204
+ return transition(
205
+ first.edge({ ...input, state: left }),
206
+ second.edge({ ...input, state: right })
207
+ )
208
+ },
209
+ property: (input) => {
210
+ const [left, right] = split(input.state)
211
+ return (
212
+ first.property({ ...input, state: left }) ?? second.property({ ...input, state: right })
213
+ )
214
+ },
215
+ set: (input) => {
216
+ const pairs = input.states.map(split)
217
+ return join(
218
+ first.set({ ...input, states: pairs.map(([left]) => left) }),
219
+ second.set({ ...input, states: pairs.map(([, right]) => right) })
220
+ )
221
+ },
222
+ }
223
+ return Object.freeze(admission)
224
+ }
225
+
162
226
  export function validateObjectQuery(
163
227
  query: ObjectQuery,
164
228
  options: ObjectQueryValidationOptions
@@ -530,9 +594,7 @@ function validateStart(
530
594
  return { result: { objectTypeIds: [] }, query: { kind: "start", objectTypeId } }
531
595
  }
532
596
 
533
- const objectTypeIds = includeSubtypes
534
- ? uniqueStrings([objectTypeId, ...ctx.ontology.listSubTypes(objectTypeId)])
535
- : [objectTypeId]
597
+ const objectTypeIds = includeSubtypes ? withSubtypes([objectTypeId], ctx) : [objectTypeId]
536
598
 
537
599
  return { result: { objectTypeIds }, query: { kind: "start", objectTypeId, includeSubtypes } }
538
600
  }
@@ -895,16 +957,15 @@ function validateTextQuery(
895
957
  continue
896
958
  }
897
959
 
898
- if (fieldsByObjectType) fieldsByObjectType[objectType.id] = uniqueStrings(fieldIds)
960
+ const admitted = admitTextFields(fieldIds, fields === undefined, {
961
+ state: admissionState,
962
+ objectTypeId: objectType.id,
963
+ path: `${path}.fields`,
964
+ ctx,
965
+ })
966
+ if (fieldsByObjectType) fieldsByObjectType[objectType.id] = uniqueStrings(admitted)
899
967
 
900
968
  for (const fieldId of fieldIds) {
901
- admitProperty(ctx, {
902
- state: admissionState,
903
- propertyId: fieldId,
904
- objectTypeId: objectType.id,
905
- use: "text",
906
- path: `${path}.fields`,
907
- })
908
969
  const property = getProperty(objectType, fieldId)
909
970
  if (!property) {
910
971
  addIssue(
@@ -933,6 +994,43 @@ function validateTextQuery(
933
994
  return fieldsByObjectType ? { fieldsByObjectType } : {}
934
995
  }
935
996
 
997
+ /**
998
+ * Admit the fields a text query searches. Every explicit field must be admitted. Default fields
999
+ * come from the type's search profile, so a reader that cannot use one searches the others
1000
+ * instead; only a type left with no usable default field is denied.
1001
+ */
1002
+ function admitTextFields(
1003
+ fieldIds: readonly string[],
1004
+ defaults: boolean,
1005
+ input: {
1006
+ readonly state: ObjectQueryAdmissionState
1007
+ readonly objectTypeId: string
1008
+ readonly path: string
1009
+ readonly ctx: QueryValidationContext
1010
+ }
1011
+ ): readonly string[] {
1012
+ const admitted: string[] = []
1013
+ let firstDenial: Error | undefined
1014
+ for (const fieldId of fieldIds) {
1015
+ const denial = input.ctx.admission.property({
1016
+ state: input.state,
1017
+ propertyId: fieldId,
1018
+ objectTypeId: input.objectTypeId,
1019
+ use: "text",
1020
+ path: input.path,
1021
+ })
1022
+ if (!denial) {
1023
+ admitted.push(fieldId)
1024
+ } else if (!defaults) {
1025
+ recordAdmissionDenial(input.ctx, denial)
1026
+ } else {
1027
+ firstDenial ??= denial
1028
+ }
1029
+ }
1030
+ if (admitted.length === 0 && firstDenial) recordAdmissionDenial(input.ctx, firstDenial)
1031
+ return admitted
1032
+ }
1033
+
936
1034
  function validateVectorProfileQuery(
937
1035
  query: ObjectQueryVector,
938
1036
  shape: ObjectQueryResultShape,
@@ -1060,7 +1158,9 @@ function validateOutgoingTraverse(
1060
1158
  }
1061
1159
  }
1062
1160
 
1063
- return { objectTypeIds: uniqueStrings(targetTypeIds) }
1161
+ const objectTypeIds = uniqueStrings(targetTypeIds)
1162
+ touchLinkTargets(objectTypeIds, ctx)
1163
+ return { objectTypeIds }
1064
1164
  }
1065
1165
 
1066
1166
  function validateIncomingTraverse(
@@ -1261,7 +1361,22 @@ function resolveOutgoingExpansionTargets(
1261
1361
  )
1262
1362
  }
1263
1363
 
1264
- return { objectTypeIds: uniqueStrings(targetTypeIds) }
1364
+ const objectTypeIds = uniqueStrings(targetTypeIds)
1365
+ touchLinkTargets(objectTypeIds, ctx)
1366
+ return { objectTypeIds }
1367
+ }
1368
+
1369
+ /**
1370
+ * Following a link outgoing reads every subtype of its declared targets: links accept subtype
1371
+ * targets and storage follows them by link id alone. Authorize those reads like a `start` that
1372
+ * includes subtypes; the result shape keeps the declared targets that later nodes validate against.
1373
+ * Incoming edges already name every source type they can return: storage matches a pinned
1374
+ * `sourceObjectTypeId` exactly, and otherwise subtypes inherit the link.
1375
+ */
1376
+ function touchLinkTargets(objectTypeIds: readonly string[], ctx: QueryValidationContext): void {
1377
+ for (const objectTypeId of withSubtypes(objectTypeIds, ctx)) {
1378
+ ctx.touchedObjectTypeIds.add(objectTypeId)
1379
+ }
1265
1380
  }
1266
1381
 
1267
1382
  function resolveIncomingExpansionTargets(
@@ -1657,6 +1772,10 @@ function uniqueStrings(values: readonly string[]): string[] {
1657
1772
  return [...new Set(values)]
1658
1773
  }
1659
1774
 
1775
+ function withSubtypes(objectTypeIds: readonly string[], ctx: QueryValidationContext): string[] {
1776
+ return uniqueStrings(objectTypeIds.flatMap((id) => [id, ...ctx.ontology.listSubTypes(id)]))
1777
+ }
1778
+
1660
1779
  function admitTransition(
1661
1780
  ctx: QueryValidationContext,
1662
1781
  transition: ObjectQueryAdmissionTransition
@@ -0,0 +1,77 @@
1
+ /**
2
+ * File handle factory for ObjectReadByIdHandle.
3
+ *
4
+ * Opens a `fileRef` property through the object that holds it, the way the object file content
5
+ * route does: the object is read again with the caller's permissions, the FileRef is resolved in
6
+ * that authorized row, then checked against the stored blob before it is opened.
7
+ */
8
+ import { AuthorizationError } from "../../authorization/errors"
9
+ import { jsonPointerSegment, openFileRef, resolveFileRefAtPath } from "../../blob-storage/internal"
10
+ import type { Property } from "../../ontology"
11
+ import { OntologyValidationError } from "../../ontology/errors"
12
+ import type { PropertyToken } from "../../ontology/tokens"
13
+ import { assertPropertyTokenBelongsToObjectType } from "../../ontology/validation"
14
+ import type { ObjectFileHandle } from "../../runtime/types"
15
+ import type { ObjectSetContext } from "../context"
16
+
17
+ export function createObjectFileHandle(
18
+ ctx: ObjectSetContext,
19
+ primaryId: string,
20
+ property: PropertyToken<string, string, Property>,
21
+ index?: number
22
+ ): ObjectFileHandle {
23
+ const { objectType } = ctx
24
+ assertPropertyTokenBelongsToObjectType(objectType, property)
25
+ const registered = ctx.ontology
26
+ .resolveObjectType(objectType.id)
27
+ .properties.find((candidate) => candidate.id === property.id)
28
+ if (!registered) {
29
+ throw new OntologyValidationError(
30
+ `[Sixb] Unknown property '${property.id}' for object type '${objectType.id}'`
31
+ )
32
+ }
33
+ const path = filePropertyPath(objectType.id, registered, index)
34
+
35
+ return {
36
+ async open() {
37
+ const row = await ctx.objectReader.getByPrimaryId({ objectTypeId: objectType.id, primaryId })
38
+ if (!row) return null
39
+ if (row.redactions?.[property.id]) {
40
+ // Redacted, so the registered property has a marking the caller is not cleared for.
41
+ const markings = registered.markings ?? []
42
+ const marking =
43
+ markings.find((markingId) => !ctx.authorization?.clearances?.has(markingId)) ??
44
+ markings[0]
45
+ throw new AuthorizationError(
46
+ `clearance:marking:${marking}`,
47
+ `[Sixb] Cannot open file '${objectType.id}.${property.id}': it requires clearance for marking '${marking}'.`
48
+ )
49
+ }
50
+ const fileRef = resolveFileRefAtPath(row, path)
51
+ return fileRef ? openFileRef(ctx.blobStorage, fileRef) : null
52
+ },
53
+ }
54
+ }
55
+
56
+ /** JSON Pointer to the file in an object row, validated against the property's schema. */
57
+ function filePropertyPath(objectTypeId: string, property: Property, index: number | undefined) {
58
+ const { schema } = property
59
+ const name = `${objectTypeId}.${property.id}`
60
+ if (schema === "fileRef") {
61
+ if (index !== undefined) {
62
+ throw new OntologyValidationError(`[Sixb] Property ${name} holds one file; omit the index.`)
63
+ }
64
+ return `/properties/${jsonPointerSegment(property.id)}`
65
+ }
66
+ if (typeof schema === "object" && schema.type === "array" && schema.items === "fileRef") {
67
+ if (index === undefined || !Number.isSafeInteger(index) || index < 0) {
68
+ throw new OntologyValidationError(
69
+ `[Sixb] Property ${name} holds a list of files; pass the index of the file to open.`
70
+ )
71
+ }
72
+ return `/properties/${jsonPointerSegment(property.id)}/${index}`
73
+ }
74
+ throw new OntologyValidationError(
75
+ `[Sixb] Property ${name} is not a file: file() takes a "fileRef" property or a list of them.`
76
+ )
77
+ }
@@ -5,26 +5,27 @@
5
5
  */
6
6
 
7
7
  import type { ActionDefinition } from "../../actions"
8
- import type { ObjectLink, ObjectRef } from "../../ontology"
8
+ import type { ObjectLink, ObjectRef, Property } from "../../ontology"
9
9
  import { OntologyValidationError } from "../../ontology/errors"
10
- import type { LinkToken, ObjectTypeWithPropertyTokens } from "../../ontology/tokens"
10
+ import type { LinkToken, ObjectTypeWithPropertyTokens, PropertyToken } from "../../ontology/tokens"
11
11
  import { assertLinkTokenBelongsToObjectType } from "../../ontology/validation"
12
12
  import type { ObjectByIdHandle, TwinObject } from "../../runtime/types"
13
13
  import {
14
14
  requestActionAndWait as requestActionAndWaitLeaf,
15
15
  requestAction as requestActionLeaf,
16
16
  } from "../action"
17
- import type { ExecutionObjectContext, ResolvedLinkContext } from "../context"
17
+ import type { ObjectSetContext, ResolvedLinkContext } from "../context"
18
18
  import { removeLink as removeLinkLeaf, upsertLink as upsertLinkLeaf } from "../link"
19
19
  import { deleteObject, restoreObject } from "../object"
20
20
  import { createObjectVectorHandle } from "../vectors/handle"
21
+ import { createObjectFileHandle } from "./file-handle"
21
22
  import { createTelemetryChannel } from "./telemetry-channel"
22
23
 
23
24
  type ObjectRefInput = ObjectRef
24
25
  type AnyLinkToken = LinkToken<string, string, string | readonly string[], ObjectLink>
25
26
 
26
27
  export function createObjectByIdHandle<TObjectType extends ObjectTypeWithPropertyTokens>(
27
- ctx: ExecutionObjectContext,
28
+ ctx: ObjectSetContext,
28
29
  primaryId: string
29
30
  ): ObjectByIdHandle<TObjectType> {
30
31
  const objectHandle = {
@@ -130,6 +131,9 @@ export function createObjectByIdHandle<TObjectType extends ObjectTypeWithPropert
130
131
  },
131
132
 
132
133
  telemetry: createTelemetryChannel<TObjectType>(ctx, primaryId),
134
+
135
+ file: (property: PropertyToken<string, string, Property>, index?: number) =>
136
+ createObjectFileHandle(ctx, primaryId, property, index),
133
137
  }
134
138
 
135
139
  return objectHandle as unknown as ObjectByIdHandle<TObjectType>
@@ -6,6 +6,7 @@
6
6
 
7
7
  import type { ActionDefinition } from "../../actions"
8
8
  import type { AuthorizationContext } from "../../authorization"
9
+ import type { BlobStorage } from "../../blob-storage"
9
10
  import { shareSixbErrorReporter } from "../../error-reporting/capability"
10
11
  import type { ExecutionContext } from "../../execution"
11
12
  import { assertAuthorizedObjectReaderBinding } from "../../execution/authorized-object-reader"
@@ -22,7 +23,7 @@ import {
22
23
  requestActionAndWait as requestActionAndWaitLeaf,
23
24
  requestAction as requestActionLeaf,
24
25
  } from "../action"
25
- import type { ExecutionObjectContext, ResolvedLinkContext } from "../context"
26
+ import type { ObjectSetContext, ResolvedLinkContext } from "../context"
26
27
  import { requireLinkDefinition } from "../context"
27
28
  import { removeLink as removeLinkLeaf, upsertLink as upsertLinkLeaf } from "../link"
28
29
  import { upsertObject as upsertObjectLeaf } from "../object"
@@ -36,6 +37,7 @@ export function createObjectSet<TObjectType extends ObjectTypeWithPropertyTokens
36
37
  readonly execution: ExecutionContext
37
38
  readonly objectType: TObjectType
38
39
  readonly authorization?: AuthorizationContext
40
+ readonly blobStorage: Pick<BlobStorage, "stat" | "open">
39
41
  }
40
42
  ): ObjectSet<TObjectType> {
41
43
  assertAuthorizedObjectReaderBinding({
@@ -67,7 +69,7 @@ export function createObjectSet<TObjectType extends ObjectTypeWithPropertyTokens
67
69
  objectReader,
68
70
  })
69
71
 
70
- const resolvedCtx: ExecutionObjectContext = {
72
+ const resolvedCtx: ObjectSetContext = {
71
73
  embeddingModels: params.embeddingModels,
72
74
  projectId,
73
75
  broker,
@@ -80,6 +82,7 @@ export function createObjectSet<TObjectType extends ObjectTypeWithPropertyTokens
80
82
  runtimeAuthorization,
81
83
  authorization,
82
84
  execution,
85
+ blobStorage: params.blobStorage,
83
86
  objectType,
84
87
  primaryPropertyId,
85
88
  }
@@ -26,6 +26,8 @@
26
26
  * ```
27
27
  */
28
28
 
29
+ import { markingIdsFrom } from "../security/builders"
30
+ import type { MarkingDefinition } from "../security/types"
29
31
  import type { ObjectTypeWithPropertyTokens, ObjectTypeWithTokens } from "./tokens"
30
32
  import { createLinkTokenMap, createPropertyTokenMap } from "./tokens"
31
33
  import type {
@@ -353,8 +355,17 @@ type PropertyOptions = {
353
355
  mode?: PropertyMode
354
356
  semanticType?: QuantitativeTypeId
355
357
  query?: PropertyQueryMetadata
358
+ /** Readers need a clearance for every marking to receive this property's value. */
359
+ markings?: readonly MarkingDefinition[]
356
360
  }
357
361
 
362
+ /** The property records marking ids; only a declared, non-empty list marks it. */
363
+ type MarkingsFromOptions<TOptions> = TOptions extends {
364
+ markings: readonly [MarkingDefinition, ...MarkingDefinition[]]
365
+ }
366
+ ? { markings: readonly string[] }
367
+ : { markings?: readonly string[] }
368
+
358
369
  type PropertyResult<
359
370
  TId extends string,
360
371
  TSchema extends Schema,
@@ -369,7 +380,8 @@ type PropertyResult<
369
380
  FieldFromOptions<TOptions, "primary", true> &
370
381
  FieldFromOptions<TOptions, "mode", PropertyMode> &
371
382
  FieldFromOptions<TOptions, "semanticType", QuantitativeTypeId> &
372
- FieldFromOptions<TOptions, "query", PropertyQueryMetadata>
383
+ FieldFromOptions<TOptions, "query", PropertyQueryMetadata> &
384
+ MarkingsFromOptions<TOptions>
373
385
 
374
386
  /**
375
387
  * Shorthand for creating a {@link Property}.
@@ -396,11 +408,15 @@ export function prop<
396
408
  const TOptions extends PropertyOptions,
397
409
  >(id: TId, schema: TSchema, options: TOptions): PropertyResult<TId, TSchema, TOptions>
398
410
  export function prop(id: string, schema: Schema, options?: PropertyOptions): Property {
411
+ const { markings, ...rest } = options ?? {}
399
412
  return {
400
413
  id,
401
414
  name: options?.name ?? id,
402
415
  schema,
403
- ...options,
416
+ ...rest,
417
+ ...(markings && markings.length > 0
418
+ ? { markings: markingIdsFrom(markings, `Property '${id}' markings`) }
419
+ : {}),
404
420
  }
405
421
  }
406
422