@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
@@ -0,0 +1,394 @@
1
+ /**
2
+ * Markdown reference docs for the object types one reader can see, rendered from that reader's
3
+ * authorized ontology view. Output is deterministic: the same view renders the same bytes.
4
+ */
5
+
6
+ import type { ActionDescriptor, ActionParamDescriptor } from "../actions/descriptor"
7
+ import type { AgentProjectFile } from "../agents/skills"
8
+ import type { OntologyDoc, OntologyDocsCatalog } from "./docs"
9
+ import {
10
+ type PropertyQueryOperator,
11
+ resolvePropertyQueryCapabilities,
12
+ resolveQuerySchema,
13
+ } from "./query-capabilities"
14
+ import type { ObjectLink, ObjectType, PrimitiveSchema, Property, Schema, ValueType } from "./types"
15
+
16
+ export interface RenderOntologyDocsInput {
17
+ readonly catalog: OntologyDocsCatalog
18
+ /** The object types the reader can see, as its authorized ontology view lists them. */
19
+ readonly objectTypes: readonly ObjectType[]
20
+ readonly valueTypesById: ReadonlyMap<string, ValueType>
21
+ /** The actions the reader can request on objects of this type. */
22
+ readonly actionsFor: (objectType: ObjectType) => readonly ActionDescriptor[]
23
+ /**
24
+ * Marked properties the reader is not cleared for. Like the ontology API, docs still list them,
25
+ * flagged, so the agent can say the information exists; their values cannot be read or queried.
26
+ */
27
+ readonly restrictedPropertyIds?: (objectTypeId: string) => ReadonlySet<string>
28
+ }
29
+
30
+ export interface OntologyDocsIndexEntry {
31
+ /** POSIX path relative to the ontology directory; a scripts directory ends with `/`. */
32
+ readonly path: string
33
+ readonly summary: string
34
+ }
35
+
36
+ export interface RenderedOntologyDocs {
37
+ /** Files to install, by POSIX path relative to the ontology directory. */
38
+ readonly files: readonly AgentProjectFile[]
39
+ /** One entry per doc and per scripts directory, sorted by path. */
40
+ readonly index: readonly OntologyDocsIndexEntry[]
41
+ }
42
+
43
+ const MAX_SUMMARY_LENGTH = 120
44
+ const EXACT: readonly PropertyQueryOperator[] = ["eq", "neq", "in", "exists"]
45
+ const RANGE: readonly PropertyQueryOperator[] = ["lt", "lte", "gt", "gte"]
46
+ const ORDERED_SCHEMAS: ReadonlySet<PrimitiveSchema> = new Set([
47
+ "integer",
48
+ "double",
49
+ "decimal",
50
+ "date",
51
+ "timestamp",
52
+ ])
53
+ /** A period that ends "e.g." or "i.e." does not end the sentence. */
54
+ const ABBREVIATION_END_RE = /\b(?:e\.g|i\.e|etc|vs|cf)\.$/i
55
+
56
+ /** Render one doc per visible type, then the team's other docs and scripts. */
57
+ export function renderOntologyDocs(input: RenderOntologyDocsInput): RenderedOntologyDocs {
58
+ const objectTypes = input.objectTypes
59
+ const objectTypesById = new Map(objectTypes.map((objectType) => [objectType.id, objectType]))
60
+ const docs = [
61
+ ...objectTypes.map((objectType) => ({
62
+ path: input.catalog.docPathFor(objectType.id),
63
+ contents: renderObjectTypeDoc({
64
+ ...input,
65
+ objectType,
66
+ objectTypes,
67
+ objectTypesById,
68
+ restricted: input.restrictedPropertyIds?.(objectType.id) ?? new Set(),
69
+ }),
70
+ summary: typeSummary(objectType),
71
+ })),
72
+ ...input.catalog.listDocs().map((doc) => ({
73
+ path: doc.path,
74
+ contents: doc.contents,
75
+ summary: firstHeading(doc.contents) ?? "",
76
+ })),
77
+ ]
78
+ const scripts = input.catalog.listScripts()
79
+ const scriptDirectories = [...new Set(scripts.map((script) => scriptsDirectoryOf(script.path)))]
80
+
81
+ return Object.freeze({
82
+ files: Object.freeze(
83
+ [...docs.map(({ path, contents }) => ({ path, contents })), ...scripts].sort(byPath)
84
+ ),
85
+ index: Object.freeze(
86
+ [
87
+ ...docs.map(({ path, summary }) => ({ path, summary })),
88
+ ...scriptDirectories.map((path) => ({ path, summary: "Scripts" })),
89
+ ].sort(byPath)
90
+ ),
91
+ })
92
+ }
93
+
94
+ function renderObjectTypeDoc(
95
+ input: RenderOntologyDocsInput & {
96
+ readonly objectType: ObjectType
97
+ readonly objectTypes: readonly ObjectType[]
98
+ readonly objectTypesById: ReadonlyMap<string, ObjectType>
99
+ readonly restricted: ReadonlySet<string>
100
+ }
101
+ ): string {
102
+ const { objectType, restricted } = input
103
+ const sections = [
104
+ objectType.name === objectType.id
105
+ ? `# ${objectType.id}`
106
+ : `# ${objectType.id} — ${oneLine(objectType.name)}`,
107
+ objectType.description?.trim(),
108
+ objectType.extends === undefined ? undefined : `Extends \`${objectType.extends}\`.`,
109
+ renderProperties(objectType, input.valueTypesById, restricted),
110
+ renderVectorProfiles(objectType, restricted),
111
+ renderLinks(objectType, input.objectTypesById, input.catalog),
112
+ renderIncomingLinks(objectType, input.objectTypes, input.catalog),
113
+ renderActions(input.actionsFor(objectType), input.valueTypesById),
114
+ renderNotes(input.catalog.notesFor(objectType.id)),
115
+ ]
116
+ return `${sections.filter((section) => section !== undefined && section !== "").join("\n\n")}\n`
117
+ }
118
+
119
+ function renderProperties(
120
+ objectType: ObjectType,
121
+ valueTypesById: ReadonlyMap<string, ValueType>,
122
+ restricted: ReadonlySet<string>
123
+ ): string | undefined {
124
+ if (objectType.properties.length === 0) return undefined
125
+ const anyRestricted = objectType.properties.some((property) => restricted.has(property.id))
126
+ return [
127
+ "## Properties",
128
+ "",
129
+ ...(anyRestricted
130
+ ? ["Restricted properties: this user is not cleared to read or query their values.", ""]
131
+ : []),
132
+ table(
133
+ ["Property", "Type", "Query", "Description"],
134
+ objectType.properties.map((property) => [
135
+ code(property.id),
136
+ withFlags(schemaLabel(property.schema, valueTypesById), [
137
+ ...(property.primary ? ["primary key"] : []),
138
+ ...(property.required && !property.primary ? ["required"] : []),
139
+ ...(property.nullable ? ["nullable"] : []),
140
+ ...(property.mode === "telemetry" ? ["telemetry"] : []),
141
+ ...(restricted.has(property.id) ? ["restricted"] : []),
142
+ ]),
143
+ restricted.has(property.id) ? "—" : queryLabel(property, valueTypesById),
144
+ property.description ?? "",
145
+ ])
146
+ ),
147
+ ].join("\n")
148
+ }
149
+
150
+ function queryLabel(property: Property, valueTypesById: ReadonlyMap<string, ValueType>): string {
151
+ const capabilities = resolvePropertyQueryCapabilities(property, valueTypesById)
152
+ const schema = resolveQuerySchema(property.schema, valueTypesById)
153
+ const meaningful = schema === undefined ? new Set() : meaningfulOperators(schema)
154
+ const operators = capabilities.operators.filter((operator) => meaningful.has(operator))
155
+ const labels = [
156
+ ...(operators.length === 0 ? [] : [`filter: ${operators.join(", ")}`]),
157
+ ...(capabilities.sortable ? ["sort"] : []),
158
+ ...(capabilities.text ? ["text"] : []),
159
+ ...(capabilities.facet ? ["facet"] : []),
160
+ ]
161
+ return labels.length === 0 ? "—" : labels.join("; ")
162
+ }
163
+
164
+ /**
165
+ * The predicates worth suggesting for a schema: the engine also accepts ranges over strings and
166
+ * enums, and substring matches, which rarely answer a question about this kind of value.
167
+ */
168
+ function meaningfulOperators(schema: Schema): ReadonlySet<PropertyQueryOperator> {
169
+ if (typeof schema === "string") {
170
+ return new Set(ORDERED_SCHEMAS.has(schema) ? [...EXACT, ...RANGE] : EXACT)
171
+ }
172
+ if (schema.type === "enum") return new Set(EXACT)
173
+ if (schema.type === "array" || schema.type === "map") return new Set(["contains"])
174
+ return new Set()
175
+ }
176
+
177
+ function renderVectorProfiles(
178
+ objectType: ObjectType,
179
+ restricted: ReadonlySet<string>
180
+ ): string | undefined {
181
+ // Searching a profile admits each of its sources like a filter would: one restricted source
182
+ // makes the search fail for this user, so the profile is left out.
183
+ const profiles = Object.entries(objectType.search?.vectors ?? {}).filter(([, profile]) =>
184
+ profile.source.every((propertyId) => !restricted.has(propertyId))
185
+ )
186
+ if (profiles.length === 0) return undefined
187
+ return [
188
+ "## Vector search profiles",
189
+ "",
190
+ table(
191
+ ["Profile", "Sources"],
192
+ profiles
193
+ .sort(([left], [right]) => left.localeCompare(right))
194
+ .map(([name, profile]) => [code(name), profile.source.map(code).join(", ")])
195
+ ),
196
+ ].join("\n")
197
+ }
198
+
199
+ function renderLinks(
200
+ objectType: ObjectType,
201
+ objectTypesById: ReadonlyMap<string, ObjectType>,
202
+ catalog: OntologyDocsCatalog
203
+ ): string | undefined {
204
+ if (objectType.links.length === 0) return undefined
205
+ return [
206
+ "## Links",
207
+ "",
208
+ table(
209
+ ["Link", "Target", "Cardinality", "Description", "Target description"],
210
+ objectType.links.map((link) => {
211
+ // A reader's view expands `*` into every type it can see; the doc keeps the declaration.
212
+ const targets = catalog.isWildcardLink(objectType.id, link.id) ? ["*"] : linkTargets(link)
213
+ return [
214
+ code(link.id),
215
+ targets.map(code).join(", "),
216
+ link.cardinality ?? "many",
217
+ link.description ?? "",
218
+ targets
219
+ .map((targetId) => firstSentence(objectTypesById.get(targetId)?.description))
220
+ .filter((description) => description !== undefined)
221
+ .join(" "),
222
+ ]
223
+ })
224
+ ),
225
+ ].join("\n")
226
+ }
227
+
228
+ function renderIncomingLinks(
229
+ objectType: ObjectType,
230
+ objectTypes: readonly ObjectType[],
231
+ catalog: OntologyDocsCatalog
232
+ ): string | undefined {
233
+ const incoming = objectTypes.flatMap((source) =>
234
+ source.links
235
+ .filter(
236
+ (link) =>
237
+ !catalog.isWildcardLink(source.id, link.id) && linkTargets(link).includes(objectType.id)
238
+ )
239
+ .map((link) => [
240
+ code(source.id),
241
+ code(link.id),
242
+ link.cardinality ?? "many",
243
+ link.description ?? "",
244
+ ])
245
+ )
246
+ if (incoming.length === 0) return undefined
247
+ return [
248
+ "## Incoming links",
249
+ "",
250
+ "Declared on other types; traverse them with direction `incoming`.",
251
+ "",
252
+ table(["From", "Link", "Cardinality", "Description"], incoming),
253
+ ].join("\n")
254
+ }
255
+
256
+ function renderActions(
257
+ actions: readonly ActionDescriptor[],
258
+ valueTypesById: ReadonlyMap<string, ValueType>
259
+ ): string | undefined {
260
+ if (actions.length === 0) return undefined
261
+ return [
262
+ "## Actions",
263
+ ...[...actions]
264
+ .sort((left, right) => left.id.localeCompare(right.id))
265
+ .map((action) => {
266
+ const params = Object.entries(action.params)
267
+ return [
268
+ `### ${code(action.id)}`,
269
+ ...(action.description?.trim() ? [action.description.trim()] : []),
270
+ params.length === 0
271
+ ? "No parameters."
272
+ : table(
273
+ ["Param", "Type", "Required", "Description"],
274
+ params.map(([id, param]) => [
275
+ code(id),
276
+ paramTypeLabel(param, valueTypesById),
277
+ param.required ? "yes" : "no",
278
+ param.description ?? "",
279
+ ])
280
+ ),
281
+ ].join("\n\n")
282
+ }),
283
+ ].join("\n\n")
284
+ }
285
+
286
+ function renderNotes(notes: readonly OntologyDoc[]): string | undefined {
287
+ const contents = notes.map((note) => note.contents.trim()).filter(Boolean)
288
+ return contents.length === 0 ? undefined : `## Project notes\n\n${contents.join("\n\n")}`
289
+ }
290
+
291
+ function paramTypeLabel(
292
+ param: ActionParamDescriptor,
293
+ valueTypesById: ReadonlyMap<string, ValueType>
294
+ ): string {
295
+ return withFlags(schemaLabel(param.schema, valueTypesById), param.nullable ? ["nullable"] : [])
296
+ }
297
+
298
+ function withFlags(label: string, flags: readonly string[]): string {
299
+ return flags.length === 0 ? label : `${label} (${flags.join(", ")})`
300
+ }
301
+
302
+ type DescribedSchema = ActionParamDescriptor["schema"]
303
+
304
+ function schemaLabel(
305
+ schema: DescribedSchema,
306
+ valueTypesById: ReadonlyMap<string, ValueType>,
307
+ seen: ReadonlySet<string> = new Set()
308
+ ): string {
309
+ if (typeof schema === "string") return schema
310
+ switch (schema.type) {
311
+ case "enum":
312
+ return `one of ${schema.values.map((value) => code(String(value))).join(", ")}`
313
+ case "array":
314
+ return `array of ${schemaLabel(schema.items, valueTypesById, seen)}`
315
+ case "map":
316
+ return `map of string to ${schemaLabel(schema.valueSchema, valueTypesById, seen)}`
317
+ case "object":
318
+ return `object { ${Object.entries(schema.properties)
319
+ .map(
320
+ ([id, field]) =>
321
+ `${id}${field.required ? "" : "?"}: ${schemaLabel(field.schema, valueTypesById, seen)}`
322
+ )
323
+ .join(", ")} }`
324
+ case "objectRef":
325
+ return `reference to ${code(schema.objectTypeId)}`
326
+ case "valueTypeRef": {
327
+ const resolved = valueTypesById.get(schema.valueTypeId)?.schema
328
+ if (resolved === undefined || seen.has(schema.valueTypeId)) return schema.valueTypeId
329
+ const nested = new Set(seen).add(schema.valueTypeId)
330
+ return `${schema.valueTypeId} (${schemaLabel(resolved, valueTypesById, nested)})`
331
+ }
332
+ }
333
+ }
334
+
335
+ function linkTargets(link: ObjectLink): readonly string[] {
336
+ // A link to any type (`*`) is not about this one; it has no incoming entry.
337
+ return (
338
+ Array.isArray(link.targetObjectTypeId) ? link.targetObjectTypeId : [link.targetObjectTypeId]
339
+ ).filter((targetId) => targetId !== "*")
340
+ }
341
+
342
+ function scriptsDirectoryOf(path: string): string {
343
+ const segments = path.split("/")
344
+ return `${segments.slice(0, segments.indexOf("scripts") + 1).join("/")}/`
345
+ }
346
+
347
+ function typeSummary(objectType: ObjectType): string {
348
+ const description = firstSentence(objectType.description)
349
+ if (description !== undefined) return `${objectType.id}: ${description}`
350
+ return objectType.name === objectType.id ? objectType.id : `${objectType.id}: ${objectType.name}`
351
+ }
352
+
353
+ function firstSentence(text: string | undefined): string | undefined {
354
+ const normalized = text?.replaceAll(/\s+/g, " ").trim()
355
+ if (!normalized) return undefined
356
+ for (const match of normalized.matchAll(/[.!?](?=\s|$)/g)) {
357
+ const sentence = normalized.slice(0, match.index + 1)
358
+ if (!ABBREVIATION_END_RE.test(sentence)) return truncate(sentence)
359
+ }
360
+ return truncate(normalized)
361
+ }
362
+
363
+ function firstHeading(markdown: string): string | undefined {
364
+ const heading = /^#{1,6}\s+(.+?)\s*#*\s*$/m.exec(markdown)?.[1]
365
+ return heading === undefined ? undefined : truncate(heading)
366
+ }
367
+
368
+ function truncate(text: string): string {
369
+ return text.length <= MAX_SUMMARY_LENGTH ? text : `${text.slice(0, MAX_SUMMARY_LENGTH - 1)}…`
370
+ }
371
+
372
+ function table(headers: readonly string[], rows: readonly (readonly string[])[]): string {
373
+ return [
374
+ `| ${headers.join(" | ")} |`,
375
+ `| ${headers.map(() => "---").join(" | ")} |`,
376
+ ...rows.map((row) => `| ${row.map(cell).join(" | ")} |`),
377
+ ].join("\n")
378
+ }
379
+
380
+ function cell(text: string): string {
381
+ return oneLine(text).replaceAll("|", "\\|")
382
+ }
383
+
384
+ function oneLine(text: string): string {
385
+ return text.replaceAll(/\s+/g, " ").trim()
386
+ }
387
+
388
+ function code(text: string): string {
389
+ return `\`${text}\``
390
+ }
391
+
392
+ function byPath(left: { readonly path: string }, right: { readonly path: string }): number {
393
+ return left.path < right.path ? -1 : left.path > right.path ? 1 : 0
394
+ }
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Where each object type's Agent reference doc lives, and which hand-written docs and scripts are
3
+ * mounted next to it.
4
+ *
5
+ * The generated doc of a type mirrors the `ontology/` module that defines it:
6
+ * `billing/invoice.ts` → `billing/invoice.md`. A module that defines several types gets a folder,
7
+ * one doc per type: `billing.ts` → `billing/Invoice.md`, `billing/Customer.md`.
8
+ *
9
+ * Hand-written docs are notes when they sit at a type's doc path or next to a module exporting the
10
+ * type (`billing.md` for every type of `billing.ts`), compared without case. Notes are appended to
11
+ * the doc of each visible type they belong to, so a reader never receives the notes of types it
12
+ * cannot see. Any other hand-written doc is mounted as written, for every reader.
13
+ */
14
+
15
+ import type { AgentProjectFile } from "../agents/skills"
16
+ import { RuntimeError } from "../runtime/errors"
17
+ import type { ObjectType } from "./types"
18
+
19
+ /** Hand-written Markdown under `ontology/`. */
20
+ export interface OntologyDoc {
21
+ /** POSIX path relative to `ontology/`. */
22
+ readonly path: string
23
+ readonly contents: string
24
+ }
25
+
26
+ /** The Agent's files under `ontology/`, as createSixb() discovers them. */
27
+ export interface OntologyDocsInput {
28
+ /** Each module, by POSIX path relative to `ontology/`, with the object types it exports. */
29
+ readonly modules: readonly { readonly path: string; readonly objectTypeIds: readonly string[] }[]
30
+ readonly docs: readonly OntologyDoc[]
31
+ /** Every file in a `scripts/` directory under `ontology/`, mounted as written. */
32
+ readonly scripts: readonly AgentProjectFile[]
33
+ }
34
+
35
+ /** Paths are POSIX and relative to `ontology/`. */
36
+ export interface OntologyDocsCatalog {
37
+ /** Path of the doc generated for this object type. */
38
+ docPathFor(objectTypeId: string): string
39
+ /** The team's notes for this type, appended to its doc. Sorted by path. */
40
+ notesFor(objectTypeId: string): readonly OntologyDoc[]
41
+ /** Hand-written docs that belong to no object type, mounted for every reader. */
42
+ listDocs(): readonly OntologyDoc[]
43
+ listScripts(): readonly AgentProjectFile[]
44
+ /** Whether a link declares any type (`*`) as its target. Readers' views expand it. */
45
+ isWildcardLink(objectTypeId: string, linkId: string): boolean
46
+ }
47
+
48
+ /** Resolve every registered object type's doc path, rejecting two files that would share one. */
49
+ export function createOntologyDocsCatalog(input: {
50
+ readonly objectTypes: readonly ObjectType[]
51
+ readonly docs?: OntologyDocsInput
52
+ }): OntologyDocsCatalog {
53
+ const modules = input.docs?.modules ?? []
54
+ const scripts = Object.freeze([...(input.docs?.scripts ?? [])])
55
+ // Sandboxes may sit on a case-insensitive filesystem, where `Invoice.md` overwrites `invoice.md`.
56
+ const claimedPaths = new Map<string, string>(
57
+ scripts.map((script) => [script.path.toLowerCase(), `script 'ontology/${script.path}'`])
58
+ )
59
+ const claim = (path: string, owner: string) => {
60
+ const claimedBy = claimedPaths.get(path.toLowerCase())
61
+ if (claimedBy !== undefined) {
62
+ throw new RuntimeError(
63
+ `[Sixb] The ${owner} at 'ontology/${path}' collides with ${claimedBy}, which only differs ` +
64
+ "by case or not at all. Rename one of them."
65
+ )
66
+ }
67
+ claimedPaths.set(path.toLowerCase(), `the ${owner}`)
68
+ }
69
+
70
+ const docPathByType = new Map<string, string>()
71
+ // A hand-written doc at a type's doc path, or next to any module that exports the type, is
72
+ // notes for that type. Several types share the notes of a module that exports all of them.
73
+ const typeIdsByNotesPath = new Map<string, Set<string>>()
74
+ const addNotesPath = (path: string, objectTypeIds: readonly string[]) => {
75
+ const typeIds = typeIdsByNotesPath.get(path.toLowerCase()) ?? new Set<string>()
76
+ for (const objectTypeId of objectTypeIds) typeIds.add(objectTypeId)
77
+ typeIdsByNotesPath.set(path.toLowerCase(), typeIds)
78
+ }
79
+ for (const objectType of input.objectTypes) {
80
+ const path = docPathFor(objectType.id, modules)
81
+ claim(path, `doc of object type '${objectType.id}'`)
82
+ docPathByType.set(objectType.id, path)
83
+ addNotesPath(path, [objectType.id])
84
+ }
85
+ for (const module of modules) {
86
+ if (module.objectTypeIds.length > 0) {
87
+ addNotesPath(`${withoutExtension(module.path)}.md`, module.objectTypeIds)
88
+ }
89
+ }
90
+
91
+ const notesByType = new Map<string, OntologyDoc[]>()
92
+ const docs: OntologyDoc[] = []
93
+ const docPaths = new Map<string, string>()
94
+ for (const doc of input.docs?.docs ?? []) {
95
+ const sameName = docPaths.get(doc.path.toLowerCase())
96
+ if (sameName !== undefined) {
97
+ throw new RuntimeError(
98
+ `[Sixb] The ontology docs 'ontology/${sameName}' and 'ontology/${doc.path}' only differ ` +
99
+ "by case. Rename one of them."
100
+ )
101
+ }
102
+ docPaths.set(doc.path.toLowerCase(), doc.path)
103
+
104
+ const objectTypeIds = typeIdsByNotesPath.get(doc.path.toLowerCase())
105
+ if (objectTypeIds === undefined) {
106
+ docs.push(doc)
107
+ continue
108
+ }
109
+ for (const objectTypeId of objectTypeIds) {
110
+ notesByType.set(objectTypeId, [...(notesByType.get(objectTypeId) ?? []), doc])
111
+ }
112
+ }
113
+ for (const notes of notesByType.values()) notes.sort(byPath)
114
+ Object.freeze(docs)
115
+
116
+ const wildcardLinks = new Set(
117
+ input.objectTypes.flatMap((objectType) =>
118
+ objectType.links
119
+ .filter((link) => link.targetObjectTypeId === "*")
120
+ .map((link) => linkKey(objectType.id, link.id))
121
+ )
122
+ )
123
+
124
+ return Object.freeze({
125
+ docPathFor: (objectTypeId: string) => {
126
+ const path = docPathByType.get(objectTypeId)
127
+ if (path === undefined) {
128
+ throw new RuntimeError(`[Sixb] Object type '${objectTypeId}' is not registered.`)
129
+ }
130
+ return path
131
+ },
132
+ notesFor: (objectTypeId: string) => notesByType.get(objectTypeId) ?? [],
133
+ listDocs: () => docs,
134
+ listScripts: () => scripts,
135
+ isWildcardLink: (objectTypeId: string, linkId: string) =>
136
+ wildcardLinks.has(linkKey(objectTypeId, linkId)),
137
+ })
138
+ }
139
+
140
+ /**
141
+ * The module that defines a type, among those exporting it: the one named after the type
142
+ * (`email-thread.ts` for `EmailThread`), else any module but an `index`, else the one exporting the
143
+ * fewest types, else the first by path. Re-exporting barrels never take a type from its module.
144
+ */
145
+ function docPathFor(objectTypeId: string, modules: OntologyDocsInput["modules"]): string {
146
+ const rank = (module: OntologyDocsInput["modules"][number]) => {
147
+ const name = basename(withoutExtension(module.path))
148
+ return [
149
+ kebabCase(name) === kebabCase(objectTypeId) ? 0 : 1,
150
+ name === "index" ? 1 : 0,
151
+ module.objectTypeIds.length,
152
+ ]
153
+ }
154
+ let owner: OntologyDocsInput["modules"][number] | undefined
155
+ for (const module of modules) {
156
+ if (!module.objectTypeIds.includes(objectTypeId)) continue
157
+ if (owner === undefined || compareRanks(rank(module), rank(owner)) < 0) owner = module
158
+ }
159
+
160
+ const fileName = `${objectTypeId.replaceAll(/[^A-Za-z0-9._-]/g, "_")}.md`
161
+ if (owner === undefined) return fileName
162
+ const base = withoutExtension(owner.path)
163
+ return owner.objectTypeIds.length === 1 ? `${base}.md` : `${base}/${fileName}`
164
+ }
165
+
166
+ function compareRanks(left: readonly number[], right: readonly number[]): number {
167
+ for (const [index, value] of left.entries()) {
168
+ const difference = value - (right[index] ?? 0)
169
+ if (difference !== 0) return difference
170
+ }
171
+ return 0
172
+ }
173
+
174
+ function kebabCase(name: string): string {
175
+ return name
176
+ .replaceAll(/([a-z0-9])([A-Z])/g, "$1-$2")
177
+ .replaceAll(/([A-Z]+)([A-Z][a-z])/g, "$1-$2")
178
+ .replaceAll(/[\s_]+/g, "-")
179
+ .toLowerCase()
180
+ }
181
+
182
+ function withoutExtension(path: string): string {
183
+ return path.replace(/\.[^./]+$/, "")
184
+ }
185
+
186
+ function basename(path: string): string {
187
+ return path.slice(path.lastIndexOf("/") + 1)
188
+ }
189
+
190
+ function linkKey(objectTypeId: string, linkId: string): string {
191
+ return JSON.stringify([objectTypeId, linkId])
192
+ }
193
+
194
+ function byPath(left: OntologyDoc, right: OntologyDoc): number {
195
+ return left.path < right.path ? -1 : left.path > right.path ? 1 : 0
196
+ }
@@ -211,6 +211,31 @@ export type InferObjectProperties<
211
211
  }
212
212
  >
213
213
 
214
+ /**
215
+ * Property values as a principal reads them. A marked property may be redacted, so it is optional
216
+ * even when required; writes keep {@link InferObjectProperties}.
217
+ */
218
+ export type InferObjectReadProperties<
219
+ TObjectType extends { properties: readonly Property[] },
220
+ TValueTypes extends readonly ValueType[] = RegisteredValueTypes,
221
+ > = string extends TObjectType["properties"][number]["id"]
222
+ ? Record<string, unknown>
223
+ : Simplify<
224
+ {
225
+ [TProp in TObjectType["properties"][number] as TProp extends { required: true }
226
+ ? TProp extends { markings: readonly string[] }
227
+ ? never
228
+ : TProp["id"]
229
+ : never]: InferPropertyValue<TProp, TValueTypes>
230
+ } & {
231
+ [TProp in TObjectType["properties"][number] as TProp extends { required: true }
232
+ ? TProp extends { markings: readonly string[] }
233
+ ? TProp["id"]
234
+ : never
235
+ : TProp["id"]]?: InferPropertyValue<TProp, TValueTypes>
236
+ }
237
+ >
238
+
214
239
  /** Useful for APIs that should only accept telemetry-mode properties. */
215
240
  export type InferTelemetryPropertyIds<TObjectType extends { properties: readonly Property[] }> =
216
241
  Extract<TObjectType["properties"][number], { mode: "telemetry" }>["id"]
@@ -1,3 +1,9 @@
1
+ export type {
2
+ OntologyDocsIndexEntry,
3
+ RenderedOntologyDocs,
4
+ RenderOntologyDocsInput,
5
+ } from "./docs-markdown"
6
+ export { renderOntologyDocs } from "./docs-markdown"
1
7
  export { schemaFieldsToJsonSchema, schemaRecordToJsonSchema } from "./json-schema"
2
8
  export { resolvePropertyQueryCapabilities } from "./query-capabilities"
3
9
  export { validateSchemaOrRefValue } from "./refs"
@@ -26,6 +32,7 @@ export {
26
32
  } from "./validation/properties"
27
33
  export { validateQueryMetadata } from "./validation/query"
28
34
  export {
35
+ assertValidFileRefs,
29
36
  isRecord,
30
37
  resolveValueTypeRef,
31
38
  resolveValueTypeSchema,
@@ -1,4 +1,4 @@
1
- import type { InferObjectProperties } from "./inference"
1
+ import type { InferObjectProperties, InferObjectReadProperties } from "./inference"
2
2
  import {
3
3
  createLinkPathSelection,
4
4
  type LinkPathSelectionBuilder,
@@ -75,7 +75,10 @@ export type ObjectTypeWithPropertyTokens<TObjectType extends ObjectType = Object
75
75
  */
76
76
  export type ObjectPropertiesMetadata<TObjectType extends ObjectType> = {
77
77
  readonly [objectPropertiesBrand]?: string extends TObjectType["id"]
78
- ? { readonly properties: Record<string, unknown> }
78
+ ? {
79
+ readonly properties: Record<string, unknown>
80
+ readonly readProperties: Record<string, unknown>
81
+ }
79
82
  : ObjectPropertiesCarrier<TObjectType>
80
83
  }
81
84
 
@@ -91,6 +94,7 @@ export type ObjectPropertiesMetadata<TObjectType extends ObjectType> = {
91
94
  */
92
95
  interface ObjectPropertiesCarrier<in out TObjectType extends ObjectType> {
93
96
  readonly properties: InferObjectProperties<TObjectType>
97
+ readonly readProperties: InferObjectReadProperties<TObjectType>
94
98
  }
95
99
 
96
100
  /**
@@ -103,6 +107,13 @@ export type ObjectTypeProperties<TObjectType extends ObjectTypeWithPropertyToken
103
107
  TObjectType[typeof objectPropertiesBrand]
104
108
  >["properties"]
105
109
 
110
+ /**
111
+ * The property values of an object type as a read returns them: a marked property is optional,
112
+ * because a reader without clearance receives it redacted.
113
+ */
114
+ export type ObjectTypeReadProperties<TObjectType extends ObjectTypeWithPropertyTokens> =
115
+ NonNullable<TObjectType[typeof objectPropertiesBrand]>["readProperties"]
116
+
106
117
  /**
107
118
  * Object type with property tokens (`p.*`) and link tokens (`l.*`).
108
119
  *
@@ -284,6 +284,11 @@ export interface Property {
284
284
  semanticType?: QuantitativeTypeId
285
285
  /** Query/indexing metadata for this property. */
286
286
  query?: PropertyQueryMetadata
287
+ /**
288
+ * Marking ids. A principal receives this property only when its roles clear every marking;
289
+ * otherwise the value is omitted and listed in the object's `redactions`.
290
+ */
291
+ markings?: readonly string[]
287
292
  }
288
293
 
289
294
  /**