@agentshouse/mdmodel 0.1.0-alpha.1 → 0.1.0-alpha.3

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 (68) hide show
  1. package/README.md +27 -4
  2. package/dist/definition.js.map +1 -1
  3. package/dist/document.js.map +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/links.js.map +1 -1
  8. package/dist/paths.js.map +1 -1
  9. package/dist/profile.js.map +1 -1
  10. package/dist/refuse.js.map +1 -1
  11. package/dist/schema.js.map +1 -1
  12. package/dist/sections.js.map +1 -1
  13. package/dist/types.d.ts +3 -0
  14. package/dist/types.d.ts.map +1 -1
  15. package/dist/types.js.map +1 -1
  16. package/dist/validate.d.ts +2 -2
  17. package/dist/validate.d.ts.map +1 -1
  18. package/dist/validate.js +9 -5
  19. package/dist/validate.js.map +1 -1
  20. package/dist/version.d.ts +1 -1
  21. package/dist/version.js +1 -1
  22. package/dist/version.js.map +1 -1
  23. package/dist/yaml.js.map +1 -1
  24. package/fixtures/README.md +8 -4
  25. package/fixtures/cases/any-without-type/context.json +1 -0
  26. package/fixtures/cases/binary-any-reference/context.json +5 -0
  27. package/fixtures/cases/binary-any-reference/expected.json +7 -0
  28. package/fixtures/cases/binary-any-reference/library/notes/draft.md +6 -0
  29. package/fixtures/cases/binary-any-reference/library/types/note.md +5 -0
  30. package/fixtures/cases/binary-document-collision/context.json +5 -0
  31. package/fixtures/cases/binary-document-collision/expected.json +6 -0
  32. package/fixtures/cases/binary-document-collision/library/notes/draft.md +3 -0
  33. package/fixtures/cases/binary-document-collision/library/types/note.md +3 -0
  34. package/fixtures/cases/binary-link-outside-collection/context.json +6 -0
  35. package/fixtures/cases/binary-link-outside-collection/expected.json +6 -0
  36. package/fixtures/cases/binary-link-outside-collection/library/notes/draft.md +5 -0
  37. package/fixtures/cases/binary-link-outside-collection/library/types/note.md +3 -0
  38. package/fixtures/cases/binary-prototype-reference/context.json +1 -0
  39. package/fixtures/cases/binary-prototype-reference/expected.json +7 -0
  40. package/fixtures/cases/binary-prototype-reference/library/notes/draft.md +6 -0
  41. package/fixtures/cases/binary-prototype-reference/library/types/note.md +5 -0
  42. package/fixtures/cases/binary-typed-reference/context.json +5 -0
  43. package/fixtures/cases/binary-typed-reference/expected.json +7 -0
  44. package/fixtures/cases/binary-typed-reference/library/notes/draft.md +6 -0
  45. package/fixtures/cases/binary-typed-reference/library/types/note.md +5 -0
  46. package/fixtures/cases/binary-typed-reference/library/types/person.md +3 -0
  47. package/fixtures/cases/declared-binary-links/context.json +6 -0
  48. package/fixtures/cases/declared-binary-links/expected.json +1 -0
  49. package/fixtures/cases/declared-binary-links/library/notes/draft.md +7 -0
  50. package/fixtures/cases/declared-binary-links/library/types/note.md +3 -0
  51. package/fixtures/cases/field-enum/context.json +1 -0
  52. package/fixtures/cases/malformed-definition/context.json +1 -0
  53. package/fixtures/cases/missing-binary-image/context.json +6 -0
  54. package/fixtures/cases/missing-binary-image/expected.json +6 -0
  55. package/fixtures/cases/missing-binary-image/library/notes/draft.md +5 -0
  56. package/fixtures/cases/missing-binary-image/library/types/note.md +3 -0
  57. package/fixtures/cases/missing-binary-link/context.json +6 -0
  58. package/fixtures/cases/missing-binary-link/expected.json +6 -0
  59. package/fixtures/cases/missing-binary-link/library/notes/draft.md +5 -0
  60. package/fixtures/cases/missing-binary-link/library/types/note.md +3 -0
  61. package/fixtures/cases/missing-required-field/context.json +1 -0
  62. package/fixtures/cases/prd-definition/context.json +1 -0
  63. package/fixtures/cases/referenced-missing-file/context.json +1 -0
  64. package/fixtures/cases/structured-section/context.json +1 -0
  65. package/fixtures/cases/unclosed-frontmatter/context.json +1 -0
  66. package/fixtures/cases/unresolved-link/context.json +1 -0
  67. package/fixtures/cases/valid-typed-document/context.json +1 -0
  68. package/package.json +2 -2
package/README.md CHANGED
@@ -5,7 +5,10 @@ deterministic application of one structured change to Document content, the
5
5
  Markdown syntax profile, and the conformance fixtures.
6
6
 
7
7
  The package runs in a browser and in Node. It makes no network call and reads
8
- no filesystem on its own. Callers pass Library state as path-to-content.
8
+ no filesystem on its own. Callers pass text Library state as path-to-content and declare retained binary
9
+ link targets separately in a `ValidationContext`.
10
+ The public root exposes one ESM artifact. Node 24.20.0 and later can load it
11
+ through either `import` or `require`; browser bundlers consume the same artifact.
9
12
 
10
13
  ## Install
11
14
 
@@ -13,7 +16,7 @@ no filesystem on its own. Callers pass Library state as path-to-content.
13
16
  npm install @agentshouse/mdmodel
14
17
  ```
15
18
 
16
- The first prerelease is published after the User confirms.
19
+ Package releases are published after the User confirms.
17
20
 
18
21
  ## API
19
22
 
@@ -28,6 +31,13 @@ import {
28
31
  } from '@agentshouse/mdmodel';
29
32
 
30
33
  validate({ 'note.md': '# Hello\n' });
34
+ validate(
35
+ {
36
+ 'types/note.md': '---\ntype: definition\n---\n',
37
+ 'note.md': '---\ntype: note\n---\n![Figure](assets/figure.png)\n',
38
+ },
39
+ { binaryTargets: ['assets/figure.png'] },
40
+ );
31
41
  const parsed = parse(content);
32
42
  if (parsed.ok) {
33
43
  const next = apply(parsed.document, {
@@ -40,8 +50,21 @@ if (parsed.ok) {
40
50
  }
41
51
  ```
42
52
 
43
- `validate` takes one Library state and returns acceptance or one refusal
44
- naming the file, the field or section, the violated rule, and `VERSION`.
53
+ `validate(library, context?)` takes the resulting text Library and one
54
+ `ValidationContext` containing `binaryTargets: readonly string[]`. Omitting the
55
+ context declares no binary targets. Library keys and binary targets use the
56
+ same collection-relative path namespace; callers supply canonical paths, and
57
+ a path declared as both text and binary is refused. Ordinary links and images
58
+ in typed Documents may resolve to either membership, including relative
59
+ normalization from the source Document. A binary target supplies no Document
60
+ or MD Type and cannot satisfy a typed reference, including one to `any`.
61
+ The existing `any` Document rules are unchanged.
62
+
63
+ Validation returns acceptance or one refusal naming the file, the field or
64
+ section, the violated rule, and `VERSION`. Every caller operation that validates
65
+ a resulting collection supplies that collection's context to this same
66
+ `validate` function. `parse`, `apply`, and `serialize` operate on a single text
67
+ Document; they do not validate collection membership or consume binary bytes.
45
68
  `apply` sets one typed field, including a list field as a whole, or replaces
46
69
  one declared section body against that value's prior content. A field change
47
70
  does not reformat the rest of the file.
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/definition.ts"],"sourcesContent":["import { typeNameFromPath } from './paths.js';\nimport { refusal } from './refuse.js';\nimport type { Document, Refusal } from './types.js';\n\nexport type ScalarSpec =\n | { readonly kind: 'string'; readonly required: boolean }\n | { readonly kind: 'number'; readonly required: boolean }\n | { readonly kind: 'date'; readonly required: boolean }\n | { readonly kind: 'enum'; readonly required: boolean; readonly values: readonly string[] }\n | { readonly kind: 'reference'; readonly required: boolean; readonly to: string };\n\nexport type FieldSpec =\n | ScalarSpec\n | { readonly kind: 'list'; readonly required: boolean; readonly of: ScalarSpec };\n\nexport type SectionSpec = { readonly kind: 'text' | 'list'; readonly required: boolean };\n\nexport type Definition = {\n readonly name: string;\n readonly file: string;\n readonly fields: Readonly<Record<string, FieldSpec>>;\n readonly sections: Readonly<Record<string, SectionSpec>>;\n};\n\nfunction refuse(file: string, rule: string, location?: string): Refusal {\n return location === undefined ? refusal(file, rule) : refusal(file, rule, { location });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction requiredFlag(value: unknown): boolean | undefined {\n if (value === undefined) return false;\n if (typeof value === 'boolean') return value;\n return undefined;\n}\n\nfunction stringList(value: unknown): string[] | undefined {\n if (!Array.isArray(value) || value.length === 0) return undefined;\n if (!value.every((item) => typeof item === 'string' && item !== '')) return undefined;\n return value;\n}\n\nconst SCALAR_KINDS = new Set(['string', 'number', 'date', 'enum', 'reference']);\n\nfunction parseScalar(\n file: string,\n location: string,\n spec: Record<string, unknown>,\n required: boolean,\n): ScalarSpec | Refusal {\n const kind = spec.kind;\n if (kind === 'string') return { kind: 'string', required };\n if (kind === 'number') return { kind: 'number', required };\n if (kind === 'date') return { kind: 'date', required };\n if (kind === 'enum') {\n const values = stringList(spec.values);\n if (values === undefined) return refuse(file, 'definition-enum-values', location);\n return { kind: 'enum', required, values };\n }\n if (kind === 'reference') {\n if (typeof spec.to !== 'string' || spec.to === '')\n return refuse(file, 'definition-reference-to', location);\n return { kind: 'reference', required, to: spec.to };\n }\n return refuse(file, 'definition-field-kind', location);\n}\n\nfunction extraKeys(spec: Record<string, unknown>, allowed: readonly string[]): boolean {\n return Object.keys(spec).some((key) => !allowed.includes(key));\n}\n\nfunction parseField(file: string, location: string, value: unknown): FieldSpec | Refusal {\n if (!isRecord(value) || typeof value.kind !== 'string')\n return refuse(file, 'definition-field', location);\n const required = requiredFlag(value.required);\n if (required === undefined) return refuse(file, 'definition-field', location);\n if (value.kind === 'list') {\n if (typeof value.of !== 'string' || !SCALAR_KINDS.has(value.of)) {\n return refuse(file, 'definition-list-of', location);\n }\n const allowed =\n value.of === 'enum'\n ? ['kind', 'required', 'of', 'values']\n : value.of === 'reference'\n ? ['kind', 'required', 'of', 'to']\n : ['kind', 'required', 'of'];\n if (extraKeys(value, allowed)) return refuse(file, 'definition-field', location);\n const inner = parseScalar(file, location, { ...value, kind: value.of }, false);\n if ('rule' in inner) return inner;\n return { kind: 'list', required, of: inner };\n }\n const allowed =\n value.kind === 'enum'\n ? ['kind', 'required', 'values']\n : value.kind === 'reference'\n ? ['kind', 'required', 'to']\n : ['kind', 'required'];\n if (extraKeys(value, allowed)) return refuse(file, 'definition-field', location);\n return parseScalar(file, location, value, required);\n}\n\nfunction parseSection(file: string, location: string, value: unknown): SectionSpec | Refusal {\n if (!isRecord(value) || (value.kind !== 'text' && value.kind !== 'list')) {\n return refuse(file, 'definition-section-kind', location);\n }\n const required = requiredFlag(value.required);\n if (required === undefined || extraKeys(value, ['kind', 'required'])) {\n return refuse(file, 'definition-section', location);\n }\n return { kind: value.kind, required };\n}\n\nexport function readDefinition(file: string, document: Document): Definition | Refusal {\n if (document.type !== 'definition') return refuse(file, 'definition-type');\n const name = typeNameFromPath(file);\n if (name === '') return refuse(file, 'definition-type');\n for (const key of Object.keys(document.fields)) {\n if (key !== 'type' && key !== 'fields' && key !== 'sections') {\n return refuse(file, 'definition-shape', key);\n }\n }\n const fieldsValue = document.fields.fields;\n const sectionsValue = document.fields.sections;\n if (fieldsValue !== undefined && !isRecord(fieldsValue))\n return refuse(file, 'definition-fields', 'fields');\n if (sectionsValue !== undefined && !isRecord(sectionsValue)) {\n return refuse(file, 'definition-sections', 'sections');\n }\n const fields: Record<string, FieldSpec> = {};\n for (const [fieldName, spec] of Object.entries(fieldsValue ?? {})) {\n const parsed = parseField(file, fieldName, spec);\n if ('rule' in parsed) return parsed;\n fields[fieldName] = parsed;\n }\n const sections: Record<string, SectionSpec> = {};\n for (const [sectionName, spec] of Object.entries(sectionsValue ?? {})) {\n const parsed = parseSection(file, sectionName, spec);\n if ('rule' in parsed) return parsed;\n sections[sectionName] = parsed;\n }\n return { name, file, fields, sections };\n}\n"],"names":["typeNameFromPath","refusal","refuse","file","rule","location","undefined","isRecord","value","Array","isArray","requiredFlag","stringList","length","every","item","SCALAR_KINDS","Set","parseScalar","spec","required","kind","values","to","extraKeys","allowed","Object","keys","some","key","includes","parseField","of","has","inner","parseSection","readDefinition","document","type","name","fields","fieldsValue","sectionsValue","sections","fieldName","entries","parsed","sectionName"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,aAAa;AAC9C,SAASC,OAAO,QAAQ,cAAc;AAuBtC,SAASC,OAAOC,IAAY,EAAEC,IAAY,EAAEC,QAAiB;IAC3D,OAAOA,aAAaC,YAAYL,QAAQE,MAAMC,QAAQH,QAAQE,MAAMC,MAAM;QAAEC;IAAS;AACvF;AAEA,SAASE,SAASC,KAAc;IAC9B,OAAOA,UAAU,QAAQ,OAAOA,UAAU,YAAY,CAACC,MAAMC,OAAO,CAACF;AACvE;AAEA,SAASG,aAAaH,KAAc;IAClC,IAAIA,UAAUF,WAAW,OAAO;IAChC,IAAI,OAAOE,UAAU,WAAW,OAAOA;IACvC,OAAOF;AACT;AAEA,SAASM,WAAWJ,KAAc;IAChC,IAAI,CAACC,MAAMC,OAAO,CAACF,UAAUA,MAAMK,MAAM,KAAK,GAAG,OAAOP;IACxD,IAAI,CAACE,MAAMM,KAAK,CAAC,CAACC,OAAS,OAAOA,SAAS,YAAYA,SAAS,KAAK,OAAOT;IAC5E,OAAOE;AACT;AAEA,MAAMQ,eAAe,IAAIC,IAAI;IAAC;IAAU;IAAU;IAAQ;IAAQ;CAAY;AAE9E,SAASC,YACPf,IAAY,EACZE,QAAgB,EAChBc,IAA6B,EAC7BC,QAAiB;IAEjB,MAAMC,OAAOF,KAAKE,IAAI;IACtB,IAAIA,SAAS,UAAU,OAAO;QAAEA,MAAM;QAAUD;IAAS;IACzD,IAAIC,SAAS,UAAU,OAAO;QAAEA,MAAM;QAAUD;IAAS;IACzD,IAAIC,SAAS,QAAQ,OAAO;QAAEA,MAAM;QAAQD;IAAS;IACrD,IAAIC,SAAS,QAAQ;QACnB,MAAMC,SAASV,WAAWO,KAAKG,MAAM;QACrC,IAAIA,WAAWhB,WAAW,OAAOJ,OAAOC,MAAM,0BAA0BE;QACxE,OAAO;YAAEgB,MAAM;YAAQD;YAAUE;QAAO;IAC1C;IACA,IAAID,SAAS,aAAa;QACxB,IAAI,OAAOF,KAAKI,EAAE,KAAK,YAAYJ,KAAKI,EAAE,KAAK,IAC7C,OAAOrB,OAAOC,MAAM,2BAA2BE;QACjD,OAAO;YAAEgB,MAAM;YAAaD;YAAUG,IAAIJ,KAAKI,EAAE;QAAC;IACpD;IACA,OAAOrB,OAAOC,MAAM,yBAAyBE;AAC/C;AAEA,SAASmB,UAAUL,IAA6B,EAAEM,OAA0B;IAC1E,OAAOC,OAAOC,IAAI,CAACR,MAAMS,IAAI,CAAC,CAACC,MAAQ,CAACJ,QAAQK,QAAQ,CAACD;AAC3D;AAEA,SAASE,WAAW5B,IAAY,EAAEE,QAAgB,EAAEG,KAAc;IAChE,IAAI,CAACD,SAASC,UAAU,OAAOA,MAAMa,IAAI,KAAK,UAC5C,OAAOnB,OAAOC,MAAM,oBAAoBE;IAC1C,MAAMe,WAAWT,aAAaH,MAAMY,QAAQ;IAC5C,IAAIA,aAAad,WAAW,OAAOJ,OAAOC,MAAM,oBAAoBE;IACpE,IAAIG,MAAMa,IAAI,KAAK,QAAQ;QACzB,IAAI,OAAOb,MAAMwB,EAAE,KAAK,YAAY,CAAChB,aAAaiB,GAAG,CAACzB,MAAMwB,EAAE,GAAG;YAC/D,OAAO9B,OAAOC,MAAM,sBAAsBE;QAC5C;QACA,MAAMoB,UACJjB,MAAMwB,EAAE,KAAK,SACT;YAAC;YAAQ;YAAY;YAAM;SAAS,GACpCxB,MAAMwB,EAAE,KAAK,cACX;YAAC;YAAQ;YAAY;YAAM;SAAK,GAChC;YAAC;YAAQ;YAAY;SAAK;QAClC,IAAIR,UAAUhB,OAAOiB,UAAU,OAAOvB,OAAOC,MAAM,oBAAoBE;QACvE,MAAM6B,QAAQhB,YAAYf,MAAME,UAAU;YAAE,GAAGG,KAAK;YAAEa,MAAMb,MAAMwB,EAAE;QAAC,GAAG;QACxE,IAAI,UAAUE,OAAO,OAAOA;QAC5B,OAAO;YAAEb,MAAM;YAAQD;YAAUY,IAAIE;QAAM;IAC7C;IACA,MAAMT,UACJjB,MAAMa,IAAI,KAAK,SACX;QAAC;QAAQ;QAAY;KAAS,GAC9Bb,MAAMa,IAAI,KAAK,cACb;QAAC;QAAQ;QAAY;KAAK,GAC1B;QAAC;QAAQ;KAAW;IAC5B,IAAIG,UAAUhB,OAAOiB,UAAU,OAAOvB,OAAOC,MAAM,oBAAoBE;IACvE,OAAOa,YAAYf,MAAME,UAAUG,OAAOY;AAC5C;AAEA,SAASe,aAAahC,IAAY,EAAEE,QAAgB,EAAEG,KAAc;IAClE,IAAI,CAACD,SAASC,UAAWA,MAAMa,IAAI,KAAK,UAAUb,MAAMa,IAAI,KAAK,QAAS;QACxE,OAAOnB,OAAOC,MAAM,2BAA2BE;IACjD;IACA,MAAMe,WAAWT,aAAaH,MAAMY,QAAQ;IAC5C,IAAIA,aAAad,aAAakB,UAAUhB,OAAO;QAAC;QAAQ;KAAW,GAAG;QACpE,OAAON,OAAOC,MAAM,sBAAsBE;IAC5C;IACA,OAAO;QAAEgB,MAAMb,MAAMa,IAAI;QAAED;IAAS;AACtC;AAEA,OAAO,SAASgB,eAAejC,IAAY,EAAEkC,QAAkB;IAC7D,IAAIA,SAASC,IAAI,KAAK,cAAc,OAAOpC,OAAOC,MAAM;IACxD,MAAMoC,OAAOvC,iBAAiBG;IAC9B,IAAIoC,SAAS,IAAI,OAAOrC,OAAOC,MAAM;IACrC,KAAK,MAAM0B,OAAOH,OAAOC,IAAI,CAACU,SAASG,MAAM,EAAG;QAC9C,IAAIX,QAAQ,UAAUA,QAAQ,YAAYA,QAAQ,YAAY;YAC5D,OAAO3B,OAAOC,MAAM,oBAAoB0B;QAC1C;IACF;IACA,MAAMY,cAAcJ,SAASG,MAAM,CAACA,MAAM;IAC1C,MAAME,gBAAgBL,SAASG,MAAM,CAACG,QAAQ;IAC9C,IAAIF,gBAAgBnC,aAAa,CAACC,SAASkC,cACzC,OAAOvC,OAAOC,MAAM,qBAAqB;IAC3C,IAAIuC,kBAAkBpC,aAAa,CAACC,SAASmC,gBAAgB;QAC3D,OAAOxC,OAAOC,MAAM,uBAAuB;IAC7C;IACA,MAAMqC,SAAoC,CAAC;IAC3C,KAAK,MAAM,CAACI,WAAWzB,KAAK,IAAIO,OAAOmB,OAAO,CAACJ,eAAe,CAAC,GAAI;QACjE,MAAMK,SAASf,WAAW5B,MAAMyC,WAAWzB;QAC3C,IAAI,UAAU2B,QAAQ,OAAOA;QAC7BN,MAAM,CAACI,UAAU,GAAGE;IACtB;IACA,MAAMH,WAAwC,CAAC;IAC/C,KAAK,MAAM,CAACI,aAAa5B,KAAK,IAAIO,OAAOmB,OAAO,CAACH,iBAAiB,CAAC,GAAI;QACrE,MAAMI,SAASX,aAAahC,MAAM4C,aAAa5B;QAC/C,IAAI,UAAU2B,QAAQ,OAAOA;QAC7BH,QAAQ,CAACI,YAAY,GAAGD;IAC1B;IACA,OAAO;QAAEP;QAAMpC;QAAMqC;QAAQG;IAAS;AACxC"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/definition.ts"],"sourcesContent":["import { typeNameFromPath } from './paths.js';\nimport { refusal } from './refuse.js';\nimport type { Document, Refusal } from './types.js';\n\nexport type ScalarSpec =\n | { readonly kind: 'string'; readonly required: boolean }\n | { readonly kind: 'number'; readonly required: boolean }\n | { readonly kind: 'date'; readonly required: boolean }\n | { readonly kind: 'enum'; readonly required: boolean; readonly values: readonly string[] }\n | { readonly kind: 'reference'; readonly required: boolean; readonly to: string };\n\nexport type FieldSpec =\n | ScalarSpec\n | { readonly kind: 'list'; readonly required: boolean; readonly of: ScalarSpec };\n\nexport type SectionSpec = { readonly kind: 'text' | 'list'; readonly required: boolean };\n\nexport type Definition = {\n readonly name: string;\n readonly file: string;\n readonly fields: Readonly<Record<string, FieldSpec>>;\n readonly sections: Readonly<Record<string, SectionSpec>>;\n};\n\nfunction refuse(file: string, rule: string, location?: string): Refusal {\n return location === undefined ? refusal(file, rule) : refusal(file, rule, { location });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction requiredFlag(value: unknown): boolean | undefined {\n if (value === undefined) return false;\n if (typeof value === 'boolean') return value;\n return undefined;\n}\n\nfunction stringList(value: unknown): string[] | undefined {\n if (!Array.isArray(value) || value.length === 0) return undefined;\n if (!value.every((item) => typeof item === 'string' && item !== '')) return undefined;\n return value;\n}\n\nconst SCALAR_KINDS = new Set(['string', 'number', 'date', 'enum', 'reference']);\n\nfunction parseScalar(\n file: string,\n location: string,\n spec: Record<string, unknown>,\n required: boolean,\n): ScalarSpec | Refusal {\n const kind = spec.kind;\n if (kind === 'string') return { kind: 'string', required };\n if (kind === 'number') return { kind: 'number', required };\n if (kind === 'date') return { kind: 'date', required };\n if (kind === 'enum') {\n const values = stringList(spec.values);\n if (values === undefined) return refuse(file, 'definition-enum-values', location);\n return { kind: 'enum', required, values };\n }\n if (kind === 'reference') {\n if (typeof spec.to !== 'string' || spec.to === '')\n return refuse(file, 'definition-reference-to', location);\n return { kind: 'reference', required, to: spec.to };\n }\n return refuse(file, 'definition-field-kind', location);\n}\n\nfunction extraKeys(spec: Record<string, unknown>, allowed: readonly string[]): boolean {\n return Object.keys(spec).some((key) => !allowed.includes(key));\n}\n\nfunction parseField(file: string, location: string, value: unknown): FieldSpec | Refusal {\n if (!isRecord(value) || typeof value.kind !== 'string')\n return refuse(file, 'definition-field', location);\n const required = requiredFlag(value.required);\n if (required === undefined) return refuse(file, 'definition-field', location);\n if (value.kind === 'list') {\n if (typeof value.of !== 'string' || !SCALAR_KINDS.has(value.of)) {\n return refuse(file, 'definition-list-of', location);\n }\n const allowed =\n value.of === 'enum'\n ? ['kind', 'required', 'of', 'values']\n : value.of === 'reference'\n ? ['kind', 'required', 'of', 'to']\n : ['kind', 'required', 'of'];\n if (extraKeys(value, allowed)) return refuse(file, 'definition-field', location);\n const inner = parseScalar(file, location, { ...value, kind: value.of }, false);\n if ('rule' in inner) return inner;\n return { kind: 'list', required, of: inner };\n }\n const allowed =\n value.kind === 'enum'\n ? ['kind', 'required', 'values']\n : value.kind === 'reference'\n ? ['kind', 'required', 'to']\n : ['kind', 'required'];\n if (extraKeys(value, allowed)) return refuse(file, 'definition-field', location);\n return parseScalar(file, location, value, required);\n}\n\nfunction parseSection(file: string, location: string, value: unknown): SectionSpec | Refusal {\n if (!isRecord(value) || (value.kind !== 'text' && value.kind !== 'list')) {\n return refuse(file, 'definition-section-kind', location);\n }\n const required = requiredFlag(value.required);\n if (required === undefined || extraKeys(value, ['kind', 'required'])) {\n return refuse(file, 'definition-section', location);\n }\n return { kind: value.kind, required };\n}\n\nexport function readDefinition(file: string, document: Document): Definition | Refusal {\n if (document.type !== 'definition') return refuse(file, 'definition-type');\n const name = typeNameFromPath(file);\n if (name === '') return refuse(file, 'definition-type');\n for (const key of Object.keys(document.fields)) {\n if (key !== 'type' && key !== 'fields' && key !== 'sections') {\n return refuse(file, 'definition-shape', key);\n }\n }\n const fieldsValue = document.fields.fields;\n const sectionsValue = document.fields.sections;\n if (fieldsValue !== undefined && !isRecord(fieldsValue))\n return refuse(file, 'definition-fields', 'fields');\n if (sectionsValue !== undefined && !isRecord(sectionsValue)) {\n return refuse(file, 'definition-sections', 'sections');\n }\n const fields: Record<string, FieldSpec> = {};\n for (const [fieldName, spec] of Object.entries(fieldsValue ?? {})) {\n const parsed = parseField(file, fieldName, spec);\n if ('rule' in parsed) return parsed;\n fields[fieldName] = parsed;\n }\n const sections: Record<string, SectionSpec> = {};\n for (const [sectionName, spec] of Object.entries(sectionsValue ?? {})) {\n const parsed = parseSection(file, sectionName, spec);\n if ('rule' in parsed) return parsed;\n sections[sectionName] = parsed;\n }\n return { name, file, fields, sections };\n}\n"],"names":["typeNameFromPath","refusal","refuse","file","rule","location","undefined","isRecord","value","Array","isArray","requiredFlag","stringList","length","every","item","SCALAR_KINDS","Set","parseScalar","spec","required","kind","values","to","extraKeys","allowed","Object","keys","some","key","includes","parseField","of","has","inner","parseSection","readDefinition","document","type","name","fields","fieldsValue","sectionsValue","sections","fieldName","entries","parsed","sectionName"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/document.ts"],"sourcesContent":["import { headingSpans, sectionsRecord } from './sections.js';\nimport { refusal } from './refuse.js';\nimport type { ApplyResult, Change, Document, ParseResult } from './types.js';\nimport {\n bodyStartAfterYaml,\n equalValue,\n extractFrontmatter,\n jsValue,\n lineEnding,\n mapEntry,\n parseYamlMapping,\n serializeJs,\n serializeKey,\n YamlError,\n type YamlMap,\n} from './yaml.js';\n\ntype Internal = {\n readonly root: YamlMap | null;\n readonly yamlEnd: number;\n readonly bodyStart: number;\n};\n\nconst internals = new WeakMap<Document, Internal>();\n\nfunction refuse(file: string, rule: string, location?: string) {\n return location === undefined ? refusal(file, rule) : refusal(file, rule, { location });\n}\n\nfunction freezeDocument(\n content: string,\n type: string | undefined,\n fields: Record<string, unknown>,\n sections: Record<string, string>,\n internal: Internal,\n): Document {\n const document: Document = Object.freeze({\n content,\n type,\n fields: Object.freeze(fields),\n sections: Object.freeze(sections),\n });\n internals.set(document, internal);\n return document;\n}\n\nfunction declaredType(fields: Record<string, unknown>): string | undefined {\n const value = fields.type;\n if (value === undefined || value === null) return undefined;\n if (typeof value !== 'string' || value === '') return undefined;\n return value;\n}\n\nexport function parse(content: string, file = ''): ParseResult {\n const fence = extractFrontmatter(content);\n if (fence.kind === 'none') {\n const spans = headingSpans(content, 0);\n return {\n ok: true,\n document: freezeDocument(content, undefined, {}, sectionsRecord(spans, content), {\n root: null,\n yamlEnd: 0,\n bodyStart: 0,\n }),\n };\n }\n if (fence.kind === 'unclosed') return { ok: false, refusal: refuse(file, 'frontmatter-fence') };\n try {\n const root = parseYamlMapping(content, fence.yamlStart, fence.yamlEnd);\n const fields = jsValue(root);\n if (fields === null || typeof fields !== 'object' || Array.isArray(fields)) {\n return { ok: false, refusal: refuse(file, 'frontmatter-fence') };\n }\n const bodyStart = bodyStartAfterYaml(content, fence.yamlEnd);\n const spans = headingSpans(content, bodyStart);\n const record = fields as Record<string, unknown>;\n return {\n ok: true,\n document: freezeDocument(\n content,\n declaredType(record),\n record,\n sectionsRecord(spans, content),\n {\n root,\n yamlEnd: fence.yamlEnd,\n bodyStart,\n },\n ),\n };\n } catch (error) {\n if (error instanceof YamlError)\n return { ok: false, refusal: refuse(file, 'frontmatter-fence') };\n throw error;\n }\n}\n\nfunction splice(content: string, start: number, end: number, insert: string): string {\n return content.slice(0, start) + insert + content.slice(end);\n}\n\nfunction applyField(document: Document, name: string, value: unknown, prior: unknown): ApplyResult {\n const internal = internals.get(document);\n if (internal === undefined || internal.root === null) {\n return { outcome: 'refuse', refusal: refuse('', 'frontmatter-fence', name) };\n }\n if (!equalValue(document.fields[name], prior)) {\n return { outcome: 'stale', document };\n }\n let nextContent: string;\n const existing = mapEntry(internal.root, name);\n if (existing !== undefined) {\n nextContent = splice(\n document.content,\n existing.value.start,\n existing.value.end,\n serializeJs(value),\n );\n } else {\n const nl = lineEnding(document.content);\n const line = `${serializeKey(name)}: ${serializeJs(value)}${nl}`;\n const before = document.content.slice(0, internal.yamlEnd);\n const prefix = before.endsWith('\\n') || before.endsWith('\\r\\n') ? '' : nl;\n nextContent = splice(document.content, internal.yamlEnd, internal.yamlEnd, `${prefix}${line}`);\n }\n const parsed = parse(nextContent);\n if (!parsed.ok) return { outcome: 'refuse', refusal: parsed.refusal };\n return { outcome: 'applied', document: parsed.document };\n}\n\nfunction applySection(document: Document, name: string, value: string, prior: string): ApplyResult {\n const internal = internals.get(document);\n if (internal === undefined)\n return { outcome: 'refuse', refusal: refuse('', 'required-section', name) };\n const spans = headingSpans(document.content, internal.bodyStart);\n const span = spans.find((item) => item.name === name);\n if (span === undefined)\n return { outcome: 'refuse', refusal: refuse('', 'required-section', name) };\n const current = document.content.slice(span.bodyStart, span.bodyEnd);\n if (current !== prior) return { outcome: 'stale', document };\n const parsed = parse(splice(document.content, span.bodyStart, span.bodyEnd, value));\n if (!parsed.ok) return { outcome: 'refuse', refusal: parsed.refusal };\n return { outcome: 'applied', document: parsed.document };\n}\n\nexport function apply(document: Document, change: Change): ApplyResult {\n try {\n if (change.kind === 'field')\n return applyField(document, change.name, change.value, change.prior);\n return applySection(document, change.name, change.value, change.prior);\n } catch (error) {\n if (error instanceof YamlError) {\n return { outcome: 'refuse', refusal: refuse('', 'frontmatter-fence', change.name) };\n }\n throw error;\n }\n}\n\nexport function serialize(document: Document): string {\n return document.content;\n}\n"],"names":["headingSpans","sectionsRecord","refusal","bodyStartAfterYaml","equalValue","extractFrontmatter","jsValue","lineEnding","mapEntry","parseYamlMapping","serializeJs","serializeKey","YamlError","internals","WeakMap","refuse","file","rule","location","undefined","freezeDocument","content","type","fields","sections","internal","document","Object","freeze","set","declaredType","value","parse","fence","kind","spans","ok","root","yamlEnd","bodyStart","yamlStart","Array","isArray","record","error","splice","start","end","insert","slice","applyField","name","prior","get","outcome","nextContent","existing","nl","line","before","prefix","endsWith","parsed","applySection","span","find","item","current","bodyEnd","apply","change","serialize"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/document.ts"],"sourcesContent":["import { headingSpans, sectionsRecord } from './sections.js';\nimport { refusal } from './refuse.js';\nimport type { ApplyResult, Change, Document, ParseResult } from './types.js';\nimport {\n bodyStartAfterYaml,\n equalValue,\n extractFrontmatter,\n jsValue,\n lineEnding,\n mapEntry,\n parseYamlMapping,\n serializeJs,\n serializeKey,\n YamlError,\n type YamlMap,\n} from './yaml.js';\n\ntype Internal = {\n readonly root: YamlMap | null;\n readonly yamlEnd: number;\n readonly bodyStart: number;\n};\n\nconst internals = new WeakMap<Document, Internal>();\n\nfunction refuse(file: string, rule: string, location?: string) {\n return location === undefined ? refusal(file, rule) : refusal(file, rule, { location });\n}\n\nfunction freezeDocument(\n content: string,\n type: string | undefined,\n fields: Record<string, unknown>,\n sections: Record<string, string>,\n internal: Internal,\n): Document {\n const document: Document = Object.freeze({\n content,\n type,\n fields: Object.freeze(fields),\n sections: Object.freeze(sections),\n });\n internals.set(document, internal);\n return document;\n}\n\nfunction declaredType(fields: Record<string, unknown>): string | undefined {\n const value = fields.type;\n if (value === undefined || value === null) return undefined;\n if (typeof value !== 'string' || value === '') return undefined;\n return value;\n}\n\nexport function parse(content: string, file = ''): ParseResult {\n const fence = extractFrontmatter(content);\n if (fence.kind === 'none') {\n const spans = headingSpans(content, 0);\n return {\n ok: true,\n document: freezeDocument(content, undefined, {}, sectionsRecord(spans, content), {\n root: null,\n yamlEnd: 0,\n bodyStart: 0,\n }),\n };\n }\n if (fence.kind === 'unclosed') return { ok: false, refusal: refuse(file, 'frontmatter-fence') };\n try {\n const root = parseYamlMapping(content, fence.yamlStart, fence.yamlEnd);\n const fields = jsValue(root);\n if (fields === null || typeof fields !== 'object' || Array.isArray(fields)) {\n return { ok: false, refusal: refuse(file, 'frontmatter-fence') };\n }\n const bodyStart = bodyStartAfterYaml(content, fence.yamlEnd);\n const spans = headingSpans(content, bodyStart);\n const record = fields as Record<string, unknown>;\n return {\n ok: true,\n document: freezeDocument(\n content,\n declaredType(record),\n record,\n sectionsRecord(spans, content),\n {\n root,\n yamlEnd: fence.yamlEnd,\n bodyStart,\n },\n ),\n };\n } catch (error) {\n if (error instanceof YamlError)\n return { ok: false, refusal: refuse(file, 'frontmatter-fence') };\n throw error;\n }\n}\n\nfunction splice(content: string, start: number, end: number, insert: string): string {\n return content.slice(0, start) + insert + content.slice(end);\n}\n\nfunction applyField(document: Document, name: string, value: unknown, prior: unknown): ApplyResult {\n const internal = internals.get(document);\n if (internal === undefined || internal.root === null) {\n return { outcome: 'refuse', refusal: refuse('', 'frontmatter-fence', name) };\n }\n if (!equalValue(document.fields[name], prior)) {\n return { outcome: 'stale', document };\n }\n let nextContent: string;\n const existing = mapEntry(internal.root, name);\n if (existing !== undefined) {\n nextContent = splice(\n document.content,\n existing.value.start,\n existing.value.end,\n serializeJs(value),\n );\n } else {\n const nl = lineEnding(document.content);\n const line = `${serializeKey(name)}: ${serializeJs(value)}${nl}`;\n const before = document.content.slice(0, internal.yamlEnd);\n const prefix = before.endsWith('\\n') || before.endsWith('\\r\\n') ? '' : nl;\n nextContent = splice(document.content, internal.yamlEnd, internal.yamlEnd, `${prefix}${line}`);\n }\n const parsed = parse(nextContent);\n if (!parsed.ok) return { outcome: 'refuse', refusal: parsed.refusal };\n return { outcome: 'applied', document: parsed.document };\n}\n\nfunction applySection(document: Document, name: string, value: string, prior: string): ApplyResult {\n const internal = internals.get(document);\n if (internal === undefined)\n return { outcome: 'refuse', refusal: refuse('', 'required-section', name) };\n const spans = headingSpans(document.content, internal.bodyStart);\n const span = spans.find((item) => item.name === name);\n if (span === undefined)\n return { outcome: 'refuse', refusal: refuse('', 'required-section', name) };\n const current = document.content.slice(span.bodyStart, span.bodyEnd);\n if (current !== prior) return { outcome: 'stale', document };\n const parsed = parse(splice(document.content, span.bodyStart, span.bodyEnd, value));\n if (!parsed.ok) return { outcome: 'refuse', refusal: parsed.refusal };\n return { outcome: 'applied', document: parsed.document };\n}\n\nexport function apply(document: Document, change: Change): ApplyResult {\n try {\n if (change.kind === 'field')\n return applyField(document, change.name, change.value, change.prior);\n return applySection(document, change.name, change.value, change.prior);\n } catch (error) {\n if (error instanceof YamlError) {\n return { outcome: 'refuse', refusal: refuse('', 'frontmatter-fence', change.name) };\n }\n throw error;\n }\n}\n\nexport function serialize(document: Document): string {\n return document.content;\n}\n"],"names":["headingSpans","sectionsRecord","refusal","bodyStartAfterYaml","equalValue","extractFrontmatter","jsValue","lineEnding","mapEntry","parseYamlMapping","serializeJs","serializeKey","YamlError","internals","WeakMap","refuse","file","rule","location","undefined","freezeDocument","content","type","fields","sections","internal","document","Object","freeze","set","declaredType","value","parse","fence","kind","spans","ok","root","yamlEnd","bodyStart","yamlStart","Array","isArray","record","error","splice","start","end","insert","slice","applyField","name","prior","get","outcome","nextContent","existing","nl","line","before","prefix","endsWith","parsed","applySection","span","find","item","current","bodyEnd","apply","change","serialize"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { apply, parse, serialize } from './document.js';
2
2
  export { MARKDOWN_SYNTAX_PROFILE } from './profile.js';
3
- export type { ApplyResult, Change, Document, Library, ParseResult, Refusal, Validation, } from './types.js';
3
+ export type { ApplyResult, Change, Document, Library, ParseResult, Refusal, Validation, ValidationContext, } from './types.js';
4
4
  export { validate } from './validate.js';
5
5
  export { VERSION } from './version.js';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,YAAY,EACV,WAAW,EACX,MAAM,EACN,QAAQ,EACR,OAAO,EACP,WAAW,EACX,OAAO,EACP,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,YAAY,EACV,WAAW,EACX,MAAM,EACN,QAAQ,EACR,OAAO,EACP,WAAW,EACX,OAAO,EACP,UAAU,EACV,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/index.ts"],"sourcesContent":["export { apply, parse, serialize } from './document.js';\nexport { MARKDOWN_SYNTAX_PROFILE } from './profile.js';\nexport type {\n ApplyResult,\n Change,\n Document,\n Library,\n ParseResult,\n Refusal,\n Validation,\n} from './types.js';\nexport { validate } from './validate.js';\nexport { VERSION } from './version.js';\n"],"names":["apply","parse","serialize","MARKDOWN_SYNTAX_PROFILE","validate","VERSION"],"mappings":"AAAA,SAASA,KAAK,EAAEC,KAAK,EAAEC,SAAS,QAAQ,gBAAgB;AACxD,SAASC,uBAAuB,QAAQ,eAAe;AAUvD,SAASC,QAAQ,QAAQ,gBAAgB;AACzC,SAASC,OAAO,QAAQ,eAAe"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/index.ts"],"sourcesContent":["export { apply, parse, serialize } from './document.js';\nexport { MARKDOWN_SYNTAX_PROFILE } from './profile.js';\nexport type {\n ApplyResult,\n Change,\n Document,\n Library,\n ParseResult,\n Refusal,\n Validation,\n ValidationContext,\n} from './types.js';\nexport { validate } from './validate.js';\nexport { VERSION } from './version.js';\n"],"names":["apply","parse","serialize","MARKDOWN_SYNTAX_PROFILE","validate","VERSION"],"mappings":"AAAA,SAASA,KAAK,EAAEC,KAAK,EAAEC,SAAS,QAAQ,gBAAgB;AACxD,SAASC,uBAAuB,QAAQ,eAAe;AAWvD,SAASC,QAAQ,QAAQ,gBAAgB;AACzC,SAASC,OAAO,QAAQ,eAAe"}
package/dist/links.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/links.ts"],"sourcesContent":["function atLineStart(text: string, index: number): boolean {\n if (index === 0) return true;\n const prev = text[index - 1];\n return prev === '\\n' || prev === '\\r';\n}\n\nfunction skipFence(text: string, index: number): number {\n let i = index;\n while (i < text.length && (text[i] === ' ' || text[i] === '\\t')) i += 1;\n const marker = text.startsWith('```', i) ? '```' : text.startsWith('~~~', i) ? '~~~' : null;\n if (marker === null) return index + 1;\n i += marker.length;\n const close = text.indexOf(marker, i);\n if (close === -1) return text.length;\n return close + marker.length;\n}\n\nfunction skipInlineCode(text: string, index: number): number {\n let ticks = 0;\n while (text[index + ticks] === '`') ticks += 1;\n const close = text.indexOf('`'.repeat(ticks), index + ticks);\n if (close === -1) return text.length;\n return close + ticks;\n}\n\nfunction skipLinkSpace(text: string, start: number): number {\n let i = start;\n while (text[i] === ' ' || text[i] === '\\t') i += 1;\n return i;\n}\n\nfunction skipTitle(text: string, start: number): number | null {\n const open = text[start];\n if (open !== '\"' && open !== \"'\" && open !== '(') return start;\n const close = open === '(' ? ')' : open;\n let i = start + 1;\n while (i < text.length) {\n const ch = text[i]!;\n if (ch === close) return i + 1;\n if (ch === '\\n' || ch === '\\r') return null;\n i += 1;\n }\n return null;\n}\n\nfunction destination(text: string, start: number): { href: string; end: number } | null {\n let i = skipLinkSpace(text, start + 1);\n let href: string;\n if (text[i] === '<') {\n const close = text.indexOf('>', i + 1);\n if (close === -1) return null;\n href = text.slice(i + 1, close);\n i = close + 1;\n } else {\n const from = i;\n let depth = 0;\n while (i < text.length) {\n const ch = text[i]!;\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') break;\n if (ch === '(') depth += 1;\n else if (ch === ')') {\n if (depth === 0) break;\n depth -= 1;\n }\n i += 1;\n }\n href = text.slice(from, i);\n }\n i = skipLinkSpace(text, i);\n const afterTitle = skipTitle(text, i);\n if (afterTitle === null) return null;\n i = skipLinkSpace(text, afterTitle);\n if (text[i] !== ')') return null;\n return { href, end: i + 1 };\n}\n\nfunction takeLink(text: string, index: number, hrefs: string[], defs: Map<string, string>): number {\n let i = index + 1;\n let depth = 1;\n while (i < text.length && depth > 0) {\n const ch = text[i]!;\n if (ch === '[') depth += 1;\n else if (ch === ']') depth -= 1;\n else if (ch === '\\n' || ch === '\\r') return index + 1;\n i += 1;\n }\n if (depth !== 0) return index + 1;\n const label = text.slice(index + 1, i - 1);\n if (text[i] === '(') {\n const dest = destination(text, i);\n if (dest === null) return index + 1;\n hrefs.push(dest.href);\n return dest.end;\n }\n if (text[i] === '[') {\n const close = text.indexOf(']', i + 1);\n if (close === -1) return index + 1;\n const id = (text.slice(i + 1, close) || label).trim().toLowerCase();\n const href = defs.get(id);\n if (href !== undefined) hrefs.push(href);\n return close + 1;\n }\n return i;\n}\n\nfunction collectDefinitions(text: string): Map<string, string> {\n const defs = new Map<string, string>();\n const pattern = /^ {0,3}\\[([^\\]]+)\\]:[ \\t]+<?([^\\s>]+)>?/gm;\n for (const match of text.matchAll(pattern)) {\n const id = match[1]?.trim().toLowerCase();\n const href = match[2];\n if (id !== undefined && href !== undefined) defs.set(id, href);\n }\n return defs;\n}\n\nexport function extractRelativeHrefs(body: string): string[] {\n const defs = collectDefinitions(body);\n const hrefs: string[] = [];\n let i = 0;\n while (i < body.length) {\n if (atLineStart(body, i) || (i > 0 && (body[i - 1] === '\\n' || body[i - 1] === '\\r'))) {\n let j = i;\n while (body[j] === ' ' && j - i < 3) j += 1;\n if (body.startsWith('```', j) || body.startsWith('~~~', j)) {\n i = skipFence(body, i);\n continue;\n }\n }\n if (body[i] === '`') {\n i = skipInlineCode(body, i);\n continue;\n }\n if (body[i] === '!' && body[i + 1] === '[') {\n i = takeLink(body, i + 1, hrefs, defs);\n continue;\n }\n if (body[i] === '[') {\n i = takeLink(body, i, hrefs, defs);\n continue;\n }\n i += 1;\n }\n return hrefs;\n}\n"],"names":["atLineStart","text","index","prev","skipFence","i","length","marker","startsWith","close","indexOf","skipInlineCode","ticks","repeat","skipLinkSpace","start","skipTitle","open","ch","destination","href","slice","from","depth","afterTitle","end","takeLink","hrefs","defs","label","dest","push","id","trim","toLowerCase","get","undefined","collectDefinitions","Map","pattern","match","matchAll","set","extractRelativeHrefs","body","j"],"mappings":"AAAA,SAASA,YAAYC,IAAY,EAAEC,KAAa;IAC9C,IAAIA,UAAU,GAAG,OAAO;IACxB,MAAMC,OAAOF,IAAI,CAACC,QAAQ,EAAE;IAC5B,OAAOC,SAAS,QAAQA,SAAS;AACnC;AAEA,SAASC,UAAUH,IAAY,EAAEC,KAAa;IAC5C,IAAIG,IAAIH;IACR,MAAOG,IAAIJ,KAAKK,MAAM,IAAKL,CAAAA,IAAI,CAACI,EAAE,KAAK,OAAOJ,IAAI,CAACI,EAAE,KAAK,IAAG,EAAIA,KAAK;IACtE,MAAME,SAASN,KAAKO,UAAU,CAAC,OAAOH,KAAK,QAAQJ,KAAKO,UAAU,CAAC,OAAOH,KAAK,QAAQ;IACvF,IAAIE,WAAW,MAAM,OAAOL,QAAQ;IACpCG,KAAKE,OAAOD,MAAM;IAClB,MAAMG,QAAQR,KAAKS,OAAO,CAACH,QAAQF;IACnC,IAAII,UAAU,CAAC,GAAG,OAAOR,KAAKK,MAAM;IACpC,OAAOG,QAAQF,OAAOD,MAAM;AAC9B;AAEA,SAASK,eAAeV,IAAY,EAAEC,KAAa;IACjD,IAAIU,QAAQ;IACZ,MAAOX,IAAI,CAACC,QAAQU,MAAM,KAAK,IAAKA,SAAS;IAC7C,MAAMH,QAAQR,KAAKS,OAAO,CAAC,IAAIG,MAAM,CAACD,QAAQV,QAAQU;IACtD,IAAIH,UAAU,CAAC,GAAG,OAAOR,KAAKK,MAAM;IACpC,OAAOG,QAAQG;AACjB;AAEA,SAASE,cAAcb,IAAY,EAAEc,KAAa;IAChD,IAAIV,IAAIU;IACR,MAAOd,IAAI,CAACI,EAAE,KAAK,OAAOJ,IAAI,CAACI,EAAE,KAAK,KAAMA,KAAK;IACjD,OAAOA;AACT;AAEA,SAASW,UAAUf,IAAY,EAAEc,KAAa;IAC5C,MAAME,OAAOhB,IAAI,CAACc,MAAM;IACxB,IAAIE,SAAS,OAAOA,SAAS,OAAOA,SAAS,KAAK,OAAOF;IACzD,MAAMN,QAAQQ,SAAS,MAAM,MAAMA;IACnC,IAAIZ,IAAIU,QAAQ;IAChB,MAAOV,IAAIJ,KAAKK,MAAM,CAAE;QACtB,MAAMY,KAAKjB,IAAI,CAACI,EAAE;QAClB,IAAIa,OAAOT,OAAO,OAAOJ,IAAI;QAC7B,IAAIa,OAAO,QAAQA,OAAO,MAAM,OAAO;QACvCb,KAAK;IACP;IACA,OAAO;AACT;AAEA,SAASc,YAAYlB,IAAY,EAAEc,KAAa;IAC9C,IAAIV,IAAIS,cAAcb,MAAMc,QAAQ;IACpC,IAAIK;IACJ,IAAInB,IAAI,CAACI,EAAE,KAAK,KAAK;QACnB,MAAMI,QAAQR,KAAKS,OAAO,CAAC,KAAKL,IAAI;QACpC,IAAII,UAAU,CAAC,GAAG,OAAO;QACzBW,OAAOnB,KAAKoB,KAAK,CAAChB,IAAI,GAAGI;QACzBJ,IAAII,QAAQ;IACd,OAAO;QACL,MAAMa,OAAOjB;QACb,IAAIkB,QAAQ;QACZ,MAAOlB,IAAIJ,KAAKK,MAAM,CAAE;YACtB,MAAMY,KAAKjB,IAAI,CAACI,EAAE;YAClB,IAAIa,OAAO,OAAOA,OAAO,QAAQA,OAAO,QAAQA,OAAO,MAAM;YAC7D,IAAIA,OAAO,KAAKK,SAAS;iBACpB,IAAIL,OAAO,KAAK;gBACnB,IAAIK,UAAU,GAAG;gBACjBA,SAAS;YACX;YACAlB,KAAK;QACP;QACAe,OAAOnB,KAAKoB,KAAK,CAACC,MAAMjB;IAC1B;IACAA,IAAIS,cAAcb,MAAMI;IACxB,MAAMmB,aAAaR,UAAUf,MAAMI;IACnC,IAAImB,eAAe,MAAM,OAAO;IAChCnB,IAAIS,cAAcb,MAAMuB;IACxB,IAAIvB,IAAI,CAACI,EAAE,KAAK,KAAK,OAAO;IAC5B,OAAO;QAAEe;QAAMK,KAAKpB,IAAI;IAAE;AAC5B;AAEA,SAASqB,SAASzB,IAAY,EAAEC,KAAa,EAAEyB,KAAe,EAAEC,IAAyB;IACvF,IAAIvB,IAAIH,QAAQ;IAChB,IAAIqB,QAAQ;IACZ,MAAOlB,IAAIJ,KAAKK,MAAM,IAAIiB,QAAQ,EAAG;QACnC,MAAML,KAAKjB,IAAI,CAACI,EAAE;QAClB,IAAIa,OAAO,KAAKK,SAAS;aACpB,IAAIL,OAAO,KAAKK,SAAS;aACzB,IAAIL,OAAO,QAAQA,OAAO,MAAM,OAAOhB,QAAQ;QACpDG,KAAK;IACP;IACA,IAAIkB,UAAU,GAAG,OAAOrB,QAAQ;IAChC,MAAM2B,QAAQ5B,KAAKoB,KAAK,CAACnB,QAAQ,GAAGG,IAAI;IACxC,IAAIJ,IAAI,CAACI,EAAE,KAAK,KAAK;QACnB,MAAMyB,OAAOX,YAAYlB,MAAMI;QAC/B,IAAIyB,SAAS,MAAM,OAAO5B,QAAQ;QAClCyB,MAAMI,IAAI,CAACD,KAAKV,IAAI;QACpB,OAAOU,KAAKL,GAAG;IACjB;IACA,IAAIxB,IAAI,CAACI,EAAE,KAAK,KAAK;QACnB,MAAMI,QAAQR,KAAKS,OAAO,CAAC,KAAKL,IAAI;QACpC,IAAII,UAAU,CAAC,GAAG,OAAOP,QAAQ;QACjC,MAAM8B,KAAK,AAAC/B,CAAAA,KAAKoB,KAAK,CAAChB,IAAI,GAAGI,UAAUoB,KAAI,EAAGI,IAAI,GAAGC,WAAW;QACjE,MAAMd,OAAOQ,KAAKO,GAAG,CAACH;QACtB,IAAIZ,SAASgB,WAAWT,MAAMI,IAAI,CAACX;QACnC,OAAOX,QAAQ;IACjB;IACA,OAAOJ;AACT;AAEA,SAASgC,mBAAmBpC,IAAY;IACtC,MAAM2B,OAAO,IAAIU;IACjB,MAAMC,UAAU;IAChB,KAAK,MAAMC,SAASvC,KAAKwC,QAAQ,CAACF,SAAU;QAC1C,MAAMP,KAAKQ,KAAK,CAAC,EAAE,EAAEP,OAAOC;QAC5B,MAAMd,OAAOoB,KAAK,CAAC,EAAE;QACrB,IAAIR,OAAOI,aAAahB,SAASgB,WAAWR,KAAKc,GAAG,CAACV,IAAIZ;IAC3D;IACA,OAAOQ;AACT;AAEA,OAAO,SAASe,qBAAqBC,IAAY;IAC/C,MAAMhB,OAAOS,mBAAmBO;IAChC,MAAMjB,QAAkB,EAAE;IAC1B,IAAItB,IAAI;IACR,MAAOA,IAAIuC,KAAKtC,MAAM,CAAE;QACtB,IAAIN,YAAY4C,MAAMvC,MAAOA,IAAI,KAAMuC,CAAAA,IAAI,CAACvC,IAAI,EAAE,KAAK,QAAQuC,IAAI,CAACvC,IAAI,EAAE,KAAK,IAAG,GAAK;YACrF,IAAIwC,IAAIxC;YACR,MAAOuC,IAAI,CAACC,EAAE,KAAK,OAAOA,IAAIxC,IAAI,EAAGwC,KAAK;YAC1C,IAAID,KAAKpC,UAAU,CAAC,OAAOqC,MAAMD,KAAKpC,UAAU,CAAC,OAAOqC,IAAI;gBAC1DxC,IAAID,UAAUwC,MAAMvC;gBACpB;YACF;QACF;QACA,IAAIuC,IAAI,CAACvC,EAAE,KAAK,KAAK;YACnBA,IAAIM,eAAeiC,MAAMvC;YACzB;QACF;QACA,IAAIuC,IAAI,CAACvC,EAAE,KAAK,OAAOuC,IAAI,CAACvC,IAAI,EAAE,KAAK,KAAK;YAC1CA,IAAIqB,SAASkB,MAAMvC,IAAI,GAAGsB,OAAOC;YACjC;QACF;QACA,IAAIgB,IAAI,CAACvC,EAAE,KAAK,KAAK;YACnBA,IAAIqB,SAASkB,MAAMvC,GAAGsB,OAAOC;YAC7B;QACF;QACAvB,KAAK;IACP;IACA,OAAOsB;AACT"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/links.ts"],"sourcesContent":["function atLineStart(text: string, index: number): boolean {\n if (index === 0) return true;\n const prev = text[index - 1];\n return prev === '\\n' || prev === '\\r';\n}\n\nfunction skipFence(text: string, index: number): number {\n let i = index;\n while (i < text.length && (text[i] === ' ' || text[i] === '\\t')) i += 1;\n const marker = text.startsWith('```', i) ? '```' : text.startsWith('~~~', i) ? '~~~' : null;\n if (marker === null) return index + 1;\n i += marker.length;\n const close = text.indexOf(marker, i);\n if (close === -1) return text.length;\n return close + marker.length;\n}\n\nfunction skipInlineCode(text: string, index: number): number {\n let ticks = 0;\n while (text[index + ticks] === '`') ticks += 1;\n const close = text.indexOf('`'.repeat(ticks), index + ticks);\n if (close === -1) return text.length;\n return close + ticks;\n}\n\nfunction skipLinkSpace(text: string, start: number): number {\n let i = start;\n while (text[i] === ' ' || text[i] === '\\t') i += 1;\n return i;\n}\n\nfunction skipTitle(text: string, start: number): number | null {\n const open = text[start];\n if (open !== '\"' && open !== \"'\" && open !== '(') return start;\n const close = open === '(' ? ')' : open;\n let i = start + 1;\n while (i < text.length) {\n const ch = text[i]!;\n if (ch === close) return i + 1;\n if (ch === '\\n' || ch === '\\r') return null;\n i += 1;\n }\n return null;\n}\n\nfunction destination(text: string, start: number): { href: string; end: number } | null {\n let i = skipLinkSpace(text, start + 1);\n let href: string;\n if (text[i] === '<') {\n const close = text.indexOf('>', i + 1);\n if (close === -1) return null;\n href = text.slice(i + 1, close);\n i = close + 1;\n } else {\n const from = i;\n let depth = 0;\n while (i < text.length) {\n const ch = text[i]!;\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') break;\n if (ch === '(') depth += 1;\n else if (ch === ')') {\n if (depth === 0) break;\n depth -= 1;\n }\n i += 1;\n }\n href = text.slice(from, i);\n }\n i = skipLinkSpace(text, i);\n const afterTitle = skipTitle(text, i);\n if (afterTitle === null) return null;\n i = skipLinkSpace(text, afterTitle);\n if (text[i] !== ')') return null;\n return { href, end: i + 1 };\n}\n\nfunction takeLink(text: string, index: number, hrefs: string[], defs: Map<string, string>): number {\n let i = index + 1;\n let depth = 1;\n while (i < text.length && depth > 0) {\n const ch = text[i]!;\n if (ch === '[') depth += 1;\n else if (ch === ']') depth -= 1;\n else if (ch === '\\n' || ch === '\\r') return index + 1;\n i += 1;\n }\n if (depth !== 0) return index + 1;\n const label = text.slice(index + 1, i - 1);\n if (text[i] === '(') {\n const dest = destination(text, i);\n if (dest === null) return index + 1;\n hrefs.push(dest.href);\n return dest.end;\n }\n if (text[i] === '[') {\n const close = text.indexOf(']', i + 1);\n if (close === -1) return index + 1;\n const id = (text.slice(i + 1, close) || label).trim().toLowerCase();\n const href = defs.get(id);\n if (href !== undefined) hrefs.push(href);\n return close + 1;\n }\n return i;\n}\n\nfunction collectDefinitions(text: string): Map<string, string> {\n const defs = new Map<string, string>();\n const pattern = /^ {0,3}\\[([^\\]]+)\\]:[ \\t]+<?([^\\s>]+)>?/gm;\n for (const match of text.matchAll(pattern)) {\n const id = match[1]?.trim().toLowerCase();\n const href = match[2];\n if (id !== undefined && href !== undefined) defs.set(id, href);\n }\n return defs;\n}\n\nexport function extractRelativeHrefs(body: string): string[] {\n const defs = collectDefinitions(body);\n const hrefs: string[] = [];\n let i = 0;\n while (i < body.length) {\n if (atLineStart(body, i) || (i > 0 && (body[i - 1] === '\\n' || body[i - 1] === '\\r'))) {\n let j = i;\n while (body[j] === ' ' && j - i < 3) j += 1;\n if (body.startsWith('```', j) || body.startsWith('~~~', j)) {\n i = skipFence(body, i);\n continue;\n }\n }\n if (body[i] === '`') {\n i = skipInlineCode(body, i);\n continue;\n }\n if (body[i] === '!' && body[i + 1] === '[') {\n i = takeLink(body, i + 1, hrefs, defs);\n continue;\n }\n if (body[i] === '[') {\n i = takeLink(body, i, hrefs, defs);\n continue;\n }\n i += 1;\n }\n return hrefs;\n}\n"],"names":["atLineStart","text","index","prev","skipFence","i","length","marker","startsWith","close","indexOf","skipInlineCode","ticks","repeat","skipLinkSpace","start","skipTitle","open","ch","destination","href","slice","from","depth","afterTitle","end","takeLink","hrefs","defs","label","dest","push","id","trim","toLowerCase","get","undefined","collectDefinitions","Map","pattern","match","matchAll","set","extractRelativeHrefs","body","j"],"mappings":"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"}
package/dist/paths.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/paths.ts"],"sourcesContent":["export function dirname(path: string): string {\n const index = path.lastIndexOf('/');\n return index === -1 ? '' : path.slice(0, index);\n}\n\nexport function join(base: string, relative: string): string {\n if (base === '') return relative;\n return `${base}/${relative}`;\n}\n\nexport function normalize(path: string): string | null {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') {\n if (parts.length === 0) return null;\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n return parts.join('/');\n}\n\nexport function isTypesPath(path: string): boolean {\n return path === 'types' || path.startsWith('types/');\n}\n\nexport function typeNameFromPath(path: string): string {\n const base = path.slice(path.lastIndexOf('/') + 1);\n return base.endsWith('.md') ? base.slice(0, -3) : base;\n}\n\nexport function classifyHref(\n from: string,\n href: string,\n): { kind: 'skip' } | { kind: 'path'; path: string } | { kind: 'invalid' } {\n const trimmed = href.trim();\n if (trimmed === '' || trimmed.startsWith('#')) return { kind: 'skip' };\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) return { kind: 'skip' };\n if (trimmed.startsWith('/')) return { kind: 'invalid' };\n const bare = trimmed.replace(/[?#].*$/, '');\n if (bare === '') return { kind: 'skip' };\n const resolved = normalize(join(dirname(from), bare));\n if (resolved === null || resolved === '') return { kind: 'invalid' };\n return { kind: 'path', path: resolved };\n}\n"],"names":["dirname","path","index","lastIndexOf","slice","join","base","relative","normalize","parts","part","split","length","pop","push","isTypesPath","startsWith","typeNameFromPath","endsWith","classifyHref","from","href","trimmed","trim","kind","test","bare","replace","resolved"],"mappings":"AAAA,OAAO,SAASA,QAAQC,IAAY;IAClC,MAAMC,QAAQD,KAAKE,WAAW,CAAC;IAC/B,OAAOD,UAAU,CAAC,IAAI,KAAKD,KAAKG,KAAK,CAAC,GAAGF;AAC3C;AAEA,OAAO,SAASG,KAAKC,IAAY,EAAEC,QAAgB;IACjD,IAAID,SAAS,IAAI,OAAOC;IACxB,OAAO,GAAGD,KAAK,CAAC,EAAEC,UAAU;AAC9B;AAEA,OAAO,SAASC,UAAUP,IAAY;IACpC,MAAMQ,QAAkB,EAAE;IAC1B,KAAK,MAAMC,QAAQT,KAAKU,KAAK,CAAC,KAAM;QAClC,IAAID,SAAS,MAAMA,SAAS,KAAK;QACjC,IAAIA,SAAS,MAAM;YACjB,IAAID,MAAMG,MAAM,KAAK,GAAG,OAAO;YAC/BH,MAAMI,GAAG;YACT;QACF;QACAJ,MAAMK,IAAI,CAACJ;IACb;IACA,OAAOD,MAAMJ,IAAI,CAAC;AACpB;AAEA,OAAO,SAASU,YAAYd,IAAY;IACtC,OAAOA,SAAS,WAAWA,KAAKe,UAAU,CAAC;AAC7C;AAEA,OAAO,SAASC,iBAAiBhB,IAAY;IAC3C,MAAMK,OAAOL,KAAKG,KAAK,CAACH,KAAKE,WAAW,CAAC,OAAO;IAChD,OAAOG,KAAKY,QAAQ,CAAC,SAASZ,KAAKF,KAAK,CAAC,GAAG,CAAC,KAAKE;AACpD;AAEA,OAAO,SAASa,aACdC,IAAY,EACZC,IAAY;IAEZ,MAAMC,UAAUD,KAAKE,IAAI;IACzB,IAAID,YAAY,MAAMA,QAAQN,UAAU,CAAC,MAAM,OAAO;QAAEQ,MAAM;IAAO;IACrE,IAAI,4BAA4BC,IAAI,CAACH,UAAU,OAAO;QAAEE,MAAM;IAAO;IACrE,IAAIF,QAAQN,UAAU,CAAC,MAAM,OAAO;QAAEQ,MAAM;IAAU;IACtD,MAAME,OAAOJ,QAAQK,OAAO,CAAC,WAAW;IACxC,IAAID,SAAS,IAAI,OAAO;QAAEF,MAAM;IAAO;IACvC,MAAMI,WAAWpB,UAAUH,KAAKL,QAAQoB,OAAOM;IAC/C,IAAIE,aAAa,QAAQA,aAAa,IAAI,OAAO;QAAEJ,MAAM;IAAU;IACnE,OAAO;QAAEA,MAAM;QAAQvB,MAAM2B;IAAS;AACxC"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/paths.ts"],"sourcesContent":["export function dirname(path: string): string {\n const index = path.lastIndexOf('/');\n return index === -1 ? '' : path.slice(0, index);\n}\n\nexport function join(base: string, relative: string): string {\n if (base === '') return relative;\n return `${base}/${relative}`;\n}\n\nexport function normalize(path: string): string | null {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') {\n if (parts.length === 0) return null;\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n return parts.join('/');\n}\n\nexport function isTypesPath(path: string): boolean {\n return path === 'types' || path.startsWith('types/');\n}\n\nexport function typeNameFromPath(path: string): string {\n const base = path.slice(path.lastIndexOf('/') + 1);\n return base.endsWith('.md') ? base.slice(0, -3) : base;\n}\n\nexport function classifyHref(\n from: string,\n href: string,\n): { kind: 'skip' } | { kind: 'path'; path: string } | { kind: 'invalid' } {\n const trimmed = href.trim();\n if (trimmed === '' || trimmed.startsWith('#')) return { kind: 'skip' };\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) return { kind: 'skip' };\n if (trimmed.startsWith('/')) return { kind: 'invalid' };\n const bare = trimmed.replace(/[?#].*$/, '');\n if (bare === '') return { kind: 'skip' };\n const resolved = normalize(join(dirname(from), bare));\n if (resolved === null || resolved === '') return { kind: 'invalid' };\n return { kind: 'path', path: resolved };\n}\n"],"names":["dirname","path","index","lastIndexOf","slice","join","base","relative","normalize","parts","part","split","length","pop","push","isTypesPath","startsWith","typeNameFromPath","endsWith","classifyHref","from","href","trimmed","trim","kind","test","bare","replace","resolved"],"mappings":"AAAA,OAAO,SAASA,QAAQC,IAAY;IAClC,MAAMC,QAAQD,KAAKE,WAAW,CAAC;IAC/B,OAAOD,UAAU,CAAC,IAAI,KAAKD,KAAKG,KAAK,CAAC,GAAGF;AAC3C;AAEA,OAAO,SAASG,KAAKC,IAAY,EAAEC,QAAgB;IACjD,IAAID,SAAS,IAAI,OAAOC;IACxB,OAAO,GAAGD,KAAK,CAAC,EAAEC,UAAU;AAC9B;AAEA,OAAO,SAASC,UAAUP,IAAY;IACpC,MAAMQ,QAAkB,EAAE;IAC1B,KAAK,MAAMC,QAAQT,KAAKU,KAAK,CAAC,KAAM;QAClC,IAAID,SAAS,MAAMA,SAAS,KAAK;QACjC,IAAIA,SAAS,MAAM;YACjB,IAAID,MAAMG,MAAM,KAAK,GAAG,OAAO;YAC/BH,MAAMI,GAAG;YACT;QACF;QACAJ,MAAMK,IAAI,CAACJ;IACb;IACA,OAAOD,MAAMJ,IAAI,CAAC;AACpB;AAEA,OAAO,SAASU,YAAYd,IAAY;IACtC,OAAOA,SAAS,WAAWA,KAAKe,UAAU,CAAC;AAC7C;AAEA,OAAO,SAASC,iBAAiBhB,IAAY;IAC3C,MAAMK,OAAOL,KAAKG,KAAK,CAACH,KAAKE,WAAW,CAAC,OAAO;IAChD,OAAOG,KAAKY,QAAQ,CAAC,SAASZ,KAAKF,KAAK,CAAC,GAAG,CAAC,KAAKE;AACpD;AAEA,OAAO,SAASa,aACdC,IAAY,EACZC,IAAY;IAEZ,MAAMC,UAAUD,KAAKE,IAAI;IACzB,IAAID,YAAY,MAAMA,QAAQN,UAAU,CAAC,MAAM,OAAO;QAAEQ,MAAM;IAAO;IACrE,IAAI,4BAA4BC,IAAI,CAACH,UAAU,OAAO;QAAEE,MAAM;IAAO;IACrE,IAAIF,QAAQN,UAAU,CAAC,MAAM,OAAO;QAAEQ,MAAM;IAAU;IACtD,MAAME,OAAOJ,QAAQK,OAAO,CAAC,WAAW;IACxC,IAAID,SAAS,IAAI,OAAO;QAAEF,MAAM;IAAO;IACvC,MAAMI,WAAWpB,UAAUH,KAAKL,QAAQoB,OAAOM;IAC/C,IAAIE,aAAa,QAAQA,aAAa,IAAI,OAAO;QAAEJ,MAAM;IAAU;IACnE,OAAO;QAAEA,MAAM;QAAQvB,MAAM2B;IAAS;AACxC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/profile.ts"],"sourcesContent":["export const MARKDOWN_SYNTAX_PROFILE = {\n name: 'GitHub Flavored Markdown',\n spec: '0.29',\n url: 'https://github.github.com/gfm/',\n} as const;\n"],"names":["MARKDOWN_SYNTAX_PROFILE","name","spec","url"],"mappings":"AAAA,OAAO,MAAMA,0BAA0B;IACrCC,MAAM;IACNC,MAAM;IACNC,KAAK;AACP,EAAW"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/profile.ts"],"sourcesContent":["export const MARKDOWN_SYNTAX_PROFILE = {\n name: 'GitHub Flavored Markdown',\n spec: '0.29',\n url: 'https://github.github.com/gfm/',\n} as const;\n"],"names":["MARKDOWN_SYNTAX_PROFILE","name","spec","url"],"mappings":"AAAA,OAAO,MAAMA,0BAA0B;IACrCC,MAAM;IACNC,MAAM;IACNC,KAAK;AACP,EAAW"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/refuse.ts"],"sourcesContent":["import type { Refusal } from './types.js';\nimport { VERSION } from './version.js';\n\nexport function refusal(\n file: string,\n rule: string,\n extra?: { location?: string; referrers?: readonly string[] },\n): Refusal {\n return {\n file,\n rule,\n version: VERSION,\n ...(extra?.location === undefined ? {} : { location: extra.location }),\n ...(extra?.referrers === undefined ? {} : { referrers: extra.referrers }),\n };\n}\n"],"names":["VERSION","refusal","file","rule","extra","version","location","undefined","referrers"],"mappings":"AACA,SAASA,OAAO,QAAQ,eAAe;AAEvC,OAAO,SAASC,QACdC,IAAY,EACZC,IAAY,EACZC,KAA4D;IAE5D,OAAO;QACLF;QACAC;QACAE,SAASL;QACT,GAAII,OAAOE,aAAaC,YAAY,CAAC,IAAI;YAAED,UAAUF,MAAME,QAAQ;QAAC,CAAC;QACrE,GAAIF,OAAOI,cAAcD,YAAY,CAAC,IAAI;YAAEC,WAAWJ,MAAMI,SAAS;QAAC,CAAC;IAC1E;AACF"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/refuse.ts"],"sourcesContent":["import type { Refusal } from './types.js';\nimport { VERSION } from './version.js';\n\nexport function refusal(\n file: string,\n rule: string,\n extra?: { location?: string; referrers?: readonly string[] },\n): Refusal {\n return {\n file,\n rule,\n version: VERSION,\n ...(extra?.location === undefined ? {} : { location: extra.location }),\n ...(extra?.referrers === undefined ? {} : { referrers: extra.referrers }),\n };\n}\n"],"names":["VERSION","refusal","file","rule","extra","version","location","undefined","referrers"],"mappings":"AACA,SAASA,OAAO,QAAQ,eAAe;AAEvC,OAAO,SAASC,QACdC,IAAY,EACZC,IAAY,EACZC,KAA4D;IAE5D,OAAO;QACLF;QACAC;QACAE,SAASL;QACT,GAAII,OAAOE,aAAaC,YAAY,CAAC,IAAI;YAAED,UAAUF,MAAME,QAAQ;QAAC,CAAC;QACrE,GAAIF,OAAOI,cAAcD,YAAY,CAAC,IAAI;YAAEC,WAAWJ,MAAMI,SAAS;QAAC,CAAC;IAC1E;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/schema.ts"],"sourcesContent":["import { Ajv, type ErrorObject } from 'ajv';\nimport formatsPlugin from 'ajv-formats';\nimport type { FieldSpec, ScalarSpec } from './definition.js';\n\nconst addFormats = formatsPlugin as unknown as (validator: Ajv, names?: string[]) => Ajv;\nconst ajv = new Ajv({ allErrors: true, strict: false, validateFormats: true });\naddFormats(ajv, ['date']);\n\nfunction scalarSchema(spec: ScalarSpec): Record<string, unknown> {\n if (spec.kind === 'string' || spec.kind === 'reference') return { type: 'string' };\n if (spec.kind === 'number') return { type: 'number' };\n if (spec.kind === 'date') return { type: 'string', format: 'date' };\n return { type: 'string', enum: [...spec.values] };\n}\n\nfunction fieldSchema(spec: FieldSpec): Record<string, unknown> {\n if (spec.kind === 'list') return { type: 'array', items: scalarSchema(spec.of) };\n return scalarSchema(spec);\n}\n\nfunction ruleFor(error: ErrorObject): 'required-field' | 'field-enum' | 'field-kind' {\n if (error.keyword === 'required') return 'required-field';\n if (error.keyword === 'enum') return 'field-enum';\n return 'field-kind';\n}\n\nfunction locationFor(error: ErrorObject): string {\n if (error.keyword === 'required' && typeof error.params.missingProperty === 'string') {\n return error.params.missingProperty;\n }\n const path = error.instancePath.replace(/^\\//, '').split('/');\n return path[0] ?? '';\n}\n\nexport function validateFields(\n fields: Readonly<Record<string, FieldSpec>>,\n values: Readonly<Record<string, unknown>>,\n): { field: string; rule: 'required-field' | 'field-enum' | 'field-kind' } | undefined {\n const properties: Record<string, Record<string, unknown>> = {};\n const required: string[] = [];\n for (const [name, spec] of Object.entries(fields)) {\n properties[name] = fieldSchema(spec);\n if (spec.required) required.push(name);\n }\n const validate = ajv.compile({\n type: 'object',\n properties,\n required,\n additionalProperties: true,\n });\n if (validate(values)) return undefined;\n const error = validate.errors![0]!;\n return { field: locationFor(error), rule: ruleFor(error) };\n}\n"],"names":["Ajv","formatsPlugin","addFormats","ajv","allErrors","strict","validateFormats","scalarSchema","spec","kind","type","format","enum","values","fieldSchema","items","of","ruleFor","error","keyword","locationFor","params","missingProperty","path","instancePath","replace","split","validateFields","fields","properties","required","name","Object","entries","push","validate","compile","additionalProperties","undefined","errors","field","rule"],"mappings":"AAAA,SAASA,GAAG,QAA0B,MAAM;AAC5C,OAAOC,mBAAmB,cAAc;AAGxC,MAAMC,aAAaD;AACnB,MAAME,MAAM,IAAIH,IAAI;IAAEI,WAAW;IAAMC,QAAQ;IAAOC,iBAAiB;AAAK;AAC5EJ,WAAWC,KAAK;IAAC;CAAO;AAExB,SAASI,aAAaC,IAAgB;IACpC,IAAIA,KAAKC,IAAI,KAAK,YAAYD,KAAKC,IAAI,KAAK,aAAa,OAAO;QAAEC,MAAM;IAAS;IACjF,IAAIF,KAAKC,IAAI,KAAK,UAAU,OAAO;QAAEC,MAAM;IAAS;IACpD,IAAIF,KAAKC,IAAI,KAAK,QAAQ,OAAO;QAAEC,MAAM;QAAUC,QAAQ;IAAO;IAClE,OAAO;QAAED,MAAM;QAAUE,MAAM;eAAIJ,KAAKK,MAAM;SAAC;IAAC;AAClD;AAEA,SAASC,YAAYN,IAAe;IAClC,IAAIA,KAAKC,IAAI,KAAK,QAAQ,OAAO;QAAEC,MAAM;QAASK,OAAOR,aAAaC,KAAKQ,EAAE;IAAE;IAC/E,OAAOT,aAAaC;AACtB;AAEA,SAASS,QAAQC,KAAkB;IACjC,IAAIA,MAAMC,OAAO,KAAK,YAAY,OAAO;IACzC,IAAID,MAAMC,OAAO,KAAK,QAAQ,OAAO;IACrC,OAAO;AACT;AAEA,SAASC,YAAYF,KAAkB;IACrC,IAAIA,MAAMC,OAAO,KAAK,cAAc,OAAOD,MAAMG,MAAM,CAACC,eAAe,KAAK,UAAU;QACpF,OAAOJ,MAAMG,MAAM,CAACC,eAAe;IACrC;IACA,MAAMC,OAAOL,MAAMM,YAAY,CAACC,OAAO,CAAC,OAAO,IAAIC,KAAK,CAAC;IACzD,OAAOH,IAAI,CAAC,EAAE,IAAI;AACpB;AAEA,OAAO,SAASI,eACdC,MAA2C,EAC3Cf,MAAyC;IAEzC,MAAMgB,aAAsD,CAAC;IAC7D,MAAMC,WAAqB,EAAE;IAC7B,KAAK,MAAM,CAACC,MAAMvB,KAAK,IAAIwB,OAAOC,OAAO,CAACL,QAAS;QACjDC,UAAU,CAACE,KAAK,GAAGjB,YAAYN;QAC/B,IAAIA,KAAKsB,QAAQ,EAAEA,SAASI,IAAI,CAACH;IACnC;IACA,MAAMI,WAAWhC,IAAIiC,OAAO,CAAC;QAC3B1B,MAAM;QACNmB;QACAC;QACAO,sBAAsB;IACxB;IACA,IAAIF,SAAStB,SAAS,OAAOyB;IAC7B,MAAMpB,QAAQiB,SAASI,MAAM,AAAC,CAAC,EAAE;IACjC,OAAO;QAAEC,OAAOpB,YAAYF;QAAQuB,MAAMxB,QAAQC;IAAO;AAC3D"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/schema.ts"],"sourcesContent":["import { Ajv, type ErrorObject } from 'ajv';\nimport formatsPlugin from 'ajv-formats';\nimport type { FieldSpec, ScalarSpec } from './definition.js';\n\nconst addFormats = formatsPlugin as unknown as (validator: Ajv, names?: string[]) => Ajv;\nconst ajv = new Ajv({ allErrors: true, strict: false, validateFormats: true });\naddFormats(ajv, ['date']);\n\nfunction scalarSchema(spec: ScalarSpec): Record<string, unknown> {\n if (spec.kind === 'string' || spec.kind === 'reference') return { type: 'string' };\n if (spec.kind === 'number') return { type: 'number' };\n if (spec.kind === 'date') return { type: 'string', format: 'date' };\n return { type: 'string', enum: [...spec.values] };\n}\n\nfunction fieldSchema(spec: FieldSpec): Record<string, unknown> {\n if (spec.kind === 'list') return { type: 'array', items: scalarSchema(spec.of) };\n return scalarSchema(spec);\n}\n\nfunction ruleFor(error: ErrorObject): 'required-field' | 'field-enum' | 'field-kind' {\n if (error.keyword === 'required') return 'required-field';\n if (error.keyword === 'enum') return 'field-enum';\n return 'field-kind';\n}\n\nfunction locationFor(error: ErrorObject): string {\n if (error.keyword === 'required' && typeof error.params.missingProperty === 'string') {\n return error.params.missingProperty;\n }\n const path = error.instancePath.replace(/^\\//, '').split('/');\n return path[0] ?? '';\n}\n\nexport function validateFields(\n fields: Readonly<Record<string, FieldSpec>>,\n values: Readonly<Record<string, unknown>>,\n): { field: string; rule: 'required-field' | 'field-enum' | 'field-kind' } | undefined {\n const properties: Record<string, Record<string, unknown>> = {};\n const required: string[] = [];\n for (const [name, spec] of Object.entries(fields)) {\n properties[name] = fieldSchema(spec);\n if (spec.required) required.push(name);\n }\n const validate = ajv.compile({\n type: 'object',\n properties,\n required,\n additionalProperties: true,\n });\n if (validate(values)) return undefined;\n const error = validate.errors![0]!;\n return { field: locationFor(error), rule: ruleFor(error) };\n}\n"],"names":["Ajv","formatsPlugin","addFormats","ajv","allErrors","strict","validateFormats","scalarSchema","spec","kind","type","format","enum","values","fieldSchema","items","of","ruleFor","error","keyword","locationFor","params","missingProperty","path","instancePath","replace","split","validateFields","fields","properties","required","name","Object","entries","push","validate","compile","additionalProperties","undefined","errors","field","rule"],"mappings":"AAAA,SAASA,GAAG,QAA0B,MAAM;AAC5C,OAAOC,mBAAmB,cAAc;AAGxC,MAAMC,aAAaD;AACnB,MAAME,MAAM,IAAIH,IAAI;IAAEI,WAAW;IAAMC,QAAQ;IAAOC,iBAAiB;AAAK;AAC5EJ,WAAWC,KAAK;IAAC;CAAO;AAExB,SAASI,aAAaC,IAAgB;IACpC,IAAIA,KAAKC,IAAI,KAAK,YAAYD,KAAKC,IAAI,KAAK,aAAa,OAAO;QAAEC,MAAM;IAAS;IACjF,IAAIF,KAAKC,IAAI,KAAK,UAAU,OAAO;QAAEC,MAAM;IAAS;IACpD,IAAIF,KAAKC,IAAI,KAAK,QAAQ,OAAO;QAAEC,MAAM;QAAUC,QAAQ;IAAO;IAClE,OAAO;QAAED,MAAM;QAAUE,MAAM;eAAIJ,KAAKK,MAAM;SAAC;IAAC;AAClD;AAEA,SAASC,YAAYN,IAAe;IAClC,IAAIA,KAAKC,IAAI,KAAK,QAAQ,OAAO;QAAEC,MAAM;QAASK,OAAOR,aAAaC,KAAKQ,EAAE;IAAE;IAC/E,OAAOT,aAAaC;AACtB;AAEA,SAASS,QAAQC,KAAkB;IACjC,IAAIA,MAAMC,OAAO,KAAK,YAAY,OAAO;IACzC,IAAID,MAAMC,OAAO,KAAK,QAAQ,OAAO;IACrC,OAAO;AACT;AAEA,SAASC,YAAYF,KAAkB;IACrC,IAAIA,MAAMC,OAAO,KAAK,cAAc,OAAOD,MAAMG,MAAM,CAACC,eAAe,KAAK,UAAU;QACpF,OAAOJ,MAAMG,MAAM,CAACC,eAAe;IACrC;IACA,MAAMC,OAAOL,MAAMM,YAAY,CAACC,OAAO,CAAC,OAAO,IAAIC,KAAK,CAAC;IACzD,OAAOH,IAAI,CAAC,EAAE,IAAI;AACpB;AAEA,OAAO,SAASI,eACdC,MAA2C,EAC3Cf,MAAyC;IAEzC,MAAMgB,aAAsD,CAAC;IAC7D,MAAMC,WAAqB,EAAE;IAC7B,KAAK,MAAM,CAACC,MAAMvB,KAAK,IAAIwB,OAAOC,OAAO,CAACL,QAAS;QACjDC,UAAU,CAACE,KAAK,GAAGjB,YAAYN;QAC/B,IAAIA,KAAKsB,QAAQ,EAAEA,SAASI,IAAI,CAACH;IACnC;IACA,MAAMI,WAAWhC,IAAIiC,OAAO,CAAC;QAC3B1B,MAAM;QACNmB;QACAC;QACAO,sBAAsB;IACxB;IACA,IAAIF,SAAStB,SAAS,OAAOyB;IAC7B,MAAMpB,QAAQiB,SAASI,MAAM,AAAC,CAAC,EAAE;IACjC,OAAO;QAAEC,OAAOpB,YAAYF;QAAQuB,MAAMxB,QAAQC;IAAO;AAC3D"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/sections.ts"],"sourcesContent":["export type SectionSpan = {\n readonly name: string;\n readonly headingStart: number;\n readonly bodyStart: number;\n readonly bodyEnd: number;\n};\n\nconst H2 = /^##(?!#)[ \\t]+(.+?)[ \\t]*#*[ \\t]*$/;\nconst ITEM = /^([ \\t]*)([-*+]|\\d+[.)])[ \\t]+/;\n\nfunction lineRange(content: string, from: number): { line: string; next: number; start: number } {\n const nl = content.indexOf('\\n', from);\n const end = nl === -1 ? content.length : nl;\n let line = content.slice(from, end);\n if (line.endsWith('\\r')) line = line.slice(0, -1);\n return { line, start: from, next: nl === -1 ? content.length : nl + 1 };\n}\n\nfunction fenceMarker(line: string): '```' | '~~~' | null {\n let i = 0;\n while (i < 3 && (line[i] === ' ' || line[i] === '\\t')) i += 1;\n if (line.startsWith('```', i)) return '```';\n if (line.startsWith('~~~', i)) return '~~~';\n return null;\n}\n\nexport function headingSpans(content: string, bodyStart: number): SectionSpan[] {\n const found: SectionSpan[] = [];\n let i = bodyStart;\n let fence: '```' | '~~~' | null = null;\n while (i < content.length) {\n const { line, start, next } = lineRange(content, i);\n const marker = fenceMarker(line);\n if (fence !== null) {\n if (marker === fence) fence = null;\n } else if (marker !== null) {\n fence = marker;\n } else {\n const match = H2.exec(line);\n if (match !== null && match[1] !== undefined) {\n const name = match[1].trim();\n if (found.length > 0)\n found[found.length - 1] = { ...found[found.length - 1]!, bodyEnd: start };\n found.push({ name, headingStart: start, bodyStart: next, bodyEnd: content.length });\n }\n }\n if (next === i) break;\n i = next;\n }\n return found;\n}\n\nexport function sectionsRecord(\n spans: readonly SectionSpan[],\n content: string,\n): Record<string, string> {\n const record: Record<string, string> = {};\n for (const span of spans) {\n if (record[span.name] === undefined)\n record[span.name] = content.slice(span.bodyStart, span.bodyEnd);\n }\n return record;\n}\n\nexport function parseListSection(body: string): boolean {\n const lines = body.split(/\\r?\\n/);\n while (lines.length > 0 && lines[0]!.trim() === '') lines.shift();\n while (lines.length > 0 && lines[lines.length - 1]!.trim() === '') lines.pop();\n if (lines.length === 0) return true;\n const first = ITEM.exec(lines[0]!);\n if (first === null || first[1] === undefined) return false;\n const indent = first[1].length;\n for (const line of lines) {\n if (line.trim() === '') continue;\n const match = ITEM.exec(line);\n if (match !== null && match[1]?.length === indent) continue;\n const leading = /^\\s*/.exec(line)?.[0].length ?? 0;\n if (leading > indent) continue;\n return false;\n }\n return true;\n}\n"],"names":["H2","ITEM","lineRange","content","from","nl","indexOf","end","length","line","slice","endsWith","start","next","fenceMarker","i","startsWith","headingSpans","bodyStart","found","fence","marker","match","exec","undefined","name","trim","bodyEnd","push","headingStart","sectionsRecord","spans","record","span","parseListSection","body","lines","split","shift","pop","first","indent","leading"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/sections.ts"],"sourcesContent":["export type SectionSpan = {\n readonly name: string;\n readonly headingStart: number;\n readonly bodyStart: number;\n readonly bodyEnd: number;\n};\n\nconst H2 = /^##(?!#)[ \\t]+(.+?)[ \\t]*#*[ \\t]*$/;\nconst ITEM = /^([ \\t]*)([-*+]|\\d+[.)])[ \\t]+/;\n\nfunction lineRange(content: string, from: number): { line: string; next: number; start: number } {\n const nl = content.indexOf('\\n', from);\n const end = nl === -1 ? content.length : nl;\n let line = content.slice(from, end);\n if (line.endsWith('\\r')) line = line.slice(0, -1);\n return { line, start: from, next: nl === -1 ? content.length : nl + 1 };\n}\n\nfunction fenceMarker(line: string): '```' | '~~~' | null {\n let i = 0;\n while (i < 3 && (line[i] === ' ' || line[i] === '\\t')) i += 1;\n if (line.startsWith('```', i)) return '```';\n if (line.startsWith('~~~', i)) return '~~~';\n return null;\n}\n\nexport function headingSpans(content: string, bodyStart: number): SectionSpan[] {\n const found: SectionSpan[] = [];\n let i = bodyStart;\n let fence: '```' | '~~~' | null = null;\n while (i < content.length) {\n const { line, start, next } = lineRange(content, i);\n const marker = fenceMarker(line);\n if (fence !== null) {\n if (marker === fence) fence = null;\n } else if (marker !== null) {\n fence = marker;\n } else {\n const match = H2.exec(line);\n if (match !== null && match[1] !== undefined) {\n const name = match[1].trim();\n if (found.length > 0)\n found[found.length - 1] = { ...found[found.length - 1]!, bodyEnd: start };\n found.push({ name, headingStart: start, bodyStart: next, bodyEnd: content.length });\n }\n }\n if (next === i) break;\n i = next;\n }\n return found;\n}\n\nexport function sectionsRecord(\n spans: readonly SectionSpan[],\n content: string,\n): Record<string, string> {\n const record: Record<string, string> = {};\n for (const span of spans) {\n if (record[span.name] === undefined)\n record[span.name] = content.slice(span.bodyStart, span.bodyEnd);\n }\n return record;\n}\n\nexport function parseListSection(body: string): boolean {\n const lines = body.split(/\\r?\\n/);\n while (lines.length > 0 && lines[0]!.trim() === '') lines.shift();\n while (lines.length > 0 && lines[lines.length - 1]!.trim() === '') lines.pop();\n if (lines.length === 0) return true;\n const first = ITEM.exec(lines[0]!);\n if (first === null || first[1] === undefined) return false;\n const indent = first[1].length;\n for (const line of lines) {\n if (line.trim() === '') continue;\n const match = ITEM.exec(line);\n if (match !== null && match[1]?.length === indent) continue;\n const leading = /^\\s*/.exec(line)?.[0].length ?? 0;\n if (leading > indent) continue;\n return false;\n }\n return true;\n}\n"],"names":["H2","ITEM","lineRange","content","from","nl","indexOf","end","length","line","slice","endsWith","start","next","fenceMarker","i","startsWith","headingSpans","bodyStart","found","fence","marker","match","exec","undefined","name","trim","bodyEnd","push","headingStart","sectionsRecord","spans","record","span","parseListSection","body","lines","split","shift","pop","first","indent","leading"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  export type Library = Readonly<Record<string, string>>;
2
+ export type ValidationContext = {
3
+ readonly binaryTargets: readonly string[];
4
+ };
2
5
  export type Document = {
3
6
  readonly content: string;
4
7
  readonly type: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,GAC9B,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,GAAG,OAAO,CAAC,CAAC;AAE/C,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtD,MAAM,MAAM,MAAM,GACd;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEN,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAC5D;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,GAC9B,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,GAAG,OAAO,CAAC,CAAC;AAE/C,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtD,MAAM,MAAM,MAAM,GACd;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEN,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAC5D;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/types.ts"],"sourcesContent":["export type Library = Readonly<Record<string, string>>;\n\nexport type Document = {\n readonly content: string;\n readonly type: string | undefined;\n readonly fields: Readonly<Record<string, unknown>>;\n readonly sections: Readonly<Record<string, string>>;\n};\n\nexport type Refusal = {\n readonly file: string;\n readonly rule: string;\n readonly version: string;\n readonly location?: string;\n readonly referrers?: readonly string[];\n};\n\nexport type Validation =\n | { readonly verdict: 'accept' }\n | ({ readonly verdict: 'refuse' } & Refusal);\n\nexport type ParseResult =\n | { readonly ok: true; readonly document: Document }\n | { readonly ok: false; readonly refusal: Refusal };\n\nexport type Change =\n | {\n readonly kind: 'field';\n readonly name: string;\n readonly value: unknown;\n readonly prior: unknown;\n }\n | {\n readonly kind: 'section';\n readonly name: string;\n readonly value: string;\n readonly prior: string;\n };\n\nexport type ApplyResult =\n | { readonly outcome: 'applied'; readonly document: Document }\n | { readonly outcome: 'stale'; readonly document: Document }\n | { readonly outcome: 'refuse'; readonly refusal: Refusal };\n"],"names":[],"mappings":"AAuCA,WAG8D"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/types.ts"],"sourcesContent":["export type Library = Readonly<Record<string, string>>;\n\nexport type ValidationContext = {\n readonly binaryTargets: readonly string[];\n};\n\nexport type Document = {\n readonly content: string;\n readonly type: string | undefined;\n readonly fields: Readonly<Record<string, unknown>>;\n readonly sections: Readonly<Record<string, string>>;\n};\n\nexport type Refusal = {\n readonly file: string;\n readonly rule: string;\n readonly version: string;\n readonly location?: string;\n readonly referrers?: readonly string[];\n};\n\nexport type Validation =\n | { readonly verdict: 'accept' }\n | ({ readonly verdict: 'refuse' } & Refusal);\n\nexport type ParseResult =\n | { readonly ok: true; readonly document: Document }\n | { readonly ok: false; readonly refusal: Refusal };\n\nexport type Change =\n | {\n readonly kind: 'field';\n readonly name: string;\n readonly value: unknown;\n readonly prior: unknown;\n }\n | {\n readonly kind: 'section';\n readonly name: string;\n readonly value: string;\n readonly prior: string;\n };\n\nexport type ApplyResult =\n | { readonly outcome: 'applied'; readonly document: Document }\n | { readonly outcome: 'stale'; readonly document: Document }\n | { readonly outcome: 'refuse'; readonly refusal: Refusal };\n"],"names":[],"mappings":"AA2CA,WAG8D"}
@@ -1,3 +1,3 @@
1
- import type { Library, Validation } from './types.js';
2
- export declare function validate(library: Library): Validation;
1
+ import type { Library, Validation, ValidationContext } from './types.js';
2
+ export declare function validate(library: Library, context?: ValidationContext): Validation;
3
3
  //# sourceMappingURL=validate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAY,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAuChE,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CA6GrD"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAY,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAuCnF,wBAAgB,QAAQ,CACtB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,iBAAyC,GACjD,UAAU,CAkHZ"}
package/dist/validate.js CHANGED
@@ -38,10 +38,14 @@ function declaredTypeOf(content) {
38
38
  if (!parsed.ok) return undefined;
39
39
  return parsed.document.type ?? 'any';
40
40
  }
41
- export function validate(library) {
41
+ export function validate(library, context = {
42
+ binaryTargets: []
43
+ }) {
44
+ const binaryTargets = new Set(context.binaryTargets);
42
45
  const files = Object.keys(library).sort();
43
46
  const documents = new Map();
44
47
  for (const file of files){
48
+ if (binaryTargets.has(file)) return refuse(file, 'binary-target-document');
45
49
  const parsed = parse(library[file], file);
46
50
  documents.set(file, parsed);
47
51
  if (!parsed.ok) return {
@@ -114,10 +118,10 @@ export function validate(library) {
114
118
  if (expected === null) continue;
115
119
  for (const target of targets){
116
120
  const resolved = classifyHref(file, target);
117
- if (resolved.kind !== 'path') return refuse(file, 'unresolved-reference', {
121
+ if (resolved.kind !== 'path' || binaryTargets.has(resolved.path)) return refuse(file, 'unresolved-reference', {
118
122
  location: name
119
123
  });
120
- if (!(resolved.path in library)) continue;
124
+ if (!documents.has(resolved.path)) continue;
121
125
  const targetType = declaredTypeOf(library[resolved.path]);
122
126
  if (targetType !== expected) return refuse(file, 'unresolved-reference', {
123
127
  location: name
@@ -128,7 +132,7 @@ export function validate(library) {
128
132
  for (const href of extractRelativeHrefs(body)){
129
133
  const resolved = classifyHref(file, href);
130
134
  if (resolved.kind === 'skip') continue;
131
- if (resolved.kind === 'invalid' || !(resolved.path in library)) {
135
+ if (resolved.kind === 'invalid' || !documents.has(resolved.path) && !binaryTargets.has(resolved.path)) {
132
136
  return refuse(file, 'unresolved-link');
133
137
  }
134
138
  }
@@ -147,7 +151,7 @@ export function validate(library) {
147
151
  for (const target of referenceTargets(spec, parsed.document.fields[name])){
148
152
  const resolved = classifyHref(file, target);
149
153
  if (resolved.kind !== 'path') continue;
150
- if (resolved.path in library) continue;
154
+ if (documents.has(resolved.path)) continue;
151
155
  const referrers = missing.get(resolved.path) ?? [];
152
156
  referrers.push(file);
153
157
  missing.set(resolved.path, referrers);
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/validate.ts"],"sourcesContent":["import { readDefinition, type Definition, type FieldSpec } from './definition.js';\nimport { parse } from './document.js';\nimport { extractRelativeHrefs } from './links.js';\nimport { classifyHref, isTypesPath } from './paths.js';\nimport { refusal } from './refuse.js';\nimport { parseListSection } from './sections.js';\nimport { validateFields } from './schema.js';\nimport type { Document, Library, Validation } from './types.js';\nimport { bodyAfterFrontmatter } from './yaml.js';\n\nfunction refuse(\n file: string,\n rule: string,\n extra?: { location?: string; referrers?: readonly string[] },\n): Validation {\n return { verdict: 'refuse', ...refusal(file, rule, extra) };\n}\n\nfunction instanceType(document: Document, file: string): 'any' | 'definition' | 'invalid' | string {\n if (isTypesPath(file)) return 'definition';\n const raw = document.fields.type;\n if (raw === undefined || raw === null) return 'any';\n if (typeof raw !== 'string' || raw === '') return 'invalid';\n return raw;\n}\n\nfunction referenceTargets(spec: FieldSpec, value: unknown): string[] {\n if (spec.kind === 'reference' && typeof value === 'string') return [value];\n if (spec.kind === 'list' && spec.of.kind === 'reference' && Array.isArray(value)) {\n return value.filter((item): item is string => typeof item === 'string');\n }\n return [];\n}\n\nfunction expectedReferenceType(spec: FieldSpec): string | null {\n if (spec.kind === 'reference') return spec.to;\n if (spec.kind === 'list' && spec.of.kind === 'reference') return spec.of.to;\n return null;\n}\n\nfunction declaredTypeOf(content: string): string | undefined {\n const parsed = parse(content);\n if (!parsed.ok) return undefined;\n return parsed.document.type ?? 'any';\n}\n\nexport function validate(library: Library): Validation {\n const files = Object.keys(library).sort();\n const documents = new Map<string, ReturnType<typeof parse>>();\n for (const file of files) {\n const parsed = parse(library[file]!, file);\n documents.set(file, parsed);\n if (!parsed.ok) return { verdict: 'refuse', ...parsed.refusal };\n }\n\n const definitions = new Map<string, Definition>();\n for (const file of files) {\n if (!isTypesPath(file)) continue;\n const parsed = documents.get(file);\n if (parsed === undefined || !parsed.ok) continue;\n const definition = readDefinition(file, parsed.document);\n if ('rule' in definition) return { verdict: 'refuse', ...definition };\n const existing = definitions.get(definition.name);\n if (existing !== undefined)\n return refuse(file, 'definition-duplicate', { location: definition.name });\n definitions.set(definition.name, definition);\n }\n\n for (const file of files) {\n const parsed = documents.get(file);\n if (parsed === undefined || !parsed.ok) continue;\n const kind = instanceType(parsed.document, file);\n if (kind === 'any') continue;\n if (kind === 'invalid' || kind === 'definition') {\n if (kind === 'definition' && isTypesPath(file)) continue;\n return refuse(file, 'unknown-type', { location: 'type' });\n }\n const definition = definitions.get(kind);\n if (definition === undefined) return refuse(file, 'unknown-type', { location: 'type' });\n const fieldFailure = validateFields(definition.fields, parsed.document.fields);\n if (fieldFailure !== undefined) {\n return refuse(file, fieldFailure.rule, { location: fieldFailure.field });\n }\n for (const [name, spec] of Object.entries(definition.sections)) {\n const body = parsed.document.sections[name];\n if (body === undefined) {\n if (spec.required) return refuse(file, 'required-section', { location: name });\n continue;\n }\n if (spec.kind === 'list' && !parseListSection(body)) {\n return refuse(file, 'structured-section', { location: name });\n }\n }\n }\n\n for (const file of files) {\n const parsed = documents.get(file);\n if (parsed === undefined || !parsed.ok) continue;\n const kind = instanceType(parsed.document, file);\n if (kind === 'any' || kind === 'definition' || kind === 'invalid') continue;\n const definition = definitions.get(kind);\n if (definition === undefined) continue;\n for (const [name, spec] of Object.entries(definition.fields)) {\n const targets = referenceTargets(spec, parsed.document.fields[name]);\n const expected = expectedReferenceType(spec);\n if (expected === null) continue;\n for (const target of targets) {\n const resolved = classifyHref(file, target);\n if (resolved.kind !== 'path')\n return refuse(file, 'unresolved-reference', { location: name });\n if (!(resolved.path in library)) continue;\n const targetType = declaredTypeOf(library[resolved.path]!);\n if (targetType !== expected)\n return refuse(file, 'unresolved-reference', { location: name });\n }\n }\n const body = bodyAfterFrontmatter(library[file]!);\n for (const href of extractRelativeHrefs(body)) {\n const resolved = classifyHref(file, href);\n if (resolved.kind === 'skip') continue;\n if (resolved.kind === 'invalid' || !(resolved.path in library)) {\n return refuse(file, 'unresolved-link');\n }\n }\n }\n\n const missing = new Map<string, string[]>();\n for (const file of files) {\n const parsed = documents.get(file);\n if (parsed === undefined || !parsed.ok) continue;\n const kind = instanceType(parsed.document, file);\n if (kind === 'any' || kind === 'definition' || kind === 'invalid') continue;\n const definition = definitions.get(kind);\n if (definition === undefined) continue;\n for (const [name, spec] of Object.entries(definition.fields)) {\n const expected = expectedReferenceType(spec);\n if (expected === null) continue;\n for (const target of referenceTargets(spec, parsed.document.fields[name])) {\n const resolved = classifyHref(file, target);\n if (resolved.kind !== 'path') continue;\n if (resolved.path in library) continue;\n const referrers = missing.get(resolved.path) ?? [];\n referrers.push(file);\n missing.set(resolved.path, referrers);\n }\n }\n }\n const missingPaths = [...missing.keys()].sort();\n if (missingPaths.length > 0) {\n const path = missingPaths[0]!;\n const referrers = [...new Set(missing.get(path) ?? [])].sort();\n return refuse(path, 'referenced-missing-file', { referrers });\n }\n\n return { verdict: 'accept' };\n}\n"],"names":["readDefinition","parse","extractRelativeHrefs","classifyHref","isTypesPath","refusal","parseListSection","validateFields","bodyAfterFrontmatter","refuse","file","rule","extra","verdict","instanceType","document","raw","fields","type","undefined","referenceTargets","spec","value","kind","of","Array","isArray","filter","item","expectedReferenceType","to","declaredTypeOf","content","parsed","ok","validate","library","files","Object","keys","sort","documents","Map","set","definitions","get","definition","existing","name","location","fieldFailure","field","entries","sections","body","required","targets","expected","target","resolved","path","targetType","href","missing","referrers","push","missingPaths","length","Set"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/validate.ts"],"sourcesContent":["import { readDefinition, type Definition, type FieldSpec } from './definition.js';\nimport { parse } from './document.js';\nimport { extractRelativeHrefs } from './links.js';\nimport { classifyHref, isTypesPath } from './paths.js';\nimport { refusal } from './refuse.js';\nimport { parseListSection } from './sections.js';\nimport { validateFields } from './schema.js';\nimport type { Document, Library, Validation, ValidationContext } from './types.js';\nimport { bodyAfterFrontmatter } from './yaml.js';\n\nfunction refuse(\n file: string,\n rule: string,\n extra?: { location?: string; referrers?: readonly string[] },\n): Validation {\n return { verdict: 'refuse', ...refusal(file, rule, extra) };\n}\n\nfunction instanceType(document: Document, file: string): 'any' | 'definition' | 'invalid' | string {\n if (isTypesPath(file)) return 'definition';\n const raw = document.fields.type;\n if (raw === undefined || raw === null) return 'any';\n if (typeof raw !== 'string' || raw === '') return 'invalid';\n return raw;\n}\n\nfunction referenceTargets(spec: FieldSpec, value: unknown): string[] {\n if (spec.kind === 'reference' && typeof value === 'string') return [value];\n if (spec.kind === 'list' && spec.of.kind === 'reference' && Array.isArray(value)) {\n return value.filter((item): item is string => typeof item === 'string');\n }\n return [];\n}\n\nfunction expectedReferenceType(spec: FieldSpec): string | null {\n if (spec.kind === 'reference') return spec.to;\n if (spec.kind === 'list' && spec.of.kind === 'reference') return spec.of.to;\n return null;\n}\n\nfunction declaredTypeOf(content: string): string | undefined {\n const parsed = parse(content);\n if (!parsed.ok) return undefined;\n return parsed.document.type ?? 'any';\n}\n\nexport function validate(\n library: Library,\n context: ValidationContext = { binaryTargets: [] },\n): Validation {\n const binaryTargets = new Set(context.binaryTargets);\n const files = Object.keys(library).sort();\n const documents = new Map<string, ReturnType<typeof parse>>();\n for (const file of files) {\n if (binaryTargets.has(file)) return refuse(file, 'binary-target-document');\n const parsed = parse(library[file]!, file);\n documents.set(file, parsed);\n if (!parsed.ok) return { verdict: 'refuse', ...parsed.refusal };\n }\n\n const definitions = new Map<string, Definition>();\n for (const file of files) {\n if (!isTypesPath(file)) continue;\n const parsed = documents.get(file);\n if (parsed === undefined || !parsed.ok) continue;\n const definition = readDefinition(file, parsed.document);\n if ('rule' in definition) return { verdict: 'refuse', ...definition };\n const existing = definitions.get(definition.name);\n if (existing !== undefined)\n return refuse(file, 'definition-duplicate', { location: definition.name });\n definitions.set(definition.name, definition);\n }\n\n for (const file of files) {\n const parsed = documents.get(file);\n if (parsed === undefined || !parsed.ok) continue;\n const kind = instanceType(parsed.document, file);\n if (kind === 'any') continue;\n if (kind === 'invalid' || kind === 'definition') {\n if (kind === 'definition' && isTypesPath(file)) continue;\n return refuse(file, 'unknown-type', { location: 'type' });\n }\n const definition = definitions.get(kind);\n if (definition === undefined) return refuse(file, 'unknown-type', { location: 'type' });\n const fieldFailure = validateFields(definition.fields, parsed.document.fields);\n if (fieldFailure !== undefined) {\n return refuse(file, fieldFailure.rule, { location: fieldFailure.field });\n }\n for (const [name, spec] of Object.entries(definition.sections)) {\n const body = parsed.document.sections[name];\n if (body === undefined) {\n if (spec.required) return refuse(file, 'required-section', { location: name });\n continue;\n }\n if (spec.kind === 'list' && !parseListSection(body)) {\n return refuse(file, 'structured-section', { location: name });\n }\n }\n }\n\n for (const file of files) {\n const parsed = documents.get(file);\n if (parsed === undefined || !parsed.ok) continue;\n const kind = instanceType(parsed.document, file);\n if (kind === 'any' || kind === 'definition' || kind === 'invalid') continue;\n const definition = definitions.get(kind);\n if (definition === undefined) continue;\n for (const [name, spec] of Object.entries(definition.fields)) {\n const targets = referenceTargets(spec, parsed.document.fields[name]);\n const expected = expectedReferenceType(spec);\n if (expected === null) continue;\n for (const target of targets) {\n const resolved = classifyHref(file, target);\n if (resolved.kind !== 'path' || binaryTargets.has(resolved.path))\n return refuse(file, 'unresolved-reference', { location: name });\n if (!documents.has(resolved.path)) continue;\n const targetType = declaredTypeOf(library[resolved.path]!);\n if (targetType !== expected)\n return refuse(file, 'unresolved-reference', { location: name });\n }\n }\n const body = bodyAfterFrontmatter(library[file]!);\n for (const href of extractRelativeHrefs(body)) {\n const resolved = classifyHref(file, href);\n if (resolved.kind === 'skip') continue;\n if (\n resolved.kind === 'invalid' ||\n (!documents.has(resolved.path) && !binaryTargets.has(resolved.path))\n ) {\n return refuse(file, 'unresolved-link');\n }\n }\n }\n\n const missing = new Map<string, string[]>();\n for (const file of files) {\n const parsed = documents.get(file);\n if (parsed === undefined || !parsed.ok) continue;\n const kind = instanceType(parsed.document, file);\n if (kind === 'any' || kind === 'definition' || kind === 'invalid') continue;\n const definition = definitions.get(kind);\n if (definition === undefined) continue;\n for (const [name, spec] of Object.entries(definition.fields)) {\n const expected = expectedReferenceType(spec);\n if (expected === null) continue;\n for (const target of referenceTargets(spec, parsed.document.fields[name])) {\n const resolved = classifyHref(file, target);\n if (resolved.kind !== 'path') continue;\n if (documents.has(resolved.path)) continue;\n const referrers = missing.get(resolved.path) ?? [];\n referrers.push(file);\n missing.set(resolved.path, referrers);\n }\n }\n }\n const missingPaths = [...missing.keys()].sort();\n if (missingPaths.length > 0) {\n const path = missingPaths[0]!;\n const referrers = [...new Set(missing.get(path) ?? [])].sort();\n return refuse(path, 'referenced-missing-file', { referrers });\n }\n\n return { verdict: 'accept' };\n}\n"],"names":["readDefinition","parse","extractRelativeHrefs","classifyHref","isTypesPath","refusal","parseListSection","validateFields","bodyAfterFrontmatter","refuse","file","rule","extra","verdict","instanceType","document","raw","fields","type","undefined","referenceTargets","spec","value","kind","of","Array","isArray","filter","item","expectedReferenceType","to","declaredTypeOf","content","parsed","ok","validate","library","context","binaryTargets","Set","files","Object","keys","sort","documents","Map","has","set","definitions","get","definition","existing","name","location","fieldFailure","field","entries","sections","body","required","targets","expected","target","resolved","path","targetType","href","missing","referrers","push","missingPaths","length"],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.1.0-alpha.1";
1
+ export declare const VERSION = "0.1.0-alpha.3";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
- export const VERSION = '0.1.0-alpha.1';
1
+ export const VERSION = '0.1.0-alpha.3';
2
2
 
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/version.ts"],"sourcesContent":["export const VERSION = '0.1.0-alpha.1';\n"],"names":["VERSION"],"mappings":"AAAA,OAAO,MAAMA,UAAU,gBAAgB"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/version.ts"],"sourcesContent":["export const VERSION = '0.1.0-alpha.3';\n"],"names":["VERSION"],"mappings":"AAAA,OAAO,MAAMA,UAAU,gBAAgB"}
package/dist/yaml.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/executor/code/agents.house/mdmodel/packages/mdmodel/src/yaml.ts"],"sourcesContent":["export class YamlError extends Error {\n constructor(readonly offset: number) {\n super('yaml');\n this.name = 'YamlError';\n }\n}\n\nexport type YamlScalar = {\n readonly kind: 'scalar';\n readonly value: string | number | boolean | null;\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlSeq = {\n readonly kind: 'seq';\n readonly items: readonly YamlNode[];\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlEntry = {\n readonly key: string;\n readonly keyStart: number;\n readonly keyEnd: number;\n readonly value: YamlNode;\n};\n\nexport type YamlMap = {\n readonly kind: 'map';\n readonly entries: readonly YamlEntry[];\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlNode = YamlScalar | YamlSeq | YamlMap;\n\ntype Ctx = { text: string; i: number; end: number };\n\nfunction peek(c: Ctx): string {\n return c.i < c.end ? c.text[c.i]! : '';\n}\n\nfunction skipEol(c: Ctx): void {\n if (peek(c) === '\\r') c.i += 1;\n if (peek(c) === '\\n') c.i += 1;\n}\n\nfunction skipSpaces(c: Ctx): void {\n while (peek(c) === ' ') c.i += 1;\n if (peek(c) === '\\t') throw new YamlError(c.i);\n}\n\nfunction skipToEol(c: Ctx): void {\n while (c.i < c.end && peek(c) !== '\\n' && peek(c) !== '\\r') c.i += 1;\n}\n\nfunction skipBlankAndComments(c: Ctx): void {\n while (c.i < c.end) {\n skipSpaces(c);\n if (peek(c) === '#') skipToEol(c);\n if (peek(c) === '\\r' || peek(c) === '\\n') {\n skipEol(c);\n continue;\n }\n break;\n }\n}\n\nfunction skipFlowSpace(c: Ctx): void {\n while (c.i < c.end) {\n const ch = peek(c);\n if (ch === ' ' || ch === '\\n' || ch === '\\r') {\n c.i += 1;\n continue;\n }\n if (ch === '#') {\n skipToEol(c);\n continue;\n }\n if (ch === '\\t') throw new YamlError(c.i);\n break;\n }\n}\n\nfunction indentAt(c: Ctx): number {\n let j = c.i;\n while (j > 0 && c.text[j - 1] !== '\\n') j -= 1;\n let n = 0;\n while (j < c.i) {\n const ch = c.text[j]!;\n if (ch === ' ') n += 1;\n else if (ch === '\\t') throw new YamlError(j);\n else break;\n j += 1;\n }\n return n;\n}\n\nfunction scalar(value: string | number | boolean | null, start: number, end: number): YamlScalar {\n return { kind: 'scalar', value, start, end };\n}\n\nfunction interpretPlain(text: string): string | number | boolean | null {\n if (text === 'true') return true;\n if (text === 'false') return false;\n if (text === 'null' || text === '') return null;\n if (/^-?(0|[1-9][0-9]*)(\\.[0-9]+)?([eE][+-]?[0-9]+)?$/.test(text)) return Number(text);\n return text;\n}\n\nfunction parseQuoted(c: Ctx): YamlScalar {\n const quote = peek(c);\n const start = c.i;\n c.i += 1;\n let out = '';\n while (c.i < c.end) {\n const ch = peek(c);\n if (ch === quote) {\n c.i += 1;\n return scalar(out, start, c.i);\n }\n if (ch === '\\n' || ch === '\\r') throw new YamlError(c.i);\n if (quote === \"'\" && ch === \"'\" && c.text[c.i + 1] === \"'\") {\n out += \"'\";\n c.i += 2;\n continue;\n }\n if (quote === '\"' && ch === '\\\\') {\n c.i += 1;\n const escaped = peek(c);\n if (escaped === 'n') out += '\\n';\n else if (escaped === 't') out += '\\t';\n else if (escaped === '\"') out += '\"';\n else if (escaped === '\\\\') out += '\\\\';\n else throw new YamlError(c.i);\n c.i += 1;\n continue;\n }\n out += ch;\n c.i += 1;\n }\n throw new YamlError(c.i);\n}\n\nfunction parsePlain(c: Ctx, flow: boolean): YamlScalar {\n const start = c.i;\n while (c.i < c.end) {\n const ch = peek(c);\n if (flow && (ch === ',' || ch === ']' || ch === '}')) break;\n if (ch === '\\n' || ch === '\\r') break;\n if (ch === '#' && (c.i === start || c.text[c.i - 1] === ' ' || c.text[c.i - 1] === '\\t')) break;\n c.i += 1;\n }\n if (c.i === start) throw new YamlError(c.i);\n const raw = c.text.slice(start, c.i);\n const trimmed = raw.trimEnd();\n return scalar(interpretPlain(trimmed), start, start + trimmed.length);\n}\n\nfunction parseScalar(c: Ctx, flow: boolean): YamlScalar {\n const ch = peek(c);\n if (ch === '\"' || ch === \"'\") return parseQuoted(c);\n return parsePlain(c, flow);\n}\n\nfunction parseKey(c: Ctx): { name: string; start: number; end: number } {\n const start = c.i;\n if (peek(c) === '\"' || peek(c) === \"'\") {\n const quoted = parseQuoted(c);\n if (typeof quoted.value !== 'string') throw new YamlError(start);\n return { name: quoted.value, start, end: c.i };\n }\n let end = c.i;\n while (c.i < c.end) {\n const ch = peek(c);\n if (\n ch === ':' ||\n ch === '\\n' ||\n ch === '\\r' ||\n ch === ',' ||\n ch === '}' ||\n ch === ']' ||\n ch === '#' ||\n ch === '{' ||\n ch === '['\n ) {\n break;\n }\n c.i += 1;\n if (ch !== ' ' && ch !== '\\t') end = c.i;\n }\n if (end === start) throw new YamlError(c.i);\n c.i = end;\n return { name: c.text.slice(start, end), start, end };\n}\n\nfunction parseFlowValue(c: Ctx): YamlNode {\n skipFlowSpace(c);\n const ch = peek(c);\n if (ch === '{') return parseFlowMap(c);\n if (ch === '[') return parseFlowSeq(c);\n if (ch === '|' || ch === '>') throw new YamlError(c.i);\n return parseScalar(c, true);\n}\n\nfunction parseFlowMap(c: Ctx): YamlMap {\n const start = c.i;\n if (peek(c) !== '{') throw new YamlError(c.i);\n c.i += 1;\n skipFlowSpace(c);\n const entries: YamlEntry[] = [];\n const seen = new Set<string>();\n if (peek(c) === '}') {\n c.i += 1;\n return { kind: 'map', entries, start, end: c.i };\n }\n while (c.i < c.end) {\n skipFlowSpace(c);\n const key = parseKey(c);\n skipFlowSpace(c);\n if (peek(c) !== ':') throw new YamlError(c.i);\n c.i += 1;\n const value = parseFlowValue(c);\n if (seen.has(key.name)) throw new YamlError(key.start);\n seen.add(key.name);\n entries.push({ key: key.name, keyStart: key.start, keyEnd: key.end, value });\n skipFlowSpace(c);\n if (peek(c) === ',') {\n c.i += 1;\n continue;\n }\n if (peek(c) === '}') {\n c.i += 1;\n return { kind: 'map', entries, start, end: c.i };\n }\n throw new YamlError(c.i);\n }\n throw new YamlError(c.i);\n}\n\nfunction parseFlowSeq(c: Ctx): YamlSeq {\n const start = c.i;\n if (peek(c) !== '[') throw new YamlError(c.i);\n c.i += 1;\n skipFlowSpace(c);\n const items: YamlNode[] = [];\n if (peek(c) === ']') {\n c.i += 1;\n return { kind: 'seq', items, start, end: c.i };\n }\n while (c.i < c.end) {\n items.push(parseFlowValue(c));\n skipFlowSpace(c);\n if (peek(c) === ',') {\n c.i += 1;\n skipFlowSpace(c);\n continue;\n }\n if (peek(c) === ']') {\n c.i += 1;\n return { kind: 'seq', items, start, end: c.i };\n }\n throw new YamlError(c.i);\n }\n throw new YamlError(c.i);\n}\n\nfunction parseValue(c: Ctx, parentKeyIndent: number): YamlNode {\n skipSpaces(c);\n if (peek(c) === '#') skipToEol(c);\n const ch = peek(c);\n if (ch === '' || ch === '\\n' || ch === '\\r') {\n skipEol(c);\n skipBlankAndComments(c);\n if (c.i >= c.end) return scalar(null, c.i, c.i);\n const nextIndent = indentAt(c);\n if (nextIndent <= parentKeyIndent) return scalar(null, c.i, c.i);\n if (peek(c) === '-') return parseBlockSeq(c, nextIndent);\n if (peek(c) === '[') return parseFlowSeq(c);\n if (peek(c) === '{') return parseFlowMap(c);\n return parseBlockMap(c, nextIndent);\n }\n if (ch === '{') return parseFlowMap(c);\n if (ch === '[') return parseFlowSeq(c);\n if (ch === '|' || ch === '>') throw new YamlError(c.i);\n return parseScalar(c, false);\n}\n\nfunction parseBlockSeq(c: Ctx, indent: number): YamlSeq {\n const start = c.i;\n const items: YamlNode[] = [];\n let end = start;\n while (c.i < c.end) {\n skipBlankAndComments(c);\n if (c.i >= c.end) break;\n if (indentAt(c) !== indent) break;\n if (peek(c) !== '-') break;\n c.i += 1;\n items.push(parseValue(c, indent));\n end = c.i;\n }\n return { kind: 'seq', items, start, end };\n}\n\nfunction parseBlockMap(c: Ctx, indent: number): YamlMap {\n const start = c.i;\n const entries: YamlEntry[] = [];\n const seen = new Set<string>();\n let end = start;\n while (c.i < c.end) {\n skipBlankAndComments(c);\n if (c.i >= c.end) break;\n if (indentAt(c) < indent) break;\n if (indentAt(c) > indent) throw new YamlError(c.i);\n const key = parseKey(c);\n skipSpaces(c);\n if (peek(c) !== ':') throw new YamlError(c.i);\n c.i += 1;\n const value = parseValue(c, indent);\n if (seen.has(key.name)) throw new YamlError(key.start);\n seen.add(key.name);\n entries.push({ key: key.name, keyStart: key.start, keyEnd: key.end, value });\n end = c.i;\n }\n return { kind: 'map', entries, start, end };\n}\n\nexport function parseYamlMapping(text: string, start: number, end: number): YamlMap {\n const c: Ctx = { text, i: start, end };\n skipBlankAndComments(c);\n if (c.i >= end) return { kind: 'map', entries: [], start, end };\n if (peek(c) === '{') {\n const mapped = parseFlowMap(c);\n skipBlankAndComments(c);\n if (c.i < end) throw new YamlError(c.i);\n return mapped;\n }\n const mapped = parseBlockMap(c, indentAt(c));\n skipBlankAndComments(c);\n if (c.i < end) throw new YamlError(c.i);\n return mapped;\n}\n\nexport function jsValue(node: YamlNode): unknown {\n if (node.kind === 'scalar') return node.value;\n if (node.kind === 'seq') return node.items.map(jsValue);\n const record: Record<string, unknown> = {};\n for (const entry of node.entries) record[entry.key] = jsValue(entry.value);\n return record;\n}\n\nexport function mapEntry(map: YamlMap, key: string): YamlEntry | undefined {\n return map.entries.find((entry) => entry.key === key);\n}\n\nexport function isPlainSafe(text: string): boolean {\n if (text === '' || text === 'true' || text === 'false' || text === 'null') return false;\n if (/[\\s#:{}[\\],&*!|>'\"%@`]/.test(text)) return false;\n if (text.startsWith('-') || text.startsWith('?') || text.startsWith(':')) return false;\n if (/^-?(0|[1-9][0-9]*)(\\.[0-9]+)?([eE][+-]?[0-9]+)?$/.test(text)) return false;\n return true;\n}\n\nexport function serializeJs(value: unknown): string {\n if (value === null) return 'null';\n if (value === true) return 'true';\n if (value === false) return 'false';\n if (typeof value === 'number' && Number.isFinite(value)) return JSON.stringify(value);\n if (typeof value === 'string') return isPlainSafe(value) ? value : JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(serializeJs).join(', ')}]`;\n throw new YamlError(0);\n}\n\nexport function serializeKey(name: string): string {\n return isPlainSafe(name) || /^[A-Za-z][A-Za-z0-9_-]*$/.test(name) ? name : JSON.stringify(name);\n}\n\nexport function bodyStartAfterYaml(content: string, yamlEnd: number): number {\n const closeLine = content.indexOf('\\n', yamlEnd);\n return closeLine === -1 ? content.length : closeLine + 1;\n}\n\nexport function bodyAfterFrontmatter(content: string): string {\n const fence = extractFrontmatter(content);\n if (fence.kind !== 'ok') return content;\n return content.slice(bodyStartAfterYaml(content, fence.yamlEnd));\n}\n\nexport function extractFrontmatter(\n content: string,\n): { kind: 'none' } | { kind: 'unclosed' } | { kind: 'ok'; yamlStart: number; yamlEnd: number } {\n if (!content.startsWith('---')) return { kind: 'none' };\n const firstNl = content.indexOf('\\n');\n const firstLine =\n firstNl === -1\n ? content\n : content.slice(0, content[firstNl - 1] === '\\r' ? firstNl - 1 : firstNl);\n if (!/^---[ \\t]*$/.test(firstLine)) return { kind: 'none' };\n if (firstNl === -1) return { kind: 'unclosed' };\n const yamlStart = firstNl + 1;\n let i = yamlStart;\n while (i <= content.length) {\n const nl = content.indexOf('\\n', i);\n const lineEnd = nl === -1 ? content.length : nl;\n let line = content.slice(i, lineEnd);\n if (line.endsWith('\\r')) line = line.slice(0, -1);\n if (/^---[ \\t]*$/.test(line)) return { kind: 'ok', yamlStart, yamlEnd: i };\n if (nl === -1) return { kind: 'unclosed' };\n i = nl + 1;\n }\n return { kind: 'unclosed' };\n}\n\nexport function equalValue(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n if (Array.isArray(left) && Array.isArray(right)) {\n return (\n left.length === right.length && left.every((item, index) => equalValue(item, right[index]))\n );\n }\n return false;\n}\n\nexport function lineEnding(content: string): '\\n' | '\\r\\n' {\n return content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n}\n"],"names":["YamlError","Error","offset","name","peek","c","i","end","text","skipEol","skipSpaces","skipToEol","skipBlankAndComments","skipFlowSpace","ch","indentAt","j","n","scalar","value","start","kind","interpretPlain","test","Number","parseQuoted","quote","out","escaped","parsePlain","flow","raw","slice","trimmed","trimEnd","length","parseScalar","parseKey","quoted","parseFlowValue","parseFlowMap","parseFlowSeq","entries","seen","Set","key","has","add","push","keyStart","keyEnd","items","parseValue","parentKeyIndent","nextIndent","parseBlockSeq","parseBlockMap","indent","parseYamlMapping","mapped","jsValue","node","map","record","entry","mapEntry","find","isPlainSafe","startsWith","serializeJs","isFinite","JSON","stringify","Array","isArray","join","serializeKey","bodyStartAfterYaml","content","yamlEnd","closeLine","indexOf","bodyAfterFrontmatter","fence","extractFrontmatter","firstNl","firstLine","yamlStart","nl","lineEnd","line","endsWith","equalValue","left","right","every","item","index","lineEnding","includes"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdmodel/src/yaml.ts"],"sourcesContent":["export class YamlError extends Error {\n constructor(readonly offset: number) {\n super('yaml');\n this.name = 'YamlError';\n }\n}\n\nexport type YamlScalar = {\n readonly kind: 'scalar';\n readonly value: string | number | boolean | null;\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlSeq = {\n readonly kind: 'seq';\n readonly items: readonly YamlNode[];\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlEntry = {\n readonly key: string;\n readonly keyStart: number;\n readonly keyEnd: number;\n readonly value: YamlNode;\n};\n\nexport type YamlMap = {\n readonly kind: 'map';\n readonly entries: readonly YamlEntry[];\n readonly start: number;\n readonly end: number;\n};\n\nexport type YamlNode = YamlScalar | YamlSeq | YamlMap;\n\ntype Ctx = { text: string; i: number; end: number };\n\nfunction peek(c: Ctx): string {\n return c.i < c.end ? c.text[c.i]! : '';\n}\n\nfunction skipEol(c: Ctx): void {\n if (peek(c) === '\\r') c.i += 1;\n if (peek(c) === '\\n') c.i += 1;\n}\n\nfunction skipSpaces(c: Ctx): void {\n while (peek(c) === ' ') c.i += 1;\n if (peek(c) === '\\t') throw new YamlError(c.i);\n}\n\nfunction skipToEol(c: Ctx): void {\n while (c.i < c.end && peek(c) !== '\\n' && peek(c) !== '\\r') c.i += 1;\n}\n\nfunction skipBlankAndComments(c: Ctx): void {\n while (c.i < c.end) {\n skipSpaces(c);\n if (peek(c) === '#') skipToEol(c);\n if (peek(c) === '\\r' || peek(c) === '\\n') {\n skipEol(c);\n continue;\n }\n break;\n }\n}\n\nfunction skipFlowSpace(c: Ctx): void {\n while (c.i < c.end) {\n const ch = peek(c);\n if (ch === ' ' || ch === '\\n' || ch === '\\r') {\n c.i += 1;\n continue;\n }\n if (ch === '#') {\n skipToEol(c);\n continue;\n }\n if (ch === '\\t') throw new YamlError(c.i);\n break;\n }\n}\n\nfunction indentAt(c: Ctx): number {\n let j = c.i;\n while (j > 0 && c.text[j - 1] !== '\\n') j -= 1;\n let n = 0;\n while (j < c.i) {\n const ch = c.text[j]!;\n if (ch === ' ') n += 1;\n else if (ch === '\\t') throw new YamlError(j);\n else break;\n j += 1;\n }\n return n;\n}\n\nfunction scalar(value: string | number | boolean | null, start: number, end: number): YamlScalar {\n return { kind: 'scalar', value, start, end };\n}\n\nfunction interpretPlain(text: string): string | number | boolean | null {\n if (text === 'true') return true;\n if (text === 'false') return false;\n if (text === 'null' || text === '') return null;\n if (/^-?(0|[1-9][0-9]*)(\\.[0-9]+)?([eE][+-]?[0-9]+)?$/.test(text)) return Number(text);\n return text;\n}\n\nfunction parseQuoted(c: Ctx): YamlScalar {\n const quote = peek(c);\n const start = c.i;\n c.i += 1;\n let out = '';\n while (c.i < c.end) {\n const ch = peek(c);\n if (ch === quote) {\n c.i += 1;\n return scalar(out, start, c.i);\n }\n if (ch === '\\n' || ch === '\\r') throw new YamlError(c.i);\n if (quote === \"'\" && ch === \"'\" && c.text[c.i + 1] === \"'\") {\n out += \"'\";\n c.i += 2;\n continue;\n }\n if (quote === '\"' && ch === '\\\\') {\n c.i += 1;\n const escaped = peek(c);\n if (escaped === 'n') out += '\\n';\n else if (escaped === 't') out += '\\t';\n else if (escaped === '\"') out += '\"';\n else if (escaped === '\\\\') out += '\\\\';\n else throw new YamlError(c.i);\n c.i += 1;\n continue;\n }\n out += ch;\n c.i += 1;\n }\n throw new YamlError(c.i);\n}\n\nfunction parsePlain(c: Ctx, flow: boolean): YamlScalar {\n const start = c.i;\n while (c.i < c.end) {\n const ch = peek(c);\n if (flow && (ch === ',' || ch === ']' || ch === '}')) break;\n if (ch === '\\n' || ch === '\\r') break;\n if (ch === '#' && (c.i === start || c.text[c.i - 1] === ' ' || c.text[c.i - 1] === '\\t')) break;\n c.i += 1;\n }\n if (c.i === start) throw new YamlError(c.i);\n const raw = c.text.slice(start, c.i);\n const trimmed = raw.trimEnd();\n return scalar(interpretPlain(trimmed), start, start + trimmed.length);\n}\n\nfunction parseScalar(c: Ctx, flow: boolean): YamlScalar {\n const ch = peek(c);\n if (ch === '\"' || ch === \"'\") return parseQuoted(c);\n return parsePlain(c, flow);\n}\n\nfunction parseKey(c: Ctx): { name: string; start: number; end: number } {\n const start = c.i;\n if (peek(c) === '\"' || peek(c) === \"'\") {\n const quoted = parseQuoted(c);\n if (typeof quoted.value !== 'string') throw new YamlError(start);\n return { name: quoted.value, start, end: c.i };\n }\n let end = c.i;\n while (c.i < c.end) {\n const ch = peek(c);\n if (\n ch === ':' ||\n ch === '\\n' ||\n ch === '\\r' ||\n ch === ',' ||\n ch === '}' ||\n ch === ']' ||\n ch === '#' ||\n ch === '{' ||\n ch === '['\n ) {\n break;\n }\n c.i += 1;\n if (ch !== ' ' && ch !== '\\t') end = c.i;\n }\n if (end === start) throw new YamlError(c.i);\n c.i = end;\n return { name: c.text.slice(start, end), start, end };\n}\n\nfunction parseFlowValue(c: Ctx): YamlNode {\n skipFlowSpace(c);\n const ch = peek(c);\n if (ch === '{') return parseFlowMap(c);\n if (ch === '[') return parseFlowSeq(c);\n if (ch === '|' || ch === '>') throw new YamlError(c.i);\n return parseScalar(c, true);\n}\n\nfunction parseFlowMap(c: Ctx): YamlMap {\n const start = c.i;\n if (peek(c) !== '{') throw new YamlError(c.i);\n c.i += 1;\n skipFlowSpace(c);\n const entries: YamlEntry[] = [];\n const seen = new Set<string>();\n if (peek(c) === '}') {\n c.i += 1;\n return { kind: 'map', entries, start, end: c.i };\n }\n while (c.i < c.end) {\n skipFlowSpace(c);\n const key = parseKey(c);\n skipFlowSpace(c);\n if (peek(c) !== ':') throw new YamlError(c.i);\n c.i += 1;\n const value = parseFlowValue(c);\n if (seen.has(key.name)) throw new YamlError(key.start);\n seen.add(key.name);\n entries.push({ key: key.name, keyStart: key.start, keyEnd: key.end, value });\n skipFlowSpace(c);\n if (peek(c) === ',') {\n c.i += 1;\n continue;\n }\n if (peek(c) === '}') {\n c.i += 1;\n return { kind: 'map', entries, start, end: c.i };\n }\n throw new YamlError(c.i);\n }\n throw new YamlError(c.i);\n}\n\nfunction parseFlowSeq(c: Ctx): YamlSeq {\n const start = c.i;\n if (peek(c) !== '[') throw new YamlError(c.i);\n c.i += 1;\n skipFlowSpace(c);\n const items: YamlNode[] = [];\n if (peek(c) === ']') {\n c.i += 1;\n return { kind: 'seq', items, start, end: c.i };\n }\n while (c.i < c.end) {\n items.push(parseFlowValue(c));\n skipFlowSpace(c);\n if (peek(c) === ',') {\n c.i += 1;\n skipFlowSpace(c);\n continue;\n }\n if (peek(c) === ']') {\n c.i += 1;\n return { kind: 'seq', items, start, end: c.i };\n }\n throw new YamlError(c.i);\n }\n throw new YamlError(c.i);\n}\n\nfunction parseValue(c: Ctx, parentKeyIndent: number): YamlNode {\n skipSpaces(c);\n if (peek(c) === '#') skipToEol(c);\n const ch = peek(c);\n if (ch === '' || ch === '\\n' || ch === '\\r') {\n skipEol(c);\n skipBlankAndComments(c);\n if (c.i >= c.end) return scalar(null, c.i, c.i);\n const nextIndent = indentAt(c);\n if (nextIndent <= parentKeyIndent) return scalar(null, c.i, c.i);\n if (peek(c) === '-') return parseBlockSeq(c, nextIndent);\n if (peek(c) === '[') return parseFlowSeq(c);\n if (peek(c) === '{') return parseFlowMap(c);\n return parseBlockMap(c, nextIndent);\n }\n if (ch === '{') return parseFlowMap(c);\n if (ch === '[') return parseFlowSeq(c);\n if (ch === '|' || ch === '>') throw new YamlError(c.i);\n return parseScalar(c, false);\n}\n\nfunction parseBlockSeq(c: Ctx, indent: number): YamlSeq {\n const start = c.i;\n const items: YamlNode[] = [];\n let end = start;\n while (c.i < c.end) {\n skipBlankAndComments(c);\n if (c.i >= c.end) break;\n if (indentAt(c) !== indent) break;\n if (peek(c) !== '-') break;\n c.i += 1;\n items.push(parseValue(c, indent));\n end = c.i;\n }\n return { kind: 'seq', items, start, end };\n}\n\nfunction parseBlockMap(c: Ctx, indent: number): YamlMap {\n const start = c.i;\n const entries: YamlEntry[] = [];\n const seen = new Set<string>();\n let end = start;\n while (c.i < c.end) {\n skipBlankAndComments(c);\n if (c.i >= c.end) break;\n if (indentAt(c) < indent) break;\n if (indentAt(c) > indent) throw new YamlError(c.i);\n const key = parseKey(c);\n skipSpaces(c);\n if (peek(c) !== ':') throw new YamlError(c.i);\n c.i += 1;\n const value = parseValue(c, indent);\n if (seen.has(key.name)) throw new YamlError(key.start);\n seen.add(key.name);\n entries.push({ key: key.name, keyStart: key.start, keyEnd: key.end, value });\n end = c.i;\n }\n return { kind: 'map', entries, start, end };\n}\n\nexport function parseYamlMapping(text: string, start: number, end: number): YamlMap {\n const c: Ctx = { text, i: start, end };\n skipBlankAndComments(c);\n if (c.i >= end) return { kind: 'map', entries: [], start, end };\n if (peek(c) === '{') {\n const mapped = parseFlowMap(c);\n skipBlankAndComments(c);\n if (c.i < end) throw new YamlError(c.i);\n return mapped;\n }\n const mapped = parseBlockMap(c, indentAt(c));\n skipBlankAndComments(c);\n if (c.i < end) throw new YamlError(c.i);\n return mapped;\n}\n\nexport function jsValue(node: YamlNode): unknown {\n if (node.kind === 'scalar') return node.value;\n if (node.kind === 'seq') return node.items.map(jsValue);\n const record: Record<string, unknown> = {};\n for (const entry of node.entries) record[entry.key] = jsValue(entry.value);\n return record;\n}\n\nexport function mapEntry(map: YamlMap, key: string): YamlEntry | undefined {\n return map.entries.find((entry) => entry.key === key);\n}\n\nexport function isPlainSafe(text: string): boolean {\n if (text === '' || text === 'true' || text === 'false' || text === 'null') return false;\n if (/[\\s#:{}[\\],&*!|>'\"%@`]/.test(text)) return false;\n if (text.startsWith('-') || text.startsWith('?') || text.startsWith(':')) return false;\n if (/^-?(0|[1-9][0-9]*)(\\.[0-9]+)?([eE][+-]?[0-9]+)?$/.test(text)) return false;\n return true;\n}\n\nexport function serializeJs(value: unknown): string {\n if (value === null) return 'null';\n if (value === true) return 'true';\n if (value === false) return 'false';\n if (typeof value === 'number' && Number.isFinite(value)) return JSON.stringify(value);\n if (typeof value === 'string') return isPlainSafe(value) ? value : JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(serializeJs).join(', ')}]`;\n throw new YamlError(0);\n}\n\nexport function serializeKey(name: string): string {\n return isPlainSafe(name) || /^[A-Za-z][A-Za-z0-9_-]*$/.test(name) ? name : JSON.stringify(name);\n}\n\nexport function bodyStartAfterYaml(content: string, yamlEnd: number): number {\n const closeLine = content.indexOf('\\n', yamlEnd);\n return closeLine === -1 ? content.length : closeLine + 1;\n}\n\nexport function bodyAfterFrontmatter(content: string): string {\n const fence = extractFrontmatter(content);\n if (fence.kind !== 'ok') return content;\n return content.slice(bodyStartAfterYaml(content, fence.yamlEnd));\n}\n\nexport function extractFrontmatter(\n content: string,\n): { kind: 'none' } | { kind: 'unclosed' } | { kind: 'ok'; yamlStart: number; yamlEnd: number } {\n if (!content.startsWith('---')) return { kind: 'none' };\n const firstNl = content.indexOf('\\n');\n const firstLine =\n firstNl === -1\n ? content\n : content.slice(0, content[firstNl - 1] === '\\r' ? firstNl - 1 : firstNl);\n if (!/^---[ \\t]*$/.test(firstLine)) return { kind: 'none' };\n if (firstNl === -1) return { kind: 'unclosed' };\n const yamlStart = firstNl + 1;\n let i = yamlStart;\n while (i <= content.length) {\n const nl = content.indexOf('\\n', i);\n const lineEnd = nl === -1 ? content.length : nl;\n let line = content.slice(i, lineEnd);\n if (line.endsWith('\\r')) line = line.slice(0, -1);\n if (/^---[ \\t]*$/.test(line)) return { kind: 'ok', yamlStart, yamlEnd: i };\n if (nl === -1) return { kind: 'unclosed' };\n i = nl + 1;\n }\n return { kind: 'unclosed' };\n}\n\nexport function equalValue(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n if (Array.isArray(left) && Array.isArray(right)) {\n return (\n left.length === right.length && left.every((item, index) => equalValue(item, right[index]))\n );\n }\n return false;\n}\n\nexport function lineEnding(content: string): '\\n' | '\\r\\n' {\n return content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n}\n"],"names":["YamlError","Error","offset","name","peek","c","i","end","text","skipEol","skipSpaces","skipToEol","skipBlankAndComments","skipFlowSpace","ch","indentAt","j","n","scalar","value","start","kind","interpretPlain","test","Number","parseQuoted","quote","out","escaped","parsePlain","flow","raw","slice","trimmed","trimEnd","length","parseScalar","parseKey","quoted","parseFlowValue","parseFlowMap","parseFlowSeq","entries","seen","Set","key","has","add","push","keyStart","keyEnd","items","parseValue","parentKeyIndent","nextIndent","parseBlockSeq","parseBlockMap","indent","parseYamlMapping","mapped","jsValue","node","map","record","entry","mapEntry","find","isPlainSafe","startsWith","serializeJs","isFinite","JSON","stringify","Array","isArray","join","serializeKey","bodyStartAfterYaml","content","yamlEnd","closeLine","indexOf","bodyAfterFrontmatter","fence","extractFrontmatter","firstNl","firstLine","yamlStart","nl","lineEnd","line","endsWith","equalValue","left","right","every","item","index","lineEnding","includes"],"mappings":"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"}
@@ -1,8 +1,11 @@
1
1
  # Conformance fixtures
2
2
 
3
- Each directory under `cases/` is one Library state and one expected verdict.
4
- Consumers load the files under `library/` as path-to-content and compare
5
- `validate` against `expected.json`.
3
+ Each directory under `cases/` is one text Library, one validation context,
4
+ and one expected verdict. Consumers load the files under `library/` as
5
+ path-to-content, load the required `context.json` as `ValidationContext`, and
6
+ compare `validate(library, context)` against `expected.json`. Text-only cases
7
+ carry `{ "binaryTargets": [] }`. Binary targets are membership declarations;
8
+ the corpus supplies no binary bytes or placeholder Documents.
6
9
 
7
10
  ## Verdict format
8
11
 
@@ -34,6 +37,7 @@ replace it with the package's semantic version before comparing.
34
37
 
35
38
  | Rule | When |
36
39
  | ------------------------- | ---------------------------------------------------------------------- |
40
+ | `binary-target-document` | A path is declared as both a text Document and a binary target |
37
41
  | `frontmatter-fence` | A present frontmatter fence does not parse as the accepted YAML subset |
38
42
  | `definition-type` | A `types/` file is not a definition, or its type name is empty |
39
43
  | `definition-shape` | A definition carries a key other than `type`, `fields`, and `sections` |
@@ -55,7 +59,7 @@ replace it with the package's semantic version before comparing.
55
59
  | `unresolved-reference` | A reference does not resolve to a current file of the required type |
56
60
  | `unresolved-link` | A relative body link does not resolve to a current path |
57
61
  | `structured-section` | A declared structured-list section does not parse as a list |
58
- | `referenced-missing-file` | Remaining files still reference a path that is not in the Library |
62
+ | `referenced-missing-file` | Remaining files still reference an absent path |
59
63
 
60
64
  ## YAML subset
61
65
 
@@ -0,0 +1 @@
1
+ { "binaryTargets": [] }
@@ -0,0 +1,5 @@
1
+ {
2
+ "binaryTargets": [
3
+ "assets/person.bin"
4
+ ]
5
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "verdict": "refuse",
3
+ "file": "notes/draft.md",
4
+ "rule": "unresolved-reference",
5
+ "version": "<package-version>",
6
+ "location": "subject"
7
+ }
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: note
3
+ subject: ../assets/person.bin
4
+ ---
5
+
6
+ [Original](../assets/person.bin)
@@ -0,0 +1,5 @@
1
+ ---
2
+ type: definition
3
+ fields:
4
+ subject: { kind: reference, to: any, required: true }
5
+ ---
@@ -0,0 +1,5 @@
1
+ {
2
+ "binaryTargets": [
3
+ "notes/draft.md"
4
+ ]
5
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "verdict": "refuse",
3
+ "file": "notes/draft.md",
4
+ "rule": "binary-target-document",
5
+ "version": "<package-version>"
6
+ }
@@ -0,0 +1,3 @@
1
+ ---
2
+ type: definition
3
+ ---
@@ -0,0 +1,6 @@
1
+ {
2
+ "binaryTargets": [
3
+ "assets/existing.pdf",
4
+ "../outside.png"
5
+ ]
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "verdict": "refuse",
3
+ "file": "notes/draft.md",
4
+ "rule": "unresolved-link",
5
+ "version": "<package-version>"
6
+ }
@@ -0,0 +1,5 @@
1
+ ---
2
+ type: note
3
+ ---
4
+
5
+ ![Outside](../../outside.png)
@@ -0,0 +1,3 @@
1
+ ---
2
+ type: definition
3
+ ---
@@ -0,0 +1 @@
1
+ { "binaryTargets": ["constructor"] }
@@ -0,0 +1,7 @@
1
+ {
2
+ "verdict": "refuse",
3
+ "file": "notes/draft.md",
4
+ "rule": "unresolved-reference",
5
+ "version": "<package-version>",
6
+ "location": "subject"
7
+ }
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: note
3
+ subject: ../constructor
4
+ ---
5
+
6
+ [Original](../constructor)
@@ -0,0 +1,5 @@
1
+ ---
2
+ type: definition
3
+ fields:
4
+ subject: { kind: reference, to: any, required: true }
5
+ ---
@@ -0,0 +1,5 @@
1
+ {
2
+ "binaryTargets": [
3
+ "assets/person.bin"
4
+ ]
5
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "verdict": "refuse",
3
+ "file": "notes/draft.md",
4
+ "rule": "unresolved-reference",
5
+ "version": "<package-version>",
6
+ "location": "subject"
7
+ }
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: note
3
+ subject: ../assets/person.bin
4
+ ---
5
+
6
+ [Original](../assets/person.bin)
@@ -0,0 +1,5 @@
1
+ ---
2
+ type: definition
3
+ fields:
4
+ subject: { kind: reference, to: person, required: true }
5
+ ---
@@ -0,0 +1,3 @@
1
+ ---
2
+ type: definition
3
+ ---
@@ -0,0 +1,6 @@
1
+ {
2
+ "binaryTargets": [
3
+ "assets/manual.pdf",
4
+ "assets/figure.png"
5
+ ]
6
+ }
@@ -0,0 +1 @@
1
+ { "verdict": "accept" }
@@ -0,0 +1,7 @@
1
+ ---
2
+ type: note
3
+ ---
4
+
5
+ [Manual](../assets/manual.pdf)
6
+
7
+ ![Figure](../assets/./charts/../figure.png?download=1#detail)
@@ -0,0 +1,3 @@
1
+ ---
2
+ type: definition
3
+ ---
@@ -0,0 +1 @@
1
+ { "binaryTargets": [] }
@@ -0,0 +1 @@
1
+ { "binaryTargets": [] }
@@ -0,0 +1,6 @@
1
+ {
2
+ "binaryTargets": [
3
+ "assets/existing.pdf",
4
+ "../outside.png"
5
+ ]
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "verdict": "refuse",
3
+ "file": "notes/draft.md",
4
+ "rule": "unresolved-link",
5
+ "version": "<package-version>"
6
+ }
@@ -0,0 +1,5 @@
1
+ ---
2
+ type: note
3
+ ---
4
+
5
+ ![Missing](../assets/missing.png)
@@ -0,0 +1,3 @@
1
+ ---
2
+ type: definition
3
+ ---
@@ -0,0 +1,6 @@
1
+ {
2
+ "binaryTargets": [
3
+ "assets/existing.pdf",
4
+ "../outside.png"
5
+ ]
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "verdict": "refuse",
3
+ "file": "notes/draft.md",
4
+ "rule": "unresolved-link",
5
+ "version": "<package-version>"
6
+ }
@@ -0,0 +1,5 @@
1
+ ---
2
+ type: note
3
+ ---
4
+
5
+ [Missing](../assets/missing.pdf)
@@ -0,0 +1,3 @@
1
+ ---
2
+ type: definition
3
+ ---
@@ -0,0 +1 @@
1
+ { "binaryTargets": [] }
@@ -0,0 +1 @@
1
+ { "binaryTargets": [] }
@@ -0,0 +1 @@
1
+ { "binaryTargets": [] }
@@ -0,0 +1 @@
1
+ { "binaryTargets": [] }
@@ -0,0 +1 @@
1
+ { "binaryTargets": [] }
@@ -0,0 +1 @@
1
+ { "binaryTargets": [] }
@@ -0,0 +1 @@
1
+ { "binaryTargets": [] }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentshouse/mdmodel",
3
- "version": "0.1.0-alpha.1",
3
+ "version": "0.1.0-alpha.3",
4
4
  "description": "MD Type language, parser, validator, structured change application, Markdown syntax profile, and conformance fixtures",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -14,7 +14,7 @@
14
14
  "exports": {
15
15
  ".": {
16
16
  "types": "./dist/index.d.ts",
17
- "import": "./dist/index.js"
17
+ "default": "./dist/index.js"
18
18
  },
19
19
  "./package.json": "./package.json"
20
20
  },