@agentshouse/mdmodel 0.1.0-c4f4d37bc9d6a → 0.1.0-c520180b7a33f

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 (101) hide show
  1. package/API.md +92 -88
  2. package/README.md +6 -4
  3. package/dist/definition.d.ts.map +1 -1
  4. package/dist/definition.js +58 -3
  5. package/dist/event.d.ts +78 -0
  6. package/dist/event.d.ts.map +1 -0
  7. package/dist/event.js +230 -0
  8. package/dist/index.d.ts +14 -4
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +8 -2
  11. package/dist/kinds.d.ts +19 -0
  12. package/dist/kinds.d.ts.map +1 -0
  13. package/dist/kinds.js +161 -0
  14. package/dist/query/language.d.ts +223 -0
  15. package/dist/query/language.d.ts.map +1 -0
  16. package/dist/query/language.js +565 -0
  17. package/dist/query/match.d.ts +14 -0
  18. package/dist/query/match.d.ts.map +1 -0
  19. package/dist/query/match.js +121 -0
  20. package/dist/query/rows.d.ts +32 -0
  21. package/dist/query/rows.d.ts.map +1 -0
  22. package/dist/query/rows.js +161 -0
  23. package/dist/query/sql.d.ts +39 -0
  24. package/dist/query/sql.d.ts.map +1 -0
  25. package/dist/query/sql.js +279 -0
  26. package/dist/reserved.d.ts +5 -0
  27. package/dist/reserved.d.ts.map +1 -0
  28. package/dist/reserved.js +20 -0
  29. package/dist/schema.d.ts +1 -0
  30. package/dist/schema.d.ts.map +1 -1
  31. package/dist/schema.js +51 -2
  32. package/dist/types.d.ts +8 -0
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/validate.d.ts +3 -2
  35. package/dist/validate.d.ts.map +1 -1
  36. package/dist/validate.js +102 -16
  37. package/dist/yaml.d.ts.map +1 -1
  38. package/dist/yaml.js +9 -2
  39. package/fixtures/README.md +21 -2
  40. package/fixtures/cases/conditional-section/context.json +1 -0
  41. package/fixtures/cases/conditional-section/expected.json +6 -0
  42. package/fixtures/cases/conditional-section/library/questions/hosting.md +9 -0
  43. package/fixtures/cases/conditional-section/library/questions/payments.md +12 -0
  44. package/fixtures/cases/conditional-section/schema.yaml +14 -0
  45. package/fixtures/cases/link-into-a-reserved-name/context.json +1 -0
  46. package/fixtures/cases/link-into-a-reserved-name/expected.json +5 -0
  47. package/fixtures/cases/link-into-a-reserved-name/library/notes/a.md +6 -0
  48. package/fixtures/cases/link-into-a-reserved-name/schema.yaml +3 -0
  49. package/fixtures/cases/link-into-a-reserved-name-from-an-untyped-document/context.json +1 -0
  50. package/fixtures/cases/link-into-a-reserved-name-from-an-untyped-document/expected.json +5 -0
  51. package/fixtures/cases/link-into-a-reserved-name-from-an-untyped-document/library/notes/b.md +5 -0
  52. package/fixtures/cases/member-on-an-untyped-document/context.json +1 -0
  53. package/fixtures/cases/member-on-an-untyped-document/expected.json +6 -0
  54. package/fixtures/cases/member-on-an-untyped-document/library/note.md +4 -0
  55. package/fixtures/cases/member-on-another-type/context.json +1 -0
  56. package/fixtures/cases/member-on-another-type/expected.json +6 -0
  57. package/fixtures/cases/member-on-another-type/library/note.md +4 -0
  58. package/fixtures/cases/member-on-another-type/schema.yaml +7 -0
  59. package/fixtures/cases/reference-into-a-reserved-name/context.json +1 -0
  60. package/fixtures/cases/reference-into-a-reserved-name/expected.json +6 -0
  61. package/fixtures/cases/reference-into-a-reserved-name/library/notes/a.md +4 -0
  62. package/fixtures/cases/reference-into-a-reserved-name/library/settings/brief.md +1 -0
  63. package/fixtures/cases/reference-into-a-reserved-name/schema.yaml +3 -0
  64. package/fixtures/cases/room-md-declares-a-type/context.json +1 -0
  65. package/fixtures/cases/room-md-declares-a-type/expected.json +6 -0
  66. package/fixtures/cases/room-md-declares-a-type/library/ROOM.md +5 -0
  67. package/fixtures/cases/typed-path-names-another-type/context.json +11 -0
  68. package/fixtures/cases/typed-path-names-another-type/expected.json +6 -0
  69. package/fixtures/cases/typed-path-names-another-type/library/settings/prefs/one.md +3 -0
  70. package/fixtures/cases/typed-path-names-another-type/schema.yaml +6 -0
  71. package/fixtures/cases/typed-path-names-its-type/context.json +11 -0
  72. package/fixtures/cases/typed-path-names-its-type/expected.json +3 -0
  73. package/fixtures/cases/typed-path-names-its-type/library/settings/prefs/deeper/two.md +1 -0
  74. package/fixtures/cases/typed-path-names-its-type/library/settings/prefs/one.md +4 -0
  75. package/fixtures/cases/typed-path-names-its-type/schema.yaml +6 -0
  76. package/fixtures/cases/typed-path-names-no-type/context.json +11 -0
  77. package/fixtures/cases/typed-path-names-no-type/expected.json +6 -0
  78. package/fixtures/cases/typed-path-names-no-type/library/settings/prefs/one.md +1 -0
  79. package/fixtures/cases/typed-path-names-no-type/schema.yaml +6 -0
  80. package/fixtures/cases/unnamed-typed-path-checks-its-fields/context.json +11 -0
  81. package/fixtures/cases/unnamed-typed-path-checks-its-fields/expected.json +6 -0
  82. package/fixtures/cases/unnamed-typed-path-checks-its-fields/library/rooms/team/tasks/plan.md +4 -0
  83. package/fixtures/cases/unnamed-typed-path-checks-its-fields/schema.yaml +5 -0
  84. package/fixtures/cases/unnamed-typed-path-names-a-type/context.json +11 -0
  85. package/fixtures/cases/unnamed-typed-path-names-a-type/expected.json +6 -0
  86. package/fixtures/cases/unnamed-typed-path-names-a-type/library/rooms/team/tasks/plan.md +6 -0
  87. package/fixtures/cases/unnamed-typed-path-names-a-type/schema.yaml +5 -0
  88. package/fixtures/cases/unnamed-typed-path-reads-its-type/context.json +11 -0
  89. package/fixtures/cases/unnamed-typed-path-reads-its-type/expected.json +3 -0
  90. package/fixtures/cases/unnamed-typed-path-reads-its-type/library/rooms/team/plan.md +1 -0
  91. package/fixtures/cases/unnamed-typed-path-reads-its-type/library/rooms/team/tasks/plan.md +5 -0
  92. package/fixtures/cases/unnamed-typed-path-reads-its-type/schema.yaml +5 -0
  93. package/fixtures/cases/unnamed-typed-path-without-a-body/context.json +11 -0
  94. package/fixtures/cases/unnamed-typed-path-without-a-body/expected.json +5 -0
  95. package/fixtures/cases/unnamed-typed-path-without-a-body/library/rooms/team/tasks/plan.md +5 -0
  96. package/fixtures/cases/unnamed-typed-path-without-a-body/schema.yaml +5 -0
  97. package/fixtures/queries.json +913 -0
  98. package/package.json +6 -1
  99. package/dist/condition.d.ts +0 -161
  100. package/dist/condition.d.ts.map +0 -1
  101. package/dist/condition.js +0 -615
package/API.md CHANGED
@@ -46,10 +46,12 @@ JSON Schema of its frontmatter; `$defs` holds shapes the types reuse, reached by
46
46
  `reference` on a string names one MD Type, several, `any` or `attachment`, and `cross_room: true`
47
47
  beside it admits a Document in another Room, of a type that Room declares; `sections` declares a
48
48
  type's H2 sections, each `{ kind: text }` or `{ kind: list, items }` over one string, number,
49
- integer or boolean, optionally `required: true`; `member_document: true` marks at most one type. A
50
- type alone takes `create_roles` and `delete_roles`, each a list of role names. `verify(schema,
51
- provided)` holds every type of a model `provided` as its own, named only for those two. On a field of a
52
- type's own `properties` alone, `change_roles` and `initial_roles` each list role names, and
49
+ integer or boolean, optionally `required: true`, which the `then` or `else` of an `if` on the type,
50
+ in its `allOf` or in such a branch may repeat to ask a section for text, else `conditional-section`;
51
+ `member_document: true` marks at most one type. A type alone takes `create_roles` and
52
+ `delete_roles`, each a list of role names. `verify(schema, provided)` holds every type of a model
53
+ `provided` as its own, named only for those two and only if `provided.nameable` lists it. On a field
54
+ of a type's own `properties` alone, `change_roles` and `initial_roles` each list role names, and
53
55
  `transitions` lists `{ from, to, roles? }`, each end a scalar or `null`, on a field whose `type`,
54
56
  `enum`, `const`, `$ref`, `allOf`, `anyOf`, `oneOf`, `if` and `not` admit no list or object.
55
57
 
@@ -81,29 +83,29 @@ and `memberFacts` take one step and `crossedFacts` reads a list's item facts; `J
81
83
  JSON Pointer grammar, `''` included, `pointerSegments` and `escapePointer` split and write a pointer,
82
84
  `ARRAY_INDEX` matches an index segment, and `ATTACHMENT` is the `reference` that admits any path.
83
85
 
84
- `validate(library, context?, model?)` takes the resulting text Library and one `ValidationContext`
85
- of `binaryTargets: readonly string[]`, none when omitted. Library keys and binary targets share one
86
- canonical collection-relative path namespace; a path declared text and binary is refused. House
87
- declares every binary file of the Room as a binary target, and the model reads no bytes. Ordinary
88
- links and images in typed Documents may resolve to either membership, relative to the source
89
- Document, and one to a path neither holds is not refused: it dangles, as a deleted file's links do.
90
- One written `/rooms/<handle>/<path>` names a file in another Room, which the caller checks; any
91
- other absolute path, or one that leaves the collection, is `unresolved-link`. A binary target
92
- supplies no Document or MD Type. `model` is the verified schema that types the Library, and every
93
- Library member is content, whatever its Path. Without `model` the Library declares no type.
86
+ `validate(library, context?, model?)` takes the resulting text Library and one `ValidationContext` of
87
+ `binaryTargets: readonly string[]`, none when omitted. Library keys and binary targets share one
88
+ canonical collection-relative path namespace; a path declared text and binary is refused. House declares
89
+ every binary file of the Room as a binary target, and the model reads no bytes. Ordinary links and
90
+ images in typed Documents may resolve to either membership, relative to the source Document, and one to
91
+ a path neither holds is not refused: it dangles. One written `/rooms/<handle>/<path>` names a file in
92
+ another Room, which the caller checks; any other absolute path, or one that leaves the collection, is
93
+ `unresolved-link`. A binary target supplies no Document or MD Type. `model` types the Library. A typed
94
+ Document, `any` included, at an `isDocumentPath` (no `isReservedName` of `RESERVED_NAMES` first) linking
95
+ into a reserved name is `unresolved-link`; a typed `ROOM_DESCRIPTION` is `room-md-type`. The context's `typedPaths` bind each `path`, a name's one `*` standing for any nonempty part, to a `type` of `model`: a Document there naming another, or naming any unless `named`, is `unknown-type` at `/type`, one not `named` is checked as it and stays `any`, and one whose body is empty is `required-body` if `body`.
94
96
 
95
97
  A typed Document's frontmatter satisfies its type's schema, every keyword with its JSON Schema
96
98
  meaning, formats asserted and defaults never filled, except that an object schema declaring neither
97
99
  `additionalProperties` nor `unevaluatedProperties` is closed: an undeclared key is refused as
98
100
  `undeclared-field`. `TYPE_FIELD`, `SITE_FIELD` and `RECEIVED_FIELD` count as declared on every type,
99
- and the string `MEMBER_FIELD` on the `member_document` type; `HOUSE_FIELDS` lists the four. A refusal
100
- names the keyword, such as `required`, and the value's JSON Pointer, such as `/shipping/city`. Every
101
- occurrence of a declared list section is a list of values of its item schema, else
102
- `structured-section`; a reference item is one ordinary link alone, such as `- [Ada](ada.md)`. A
103
- reference, at any depth or a section item, reaching a URL, a binary target, another Room without
104
- `cross_room` or the context's `anyRoom: true`, or a Document of a type it does not name is
105
- `unresolved-reference`, and a frontmatter one reaching no member is `referenced-missing-file` naming
106
- its `referrers`; `attachment` admits any path, and no body link is a referrer. `validating` is
101
+ and the string `MEMBER_FIELD` on the `member_document` type alone, else refused, `any` included;
102
+ `HOUSE_FIELDS` lists the four. A refusal names the keyword, such as `required`, and the value's JSON
103
+ Pointer, such as `/shipping/city`. Every occurrence of a declared list section is a list of values of
104
+ its item schema, else `structured-section`; a reference item is one ordinary link alone, such as
105
+ `- [Ada](ada.md)`. A reference, at any depth or a section item, reaching a URL, a binary target, another
106
+ Room without `cross_room` or the context's `anyRoom: true`, a Document of a type it does not name, or,
107
+ from an `isDocumentPath`, a reserved name is `unresolved-reference`, and a frontmatter one reaching no member is `referenced-missing-file`
108
+ naming its `referrers`; `attachment` admits any path, and no body link is a referrer. `validating` is
107
109
  `validate` over a `ReadonlyMap` Library, yielding each path read with the references it `resolved`;
108
110
  `assess(file, content, binary, model?, context?)` reads one member, naming its `type` and `targets`,
109
111
  and `verdicts()` `add`s assessments in any order, its `verdict()` the one `validate` gives.
@@ -156,8 +158,7 @@ Independent field, section, and preamble edits keep their own prior values valid
156
158
 
157
159
  For moved links, use `links` and one `link` change per destination below, then compare the rewritten
158
160
  Document's `preamble` and `sections` to the original and submit the changed values with their
159
- original priors, with no source span or private Model import. Collection validation remains a
160
- separate call against the resulting Library.
161
+ original priors. Collection validation remains a separate call against the resulting Library.
161
162
 
162
163
  `links(document, file)` is the inventory of that Document's ordinary link and image destinations
163
164
  that resolve to a collection Path, each with the destination `href` exactly as written and the
@@ -256,10 +257,9 @@ A `link` change leaves the projection of every Document it rewrites
256
257
  byte-identical, while a changed visible label changes it.
257
258
 
258
259
  `divide(document, file, context)` divides that same Embedding projection input into ordered Spans
259
- under the bound the caller supplies. Each Span carries the `text` to embed and the `start` and
260
- `end` of the extent it addresses in the Document's own source, as UTF-8 byte offsets into that
261
- source and never string positions, so a caller stores the extent and hydrates the text it shows from
262
- the Document itself.
260
+ under the bound the caller supplies. Each Span carries the `text` to embed and the `start` and `end`
261
+ of the extent it addresses in the Document's own source, as UTF-8 byte offsets and never string
262
+ positions, so a caller stores the extent and hydrates the text it shows from the Document itself.
263
263
 
264
264
  ```ts
265
265
  const parsed = parse(content);
@@ -307,63 +307,67 @@ divided out of one free-text field value addresses that whole value, because a Y
307
307
  positions are the only ones its source has, and a Span carrying part of one internal link's label
308
308
  addresses that whole link, because a cut never falls inside link syntax.
309
309
 
310
- ## Conditions
311
-
312
- `facts(document, { id, path }, model, resolve)` reads one Document as the `DocumentFacts` a
313
- condition tests: its `id`, its `path` with a leading `/`, its `type` or `null`, its `sections`, and
314
- a `Fact` for each frontmatter field it writes that its MD Type declares. `factKind(facts)` names
315
- the kind a declared value compares as: `reference`, `enum`, `number`, `boolean`, `date`, `time`
316
- (a `date-time`) or `string`, else `null`. A prose value, or one of no kind, is `prose`, a list or
317
- an object holds the facts of its members, and a value written `null` is `null`. A value that does
318
- not fit its kind, such as a string in a number field, a value outside its `enum` or a reference
319
- `resolve` maps to no `{ id, member? }`, is `unreadable`; a readable reference compares as that `id`.
320
-
321
- `holds(test, facts)` is `true`, `false` or `undefined`, unknown; a Trigger fires on `true` alone. A
322
- test's `path` is one of the `DOCUMENT_PATHS`, `/path` and `/type`, or `/sections/<heading>`,
323
- `/fields/<pointer>` or `/members/<pointer>`, the members a reference field's Documents bind, which
324
- `members(facts, path)` lists. A non-index pointer segment reads every item of a list, an item
325
- lacking it unknown, and a test over several values holds as `any` does.
326
-
327
- | The path reaches | `exists` | `contains` | any other test |
328
- | --------------------------------------- | ----------- | -------------- | -------------- |
329
- | a value | present | `undefined` | compared |
330
- | `null`, prose or a section | present | `undefined` | `undefined` |
331
- | a list | present | `any` of items | `undefined` |
332
- | no item, through an empty list | absent | `false` | `false` |
333
- | nothing: no such field, section or type | absent | `undefined` | `undefined` |
334
- | only unreadable values | `undefined` | `undefined` | `undefined` |
335
-
336
- `exists: true` holds where present and fails where absent, `exists: false` the reverse. `all` is
337
- `false` if a part is, else `undefined` if a part is; `any` is `true` if a part is, else `undefined`
338
- if a part is; `not` keeps `undefined`, so absence is tested with `exists`, never with `not`. `eq`
339
- and `in` are `undefined` against a value of another JSON type and compare a `time` as an instant;
340
- `prefix` reads only a string, never a reference or a member; `gt`, `gte`, `lt` and `lte` order
341
- numbers, dates and times alone.
342
-
343
- `fires(condition, event)` reads one change, `{ before, after, changed, by, moved_between_rooms }`:
344
- each side's facts, `null` for a side the change lacks, the `changed` paths whose prose changed, the
345
- actor a `by` test reads at the `ACTOR_PATHS`, its `/door` one of `WRITE_DOORS`, and whether it
346
- moved between Rooms, which a set `moved_between_rooms` must match. `starts_matching` fires when the
347
- Document is in `scope` and holds `match` after the change but not before, a creation only with
348
- `new_documents: true`. `field_changes` fires when the Document's side, after or for a deletion
349
- before, is in `scope` and holds `match`, and `field` changed: its facts differ, or with neither
350
- `from` nor `to` `changed` names it. A field on neither side never fires; `from: 'new'` admits only a
351
- creation and `to: 'deleted'` only a deletion, and listed values need that side's `field` `in` them.
352
-
353
- `itemFires(condition, item)` compares `source` and `address` where given and holds `match` over
354
- the `ITEM_PATHS`, a `/json` test unknown for an item with no JSON. `prosePaths(facts)` lists the
355
- prose and section paths whose text builds `changed`; `pointed(value, pointer)` reads a JSON Pointer,
356
- `undefined` where nothing is; `dated(value)` checks a `YYYY-MM-DD` date, and `instant(value)` reads
357
- an RFC 3339 time with its offset as epoch nanoseconds, a `bigint`.
358
-
359
- What a condition names of one MD Type: `datePointers(fields)` lists, sorted, its date fields as escaped
360
- `/fields/` pointers, the only `date`s a `DateCondition` takes; `changeFields(definition)` lists each
361
- declared field and section as a `field_changes` `field`, and `valuedChange(definition, field)` holds of
362
- a field read as one value, never prose, a list or reached through one, the only `field` that takes a
363
- `from` or a `to`; `memberPointers(definition, memberType)` lists the `/members/<name>` paths of the
364
- fields referring to `memberType`, alone or in a list. `testOperators(definitions, path, memberType)`
365
- lists the `CONDITION_OPERATORS` a test on a document `path` takes in any of those types, none where none
366
- declares it or, for a member path, `memberPointers` lacks it: `exists` alone on a section, prose or an
367
- object, `contains` and `exists` on a list, `prefix` on a string and `/path`, orderings on a number, date
368
- or time, and `contains` through a list. `actorOperators(path)` and `itemOperators(path)` list the tests
369
- on a `by` or item path, `itemKind(path)` an item value's kind, or `null`, as on `/json/`.
310
+ ## Queries
311
+
312
+ `planOf(query, rooms)` checks one query against the MD Types of the Rooms `rooms` lists, each
313
+ `{ locator, available, types }` with `listed` when the list is whole, and answers its
314
+ `QueryPlan` or throws a `QueryError` whose `code` is `invalid-query`, `unknown-type`,
315
+ `unknown-field` or `wrong-kind`, whose message names where, whose `place` is that place as the
316
+ keys and indexes into the query, which `placeText` writes as its message does, and whose `accepts` lists what it would take there: the types or
317
+ fields the Rooms declare, a field's `kindWords`, or the parts and operators a query knows. A query
318
+ is data: `types`, `where`
319
+ field predicates by JSON Pointer (`$eq`, `$ne`, `$in`, `$nin`, `$gt`, `$gte`, `$lt`, `$lte`,
320
+ `$all`, `$size`, `$exists`, `$prefix`, `$and`, `$or`), `pathPrefix`, `folder`, `paths`,
321
+ `fileIds`, `hop`, `backlinks`, `text`, then `select` or `groupBy`, `orderBy`, `limit`, `after`
322
+ and `total`. `queryKey` and `identityOf` are a query's and a plan's canonical text, `bodied`
323
+ says a shape reads text, `cursorOf` and `decodedCursor` write and read the `after` a window
324
+ continues from, and `invalid`, `known` and `plain` are the check's refusal and tests.
325
+
326
+ `KINDS` is the one table of kinds a value compares as, `kindOf(facts)` a declared value's kind,
327
+ `kindWords(facts)` the values it takes in words, and `fitsKind(kind, facts, value)` whether a value
328
+ fits it: a `date`, `date-time` or `time` is
329
+ exactly what document validation admits as that format, a `date` is `dated`, a `date-time`
330
+ compares as the instant `instant` reads, which `instantKey` writes as text that sorts as the
331
+ instant does, and a `reference` as the Room Path it resolves to. `compared(left, right,
332
+ ordering)` orders plain values: numbers and booleans, then text by locale or `byCodePoint`,
333
+ then lists item by item.
334
+
335
+ Two evaluators answer a plan's tests on one Document alike, a test on a missing value false and
336
+ its negation (`$ne`, `$nin`, `$exists: false`) true. `matches(plan, candidate)` answers in
337
+ memory over one `Candidate`: its `path`, `type`, `fileId`, `fields`, `definition` and the
338
+ `text` held. The `sql` namespace compiles them to SQL over a collection: `indexed(path, fields,
339
+ definition)` derives a Document's values and field links, its date-times with their instants,
340
+ `sql.VALUE_TABLE` holds those values and `sql.insertedValues` writes them, and `sql.tests(alias,
341
+ plan)` tests a document row of `id`, `path`, `folder`, `type`, `file_id` and `content`, its
342
+ phrase through the function a connection registers as `sql.HOLDS_PHRASE` with `sql.holdsPhrase`.
343
+ `sql.scoped`, `sql.placed`, `sql.sorted`, `sql.beyond`, `sql.following` and `sql.sortValue`
344
+ render a scope, a pointer, an order and a window's continuation, a date-time ordering as its
345
+ instant between numbers and text; `sql.fragment`, `sql.joined`, `sql.all`, `sql.any`,
346
+ `sql.grouped`, `sql.listed` and `sql.exists` build statements, and `heldKind` is the index's value
347
+ kind. `fixtures/queries.json` holds both evaluators to one table.
348
+
349
+ ## Events
350
+
351
+ `facts(document, { id, path }, model, resolve)` reads one Document as the `DocumentFacts` of a
352
+ change: its `id`, its `path` with a leading `/`, its `type` or `null`, its `sections`, and a `Fact`
353
+ for each frontmatter field it writes that its MD Type declares, held as its kind: `reference`,
354
+ `enum`, `number`, `boolean`, `date`, `time` (a `date-time`) or `string`. A prose value, or one of
355
+ no kind, is `prose`, a list or an object holds the facts of its members, and a value written
356
+ `null` is `null`. A
357
+ value that does not fit its kind, such as a string in a number field, a value outside its `enum` or
358
+ a reference `resolve` maps to no `{ id, member? }`, is `unreadable`; a readable reference holds that
359
+ `id` and the `member` it binds, which `members(facts, path)` lists at a `/members/<pointer>`.
360
+
361
+ `candidateOf(facts)` is that Document as the `Candidate` `matches` answers over, so a query tests
362
+ the Document as the change saw it: at its Room Path, by its file ID, a reference as the `id` it
363
+ named, a prose value as present alone, an unreadable value as missing and a date-time as an instant.
364
+ `heldAt(candidate, pointer)` lists the values a pointer reaches there, its date-times with their
365
+ instants. `prosePaths(facts)` lists the prose and section paths whose text a change compares, and
366
+ `TEXT_FIELD`, `/text`, names a Document's whole text; `WRITE_DOORS` are the ways a change is made.
367
+ `pointed(value, pointer)` reads a JSON Pointer, `undefined` where nothing is; `dated(value)` checks a
368
+ `YYYY-MM-DD` date, and `instant(value)` reads what validation admits as a `date-time` as epoch
369
+ nanoseconds, a `bigint`. Of one MD Type, `datePointers(definition)` lists, sorted, its date fields as
370
+ escaped pointers, `valuedChange(definition, pointer)` holds of a field read as one value, never
371
+ prose, a list or reached through one, the only field whose change is tested by its values, and
372
+ `memberPointers(definition, memberType)` the `/members/<name>` paths of the fields referring to
373
+ `memberType`, alone or in a list.
package/README.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # `@agentshouse/mdmodel`
2
2
 
3
- Typed Markdown documents: MD Types declared in JSON Schema, a parser, a validator, and the
4
- deterministic application of one structured change to a Document, plus a
5
- conformance fixture corpus.
3
+ Typed Markdown documents: MD Types declared in JSON Schema, a parser, a validator, the
4
+ deterministic application of one structured change to a Document, and one query language
5
+ answered in SQL over a collection or in memory over one Document, plus a conformance
6
+ fixture corpus.
6
7
 
7
8
  It runs in the browser and in Node, makes no network call, and reads no
8
9
  filesystem on its own. It ships one ESM artifact that Node 24.22.1 and later
@@ -44,7 +45,8 @@ if (parsed.ok) {
44
45
  | `links`, `target`, `retarget` | Inventory and rewrite link destinations |
45
46
  | `escapePointer` | Write one key as a JSON Pointer token |
46
47
  | `project`, `divide` | Embedding projection input and its division into Spans |
47
- | `facts`, `factKind`, `holds`, `fires` | A condition over a Document and over one of its changes |
48
+ | `facts`, `candidateOf` | A Document as one change saw it, matched as one query candidate |
49
+ | `planOf`, `matches`, `sql` | Check a query, answer it over one Document or compile it to SQL |
48
50
  | `MARKDOWN_SYNTAX_PROFILE`, `VERSION` | The pinned Markdown profile (GFM 0.29) and MD model version |
49
51
  | `MEMBER_FIELD`, `SITE_FIELD`, `RECEIVED_FIELD` | The field names validation counts as declared beyond a type's own |
50
52
 
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjG,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC5C,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC;AAEtF,MAAM,MAAM,KAAK,GAAG;IAClB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAEzD,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IACzD,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAc5E,eAAO,MAAM,UAAU,EAAE,SAAS,QAAQ,EAQzC,CAAC;AAEF,eAAO,MAAM,aAAa,QAAQ,CAAC;AAEnC,eAAO,MAAM,UAAU,eAAe,CAAC;AA+BvC,eAAO,MAAM,WAAW,QAAyB,CAAC;AAElD,eAAO,MAAM,YAAY,QAA+B,CAAC;AAYzD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAMD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzD;AAED,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACtC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAoC/D;AAkaD,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,UAAU,CAE7F;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAElF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAKlF;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,EAAE,CAK5D;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAItF;AAqBD,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAc9F;AA+TD,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,aAAwB,GACjC,aAAa,GAAG,OAAO,CAsCzB"}
@@ -547,6 +547,56 @@ function readSections(value, at, context) {
547
547
  }
548
548
  return { sections };
549
549
  }
550
+ function branchSectionsFailure(sections, declared, where) {
551
+ if (!isRecord(sections))
552
+ return refuse('sections', where);
553
+ for (const [name, spec] of Object.entries(sections)) {
554
+ const place = `${where}/${escapePointer(name)}`;
555
+ const own = isRecord(declared) && Object.hasOwn(declared, name) ? declared[name] : undefined;
556
+ if (!isRecord(spec) || !isRecord(own))
557
+ return refuse('sections', place);
558
+ const { required, ...kind } = spec;
559
+ const { required: _required, ...ownKind } = own;
560
+ if (required !== undefined && typeof required !== 'boolean')
561
+ return refuse('sections', `${place}/required`);
562
+ if (!equalValue(kind, ownKind))
563
+ return refuse('sections', place);
564
+ }
565
+ return undefined;
566
+ }
567
+ function withoutBranchSections(schema, declared, at) {
568
+ const kept = { ...schema };
569
+ if (Array.isArray(schema.allOf)) {
570
+ const entries = [];
571
+ for (const [index, entry] of schema.allOf.entries()) {
572
+ const read = isRecord(entry)
573
+ ? withoutBranchSections(entry, declared, `${at}/allOf/${index}`)
574
+ : { schema: entry };
575
+ if ('failure' in read)
576
+ return read;
577
+ entries.push(read.schema);
578
+ }
579
+ kept.allOf = entries;
580
+ }
581
+ if (schema.if === undefined)
582
+ return { schema: kept };
583
+ for (const branch of ['then', 'else']) {
584
+ const held = schema[branch];
585
+ if (!isRecord(held))
586
+ continue;
587
+ const { sections, ...rest } = held;
588
+ const failure = sections === undefined
589
+ ? undefined
590
+ : branchSectionsFailure(sections, declared, `${at}/${branch}/sections`);
591
+ if (failure !== undefined)
592
+ return { failure };
593
+ const read = withoutBranchSections(rest, declared, `${at}/${branch}`);
594
+ if ('failure' in read)
595
+ return read;
596
+ kept[branch] = read.schema;
597
+ }
598
+ return { schema: kept };
599
+ }
550
600
  function deepFreeze(value) {
551
601
  if (value !== null && typeof value === 'object' && !Object.isFrozen(value)) {
552
602
  Object.freeze(value);
@@ -656,6 +706,8 @@ function unruled(schema) {
656
706
  }
657
707
  function providedType(name, value, provided) {
658
708
  const at = `/${escapePointer(name)}`;
709
+ if (provided.nameable?.includes(name) !== true)
710
+ return refuse('provided-type', at);
659
711
  if (!isRecord(value))
660
712
  return refuse('schema', at);
661
713
  const declared = Object.keys(value).find((key) => !PROVIDED_KEYWORDS.includes(key));
@@ -667,7 +719,7 @@ function providedType(name, value, provided) {
667
719
  if (deleteRoles !== undefined && !roleNames(deleteRoles))
668
720
  return refuse('delete_roles', `${at}/delete_roles`);
669
721
  return {
670
- ...provided,
722
+ ...provided.types[name],
671
723
  ...(createRoles === undefined ? {} : { createRoles }),
672
724
  ...(deleteRoles === undefined ? {} : { deleteRoles }),
673
725
  };
@@ -688,7 +740,10 @@ function readType(name, value, context) {
688
740
  : readSections(declared, `${at}/sections`, context);
689
741
  if ('failure' in read)
690
742
  return read.failure;
691
- const { schema, written } = unruled(ruled);
743
+ const unbranched = withoutBranchSections(ruled, declared, at);
744
+ if ('failure' in unbranched)
745
+ return unbranched.failure;
746
+ const { schema, written } = unruled(unbranched.schema);
692
747
  const failure = schemaFailure(schema, at, context);
693
748
  if (failure !== undefined)
694
749
  return failure;
@@ -755,7 +810,7 @@ export function readSchema(text, provided = NO_TYPES) {
755
810
  let marked = false;
756
811
  for (const name of names) {
757
812
  const definition = Object.hasOwn(provided.types, name)
758
- ? providedType(name, root[name], provided.types[name])
813
+ ? providedType(name, root[name], provided)
759
814
  : readType(name, root[name], context);
760
815
  if ('rule' in definition)
761
816
  return definition;
@@ -0,0 +1,78 @@
1
+ import { type Definition } from './definition.js';
2
+ import type { Candidate } from './query/match.js';
3
+ import type { Document, VerifiedModel } from './types.js';
4
+ export type FactKind = 'string' | 'number' | 'boolean' | 'date' | 'time' | 'enum' | 'reference';
5
+ type Scalar = string | number | boolean;
6
+ export type Fact = {
7
+ readonly kind: FactKind;
8
+ readonly value: Scalar;
9
+ readonly member?: string;
10
+ } | {
11
+ readonly kind: 'prose';
12
+ } | {
13
+ readonly kind: 'null';
14
+ } | {
15
+ readonly kind: 'unreadable';
16
+ } | {
17
+ readonly kind: 'list';
18
+ readonly items: readonly Fact[];
19
+ } | {
20
+ readonly kind: 'object';
21
+ readonly fields: Readonly<Record<string, Fact>>;
22
+ };
23
+ export type DocumentFacts = {
24
+ readonly id: string;
25
+ readonly path: string;
26
+ readonly type: string | null;
27
+ readonly fields: Readonly<Record<string, Fact>>;
28
+ readonly sections: readonly string[];
29
+ };
30
+ export declare const TEXT_FIELD = "/text";
31
+ export declare const WRITE_DOORS: readonly ['browser', 'agent', 'client', 'function'];
32
+ export type WriteDoor = (typeof WRITE_DOORS)[number];
33
+ export type Actor = {
34
+ readonly user?: string;
35
+ readonly site?: string;
36
+ readonly app?: string;
37
+ readonly door?: WriteDoor;
38
+ };
39
+ export type DocumentEvent = {
40
+ readonly before: DocumentFacts | null;
41
+ readonly after: DocumentFacts | null;
42
+ readonly changed: readonly string[];
43
+ readonly by: Actor;
44
+ readonly moved_between_rooms: boolean;
45
+ };
46
+ export type ItemFacts = {
47
+ readonly delivery: string;
48
+ readonly source: string | null;
49
+ readonly address: string | null;
50
+ readonly container: string | null;
51
+ readonly author: string | null;
52
+ readonly headers: Readonly<Record<string, string>>;
53
+ readonly json: {
54
+ readonly value: unknown;
55
+ } | null;
56
+ };
57
+ export type MessageFacts = {
58
+ readonly sender: string;
59
+ readonly agent_function: string | null;
60
+ readonly path: string | null;
61
+ };
62
+ export type Resolved = {
63
+ readonly id: string;
64
+ readonly member?: string;
65
+ };
66
+ export declare function facts(document: Pick<Document, 'type' | 'fields' | 'sections'>, at: {
67
+ readonly id: string;
68
+ readonly path: string;
69
+ }, model: VerifiedModel, resolve: (target: string) => Resolved | undefined): DocumentFacts;
70
+ export declare function prosePaths(facts: DocumentFacts): string[];
71
+ export declare function members(document: DocumentFacts, path: string): readonly string[];
72
+ export declare function pointed(value: unknown, pointer: string): unknown;
73
+ export declare function valuedChange(definition: Definition, pointer: string): boolean;
74
+ export declare function datePointers(definition: Definition): string[];
75
+ export declare function memberPointers(definition: Definition, memberType: string): string[];
76
+ export declare function candidateOf(document: DocumentFacts): Candidate;
77
+ export {};
78
+ //# sourceMappingURL=event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"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"}