@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.
- package/dist/actions/index.js +22 -19
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/read-facade.d.ts +1 -1
- package/dist/actions/validation.d.ts.map +1 -1
- package/dist/actions/worker.js +6 -2
- package/dist/actions/worker.js.map +3 -3
- package/dist/agents/adapters.d.ts +7 -0
- package/dist/agents/adapters.d.ts.map +1 -1
- package/dist/agents/authority.d.ts +7 -0
- package/dist/agents/authority.d.ts.map +1 -1
- package/dist/agents/context/entries.d.ts +10 -1
- package/dist/agents/context/entries.d.ts.map +1 -1
- package/dist/agents/context/index.d.ts +1 -1
- package/dist/agents/context/index.d.ts.map +1 -1
- package/dist/agents/context/index.js +4 -2
- package/dist/agents/context/index.js.map +1 -1
- package/dist/agents/context-compaction.d.ts.map +1 -1
- package/dist/agents/errors.d.ts +1 -1
- package/dist/agents/errors.d.ts.map +1 -1
- package/dist/agents/index.d.ts +6 -4
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +44 -37
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/message.d.ts +8 -1
- package/dist/agents/message.d.ts.map +1 -1
- package/dist/agents/request.d.ts +19 -5
- package/dist/agents/request.d.ts.map +1 -1
- package/dist/agents/skills.d.ts +41 -0
- package/dist/agents/skills.d.ts.map +1 -0
- package/dist/agents/streams/index.js +1 -1
- package/dist/agents/streams/internal.js +1 -1
- package/dist/agents/types.d.ts +33 -4
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/auth/index.js +9 -6
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/runtime.d.ts.map +1 -1
- package/dist/auth/types.d.ts +6 -0
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/authorization/index.js +5 -3
- package/dist/authorization/index.js.map +1 -1
- package/dist/authorization/resolve.d.ts +1 -1
- package/dist/authorization/resolve.d.ts.map +1 -1
- package/dist/authorization/types.d.ts +7 -0
- package/dist/authorization/types.d.ts.map +1 -1
- package/dist/blob-storage/browser.js +1 -1
- package/dist/blob-storage/execution.d.ts.map +1 -1
- package/dist/blob-storage/file-content.d.ts +18 -0
- package/dist/blob-storage/file-content.d.ts.map +1 -0
- package/dist/blob-storage/index.d.ts +1 -1
- package/dist/blob-storage/index.d.ts.map +1 -1
- package/dist/blob-storage/index.js +2 -2
- package/dist/blob-storage/internal.d.ts +2 -0
- package/dist/blob-storage/internal.d.ts.map +1 -1
- package/dist/blob-storage/internal.js +16 -4
- package/dist/blob-storage/internal.js.map +1 -1
- package/dist/blob-storage/media-type.d.ts +8 -0
- package/dist/blob-storage/media-type.d.ts.map +1 -0
- package/dist/blob-storage/types.d.ts +12 -1
- package/dist/blob-storage/types.d.ts.map +1 -1
- package/dist/blob-storage/validation.d.ts +6 -0
- package/dist/blob-storage/validation.d.ts.map +1 -1
- package/dist/bootstrap/agent-context.d.ts +33 -0
- package/dist/bootstrap/agent-context.d.ts.map +1 -0
- package/dist/bootstrap/discovery.d.ts +23 -3
- package/dist/bootstrap/discovery.d.ts.map +1 -1
- package/dist/bootstrap/index.d.ts +2 -1
- package/dist/bootstrap/index.d.ts.map +1 -1
- package/dist/bootstrap/index.js +284 -73
- package/dist/bootstrap/index.js.map +4 -3
- package/dist/bootstrap/ontology-type-manifest.d.ts.map +1 -1
- package/dist/{chunk-gf7yht60.js → chunk-1b1f2d5f.js} +23 -6
- package/dist/chunk-1b1f2d5f.js.map +12 -0
- package/dist/{chunk-9vx5e9g1.js → chunk-1sr8ryzk.js} +3 -3
- package/dist/chunk-1sr8ryzk.js.map +11 -0
- package/dist/{chunk-4gmng3vf.js → chunk-22v5bpz3.js} +1 -1
- package/dist/{chunk-s7ftxrdr.js → chunk-29yx306f.js} +20 -3
- package/dist/{chunk-s7ftxrdr.js.map → chunk-29yx306f.js.map} +3 -3
- package/dist/{chunk-4ra628t7.js → chunk-3zxk45er.js} +70 -6
- package/dist/{chunk-4ra628t7.js.map → chunk-3zxk45er.js.map} +5 -4
- package/dist/{chunk-2am3db31.js → chunk-48e3cn2d.js} +2 -2
- package/dist/{chunk-91kcnbf0.js → chunk-6gmfggss.js} +22 -9
- package/dist/chunk-6gmfggss.js.map +10 -0
- package/dist/{chunk-svabwqdq.js → chunk-6h5m9xjx.js} +43 -415
- package/dist/{chunk-svabwqdq.js.map → chunk-6h5m9xjx.js.map} +7 -11
- package/dist/{chunk-f1xh7a32.js → chunk-7hpdd6r9.js} +2 -2
- package/dist/{chunk-xyvy73tj.js → chunk-bs7sqkre.js} +8 -3
- package/dist/chunk-bs7sqkre.js.map +12 -0
- package/dist/{chunk-rb143ggb.js → chunk-bwjcehza.js} +1 -1
- package/dist/{chunk-t9shqx3w.js → chunk-d0eb5yy6.js} +143 -7
- package/dist/chunk-d0eb5yy6.js.map +14 -0
- package/dist/{chunk-vp3z1ckh.js → chunk-de4z2bj6.js} +5 -5
- package/dist/{chunk-3rrezgyc.js → chunk-dnmadg9k.js} +2 -2
- package/dist/chunk-enpsx8k5.js +127 -0
- package/dist/chunk-enpsx8k5.js.map +10 -0
- package/dist/{chunk-a7er86jd.js → chunk-ex496vct.js} +1 -1
- package/dist/{chunk-jnfxmr3f.js → chunk-f1zxad2t.js} +1 -1
- package/dist/{chunk-6wbm6ymz.js → chunk-fe52eczz.js} +271 -83
- package/dist/chunk-fe52eczz.js.map +49 -0
- package/dist/{chunk-10styjgk.js → chunk-fx93hd2n.js} +71 -29
- package/dist/chunk-fx93hd2n.js.map +20 -0
- package/dist/{chunk-9se093qz.js → chunk-gc4ntf7d.js} +4 -4
- package/dist/{chunk-9se093qz.js.map → chunk-gc4ntf7d.js.map} +1 -1
- package/dist/{chunk-98cw09sw.js → chunk-hkc3jct7.js} +4 -2
- package/dist/chunk-hkc3jct7.js.map +10 -0
- package/dist/{chunk-pja9jfz6.js → chunk-htr6wjmv.js} +115 -53
- package/dist/chunk-htr6wjmv.js.map +19 -0
- package/dist/{chunk-h3v76ams.js → chunk-jhm3zsa7.js} +25 -2
- package/dist/chunk-jhm3zsa7.js.map +12 -0
- package/dist/{chunk-52c5zb0z.js → chunk-k6hrnf35.js} +5 -5
- package/dist/chunk-k6hrnf35.js.map +10 -0
- package/dist/{chunk-c2rga5cx.js → chunk-mfs23znk.js} +1 -1
- package/dist/{chunk-7ecp4v7a.js → chunk-ny3xyvcn.js} +8 -2
- package/dist/{chunk-7ecp4v7a.js.map → chunk-ny3xyvcn.js.map} +3 -3
- package/dist/{chunk-fggq3d9k.js → chunk-p0dqwj3n.js} +5 -5
- package/dist/{chunk-cnb5kv05.js → chunk-p844e0rn.js} +23 -8
- package/dist/chunk-p844e0rn.js.map +19 -0
- package/dist/{chunk-dmn70ztd.js → chunk-pfp1txq2.js} +25 -6
- package/dist/chunk-pfp1txq2.js.map +11 -0
- package/dist/chunk-pqajwytd.js.map +2 -2
- package/dist/{chunk-5be2ath4.js → chunk-qkbx3tf6.js} +17 -128
- package/dist/{chunk-5be2ath4.js.map → chunk-qkbx3tf6.js.map} +6 -7
- package/dist/{chunk-sk0hcjsz.js → chunk-qkvz64nd.js} +2 -2
- package/dist/{chunk-w9yycd3t.js → chunk-qmnnhde6.js} +4 -8
- package/dist/{chunk-w9yycd3t.js.map → chunk-qmnnhde6.js.map} +3 -3
- package/dist/{chunk-5yd8cchh.js → chunk-qq90g05n.js} +8 -8
- package/dist/{chunk-5yd8cchh.js.map → chunk-qq90g05n.js.map} +1 -1
- package/dist/{chunk-tjjgy3z4.js → chunk-qxvp5epv.js} +66 -14
- package/dist/{chunk-tjjgy3z4.js.map → chunk-qxvp5epv.js.map} +9 -8
- package/dist/chunk-rdghfsss.js.map +2 -2
- package/dist/{chunk-rx7h5fdx.js → chunk-rt9p8m9t.js} +1 -1
- package/dist/{chunk-cd234ba4.js → chunk-rz53yb4v.js} +10 -5
- package/dist/chunk-rz53yb4v.js.map +14 -0
- package/dist/{chunk-xcy5ddha.js → chunk-s4jhg8a3.js} +351 -296
- package/dist/chunk-s4jhg8a3.js.map +15 -0
- package/dist/{chunk-69266efg.js → chunk-s54c868q.js} +12 -4
- package/dist/chunk-s54c868q.js.map +12 -0
- package/dist/{chunk-9g6jz9kk.js → chunk-tffvfy6s.js} +6 -5
- package/dist/{chunk-9g6jz9kk.js.map → chunk-tffvfy6s.js.map} +3 -3
- package/dist/{chunk-e67ynxcr.js → chunk-v6xpd60t.js} +3 -3
- package/dist/{chunk-jjrn5v0p.js → chunk-vgk3hknm.js} +1 -1
- package/dist/{chunk-5thzcb8g.js → chunk-vx2yp45y.js} +2 -2
- package/dist/{chunk-dam456ve.js → chunk-vz3gc1tm.js} +394 -31
- package/dist/{chunk-dam456ve.js.map → chunk-vz3gc1tm.js.map} +10 -7
- package/dist/chunk-xt1zt7gv.js +471 -0
- package/dist/chunk-xt1zt7gv.js.map +13 -0
- package/dist/{chunk-rpxz486p.js → chunk-y05543x6.js} +21 -5
- package/dist/{chunk-rpxz486p.js.map → chunk-y05543x6.js.map} +3 -3
- package/dist/{chunk-aq39q04r.js → chunk-y9jmd7e5.js} +4 -4
- package/dist/{chunk-aq39q04r.js.map → chunk-y9jmd7e5.js.map} +1 -1
- package/dist/{chunk-k4g51s47.js → chunk-yv9czyfr.js} +3 -3
- package/dist/{chunk-z5rnrmz1.js → chunk-yw9pyg66.js} +5 -3
- package/dist/chunk-yw9pyg66.js.map +11 -0
- package/dist/{chunk-vre348sb.js → chunk-za5yd58j.js} +2 -2
- package/dist/{chunk-23xs4qp9.js → chunk-zb77kjth.js} +3 -3
- package/dist/{chunk-33saed7g.js → chunk-zxawp1n2.js} +1 -1
- package/dist/datasets/builders.d.ts +12 -1
- package/dist/datasets/builders.d.ts.map +1 -1
- package/dist/datasets/execution.d.ts +27 -1
- package/dist/datasets/execution.d.ts.map +1 -1
- package/dist/datasets/index.d.ts +1 -1
- package/dist/datasets/index.d.ts.map +1 -1
- package/dist/datasets/types.d.ts +2 -0
- package/dist/datasets/types.d.ts.map +1 -1
- package/dist/datasets/write.d.ts +5 -0
- package/dist/datasets/write.d.ts.map +1 -1
- package/dist/datasets/write.js +10 -5
- package/dist/datasets/write.js.map +1 -1
- package/dist/edits/properties.d.ts.map +1 -1
- package/dist/events/execution.d.ts +2 -1
- package/dist/events/execution.d.ts.map +1 -1
- package/dist/events/types/objects.d.ts +5 -0
- package/dist/events/types/objects.d.ts.map +1 -1
- package/dist/execution/agent.d.ts +10 -0
- package/dist/execution/agent.d.ts.map +1 -1
- package/dist/execution/agent.js +39 -34
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/authorized-object-reader.d.ts +6 -1
- package/dist/execution/authorized-object-reader.d.ts.map +1 -1
- package/dist/execution/primitive.js +37 -34
- package/dist/execution/primitive.js.map +2 -2
- package/dist/execution/request.js +38 -35
- package/dist/execution/request.js.map +2 -2
- package/dist/http/api-routes.d.ts.map +1 -1
- package/dist/http/index.js +1 -1
- package/dist/index.d.ts +9 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +57 -52
- package/dist/index.js.map +1 -1
- package/dist/lake-storage/index.js +8 -5
- package/dist/lake-storage/index.js.map +1 -1
- package/dist/materializer/index.js +19 -16
- package/dist/materializer/index.js.map +1 -1
- package/dist/models/catalog.d.ts +1 -1
- package/dist/models/catalog.d.ts.map +1 -1
- package/dist/models/execution/binding.d.ts +6 -0
- package/dist/models/execution/binding.d.ts.map +1 -1
- package/dist/models/execution/index.js +19 -16
- package/dist/models/execution/index.js.map +1 -1
- package/dist/models/execution/model-call-recorder.d.ts +4 -0
- package/dist/models/execution/model-call-recorder.d.ts.map +1 -1
- package/dist/models/execution.d.ts.map +1 -1
- package/dist/models/index.js +1 -1
- package/dist/models/language-model.d.ts +6 -0
- package/dist/models/language-model.d.ts.map +1 -1
- package/dist/objects/context/index.d.ts +1 -1
- package/dist/objects/context/index.d.ts.map +1 -1
- package/dist/objects/context/types.d.ts +6 -0
- package/dist/objects/context/types.d.ts.map +1 -1
- package/dist/objects/execution.d.ts +2 -1
- package/dist/objects/execution.d.ts.map +1 -1
- package/dist/objects/index.js +23 -19
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/materializer-adapter.d.ts.map +1 -1
- package/dist/objects/object/upsert-batch.d.ts.map +1 -1
- package/dist/objects/object/upsert.d.ts.map +1 -1
- package/dist/objects/property-clearance.d.ts +41 -0
- package/dist/objects/property-clearance.d.ts.map +1 -0
- package/dist/objects/query/executor.d.ts +3 -0
- package/dist/objects/query/executor.d.ts.map +1 -1
- package/dist/objects/query/index.js +18 -15
- package/dist/objects/query/index.js.map +1 -1
- package/dist/objects/query/validate.d.ts +10 -1
- package/dist/objects/query/validate.d.ts.map +1 -1
- package/dist/objects/sdk/file-handle.d.ts +6 -0
- package/dist/objects/sdk/file-handle.d.ts.map +1 -0
- package/dist/objects/sdk/object-handle.d.ts +2 -2
- package/dist/objects/sdk/object-handle.d.ts.map +1 -1
- package/dist/objects/sdk/object-set.d.ts +2 -0
- package/dist/objects/sdk/object-set.d.ts.map +1 -1
- package/dist/ontology/builders.d.ts +12 -1
- package/dist/ontology/builders.d.ts.map +1 -1
- package/dist/ontology/docs-markdown.d.ts +35 -0
- package/dist/ontology/docs-markdown.d.ts.map +1 -0
- package/dist/ontology/docs.d.ts +50 -0
- package/dist/ontology/docs.d.ts.map +1 -0
- package/dist/ontology/index.js +7 -4
- package/dist/ontology/index.js.map +1 -1
- package/dist/ontology/inference/index.d.ts +19 -0
- package/dist/ontology/inference/index.d.ts.map +1 -1
- package/dist/ontology/internal.d.ts +3 -1
- package/dist/ontology/internal.d.ts.map +1 -1
- package/dist/ontology/internal.js +276 -3
- package/dist/ontology/internal.js.map +4 -3
- package/dist/ontology/tokens.d.ts +8 -1
- package/dist/ontology/tokens.d.ts.map +1 -1
- package/dist/ontology/types.d.ts +5 -0
- package/dist/ontology/types.d.ts.map +1 -1
- package/dist/ontology/validation/index.d.ts +1 -1
- package/dist/ontology/validation/index.d.ts.map +1 -1
- package/dist/ontology/validation/schema.d.ts +7 -0
- package/dist/ontology/validation/schema.d.ts.map +1 -1
- package/dist/pipelines/index.js +21 -18
- package/dist/pipelines/index.js.map +1 -1
- package/dist/projections/internal.js +19 -16
- package/dist/projections/internal.js.map +1 -1
- package/dist/runtime/create.d.ts +11 -2
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/definitions.d.ts +3 -1
- package/dist/runtime/definitions.d.ts.map +1 -1
- package/dist/runtime/host.d.ts +13 -2
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/internal.js +21 -18
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/locale.d.ts +9 -0
- package/dist/runtime/locale.d.ts.map +1 -0
- package/dist/runtime/resolve-definitions.d.ts +4 -2
- package/dist/runtime/resolve-definitions.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +30 -3
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/sandboxes/index.js +7 -6
- package/dist/sandboxes/index.js.map +1 -1
- package/dist/scheduler/index.js +1 -1
- package/dist/scheduler/runtime.d.ts +3 -0
- package/dist/scheduler/runtime.d.ts.map +1 -1
- package/dist/security/builders.d.ts +11 -2
- package/dist/security/builders.d.ts.map +1 -1
- package/dist/security/index.d.ts +4 -4
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/markings.d.ts +19 -0
- package/dist/security/markings.d.ts.map +1 -0
- package/dist/security/redactions.d.ts +4 -0
- package/dist/security/redactions.d.ts.map +1 -0
- package/dist/security/registry.d.ts +7 -1
- package/dist/security/registry.d.ts.map +1 -1
- package/dist/security/types.d.ts +25 -0
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/validation.d.ts +4 -1
- package/dist/security/validation.d.ts.map +1 -1
- package/dist/shares/internal.js +18 -15
- package/dist/shares/internal.js.map +2 -2
- package/dist/storage/agents/provider.d.ts.map +1 -1
- package/dist/storage/agents/provider.js +5 -4
- package/dist/storage/agents/provider.js.map +1 -1
- package/dist/storage/agents/types.d.ts +15 -9
- package/dist/storage/agents/types.d.ts.map +1 -1
- package/dist/storage/file-upload-sessions/provider.js +10 -7
- package/dist/storage/file-upload-sessions/provider.js.map +1 -1
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +18 -15
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/internal.js +4 -3
- package/dist/storage/internal.js.map +1 -1
- package/dist/storage/objects/types.d.ts +7 -0
- package/dist/storage/objects/types.d.ts.map +1 -1
- package/dist/storage/workflow-runs/provider.js +10 -7
- package/dist/storage/workflow-runs/provider.js.map +1 -1
- package/dist/syncs/index.js +22 -19
- package/dist/syncs/index.js.map +1 -1
- package/dist/testing/index.js +55 -53
- package/dist/testing/index.js.map +2 -2
- package/dist/webhooks/internal.js +19 -16
- package/dist/webhooks/internal.js.map +2 -2
- package/dist/workflows/builders.d.ts.map +1 -1
- package/dist/workflows/index.js +41 -38
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/request.d.ts.map +1 -1
- package/dist/workflows/types.d.ts +6 -3
- package/dist/workflows/types.d.ts.map +1 -1
- package/dist/workflows/validation.d.ts +2 -1
- package/dist/workflows/validation.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/actions/read-facade.ts +2 -1
- package/src/actions/validation.ts +4 -1
- package/src/agents/adapters.ts +15 -0
- package/src/agents/authority.ts +15 -0
- package/src/agents/context/entries.ts +48 -4
- package/src/agents/context/index.ts +1 -0
- package/src/agents/context-compaction.ts +6 -0
- package/src/agents/errors.ts +3 -0
- package/src/agents/index.ts +13 -1
- package/src/agents/message.ts +9 -0
- package/src/agents/request.ts +178 -22
- package/src/agents/skills.ts +63 -0
- package/src/agents/types.ts +35 -5
- package/src/auth/runtime.ts +14 -0
- package/src/auth/types.ts +6 -0
- package/src/authorization/resolve.ts +6 -1
- package/src/authorization/types.ts +7 -0
- package/src/blob-storage/execution.ts +12 -0
- package/src/blob-storage/file-content.ts +106 -0
- package/src/blob-storage/index.ts +1 -0
- package/src/blob-storage/internal.ts +7 -0
- package/src/blob-storage/media-type.ts +29 -0
- package/src/blob-storage/types.ts +13 -1
- package/src/blob-storage/validation.ts +13 -0
- package/src/bootstrap/agent-context.ts +356 -0
- package/src/bootstrap/discovery.ts +100 -33
- package/src/bootstrap/index.ts +1 -1
- package/src/bootstrap/ontology-type-manifest.ts +3 -38
- package/src/datasets/builders.ts +17 -1
- package/src/datasets/execution.ts +110 -2
- package/src/datasets/index.ts +7 -1
- package/src/datasets/types.ts +2 -0
- package/src/datasets/write.ts +21 -2
- package/src/edits/properties.ts +3 -0
- package/src/events/execution.ts +15 -16
- package/src/events/types/objects.ts +5 -0
- package/src/execution/agent.ts +27 -0
- package/src/execution/authorization.ts +1 -0
- package/src/execution/authorized-object-reader.ts +96 -34
- package/src/execution/scopes.ts +2 -6
- package/src/http/api-routes.ts +4 -3
- package/src/index.ts +27 -2
- package/src/models/catalog.ts +26 -2
- package/src/models/execution/README.md +4 -3
- package/src/models/execution/binding.ts +6 -0
- package/src/models/execution/model-call-recorder.ts +10 -0
- package/src/models/execution/session.ts +2 -2
- package/src/models/execution.ts +6 -2
- package/src/models/language-model.ts +6 -0
- package/src/objects/context/index.ts +1 -0
- package/src/objects/context/types.ts +7 -0
- package/src/objects/execution.ts +4 -1
- package/src/objects/materializer-adapter.ts +3 -0
- package/src/objects/object/upsert-batch.ts +4 -1
- package/src/objects/object/upsert.ts +3 -1
- package/src/objects/property-clearance.ts +209 -0
- package/src/objects/query/executor.ts +43 -36
- package/src/objects/query/validate.ts +133 -14
- package/src/objects/sdk/file-handle.ts +77 -0
- package/src/objects/sdk/object-handle.ts +8 -4
- package/src/objects/sdk/object-set.ts +5 -2
- package/src/ontology/builders.ts +18 -2
- package/src/ontology/docs-markdown.ts +394 -0
- package/src/ontology/docs.ts +196 -0
- package/src/ontology/inference/index.ts +25 -0
- package/src/ontology/internal.ts +7 -0
- package/src/ontology/tokens.ts +13 -2
- package/src/ontology/types.ts +5 -0
- package/src/ontology/validation/index.ts +1 -0
- package/src/ontology/validation/schema.ts +26 -1
- package/src/runtime/create.ts +34 -4
- package/src/runtime/definitions.ts +3 -1
- package/src/runtime/host.ts +45 -1
- package/src/runtime/index.ts +3 -0
- package/src/runtime/locale.ts +26 -0
- package/src/runtime/resolve-definitions.ts +28 -1
- package/src/runtime/sixb.ts +1 -1
- package/src/runtime/types.ts +39 -3
- package/src/scheduler/runtime.ts +11 -2
- package/src/security/builders.ts +49 -5
- package/src/security/index.ts +6 -1
- package/src/security/markings.ts +313 -0
- package/src/security/redactions.ts +6 -0
- package/src/security/registry.ts +21 -1
- package/src/security/types.ts +26 -0
- package/src/security/validation.ts +59 -2
- package/src/storage/agents/provider.ts +11 -0
- package/src/storage/agents/types.ts +15 -7
- package/src/storage/index.ts +1 -0
- package/src/storage/objects/types.ts +7 -0
- package/src/workflows/builders.ts +24 -1
- package/src/workflows/request.ts +3 -0
- package/src/workflows/types.ts +6 -3
- package/src/workflows/validation.ts +32 -4
- package/dist/chunk-10styjgk.js.map +0 -20
- package/dist/chunk-52c5zb0z.js.map +0 -10
- package/dist/chunk-69266efg.js.map +0 -12
- package/dist/chunk-6wbm6ymz.js.map +0 -48
- package/dist/chunk-91kcnbf0.js.map +0 -10
- package/dist/chunk-98cw09sw.js.map +0 -10
- package/dist/chunk-9vx5e9g1.js.map +0 -11
- package/dist/chunk-cd234ba4.js.map +0 -14
- package/dist/chunk-cnb5kv05.js.map +0 -19
- package/dist/chunk-dmn70ztd.js.map +0 -11
- package/dist/chunk-gf7yht60.js.map +0 -12
- package/dist/chunk-h3v76ams.js.map +0 -11
- package/dist/chunk-pja9jfz6.js.map +0 -19
- package/dist/chunk-t9shqx3w.js.map +0 -12
- package/dist/chunk-xcy5ddha.js.map +0 -15
- package/dist/chunk-xyvy73tj.js.map +0 -12
- package/dist/chunk-z5rnrmz1.js.map +0 -11
- /package/dist/{chunk-4gmng3vf.js.map → chunk-22v5bpz3.js.map} +0 -0
- /package/dist/{chunk-2am3db31.js.map → chunk-48e3cn2d.js.map} +0 -0
- /package/dist/{chunk-f1xh7a32.js.map → chunk-7hpdd6r9.js.map} +0 -0
- /package/dist/{chunk-rb143ggb.js.map → chunk-bwjcehza.js.map} +0 -0
- /package/dist/{chunk-vp3z1ckh.js.map → chunk-de4z2bj6.js.map} +0 -0
- /package/dist/{chunk-3rrezgyc.js.map → chunk-dnmadg9k.js.map} +0 -0
- /package/dist/{chunk-a7er86jd.js.map → chunk-ex496vct.js.map} +0 -0
- /package/dist/{chunk-jnfxmr3f.js.map → chunk-f1zxad2t.js.map} +0 -0
- /package/dist/{chunk-c2rga5cx.js.map → chunk-mfs23znk.js.map} +0 -0
- /package/dist/{chunk-fggq3d9k.js.map → chunk-p0dqwj3n.js.map} +0 -0
- /package/dist/{chunk-sk0hcjsz.js.map → chunk-qkvz64nd.js.map} +0 -0
- /package/dist/{chunk-rx7h5fdx.js.map → chunk-rt9p8m9t.js.map} +0 -0
- /package/dist/{chunk-e67ynxcr.js.map → chunk-v6xpd60t.js.map} +0 -0
- /package/dist/{chunk-jjrn5v0p.js.map → chunk-vgk3hknm.js.map} +0 -0
- /package/dist/{chunk-5thzcb8g.js.map → chunk-vx2yp45y.js.map} +0 -0
- /package/dist/{chunk-k4g51s47.js.map → chunk-yv9czyfr.js.map} +0 -0
- /package/dist/{chunk-vre348sb.js.map → chunk-za5yd58j.js.map} +0 -0
- /package/dist/{chunk-23xs4qp9.js.map → chunk-zb77kjth.js.map} +0 -0
- /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"]
|
package/src/ontology/internal.ts
CHANGED
|
@@ -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,
|
package/src/ontology/tokens.ts
CHANGED
|
@@ -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
|
-
? {
|
|
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
|
*
|
package/src/ontology/types.ts
CHANGED
|
@@ -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
|
/**
|