@metaobjectsdev/metadata 0.7.0-rc.9 → 0.8.0-rc.1

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 (39) hide show
  1. package/dist/core/field/field-constants.d.ts +10 -0
  2. package/dist/core/field/field-constants.d.ts.map +1 -1
  3. package/dist/core/field/field-constants.js +13 -0
  4. package/dist/core/field/field-constants.js.map +1 -1
  5. package/dist/core/field/field-schema.d.ts +6 -0
  6. package/dist/core/field/field-schema.d.ts.map +1 -1
  7. package/dist/core/field/field-schema.js +32 -2
  8. package/dist/core/field/field-schema.js.map +1 -1
  9. package/dist/core-types.js +2 -2
  10. package/dist/core-types.js.map +1 -1
  11. package/dist/parser-core.js +10 -0
  12. package/dist/parser-core.js.map +1 -1
  13. package/dist/serializer-json.js +36 -1
  14. package/dist/serializer-json.js.map +1 -1
  15. package/dist/shared/meta-data.d.ts +15 -0
  16. package/dist/shared/meta-data.d.ts.map +1 -1
  17. package/dist/shared/meta-data.js +33 -0
  18. package/dist/shared/meta-data.js.map +1 -1
  19. package/dist/super-resolve.d.ts +4 -3
  20. package/dist/super-resolve.d.ts.map +1 -1
  21. package/dist/super-resolve.js +28 -11
  22. package/dist/super-resolve.js.map +1 -1
  23. package/dist/template/template-constants.d.ts +7 -0
  24. package/dist/template/template-constants.d.ts.map +1 -1
  25. package/dist/template/template-constants.js +13 -0
  26. package/dist/template/template-constants.js.map +1 -1
  27. package/dist/template/template-schema.d.ts.map +1 -1
  28. package/dist/template/template-schema.js +12 -2
  29. package/dist/template/template-schema.js.map +1 -1
  30. package/package.json +1 -1
  31. package/src/core/field/field-constants.ts +18 -0
  32. package/src/core/field/field-schema.ts +41 -0
  33. package/src/core-types.ts +2 -2
  34. package/src/parser-core.ts +11 -0
  35. package/src/serializer-json.ts +37 -1
  36. package/src/shared/meta-data.ts +35 -0
  37. package/src/super-resolve.ts +28 -15
  38. package/src/template/template-constants.ts +16 -0
  39. package/src/template/template-schema.ts +16 -1
@@ -26,9 +26,10 @@ export interface DeferredSuperFailure {
26
26
  * have been parsed with deferSuperResolution: true. Unresolved refs are
27
27
  * collected and returned — caller decides whether to throw or warn.
28
28
  *
29
- * Tracks an inherited context package while walking so children whose own
30
- * `package` is unset (e.g., fields inside an object) still resolve against
31
- * the parent's package matching the parser's eager-resolution semantics.
29
+ * The referrer's context package (for bare/same-package shorthand refs) comes
30
+ * from the node's own `package`, else the file-default package captured at
31
+ * PARSE time (`fileDefaultPackage`). Both are order- and merge-independent, so
32
+ * resolution does not depend on the post-merge tree shape.
32
33
  *
33
34
  * Idempotent: nodes that already have superResolved set are skipped.
34
35
  */
@@ -1 +1 @@
1
- {"version":3,"file":"super-resolve.d.ts","sourceRoot":"","sources":["../src/super-resolve.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAwBtD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,QAAQ,GACb,QAAQ,GAAG,SAAS,CAsCtB;AAMD,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,mEAAmE;IACnE,MAAM,EAAE,OAAO,aAAa,EAAE,WAAW,CAAC;CAC3C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,oBAAoB,EAAE,CAkB5E"}
1
+ {"version":3,"file":"super-resolve.d.ts","sourceRoot":"","sources":["../src/super-resolve.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAyCtD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,QAAQ,GACb,QAAQ,GAAG,SAAS,CAsCtB;AAMD,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,mEAAmE;IACnE,MAAM,EAAE,OAAO,aAAa,EAAE,WAAW,CAAC;CAC3C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,oBAAoB,EAAE,CAkB5E"}
@@ -15,12 +15,29 @@ import { PACKAGE_SEPARATOR, PACKAGE_PARENT } from "./shared/structural.js";
15
15
  // Tree search helper
16
16
  // ---------------------------------------------------------------------------
17
17
  /**
18
- * Recursively searches the tree for a node whose fqn() matches.
19
- * Returns the first match, or undefined.
18
+ * Recursively searches the tree for a node whose qualified name matches `fqn`.
19
+ *
20
+ * A node is matched by its own `fqn()` (covers the explicit-package and
21
+ * no-package-at-all cases) OR by its EFFECTIVE qualified key
22
+ * `<fileDefaultPackage>::<name>` (`MetaData.resolutionKey()`) — the
23
+ * file-default package captured at PARSE time. This mirrors Java, where
24
+ * `BaseMetaDataParser` folds the file-default package into the registered name
25
+ * at parse time (so an object `BaseEntity` declared under `package: acme` is
26
+ * registered as `acme::BaseEntity` and a fully-qualified `extends:
27
+ * acme::BaseEntity` resolves) — even though TS keeps object `fqn()` bare for
28
+ * the FR5d referrer-envelope cross-port contract.
29
+ *
30
+ * Because the resolution key is captured at parse time (not derived from the
31
+ * post-merge tree), this is independent of load order AND of whether the base
32
+ * node's file-default package differs from the referrer's — the cross-PACKAGE
33
+ * cross-file case. No package is threaded down the walk anymore.
20
34
  */
21
35
  function findInTree(root, fqn) {
22
36
  if (root.fqn() === fqn)
23
37
  return root;
38
+ if (root.package === undefined && root.name !== "" && root.resolutionKey() === fqn) {
39
+ return root;
40
+ }
24
41
  for (const child of root.ownChildren()) {
25
42
  const found = findInTree(child, fqn);
26
43
  if (found !== undefined)
@@ -85,20 +102,21 @@ export function resolveSuperRef(ref, contextPackage, root) {
85
102
  * have been parsed with deferSuperResolution: true. Unresolved refs are
86
103
  * collected and returned — caller decides whether to throw or warn.
87
104
  *
88
- * Tracks an inherited context package while walking so children whose own
89
- * `package` is unset (e.g., fields inside an object) still resolve against
90
- * the parent's package matching the parser's eager-resolution semantics.
105
+ * The referrer's context package (for bare/same-package shorthand refs) comes
106
+ * from the node's own `package`, else the file-default package captured at
107
+ * PARSE time (`fileDefaultPackage`). Both are order- and merge-independent, so
108
+ * resolution does not depend on the post-merge tree shape.
91
109
  *
92
110
  * Idempotent: nodes that already have superResolved set are skipped.
93
111
  */
94
112
  export function resolveDeferredSupers(root) {
95
113
  const failures = [];
96
- walk(root, "", (node, ctxPkg) => {
114
+ walk(root, (node) => {
97
115
  if (node.superRef === undefined)
98
116
  return;
99
117
  if (node.superResolved !== undefined)
100
118
  return;
101
- const effectivePkg = node.package ?? ctxPkg;
119
+ const effectivePkg = node.package ?? node.fileDefaultPackage ?? "";
102
120
  const target = resolveSuperRef(node.superRef, effectivePkg, root);
103
121
  if (target !== undefined) {
104
122
  try {
@@ -114,11 +132,10 @@ export function resolveDeferredSupers(root) {
114
132
  });
115
133
  return failures;
116
134
  }
117
- function walk(node, ctxPkg, visit) {
118
- visit(node, ctxPkg);
119
- const nextCtx = node.package ?? ctxPkg;
135
+ function walk(node, visit) {
136
+ visit(node);
120
137
  for (const child of node.ownChildren()) {
121
- walk(child, nextCtx, visit);
138
+ walk(child, visit);
122
139
  }
123
140
  }
124
141
  //# sourceMappingURL=super-resolve.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"super-resolve.js","sourceRoot":"","sources":["../src/super-resolve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"super-resolve.js","sourceRoot":"","sources":["../src/super-resolve.ts"],"names":[],"mappings":"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"}
@@ -16,4 +16,11 @@ export declare const TEMPLATE_ATTR_MODEL = "model";
16
16
  export declare const TEMPLATE_ATTR_TOOL_NAME = "toolName";
17
17
  export declare const TEMPLATE_FORMATS: readonly ["text", "html", "xml", "csv", "json", "markdown", "spreadsheet"];
18
18
  export type TemplateFormat = (typeof TEMPLATE_FORMATS)[number];
19
+ export declare const TEMPLATE_ATTR_PROMPT_STYLE = "promptStyle";
20
+ export declare const PROMPT_STYLE_GUIDE = "guide";
21
+ export declare const PROMPT_STYLE_INLINE = "inline";
22
+ export declare const PROMPT_STYLE_EXAMPLE_ONLY = "exampleOnly";
23
+ export declare const PROMPT_STYLE_DEFAULT = "guide";
24
+ export declare const PROMPT_STYLES: readonly ["guide", "inline", "exampleOnly"];
25
+ export type PromptStyle = (typeof PROMPT_STYLES)[number];
19
26
  //# sourceMappingURL=template-constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"template-constants.d.ts","sourceRoot":"","sources":["../../src/template/template-constants.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAChD,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAChD,eAAO,MAAM,yBAAyB,aAAa,CAAC;AAEpD,eAAO,MAAM,iBAAiB,mDAKpB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAIjE,eAAO,MAAM,yBAAyB,eAAe,CAAC;AACtD,eAAO,MAAM,sBAAsB,YAAY,CAAC;AAChD,eAAO,MAAM,oBAAoB,WAAW,CAAC;AAC7C,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAClD,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAC3C,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAI3C,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAG1D,eAAO,MAAM,wBAAwB,cAAc,CAAC;AACpD,eAAO,MAAM,4BAA4B,kBAAkB,CAAC;AAC5D,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAU3C,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAIlD,eAAO,MAAM,gBAAgB,4EAQnB,CAAC;AACX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"template-constants.d.ts","sourceRoot":"","sources":["../../src/template/template-constants.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAChD,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAChD,eAAO,MAAM,yBAAyB,aAAa,CAAC;AAEpD,eAAO,MAAM,iBAAiB,mDAKpB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAIjE,eAAO,MAAM,yBAAyB,eAAe,CAAC;AACtD,eAAO,MAAM,sBAAsB,YAAY,CAAC;AAChD,eAAO,MAAM,oBAAoB,WAAW,CAAC;AAC7C,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAClD,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAC3C,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAI3C,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAG1D,eAAO,MAAM,wBAAwB,cAAc,CAAC;AACpD,eAAO,MAAM,4BAA4B,kBAAkB,CAAC;AAC5D,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAU3C,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAIlD,eAAO,MAAM,gBAAgB,4EAQnB,CAAC;AACX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAK/D,eAAO,MAAM,0BAA0B,gBAAgB,CAAC;AACxD,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAC1C,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAC5C,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;AACvD,eAAO,MAAM,oBAAoB,UAAqB,CAAC;AAEvD,eAAO,MAAM,aAAa,6CAIhB,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC"}
@@ -59,4 +59,17 @@ export const TEMPLATE_FORMATS = [
59
59
  "markdown",
60
60
  "spreadsheet",
61
61
  ];
62
+ // FR-010 artifact-1 prompt presentation style (template.output only). Closed enum;
63
+ // guidance is NEVER carried in comments. Default "guide". Set project-wide via an
64
+ // abstract template base + extends, with a render-time override on top.
65
+ export const TEMPLATE_ATTR_PROMPT_STYLE = "promptStyle";
66
+ export const PROMPT_STYLE_GUIDE = "guide";
67
+ export const PROMPT_STYLE_INLINE = "inline";
68
+ export const PROMPT_STYLE_EXAMPLE_ONLY = "exampleOnly";
69
+ export const PROMPT_STYLE_DEFAULT = PROMPT_STYLE_GUIDE;
70
+ export const PROMPT_STYLES = [
71
+ PROMPT_STYLE_GUIDE,
72
+ PROMPT_STYLE_INLINE,
73
+ PROMPT_STYLE_EXAMPLE_ONLY,
74
+ ];
62
75
  //# sourceMappingURL=template-constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"template-constants.js","sourceRoot":"","sources":["../../src/template/template-constants.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,EAAE;AACF,8EAA8E;AAC9E,uEAAuE;AACvE,kBAAkB;AAClB,8EAA8E;AAC9E,qDAAqD;AACrD,2EAA2E;AAC3E,qDAAqD;AACrD,6EAA6E;AAC7E,kFAAkF;AAClF,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,6DAA6D;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;AAChD,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;AAChD,MAAM,CAAC,MAAM,yBAAyB,GAAG,UAAU,CAAC;AAEpD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,YAAY;IACZ,uBAAuB;IACvB,uBAAuB;IACvB,yBAAyB;CACjB,CAAC;AAGX,6EAA6E;AAC7E,+DAA+D;AAC/D,MAAM,CAAC,MAAM,yBAAyB,GAAG,YAAY,CAAC;AACtD,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAC7C,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,mFAAmF;AACnF,+EAA+E;AAC/E,uDAAuD;AACvD,MAAM,CAAC,MAAM,2BAA2B,GAAG,cAAc,CAAC;AAE1D,+CAA+C;AAC/C,MAAM,CAAC,MAAM,wBAAwB,GAAG,WAAW,CAAC;AACpD,MAAM,CAAC,MAAM,4BAA4B,GAAG,eAAe,CAAC;AAC5D,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAE3C,4EAA4E;AAC5E,8EAA8E;AAC9E,8CAA8C;AAC9C,EAAE;AACF,8EAA8E;AAC9E,sEAAsE;AACtE,yEAAyE;AACzE,gBAAgB;AAChB,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC;AAElD,4EAA4E;AAC5E,gDAAgD;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;IACN,UAAU;IACV,aAAa;CACL,CAAC"}
1
+ {"version":3,"file":"template-constants.js","sourceRoot":"","sources":["../../src/template/template-constants.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,EAAE;AACF,8EAA8E;AAC9E,uEAAuE;AACvE,kBAAkB;AAClB,8EAA8E;AAC9E,qDAAqD;AACrD,2EAA2E;AAC3E,qDAAqD;AACrD,6EAA6E;AAC7E,kFAAkF;AAClF,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,6DAA6D;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;AAChD,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;AAChD,MAAM,CAAC,MAAM,yBAAyB,GAAG,UAAU,CAAC;AAEpD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,YAAY;IACZ,uBAAuB;IACvB,uBAAuB;IACvB,yBAAyB;CACjB,CAAC;AAGX,6EAA6E;AAC7E,+DAA+D;AAC/D,MAAM,CAAC,MAAM,yBAAyB,GAAG,YAAY,CAAC;AACtD,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAC7C,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,mFAAmF;AACnF,+EAA+E;AAC/E,uDAAuD;AACvD,MAAM,CAAC,MAAM,2BAA2B,GAAG,cAAc,CAAC;AAE1D,+CAA+C;AAC/C,MAAM,CAAC,MAAM,wBAAwB,GAAG,WAAW,CAAC;AACpD,MAAM,CAAC,MAAM,4BAA4B,GAAG,eAAe,CAAC;AAC5D,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAE3C,4EAA4E;AAC5E,8EAA8E;AAC9E,8CAA8C;AAC9C,EAAE;AACF,8EAA8E;AAC9E,sEAAsE;AACtE,yEAAyE;AACzE,gBAAgB;AAChB,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC;AAElD,4EAA4E;AAC5E,gDAAgD;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;IACN,UAAU;IACV,aAAa;CACL,CAAC;AAGX,mFAAmF;AACnF,kFAAkF;AAClF,wEAAwE;AACxE,MAAM,CAAC,MAAM,0BAA0B,GAAG,aAAa,CAAC;AACxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAC5C,MAAM,CAAC,MAAM,yBAAyB,GAAG,aAAa,CAAC;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEvD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kBAAkB;IAClB,mBAAmB;IACnB,yBAAyB;CACjB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"template-schema.d.ts","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAuIjD,eAAO,MAAM,kBAAkB,2BAK7B,CAAC"}
1
+ {"version":3,"file":"template-schema.d.ts","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAsJjD,eAAO,MAAM,kBAAkB,2BAK7B,CAAC"}
@@ -7,7 +7,7 @@
7
7
  // `verify` scope (Plan #3), not load-time validation.
8
8
  import { ATTR_SUBTYPE_STRING, ATTR_SUBTYPE_INT, ATTR_SUBTYPE_STRINGARRAY, } from "../core/attr/attr-constants.js";
9
9
  import { SUBTYPE_BASE } from "../shared/base-types.js";
10
- import { TEMPLATE_SUBTYPE_PROMPT, TEMPLATE_SUBTYPE_OUTPUT, TEMPLATE_SUBTYPE_TOOLCALL, TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_TEXT_REF, TEMPLATE_ATTR_FORMAT, TEMPLATE_ATTR_MAX_CHARS, TEMPLATE_ATTR_OWNER, TEMPLATE_ATTR_SINCE, TEMPLATE_ATTR_REQUIRED_TAGS, TEMPLATE_ATTR_MAX_TOKENS, TEMPLATE_ATTR_REQUIRED_SLOTS, TEMPLATE_ATTR_MODEL, TEMPLATE_ATTR_TOOL_NAME, TEMPLATE_FORMATS, } from "./template-constants.js";
10
+ import { TEMPLATE_SUBTYPE_PROMPT, TEMPLATE_SUBTYPE_OUTPUT, TEMPLATE_SUBTYPE_TOOLCALL, TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_TEXT_REF, TEMPLATE_ATTR_FORMAT, TEMPLATE_ATTR_MAX_CHARS, TEMPLATE_ATTR_OWNER, TEMPLATE_ATTR_SINCE, TEMPLATE_ATTR_REQUIRED_TAGS, TEMPLATE_ATTR_MAX_TOKENS, TEMPLATE_ATTR_REQUIRED_SLOTS, TEMPLATE_ATTR_MODEL, TEMPLATE_ATTR_TOOL_NAME, TEMPLATE_FORMATS, TEMPLATE_ATTR_PROMPT_STYLE, PROMPT_STYLE_DEFAULT, PROMPT_STYLES, } from "./template-constants.js";
11
11
  // Generic attrs shared by template.prompt and template.output.
12
12
  const genericAttrs = [
13
13
  {
@@ -55,6 +55,16 @@ const genericAttrs = [
55
55
  description: "Output tags the rendered text must contain (drives the verify output-tag check).",
56
56
  },
57
57
  ];
58
+ // FR-010 artifact-1: output-format prompt presentation style (template.output only).
59
+ // Closed enum, enforced via allowedValues exactly like @format. Default "guide".
60
+ const promptStyleAttr = {
61
+ name: TEMPLATE_ATTR_PROMPT_STYLE,
62
+ valueType: ATTR_SUBTYPE_STRING,
63
+ required: false,
64
+ default: PROMPT_STYLE_DEFAULT,
65
+ allowedValues: [...PROMPT_STYLES],
66
+ description: "FR-010 output-format prompt presentation: 'guide' (prose list + example), 'inline' (inline placeholders / enum choices), or 'exampleOnly' (filled skeleton). Guidance is never emitted as comments.",
67
+ };
58
68
  // LLM-overlay attrs (template.prompt only).
59
69
  const promptOverlayAttrs = [
60
70
  {
@@ -118,7 +128,7 @@ const toolcallAttrs = [
118
128
  export const TEMPLATE_ATTRS_MAP = new Map([
119
129
  [SUBTYPE_BASE, []],
120
130
  [TEMPLATE_SUBTYPE_PROMPT, [...genericAttrs, ...promptOverlayAttrs]],
121
- [TEMPLATE_SUBTYPE_OUTPUT, [...genericAttrs]],
131
+ [TEMPLATE_SUBTYPE_OUTPUT, [...genericAttrs, promptStyleAttr]],
122
132
  [TEMPLATE_SUBTYPE_TOOLCALL, [...toolcallAttrs]],
123
133
  ]);
124
134
  //# sourceMappingURL=template-schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"template-schema.js","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template-schema.js","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metaobjectsdev/metadata",
3
- "version": "0.7.0-rc.9",
3
+ "version": "0.8.0-rc.1",
4
4
  "description": "Metamodel loader, types, and constants for the MetaObjects standard.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -117,3 +117,21 @@ export const FIELD_ATTR_VALUES = "values";
117
117
  * stored string with no name↔value divergence.
118
118
  */
119
119
  export const ENUM_MEMBER_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
120
+
121
+ /** FR-010: map of off-vocabulary token → canonical enum member, feeding the
122
+ * tolerant recover alias-fold. `properties`-shaped; only on field.enum. */
123
+ export const FIELD_ATTR_ENUM_ALIAS = "enumAlias";
124
+
125
+ /** FR-010: map of enum member → human-readable description, shown per-member in
126
+ * the 'guide'-style output-format prompt fragment. `properties`-shaped; only on field.enum. */
127
+ export const FIELD_ATTR_ENUM_DOC = "enumDoc";
128
+
129
+ // ---------------------------------------------------------------------------
130
+ // FR-010 field-teaching attrs (on any field; drive the output-format prompt)
131
+ // ---------------------------------------------------------------------------
132
+
133
+ /** FR-010: an example value for this field, shown in the generated prompt fragment. */
134
+ export const FIELD_ATTR_EXAMPLE = "example";
135
+
136
+ /** FR-010: a short instruction for this field, shown in the generated prompt fragment. */
137
+ export const FIELD_ATTR_INSTRUCTION = "instruction";
@@ -7,6 +7,7 @@ import {
7
7
  ATTR_SUBTYPE_INT,
8
8
  ATTR_SUBTYPE_BOOLEAN,
9
9
  ATTR_SUBTYPE_STRINGARRAY,
10
+ ATTR_SUBTYPE_PROPERTIES,
10
11
  } from "../attr/attr-constants.js";
11
12
  import { SORT_ORDER_VALUES } from "../query/query-constants.js";
12
13
  import {
@@ -27,6 +28,10 @@ import {
27
28
  FIELD_ATTR_AUTO_SET,
28
29
  AUTO_SET_VALUES,
29
30
  FIELD_ATTR_VALUES,
31
+ FIELD_ATTR_ENUM_ALIAS,
32
+ FIELD_ATTR_ENUM_DOC,
33
+ FIELD_ATTR_EXAMPLE,
34
+ FIELD_ATTR_INSTRUCTION,
30
35
  } from "./field-constants.js";
31
36
 
32
37
  /** Attrs common to every field subtype (codegen-ts column mapper + Project D filter/sort). */
@@ -124,6 +129,22 @@ export const commonFieldAttrs: AttrSchema[] = [
124
129
  description:
125
130
  "Auto-set semantics for timestamp-like fields: 'onCreate' stamps on insert, 'onUpdate' stamps on every write.",
126
131
  },
132
+ // FR-010 field-teaching attrs (any field): free-text shown in the generated
133
+ // output-format prompt fragment. Never carried in comments.
134
+ {
135
+ name: FIELD_ATTR_EXAMPLE,
136
+ valueType: ATTR_SUBTYPE_STRING,
137
+ required: false,
138
+ description:
139
+ "FR-010: an example value for this field, shown in the generated output-format prompt fragment.",
140
+ },
141
+ {
142
+ name: FIELD_ATTR_INSTRUCTION,
143
+ valueType: ATTR_SUBTYPE_STRING,
144
+ required: false,
145
+ description:
146
+ "FR-010: a short instruction for this field, shown in the generated output-format prompt fragment.",
147
+ },
127
148
  ];
128
149
 
129
150
  /** The @currency attr — only on field.currency. */
@@ -144,3 +165,23 @@ export const enumFieldAttr: AttrSchema = {
144
165
  description:
145
166
  "Member symbols of an enum-subtype field. Declaration order is significant; each is a legal identifier and its own stored string.",
146
167
  };
168
+
169
+ /** The @enumAlias attr — only on field.enum. Map of off-vocabulary token → canonical
170
+ * member, feeding the FR-010 tolerant recover alias-fold (runtime aliases win on conflict). */
171
+ export const enumAliasAttr: AttrSchema = {
172
+ name: FIELD_ATTR_ENUM_ALIAS,
173
+ valueType: ATTR_SUBTYPE_PROPERTIES,
174
+ required: false,
175
+ description:
176
+ "Map of alternate/off-vocabulary tokens to canonical enum members; feeds the FR-010 tolerant recover alias-fold.",
177
+ };
178
+
179
+ /** The @enumDoc attr — only on field.enum. Map of member → human-readable description,
180
+ * shown per-member in the FR-010 'guide'-style output-format prompt fragment. */
181
+ export const enumDocAttr: AttrSchema = {
182
+ name: FIELD_ATTR_ENUM_DOC,
183
+ valueType: ATTR_SUBTYPE_PROPERTIES,
184
+ required: false,
185
+ description:
186
+ "Map of enum member to a human-readable description; shown per-member in the FR-010 'guide'-style prompt fragment.",
187
+ };
package/src/core-types.ts CHANGED
@@ -35,7 +35,7 @@ import { MetaRelationship } from "./core/relationship/meta-relationship.js";
35
35
  import { MetaLayout } from "./presentation/layout/meta-layout.js";
36
36
  import { MetaSource } from "./persistence/source/meta-source.js";
37
37
  import { MetaOrigin, MetaPassthroughOrigin, MetaAggregateOrigin, MetaCollectionOrigin } from "./persistence/origin/meta-origin.js";
38
- import { commonFieldAttrs, currencyFieldAttr, enumFieldAttr } from "./core/field/field-schema.js";
38
+ import { commonFieldAttrs, currencyFieldAttr, enumFieldAttr, enumAliasAttr, enumDocAttr } from "./core/field/field-schema.js";
39
39
  import { objectAttrs } from "./core/object/object-schema.js";
40
40
  import { relationshipAttrs } from "./core/relationship/relationship-schema.js";
41
41
  import { identityFieldsAttr, IDENTITY_ATTRS_MAP } from "./core/identity/identity-schema.js";
@@ -202,7 +202,7 @@ function registerCoreTypeDefs(registry: TypeRegistry): void {
202
202
  subType === FIELD_SUBTYPE_CURRENCY
203
203
  ? [...commonFieldAttrs, { ...currencyFieldAttr }]
204
204
  : subType === FIELD_SUBTYPE_ENUM
205
- ? [...commonFieldAttrs, { ...enumFieldAttr }]
205
+ ? [...commonFieldAttrs, { ...enumFieldAttr }, { ...enumAliasAttr }, { ...enumDocAttr }]
206
206
  : [...commonFieldAttrs];
207
207
  registry.register(
208
208
  def(TYPE_FIELD, subType, `Field of type ${subType}`, fieldRules, MetaField, fieldAttrs,
@@ -489,6 +489,17 @@ function parseNodeFresh(
489
489
  // is the only caller during loading; freeze runs in the loader after).
490
490
  populateNodeSource(model);
491
491
 
492
+ // --- Capture the file-default package at PARSE time (resolution-only) ---
493
+ // `inheritedContextPkg` is the package threaded down from the file's root
494
+ // `metadata.package` (the nearest packaged ancestor). Recording it here —
495
+ // when the declaring file's package is known — lets super-resolution match
496
+ // this node by its effective qualified key regardless of post-merge tree
497
+ // shape or load order. This does NOT touch the node's `package` or `fqn()`
498
+ // (objects stay bare per FR5d). Mirrors Java's parse-time getDefaultPackageName().
499
+ if (inheritedContextPkg !== "") {
500
+ model.setFileDefaultPackage(inheritedContextPkg);
501
+ }
502
+
492
503
  // --- Apply reserved keys (package, extends, abstract, isArray) ---
493
504
  applyReservedKeys(model, nodeData, strict, source, path, warnings, inheritedContextPkg);
494
505
 
@@ -198,8 +198,10 @@ function sortAttrKeys(value: unknown): unknown {
198
198
  if (k === RESERVED_KEY_CHILDREN) continue;
199
199
  result[k] = sortAttrKeys(obj[k]);
200
200
  }
201
+ // @-attr values: an object-typed attr value (e.g. @enumDoc / @filter) gets
202
+ // the value-shape canonical-order treatment; everything else recurses normally.
201
203
  for (const k of attrKeys) {
202
- result[k] = sortAttrKeys(obj[k]);
204
+ result[k] = sortAttrValue(obj[k]);
203
205
  }
204
206
  if (hasChildren) {
205
207
  result[RESERVED_KEY_CHILDREN] = sortAttrKeys(obj[RESERVED_KEY_CHILDREN]);
@@ -208,3 +210,37 @@ function sortAttrKeys(value: unknown): unknown {
208
210
  }
209
211
  return value;
210
212
  }
213
+
214
+ /**
215
+ * Canonicalize an inline @-attr's value. The two object-typed attr subtypes need
216
+ * different key order in canonical form, and the serializer is schema-free — so
217
+ * distinguish by value shape, which exactly tracks the subtype:
218
+ * • `properties` (e.g. @enumDoc / @enumAlias) is a flat scalar→scalar map → keys
219
+ * sort ordinally (cross-port canonical form; matches the Java reference, whose
220
+ * Properties is unordered and serializes sorted).
221
+ * • `filter` maps a field to an operator object ({eq:…}/{in:[…]}) or carries
222
+ * or/and arrays — at least one value is itself an object/array → declaration
223
+ * order is preserved (significant). The filter desugar runs before serialization,
224
+ * so a filter clause is never a bare scalar.
225
+ * Mirrors the C# AttrObjectToJsonNode value-shape heuristic.
226
+ */
227
+ function sortAttrValue(value: unknown): unknown {
228
+ if (Array.isArray(value)) {
229
+ return value.map(sortAttrValue);
230
+ }
231
+ if (value !== null && typeof value === "object") {
232
+ const obj = value as Record<string, unknown>;
233
+ const keys = Object.keys(obj);
234
+ const allScalar = keys.every((k) => {
235
+ const v = obj[k];
236
+ return v === null || typeof v !== "object";
237
+ });
238
+ const orderedKeys = allScalar ? [...keys].sort() : keys;
239
+ const result: Record<string, unknown> = {};
240
+ for (const k of orderedKeys) {
241
+ result[k] = sortAttrValue(obj[k]);
242
+ }
243
+ return result;
244
+ }
245
+ return value;
246
+ }
@@ -24,6 +24,16 @@ export abstract class MetaData {
24
24
 
25
25
  // Identity / packaging
26
26
  package?: string;
27
+ // Resolution-only: the file-default package (the top-level `metadata.package`)
28
+ // of the FILE in which this node was declared, captured at PARSE time. This is
29
+ // NOT folded into fqn() (object fqn() stays BARE for the FR5d cross-port
30
+ // referrer-envelope contract) — it exists solely so super-resolution can match
31
+ // a node by its EFFECTIVE qualified key `<fileDefaultPackage>::<name>` even
32
+ // when the node carries no own `package`. Capturing it at parse time (when the
33
+ // declaring file's package is known) makes resolution independent of load
34
+ // order and post-merge tree shape. Mirrors Java's BaseMetaDataParser, which
35
+ // folds getDefaultPackageName() into the registered name at parse time.
36
+ fileDefaultPackage?: string;
27
37
  superRef?: string; // raw super reference string, pre-resolution
28
38
  private _superData?: MetaData; // post-resolution pointer; set by setSuperResolved() after parsing
29
39
  isAbstract: boolean = false;
@@ -132,6 +142,31 @@ export abstract class MetaData {
132
142
  this.package = pkg;
133
143
  }
134
144
 
145
+ /**
146
+ * Loader-internal: record the file-default package captured at parse time.
147
+ * See the `fileDefaultPackage` field doc. Honors the frozen-guard.
148
+ * @internal
149
+ */
150
+ setFileDefaultPackage(pkg: string): void {
151
+ this._assertNotFrozen();
152
+ this.fileDefaultPackage = pkg;
153
+ }
154
+
155
+ /**
156
+ * The node's EFFECTIVE qualified key for super-resolution matching:
157
+ * `<pkg>::<name>` where pkg is the node's own package if set, else the
158
+ * file-default package captured at parse time. Returns the bare name when
159
+ * neither is available. Used by super-resolution ONLY — distinct from fqn(),
160
+ * which stays bare for objects per the FR5d cross-port contract.
161
+ */
162
+ resolutionKey(): string {
163
+ const pkg = this.package ?? this.fileDefaultPackage;
164
+ if (pkg !== undefined && pkg !== "") {
165
+ return `${pkg}${PACKAGE_SEPARATOR}${this.name}`;
166
+ }
167
+ return this.name;
168
+ }
169
+
135
170
  // ---------------------------------------------------------------------------
136
171
  // Super
137
172
  // ---------------------------------------------------------------------------
@@ -19,11 +19,28 @@ import { PACKAGE_SEPARATOR, PACKAGE_PARENT } from "./shared/structural.js";
19
19
  // ---------------------------------------------------------------------------
20
20
 
21
21
  /**
22
- * Recursively searches the tree for a node whose fqn() matches.
23
- * Returns the first match, or undefined.
22
+ * Recursively searches the tree for a node whose qualified name matches `fqn`.
23
+ *
24
+ * A node is matched by its own `fqn()` (covers the explicit-package and
25
+ * no-package-at-all cases) OR by its EFFECTIVE qualified key
26
+ * `<fileDefaultPackage>::<name>` (`MetaData.resolutionKey()`) — the
27
+ * file-default package captured at PARSE time. This mirrors Java, where
28
+ * `BaseMetaDataParser` folds the file-default package into the registered name
29
+ * at parse time (so an object `BaseEntity` declared under `package: acme` is
30
+ * registered as `acme::BaseEntity` and a fully-qualified `extends:
31
+ * acme::BaseEntity` resolves) — even though TS keeps object `fqn()` bare for
32
+ * the FR5d referrer-envelope cross-port contract.
33
+ *
34
+ * Because the resolution key is captured at parse time (not derived from the
35
+ * post-merge tree), this is independent of load order AND of whether the base
36
+ * node's file-default package differs from the referrer's — the cross-PACKAGE
37
+ * cross-file case. No package is threaded down the walk anymore.
24
38
  */
25
39
  function findInTree(root: MetaData, fqn: string): MetaData | undefined {
26
40
  if (root.fqn() === fqn) return root;
41
+ if (root.package === undefined && root.name !== "" && root.resolutionKey() === fqn) {
42
+ return root;
43
+ }
27
44
  for (const child of root.ownChildren()) {
28
45
  const found = findInTree(child, fqn);
29
46
  if (found !== undefined) return found;
@@ -110,18 +127,19 @@ export interface DeferredSuperFailure {
110
127
  * have been parsed with deferSuperResolution: true. Unresolved refs are
111
128
  * collected and returned — caller decides whether to throw or warn.
112
129
  *
113
- * Tracks an inherited context package while walking so children whose own
114
- * `package` is unset (e.g., fields inside an object) still resolve against
115
- * the parent's package matching the parser's eager-resolution semantics.
130
+ * The referrer's context package (for bare/same-package shorthand refs) comes
131
+ * from the node's own `package`, else the file-default package captured at
132
+ * PARSE time (`fileDefaultPackage`). Both are order- and merge-independent, so
133
+ * resolution does not depend on the post-merge tree shape.
116
134
  *
117
135
  * Idempotent: nodes that already have superResolved set are skipped.
118
136
  */
119
137
  export function resolveDeferredSupers(root: MetaData): DeferredSuperFailure[] {
120
138
  const failures: DeferredSuperFailure[] = [];
121
- walk(root, "", (node, ctxPkg) => {
139
+ walk(root, (node) => {
122
140
  if (node.superRef === undefined) return;
123
141
  if (node.superResolved !== undefined) return;
124
- const effectivePkg = node.package ?? ctxPkg;
142
+ const effectivePkg = node.package ?? node.fileDefaultPackage ?? "";
125
143
  const target = resolveSuperRef(node.superRef, effectivePkg, root);
126
144
  if (target !== undefined) {
127
145
  try {
@@ -136,14 +154,9 @@ export function resolveDeferredSupers(root: MetaData): DeferredSuperFailure[] {
136
154
  return failures;
137
155
  }
138
156
 
139
- function walk(
140
- node: MetaData,
141
- ctxPkg: string,
142
- visit: (n: MetaData, ctx: string) => void,
143
- ): void {
144
- visit(node, ctxPkg);
145
- const nextCtx = node.package ?? ctxPkg;
157
+ function walk(node: MetaData, visit: (n: MetaData) => void): void {
158
+ visit(node);
146
159
  for (const child of node.ownChildren()) {
147
- walk(child, nextCtx, visit);
160
+ walk(child, visit);
148
161
  }
149
162
  }
@@ -68,3 +68,19 @@ export const TEMPLATE_FORMATS = [
68
68
  "spreadsheet",
69
69
  ] as const;
70
70
  export type TemplateFormat = (typeof TEMPLATE_FORMATS)[number];
71
+
72
+ // FR-010 artifact-1 prompt presentation style (template.output only). Closed enum;
73
+ // guidance is NEVER carried in comments. Default "guide". Set project-wide via an
74
+ // abstract template base + extends, with a render-time override on top.
75
+ export const TEMPLATE_ATTR_PROMPT_STYLE = "promptStyle";
76
+ export const PROMPT_STYLE_GUIDE = "guide";
77
+ export const PROMPT_STYLE_INLINE = "inline";
78
+ export const PROMPT_STYLE_EXAMPLE_ONLY = "exampleOnly";
79
+ export const PROMPT_STYLE_DEFAULT = PROMPT_STYLE_GUIDE;
80
+
81
+ export const PROMPT_STYLES = [
82
+ PROMPT_STYLE_GUIDE,
83
+ PROMPT_STYLE_INLINE,
84
+ PROMPT_STYLE_EXAMPLE_ONLY,
85
+ ] as const;
86
+ export type PromptStyle = (typeof PROMPT_STYLES)[number];
@@ -29,6 +29,9 @@ import {
29
29
  TEMPLATE_ATTR_MODEL,
30
30
  TEMPLATE_ATTR_TOOL_NAME,
31
31
  TEMPLATE_FORMATS,
32
+ TEMPLATE_ATTR_PROMPT_STYLE,
33
+ PROMPT_STYLE_DEFAULT,
34
+ PROMPT_STYLES,
32
35
  } from "./template-constants.js";
33
36
 
34
37
  // Generic attrs shared by template.prompt and template.output.
@@ -79,6 +82,18 @@ const genericAttrs: AttrSchema[] = [
79
82
  },
80
83
  ];
81
84
 
85
+ // FR-010 artifact-1: output-format prompt presentation style (template.output only).
86
+ // Closed enum, enforced via allowedValues exactly like @format. Default "guide".
87
+ const promptStyleAttr: AttrSchema = {
88
+ name: TEMPLATE_ATTR_PROMPT_STYLE,
89
+ valueType: ATTR_SUBTYPE_STRING,
90
+ required: false,
91
+ default: PROMPT_STYLE_DEFAULT,
92
+ allowedValues: [...PROMPT_STYLES],
93
+ description:
94
+ "FR-010 output-format prompt presentation: 'guide' (prose list + example), 'inline' (inline placeholders / enum choices), or 'exampleOnly' (filled skeleton). Guidance is never emitted as comments.",
95
+ };
96
+
82
97
  // LLM-overlay attrs (template.prompt only).
83
98
  const promptOverlayAttrs: AttrSchema[] = [
84
99
  {
@@ -144,6 +159,6 @@ const toolcallAttrs: AttrSchema[] = [
144
159
  export const TEMPLATE_ATTRS_MAP = new Map<string, AttrSchema[]>([
145
160
  [SUBTYPE_BASE, []],
146
161
  [TEMPLATE_SUBTYPE_PROMPT, [...genericAttrs, ...promptOverlayAttrs]],
147
- [TEMPLATE_SUBTYPE_OUTPUT, [...genericAttrs]],
162
+ [TEMPLATE_SUBTYPE_OUTPUT, [...genericAttrs, promptStyleAttr]],
148
163
  [TEMPLATE_SUBTYPE_TOOLCALL, [...toolcallAttrs]],
149
164
  ]);