@agentshouse/mdmodel 0.1.0-cd90851746292 → 0.1.0-cdbd463e01dc2

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 (95) hide show
  1. package/API.md +90 -81
  2. package/README.md +6 -4
  3. package/dist/definition.d.ts +1 -1
  4. package/dist/definition.d.ts.map +1 -1
  5. package/dist/definition.js +13 -9
  6. package/dist/event.d.ts +78 -0
  7. package/dist/event.d.ts.map +1 -0
  8. package/dist/event.js +230 -0
  9. package/dist/facts.d.ts +15 -0
  10. package/dist/facts.d.ts.map +1 -0
  11. package/dist/facts.js +39 -0
  12. package/dist/index.d.ts +17 -5
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +10 -3
  15. package/dist/kinds.d.ts +19 -0
  16. package/dist/kinds.d.ts.map +1 -0
  17. package/dist/kinds.js +161 -0
  18. package/dist/query/language.d.ts +223 -0
  19. package/dist/query/language.d.ts.map +1 -0
  20. package/dist/query/language.js +565 -0
  21. package/dist/query/match.d.ts +14 -0
  22. package/dist/query/match.d.ts.map +1 -0
  23. package/dist/query/match.js +121 -0
  24. package/dist/query/rows.d.ts +32 -0
  25. package/dist/query/rows.d.ts.map +1 -0
  26. package/dist/query/rows.js +161 -0
  27. package/dist/query/sql.d.ts +39 -0
  28. package/dist/query/sql.d.ts.map +1 -0
  29. package/dist/query/sql.js +279 -0
  30. package/dist/reserved.d.ts +5 -0
  31. package/dist/reserved.d.ts.map +1 -0
  32. package/dist/reserved.js +20 -0
  33. package/dist/types.d.ts +7 -0
  34. package/dist/types.d.ts.map +1 -1
  35. package/dist/validate.d.ts +4 -3
  36. package/dist/validate.d.ts.map +1 -1
  37. package/dist/validate.js +103 -36
  38. package/fixtures/README.md +17 -2
  39. package/fixtures/cases/link-into-a-reserved-name/context.json +1 -0
  40. package/fixtures/cases/link-into-a-reserved-name/expected.json +5 -0
  41. package/fixtures/cases/link-into-a-reserved-name/library/notes/a.md +6 -0
  42. package/fixtures/cases/link-into-a-reserved-name/schema.yaml +3 -0
  43. package/fixtures/cases/link-into-a-reserved-name-from-an-untyped-document/context.json +1 -0
  44. package/fixtures/cases/link-into-a-reserved-name-from-an-untyped-document/expected.json +5 -0
  45. package/fixtures/cases/link-into-a-reserved-name-from-an-untyped-document/library/notes/b.md +5 -0
  46. package/fixtures/cases/member-on-an-untyped-document/context.json +1 -0
  47. package/fixtures/cases/member-on-an-untyped-document/expected.json +6 -0
  48. package/fixtures/cases/member-on-an-untyped-document/library/note.md +4 -0
  49. package/fixtures/cases/member-on-another-type/context.json +1 -0
  50. package/fixtures/cases/member-on-another-type/expected.json +6 -0
  51. package/fixtures/cases/member-on-another-type/library/note.md +4 -0
  52. package/fixtures/cases/member-on-another-type/schema.yaml +7 -0
  53. package/fixtures/cases/reference-into-a-reserved-name/context.json +1 -0
  54. package/fixtures/cases/reference-into-a-reserved-name/expected.json +6 -0
  55. package/fixtures/cases/reference-into-a-reserved-name/library/notes/a.md +4 -0
  56. package/fixtures/cases/reference-into-a-reserved-name/library/settings/brief.md +1 -0
  57. package/fixtures/cases/reference-into-a-reserved-name/schema.yaml +3 -0
  58. package/fixtures/cases/room-md-declares-a-type/context.json +1 -0
  59. package/fixtures/cases/room-md-declares-a-type/expected.json +6 -0
  60. package/fixtures/cases/room-md-declares-a-type/library/ROOM.md +5 -0
  61. package/fixtures/cases/typed-path-names-another-type/context.json +11 -0
  62. package/fixtures/cases/typed-path-names-another-type/expected.json +6 -0
  63. package/fixtures/cases/typed-path-names-another-type/library/settings/prefs/one.md +3 -0
  64. package/fixtures/cases/typed-path-names-another-type/schema.yaml +6 -0
  65. package/fixtures/cases/typed-path-names-its-type/context.json +11 -0
  66. package/fixtures/cases/typed-path-names-its-type/expected.json +3 -0
  67. package/fixtures/cases/typed-path-names-its-type/library/settings/prefs/deeper/two.md +1 -0
  68. package/fixtures/cases/typed-path-names-its-type/library/settings/prefs/one.md +4 -0
  69. package/fixtures/cases/typed-path-names-its-type/schema.yaml +6 -0
  70. package/fixtures/cases/typed-path-names-no-type/context.json +11 -0
  71. package/fixtures/cases/typed-path-names-no-type/expected.json +6 -0
  72. package/fixtures/cases/typed-path-names-no-type/library/settings/prefs/one.md +1 -0
  73. package/fixtures/cases/typed-path-names-no-type/schema.yaml +6 -0
  74. package/fixtures/cases/unnamed-typed-path-checks-its-fields/context.json +11 -0
  75. package/fixtures/cases/unnamed-typed-path-checks-its-fields/expected.json +6 -0
  76. package/fixtures/cases/unnamed-typed-path-checks-its-fields/library/rooms/team/tasks/plan.md +4 -0
  77. package/fixtures/cases/unnamed-typed-path-checks-its-fields/schema.yaml +5 -0
  78. package/fixtures/cases/unnamed-typed-path-names-a-type/context.json +11 -0
  79. package/fixtures/cases/unnamed-typed-path-names-a-type/expected.json +6 -0
  80. package/fixtures/cases/unnamed-typed-path-names-a-type/library/rooms/team/tasks/plan.md +6 -0
  81. package/fixtures/cases/unnamed-typed-path-names-a-type/schema.yaml +5 -0
  82. package/fixtures/cases/unnamed-typed-path-reads-its-type/context.json +11 -0
  83. package/fixtures/cases/unnamed-typed-path-reads-its-type/expected.json +3 -0
  84. package/fixtures/cases/unnamed-typed-path-reads-its-type/library/rooms/team/plan.md +1 -0
  85. package/fixtures/cases/unnamed-typed-path-reads-its-type/library/rooms/team/tasks/plan.md +5 -0
  86. package/fixtures/cases/unnamed-typed-path-reads-its-type/schema.yaml +5 -0
  87. package/fixtures/cases/unnamed-typed-path-without-a-body/context.json +11 -0
  88. package/fixtures/cases/unnamed-typed-path-without-a-body/expected.json +5 -0
  89. package/fixtures/cases/unnamed-typed-path-without-a-body/library/rooms/team/tasks/plan.md +5 -0
  90. package/fixtures/cases/unnamed-typed-path-without-a-body/schema.yaml +5 -0
  91. package/fixtures/queries.json +913 -0
  92. package/package.json +1 -1
  93. package/dist/condition.d.ts +0 -180
  94. package/dist/condition.d.ts.map +0 -1
  95. package/dist/condition.js +0 -633
package/API.md CHANGED
@@ -54,6 +54,8 @@ in its `allOf` or in such a branch may repeat to ask a section for text, else `c
54
54
  of a type's own `properties` alone, `change_roles` and `initial_roles` each list role names, and
55
55
  `transitions` lists `{ from, to, roles? }`, each end a scalar or `null`, on a field whose `type`,
56
56
  `enum`, `const`, `$ref`, `allOf`, `anyOf`, `oneOf`, `if` and `not` admit no list or object.
57
+ `readTypes(schema, provided?)` returns the model of a schema `verify` already accepted, checking
58
+ none of these rules, and throws on a text it cannot read as types.
57
59
 
58
60
  ```yaml
59
61
  $defs:
@@ -83,29 +85,29 @@ and `memberFacts` take one step and `crossedFacts` reads a list's item facts; `J
83
85
  JSON Pointer grammar, `''` included, `pointerSegments` and `escapePointer` split and write a pointer,
84
86
  `ARRAY_INDEX` matches an index segment, and `ATTACHMENT` is the `reference` that admits any path.
85
87
 
86
- `validate(library, context?, model?)` takes the resulting text Library and one `ValidationContext`
87
- of `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
89
- declares every binary file of the Room as a binary target, and the model reads no bytes. Ordinary
90
- links and images in typed Documents may resolve to either membership, relative to the source
91
- Document, and one to a path neither holds is not refused: it dangles, as a deleted file's links do.
92
- One written `/rooms/<handle>/<path>` names a file in another Room, which the caller checks; any
93
- other absolute path, or one that leaves the collection, is `unresolved-link`. A binary target
94
- supplies no Document or MD Type. `model` is the verified schema that types the Library, and every
95
- Library member is content, whatever its Path. Without `model` the Library declares no type.
88
+ `validate(library, context?, model?)` takes the resulting text Library and one `ValidationContext` of
89
+ `binaryTargets: readonly string[]`, none when omitted. Library keys and binary targets share one
90
+ canonical collection-relative path namespace; a path declared text and binary is refused. House declares
91
+ every binary file of the Room as a binary target, and the model reads no bytes. Ordinary links and
92
+ images in typed Documents may resolve to either membership, relative to the source Document, and one to
93
+ a path neither holds is not refused: it dangles. One written `/rooms/<handle>/<path>` names a file in
94
+ another Room, which the caller checks; any other absolute path, or one that leaves the collection, is
95
+ `unresolved-link`. A binary target supplies no Document or MD Type. `model` types the Library. A typed
96
+ Document, `any` included, at an `isDocumentPath` (no `isReservedName` of `RESERVED_NAMES` first) linking
97
+ 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`.
96
98
 
97
99
  A typed Document's frontmatter satisfies its type's schema, every keyword with its JSON Schema
98
100
  meaning, formats asserted and defaults never filled, except that an object schema declaring neither
99
101
  `additionalProperties` nor `unevaluatedProperties` is closed: an undeclared key is refused as
100
102
  `undeclared-field`. `TYPE_FIELD`, `SITE_FIELD` and `RECEIVED_FIELD` count as declared on every type,
101
- and the string `MEMBER_FIELD` on the `member_document` type; `HOUSE_FIELDS` lists the four. A refusal
102
- names the keyword, such as `required`, and the value's JSON Pointer, such as `/shipping/city`. Every
103
- occurrence of a declared list section is a list of values of its item schema, else
104
- `structured-section`; a reference item is one ordinary link alone, such as `- [Ada](ada.md)`. A
105
- reference, at any depth or a section item, reaching a URL, a binary target, another Room without
106
- `cross_room` or the context's `anyRoom: true`, or a Document of a type it does not name is
107
- `unresolved-reference`, and a frontmatter one reaching no member is `referenced-missing-file` naming
108
- its `referrers`; `attachment` admits any path, and no body link is a referrer. `validating` is
103
+ and the string `MEMBER_FIELD` on the `member_document` type alone, else refused, `any` included;
104
+ `HOUSE_FIELDS` lists the four. A refusal names the keyword, such as `required`, and the value's JSON
105
+ Pointer, such as `/shipping/city`. Every occurrence of a declared list section is a list of values of
106
+ its item schema, else `structured-section`; a reference item is one ordinary link alone, such as
107
+ `- [Ada](ada.md)`. A reference, at any depth or a section item, reaching a URL, a binary target, another
108
+ Room without `cross_room` or the context's `anyRoom: true`, a Document of a type it does not name, or,
109
+ from an `isDocumentPath`, a reserved name is `unresolved-reference`, and a frontmatter one reaching no member is `referenced-missing-file`
110
+ naming its `referrers`; `attachment` admits any path, and no body link is a referrer. `validating` is
109
111
  `validate` over a `ReadonlyMap` Library, yielding each path read with the references it `resolved`;
110
112
  `assess(file, content, binary, model?, context?)` reads one member, naming its `type` and `targets`,
111
113
  and `verdicts()` `add`s assessments in any order, its `verdict()` the one `validate` gives.
@@ -185,13 +187,16 @@ percent-encodes in `to` what `target` would decode, so it resolves to `to` again
185
187
  `checkDocument(file, content, model, context?)` reads one Document as `validate` does in that
186
188
  context: `ok: false` where it refuses, else its `type`, whether it is `typed`, and each reference's
187
189
  `target` and `to`, which `resolves(reference, typeOf, binary)` says reaches a member `validate`
188
- accepts. `sectionReferences(file, content, definition)` reads only its `list` sections' references;
189
- neither names another Room's, which `roomReferences(file, content, definition?)` lists by `kind`.
190
+ accepts. It names no other Room's, which `roomReferences(file, content, definition?)` lists by `kind`.
190
191
  `parseFrontmatter(content, file?)` is `parse` without the body: `content`, `type`, `fields`.
191
192
 
192
193
  `references(document, definition)` lists each frontmatter `reference` string at any depth as
193
194
  `pointer`, `value` and `to`; a `{ kind: 'reference', pointer, value, prior }` change rewrites one in
194
- place, keeping its quotes, or is stale. `relativize(document, file, handle, definition?, kept?)`
195
+ place, keeping its quotes, or is stale. `referenceTarget(file, value)` is the Path a value names
196
+ read as a link destination, else `null`; `referenceTargets(document, file, model)` lists each
197
+ reference's `location`, `to` and `target`. `documentFacts(file, content, model)`, `null` where the
198
+ text does not parse, is the `type` (`any` if none), `fields` and sorted distinct link and reference
199
+ `links` a save stores, no links under `settings/`. `relativize(document, file, handle, definition?, kept?)`
195
200
  rewrites, in one `apply`, each link destination and reference written `/rooms/<handle>/<path>` and
196
201
  not in `kept` to `relative(file, path)`, keeping its `?query` or `#fragment`. A text without
197
202
  frontmatter, such as a captured body, is read from its first character: `relativizeBody(body, file, handle)` converts it
@@ -307,63 +312,67 @@ divided out of one free-text field value addresses that whole value, because a Y
307
312
  positions are the only ones its source has, and a Span carrying part of one internal link's label
308
313
  addresses that whole link, because a cut never falls inside link syntax.
309
314
 
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, as it names `TEXT_FIELD`, `/text`, at any change of its text. A field on neither
351
- side never fires; `from: 'new'` admits only a 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 the
354
- `ITEM_PATHS`, a `/json` test unknown for an item with no JSON; `notificationFires(condition, notification)`
355
- holds `match`, where given, over a delivered notification's Document facts, and `messageFires(condition, message)`
356
- over a message's `MessageFacts` at the `MESSAGE_PATHS`, a `/routine` or `/path` test unknown where its request names none.
357
- `prosePaths(facts)` lists the prose and section paths whose text builds `changed`; `pointed(value, pointer)` reads a JSON Pointer,
358
- `undefined` where nothing is; `dated(value)` checks a `YYYY-MM-DD` date, and `instant(value)` reads an RFC 3339 time with its offset as epoch nanoseconds, a `bigint`.
359
-
360
- What a condition names of one MD Type: `datePointers(fields)` lists, sorted, its date fields as escaped
361
- `/fields/` pointers, the only `date`s a `DateCondition` takes; `changeFields(definition)` lists each
362
- declared field and section as a `field_changes` `field`, and `valuedChange(definition, field)` holds of
363
- a field read as one value, never prose, a list or reached through one, the only `field` that takes a
364
- `from` or a `to`; `memberPointers(definition, memberType)` lists the `/members/<name>` paths of the
365
- fields referring to `memberType`, alone or in a list. `testOperators(definitions, path, memberType)`
366
- lists the `CONDITION_OPERATORS` a test on a document `path` takes in any of those types, none where none
367
- declares it or, for a member path, `memberPointers` lacks it: `exists` alone on a section, prose or an
368
- object, `contains` and `exists` on a list, `prefix` on a string and `/path`, orderings on a number, date
369
- or time, and `contains` through a list. `actorOperators(path)`, `itemOperators(path)` and `messageOperators(path)` list the tests on a `by`, item or message path, `itemKind(path)` an item value's kind, or `null`, as on `/json/`.
315
+ ## Queries
316
+
317
+ `planOf(query, rooms)` checks one query against the MD Types of the Rooms `rooms` lists, each
318
+ `{ locator, available, types }` with `listed` when the list is whole, and answers its
319
+ `QueryPlan` or throws a `QueryError` whose `code` is `invalid-query`, `unknown-type`,
320
+ `unknown-field` or `wrong-kind`, whose message names where, whose `place` is that place as the
321
+ 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
322
+ fields the Rooms declare, a field's `kindWords`, or the parts and operators a query knows. A query
323
+ is data: `types`, `where`
324
+ field predicates by JSON Pointer (`$eq`, `$ne`, `$in`, `$nin`, `$gt`, `$gte`, `$lt`, `$lte`,
325
+ `$all`, `$size`, `$exists`, `$prefix`, `$and`, `$or`), `pathPrefix`, `folder`, `paths`,
326
+ `fileIds`, `hop`, `backlinks`, `text`, then `select` or `groupBy`, `orderBy`, `limit`, `after`
327
+ and `total`. `queryKey` and `identityOf` are a query's and a plan's canonical text, `bodied`
328
+ says a shape reads text, `cursorOf` and `decodedCursor` write and read the `after` a window
329
+ continues from, and `invalid`, `known` and `plain` are the check's refusal and tests.
330
+
331
+ `KINDS` is the one table of kinds a value compares as, `kindOf(facts)` a declared value's kind,
332
+ `kindWords(facts)` the values it takes in words, and `fitsKind(kind, facts, value)` whether a value
333
+ fits it: a `date`, `date-time` or `time` is
334
+ exactly what document validation admits as that format, a `date` is `dated`, a `date-time`
335
+ compares as the instant `instant` reads, which `instantKey` writes as text that sorts as the
336
+ instant does, and a `reference` as the Room Path it resolves to. `compared(left, right,
337
+ ordering)` orders plain values: numbers and booleans, then text by locale or `byCodePoint`,
338
+ then lists item by item.
339
+
340
+ Two evaluators answer a plan's tests on one Document alike, a test on a missing value false and
341
+ its negation (`$ne`, `$nin`, `$exists: false`) true. `matches(plan, candidate)` answers in
342
+ memory over one `Candidate`: its `path`, `type`, `fileId`, `fields`, `definition` and the
343
+ `text` held. The `sql` namespace compiles them to SQL over a collection: `indexed(path, fields,
344
+ definition)` derives a Document's values and field links, its date-times with their instants,
345
+ `sql.VALUE_TABLE` holds those values and `sql.insertedValues` writes them, and `sql.tests(alias,
346
+ plan)` tests a document row of `id`, `path`, `folder`, `type`, `file_id` and `content`, its
347
+ phrase through the function a connection registers as `sql.HOLDS_PHRASE` with `sql.holdsPhrase`.
348
+ `sql.scoped`, `sql.placed`, `sql.sorted`, `sql.beyond`, `sql.following` and `sql.sortValue`
349
+ render a scope, a pointer, an order and a window's continuation, a date-time ordering as its
350
+ instant between numbers and text; `sql.fragment`, `sql.joined`, `sql.all`, `sql.any`,
351
+ `sql.grouped`, `sql.listed` and `sql.exists` build statements, and `heldKind` is the index's value
352
+ kind. `fixtures/queries.json` holds both evaluators to one table.
353
+
354
+ ## Events
355
+
356
+ `facts(document, { id, path }, model, resolve)` reads one Document as the `DocumentFacts` of a
357
+ change: its `id`, its `path` with a leading `/`, its `type` or `null`, its `sections`, and a `Fact`
358
+ for each frontmatter field it writes that its MD Type declares, held as its kind: `reference`,
359
+ `enum`, `number`, `boolean`, `date`, `time` (a `date-time`) or `string`. A prose value, or one of
360
+ no kind, is `prose`, a list or an object holds the facts of its members, and a value written
361
+ `null` is `null`. A
362
+ value that does not fit its kind, such as a string in a number field, a value outside its `enum` or
363
+ a reference `resolve` maps to no `{ id, member? }`, is `unreadable`; a readable reference holds that
364
+ `id` and the `member` it binds, which `members(facts, path)` lists at a `/members/<pointer>`.
365
+
366
+ `candidateOf(facts)` is that Document as the `Candidate` `matches` answers over, so a query tests
367
+ the Document as the change saw it: at its Room Path, by its file ID, a reference as the `id` it
368
+ named, a prose value as present alone, an unreadable value as missing and a date-time as an instant.
369
+ `heldAt(candidate, pointer)` lists the values a pointer reaches there, its date-times with their
370
+ instants. `prosePaths(facts)` lists the prose and section paths whose text a change compares, and
371
+ `TEXT_FIELD`, `/text`, names a Document's whole text; `WRITE_DOORS` are the ways a change is made.
372
+ `pointed(value, pointer)` reads a JSON Pointer, `undefined` where nothing is; `dated(value)` checks a
373
+ `YYYY-MM-DD` date, and `instant(value)` reads what validation admits as a `date-time` as epoch
374
+ nanoseconds, a `bigint`. Of one MD Type, `datePointers(definition)` lists, sorted, its date fields as
375
+ escaped pointers, `valuedChange(definition, pointer)` holds of a field read as one value, never
376
+ prose, a list or reached through one, the only field whose change is tested by its values, and
377
+ `memberPointers(definition, memberType)` the `/members/<name>` paths of the fields referring to
378
+ `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
 
@@ -78,5 +78,5 @@ export type PointerFacts = {
78
78
  export declare function crossedFacts(facts: ValueFacts): ValueFacts[];
79
79
  export declare function fieldFacts(definition: Definition, key: string): ValueFacts | undefined;
80
80
  export declare function pointerFacts(definition: Definition, pointer: string): PointerFacts | undefined;
81
- export declare function readSchema(text: string, provided?: VerifiedModel): VerifiedModel | Failure;
81
+ export declare function readSchema(text: string, provided?: VerifiedModel, checked?: boolean): VerifiedModel | Failure;
82
82
  //# sourceMappingURL=definition.d.ts.map
@@ -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":"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"}
@@ -100,7 +100,7 @@ function strings(value) {
100
100
  new Set(value).size === value.length);
101
101
  }
102
102
  function schemaFailure(value, at, context) {
103
- if (typeof value === 'boolean')
103
+ if (!context.checked || typeof value === 'boolean')
104
104
  return undefined;
105
105
  if (!isRecord(value))
106
106
  return refuse('schema', at);
@@ -704,14 +704,14 @@ function unruled(schema) {
704
704
  }
705
705
  return { schema: written.size === 0 ? schema : { ...schema, properties }, written };
706
706
  }
707
- function providedType(name, value, provided) {
707
+ function providedType(name, value, provided, checked) {
708
708
  const at = `/${escapePointer(name)}`;
709
- if (provided.nameable?.includes(name) !== true)
709
+ if (checked && provided.nameable?.includes(name) !== true)
710
710
  return refuse('provided-type', at);
711
711
  if (!isRecord(value))
712
712
  return refuse('schema', at);
713
713
  const declared = Object.keys(value).find((key) => !PROVIDED_KEYWORDS.includes(key));
714
- if (declared !== undefined)
714
+ if (checked && declared !== undefined)
715
715
  return refuse('provided-type', `${at}/${escapePointer(declared)}`);
716
716
  const { create_roles: createRoles, delete_roles: deleteRoles } = value;
717
717
  if (createRoles !== undefined && !roleNames(createRoles))
@@ -782,7 +782,7 @@ function readType(name, value, context) {
782
782
  function lineAt(text, offset) {
783
783
  return text.slice(0, offset).split(/\r\n|\r|\n/).length;
784
784
  }
785
- export function readSchema(text, provided = NO_TYPES) {
785
+ export function readSchema(text, provided = NO_TYPES, checked = true) {
786
786
  let root;
787
787
  try {
788
788
  root = jsValue(parseYamlMapping(text, 0, text.length));
@@ -796,11 +796,15 @@ export function readSchema(text, provided = NO_TYPES) {
796
796
  if (!isRecord(defs))
797
797
  return refuse('$defs', '/$defs');
798
798
  const names = Object.keys(root).filter((key) => key !== '$defs');
799
- for (const name of names) {
799
+ for (const name of checked ? names : []) {
800
800
  if (name === '' || name.startsWith('$') || name === BUILT_IN_TYPE || name === ATTACHMENT)
801
801
  return refuse('schema-type-name', `/${escapePointer(name)}`);
802
802
  }
803
- const context = { defs, types: new Set([...names, ...Object.keys(provided.types)]) };
803
+ const context = {
804
+ defs,
805
+ types: new Set([...names, ...Object.keys(provided.types)]),
806
+ checked,
807
+ };
804
808
  for (const [name, def] of Object.entries(defs)) {
805
809
  const failure = schemaFailure(def, `/$defs/${escapePointer(name)}`, context);
806
810
  if (failure !== undefined)
@@ -810,11 +814,11 @@ export function readSchema(text, provided = NO_TYPES) {
810
814
  let marked = false;
811
815
  for (const name of names) {
812
816
  const definition = Object.hasOwn(provided.types, name)
813
- ? providedType(name, root[name], provided)
817
+ ? providedType(name, root[name], provided, checked)
814
818
  : readType(name, root[name], context);
815
819
  if ('rule' in definition)
816
820
  return definition;
817
- if (definition.memberDocument) {
821
+ if (checked && definition.memberDocument) {
818
822
  if (marked)
819
823
  return refuse('member_document', `/${escapePointer(name)}/member_document`);
820
824
  marked = true;
@@ -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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"}